Statements

En Büyük İslami Forum Sitesi/Statements => Pascal'ın temeli veri yapıları ile Statementlar üzerine kurulmuştur. Bir programlama dilindeki stetementlar anahtar kelimeler ve diğer elementlerin

Gönderen Konu: Statements  (Okunma sayısı 3388 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı administrator

  • Administrator
  • General
  • *****
  • İleti: 24515
  • Karma: +3/-1
    • Profili Görüntüle
    • Toplist Ekle Site Ekle
Statements
« : Nisan 30, 2009, 12:25:58 ÖS »
Pascal'ın temeli veri yapıları ile Statementlar üzerine kurulmuştur. Bir programlama dilindeki stetementlar anahtar kelimeler ve diğer elementlerin bir araya gelmesiyle programın bir dizi işlemleri gerçekleştirmesini sağlarlar. Bir sonraki bölümdede göreceğimiz gibi statement lar procedure ve fonksiyonların oluşumunu sağlarlar. Şimdi program yazmamız için gerekecek temel komutlar üzerinde duralım.
Basit ve bileşik Statementlar:
Eğer Pascaldaki bir statement, içerisinde başka bir statement barındırmıyorsa buna basit statement denir. Bu türe örnek olarak procdurelerin işletilemesi için kullanılanlar ve atama işlemleri için kullandığımız statementları örnek verebiliriz. Basit statementlar noktalı virgüller ile birbirlerinden ayrılır :
X := Y + Z; // atama
Randomize; // procedure çağrısı
Genelde statementlar "begin" ve "end" kelimeleri arasında yer alan bileşik statementların birer parçasıdır. Örneğin :
begin
A := B;
C := A * 2;
end;
“end” kelimesinden önceki statement’ın sonuna noktalı virgül koyulmasına gerek yoktur. Örnek:

begin
A := B;
C := A * 2
end;
İki farklı yazım şeklide doğrudur. ilk kod gereksiz bir noktalı virgül içermektedir. Bu statement bir Null statement’tır, yani kodu olmayan(boş). Null statementların bazı durumlarda döngüler yada bazı özel durumlarda kullanılabileceğine dikkat ediniz.
Not : Bu son noktalı virgül işe yaramasada kullanmaktayım, sizinde kullanmanızı tavsiye ederim çünkü daha sonra bu koda ilave yapmak isteyebilirsiniz.
Atama Statementları:
Pascalda atama işlemleri iki nokta üstüste ve eşittir işaretlerinin birlikte kullanılması ile yapılır. Bu notasyon diğer program dillerini kullananlar için alışık gelmeyebilir. Diğer dillerde atama işareti olarak eşittir işareti kullanılırken, Pascalda bu işaret karşılaştırma, test etme amacı ile kullanılır.
Not: Pascal derleyicisi ( C derleyicisi gibi ) karşılaştırma ve atama işlemleri için iki farklı operatör kullanmaktadır. Bu statementlardaki işaretin test amaçlımı yoksa atama amaçlımı olduğunu anlamına bakmak yerine iki farklı operatör kullanarak gerçekleştirir buda hız kazandırmaktadır.
Farklı operatörlerin kullanımı kullanıcıların programı okumasınıda kolaylaştırmaktadır.
Conditional Statements :
Conditional Statement’lar belli bir koşula göre iki yoldan birisine ayrılmayı sağlarlar. Bu koşulu test ederek gerçekleşrirler. İki temel conditiolan statement yapısı vardır bunlar IF ve CASE yapılarıdır.
IF Conditional Statementlar :
If yapısı bir koşulun sağlanması durumunda işletilir yada (if-then-else) yapısı kullanılarak koşulun sağlanması durumunda farklı, sağlanmaması durumunda farklı bir işlem gerçekleştiri.
Koşul, boolean mantıksal veri yapısı ile gösterilir. Buna örnek bir kod için basit bir Delphi program örneği verileceğiz. Önce yeni bir uygulama açın, ve formun üzerine iki check box ve dört buton koyun. Butonların yada checkboxların isimlerini değiştirmeyin, fakat üzerlerine çift tıklayarak OnClick olaylarında ne yapmaları gerektiğini tanımlamak için kod sayafasına geçin. İşte ilk buton için bir IF koşul yapısı:
procedure TForm1.Button1Click(Sender: TObject);
begin
// basit if statement
if CheckBox1.Checked then
ShowMessage ('CheckBox1 onay kutusu işaretli')
end;

Program çalışırken eğer birinci onay kutusu(CheckBox) işaretli ise basit bir mesaj örüntülenecektir. (Şekil : 5.1) ShowMessage fonksiyonunu kullandım çünkü Delpide kullanıcıya en basit şekilde mesaj görüntülemenin yolu budur.

Şekil 5.1 : CheckBox1 kutusu işaretliyken 1. butona basınca çıkan mesaj görüntüsü.
Eğer düğmeye bastığınızda herhangi bir mesaj almıyorsanız checkbox1 kutusu seçili drurumda değildir. Böyle bir durumu daha açık bir hale sokmak için ikinci butonun OnClick olayına (if-then-else) yapısını kuralım. Bunun için program tasarım aşamasında iken 2. butona çift tıklayarak OnClick olayına aşağıdaki kodu yazalım.

procedure TForm1.Button2Click(Sender: TObject);
begin
// if-then-else statement
if CheckBox2.Checked then
ShowMessage ('CheckBox2 kutusu seçili durumda')
else
ShowMessage ('CheckBox2 kutusu seçili değil');
end;

İlk cümleden sonra ve else anahtar sözcüğünden önce noktalı virgül kullanılmamasına dikkat ediniz aksi halde derleyici bir hata verecektir. If-Then-Else yapısı basit bir cümledir bu sebeple araya bir noktalı virgül koyulamaz.

If cümlesi dahada karmaşık bir yapıda olabilir. Koşul cümlesi, ardışık koşullad dizisi haline getirilebilir. Bu işlem (and, or ve not) mantıksal operatörleri kullanılır. Yada if cümleciği yuvalanarak (ardışık halde) kullanılabilir.
Form üzerindeki son iki butonu bu işlemleri göstermek için kullanacağız:

procedure TForm1.Button3Click(Sender: TObject);
begin
// iki koşullu statement
if CheckBox1.Checked and CheckBox2.Checked then
ShowMessage ('İki CheckBox onay kutusu işaretli')
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
// Bileşik, yuvalanmış if statement
if CheckBox1.Checked then
if CheckBox2.Checked then
ShowMessage ('CheckBox1 ve 2 işaretli')
else
ShowMessage ('Sadece CheckBox1 işaretli')
else
ShowMessage (
'Checkbox1 işaretli değil, Checkbox2 yi kim önemser ki?')
end;

İkinci kodu iyice inceleyip programı çalıştırarak herşeyi anladığınızdan emin olun. Eğer hala kuşgularınız ve sorularınız varsa benzer programlar yazarak çözümlemeye çalışın, anlamanın en iyi yoludur. Daha fazla CheckBox ekleyip kodda değişiklikler yaparak yeni programlar üretebilirsiniz.
Case Statement:
Eğer if kalıbı ile kurduğunuz koşul cümleleri karmaşık bir hale geliyor ise Case yapısını kullanabilirsiniz. Case yapısı tek bir değer, değer listesi yada bir değer aralığındaki elemanı seçmek için kullanılan ifadedir. Bu değerler sabitlerden oluşur bu sebeple tekil ve ordinal veri tipinde tanımlı olmaları gerekir. Son olarakta else cümlesi kullanılarak bu değerlerden hiç biri uymuyor ise yapılması gereken işlemler belirlenebilir. İşte iki küöük örnek program :

case Sayi of
1: Text := 'Bir';
2: Text := 'İki';
3: Text := 'Üç';
end;

case Karakter of
'+' : Text := 'Toplama işareti';
'-' : Text := 'Çıkarma işareti';
'*', '/': Text := 'Çarpma yada bölme işareti';
'0'..'9': Text := 'Rakam';
'a'..'z': Text := 'Küçük harf';
'A'..'Z': Text := 'Büyük harf';
else
Text := 'Bilinmeyen karakter';
end;
Pascal’da Döngüler :
Pascal dili diğer dillerde mevcut olan for, while ve repeat gibi çoğu döngü yapısına sahiptir. Bu yapılar eğer önceden başka programla dili kullandıysanız yabancı gelmeyecektir bu sebeple üzerinde fazla durmayacağım.
For döngü yapısı:
Pascaldaki for yapısı statementların her işletilişinde artan yada azalan bir sayaç temel alınarak tasarlanmıştır. aşağıda ilk on rakamı toplamak için For döngüsü kullanılarak yazılmış örnek program göreceksiniz:
var
K: Integer;
begin
K := 0;
for I := 1 to 10 do
K := K + I;
Ters bir sayaç kullanılarakta aynı kod şöyle yazılır :
begin
K := 0;
for I := 10 downto 1 do
K := K + I;
Diğer dillere göre pascaldaki for yapısı daha az esnektir. (Sayacı sadece birer birer arttırabilirsiniz) fakat anlaşılması kolaydır. Eğer daha karmaşık yada özgün bir sayaca sahip döngü yapısını oluşturmak isterseniz Repeat yada While döngü yapılarını kullanabilirsiniz.
Not : For döngüsünün sayacı için sayı kullanmak zorunluluğu yoktur. Ordinal tipte herhangi bir değer, karakter yada enumerated tipte bir değer olabilir.
While ve Repeat Statement’ları:
While-do ve Repeat-Until döngü yapıları arasındaki tek fark repeat until yapısının en az bir kere işletiliyor olmasıdır. Bunu aşağıdaki örneğe bakarak kolayca anlayabilirsiniz :
while (I < 100) and (J < 100) do
begin
// I ve J birşeyler hesaplamak için kullanır...
I := I + 1;
J := J + 1;
end;

repeat
// I ve J birşeyler hesaplamak için kullanır...
I := I + 1;
J := J + 1;
until (I > 100) or (J > 100);

Eğer I ve J nin ilk değeri 100’den büyükse Repet-Until yapısı içerisindeki statementla en az birer defa işletilecektir.
İki yapı arasındaki diğer temel fark ise repeat-until yapısının ter yapıda çalışmasıdır yani olumsuz koşul devam ettiği sürece işletiliyor olması. Koşul sağlandığı takdirde döngüde durmuş olacaktır. Bu çalışma şekli While döngü yapısının tam tersidir. Bu yapıda ise koşul sağlandığı müddetçe döngü işletilmeye devam eder.Bu sebeple yukarıdaki kodda koşul cümlesini ters yazdım (yani I < 100 yerine I >100)
Döngüler ile ilgili örnek program :
Döngüler hakkında biraz daha geniş bilgiye sahip olmak için Loops adında örnek bir program yapalım. Loops programı sabit veya rastgele sayılardan oluşan bir sayaca sahip döngünün nasıl işlediğini göstermekte. Delphi program geliştirme ortamı içerisinde yeni bir proje başlatın adınıda Loops koyalım. Daha sonra aşağıdaki text olarak verilmiş form yapısını oluşturun.
object Form1: TForm1
Caption = 'Loops'
object ListBox1: TListBox ...
object BtnFor: TButton
Caption = '&For'
OnClick = BtnForClick
end
object BtnWhile: TButton
Caption = '&While'
OnClick = BtnWhileClick
end
end



Şekil 5.2
Form üzerindeki butonlardan üzerinde FOR yazana basınca listenin 1 den 20 ye kadar olan ardışık sayılar ile dolduğunu göreceksiniz. Butona her basışınızda liste içerisindeki tüm elemanlar silinip tekrar 1 den 20 ye kadar yazılacaktır. Şimdide üzerinde FOR yazan butonun onClick olayına göz atalım, işte kodu :
procedure TForm1.BtnForClick(Sender: TObject);
var
I: Integer;
begin
ListBox1.Items.Clear;
for I := 1 to 20 do
Listbox1.Items.Add ('String ' + IntToStr (I));
end;

Üzerinde WHILE yazan ikinci butonun onClick olayı ise öncekine göre biraz daha karmaşık. 0 ile 99 arasında rastgele sayı üretilip listeye ekleniyor ve bu sayıların toplamı ne zaman 1000 in üzerine çıkarsa döngü işlevini tamamlamış oluyor. Programın koduna göz atalım
procedure TForm1.BtnWhileClick(Sender: TObject);
var
I: Integer;
begin
ListBox1.Items.Clear;
Randomize;
I := 0;
while I < 1000 do
begin
I := I + Random (100);
Listbox1.Items.Add ('Random Number: ' + IntToStr (I));
end;
end;

Burada bahsetmekte fayda gördüğüm iki komut var : Randomize ve Random komutları.
Random komutunun kullanımı Random(x) şeklindedir ve 0 ile X-1 arasında rastgele değerler üretir, peki Randomize komutu ne işe yarar. Bunu anlamak için komutun başına // karakterlerini koyarak yorum cümlesi haline getirin böylece Delphi bu satırı işletmeyecektir. Daha sonra programı çalıştırıp WHILE yazan butona basın. Diyelimki 1,12,90,2,34 …. Sırasında sayılar üretti ve listeye ekledi. Butona ikinci basışınızda dikkat ederseniz yine aynı sayıları ürettiğini görceksiniz. Programdan çıkıp tekrar çalıştırın ve tekrar WHILE yazan butona basın bu sefer farklı sayılar gelecektir fakat programdan çıkmadan tekrar tekrar WHILE butonuna basdığınızda göreceksinizki hep aynı sayıları üretmekde. İşte dikkat edilmesi gereken nokta bu. Randomize komutu Random komutu ile üretilecek olan sayılar için Sistem saatine bağlı olarak bir referans noktası oluşturur. Saat sürekli değiştiği için Randomize komutunu işlettiğinizde bu referans noktasıda değişir, böylece programa girip çıkmadan sürekli farklı sırada sayılar üretebilirsiniz. Prgramın ekran çıktısı şöyle :


NOT: Burada bahsetmek istediğim dört tane daha yeni komut bulunmakta bunlardan ilk ikisi Break ve Continue. Bu iki komuttan ilki içerisindebulunan döngüden çıkmaya yarar. Yani döngünün bittiği yerden sonraki komut işletilmeye başlanır. Continue ise yine döngü içersinde bulunulan yerden döngünün başına dönülmesini sağlar. Ve döngü "sayacın kaldığı yer" den devam ederek işletilir. Diğer iki komut ise Halt ve exit. Halt komutu işletildiği an programdan çıkılır. Yani program son bulur. Pek sağlıklı bir komut değildir çünkü hafızada bulunan nesnelerin onDestroy gibi olayları işletilmeden program sonlanır böylece program bitmesine rağmen hafızada hala yer iişgal edilir. Exit komutu ise içerisinde bulunulan fonksiyon yada prosedürden çıkılmasını sağlar. Yani Exit komut işletildiği an prosedüreden çıkılır.
With Statement :
Son olarakta sadece Delphi diline mahsus olan bir komuttan bahsedeceğim. (Sanırım with yada benzeri bir komut Visual Basic dilinin yeni versiyonundada kullanılmaya başlandı)
With komutu daha az kod yazmaya yardımcı olmasının dışında bir işe yaramaz. Eğer bir Record yapısının yada bir nesnenin elemanlarına referans vermeniz gerekirse her seferinde o nesnenin yada recordun ismini yazmanıza gerek kalmaz. Örneğin :
type
Date = record
Year: Integer;
Month: Byte;
Day: Byte;
end;

var
BirthDay: Date;

begin
BirthDay.Year := 1997;
BirthDay.Month := 2;
BirthDay.Day := 14;

Yukarıdaki kod yerine With statement'ını kullanarak şöyle yazabiliriz:

begin
with BirthDay do
begin
Year := 1995;
Month := 2;
Day := 14;
end;

Bu yaklaşımı bileşenlerde yada diğer Class (sınıf) tiplerindede kullanabilirsiniz. Örneğin Loop adındaki son örneği aşağıdaki gibi yazabiliriz.
procedure TForm1.WhileButtonClick(Sender: TObject);
var
I: Integer;
begin
with ListBox1.Items do
begin
Clear; // shortcut
Randomize;
I := 0;
while I < 1000 do
begin
I := I + Random (100);
// shortcut:
Add ('Random Number: ' + IntToStr (I));
end;
end;
end;

Bazen bileşenlerle çalışırken iç içe yuvalanmış alanları yamaktanda kurtarır. Örneğin :
Form1.Canvas.Pen.Width := 2;
Form1.Canvas.Pen.Color := clRed;
//Yukarıdaki kod yerine şöyle yazılabilir
with Form1.Canvas.Pen do
begin
Width := 2;
Color := clRed;
end;

With statement'ının sağladığı kolaylıkların yanında kullanırken dikkat edilmesi gereken noktalarda vardır örneğin aşağıdaki kod ile bir buttonun genişliğini, caption'ını, ve rengini değiştirelim (buton bileşeninin renk özelliğinin olmadığını hatırlatırım)
with Button1 do
begin
Width := 200;
Caption := 'New Caption';
Color := clRed;
end;

Buton bileşeninin Color özelliği olmamasına rağmen derleyici hata vermez çünkü Formun color özelliği bulunmakta. Buton bileşeninde böyle bir özellik bulamayınca Formunkini değiştirecektir.
Fakat aynı kodu WITH statement'ını kullanmadan yazsaydık derleyicden hata uyarısını alacktık.
Button1.Width := 200;
Button1.Caption := 'New Caption';
Button1.Color := clRed; // HATA!
BilX.Net