-
حل تمرين پست قبل :
DIM bubble(10) AS SINGLE
FOR i=1 TO 10
(INPUT "Enter number ",bubble(i
NEXT i
FOR i=1 TO 9
FOR j=1 TO 10
(IF bubble(j)>bubble(i) THEN SWAP bubble( i ) , bubble( j
NEXT j
NEXT i
" : PRINT "Sorted List
FOR i=1 TO 10 : PRINT bubble(i) : NEXT i
براي مرتب سازي روش هاي گوناگوني به كار برده مي شود كه يكي از ساده ترين آنها روش حبابي (Bubble Sort) است و در حل تمرين بالا از آن استفاده شده است : فرض كنيد n عدد متمايز داريم . طبق اين روش ابتدا عدد اول را با عدد دوم مقايسه مي كنيم اگر اولي بزرگتر بود ، جاي دو عدد را عوض مي كنيم. در صورتي كه عدد دوم بزرگتر بود ، به همان ترتيب باقي خواهند ماند . همين مقايسه بين عدد دوم و سوم ، سوم و چهارم ، ... ، (n-1) ام و n ام صورت مي گيرد . پس از اينكه يك بار اين عمل انجام شد ، دوباره همين الگوريتم را روي ليست به دست آمده اعمال مي كنيم و اين كار را n-1 بار انجام مي دهيم . ممكن است شما اين مسئله را از راه ديگري حل كرده باشيد . همانطور كه گفتم اين مسئله راه هاي متفاوتي دارد .
نكته : به خط آخر برنامه توجه كنيد . گاهي اوقات براي كم حجم نشان دادن برنامه به جاي اينكه به سر خط برويم ، مي توانيم بين دستورات از علامت ( : ) استفاده كنيم . در اين مثال به جاي اينكه دستور FOR سه خط را اشغال كند ، در يك خط نوشته شده است .
ساختار شرطي SELECT CASE
شكل كلي دستور به صورت زير است :
عبارت SELECT CASE
حالت ۱ CASE
دستورالعمل هاي حالت 1
حالت ۲ CASE
دستورالعمل هاي حالت 2
.....
CASE ELSE
دستورالعمل هايي كه در صورت غلط بودن تمام شرطهاي بالا بايد انجام شوند .
END SELECT
عبارتي كه در مقابل SELECT CASE قرار مي گيرد ، معمولا يك متغير بوده كه مي خواهيم روي آن بحث كنيم . چنانچه ارزش اين متغير يا عبارت با هريك از مقاديري كه جلوي CASE ها قرار گرفته است ، برابر باشد ، دستورالعمل آن CASE انجام مي شود . اگر ارزش متغير با هيچ كدام از عبارت هاي مقابل CASE ها برابر نباشد ، دستورالعمل هاي درون CASE ELSE انجام خواهد شد . ( اين حالت اختياري است )
مثال 1 : برنامه اي بنويسيد كه با استفاده از SELECT CASE منفي يا مثبت بودن عدد را نشان دهد .
CLS
INPUT "Enter a number ",num
SELECT CASE num
CASE 0
"! PRINT "Zero
CASE IS >0
" PRINT "Positive
CASE IS <0
" PRINT "Negative
END SELECT
نكته : دستور CLS به منظور پاك كردن صفحه به كار مي رود . بعد از اجراي برنامه ، عبارات برنامه قبلي نيز روي صفحه باقي مي ماند و عبارات برنامه جديد در زير آنها نمايش داده مي شود . براي پاك كردن صفحه از دستور CLS استفاده مي كنيم تا فقط دستورات برنامه جاري نمايش داده شود .
مثال ۲ : برنامه اي بنويسيد كه سن كاربر را دريافت كند . اگر بين ۰ و ۱۲ بود ، پيغام "child" ، اگر بين ۱۳ و ۲۰ بود پيغام "teenager" و اگر بزرگتر از ۲۰ بود پيغام "adult" را چاپ كند .
INPUT "Enter your age ",age
SELECT CASE age
CASE 1 TO 12
"! PRINT "You are a child
CASE 13 TO 20
"! PRINT "You are a teenager
CASE IS >20
"! PRINT "You are an adult
CASE ELSE
PRINT "Invalid number
END SELECT
نكته : مشاهده مي كنيد كه اگر عبارت مقابل CASE يك بازه كران دار باشد ( يعني ابتدا و انتهاي آن مشخص باشد ) از عبارت TO بين اعداد ابتدايي و انتهايي بازه استفاده مي كنيم . اگر بازه از يك طرف بي كران باشد ، در مقابل عبارت CASE بايد از IS استفاده كنيم . اگر عبارت تنها يك رشته و يا يك عدد باشد ، آن رشته يا عدد را به تنهايي مقابل CASE مي نويسيم .
ترفند : برای تایپ سريع تر برنامه و صرفه جويی در وقت می توانيد از ترفندهای کيوبيسيک استفاده کنيد . مثلا به جای اينکه تایپ کنيد CASE IS > 20 می توانيد بنويسيد CASE > 20 . هنگامی كه بخواهيد به خطوط بالاتر يا پايين تر برويد ، كيوبيسيك به طور خودكار عبارتی دومی را به اولی تبديل می كند . همينطور می توانيد به جای دستور PRINT از يك علامت سوال استفاده كنيد . يعنی اگر در محيط برنامه بنويسيد "Hello " ? هنگام انتقال مكان نما به سطر ديگر ، اين عبارت به "PRINT "Hello تبديل می شود . در ادامه با اين موارد بيشتر روبه رو خواهيد شد .
تمرين :
1- فرض كنيد عدد متناظر با رنگ هاي سياه ، قرمز ، سبز ، آبي ، نارنجي و قهوه اي به ترتيب 1 ، 2 ، 3 ، 4 ، 5 و 6 باشد. برنامه اي بنويسيد كه يك عدد را از كاربر بگيرد و رنگ متناظر با آن را نمايش دهد . در صورتي كه عدد كاربر در محدوده اعداد بالا نباشد ، پيغام مناسب چاپ شود .
2- برنامه محاسبه !n را بنويسيد .
3- برنامه محاسبه توان دوم مجموع اعداد از 1 تا n را بنويسيد .
4- برنامه محاسبه مجموع مقسوم عليه هاي يك عدد را بنويسيد .
-
حل تمرين پست قبل
۱-
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)
در جلسه بعدی كاربرد اين توابع را در مثال های مختلف بررسی خواهم كرد .
-
مثال 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
-
بسیار ممنون دوست خوبم
اگه مثال در مورد چاپ تعداد اول یا حل جدول سوداکو پیدا کردید لطف کنید بذارید.