Simdi and, or ve not ifadelerini tek tek ve birlikte kullanan örnekler yapalim. Ilk önce and ile ilgili basit bir örnek yapalim. Bu programi and'in kullanimina örnek olmasi için yapiyoruz. Yoksa program pek bir ise yaramaz:
Program and_ornegi;
Uses Crt;
Var
sayi1, sayi2 : integer;
Begin Clrscr;
writeln('Asagiya 1 ile 10 arasi 2 sayi giriniz');
write('Birinci Sayi:');Readln(sayi1);
write('Ikinci Sayi:');Readln(sayi2);
clrscr;
if (sayi1 in[1..10]) and (sayi2 in[1..10]) then writeln('Sayilari dogru girdiniz')
else writeln('Sayilari Yanlis Girdiniz...');
readln;
end.
Programi TP'da yazip çalistirin ve birkaç sayi girin. Gördügünüz gibi ancak sayilarin ikisi de 1 ile 10 arasindaysa sonuç dogru oluyor, aksi halde (sayilarin birisi bile 1 ile 10'un disinda olsa) sonuç yanlis oluyor. Çünkü VE (and) kullandik. Peki bunun yerine sayilardan en az birisinin 1 ile 10 arasinda olmasini istesek ne yapariz. O zaman or (veya) kullaniriz:
Program and_ornegi;
Uses Crt;
Var
sayi1, sayi2 : integer;
Begin Clrscr;
writeln('Asagiya 1 ile 10 arasi 2 sayi giriniz');
write('Birinci Sayi:');Readln(sayi1);
write('Ikinci Sayi:');Readln(sayi2);
clrscr;
if (sayi1 in[1..10]) or (sayi2 in[1..10]) then writeln('Sayilari dogru girdiniz')
else writeln('Sayilari Yanlis Girdiniz...');
readln;
end.
Bu programi çalistirdiginizda iki sayidan birisini 1 ile 10 arasinda girerseniz, digerini ne girerseniz girin sonuç dogru olur. Eger ikisi birden 1 ile 10 arasinda degilse sonuç yanlis olur. Peki simdi de and ile or'u birlikte kullanarak kullanicidan 1,2,3,4,5,11 sayilarindan birisini yazmasini isteyelim. Eger bu yazilan iki sayi da bu sayilarin içindeyse sonuçta dogru yazsin, birisi bile bu sayilarin disindaysa sonuçta yanlis yazsin:
Program and_ornegi;
Uses Crt;
Var
sayi1, sayi2 : integer;
Begin Clrscr;
writeln('Asagiya 1,2,3,4,5,11 sayilarindan birisi olmak sartiyla 2 sayi giriniz');
write('Birinci Sayi:');Readln(sayi1);
write('Ikinci Sayi:');Readln(sayi2);
clrscr;
if ((sayi1 in[1..5]) or (sayi1=11)) and ((sayi2 in[1..10]) or (sayi2=11)) then writeln('Sayilari dogru girdiniz')
else writeln('Sayilari Yanlis Girdiniz...');
readln;
end.
Burada ilk önce sayi1'in 1 ile 5 arasinda olup olmadigina bakilir. Eger dogruysa zaten and kelimesinin solundaki iki sarti kapsayan sart dogru olur. Yani sayi ya 1 ile 5 arasindadir, ya da 11'dir. Eger sayi1 1 ile 5 arasinda degilse sart yanlis olur ama bir de or'un sagindakine bakilir. Eger sayi 11'e esitse bu sart dogru (true) olacagindan yine genel sart dogru olur. Bu durumda and kelimesinin solundaki sart dogru olmus olur. Eger and'in solundaki iki sart da yanlis ise sonuç otomatik olarak yanlis olur. Sag taraf için de (sayi2 için) ayni islemler yapildiktan sonra eger genel sart dogruysa sonuç dogru olur. Kendiniz birkaç örnek yaparak bunlari görebilirsiniz.
Simdi basit bir örnek daha yapalim. Bu program kullaniciya bir toplama islemi sorsun. Eger kullanici sonucu dogru girerse "Tebrikler, bildiniz" yazsin, aksi halde dogru sonucu ekrana yazsin. Yani ilk defa ciddi bir program yapiyoruz
Program Toplama_Programi;
Uses Crt;
var
s1,s2:integer;
toplam:integer;
Begin Clrscr;
{Rastgele iki sayi seciliyor...}
randomize;
s1:=random(100);
s2:=random(100);
{...0 ile 99 arasinda rastgele 2 sayi secildi}
writeln('Asagidaki toplama isleminin sonucunu yaziniz...');
writeln;
write(s1,' + ',s2,' = ');readln(toplam);
if (toplam=s1+s2) then writeln('Tebrikler, bildiniz...')
else writeln('Yanlis Sonuc! Cevap ',s1+s2,' olmaliydi.');
readln;
end.
Gördügünüz gibi if deyiminde sart olarak iki sayinin toplamini da verebiliriz. Hatta baska islemler bile yapabiliriz. Mesela sart olarak (toplam=(s1*21)/(s2+4)*11+9-s2*s1) gibi uzun bir aritmetik islem birle yazabiliriz. Ayrica esittir isaretinin sag ile solu yer degistirebilir. ((s1*21)/(s2+4)*11+9-s2*s1=toplam) gibi. Buralarda parantezlere dikkat etmelisiniz. Simdilik rastgele sayinin nasil bulundugunu ögrenmedik. Onun için o kisimlari kafaniza takmayin. Yukaridaki örnekte and ya da or kullanmadik ama faydali bir program oldugunu düsünüyorum. Not operatörü ise sonuç dogru ise yanlis, yanlis ise dogru yapar. Bununla ilgili bir program yapmistik ama daha iyi anlasilmasi için basit bir örnek daha yapalim. Bu program da 1 ile 5 arasinda bir sayi yazilmasini istesin. Eger sayi 1 ile 5 arasinda ise dogru, degilse yanlis yazsin:
Program deneme;
uses crt;
var
sayi:integer;
begin clrscr;
write('1 ile 5 arasi bir sayi giriniz: ');readln(sayi);
if not (sayi in [1..5]) then writeln('Yanlis!') else writeln('Dogru.');
readln;
end.
Buraya kadar genelde sayilarla ilgili islemler yaptik ama bunun mecbur olmadigini söylemistim zaten...
Programlamada karsilastirma ve (sonucuna göre) karar verme islemleri çok önemli ve genis kullanimlidir. Diger kullanim alanlarini görmeye devam edecegiz. Ama önce simdiye kadar pascal hakkinda ögrendiklerimizin hepsini birden kullanan ve nihayet bir ise yarayan bir oyun yapalim. Bu oyunda bilgisayar 1 ile 1000 arasinda rastgele bir sayi tutsun. Biz bir tahmin yapalim. Eger tahminimiz bilgisayarin tuttugu sayidan küçükse ekrana ÇIK, küçükse IN yazilsin ve bu islemler biz sayiyi dogru tahmin edene kadar sürsün. Hani bir oyun yapiyoruz ya -hiç gerek yok ama- bir de algoritmasini yapalim ki belki daha iyi anlasilir. Algoritmamiz söyle olabilir:
1) Rastgele (1 ile 1000 arasi) bir sayi tut.
2) Kullaniciya bir sayi sor.
3) Eger kullanicinin cevabi senin tuttugun sayidan büyükse ekrana "in" yaz.
4) Eger kullanicinin cevabi senin tuttugun sayidan küçükse ekrana "çik" yaz.
5) Eger kullanicinin cevabi senin tuttugun sayiya esitse ekrana "Aferin Bildin!" yaz.
6) Eger kullanicinin cevabi senin tuttugun sayiya esit degilse 2. adima git.
7) Programi bitir.
Bu algoritmayi kendinize göre yapabilirsiniz tabii. Zaten programciligin en zevkli yanlarindan birisi de ayni programi yapmak için çok fazla seçeneginiz ve çözüm yolunuz olmasidir. Simdi de programi yazalim. Programimiz söyle olabilir:
Program Tahmin_et_bakalim;
uses crt;
label en_bas;
var
sayi, tahmin, ts : integer;
begin clrscr;
ts:=0;
randomize;
sayi:=random(1000)+1;
gotoxy(1,1);write('1 ile 1000 arasi bir sayi giriniz...');
gotoxy(1,5);write('Islem: ');
en_bas:
gotoxy(13,3);write(' '); {Eski tahmini ekrandan siliyoruz}
gotoxy(1,3);write('Tahmininiz: ');readln(tahmin); {bir tahmin isteniyor}
ts:=ts+1; {Tahmin sayisi artiriliyor}
gotoxy(8,5);
if tahmin<sayi then write('Çik');
if sayi<tahmin then write('In ');
if sayi=tahmin then begin
writeln('Aferin Bildin!');
writeln('Tahmin Sayisi: ',ts);
end else goto en_bas; {tahmin yanlissa basa gidiliyor}
readln;
end.
Programi TP'da yazip çalistirin. Iste size güzel bir oyun! Programda asil dikkat etmemiz gereken yerleri kalin yaptim. Isterseniz size bu oyunu gelistirelim ve bu sefer biz içimizden bir sayi tutalim, bilgisayar bulsun! O zaman asagidaki programi pascal'da yazip çalistirin ve sonra da satir satir inceleyin. Ama programi çalistirdiginizda hile yapmayin. Yani aklinizdan tuttugunuz sayi 430 ise ve program 420'yi tahmin ederse in demek yok! Ona göre. Bu programi Pascal'da elinizle yazin. Yani kopyala/yapistir yapmayin. O zaman daha kolay ögrenirsiniz. Program söyle:
Program Tahmin_et_bakalim;
uses crt;
label en_bas;
var
tahmin, ts : integer;
alt,ust:integer;
tus:char;
begin clrscr;
writeln('Simdi aklinizdan bir sayi tutun ve eger benim söyledigim sayi');
writeln('sizin tuttugunuz sayidan küçükse çik anlaminda "ç" harfine, büyükse');
writeln('in anlamindaki "i" harfine bir defa basin.');
writeln;
writeln('Not: Sayi 1 ile 100 arasinda olmali!');
writeln;
writeln('Hazirsaniz Enter''a basin..');
readln;
clrscr;
alt:=1;
ust:=1000;
ts:=0;
gotoxy(1,1);write('Benim Tahminim...: ');
gotoxy(1,3);write('Ne yapiyim (i/ç).: ');
tahmin:=500;
en_bas:
gotoxy(20,1);write(tahmin);
gotoxy(20,3);
repeat
tus:=readkey;
until tus in['i','I','ç','Ç','D','d'];
if tus in['i','I'] then begin
ust:=tahmin;
tahmin:=(alt+ust) div 2;
end;
if tus in['ç','Ç'] then begin
alt:=tahmin;
tahmin:=(alt+ust) div 2;
end;
ts:=ts+1;
if tus in['d','D'] then begin
gotoxy(1,5);write('Aferin Bana!');
gotoxy(1,6);write('Tahmin Sayim: ',ts);
end else goto en_bas;
readln;
end.
Burada bilmedigimiz iki sey var. Birincisi repeat...until döngüsü. Ikincisi div islemi. Div (Ingilizcesi division) bölmek manasindadir ve solundaki sayiyi sagindaki sayiya bölüm küsurati atar. Yani mesela 6 div 3 = 2'dir ve 15 div 4 = 3'dür. Döngüler konusunu anlatacagiz. Programin çalisma mantigi gayet basit. Ama yeni programlamaya baslayan birisine karisik gelebilir. Program siz in dediginizde kendi kendine "Demek ki sayi bundan küçük, o zaman bundan sonra en fazla söyleyecegim sayi bu olsun, yani üst limit bu olsun" diyor ve ust:=tahmin ifadesi ile de bunu yapiyor. alt'in da mantigi ayni. Tahminini yaparken de alt ve ust degiskenlerini topluyor ve ikiye bölüyor. Programi çalistirdiginizda fark etmissinizdir zaten. Ilk tahmin hep 500 oluyor. Ondan sonra in derseniz 250, çik derseniz 750 oluyor... Tahmin sayisinin nasil hesaplandigi da gayet basit. Her sayi tahmininde tahmin sayisi bir artiriliyor