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.