PDA

مشاهده نسخه کامل : درخواست آموزش حرفه ای QBasic



XFXForce
06-04-07, 22:30
سلام دوستان
خواهشا در صورتی که آموزش حرفه ای QBasic یا مثال های مهمی از این برنامه دارید در اینجا قرار بدبد.
فقط سریع لطفا.

Quick
06-04-07, 22:38
الان بهت میگم

Quick
06-04-07, 22:45
چند تا مثل:

برای محاسبات پیچیده مورد استفاده قرار میگیره...

10 LET X=5
20 LET y=5
30 LET z=x+y
40 PRINT z
50 END

بعد از منویی که میاد استارت رو بزنی بهت میده 7 یعنی جواب...

Quick
06-04-07, 22:45
آقا 10 رو قبل از Let بزار اینتو نتونستم بزارم هی می رفت آخر حواست باشه

Quick
06-04-07, 22:55
اینم حرفه ای از یه وبلاگ که آخر میگم:



بيسيک چيست ؟

************************************************** ***************************

با توجه به گستردگی روزافزون علم کامپیوتر در تمام ابعاد زندگی انسان و نیاز به یادگیری این علم نوین و از آنجایی که زبان 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 .

Quick
06-04-07, 22:55
در اين يادداشت مي خواهم به معرفي انواع داده ها بپردازم. در 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 به طور پيش فرض آن را مساوي صفر قرار مي دهد.

Quick
06-04-07, 22:55
حال می خواهيم اولين برنامه خود را در 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 به كار ببريد تا خروجی برنامه دقيق و برابر مقدار واقعی ميانگين باشد .

Quick
06-04-07, 22:56
ابتدا حل تمرين جلسه قبل . راه اول اين بود که متغير ها را به صورت !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" چاپ شود .

Quick
06-04-07, 22:56
همانطور كه خواسته شده بود ، در مورد برنامه QBasic توضيحاتي را مي دهم :

تهيه، نصب و استفاده :

اين برنامه را به راحتي مي توانيد از بازار تهيه كنيد اما در صورت تمايل تمامي كساني كه مايل به داشتن QBasic (تحت Dos) هستند مي توانند آدرس اي- ميل خود را بفرستند تا اين برنامه به ميلشان فرستاده شود . حجم برنامه (بدون help) بسيار كم و در حدود 300KB است و نيازي به نصب ندارد ! كافي است بر روي فايل QBasic.exe كليك كنيد تا وارد محيط برنامه شويد . اگر از ويندوز xp استفاده مي كنيد ، احتمالا در اجراي برنامه با مشكل روبرو خواهيد شد . براي رفع اين مشكل مي توانيد مسير Start | All Programs | Accessoreies | Command prompt را طي كرده و مسيري را كه برنامه در آن كپي شده است ، بنويسيد مثلا اگر پوشه QBasic را در درايو E خود ذخيره كرده ايد ، بنويسيد : E : \ QBasic \ QBasic.exe . (براي خروج از Dos كلمه exit را تايپ كنيد ) پس از نوشتن برنامه براي اجراي آن كليد تركيبي Shift+F5 را فشار دهيد يا از منوي run گزينه start را انتخاب كنيد . پس از اتمام اجراي برنامه ، پيغامي ظاهر مي شود كه از شما مي خواهيد كليد دلخواهي فشار دهيد تا به محيط برنامه بازگرديد .

و در پايان ...

در اين وبلاگ سعي مي شود كه روش كار از سطح پايين شروع شود . بعدها كه QBasic را بهتر و بيشتر ياد گرفتيد ، متوجه مي شويد كه مثال ها و تمرين هاي اين جلسات اوليه بسيار بسيار ساده است . فقط نياز داريد تا تمرين كنيد . سعي كنيد مثال ها و مخصوصا تمرين ها را براي خود حل كنيد .
در مورد پيشنهادي كه داده بوديد اميدوارم جوابتان را گرفته باشيد .
با تشكر از توجه شما ، به اميد اين كه با پيشنهاداتتان كمك كنيد تا وبلاگ بهتري داشته باشيم .

Quick
06-04-07, 22:56
حل تمرين جلسه قبل :
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 خواهد بود . از اين دستور می توانيد برای جابه جايی عناصر آرايه به منظور مرتب سازی استفاده کنيد . )

Quick
06-04-07, 22:57
حل تمرين پست قبل :

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- برنامه محاسبه مجموع مقسوم عليه هاي يك عدد را بنويسيد .

Quick
06-04-07, 22:57
حل تمرين پست قبل

۱-

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)

در جلسه بعدی كاربرد اين توابع را در مثال های مختلف بررسی خواهم كرد .

Quick
06-04-07, 22:58
مثال 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

XFXForce
07-04-07, 15:59
بسیار ممنون دوست خوبم
اگه مثال در مورد چاپ تعداد اول یا حل جدول سوداکو پیدا کردید لطف کنید بذارید.