Pascal'da Record İşlemi ( Konu Anlatımlı ) (K'A)

KaNDe

Yeni üye
23 Ocak 2012
15
0
RECORD


Türleri birbirlerinden farklı olan verileri bir araya getirip tek bir tip olarak işlemeyi sağlamak için, programcının tanımladığı bir türdür. Bunu, kağıda yazılı formlar gibi düşünebiliriz. Örneğin, bir nüfus cüzdanı sureti, bir sürücü ehliyeti, bir başvuru formu, farklı türden birden çok veriyi, bir bütün olarak bir arada tutarlar. PASCAL’da bu verileri bir arada tutacak bir yapı oluşturulabilir ve bunun adına record denilir.

Her tür için olduğu gibi, record, programın (ya da blokun) bildirge bölümünde tanımlanır. Programcının tanımladığı her türde olduğu gibi, ya doğrudan değişken olarak tanımlanabilir; ya da dolaylı olarak bir tip olarak tanımlanabilir.

Direk Bildirim

Var
Kimlik : RECORD
Sicil_No : integer;
Ad : string[20];
Soyad : string[20];
ucret : real
END;

Dolaylı Bildirim

Type
Kimlik_tipi = RECORD
Sicil_No : integer;
Ad : string[20];
Soyad : string[20];
ucret : real
END;
Var
Kimlik1, kimlik2 : kimlik_tipi;

Dolaylı ve dolaysız bildirimler aynı işi görürler. Ancak, büyük bir programda, aynı biçimdeki record’u farklı bloklarda ve farklı değişken adlarıyla kullanmak gerekiyorsa, dolaylı bildirim seçilmelidir.

Record ... End arasına yazılan değişkenlerin her birisine bir bileşen ya da bir veri alanı (field) denilir. Bunların bildirimi değişken bildirimi gibidir. Herbirine bir ad verilir ve karşısına :)) dan sonra türü yazılır. Record içinde tanımlanan alanlar için tür ya da sayı kısıtlaması yoktur. Ancak, record içinde bildirilen her türün derleyici tarafından biliniyor olması gerekir. Bu demektir ki, ya derleyicide var olan temel türlerden birisi olmalıdır, ya da programcının önceden tanımladığı bir tip olmalıdır.

İç içe record tanımlanabilir.

Record Bileşenlerine Erişim

Record bileşenlerine değer atamak ya da atanmış bir değeri okumak için iki yol izlenebilir.

Record Adını ve Bileşeni Yazarak

Bileşeni bir değişken olarak görmek için; record değişkeninin adı ve bileşenin adı yazılır; aralarına (.) konulur. Örneğin,


Kimlik.Sicil_No := 1234;


deyimi, kimlik adlı record değişkeninin Sicil_no adlı bileşenine 1234 değerini atar. Kimlik._Sicil_No integer türünden bir değişkendir; dolayısıyla kendi türünden değişkenlerle yapılabilen her işi yapar.

Yalnızca Bileşen Adını Yazarak

Çok sayıda bileşenle işlemler yaparken, her deyimde record adını tekrarlamaktan sakınmak için, PASCAL bir kolaylık getirmiştir.

WITH kimlik DO
Begin
Sicil_No := 1234;

Ad := ‘DERYA’ ;

Soyad := ‘ERTEM’ ;

Ucret := 1225000
End;

Deyimi, tek tek yapılan

Kimlik.Sicil_No := 1234;

Kimlik.Ad := ‘DERYA’ ;

Kimlik.Soyad := ‘ERTEM’ ;

Kimlik.Ucret := 1225000;

atamalaların yaptığı işi yapar.

program tarih;

uses wincrt;

type

tarih = record
gun,ay,yil : integer;
end;
var
bugun, yarin : tarih;
Begin
Writeln(‘Bu gün ayın kaçıdır ? ‘)
bugun.gun := 12;
bugun.ay := 4;
bugun.yil := 2012;
writeln('Bu günün tarihi : ', bugun.gun,'/',bugun.ay,'/',bugun.yil);
End.

Record bileşenleri, aynı türden başka değişkenlerden veri alabşlşr ya da onlara veri verebilir. Dolayısıyla, iki recordun aynı türden bileşenleri arasında veri alış verişi yapılabilir. Yukarıdaki programı biraz değiştirerek, bunun nasıl yapıldığını görebiliriz.

program yarin;

uses wincrt;

type

tarih = record
gun,ay,yil : integer;
end;
var
bugun, yarin : tarih;
Begin

writeln('Bu gün ayın kaçıdır? ');

readln(bugun.gun);

writeln('Bu ay kaçıncı aydır? ');

readln(bugun.ay);

writeln('Bu yıl kaçıncı yıldır? ');

readln(bugun.yil);

yarin.gun := bugun.gun + 1;

yarin.ay := bugun.ay;

yarin.yil := bugun.yil;

writeln('Yarının tarihi : ', yarin.gun,'/',yarin.ay,'/',yarin.yil);

End.


Not: Bu programda, bugun değişkeni yerine ayın son günü girilirse, program yarının tarihini yanlış verecektir. Neden? Programda, bunu doğru verecek düzeltmeyi yapınız.


program record06;

uses wincrt;

type

tarih_rec = record

gun,ay,yil : integer;

end;

tarih_arr = ARRAY[1..12] OF integer;

PROCEDURE Guncelle(var yarin : tarih_rec; gunler_arr : tarih_arr);

Begin

yarin.gun := yarin.gun+1;

if yarin.gun > gunler_arr[yarin.ay] then

begin

yarin.gun := 1;

yarin.ay := yarin.ay +1;

if yarin.ay > 12 then

begin

yarin.ay := 1;

yarin.yil := yarin.yil + 1;

end

end

End;

Var

bugun_tarih : tarih_rec;

gunler : tarih_arr;

Begin

gunler[1]:=31; gunler[2] :=28; gunler[3]:=31; gunler[4] :=30;

gunler[5]:=31; gunler[6] :=30; gunler[7]:=31; gunler[8] :=31;

gunler[9]:=30; gunler[10]:=31;gunler[11]:=30; gunler[12]:=31;


writeln('Bu gün ayın kaçıdır? ');

readln(bugun_tarih.gun);

writeln('Bu ay kaçıncı aydır? ');

readln(bugun_tarih.ay);

writeln('Bu yıl kaçıncı yıldır? ');

readln(bugun_tarih.yil);

Guncelle(bugun_tarih,gunler);

writeln('Yarının Tarihi : ', bugun_tarih.gun,'/',bugun_tarih.ay,

'/',bugun_tarih.yil);

End.


Aynı türden iki record değişkeninin bileşenleri arasında, teker teker aktarma işlemleri yapılabildiği gibi, toplu aktarma da yapılabilir. Örneğin, aşağıdaki programda, zaman := bugun deyimi, bugun adlı recordun bütün bileşenlerinin değerlerini, aynı türden olan zaman recordunun bileşenlerine doğrudan aktarmaktadır.

program record05;

uses wincrt;

type

tarih = record

gun,ay,yil : integer;

end;

var

bugun,zaman : tarih;

Begin

writeln('Bu gün ayın kaçıdır? ');

readln(bugun.gun);

writeln('Bu ay kaçıncı aydır? ');

readln(bugun.ay);

writeln('Bu yıl kaçıncı yıldır? ');

readln(bugun.yil);

zaman := bugun;

writeln('Zaman : ', zaman.gun,'/',zaman.ay,'/',zaman.yil);

End.


Record’lar bir procedure içinde parametre olarak kullanılabilir. Aşağıdaki örnek bunu göstermektedir.

program record07;

uses wincrt;

type

zaman = record

saniye,dakika, saat : integer;

end;

Var

gecerli, next : zaman;


PROCEDURE Zaman_Guncelle(var simdi : zaman);

var

yeni_zaman : zaman;



Begin

yeni_zaman := simdi;

writeln('Verilen zaman : ‘);

writeln(yeni_zaman.saat,':',yeni_zaman.dakika,':',yeni_zaman.saniye);

yeni_zaman.saniye := yeni_zaman.saniye + 1;

if yeni_zaman.saniye >= 60 then

begin

yeni_zaman.saniye := 0;

yeni_zaman.dakika := yeni_zaman.dakika + 1;

end;

if yeni_zaman.dakika >= 60 then

begin

yeni_zaman.dakika := 0;

yeni_zaman.saat := yeni_zaman.saat + 1;

end;

if yeni_zaman.saat >= 24 then

yeni_zaman.saat := 0;



writeln;

writeln('Yenizaman : ');

writeln(yeni_zaman.saat,':',yeni_zaman.dakika,':', yeni_zaman.saniye)

End;

BEGIN

writeln('Saat açtır? ');

readln(gecerli.saat);

writeln('dakika kaçtır? ');

readln(gecerli.dakika);

writeln('Saniye kaçtır? ');

readln(gecerli.saniye);

Zaman_Guncelle(gecerli);

End.



Record’lardan oluşan arrayler tanımlanabilir:

Type

Tarih : RECORD

Gun, ay, yil : integer

END;

Var

Dogum_Gunu : ARRAY[1..10] OF tarih;

bildirimi, recordlardan oluşan bir array tanımlar. Bunun bileşenlerine

Dogum_Gunu[1] .gun := 24;

Dogum_Gunu[1] .ay := 24;

Dogum_Gunu[1] .yil := 24;

biçimindeki deyimlerle erişilebilir.

Record bileşenleri array olabilir:

Type

Ay_adi = PACKED ARRAY[1..4] OF char;

Ay = RECORD

Gunler : integer;

Ad : ay_adi;

END;

Var

Bu_ay : ay;


Bildiriminden sonra,

Bu_ay.gun := 30;

Bu_ay.ad[1] := ‘N’;

Bu_ay.ad[2] := ‘I’ ;

Bu_ay.ad[3] := ‘S’ ;

Bu_ay.ad[4] := ‘A’ ;

Bu_ay.ad[5] := ‘N’ ;

atamaları geçerlidir.

İç-içe record tanımlanabilir:
Type

Tarih : RECORD

Gun, ay, yil : integer

END;
Zaman = RECORD

Dogum_gunu : tarih;

Kayit_Gunu : gun;



Uzun oldu ama elimden geldiğince basite indirgedim umarım anlaşılır olmuştur.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.