Demostyles
Sayfa: 1 [2]   Yukarı git
Konu: Pascal Temel Dersler  (Okunma Sayısı 1310 defa) Seenekler Arama
« Yanıtla #10 : 11 Şubat 2008, 23:24:45 »
***
20304. Üye
Korkunç Cesetler
Mesaj Sayısı: 95
Nerden: Samsun
Rep Puanı: 7
Offline

Ynt: Pascal Temel Dersler Ynt: Pascal Temel Dersler

korkunç resimler... korkunç resimler... korkunç resimler... korkunç resimler...

EMEĞE SAYGILI DAVRANIP YORUM YAZARSIN İNŞALLAH!


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.

Logged
pckolik tag



Re: Pascal Temel Dersler
Posted on: 28 Ağustos 2008, 14:09:51

Pascal Temel Dersler indir | Pascal Temel Dersler yükle | Pascal Temel Dersler resimleri | korkunç resimler Pascal Temel Dersler tezahüratları | korkunç resimler
Logged

« Yanıtla #11 : 11 Şubat 2008, 23:25:01 »
***
20304. Üye
Korkunç Cesetler
Mesaj Sayısı: 95
Nerden: Samsun
Rep Puanı: 7
Offline

Ynt: Pascal Temel Dersler Ynt: Pascal Temel Dersler

Eger simdiye kadar anlamadiginiz birsey yoksa ve kendiniz de biraz örnek yaptiysaniz artik baya bir Pascal biliyorsunuz demektir. Simdiye kadar iyi bir program yapamamamizin sebebi daha döngülere girmememizden kaynaklaniyor. if kalibini anlattik ama Pascal'da sadece karar verme komutu if degildir. Bir de Case-of deyimi var ki bazi durumlarda if'e göre çok daha kisa kod ile ayni isi yapmanizi saglar. Ayrica kullanimi da çok basittir. Mesela bir degiskenimiz var ve bu degiskenin aldigi 10 tane degisik deger için 10 ayri islem yaptirmak istiyoruz. Bunu if ile yapmak hem çok uzun olur hem de hata yapma sansimiz yüksek olur. Ama Case of kullanirsak çok daha anlasilir ve kisa yapabiliriz. Case'in genel kullanimi söyledir:

Case degisken of
deger 1 : islem 1;
deger 2 : islem 2;
deger 3 : islem 3;
...
...
End;
Tabii yine if'de (ve Pascal'in heryerinde) oldugu gibi birden çok islem yaptiracaksak begin ile and arasina aliriz. Sunun gibi:

Case degisken of
deger 1 : begin
islemler...
end;
deger 2 : begin
islemler...
end;
...
...
end;
Ayrica birden çok deger için bir islem yapilacaksa söyle kullanilir:

Case degisken of
deger 1, deger 2, deger 3 : islem 1;
deger 4 : islem 2;
deger 5, deger 6 : islem 3;
...
...
End;
Simdi güzel bir program yapalim. Kullanicidan bir sayi istesin ve ekranda bir menü olsun. Seçime göre belirli islemler yapilsin. Programi yazmaya baslayalim:

Program SF;
Uses Crt;
Label
en_bas;
var
sayi:longint;
secim:char;
cikis:boolean;
begin clrscr;
cikis:=false;
write('1 ile 1000 arasi bir sayi giriniz: ');readln(sayi);
en_bas:
clrscr;
gotoxy(30,8);write('::: Menü :::');
gotoxy(30,10);write('[1] Sayinin Karesini yaz');
gotoxy(30,11);write('[2] Sayinin Karekökünü yaz');
gotoxy(30,12);write('[3] Sayinin Kübünü yaz');
gotoxy(30,13);write('[4] Programdan çik');
gotoxy(20,18);write('Seçiminizin önündeki sayiya basiniz');
gotoxy(30,15);write('Seçiminiz: ');
secim:=readkey;
case secim of
'1': begin
clrscr;
gotoxy(30,10);
write(sayi,'''nin Karesi= ',sayi*sayi);
secim:=readkey;
end;
'2': begin
clrscr;
gotoxy(30,10);
write(sayi,'''nin Karekökü= ',sqrt(sayi):10:4);
secim:=readkey;
end;
'3': begin
clrscr;
gotoxy(30,10);
write(sayi,'''nin Kübü= ',sayi*sayi*sayi);
secim:=readkey;
end;
'4': cikis:=true;
end; {Case'in sonu}
if (not cikis) then goto en_bas;
clrscr;
writeln('Güle Güle... writen by Linklerin Görülmesine İzin Verilmiyor
Üye Ol Sayın ziyaretci Linkleri Göremezsiniz Lütfen Üye Olun Giris Yap
www.seckin.canavari.com.net
');
end.
Gördügünüz gibi secim:=readkey; komutuyla bir tusa basilmasini bekliyor ve case secim of ile de bu tusun '1', '2', '3' veya '4' olmasi durumunda yapilacak islemler belirtiliyor. '4' olmasi durumunda cikis:=true ile cikis isimli boolean degiseknin degeri true oluyor. if (not cikis) then goto en_bas; ile de eger cikis'in degeri false ise (ki '4'e basilmadikça hep false olur, çünkü programin basinda false yaptik) en_nas; labelinin oldugu yere gidiyor. Dolayisiyla da true olunca programdan çikilmis oluyor. Artik programlarimizda menü yapmaya da bir örnek vermis olduk. Tabii hareketli menü yapmayi da anlatacagiz ama o daha çok ilerde.. Bu örnek karisik geldiyse konunun daha iyi anlasilmasi için basit bir örnek daha yapalim:

Program FS;
Uses Crt;
var
sayi:longint;
begin clrscr;
write('Bir Sayi Giriniz: ');readln(sayi);
case sayi of
0..9: writeln('Bu sayi 1 basamaklidir');
10..99: writeln('Bu sayi 2 basamaklidir');
100..999: writeln('Bu sayi 3 basamaklidir');
else writeln('Bu sayi 3''den çok basamaklidir');
end;{Case'in sonu}
end.
Burda case ile birlikte else'in de kullanimini gördük. Eger case ile belirttigimiz hiçbir sart dogru degilse bir islem yapmasini isteyebiliriz. Bu durumda bütün sartlarin sonuna else.. koyariz. Yine case kullanirken iki nokta üst üste ( isaretinin soluna araya virgül koyarak birden çok sart da koyabilirsiniz.

case sayi of
13, 17, 4, 10, 9: writeln('Bu sayi benim sevdigim sayilardan birisidir!');
else writeln('Bu sayilari hiç sevmem ');
end;
gibi.. Case komutunu genelde bir degiskenin birden çok sonucuna göre farkli islemler yaptirmak istediginizde kullanabilirsiniz. Dikkat etmeniz gereken case degisken of kalibinda belirttiginiz degisken ile alabilecegi degerlerin ayni tipte olmasidir. Yani degisken sayi tipindeyse herhalde degeri 'D' olamaz! Ya da char tipindeyse degeri 5 olamaz, '5' olabilir. Ikisinin arasindaki farki anlatmistim. Önceki sayi, sonraki karakterdir.
Pascal'da (ve diger bütün programlama dillerinde) iç içe istediginiz kadar if kullanabilirsiniz. Mesela:

if a>b then begin
if a=0 then writeln('B 0''dan küçük');
if b=0 then writeln('A 0''dan büyük');
end;
gibi olabilir. Ya da asagidaki 3 if deyimi ayni isi yapar:

1)
if a>1 then begin
if a<7 then writeln('A degiskeninin degeri 1 ile 7 arasindadir.');
end;

2)
if a>1 then if a<7 then writeln('A degiskeninin degeri 1 ile 7 arasindadir.');

3)
if (a>1) and (a<7) then writeln('A degiskeninin degeri 1 ile 7 arasindadir.');
Programci siz oldugunuza göre (ve amaç problemi en basit ve kisa yoldan çözmek olduguna göre) hangisini kullanacaginiza karar vermek size kalmis. 2. örnekte if a>1 then ifadesinden sonraki mavi yazili yerin tamami bir komuttur. Bunu daha önceden söylemistik. Öyleyse then'den sonraki komut bu olabilir. Burada iç içe iki if kullanilmistir.
Logged
Sayfa: 1 [2]   Yukarı git

 
Gitmek istediğiniz yer:  

Powered by SMF 1.1.5
SMF © 2006, Simple Machines LLC
Seo4Smf v0.2 © Webmaster's Talks
eXTReMe Tracker