توضیح : به منظور ایجاد فاصله بین عدد و ریشه چهارمش از یک رشته خالی به طول 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
&n