مجموعه سریال جومانگ Close
تبلیغات در بلاگ اسکای
آموزش کامل بیسیک برای کسانی که می خواهند پایه برنامه نویسی شان را قوی کنند با ارایه مثال برای هر موضوع
برای مطالعه به ادامه مطلب مراجعه کنید

 

 

 

======================================

بیسیک چیست ؟

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

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

مثال

 

عملکرد تابع

 

نام تابع

 

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)

در این یادداشت می خواهم به معرفی انواع داده ها بپردازم. در 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