PROGRAM AKIŞININ DENETİMİ
Bir program komutların yazıldığı sırada akar. Ama
çoğunlukla, bu akışı yönlendirmek gerekir. Bu iş için denetim yapılarını
kullanırız. Bunlar iki gruba ayrılabilir: Yönlendiriciler ve döngüler.
Yönlendiriciler
Program akışını istenen yöne saptıran denetim
yapılarıdır. Bunlar da kendi içinde ikiye ayrılır: if ve case yapıları.
if ... then ...
Sözdizimi şöyledir:
if B then D;
Eğer B mantıksal deyimi sağlanıyorsa, D deyimini yapar
ve programda ondan sonraki deyimi işlemeye başlar. B mantıksal deyimi
sağlanmıyorsa, D deyimini atlar ve programda ondan sonraki deyimi işlemeye
başlar.
Örnek
program tahmin;
uses wincrt;
var
sayi, bul : integer;
Begin
sayi := 3;
writeln(' 1 ile 10 arasında bir sayı tuttum. Bil ! ');
readln(bul);
if sayi = bul then
writeln('Bravo,
Bildiniz. ');
if sayi <> bul then
writeln('Maalesef,
bilemediniz. ')
End.
if ... then ... else ...
Bazan, iki seçenekten birisini mutlaka yaptırmak
gerekir. Bu durumda, if ... then ... yapısı yerine if ... then ...else ...
yapısını kullanırız. Sözdizimi şöyledir:
if B then D1 else D2;
Bu yapı, önce B mantıksal ifadesine bakar. B
sağlanıyorsa D1 deyini işler; sağlanmıyorsa D2 deyimini işler.
Örnek
program tahmin;
uses wincrt;
var
sayi, bul : integer;
Begin
sayi := 3;
writeln(' 1 ile 10 arasında bir sayı tuttum. Bil ! ');
readln(bul);
if sayi = bul then
writeln('Bravo,
Bildiniz. ')
else
writeln('Maalesef,
bilemediniz. ')
End.
İç İçe if Deyimleri
Gerekiyorsa, if deyimleri iç içe yuvanabilir.
Örnek
program
if01;
uses
wincrt;
var
islem :boolean;
operator : char;
a,b,s
: real;
Begin
islem := TRUE;
writeln('Sayı, işlem, ve sayı giriniz: ');
readln(a);readln(operator);readln(b);
if operator ='*' then s:= a*b
else if operator ='/' then s:= a/b
else if operator ='+' then s:= a+b
else if operator ='-' then s:= a-b
else islem := FALSE;
if islem =FALSE then
writeln('İşlem geçersiz.')
else
writeln(a:4:2, ' ',operator, ' ', b:4:2, ' = ', s:6:2)
End.
Case denetimi
Program akışı bir yerde çok sayıda seçeneklerden
birisine yönlendirilecekse, if denetimi yerine case denetimi daha kolay olur.
Bunun için, ordinal tür (integer,
boolean, char) den bir seçici değişken kullanılır. Seçicinin aldığı değerlere
göre program akışı istenen seçeneğe
saptırılır. Sözdizimi şöyledir:
Case secici of
Etiket1 : D1;
Etiket2 : D2;
....
etiketn : Dn;
else
D
End;
{case}
Burada
etiketler seçicinin ait olduğu kümeden seçilen öğeler ya da alt-bölgeler
(subrange) olmalıdır.
Örnekler:
program hesap;
uses wincrt;
var
islem :boolean;
operator : char;
a,b,s : real;
Begin
islem := TRUE;
writeln('Sayı, işlem, ve sayı sırasıyla giriniz: ');
readln(a);readln(operator);readln(b);
case operator of
'*' : s:= a*b;
'/' : s:= a/b;
'+' : s:= a+b;
'-' : s:= a-b
else islem := FALSE;
end; {of case}
if islem =FALSE then
writeln('İşlem geçersiz.')
else
writeln(a:4:2, '
',operator, ' ', b:4:2, ' = ', s:6:2);
End.
program
hangitur(input, output);
uses wincrt;
var
d : char;
begin
clrscr;
write('Bir karakter giriniz : ');
readln(d);
writeln;
case d of
'a'..'z':
writeln('Küçük harf girdiniz ');
'A'..'Z':
writeln('Büyük harf girdiniz ');
'0'..'9':
writeln('Rakam girdiniz ');
else
writeln('Harf ve rakam olmayan bir karakter girdiniz ')
end
end.
DÖNGÜLER
Belirli bir iş bir çok kez tekrarlanacaksa, programda
bu iş bir kez yazılır ve döngü deyimleriyle istenildiği kadar tekrar tekrar
çalıştırılabilir. PASCAL’da bu işi yapan üç ayrı deyim vardır.
For ... to ... do ...
Bir deyim, önceden belirli olan sayıda tekrar edecekse, for ... to .. do ... deyimi kullanılır. Sözdizimi şöyledir:
i bir sayaç, m sayacın başlangıç değeri, n sayacın bitiş değeri ve D bir deyim olmak üzere,
For i:=m to n do D;
Burada i,m,n aynı bir ordinal (sıralı) kümenin öğeleridir. Genellikle tamsayılar kümesi kullanılır.
Örnekler:
Program For_DO1;
uses wincrt;
var
Sayac : Integer;
Begin
for Sayac := 1 to 10 do
writeln('PASCAL ile programlama seckin
programcilarin zevkidir.')
End.
Program for_6;
uses wincrt;
var
i,t
:integer;
Begin
For i:=0 Downto -12 do
begin
t:= 2*i+5;
writeln('i= ',i:3,' z=
',t:5);
end
End.
Program Ic_ice_dongu;
uses wincrt;
var
a,b : Integer;
Begin
writeln('a',' ','b');
writeln;
for a:=1 to 10 do
for b:=1 to 3 do
writeln(a,'
',b);
End.
While ... do ...
Belirli bir mantıksal deyim sağlandığı sürece, belirli bir işin tekrarlanması isteniyorsa, bu denetim yapısı kullanılır. Bu yapıda, tekrarlamanın kaç kez olacağını önceden bilmek gerekmez. Sözdizimi şöyledir:
B bir mantıksal
ifade (boolean), D bir deyim olmak üzere,
While B do D;
Örnekler:
program topla;
uses wincrt;
var
m,n,s : integer;
Begin
writeln('Kaça
kadar toplayacaksınız? ');
readln(n);
m:=1;
s:=0;
while
(m<(n+1)) do
begin
s := s+m;
m := m+1;
writeln(m-1:5,s:5)
end;
writeln; writeln;
writeln('1 den ',n, ' ye kadar tamsayıların
toplamı = ',s)
End.
program ekok;
uses wincrt;
var
a,b,a1,b1 :integer ;
Begin
WriteLn('Lütfen
iki tamsayı giriniz > ');
Readln(a,b);
a1:=a;
b1:=b;
while a<>b do
begin
if a<b then a:=a+a1;
if b<a then b:=b+b1
end
;
WriteLn(a);
End.
Repeat ...until ...
Sözdizimi şöyledir:
Repeat D until B;
Bu yapı while döngüsüne benzer; ama önce D deyimini yürütür sonra B mantıksal deyiminin sağlanıp sağlanmadığına bakar. Dolayısıyla, D deyimini en az bir kez yürütür. Ayrıca, D deyimi bileşik bir deyim ise, yani birden çok komut içeriyorsa, onları begin ... end arasına almaya gerek yoktur. Oysa for ve while döngülerinde bunu yapmak zorunludur.
Örnekler:
program goto_siz(input,output);
uses wincrt;
const
hak
= 6;
var
gizli,tahmin : char;
tahmin_sayisi : integer;
bulduk : boolean;
begin
randomize; {RANDOMIZE bir TP
komutudur}
gizli := char(ord('a') + random(26));
{RANDOM bir TP fonksiyonudur}
clrscr;
writeln('Gizli bir harf tutuyorum. Tahmin et
! ');
writeln(hak,' deneme hakkınız vardır.');
writeln;
tahmin_sayisi := 0;
repeat
tahmin_sayisi := tahmin_sayisi + 1;
write('Tahmin : ');
readln(tahmin);
if tahmin in ['A'..'Z'] then
{Buyuk harfleri kucuk harflere
çevirelim.}}
tahmin := char(ord(tahmin) + ord('a') - ord('A'));
bulduk := tahmin = gizli
until (tahmin_sayisi = hak) or bulduk;
writeln;
if
bulduk then
writeln('Tebrikler ',tahmin_sayisi,' inci tahminiz doğrudur.')
else
writeln('Gecmis olsun. Gizli harf ',gizli,' idi.')
end.
program ebob;
var
a,b
:integer ;
Begin
WriteLn('Ltfen
iki tamsay giriniz > ');
Readln(a,b);
repeat
if a>b then
a:=a-b
else
b:=b-a
until
a= b;
WriteLn(a);
End.