آموزش Qbasic(ساختار های شرطی)
ساختار های شرطی:
تمرین : برنامه ای بنویسید که ۳ عدد را دریافت کند
الف) حاصل جمع
آنها را چاپ کند .
ب) میانگین آنها را چاپ کند .
نکته : اگر برنامه بالا را
بنویسید و اجرا نمایید متوجه می شوید که اگر برای متغیرها علامت خاصی قرار ندهید
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
*********************************************************************************************************************************************************
۲-حلقه ها
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 یک مقدار اضافه کنیم.
***************************************************************************************************************************************
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$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 شود ، برنامه از حلقه خارج می شود
و با توجه این که بر اثر درست وارد شدن رمز از حلقه خارج شده ایم یا بر اثر تمام
شدن تعداد حدس ها ، پیغام مناسب چاپ می شود .
**************************************************************************************************************************************
دستور WHILE -
WEND
هرگاه لازم باشد مجموعه ای از دستورات بیسیک تا برقراری
شرط یا شرایطی اجرا شوند می توان از دستور WHILE – WEND استفاده کرد . صورت کلی
دستور :
شرطWHILE
-----------
-----------
دستورات بیسیک
-----------
WEND
مثال : برنامه چاپ اعداد زوج طبیعی کوچکتر از 20
CLS
I = 2
WHILE I < 20
PRINT I ;
I = I + 2
WEND
END
CLS
SD = 0
INPUT n
WHILE n > 0
M = INT( N / 10 )
DIGIT = n – 10 * M
SD = SD + DIGIT
N = M
WEND
PRINT SD
END
برنامه ای بنویسید که دو عدد طبیعی M و N را گرفته و بزرگترین مقسوم علیه مشترک آنها را تعیین و چاپ کند .( بزرگترین مقسوم علیه مشترک = GCD ) . اعداد 27 و 15 دارای GCD=3 و اعداد 28 و 10 دارای GCD=2 است.
CLS
INPUT n , m
WHILE m > 0
R = n – m * INT( n / m )
n = m
m = R
WEND
PRINT “ GCD = “ ; n
END
● دستور SELECT CASE
دستور IF یک دستور شرطی بود که بررسی شد . یکی دیگر از دستورات شرطی ، SELECT CASE است.
شکل کلی :
عبلرت SELECT CASE
عبارت CASE 1
مجموعه دستورات 1
عبارت CASE 2
مجموعه دستورات 2
..........................
..........................
عبارت CASE (n)
مجموعه دستورات (n)
CASE ELSE
مجموعه دستورات
END SELECT
توضیح : ابتدا عبارت مقابل SELECT CASE ارزیابی می شود و عبارت مقابل اولین CASE 1 را بررسی می کند در صورتی که عبارت آن ، شرایط مقابل SELECT CASE را داشته باشد ؛ دستورات آن CASE را اجرا خواهد کرد . اگر عبارت مقابل CASE 1 آن را نداشته باشد به ترتیب به CASE های بعدی نگاه می کند درصورت برقراری شرط ؛ دستورات آن CASE اجرا سپس کنترل اجرا به دستور بعد از END SELECT منتقل می گردد. درصورتی که عبارتی برابر شرط پیدا نشد ؛ دستورات بعد از CASE ELSE اجرا خواهد شد .
نکته : تفاوت SELECT CASE با IF دراین استه که در SELECT CASE فقط یک عبارت مورد ارزیابی قرار می گیرد ؛ اما در IF چندین شرط مورد ارزیابی قرار می گیرد .
مثال :
CLS
INPUT " From 1 to 6 : ", num
SELECT CASE num
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
a) شامل یک یا چند مقدار که با ویرگول از هم جدا می شوند .
ثابت عددی یا رشته ای : "Davood" یا 2.5
متغییر عددی یا رشته ای I یا Name$
b) یک محدوده به شکل X to Y که در آن X,Y ثابت ، متغییر یا عبارت مباشند
c) عملگرهای رابطه ای که پیش از آن IS و پس از آن یک ثابت ، متغییر یا عبارت باشد .
برنامه ای بنویسید که یک عدد را از کاربر دریافت کرده و منفی یا مثبت بودن آن بررسی می نماید . شرط خروج وارد کردن عدد صفر است .
CLS
PRINt " Type 0 To EXIT "
BEGIN :
INPUT num
SELECT CASE num
CASE IS = 0
PRINT " Program ha Finished "
CASE IS < 0
PRINT ' Negative "
GOTO BEGIN
CASE ELSE
PRINT " Positive "
END SELECT
END
0 --- 9 è Very Bad
10 --- 14 è Not Bad
15 --- 17 è Good
18 --- 20 è Very Good
شرط خروج ورود عدد -1 است .
CLS
PRINT " Type -1 to EXIT "
BEGIN
INPUT " 0 - 20 " ,num
SELECT num
CASE 0 to 9
PRINT " Very Bad "
GOTO BEGIN
CASE 10 to 14
PRINT " Not Bad "
GOTO BEGIN
CASE 15 to 17
PRINT " Good "
GOTO BEGIN
CASE 18 to 20
PRINT " Very Good "
GOTO BEGIN
CASE IS = -1
PRINT " Program has Finished "
END SELECT
END
منبع:http://www.qbasic0419.blogfa.com
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.