برای مطالعه به ادامه مطلب مراجعه کنید
======================================
بیسیک چیست ؟
*****************************************************************************
با توجه به گستردگی روزافزون علم کامپیوتر در تمام ابعاد زندگی انسان و نیاز به یادگیری این علم نوین و از آنجایی که زبان 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
======================================
مثال 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
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 بقیه مقدار عددی می گیرند .
|
مثال |
عملکرد تابع |
نام تابع |
|
|
ریشه دوم 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


