TAHA
11-11-2009, 05:55 PM
بیسیک چیست ؟
************************************************** ***************************
با توجه به گستردگی روزافزون علم کامپیوتر در تمام ابعاد زندگی انسان و نیاز به یادگیری این علم نوین و از آنجایی که زبان QBASIC ( نسخه جدید تر BASIC) زبانی ساده و در عین حال قدرتمند برای آموزش مفاهیم برنامه نویسی است ، در این وبلاگ اقدام به آموزش قدم به قدم این زبان کرده ام . امید است مورد استفاده دوستان عزیز قرار گیرد .
************************************************** ***************************
در این یادداشت ، می توانید با تاریخچه و خانواده BASIC آشنا شوید . در یادداشت های بعدی اصول برنامه نویسی QBASIC را شروع خواهم کرد .
بیسیک را می توان متداولترین زبان برنامه نویسی کامپیوتر در چند دهه اخیر به حساب آورد . عموما این زبان اولین زبانی است که کارآموزان ، دانش آموزان و دانشجویان با آن آشنا می شوند و برنامه نویسان با ذوق ، زبان فوق را به علت سهولت استفاده و قابلیت های مناسب آن دوست دارند . کلمه BASIC مخفف عبارت Beginner’s All-purpose Symbolic Instruction Code به معنای "کد حاوی دستورات نمادین همه منظوره مخصوص نوآموزان" می باشد . نسخه ی اصلی آن در کالج دارتموث (Dartmouth) در سال 1964 برای نوآموزان به عنوان یک زبان آموزشی ایجاد گشت . علت اصلی ایجاد این زبان را می توان در پیچیدگی های زبان های متداول از قبیل Fortran ، Assembly و غیره جستجو کرد.
برنامه نویسی ساخت یافته :
همزمان با آمدن زبان هایی که دارای ساختارهای کنترلی کاربردی (مانند C و پاسکال) بودند و امکان طراحی زیباتر ، دقیق تر و مناسبتر برنامه ها را به برنامه نویسان دادند نیاز به نسخه اول BASIC کم شده و نسخه های جدیدی از آن مانند QBASIC برای رفع کمبودهای نسخه اول به بازار عرضه شد که ضمن حفظ سادگی بیسیک ، قابلیت برنامه نویسی ساخت یافته را نیز به آن افزودند . برنامه نویسی ساخت یافته روشی از برنامه نویسی است که در آن برنامه را به قطعات کوچکتر تقسیم بندی می کنند و هر قطعه کار مشخصی را انجام می دهد . همچنین در این روش اجرای برنامه و کنترل ترتیب اجرای دستورالعمل ها با استفاده از کلمات و سمبل های جدید آسان تر شده است . اصلی ترین مزیت برنامه نویسی ساخت یافته را می توان در سادگی امکان توسعه و نکهداری برنامه ها دانست . برنامه هایی که با زبانهای غیر ساخت یافته نوشته می شدند ، به سادگی قابل تغییر نبودند و گاهی فراتر رفتن میزان تغییرات از حد مشخصی ، نیاز به بازنویسی کامل برنامه را ایجاب می کرد . در نتیجه برنامه نویسی ساخت یافته ، راه حل این مشکل بود .
مفسر و مترجم :
پس از آن که برنامه ای در محیط زبان برنامه نویسی نوشته شد ، باید توسط کامپیوتر اجرا شود . در دنیای زبان های برنامه نویسی دو روش مختلف برای اجرای برنامه ها وجود دارد :
روش اول : مفسر (Interpreter) که برنامه ها را در زمان اجرا خط به خط به کدهای ماشین (صفر و یک) تبدیل می کند .
روش دوم : مترجم (Compiler) که کل برنامه را یکجا به کدهای ماشین تبدیل می کنند . مترجم ها معمولا فایل هایی با پسوند EXE یا COM ایجاد می کنند که این فایل ها قابلیت اجرا در محیط سیستم عامل را دارند و نیازی به خود زبان برنامه نویسی در هنگام اجرا ندارند ، در حالی که برای اجرای برنامه ای که با زبان های دارای مفسر نوشته شده است ، نیاز به وجود فایل های زبان برنامه نویسی نیز می باشد .
بیسیک نیز جزو زبان های تفسیری محسوب می شود . زبان های تفسیری علی رغم سادگی در پیاده سازی زبان چند اشکال مهم دارند :
کندی اجرای برنامه ها در مقایسه با زبان های مترجم دار
نیاز به تفسیر هر دستور حتی اگر در یک حلقه آن دستور را هزاران بار داشته باشیم .
QBASIC علاوه بر آنکه مفسر است ، با بهینه سازی هایی که در آن صورت گرفته ، کل برنامه را یکجا تفسیر می کند . یعنی دارای کامپایلر نیز می باشد و این امر تا حد زیادی کارایی آن را بالا برده است .
QBASIC مفسر بیسیکی است که به همراه MS-DOS نسخه 5 و بالاتر ارائه می گردد . شرکت مایکروسافت تولید کننده QBASIC با تکمیل این محصول ، نسخه های دیگری از بیسیک را روانه بازار کرده است که عبارتند از :
Quick BASIC و BASIC PDS و VISUAL BASIC
======================================
مثال 1 : برنامه ای بنویسید که اعداد یک تا ده را چاپ کند سپس مقابل هریک ریشه چهارم آن را نمایش دهد .
CLS
FOR i = 1 TO 10
( ( PRINT i ; " " ; SQR ( SQR( i
NEXT i
END
توضیح : به منظور ایجاد فاصله بین عدد و ریشه چهارمش از یک رشته خالی به طول 20 کاراکتر استفاده شده است . می توانستید به جای اینکه 20 بار space را فشار دهید از تابعی که به همین منظور آماده شده ، استفاده کنید : تابع (SPC(a به تعداد مشخص شده ( a تا ) فضای خالی ایجاد می کند . در این صورت خط سوم برنامه به این صورت در می آمد که صحیح تر و بهتر است :
( ( PRINT i ; SPC (20) ; SQR ( SQR( i
=============================================
مثال 2 : برنامه ای بنویسید که کلیه مقسوم علیه های یک عدد ورودی را محاسبه و چاپ کند .
CLS
INPUT "Enter a number" , num
FOR i = 1 TO num
IF INT( num / i ) = num / i THEN PRINT i
NEXT i
END
توضیح : این بار این مسئله را با استفاده از تابع ( )INT حل کردیم . اگر num بر i بخشپذیر باشد ، پس حاصل num/i یک عدد صحیح است و جزءصحیح آن با خودش برابر است .
==============================================
مثال 3 : برنامه ای را بنویسید که جدول مقادیر مثلثاتی زوایای 1 تا 90 را نمایش دهد .
CLS
CONST pi = 3.1415
"PRINT "Degree" ; SPC(3) ; "Sin" ; SPC(3) ; "Cos" ; SPC(3) ; "Tan" ; SPC(3) ; "Cot
PRINT
FOR i = 1 TO 90
;( PRINT i ; SPC(3
rad = i * pi / 180
( PRINT SIN(rad); SPC(3); COS(rad); SPC(3); TAN(rad); SPC(3); 1/Tan(rad
NEXT i
END
=============================================
مثال 4 : برنامه ای بنویسید که یک رشته را دریافت کرده و حروف آن را معکوس کرده ، نمایش دهد .
CLS
$INPUT "Enter a string : " , test
" " = $reverse
( $FOR i = 1 TO LEN ( test
( temp$ = MID$ ( test$ , i , 1
$ reverse$ = temp$ + reverse
NEXT i
$PRINT "Reverse of string : " ; reverse
END
=============================================
مثال 5 : برنامه ای بنویسید که یک رشته را از ورودی دریافت کرده و تمام فاصله های آن را (جاهای خالی رشته) به ستاره تبدیل کند .
$INPUT a
" " = $b
($FOR i = 1 TO LEN (a
( temp$=MID$ ( a$ , i , 1
"*"=$IF temp$ = " " THEN temp
$b$ = b$ + temp
NEXT i
$PRINT b
END
==============================================
مثال 6 : برنامه ای بنویسید که یک رشته اصلی را دریافت کند و یک رشته که درون آن موجود است را دریافت کرده و به رشته ای دیگر تغییر دهد . مثلا رشته "This is a test" را به عنوان رشته اصلی دریافت کند . سپس به جای حروف "s" حرف "V" را چاپ کند . یعنی خروجی باید به صورت "ThiV iV a tevt" باشد .
$INPUT "Enter the mail string ", mainstr
$INPUT "What string do you want to replace it ?",oldstr
$INPUT "What is new string ?",newstr
INPUT "Enter start position : "start
DO
($pos=INSTR(start,mainstr$,oldstr
IF pos<>0 THEN
(Leftstr$=LEFT$(mainstr$,pos-1
($Rightstr$=RIGHT$(mainstr$,pos+LEN(oldstr
$mainstr$=Leftstr$+newstr$+Rightstr
ENDIF
LOOP WHILE pos<>0
" :PRINT "New main string is
$PRINT mainstr
END
==============================================
مثال 7 : برنامه ای بنویسید که یک عدد را دریافت کند و تعداد رقم های آن را چاپ کند .
INPUT "Type a number ranging from 1 to 7 digits ",num
( ( a = LEN ( STR$ ( num
"PRINT "You typed a "; a ; "digit number
END
==============================================
مثال 8 : برنامه ای بنویسید که یک عدد را در مبنای 2 دریافت کرده و معادل آن را در مبنای ده نمایش دهد .
INPUT "Enter a binary number ",numbin
(numbin$ = MID$ (STR ( numbin ) , 1
sum = 0
pow = 0
FOR i = LEN ( numbin$ ) TO 1 STEP -1
( abit$ = MID$ ( numbin$ , i , 1
IF VAL ( abit$ ) > 1 THEN
"!PRINT "Error in number
sum = 0
EXIT FOR
ENDIF
sum = sum + VAL ( abit$ ) * 2^pow
pow = pow + 1
NEXT i
PRINT "Decimal form is : " ; sum
END
============================================
مثال 9 : برنامه ای بنویسید که نام و نمره دانش آموزان را بگیرد و در آرایه ذخیره کند . سپس امکان جستجو را به این ترتیب برای کاربر فراهم کند که با دریافت نام دانش آموز ، نمره وی را نمایش دهد . برنامه را طوری بنویسید که case sensitive نباشد . ( نسبت به بزرگی و کوچکی حروف حساس نباشد )
INPUT "How many students are there ?" , n
(DIM name$(n
(DIM grade(n
count = 1
DO WHILE count <= n
PRINT "Enter name of student " ; count
( INPUT name$( count
PRINT "Enter grade of student " ; count
( INPUT grade ( count
count = count + 1
LOOP
FOR i = 1 TO n : name$ ( i ) = UCASE ( name$ ( i ) ) : NEXT i
$INPUT "Enter name of student to see her/his grade " , a
FOR i = 1 TO n
( IF name$(i)=UCASE$(a$) THEN PRINT name$(i)" 's grade is : " ; grade (i
NEXT i
END
============================================
مثال ?? : برنامه ای بنویسید که دو رشته را دریافت کرده و تمام محل های وجود رشته دوم را در رشته اول بررسی کرده و نشان دهد .
CLS
$INPUT "Enter the main string " , main
$INPUT "What string is you want to search it ? " , search
DO
($location = INSTR (location+1 , main$ , search
IF location = 0 THEN EXIT DO
PRINT " Location : " ; location
LOOP
END
REM This program can show the name of colors
CLS
%INPUT "Enter a number from 1 to 6 " , a
%SELECT CASE a
CASE 1
" PRINT " Black
CASE 2
" PRINT " Red
CASE 3
" PRINT " Green
CASE 4
" PRINT " Blue
CASE 5
" PRINT " Orange
CASE 6
" PRINT " Brown
CASE ELSE
" PRINT " Invalid number
END SELECT
END
فکر می کنم برنامه آنقدر ساده باشد که نیازی به توضیح ندارد .
?-
CLS
%INPUT "Enter a number ( >=0 )",num
count = 1
fact = 1
IF num% >= 0 THEN
% DO WHILE count <= num
fact = fact * count
count = count +1
LOOP
PRINT num% ; "! =" ; fact
ELSE
" PRINT " Invaid number
END IF
END
توضیح : برنامه دارای متغیری به نام count است که حکم شمارنده ای را دارد که از مقدار ? شروع می شود و تا زمانی که به عدد ورودی کاربر برسد ، هربار در عدد قبلی خود ضرب شده و در متغیری به نام fact قرار می گیرد . سپس یک واحد به آن اضافه شده و دوباره در عدد قبلی ضرب می شود . به این ترتیب حاصلضرب اعداد از ? تا n ) n عدد ورودی کاربر است ) محاسبه شده که همان فاکتوریل است . به دستور PRINT قبل از ELSE دقت کنید . این دستور از سه قسمت تشکیل شده است . دو قسمت عددی و یک قسمت رشته ای به این ترتیب که ابتدا عدد ورودی کاربر نمایش داده می شود . سپس علامت فاکتوریل (!) روبه روی عدد قرار می گیرد .آنگاه با چاپ علامت مساوی (=) فاکتوریل عدد در مقابل مساوی چاپ می شود . برای مثال اگر عدد ورودی کاربر ? باشد ، از آنجا که 0>1 یک عبارت نادرست است ، حلقه DO WHILE اجرا نمی شود و دستور بعدی که همان دستور PRINT است اجرا شده و با توجه به اینکه مقدار fact تغییری نکرده است ، خروجی به فرم زیر خواهد بود :
1 = ! 0
?-
REM This program can calculate (1+2+3+..+n)^2
INPUT "Enter the last number (n) " , n
sum = 0
FOR i = 1 TO n
sum = sum + i
NEXT i
PRINT "Answer is : ";sum^2
END
توابع و دستورات خاص
برای راحت تر شدن کار برنامه نویسان هر زبان برنامه نویسی دارای توابعی است که می توان از آنها در جهت ساده تر نوشتن برنامه استفاده کرد . در ادامه با کاربرد این توابع بیشتر آشنا خواهیم شد . فعلا فقط به معرفی آنها می پردازم .
جدول ? : توابع پرکاربردی که مقادیر عددی برمی گردانند و به جز تابع VAL بقیه مقدار عددی می گیرند .
مثال
عملکرد تابع
نام تابع
SQR (9) = 3
ریشه دوم x را برمی گرداند
SQR (x)
ABS (-12.3) = 12.3
قدر مطلق x را برمی گرداند
ABS (x)
X = -4.5
INT (X) = -5
جزء صحیح x را برمی گرداند
INT (x)
SIN ( 0 ) = 0
سینوس x را برمی گرداند
SIN (x)
COS ( 0 ) = 1
کسینوس x را برمی گرداند
COS (x)
TAN ( 0 ) = 0
تانژانت x را برمی گرداند
TAN (x)
ATN ( 1.57) = 0
آرک تانژانت x را برمی گرداند
ATN (x)
LOG (1) = 0
لگاریتم x را در پایه 10برمی گرداند
LOG (x)
EXP (1) = 2.718282
لگاریتم طبیعی x را برمی گرداند
EXP (x)
SGN (-87) = -1
در صورت مثبت بودن x عدد 1 ، در صورت منفی بودن عدد 1- ، و در صورت صفر بودن عدد صفر را بر می گرداند
SGN (x)
VAL ("123") =123
معادل عددی رشته $a را برمی گرداند
($VAL(a
جدول ? : توابع پرکاربردی که با متغیرهای رشته ای کار می کنند .
مثال
عملکرد تابع
نام تابع
B$ = "ab cd"
LEN (B$) = 5
طول رشته $a را برمی گرداند
LEN (a$)
"UCASE$("aBc")="ABC
حروف کوجک عبارت را به حروف بزرگ تبدیل می کند
UCASE$ (a$)
"LCASE$("aBc")="abc
حروف بزرگ عبارت را به حروف کوچک تبدیل می کند
LCASE$ (a$)
A$ = "Qbasic Program"
LEFT$(A$,5) = "Qbasic"
a حرف از سمت چپ عبارت a$ را برمی گرداند
LEFT$(a$,a)
A$ = "Qbasic Program"
RIGHT$(A$,8) = "Program"
a حرف از سمت راست عبارت a$ را برمی گرداند
RIGHT$(a$,a)
A$ = "Qbasic Program"
MID$(A$,8,3)="Pro"
از کاراکتر aام رشته a$ به تعداد b کاراکتر برمی گرداند
MID$(a$,a,b)
"A$ = "Ali Reza Vahid
"B$ = "Vahid
INSTR(1,a$,b$) = 10
از کاراکتر aام رشته a$ شروع کرده و به جستجو برای رشته b$ می پردازد . اگر b$ درون a$ یافت شد ، موقعیت اولین حرف b$ و در غیر اینصورت عدد صفر بازگردانده می شود .
INSTR(a,a$,b$)
X = 123
STR$(x) = "123"
معادل رشته ای x را برمی گرداند
STR$(x)
در این یادداشت می خواهم به معرفی انواع داده ها بپردازم. در Qbasic لزومی برای معرفی داده ها وجود ندارد ولی بهتر است در ابتدای برنامه آنها را معرفی کنیم .
انواع داده ها :
داده ها به طور کلی به دو نوع ثابت و متغیر تقسیم می شوند که هرکدام دارای دو دسته عددی و رشته ای هستند .
*داده ثابت :
داده ای که در طول برنامه مقدار آن تغییر نمی کند . برای معرفی این نوع داده از دستور CONST استفاده می کنیم
مثال :
CONST pi=3.14
*داده متغیر:
داده ای است که می تواند بر حسب منطق برنامه و در جایگاه های مختلف مقادیر متفاوتی بپذیرد که همانطور که گفتم دو نوع دارد : متغیر عددی و متغیر رشته ای .
*متغیر عددی :
متغیر های عددی دارای ? نوع مختلف هستند :
نام
مخفف
حافظه اشغال کننده
علامت
نوع
عدد صحیح معمولی
INT
2 BYTE
%
INTEGER
عدد صحیح بلند
LNG
4 BYTE
&
LONG
عدد اعشاری با دقت معمولی
SNG
4 BYTE
!
SINGLE
عدد اعشاری با دقت مضاعف
DBL
8 BYTE
#
DOUBLE
اگر بخواهیم محاسبات برنامه با دقت بالایی انجام شود ، باید متغیرها را از نوع مناسب (مثلا اعشاری با دقت مضاعف) در ابتدای برنامه به وسیله دستور DIM تعریف کنیم .
مثال : برای این که متغیر A از نوع اعشاری با دقت معمولی باشد ، در ابتدای برنامه این دستور را می نویسیم :
DIM A AS SINGLE
راه دوم این است که هرجا نیاز به استفاده از A بود ، آن را به صورت A! به کار می بریم .
*متغیرهای رشته ای
همان طور که از نام این متغیر مشخص است،برای نگهداری رشته ای از حروف به کار می رود و دو نوع دارد :
نام
مخفف
علامت
نوع
متغیر رشته ای با طول متغیر
STR
$
STRING
متغیر رشته ای با طول ثابت
STR
$
STRING*N%
فرض کنید می خواهیم متغیر رشته ای به نام name و متغیر رشته ای با طول 10 کاراکتر به نام family تعریف کنیم . مانند متغیرهای عددی از دستور ِDIM استفاده می کنیم :
DIM name AS STRING
DIM family AS STRING*10
حتما متوجه شده اید که N تعداد حروف متغیر را بیان می کند و طبیعتا از نوع % یعنی عدد صحیح معمولی است .
اگر بدون معرفی متغیر رشته ای را در برنامه استفاده کنیم ، Qbasic به طور خودکار آن را مساوی " " یعنی یک رشته خالی قرار می دهد و اگر متغیر از نوع عددی باشد ، Qbasic به طور پیش فرض آن را مساوی صفر قرار می دهد.
حال می خواهیم اولین برنامه خود را در QBasic بنویسیم . برای این کار نیاز به معرفی چند دستور داریم :
?- دستور PRINT برای چاپ عدد رشته و یا مقادیر متغیرها به کار می رود . فقط فراموش نکنید اگر می خواهید پیغامی نمایش دهید رشته مورد نظر را حتما داخل علامت کوتیشن (") قرار دهید برای مثال دستور زیر عبارت This is my first program را چاپ می کند .
" PRINT "This is my first pogram
برای ترکیب چند رشته یا متغیر باید بین متغیرها / رشته ها از ; یا , استفاده کنید . در ادامه تفاوت این دو را بیان خواهیم کرد .
?- دستور INPUT برای دریافت مقادیر (عددی و رشته ای) از کاربر به کار می رود . برای مثال دستور ! INPUT a یک عدد اعشاری با دقت مضاعف از کاربر دریافت می کند . وقتی دستور INPUT اجرا می شود به طور خودکار علامت ؟ روی صفحه نمایش چاپ شده و برنامه منتظر ورود داده از طرف کاربر می ماند . اما این دستور را می توان طور دیگری نیز به کار برد . مثلا فرض کنید می خواهیم به کاربر پیغام دهیم :"یک عدد وارد کن" و سپس این عدد را در متغیر a قرار دهیم . برای این کار باید ابتدا یک دستور PRINT برای چاپ رشته و سپس دستور INPUT را برای دریافت عدد به کار ببریم . مانند زیر :
"PRINT "Enter a number
INPUT a
اما می توان این کار را در یک خط انجام داد ! دستور INPUT اجازه چاپ پیغام را نیز به ما می دهد . به این نکته توجه داشته باشید : بین پیغام و نام متغیر باید ; یا , قرار دهیم . اگر از ; استفاده کنیم بعد از چاپ پیغام یک علامت سوال چاپ می شود و نشانگر بلافاصله بعد از علامت سوال قرار می گیرد ولی در صورت استفاده از , علامت سوال خودکار چاپ نمی شود و نشانگر بعد از یک tab فاصله روبه روی پیغام قرار می گیرد . به دستورات زیر که ترکیب دو دستور بالاست توجه کنید و تفاوت های آنها را در خروجی مشاهده کنید (فرض کنید کاربر عدد ? را وارد می کند )
2 INPUT "Enter a number" , a \\ khorooji=> Enter a number
INPUT "Enter a number" ; a \\ khorooji=> Enter a number?2
حال دو دستور ساده دیگر را هم یاد بگیرید :
?- REM : این دستور برای اضافه کردن توضیحات به برنامه به کار می رود و اصولا زمانی که مترجم برنامه به این دستور می رسد بلافاصله به خط بعدی می رود و عبارت جلوی REM را نادیده می گیرد .
?- END : استفاده از این دستور نیز مانند REM اختیاری است و نشان دهنده پایان برنامه است .
با توجه به درس جلسه قبل و این جلسه با هم برنامه ای می نویسیم که دو عدد از کاربر دریافت کرده و حاصل جمع آنها را نمایش دهد .
REM this program can add two numbers
".PRINT "I can add two numbers . please enter them
INPUT "Enter first number:",a
INPUT "Enter second number:",b
c=a+b
PRINT "Sum is :";c
END
مثالی از خروجی برنامه :
. I can add two numbers . please enter them
Enter first number: 31
Enter second number: 24
Sum is : 55
تمرین : برنامه ای بنویسید که ? عدد را دریافت کند و الف) حاصل جمع آنها را چاپ کند . ب) میانگین آنها را چاپ کند .
نکته : اگر برنامه بالا را بنویسید و اجرا نمایید متوجه می شوید که اگر برای متغیرها علامت خاصی قرار ندهید QBasic آنها را به عنوان عدد صحیح (integer) می شناسد و در نتیجه میانگین نیز مقدار صحیحی نمایش داده می شود . برای دقیق تر شدن خروجی برنامه و اینکه میانگین عددی اعشاری باشد باید متغیرهای مربوط به سه عدد دریافتی , حاصل جمع و میانگین از نوع اعشاری باشد . یعنی باید متغیرها را مانند !a یا #a به کار ببرید تا خروجی برنامه دقیق و برابر مقدار واقعی میانگین باشد .
حل تمرین :
راه اول این بود که متغیر ها را به صورت !a به کار ببریم ( مانند برنامه زیر ) و راه دوم این بود که با توجه به درس جلسه دوم در ابتدای برنامه تمام متغیرها را از نوع اعشاری تعریف نماییم برای مثال عبارت DIM a AS SINGLE را در ابتدای برنامه بنویسیم تا هرجا از a استفاده کردیم نوع آن اعشاری باشد .در این روش نیازی نیست در هر بار استفاده از متغیر علامت نوع را در انتهای آن بنویسیم.
***REM ***program number 1
"PRINT "enter three number
!INPUT a! , b! , c
!sum! = a! + b! + c
!PRINT "Sum is : ";sum
PRINT "Average is : ";sum!/3
END
حال بررسی ساختارهای کنترلی که یکی از پرکاربردترین دستورها هستند را شروع می کنم .
1- ساختار IF
این دستور برای انجام کاری در صورت درست بودن شرطی به کار می رود . شکل کلی آن به صورت زیر است :
THEN شرط 1 IF
کارهایی که در صورت برقرار بودن شرط 1 باید انجام شود .
THEN شرط 2 ELSE IF
کارهایی که در صورت برقرار بودن شرط 2 باید انجام شود .
...
ELSE
کارهایی که در صورت برقرار نبودن هیچ یک از شرط های بالا باید انجام شود .
END IF
مثال 1: فرض کنید عددی از کاربر دریافت کرده و می خواهیم مثبت یا منفی بودن آن را مشابه تابع(sgn(xدر ریاضیات اعلام کنیم . ( در صورت مثبت بودن ، عدد 1 / منفی بودن ، عدد 1- / و اگر صفر وارد شد ، عدد ضفر چاپ می شود ) . دستور زیر این امکان را فراهم می سازد : (فرض کنید عدد در n ذخیره شده است )
IF n>0 THEN
"PRINT "1
ELSE IF n<0 THEN
"PRINT "-1
Else
"PRINT "0
END IF
نکته : اگر می خواهید فقط یک شرط را بررسی کنید (مثلا فقط در صورت مثبت بودن n عدد 1 چاپ شود و در غیر این صورت هیچ کاری انجام نشود ) می توانید دستورIF را در یک خط بدون نیاز به END IF بنویسید . مانند زیر :
"IF n>0 THEN PRINT "1
2- DO...WHILE
این ساختار کارهایی را تا زمانی که شرطی برقرار باشد انجام می دهد . شکل کلی آن به صورت زیر است :
شرط DO WHILE
کارهایی که باید انجام شوند
LOOP
عبارت LOOP نشان دهنده پایان حلقه است . این ساختار دارای انواع دیگری نیز هست . مثلا در نوع معرفی شده کارها فقط زمانی انجام می شوند که شرط برقرار باشد و اگر شرط برقرار نباشد برنامه به خط بعد از LOOP می رود . اما نوع دیگری از این ساختار وجود دارد که ابتدا یک بار کار را انجام می دهد و سپس شرط را چک می کند . شکل کلی آن به صورت زیر است :
DO
کارهایی که باید انجام شوند
شرط LOOP WHILE
می توان به جای عبارت WHILE از UNTIL استفاده کرد اما در این صورت باید نقیض شرط را بنویسیم .
مثال ?: می خواهیم تا زمانی که کلمه وارد شده از طرف کاربر مخالف رمز عبور (مثلا kamyar ) است ، رمز دوباره دریافت شود . به روش های مختلف نوشتن این برنامه توجه کنید :
1) $INPUT pass
"DO WHILE pass$<>"kamyar
$INPUT pass
LOOP
------------------------------------------
2) $INPUT pass
"DO UNTIL pass$="kamyar
$INPUT pass
LOOP
------------------------------------------
3) DO
$INPUT pass
"LOOP WHILE pass<>"kamyar
-------------------------------------------
4) DO
$INPUT pass
"LOOP UNTIL pass$="kamyar
همانطور که مشاهده می کنید هر 4 بخش یک کار را انجام می دهند اما بخش های 3 و 4 از 1 و 2 بهترند زیرا متن برنامه آنها کوتاه تر است . بسته به منطق برنامه باید تشخیص دهید کدام روش بهتر است .
مثال ?: برنامه ای بنویسید که مجموع اعداد از 1 تا 1000 را حساب کند .
counter = 1
sum = 0
DO WHILE counter<=1000
sum=sum+counter
counter=counter+1
LOOP
PRINT "Sum of numbers between 1 & 1000 is : ";sum
END
مثال ?: برنامه ای بنویسید که میانگین نمرات را تا زمانی که عدد 1- وارد نشده ، حساب کند .
counter=1
sum=0
DO
INPUT "Enter grade",grade
sum=sum+grade
counter=counter+1
LOOP WHILE grade<>-1
IF sum<>-1 THEN
PRINT "average is";(sum+1)/counter
ELSE
"!PRINT "there isn't any grade
END IF
END
توضیح : در قسمت چاپ میانگین مقدار میانگین را برابرsum+1)/counter قرار دادیم زیرا وقتی عدد 1- وارد می شود ابتدا با sum جمع شده و سپس شرط چک می شود و از حلقه بیرون می آید پس برای محاسبه میانگین اعدادی که قبل از 1- وارد شده اند باید 1- را از sum حذف کرد یعنی به sum یک مقدار اضافه کنیم.
3-FOR
این ساختار شبیه ساختار WHILE است با این تفاوت که برای ایجاد حلقه هایی که دارای شمارنده هستند به کار می رود . می توانید شمارنده حلقه را درون این دستور مقدار دهی اولیه کنید . همچنین مقدار تغییر شمارنده (یکی یکی یا دوتا دوتا یا ... ) نیز با دستور STEP قابل تنظیم است . شکل کلی این دستور به شکل زیر است :
مقدار تغییر شمارنده STEP مقدار نهایی TO مقدار اولیه = شمارنده FOR
کارهایی که باید در طول حلقه انجام شود
متغیر شمارنده NEXT
مثال ? : مثال ? را با این دستور می نویسیم :
FOR i=1 TO 1000 STEP 1
sum=sum+i
NEXT i
PRINT "Sum of numbers between 1 & 1000 is : ";sum
END
نکته : اگر مقدار تغییر شمارنده برابر یک است ، می توانید STEP 1 را ننویسید .
تمرین :
1- برنامه ای بنویسید که مجموع اعداد زوج سه رقمی را چاپ کند .
2- برنامه ای بنویسید که ابتدا رمز عبور را از کاربر بخواهد . اگر رمزabc بود آنگاه ?? عدد را بخواند و max آنها را چاپ کند . اگر رمز اشتباه بود ، پیغام مناسبی نمایش داده شده و رمز عبور دوباره خواسته شود .
3- برنامه ای بنویسید که رمز عبوری را از کاربر بخواهد . اگر رمز درست بود پیغام "your password is correct" را چاپ کند . برنامه باید فقط ? بار از کاربر رمز را بپرسد . اگر کاربر نتوانست رمز را در این 3 بار وارد کند پیغام "Sorry! you can't continue" چاپ شود .
حل تمرین :
1- برنامه بسیار ساده و به صورت زیر است :
sum=0
FOR i=100 TO 998 STEP 2
sum=sum+i
NEXT i
PRINT "Sum is :",sum
ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ــــــــــــــــــــ
2-
DO
$INPUT "Enter pass";pass
IF pass$<>"abc" THEN
"PRINT "Your password is not correct ! try again
END IF
"LOOP WHILE pass$<>"abc
"PRINT "Enter ten numbers
INPUT a
max=a
FOR i=1 TO 9
INPUT a
IF a>max THEN max=a
NEXT i
END
*نکات : تا زمانی که کاربر رمز عبور را درست وارد نکرده ، حلقه تکرار می شود و تنها زمانی که رمز به درستی وارد شود ، برنامه به خط بعد از LOOP می رود و دستورات بعدی انجام می شود . برای تعیین max دسته ای از اعداد ، ابتدا اولین عدد ورودی را در max قرار می دهیم سپس بقیه اعداد را در یک حلقه از کاربر دریافت کرده ، بعد از دریافت هرکدام ، آنها با max مقایسه می شوند تا اگر بیشتر از max بودند ، در آن قرار گیرند . دقت کنید چون یک عدد بیرون حلقه دریافت کرده ایم ? عدد دیگر باقیمانده است (شرط حلقه ) برای به دست آوردن min نیز از همین روش استفاده می کنیم .
ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ــــــــــــــــــــ
3-
c=1
DO
$INPUT"Enter password",pass
c=c+1
LOOP WHILE pass$<>"123" AND c<=3
IF pass$="123" THEN
"!PRINT "your password is correct
ELSE
"PRINT "Sorry ! you can't continue
END
نکات : در شرط حلقه از عملگر منطقی AND استفاده شده زیرا استفاده از AND سبب می شود اگر یکی از شرطها هم غلط باشد ، کل عبارت نادرست شود . (عینا مانند استفاده از "و" در منطق ریاضی ) یعنی در هریک از دو صورتی که "pass$="abc (رمز درست وارد شود) یا c (شمارنده) بزرگتر از 3 شود ، برنامه از حلقه خارج می شود و با توجه این که بر اثر درست وارد شدن رمز از حلقه خارج شده ایم یا بر اثر تمام شدن تعداد حدس ها ، پیغام مناسب چاپ می شود .
و اما درس جدید :
در درس امروز ابتدا به معرفی آرایه می پردازیم .
فرض کنید می خواهیم n عدد را به صورت صعودی مرتب کنیم . برای ذخیره سازی این اعداد باید n متغیر به نام های a1,a2,a3,...,an تعریف کنیم . نوشتن برنامه ای که بتواند این n عدد را مرتب کند مخصوصا زمانی که مقدار n بزرگ باشد ، بسیار مشکل و تقریبا غیر ممکن است . در چنین مواردی از آرایه ها یا ماتریس ها استفاده می کنیم . به کمک آرایه ها می توان تعداد مشخصی متغیر همنوع را فقط با یک نام و مشخص کردن اندیس آنها به کار برد . برای مثال می توان ده عدد را در متغیری به نام N از نوع آرایه ای به طول 10 ذخیره کرد :
325
145
23
965
3
47
10
0
71
400
N
1 2 3 4 5 6 7 8 9 10
مثلا N(1)=325 و N(9)=71
برای تعریف آرایه از دستور DIM به شکل کلی زیر استفاده می شود :
[ نوع داده AS ] (دامنه یا تعداد عناصر ) نام متغیر آرایه DIM
( عبارت داخل [ ] اختیاری است )
به مثال های زیر توجه کنید :
ایجاد آرایه ای به نام B و دارای 20 عنصر : (DIM B(1 TO 20 یا (DIM B(20
ایجاد آرایه ای به نام M از نوع عدد صحیح و دارای 50 عنصر : (DIM M%(50
ایجاد آرایه ای به نام Grade از نوع اعشاری ساده دارای 35 عنصر : DIM Grade(35) AS SINGLE
مثال 1 : برنامه ای بنویسید که ?? نمره یک دانش آموز را در آرایه ذخیره کرده و مجموع و میانگین نمرات را چاپ کند .
DIM Grade(1 TO 14 ) AS INTEGER
sum!=0
FOR i=1 TO 14
(%INPUT "Grade : "Grade(i
(%sum! = sum! + Grade(i
NEXT i
average!=sum!/14
!PRINT "sum = ";sum
!PRINT "average = ";average
این برنامه را می توانستید با دریافت نمرات در حلقه یا دریافت تک تک نمرات (?? بار) نیز بنویسید . اما فرض کنید کاربر بخواهد نمره سوم یا ششم خود را مشاهده کند . در این صورت باید از آرایه ها استفاده کنید زیرا در روش قبلی امکان دسترسی به تک تک اطلاعات وجود نداشت ولی حالا با افزودن قطعه کد زیر به برنامه بالا می توان برنامه ای ساخت که نمره دلخواه کاربر را نمایش دهد :
INPUT "which grade do you want to see?",a
(PRINT "grade ";a;" is = ";Grade(a
آرایه های دوبعدی و چند بعدی :
در مواقعی نیاز به آرایه هایی داریم که هر عنصر آن دارای دو بعد باشد . مثلا برای ذخیره مختصات چند نقطه نیاز به یک آرایه دو بعدی داریم تا مختصات x و y نقطه را ذخیره کنیم . تعریف آرایه های n بعدی به طور کلی به شکل زیر است : (A1,A2,A3,...,An و B1,B2 و ... همگی عدد هستند )
(DIM (A1 TO A2,B1 TO B2, ... , Z1 TO Z2 یا (DIM (A1,A2,A3,...,An
مثال ? : برنامه ای بنویسید که جدول ضرب اعداد از یک تا ده را در یک آرایه دوبعدی ذخیره نماید .
(DIM N(10,10
FOR I%=1 TO 10
FOR J%=1 TO 10
%N(I%,J%)=I%*J
%NEXT J
%NEXT I
مثلا N(3,5)=15 .
تمرین :
برنامه ای بنویسید که ?? عدد را دریافت کند و آنها را به ترتیب به صورت صعودی مرتب کند . برنامه را برای n عدد تعمیم دهید . ( راهنمایی : دستور SWAP a,b مقدار دو متغیر را عوض می کند . یعنی اگر a=1,b=2 باشد بعد از اجرای این دستور a=2,b=1 خواهد بود . از این دستور می توانید برای جابه جایی عناصر آرایه به منظور مرتب سازی استفاده کنید . )
************************************************** ***************************
با توجه به گستردگی روزافزون علم کامپیوتر در تمام ابعاد زندگی انسان و نیاز به یادگیری این علم نوین و از آنجایی که زبان QBASIC ( نسخه جدید تر BASIC) زبانی ساده و در عین حال قدرتمند برای آموزش مفاهیم برنامه نویسی است ، در این وبلاگ اقدام به آموزش قدم به قدم این زبان کرده ام . امید است مورد استفاده دوستان عزیز قرار گیرد .
************************************************** ***************************
در این یادداشت ، می توانید با تاریخچه و خانواده BASIC آشنا شوید . در یادداشت های بعدی اصول برنامه نویسی QBASIC را شروع خواهم کرد .
بیسیک را می توان متداولترین زبان برنامه نویسی کامپیوتر در چند دهه اخیر به حساب آورد . عموما این زبان اولین زبانی است که کارآموزان ، دانش آموزان و دانشجویان با آن آشنا می شوند و برنامه نویسان با ذوق ، زبان فوق را به علت سهولت استفاده و قابلیت های مناسب آن دوست دارند . کلمه BASIC مخفف عبارت Beginner’s All-purpose Symbolic Instruction Code به معنای "کد حاوی دستورات نمادین همه منظوره مخصوص نوآموزان" می باشد . نسخه ی اصلی آن در کالج دارتموث (Dartmouth) در سال 1964 برای نوآموزان به عنوان یک زبان آموزشی ایجاد گشت . علت اصلی ایجاد این زبان را می توان در پیچیدگی های زبان های متداول از قبیل Fortran ، Assembly و غیره جستجو کرد.
برنامه نویسی ساخت یافته :
همزمان با آمدن زبان هایی که دارای ساختارهای کنترلی کاربردی (مانند C و پاسکال) بودند و امکان طراحی زیباتر ، دقیق تر و مناسبتر برنامه ها را به برنامه نویسان دادند نیاز به نسخه اول BASIC کم شده و نسخه های جدیدی از آن مانند QBASIC برای رفع کمبودهای نسخه اول به بازار عرضه شد که ضمن حفظ سادگی بیسیک ، قابلیت برنامه نویسی ساخت یافته را نیز به آن افزودند . برنامه نویسی ساخت یافته روشی از برنامه نویسی است که در آن برنامه را به قطعات کوچکتر تقسیم بندی می کنند و هر قطعه کار مشخصی را انجام می دهد . همچنین در این روش اجرای برنامه و کنترل ترتیب اجرای دستورالعمل ها با استفاده از کلمات و سمبل های جدید آسان تر شده است . اصلی ترین مزیت برنامه نویسی ساخت یافته را می توان در سادگی امکان توسعه و نکهداری برنامه ها دانست . برنامه هایی که با زبانهای غیر ساخت یافته نوشته می شدند ، به سادگی قابل تغییر نبودند و گاهی فراتر رفتن میزان تغییرات از حد مشخصی ، نیاز به بازنویسی کامل برنامه را ایجاب می کرد . در نتیجه برنامه نویسی ساخت یافته ، راه حل این مشکل بود .
مفسر و مترجم :
پس از آن که برنامه ای در محیط زبان برنامه نویسی نوشته شد ، باید توسط کامپیوتر اجرا شود . در دنیای زبان های برنامه نویسی دو روش مختلف برای اجرای برنامه ها وجود دارد :
روش اول : مفسر (Interpreter) که برنامه ها را در زمان اجرا خط به خط به کدهای ماشین (صفر و یک) تبدیل می کند .
روش دوم : مترجم (Compiler) که کل برنامه را یکجا به کدهای ماشین تبدیل می کنند . مترجم ها معمولا فایل هایی با پسوند EXE یا COM ایجاد می کنند که این فایل ها قابلیت اجرا در محیط سیستم عامل را دارند و نیازی به خود زبان برنامه نویسی در هنگام اجرا ندارند ، در حالی که برای اجرای برنامه ای که با زبان های دارای مفسر نوشته شده است ، نیاز به وجود فایل های زبان برنامه نویسی نیز می باشد .
بیسیک نیز جزو زبان های تفسیری محسوب می شود . زبان های تفسیری علی رغم سادگی در پیاده سازی زبان چند اشکال مهم دارند :
کندی اجرای برنامه ها در مقایسه با زبان های مترجم دار
نیاز به تفسیر هر دستور حتی اگر در یک حلقه آن دستور را هزاران بار داشته باشیم .
QBASIC علاوه بر آنکه مفسر است ، با بهینه سازی هایی که در آن صورت گرفته ، کل برنامه را یکجا تفسیر می کند . یعنی دارای کامپایلر نیز می باشد و این امر تا حد زیادی کارایی آن را بالا برده است .
QBASIC مفسر بیسیکی است که به همراه MS-DOS نسخه 5 و بالاتر ارائه می گردد . شرکت مایکروسافت تولید کننده QBASIC با تکمیل این محصول ، نسخه های دیگری از بیسیک را روانه بازار کرده است که عبارتند از :
Quick BASIC و BASIC PDS و VISUAL BASIC
======================================
مثال 1 : برنامه ای بنویسید که اعداد یک تا ده را چاپ کند سپس مقابل هریک ریشه چهارم آن را نمایش دهد .
CLS
FOR i = 1 TO 10
( ( PRINT i ; " " ; SQR ( SQR( i
NEXT i
END
توضیح : به منظور ایجاد فاصله بین عدد و ریشه چهارمش از یک رشته خالی به طول 20 کاراکتر استفاده شده است . می توانستید به جای اینکه 20 بار space را فشار دهید از تابعی که به همین منظور آماده شده ، استفاده کنید : تابع (SPC(a به تعداد مشخص شده ( a تا ) فضای خالی ایجاد می کند . در این صورت خط سوم برنامه به این صورت در می آمد که صحیح تر و بهتر است :
( ( PRINT i ; SPC (20) ; SQR ( SQR( i
=============================================
مثال 2 : برنامه ای بنویسید که کلیه مقسوم علیه های یک عدد ورودی را محاسبه و چاپ کند .
CLS
INPUT "Enter a number" , num
FOR i = 1 TO num
IF INT( num / i ) = num / i THEN PRINT i
NEXT i
END
توضیح : این بار این مسئله را با استفاده از تابع ( )INT حل کردیم . اگر num بر i بخشپذیر باشد ، پس حاصل num/i یک عدد صحیح است و جزءصحیح آن با خودش برابر است .
==============================================
مثال 3 : برنامه ای را بنویسید که جدول مقادیر مثلثاتی زوایای 1 تا 90 را نمایش دهد .
CLS
CONST pi = 3.1415
"PRINT "Degree" ; SPC(3) ; "Sin" ; SPC(3) ; "Cos" ; SPC(3) ; "Tan" ; SPC(3) ; "Cot
FOR i = 1 TO 90
;( PRINT i ; SPC(3
rad = i * pi / 180
( PRINT SIN(rad); SPC(3); COS(rad); SPC(3); TAN(rad); SPC(3); 1/Tan(rad
NEXT i
END
=============================================
مثال 4 : برنامه ای بنویسید که یک رشته را دریافت کرده و حروف آن را معکوس کرده ، نمایش دهد .
CLS
$INPUT "Enter a string : " , test
" " = $reverse
( $FOR i = 1 TO LEN ( test
( temp$ = MID$ ( test$ , i , 1
$ reverse$ = temp$ + reverse
NEXT i
$PRINT "Reverse of string : " ; reverse
END
=============================================
مثال 5 : برنامه ای بنویسید که یک رشته را از ورودی دریافت کرده و تمام فاصله های آن را (جاهای خالی رشته) به ستاره تبدیل کند .
$INPUT a
" " = $b
($FOR i = 1 TO LEN (a
( temp$=MID$ ( a$ , i , 1
"*"=$IF temp$ = " " THEN temp
$b$ = b$ + temp
NEXT i
$PRINT b
END
==============================================
مثال 6 : برنامه ای بنویسید که یک رشته اصلی را دریافت کند و یک رشته که درون آن موجود است را دریافت کرده و به رشته ای دیگر تغییر دهد . مثلا رشته "This is a test" را به عنوان رشته اصلی دریافت کند . سپس به جای حروف "s" حرف "V" را چاپ کند . یعنی خروجی باید به صورت "ThiV iV a tevt" باشد .
$INPUT "Enter the mail string ", mainstr
$INPUT "What string do you want to replace it ?",oldstr
$INPUT "What is new string ?",newstr
INPUT "Enter start position : "start
DO
($pos=INSTR(start,mainstr$,oldstr
IF pos<>0 THEN
(Leftstr$=LEFT$(mainstr$,pos-1
($Rightstr$=RIGHT$(mainstr$,pos+LEN(oldstr
$mainstr$=Leftstr$+newstr$+Rightstr
ENDIF
LOOP WHILE pos<>0
" :PRINT "New main string is
$PRINT mainstr
END
==============================================
مثال 7 : برنامه ای بنویسید که یک عدد را دریافت کند و تعداد رقم های آن را چاپ کند .
INPUT "Type a number ranging from 1 to 7 digits ",num
( ( a = LEN ( STR$ ( num
"PRINT "You typed a "; a ; "digit number
END
==============================================
مثال 8 : برنامه ای بنویسید که یک عدد را در مبنای 2 دریافت کرده و معادل آن را در مبنای ده نمایش دهد .
INPUT "Enter a binary number ",numbin
(numbin$ = MID$ (STR ( numbin ) , 1
sum = 0
pow = 0
FOR i = LEN ( numbin$ ) TO 1 STEP -1
( abit$ = MID$ ( numbin$ , i , 1
IF VAL ( abit$ ) > 1 THEN
"!PRINT "Error in number
sum = 0
EXIT FOR
ENDIF
sum = sum + VAL ( abit$ ) * 2^pow
pow = pow + 1
NEXT i
PRINT "Decimal form is : " ; sum
END
============================================
مثال 9 : برنامه ای بنویسید که نام و نمره دانش آموزان را بگیرد و در آرایه ذخیره کند . سپس امکان جستجو را به این ترتیب برای کاربر فراهم کند که با دریافت نام دانش آموز ، نمره وی را نمایش دهد . برنامه را طوری بنویسید که case sensitive نباشد . ( نسبت به بزرگی و کوچکی حروف حساس نباشد )
INPUT "How many students are there ?" , n
(DIM name$(n
(DIM grade(n
count = 1
DO WHILE count <= n
PRINT "Enter name of student " ; count
( INPUT name$( count
PRINT "Enter grade of student " ; count
( INPUT grade ( count
count = count + 1
LOOP
FOR i = 1 TO n : name$ ( i ) = UCASE ( name$ ( i ) ) : NEXT i
$INPUT "Enter name of student to see her/his grade " , a
FOR i = 1 TO n
( IF name$(i)=UCASE$(a$) THEN PRINT name$(i)" 's grade is : " ; grade (i
NEXT i
END
============================================
مثال ?? : برنامه ای بنویسید که دو رشته را دریافت کرده و تمام محل های وجود رشته دوم را در رشته اول بررسی کرده و نشان دهد .
CLS
$INPUT "Enter the main string " , main
$INPUT "What string is you want to search it ? " , search
DO
($location = INSTR (location+1 , main$ , search
IF location = 0 THEN EXIT DO
PRINT " Location : " ; location
LOOP
END
REM This program can show the name of colors
CLS
%INPUT "Enter a number from 1 to 6 " , a
%SELECT CASE a
CASE 1
" PRINT " Black
CASE 2
" PRINT " Red
CASE 3
" PRINT " Green
CASE 4
" PRINT " Blue
CASE 5
" PRINT " Orange
CASE 6
" PRINT " Brown
CASE ELSE
" PRINT " Invalid number
END SELECT
END
فکر می کنم برنامه آنقدر ساده باشد که نیازی به توضیح ندارد .
?-
CLS
%INPUT "Enter a number ( >=0 )",num
count = 1
fact = 1
IF num% >= 0 THEN
% DO WHILE count <= num
fact = fact * count
count = count +1
LOOP
PRINT num% ; "! =" ; fact
ELSE
" PRINT " Invaid number
END IF
END
توضیح : برنامه دارای متغیری به نام count است که حکم شمارنده ای را دارد که از مقدار ? شروع می شود و تا زمانی که به عدد ورودی کاربر برسد ، هربار در عدد قبلی خود ضرب شده و در متغیری به نام fact قرار می گیرد . سپس یک واحد به آن اضافه شده و دوباره در عدد قبلی ضرب می شود . به این ترتیب حاصلضرب اعداد از ? تا n ) n عدد ورودی کاربر است ) محاسبه شده که همان فاکتوریل است . به دستور PRINT قبل از ELSE دقت کنید . این دستور از سه قسمت تشکیل شده است . دو قسمت عددی و یک قسمت رشته ای به این ترتیب که ابتدا عدد ورودی کاربر نمایش داده می شود . سپس علامت فاکتوریل (!) روبه روی عدد قرار می گیرد .آنگاه با چاپ علامت مساوی (=) فاکتوریل عدد در مقابل مساوی چاپ می شود . برای مثال اگر عدد ورودی کاربر ? باشد ، از آنجا که 0>1 یک عبارت نادرست است ، حلقه DO WHILE اجرا نمی شود و دستور بعدی که همان دستور PRINT است اجرا شده و با توجه به اینکه مقدار fact تغییری نکرده است ، خروجی به فرم زیر خواهد بود :
1 = ! 0
?-
REM This program can calculate (1+2+3+..+n)^2
INPUT "Enter the last number (n) " , n
sum = 0
FOR i = 1 TO n
sum = sum + i
NEXT i
PRINT "Answer is : ";sum^2
END
توابع و دستورات خاص
برای راحت تر شدن کار برنامه نویسان هر زبان برنامه نویسی دارای توابعی است که می توان از آنها در جهت ساده تر نوشتن برنامه استفاده کرد . در ادامه با کاربرد این توابع بیشتر آشنا خواهیم شد . فعلا فقط به معرفی آنها می پردازم .
جدول ? : توابع پرکاربردی که مقادیر عددی برمی گردانند و به جز تابع VAL بقیه مقدار عددی می گیرند .
مثال
عملکرد تابع
نام تابع
SQR (9) = 3
ریشه دوم x را برمی گرداند
SQR (x)
ABS (-12.3) = 12.3
قدر مطلق x را برمی گرداند
ABS (x)
X = -4.5
INT (X) = -5
جزء صحیح x را برمی گرداند
INT (x)
SIN ( 0 ) = 0
سینوس x را برمی گرداند
SIN (x)
COS ( 0 ) = 1
کسینوس x را برمی گرداند
COS (x)
TAN ( 0 ) = 0
تانژانت x را برمی گرداند
TAN (x)
ATN ( 1.57) = 0
آرک تانژانت x را برمی گرداند
ATN (x)
LOG (1) = 0
لگاریتم x را در پایه 10برمی گرداند
LOG (x)
EXP (1) = 2.718282
لگاریتم طبیعی x را برمی گرداند
EXP (x)
SGN (-87) = -1
در صورت مثبت بودن x عدد 1 ، در صورت منفی بودن عدد 1- ، و در صورت صفر بودن عدد صفر را بر می گرداند
SGN (x)
VAL ("123") =123
معادل عددی رشته $a را برمی گرداند
($VAL(a
جدول ? : توابع پرکاربردی که با متغیرهای رشته ای کار می کنند .
مثال
عملکرد تابع
نام تابع
B$ = "ab cd"
LEN (B$) = 5
طول رشته $a را برمی گرداند
LEN (a$)
"UCASE$("aBc")="ABC
حروف کوجک عبارت را به حروف بزرگ تبدیل می کند
UCASE$ (a$)
"LCASE$("aBc")="abc
حروف بزرگ عبارت را به حروف کوچک تبدیل می کند
LCASE$ (a$)
A$ = "Qbasic Program"
LEFT$(A$,5) = "Qbasic"
a حرف از سمت چپ عبارت a$ را برمی گرداند
LEFT$(a$,a)
A$ = "Qbasic Program"
RIGHT$(A$,8) = "Program"
a حرف از سمت راست عبارت a$ را برمی گرداند
RIGHT$(a$,a)
A$ = "Qbasic Program"
MID$(A$,8,3)="Pro"
از کاراکتر aام رشته a$ به تعداد b کاراکتر برمی گرداند
MID$(a$,a,b)
"A$ = "Ali Reza Vahid
"B$ = "Vahid
INSTR(1,a$,b$) = 10
از کاراکتر aام رشته a$ شروع کرده و به جستجو برای رشته b$ می پردازد . اگر b$ درون a$ یافت شد ، موقعیت اولین حرف b$ و در غیر اینصورت عدد صفر بازگردانده می شود .
INSTR(a,a$,b$)
X = 123
STR$(x) = "123"
معادل رشته ای x را برمی گرداند
STR$(x)
در این یادداشت می خواهم به معرفی انواع داده ها بپردازم. در Qbasic لزومی برای معرفی داده ها وجود ندارد ولی بهتر است در ابتدای برنامه آنها را معرفی کنیم .
انواع داده ها :
داده ها به طور کلی به دو نوع ثابت و متغیر تقسیم می شوند که هرکدام دارای دو دسته عددی و رشته ای هستند .
*داده ثابت :
داده ای که در طول برنامه مقدار آن تغییر نمی کند . برای معرفی این نوع داده از دستور CONST استفاده می کنیم
مثال :
CONST pi=3.14
*داده متغیر:
داده ای است که می تواند بر حسب منطق برنامه و در جایگاه های مختلف مقادیر متفاوتی بپذیرد که همانطور که گفتم دو نوع دارد : متغیر عددی و متغیر رشته ای .
*متغیر عددی :
متغیر های عددی دارای ? نوع مختلف هستند :
نام
مخفف
حافظه اشغال کننده
علامت
نوع
عدد صحیح معمولی
INT
2 BYTE
%
INTEGER
عدد صحیح بلند
LNG
4 BYTE
&
LONG
عدد اعشاری با دقت معمولی
SNG
4 BYTE
!
SINGLE
عدد اعشاری با دقت مضاعف
DBL
8 BYTE
#
DOUBLE
اگر بخواهیم محاسبات برنامه با دقت بالایی انجام شود ، باید متغیرها را از نوع مناسب (مثلا اعشاری با دقت مضاعف) در ابتدای برنامه به وسیله دستور DIM تعریف کنیم .
مثال : برای این که متغیر A از نوع اعشاری با دقت معمولی باشد ، در ابتدای برنامه این دستور را می نویسیم :
DIM A AS SINGLE
راه دوم این است که هرجا نیاز به استفاده از A بود ، آن را به صورت A! به کار می بریم .
*متغیرهای رشته ای
همان طور که از نام این متغیر مشخص است،برای نگهداری رشته ای از حروف به کار می رود و دو نوع دارد :
نام
مخفف
علامت
نوع
متغیر رشته ای با طول متغیر
STR
$
STRING
متغیر رشته ای با طول ثابت
STR
$
STRING*N%
فرض کنید می خواهیم متغیر رشته ای به نام name و متغیر رشته ای با طول 10 کاراکتر به نام family تعریف کنیم . مانند متغیرهای عددی از دستور ِDIM استفاده می کنیم :
DIM name AS STRING
DIM family AS STRING*10
حتما متوجه شده اید که N تعداد حروف متغیر را بیان می کند و طبیعتا از نوع % یعنی عدد صحیح معمولی است .
اگر بدون معرفی متغیر رشته ای را در برنامه استفاده کنیم ، Qbasic به طور خودکار آن را مساوی " " یعنی یک رشته خالی قرار می دهد و اگر متغیر از نوع عددی باشد ، Qbasic به طور پیش فرض آن را مساوی صفر قرار می دهد.
حال می خواهیم اولین برنامه خود را در QBasic بنویسیم . برای این کار نیاز به معرفی چند دستور داریم :
?- دستور PRINT برای چاپ عدد رشته و یا مقادیر متغیرها به کار می رود . فقط فراموش نکنید اگر می خواهید پیغامی نمایش دهید رشته مورد نظر را حتما داخل علامت کوتیشن (") قرار دهید برای مثال دستور زیر عبارت This is my first program را چاپ می کند .
" PRINT "This is my first pogram
برای ترکیب چند رشته یا متغیر باید بین متغیرها / رشته ها از ; یا , استفاده کنید . در ادامه تفاوت این دو را بیان خواهیم کرد .
?- دستور INPUT برای دریافت مقادیر (عددی و رشته ای) از کاربر به کار می رود . برای مثال دستور ! INPUT a یک عدد اعشاری با دقت مضاعف از کاربر دریافت می کند . وقتی دستور INPUT اجرا می شود به طور خودکار علامت ؟ روی صفحه نمایش چاپ شده و برنامه منتظر ورود داده از طرف کاربر می ماند . اما این دستور را می توان طور دیگری نیز به کار برد . مثلا فرض کنید می خواهیم به کاربر پیغام دهیم :"یک عدد وارد کن" و سپس این عدد را در متغیر a قرار دهیم . برای این کار باید ابتدا یک دستور PRINT برای چاپ رشته و سپس دستور INPUT را برای دریافت عدد به کار ببریم . مانند زیر :
"PRINT "Enter a number
INPUT a
اما می توان این کار را در یک خط انجام داد ! دستور INPUT اجازه چاپ پیغام را نیز به ما می دهد . به این نکته توجه داشته باشید : بین پیغام و نام متغیر باید ; یا , قرار دهیم . اگر از ; استفاده کنیم بعد از چاپ پیغام یک علامت سوال چاپ می شود و نشانگر بلافاصله بعد از علامت سوال قرار می گیرد ولی در صورت استفاده از , علامت سوال خودکار چاپ نمی شود و نشانگر بعد از یک tab فاصله روبه روی پیغام قرار می گیرد . به دستورات زیر که ترکیب دو دستور بالاست توجه کنید و تفاوت های آنها را در خروجی مشاهده کنید (فرض کنید کاربر عدد ? را وارد می کند )
2 INPUT "Enter a number" , a \\ khorooji=> Enter a number
INPUT "Enter a number" ; a \\ khorooji=> Enter a number?2
حال دو دستور ساده دیگر را هم یاد بگیرید :
?- REM : این دستور برای اضافه کردن توضیحات به برنامه به کار می رود و اصولا زمانی که مترجم برنامه به این دستور می رسد بلافاصله به خط بعدی می رود و عبارت جلوی REM را نادیده می گیرد .
?- END : استفاده از این دستور نیز مانند REM اختیاری است و نشان دهنده پایان برنامه است .
با توجه به درس جلسه قبل و این جلسه با هم برنامه ای می نویسیم که دو عدد از کاربر دریافت کرده و حاصل جمع آنها را نمایش دهد .
REM this program can add two numbers
".PRINT "I can add two numbers . please enter them
INPUT "Enter first number:",a
INPUT "Enter second number:",b
c=a+b
PRINT "Sum is :";c
END
مثالی از خروجی برنامه :
. I can add two numbers . please enter them
Enter first number: 31
Enter second number: 24
Sum is : 55
تمرین : برنامه ای بنویسید که ? عدد را دریافت کند و الف) حاصل جمع آنها را چاپ کند . ب) میانگین آنها را چاپ کند .
نکته : اگر برنامه بالا را بنویسید و اجرا نمایید متوجه می شوید که اگر برای متغیرها علامت خاصی قرار ندهید QBasic آنها را به عنوان عدد صحیح (integer) می شناسد و در نتیجه میانگین نیز مقدار صحیحی نمایش داده می شود . برای دقیق تر شدن خروجی برنامه و اینکه میانگین عددی اعشاری باشد باید متغیرهای مربوط به سه عدد دریافتی , حاصل جمع و میانگین از نوع اعشاری باشد . یعنی باید متغیرها را مانند !a یا #a به کار ببرید تا خروجی برنامه دقیق و برابر مقدار واقعی میانگین باشد .
حل تمرین :
راه اول این بود که متغیر ها را به صورت !a به کار ببریم ( مانند برنامه زیر ) و راه دوم این بود که با توجه به درس جلسه دوم در ابتدای برنامه تمام متغیرها را از نوع اعشاری تعریف نماییم برای مثال عبارت DIM a AS SINGLE را در ابتدای برنامه بنویسیم تا هرجا از a استفاده کردیم نوع آن اعشاری باشد .در این روش نیازی نیست در هر بار استفاده از متغیر علامت نوع را در انتهای آن بنویسیم.
***REM ***program number 1
"PRINT "enter three number
!INPUT a! , b! , c
!sum! = a! + b! + c
!PRINT "Sum is : ";sum
PRINT "Average is : ";sum!/3
END
حال بررسی ساختارهای کنترلی که یکی از پرکاربردترین دستورها هستند را شروع می کنم .
1- ساختار IF
این دستور برای انجام کاری در صورت درست بودن شرطی به کار می رود . شکل کلی آن به صورت زیر است :
THEN شرط 1 IF
کارهایی که در صورت برقرار بودن شرط 1 باید انجام شود .
THEN شرط 2 ELSE IF
کارهایی که در صورت برقرار بودن شرط 2 باید انجام شود .
...
ELSE
کارهایی که در صورت برقرار نبودن هیچ یک از شرط های بالا باید انجام شود .
END IF
مثال 1: فرض کنید عددی از کاربر دریافت کرده و می خواهیم مثبت یا منفی بودن آن را مشابه تابع(sgn(xدر ریاضیات اعلام کنیم . ( در صورت مثبت بودن ، عدد 1 / منفی بودن ، عدد 1- / و اگر صفر وارد شد ، عدد ضفر چاپ می شود ) . دستور زیر این امکان را فراهم می سازد : (فرض کنید عدد در n ذخیره شده است )
IF n>0 THEN
"PRINT "1
ELSE IF n<0 THEN
"PRINT "-1
Else
"PRINT "0
END IF
نکته : اگر می خواهید فقط یک شرط را بررسی کنید (مثلا فقط در صورت مثبت بودن n عدد 1 چاپ شود و در غیر این صورت هیچ کاری انجام نشود ) می توانید دستورIF را در یک خط بدون نیاز به END IF بنویسید . مانند زیر :
"IF n>0 THEN PRINT "1
2- DO...WHILE
این ساختار کارهایی را تا زمانی که شرطی برقرار باشد انجام می دهد . شکل کلی آن به صورت زیر است :
شرط DO WHILE
کارهایی که باید انجام شوند
LOOP
عبارت LOOP نشان دهنده پایان حلقه است . این ساختار دارای انواع دیگری نیز هست . مثلا در نوع معرفی شده کارها فقط زمانی انجام می شوند که شرط برقرار باشد و اگر شرط برقرار نباشد برنامه به خط بعد از LOOP می رود . اما نوع دیگری از این ساختار وجود دارد که ابتدا یک بار کار را انجام می دهد و سپس شرط را چک می کند . شکل کلی آن به صورت زیر است :
DO
کارهایی که باید انجام شوند
شرط LOOP WHILE
می توان به جای عبارت WHILE از UNTIL استفاده کرد اما در این صورت باید نقیض شرط را بنویسیم .
مثال ?: می خواهیم تا زمانی که کلمه وارد شده از طرف کاربر مخالف رمز عبور (مثلا kamyar ) است ، رمز دوباره دریافت شود . به روش های مختلف نوشتن این برنامه توجه کنید :
1) $INPUT pass
"DO WHILE pass$<>"kamyar
$INPUT pass
LOOP
------------------------------------------
2) $INPUT pass
"DO UNTIL pass$="kamyar
$INPUT pass
LOOP
------------------------------------------
3) DO
$INPUT pass
"LOOP WHILE pass<>"kamyar
-------------------------------------------
4) DO
$INPUT pass
"LOOP UNTIL pass$="kamyar
همانطور که مشاهده می کنید هر 4 بخش یک کار را انجام می دهند اما بخش های 3 و 4 از 1 و 2 بهترند زیرا متن برنامه آنها کوتاه تر است . بسته به منطق برنامه باید تشخیص دهید کدام روش بهتر است .
مثال ?: برنامه ای بنویسید که مجموع اعداد از 1 تا 1000 را حساب کند .
counter = 1
sum = 0
DO WHILE counter<=1000
sum=sum+counter
counter=counter+1
LOOP
PRINT "Sum of numbers between 1 & 1000 is : ";sum
END
مثال ?: برنامه ای بنویسید که میانگین نمرات را تا زمانی که عدد 1- وارد نشده ، حساب کند .
counter=1
sum=0
DO
INPUT "Enter grade",grade
sum=sum+grade
counter=counter+1
LOOP WHILE grade<>-1
IF sum<>-1 THEN
PRINT "average is";(sum+1)/counter
ELSE
"!PRINT "there isn't any grade
END IF
END
توضیح : در قسمت چاپ میانگین مقدار میانگین را برابرsum+1)/counter قرار دادیم زیرا وقتی عدد 1- وارد می شود ابتدا با sum جمع شده و سپس شرط چک می شود و از حلقه بیرون می آید پس برای محاسبه میانگین اعدادی که قبل از 1- وارد شده اند باید 1- را از sum حذف کرد یعنی به sum یک مقدار اضافه کنیم.
3-FOR
این ساختار شبیه ساختار WHILE است با این تفاوت که برای ایجاد حلقه هایی که دارای شمارنده هستند به کار می رود . می توانید شمارنده حلقه را درون این دستور مقدار دهی اولیه کنید . همچنین مقدار تغییر شمارنده (یکی یکی یا دوتا دوتا یا ... ) نیز با دستور STEP قابل تنظیم است . شکل کلی این دستور به شکل زیر است :
مقدار تغییر شمارنده STEP مقدار نهایی TO مقدار اولیه = شمارنده FOR
کارهایی که باید در طول حلقه انجام شود
متغیر شمارنده NEXT
مثال ? : مثال ? را با این دستور می نویسیم :
FOR i=1 TO 1000 STEP 1
sum=sum+i
NEXT i
PRINT "Sum of numbers between 1 & 1000 is : ";sum
END
نکته : اگر مقدار تغییر شمارنده برابر یک است ، می توانید STEP 1 را ننویسید .
تمرین :
1- برنامه ای بنویسید که مجموع اعداد زوج سه رقمی را چاپ کند .
2- برنامه ای بنویسید که ابتدا رمز عبور را از کاربر بخواهد . اگر رمزabc بود آنگاه ?? عدد را بخواند و max آنها را چاپ کند . اگر رمز اشتباه بود ، پیغام مناسبی نمایش داده شده و رمز عبور دوباره خواسته شود .
3- برنامه ای بنویسید که رمز عبوری را از کاربر بخواهد . اگر رمز درست بود پیغام "your password is correct" را چاپ کند . برنامه باید فقط ? بار از کاربر رمز را بپرسد . اگر کاربر نتوانست رمز را در این 3 بار وارد کند پیغام "Sorry! you can't continue" چاپ شود .
حل تمرین :
1- برنامه بسیار ساده و به صورت زیر است :
sum=0
FOR i=100 TO 998 STEP 2
sum=sum+i
NEXT i
PRINT "Sum is :",sum
ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ــــــــــــــــــــ
2-
DO
$INPUT "Enter pass";pass
IF pass$<>"abc" THEN
"PRINT "Your password is not correct ! try again
END IF
"LOOP WHILE pass$<>"abc
"PRINT "Enter ten numbers
INPUT a
max=a
FOR i=1 TO 9
INPUT a
IF a>max THEN max=a
NEXT i
END
*نکات : تا زمانی که کاربر رمز عبور را درست وارد نکرده ، حلقه تکرار می شود و تنها زمانی که رمز به درستی وارد شود ، برنامه به خط بعد از LOOP می رود و دستورات بعدی انجام می شود . برای تعیین max دسته ای از اعداد ، ابتدا اولین عدد ورودی را در max قرار می دهیم سپس بقیه اعداد را در یک حلقه از کاربر دریافت کرده ، بعد از دریافت هرکدام ، آنها با max مقایسه می شوند تا اگر بیشتر از max بودند ، در آن قرار گیرند . دقت کنید چون یک عدد بیرون حلقه دریافت کرده ایم ? عدد دیگر باقیمانده است (شرط حلقه ) برای به دست آوردن min نیز از همین روش استفاده می کنیم .
ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ــــــــــــــــــــ
3-
c=1
DO
$INPUT"Enter password",pass
c=c+1
LOOP WHILE pass$<>"123" AND c<=3
IF pass$="123" THEN
"!PRINT "your password is correct
ELSE
"PRINT "Sorry ! you can't continue
END
نکات : در شرط حلقه از عملگر منطقی AND استفاده شده زیرا استفاده از AND سبب می شود اگر یکی از شرطها هم غلط باشد ، کل عبارت نادرست شود . (عینا مانند استفاده از "و" در منطق ریاضی ) یعنی در هریک از دو صورتی که "pass$="abc (رمز درست وارد شود) یا c (شمارنده) بزرگتر از 3 شود ، برنامه از حلقه خارج می شود و با توجه این که بر اثر درست وارد شدن رمز از حلقه خارج شده ایم یا بر اثر تمام شدن تعداد حدس ها ، پیغام مناسب چاپ می شود .
و اما درس جدید :
در درس امروز ابتدا به معرفی آرایه می پردازیم .
فرض کنید می خواهیم n عدد را به صورت صعودی مرتب کنیم . برای ذخیره سازی این اعداد باید n متغیر به نام های a1,a2,a3,...,an تعریف کنیم . نوشتن برنامه ای که بتواند این n عدد را مرتب کند مخصوصا زمانی که مقدار n بزرگ باشد ، بسیار مشکل و تقریبا غیر ممکن است . در چنین مواردی از آرایه ها یا ماتریس ها استفاده می کنیم . به کمک آرایه ها می توان تعداد مشخصی متغیر همنوع را فقط با یک نام و مشخص کردن اندیس آنها به کار برد . برای مثال می توان ده عدد را در متغیری به نام N از نوع آرایه ای به طول 10 ذخیره کرد :
325
145
23
965
3
47
10
0
71
400
N
1 2 3 4 5 6 7 8 9 10
مثلا N(1)=325 و N(9)=71
برای تعریف آرایه از دستور DIM به شکل کلی زیر استفاده می شود :
[ نوع داده AS ] (دامنه یا تعداد عناصر ) نام متغیر آرایه DIM
( عبارت داخل [ ] اختیاری است )
به مثال های زیر توجه کنید :
ایجاد آرایه ای به نام B و دارای 20 عنصر : (DIM B(1 TO 20 یا (DIM B(20
ایجاد آرایه ای به نام M از نوع عدد صحیح و دارای 50 عنصر : (DIM M%(50
ایجاد آرایه ای به نام Grade از نوع اعشاری ساده دارای 35 عنصر : DIM Grade(35) AS SINGLE
مثال 1 : برنامه ای بنویسید که ?? نمره یک دانش آموز را در آرایه ذخیره کرده و مجموع و میانگین نمرات را چاپ کند .
DIM Grade(1 TO 14 ) AS INTEGER
sum!=0
FOR i=1 TO 14
(%INPUT "Grade : "Grade(i
(%sum! = sum! + Grade(i
NEXT i
average!=sum!/14
!PRINT "sum = ";sum
!PRINT "average = ";average
این برنامه را می توانستید با دریافت نمرات در حلقه یا دریافت تک تک نمرات (?? بار) نیز بنویسید . اما فرض کنید کاربر بخواهد نمره سوم یا ششم خود را مشاهده کند . در این صورت باید از آرایه ها استفاده کنید زیرا در روش قبلی امکان دسترسی به تک تک اطلاعات وجود نداشت ولی حالا با افزودن قطعه کد زیر به برنامه بالا می توان برنامه ای ساخت که نمره دلخواه کاربر را نمایش دهد :
INPUT "which grade do you want to see?",a
(PRINT "grade ";a;" is = ";Grade(a
آرایه های دوبعدی و چند بعدی :
در مواقعی نیاز به آرایه هایی داریم که هر عنصر آن دارای دو بعد باشد . مثلا برای ذخیره مختصات چند نقطه نیاز به یک آرایه دو بعدی داریم تا مختصات x و y نقطه را ذخیره کنیم . تعریف آرایه های n بعدی به طور کلی به شکل زیر است : (A1,A2,A3,...,An و B1,B2 و ... همگی عدد هستند )
(DIM (A1 TO A2,B1 TO B2, ... , Z1 TO Z2 یا (DIM (A1,A2,A3,...,An
مثال ? : برنامه ای بنویسید که جدول ضرب اعداد از یک تا ده را در یک آرایه دوبعدی ذخیره نماید .
(DIM N(10,10
FOR I%=1 TO 10
FOR J%=1 TO 10
%N(I%,J%)=I%*J
%NEXT J
%NEXT I
مثلا N(3,5)=15 .
تمرین :
برنامه ای بنویسید که ?? عدد را دریافت کند و آنها را به ترتیب به صورت صعودی مرتب کند . برنامه را برای n عدد تعمیم دهید . ( راهنمایی : دستور SWAP a,b مقدار دو متغیر را عوض می کند . یعنی اگر a=1,b=2 باشد بعد از اجرای این دستور a=2,b=1 خواهد بود . از این دستور می توانید برای جابه جایی عناصر آرایه به منظور مرتب سازی استفاده کنید . )