TAHA
09-22-2009, 01:30 AM
ابتدا حل تمرين جلسه قبل . راه اول اين بود که متغير ها را به صورت !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" چاپ شود .
***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" چاپ شود .