Professional Documents
Culture Documents
5 - BASIC Programlama
5 - BASIC Programlama
Günümüzde de çeşitli türevleri kullanılmakta olan yüksek düzey bir programlama dili.
Microsoft daha sonra Kişisel bilgisayarlar için Quick Basic derleyicisini çıkartmıştır. Bununla yazılan
BASIC metinlerini makine koduna çevirilebilmiş böylece sürat kazanmıştır. Bugün halen geniş bir
kullanım alanına sahip olan Visual Basic dili var olup bununla hatta Windows’un belirli bölümleri
yazılmıştır. Her Microsoft Office paketinde bir BASIC türevi var olup makro programlamada büyük
kolaylıklar getirmektedir.
Basic, BasicA, GWBasic, TurboBasic, Power Basic, QBasic'in yanı sıra QuickBasic, DOS işletim
sistemini temel alan, öğrenmesi kolay bir programlama dili (ve bu nedenle yeni başlayanlar için
idealdir), aynı zamanda Windows'ta da çalıştırılabilir. Basic, QBasic ve QuickBasic arasındaki farklar:
QBasic, QuickBasic daha alt bir sürümüdür. QuickBasic ile karşılaştırıldığında QBasic bir derleyicisi
olmaması kadar sınırlıdır. Bu nedenle, QBasic çalıştırılabilir dosyalar (.exe dosyaları) üretmek için
kullanılamaz. Kaynak kodu (genellikle .bas uzantılı dosyalar) QBasic yorumlayıcısı tarafından
doğrudan çalıştırılabilir. Ayrıca, QuickBasic, QBasic’ göre daha kapsamlı bir komut kümesine sahiptir.
Basic dilinde satır numaraları gereksizdir. Ama kullanabilirsiniz de. Kullanırsanız; numaraların
birbirini takip etmesi şart değildir. Basic dilinde satır numaraları yerine okunurluğu kolaylaştırması
için ETİKET kullanılır. Etiketi de sadece GOTO veya GOSUB ile gidilecek satırlara koymak yeterlidir.
10 A = A + 1
20 IF A > 20 THEN GOTO 50
30 PRINT A
40 GOTO 10
50 END
Yukarıdaki program kodları yerine; aynı işi yapan, satır numarası vermeden, etiket kullanarak
yazılmış hali aşağıda.
basla:
A=A+1
IF A > 20 THEN GOTO bitis
PRINT A
GOTO basla
bitis:
END
Bir satırda birden fazla komut da kullanılabilir. İki komutu ayırmak için : (iki nokta üst üste)
Kullanılır.
1. Karakter (STRING) sabitler, bellekte her bir karakter 1 byte (8 bit) yerde saklanır, “ “ iki tane
çift tırnak içinde yer alır ve maksimum 255 karekter uzunlukta olabilir.
2. tamsayı (INTEGER), bellekte 2byte (16 bit) yerde saklanır, -32768 ile 32767 sayıları arasındaki
TAM sayılarıdır (2^15). Daha büyük sayılar yazmaya çalıştığınızda Owerflow (Taşma) hatası
verir. Noktalı rakamlar vermeye çalıştığınızda en yakın olan sayıya tamamlar.
3. uzun tamsayı (LONG), bellekte 4 byte (32 bit) yerde saklanır, -2147483648 ile 2147483647
sayıları arasındaki TAM sayılardır (2^31). Noktalı sayılar INTEGER’ deki gibi işlem görür.
4. sabit noktalı (SINGLE), bellekte 4 byte (32 bit) yerde saklanır, 7 rakamdan oluşan küsurlu veya
tam rakamları tutar, daha uzun bir sayı girildiğinde bilimsel kullanım (E+/- ) notasyonu ile
gösterilir.
5. çok büyük ve çok küçük sayılar (DOUBLE), bellekte 8 byte (64 bit) yerde saklanır. 15
rakamdan oluşan noktalı veya tam sayılardır. Diğer özellikler SINGLE özelliklerine benzer.
Onaltılı sistem sayısı (HEXADECIMAL) ve sekizli sistem sayısı (OCTAL) sabit veri tipleri vardır.
Prof. Dr. Levent ŞENYAY V -3 Bilgisayar Programlama
Değişken isimleri kullanma kuralları;
1. Değişken ismi en fazla 255 karakterden oluşmalıdır.
2. Değişkenler arasında _ hariç boşluk : ; , . / ' # [ ] ! " $ % ^ & * ( ) { } ve Türkçe karakterler
kullanılamaz, değişken adı sonunda $, %, &,!, # işaretleri kullanılır ise özel anlamları oluşur
3. Değişken isminin ilk karakteri harf olmalıdır. Yani değişkenler rakamla veya _ ile başlamaz.
4. Değişken isimlerinde büyük küçük harf ayrımı yoktur. "Abcde" ile "ABCDe" aynı algılanır.
5. Basic diline ait rezerve kelimeler kullanılamaz, herhangi bir BASIC komutu kullanılamaz.
İlişki operatörleri, herhangi bir ifade içerisinde sadece bir tanesi kullanılabilir, birden çok olamaz.
Operatör öncelikleri
1. NOT complement
2. AND conjunction
3. OR disjunction
4. XOR exclusive or (AND hariç OR)
5. EQV equivalence (x EQVy : x eşit y)
6. IMP implication (Birincinin değili veya ikinci)
www.qbasic.net
http:// http://deger.republika.pl/Download_MS_Basic_versions.htm
http://qbasicprogramlar.blogspot.com.tr/p/qbasic-program-indir-download.html
Prof. Dr. Levent ŞENYAY V -5 Bilgisayar Programlama
Basic dilinde program yazma
Programlama dili komut, deyim, fonksiyon ve değişkenleri bu doküman içerisinde gösterimi sırasında
aşağıdaki formata veya syntax yapısına uygun açıklamalar ile kullanılmıştır. Bu doküman aşağıdaki
gösterim kurallarına göre anlaşılmalıdır. Bilgisayar üzerinde çalışırken Basic version farklılıklarından
kaynaklanan syntax farklılıkları oluşabilir, programı bu tür hatalardan arındırmak için versiyona uygun
yazım düzeltmeleri gerektirebilir.
Executable
[LET] değişken=ifade atama (assignment) deyimi
READ değişken [,değişken] verileri DATA komutundan bilgisayar belleğine aktaran komut
INPUT [;][“mesaj”] değişken [,değişken] … verileri dış ortamdan (klavye) bilgisayara alan komut
PRINT [ifadeler listesi] [;] bilgisayar belleğinden dış ortama veri aktaran komut
İfadeler değişken veya sabitler olabilir
Alıştırmalar :
Program kodunun herhangi bir yerinde işleyişini bırakıp başka bir noktadan
çalışması için kullanılır. Goto ve ardında bir etiket yada satır numarası yazılmalıdır.
PRINT "MERHABA"
GOTO 10
PRINT "BU SATIRI EKRANDA GÖREMEZSİNİZ"
10 PRINT "PROGRAM SONA ERDİ"
END
işlem işlem
veya
IF <koşul> THEN <ifade>
[ELSE <ifade>]
ENDIF
Örnekler :
10 READ A
IF X=8 THEN 10
X=5
IF NOT X=5 THEN PRINT X
IF NOT X<>5 THEN PRINT X-4
READ A,B,C
IF NOT A<>B THEN END
IF NOT A=B THEN PRINT B
IF C>A THEN PRINT A
DATA 1,5,3
BASLA :
INPUT “devam için E/e giriniz”, C$
IF C$=”e” OR C$=”E” THEN PRINT “devam ediyorsunuz” : GOTO BASLA
ELSE IF C$=”h” OR C$=”H” THEN STOP
ELSE PRINT “yanlış harf girdiniz”
GOTO BASLA
I=7
IF I<3 OR I>5 THEN PRINT I
END
veya
IF X=(X\2)*2 THEN PRINT “sayı cift” ELSE PRINT “sayı tek”
veya
B%=X/2 : C=B%*2
IF X=C THEN PRINT “sayı çift”
ELSE PRINT “sayı tek”
veya
IF X MOD 2=0 THEN PRINT “sayı çift” ELSE PRINT “sayı tek”
Girilen bir sayının 3’ün ve 5’in tam katı olduğunu bulan program
INPUT SAYI
IF SAYI=(SAYI\5)*5 AND SAYI=(SAYI\3)*3 THEN PRINT “sayı 3 ve 5 in tam katları”
ELSE PRINT “sayı 3 ve 5 in tam katı değil”
X : sayı (X>0)
YK : yakın kök
S1 : X/YK
S2 : (S1+YK)/2
Örnek : vize ve final notu veri olarak giriliyor, vize notu %40 + final notu %60 başarı botu olarak
hesaplayan ve final notu 50 ve üstü ve başarı notu 50 ve üstü olan için GEÇTİ, diğerleri için KALDI
çıktısı veren program
READ V,F
IF F<50 THEN PRINT “KALDI”
ELSE N=VIZE*0.4+F*0.6
IF N<50 THEN PRINT “KALDI”
ELSE PRINT “GEÇTİ”
ENDIF
ENDIF
ELSEIF
IF in bir başka kullanımı
SELECT CASE
Bunun yerine kullanılan bir benzer deyim SELECT CASE dir. Eğer kontrol edilecek değişken için 2’den
fazla koşul sonucu varsa SELECT CASE yapısı kullanılır.
Örnek :
INPUT "1 ile 3 arasında sayı girin " ; A
SELECT CASE A
CASE 1 : PRINT "SAYI = 1"
CASE 2 : PRINT "SAYI = 2"
CASE 3 (bir alt satır kullanılır ise ( : ) gerekmez ).
PRINT "SAYI = 3"
CASE ELSE
PRINT "HATALI SAYI"
END SELECT veya [ENDCASE]
BASLA :
READ BNOT
SELECT CASE
CASE (BNOT>=0 AND BNOT<50) : PRINT “F”
CASE (BNOT>=50 AND BNOT<60) : PRINT “D”
CASE (BNOT>=60 AND BNOT<70) : PRINT “C”
CASE (BNOT>=70 AND BNOT<85) : PRINT “B”
CASE (BNOT>=85 AND BNOT=<100) : PRINT “A”
CASE ELSE : PRINT “girilen not geçersiz” : STOP
END CASE
GOTO BASLA
DATA 75,65,60,50,100,-1
ON n GOTO s1,s2, … sk
n=1
n=2
…
n=k
0 < n < 255 arasındaki integer (tamsayı) veya tamsayıya yuvarlanabilir değerler alır.
Aynı anda birden çok karşılaştırmayı aynı anda yapmak için kullanılır.
10 READ A
ON A/10 GOTO 30,50
30 B=A*2
GOTO 10
50 C=A*3
PRINT A,B,C
DATA 10,20
Ayın ilk günü P.tesi ise, girilen gününü hangi gün olduğunu bulan program
INPUT GUN
A=GUN MOD 7
ON A+1 GOTO 10,20,30,40,50,60,70
10 PRINT “Pazar” : GOTO 80
20 PRINT “pazartesi” : GOTO 80
30 PRINT “Salı” : GOTO 80
40 PRINT “Çarşamba” : GOTO 80
50 PRINT “Perşembe” : GOTO 80
60 PRINT “Cuma” : GOTO 80
70 PRINT “cumartesi” : GOTO 80
80 STOP
Örnek : Yukarıdaki programı SELECT CASE ile yaz.
Örnek : Tek haneli rakamla girilen bir sayıyı yazı ile yazan program
GOTO etiket/satır no
Program akışını herhangi bir koşula bağlı olmaksızın <etiket> ile belirtilen deyime aktarmak için
kullanılan deyim. GOTO bir döngü deyimi olmamasına rağmen IF – THEN - ELSE kontrolları ile beraber
recursive döngüler oluşturmak için kullanılabilir.
BASLA:
A=A+1
PRINT A
GOTO BASLA
Belirli sayılarda işlemlerin tekrar etmesi için kullanılır. Döngü değişkeni döngü çinde kullanılabilir,
ancak bu değer asla değiştirilmemelidir. Döngü değişkeni sonlanmadan döngü dışına çıkılabilir, ancak
döngü dışından döngü içinde döngü başı hariç herhangi bir yere GOTO ile giriş yapılamaz
FOR N = 1 TO 25
PRINT N
NEXT N
EXIT FOR
FOR döngülerinden doğrudan çıkartır ve programın çalışmasının NEXT deyiminden sonraki komuttan
devamını sağlar
CLS
WHILE A < 40 ' A<40 olduğu sürece devam
A=A+2
PRINT A
WEND
A=0
DO WHILE A<4 ‘A<4 olduğu sürece döngü çalışır
PRINT A
A = A +1
LOOP
Aynı döngünün bir farklı kullanımı ise, koşulu döngü sonunda kullanmaktır.
A=0
DO
PRINT A
A=A+1
LOOP WHILE A < 4 ' A<4 olduğu sürece döngüye devam
Yukarıdaki iki programı da aynı işlemleri yapar. Eğer WHILE, LOOP’un yanına konursa
döngüde şart aranmaksızın en az 1 kere döner. DO’ nun yanına konursa döngü başlamadan
şart kontrol edilir, şart uygun değilse döngü gerçekleşmez.
DO UNTIL <condition>
…
LOOP döngüsü
<koşul> yanlış olduğu sürece çalışır, diğer bir ifadeyle döngü koşul DOĞRU olana kadar çalışır.
veya
DO
…
UNTIL <condition> LOOP
A=0
DO UNTIL A>4 ‘A>4 oluncaya kadar döngü çalışır
PRINT A
A = A +1
LOOP
WHILE ... WEND, DO ... LOOP un bir alternatifidir. Ama DO LOOP kadar kullanışlı değildir.
Çünkü DO LOOP da karşılaştırma şartını başta veya sonda kullanabilme olanağı vardır.
EXIT DO
Bu deyim kullanıldığında, DO döngüsünün koşulu ne olursa olsun, koşul önemini yitirir ve içinde
bulunulan döngüden dışarıya çıkılmasını sağlar ve program LOOP komutundan sonraki satırdan
çalışmaya devam eder.
Örnek:
DO
…
IF <koşul> THEN EXIT DO
…
LOOP UNTIL <koşul>
Alıştırma 15.
READ X
WHILE X<>-1
WHILE X>0
PRINT X
X=X-1
WEND
READ X
WEND
DATA 3,2,4,-1
Alıştırma 16.
S=5 : T1=0 : T2=0 : T3=0
READ K,M
WHILE K<>-1 AND M<>-1
ON K GOTO 50,60,70
50 T1=T1+M : GOTO DEVAM
60 T2=T2+M : GOTODEVAM
70 T3=T3+M
DEVAM :
READ K,M
WEND
PRINT T1,T2,T3
DATA 1,50,2,50,3,80,1,20,2,20,1,10,3,40,3,20,-1,-1
Alıştırma 18.
FOR I=2 TO 5 BY 1 DO
FOR J=3 TO 6 BY 1 DO
PRINT I*J
REPEAT
REPEAT
Alıştırma 19.
I=1
FOR J=1 TO 3 BY 1 DO
FOR K=1 TO 3 BY 1 DO
PRINT I,J,K
REPEAT
REPEAT
Alıştırma 20.
I=2
WHILE I<7
PRINT I
PRINT 2*I
PRINT 3*I
PRINT 4*I
I=I+1
WEND
Alıştırma 21.
I=1
WHILE I<6
I=I+1
J=0
WHILE J<4
J=J+1
K=I*J
PRINT K
WEND
WEND
Program içinde kullanılacak veriler program içinde birden fazla kez kullanılacak ise bu verileri
dizinli/indisli/altsıralı değişkenlere aktarılması daha uygundur. Bu tür değişkenler programda
kullanılmadan önce DIM deyimi ile tanımlanmalıdır.
LBOUND, UBOUND
Tanımlanmış bir dizinin ilk boyut numarasını öğrenmek için LBOUND, son boyutunu öğrenmek
için UBOUND kullanılır.
Örnek : DIM A(10 TO 20) yazdığımızda A nın ilk boyut numarası 10 son numarası 20 olacaktır.
Bun işlemden sonra A(5) = 40 ya da A(22) = 65 yazılacak olursa hata oluşacaktır (Subscript out of
range), çünkü bu durumda değişken dizi sınırları dışında işlem yapılmaya çalışılmış olacaktır.
REDIM ve ERASE
Diziler için bellekte ayırılan alanı genişletmek/azaltmak (dinamik kullanmak) veya silmek için kullanılır.
CLS
DIM A(15)
PRINT UBOUND(A) ’ekrana 15 yazar
REDIM A(30) ' Yeniden boyutlandı
PRINT UBOUND(A) ‘ekrana 30 yazar
ERASE A ' Bellekte kapladığı alanı boşalt, sil
PRINT UBOUND(A) ' HATA. Çünkü dizi bellekten atıldı
DIM A(20)
FOR I=1 TO 20
INPUT A(I)
NEXT I
ENB=A(1) : ENBIND=1
ENK=A(1) : ENKIND=1
FOR I=2 TO 20
IF A(I)>ENB THEN ENB=A(I) : ENBIND=I
IF A(I)<ENK THEN ENK=A(I) : ENKIND=I
NEXT I
PRINT “en büyük :” , ENB, “ve”, ENBIND, “inci eleman”
PRINT “en küçük :” , ENK, “ve”, ENKIND, “inci eleman”
1. Ekrandan 20 elemanlı bir dizine değer okut
a. Bu diznin 5. Elemanını yazdır
b. Bu dizini başka bir dizine kopyala
c. Dizinin max ve min elemanını bul
d. Bu dizini ters bir şekilde bir başka dizine kopyala
e. Bu dizindeki çift sayıları CIFT dizinine, tek sayıları TEK dizinine kopyala
f. Küçükten büyüğe sırala DIM A(5,7),S(5),K(7)
g. Büyükten küçüğe sırala FOR I=1 TO 5
2. Ekrandan 5 satır, 7 sütunlu bir tablonun tüm S(I)=0
elemanlarını klavyeden okutup, tüm satır ve sütun NEXT I
toplamlarını hesaplayan program. >>>>>>>>>> FOR I=1 TO 7
K(I)=0
NEXT I
FOR I=1 TO 5
3. 100 kişinin adı ve sınav notlarını iki ayrı değişene gir FOR J=1 TO 7
a. Listele INPUT A(I,J)
b. Adı AHMET olanın notunu göster S(I)=S(I)+A(I,J)
c. Adı AHMET ve notu>50 olanları göster K(J)=K(J)+A(I,J)
d. Adı AHMET ve notu 0 veya 100 olanları göster NEXT I
DIM A(5), B(5) NEXT I
FOR I=1 TO 5
READ A(I)
B(6-I)=A(I)
NEXT I
DATA 8,6,7,3,2
4. DIM M(5,5) 1 0 0 0 0
FOR I=1 TO 5 DO 2 1 0 0 0
FOR J=1 TO 5 TO 2 2 1 0 0
IF I=1 THEN M(I,J)=1 2 2 2 1 0
ELSE IF I>J THEN M(I,J)=2 2 2 2 2 1
ELSE M(I,J)=0
NEXT J
NEXT I
A(5,5),T(5,5)
FOR I=1 TO 5
FOR J=1 TO 5
INPUT A(I,J)
NEXT J
NEXT I
S=0
K=0
L=0
TOP=0
FOR I=1 TO 5
FOR J=1 TO 5
IF I=J AND A(I,J)>5 THN S=S+1 ‘a şıkkı
IF I<J THEN TOP=TOPP+A(I,J) : K=K+1 ‘b şıkkı
IF I>J THEN AND A(I,J)>20 THEN L=L+1 ‘c şıkkı
T(J,I)=A(I,J) ‘d şıkkı
NEXT J
NEXT I
ORT=TOP/K
veya
REM matrise sayı girişi
A(5,5)
FOR I=1 TO 5
FOR J=1 TO 5
INPUT A(I,J)
NEXT J
NEXT I
REM a şıkkı
S=0 : K=0 : L=0 : TOP=0
FOR I=1 TO 5
IF A(I,I)>5 THEN S=S+1
NEXT I
REM b şıkkı
FOR I=1 TO 5
FOR J=I TO 5
TOP=TOP+A(I,J) : K=K+1
NEXT J
NEXT I
ORT=TOP/K
Klavye aracığı ile sıra sıra girilen 3x4 boyutlu 2 matrisin toplamını yeni bir matrise aktaran program
M(3,4), N(3,4), K(3,4)
FOR I=1 TO 3
FOR J=1 TO 4
INPUT M(I,J), N(I,J)
K(I,J)=M(I,J)+N(I,J)
NEXT J
NEXT I
Orijinal seri 1 2 3 4 5 6 7
3 3 2 2 2 1 1 1
7 2 3 3 1 2 2 2
2 7 7 1 3 3 3 3
1 1 1 7 7 7 7 4
11 11 11 11 11 11 4 7
4 4 4 4 4 4 11 11
E H H E H H H
H E H H H
E H H H
H E H
E H
çıktı
FIX(12.1193) 12 (. Sonrasını yazar)
CINT(23.54) 24 (yuvarlar)
INT(1.2) 1 (tamsayı)
SGN(X)
5 1
-5.7 -1
0 0
ABS(-5.2) 5.2 (mutlak değer)
SQR(9) 3 (karekök)
EXP(6-4) (2.71828)2
LOG(5) log105
LN(5) lne5
SI
ATN(X/SQR(1-X**2) arcsin x
PI/2-ATN(X/SQR(1-X**2) arccos x
DEF fonkadı=(fonksiyon)
fonkadı=(argüman listesi) diğer versionların kullanımı
FUNCTION
FUNCTION yapısı SUB lar gibidir. Yukarda açıklananlar bunda da geçerli. Function'un farkı
verilen değerler üzerinde işlem yapıp bir sonuç ile geri döndürmesi. Qbasic in kendi
yapısındaki birçok komutun Function özelliği vardır. Örneğin : X = SQRT(81) yazdığımızda
verilen 81 sayısı SQRT(karekök alma) fonksiyonu tarafından işlenir ve sonuç olarak 9 döner.
Bu sonuç X değişkenine atanır.
Örnek :
CLS
PRINT enbuyuksayi(15, 25)
FUNCTION enbuyuksayi (sayi1, sayi2)
IF sayi1 > sayi2 THEN enbuyuksayi = sayi1
ELSE enbuyuksayi = sayi2
END IF
END FUNCTION
EXIT DEF
EXIT FUNCTION
Bir FUNCTION prosedüründen çıkmak için kullanılır, programın çalışmasının fonksiyonun çağırıldığı
satırın bir sonraki deyimden devam etmesini sağlar
GOSUB
GOSUB ile alt programlar oluşturur. GOSUB yerine SUB kullanmak yeterli olur. Gosub da goto gibi
programın işleyişi bırakıp başka bir noktadan başlaması sağlanır. Fakat farklı olarak RETURN
komutunu görünce kaldığı yere geri dönerek çalışmasına devam eder. Alt programa, istediğimiz
yerden istediğimiz kadar atlanabilir. GOSUB ve ardından bir etiket ya da satır numarası yazmak
gerekir. GOSUB ile atlanan yerde RETURN bulunmazsa geri dönüş olmaz.
CLS
GOSUB CIZGI
PRINT "MERHABA DÜNYA"
GOSUB CIZGI
PRINT "QUICK BASIC"
GOSUB CIZGI
PRINT "PROGRAMLAMA DİLİ"
GOSUB CIZGI
END
CIZGI:
PRINT "----------------"
RETURN
GOSUB GIT1
…
… Main prog
GOSUB GIT2
…
STOP programın çalışmasını durduğu yer
GIT1 : Subroutine 1
…
RETURN
…
GIT2 :
…
… Subroutine 2
…
RETURN
END program yazımının sonlandığı yer
SUB
Alt Programları (subroutine) Fonksiyonlardan (function) ayıran tipik özellik, çağıran programa parametre
listesindeki değişkenler aracılığıyla birden çok sonuç değeri gönderebilmeleri ve bağımsız bir komut ile
çalıştırılmalarıdır.
örnekler:
SUB ekranayaz (satir AS INTEGER, sutun AS INTEGER)
veya
SUB ekranayaz (satir%, sutun%)
Örnek program:
CLS
cizgi$ = STRING$(60, "-")
yaziortala 1, cizgi$
yaziortala 2, "Merhaba"
yaziortala 3, "Bugün Qbasic de Goto, GoSub, Sub ve Function'u öğrendim"
COMMON:
Common, shared gibidir ama daha genel bir tanımlama yapılır. Qbasic ile CHAIN komutuyla
başka bir bas dosyaya bağlantı kurabiliriz. Değişken Common ile tanımlama yapılırsa değeri
bağlantı kurulan bas dosyada da geçerli olur. Zaten başlangıçta tek bas dosya üzerinde
çalışacağınızdan bu gerekli olmayacak.