String Degisken tip:
Programci diliyle bu tip degiskenler alfasayisal degerler alabilir. Halk dilinde ise bunlara yazi ya da sayisal olmayan veri diyebiliriz. Yani sizin yasiniz sayisal bir deger ise isminiz alfasayisal bir degerdir. Alfasayisal ifadeler iki tirnak içerisinde gösterilir. Yani isminizi 'Halil Ibrahim Kalkan' seklinde gösterirsiniz. Ancak sayi degil dekik diye içerisinde sayi geçmeyecek diye birsey yoktur. Yeni 'Beim yasim 17.' cümlesi ve '392' sayisi da tirnak içerisinde yazildigindan string tiplerdir ve matematiksel islemlerde kullanilamazlar. Ya da mesela telefon numaraniz bir sayi oldugu halde bunu tutmak için sayisal degisken kullanilmaz, onun yerine string degisken kullanilir. Çünkü telefon numaranizin üstünde çikartma, kök alma gibi matematiksel islem yapmayacaksiniz. Ama tabii ki bu size kalmis. Isterseniz telefon numarasi için longint degisken tanimlayabilirsiniz.
String degiskenlerin içerisinde maksimum 255 karekterlik bilgi bulunabilir. Bu karekter her türlü harf, sayi, isaret, bosluk... olabilir. Mesela 'a=2x5+3/62' diye bir string ifade yazilabilir. Anlayacaginiz tirnak içerisinde ne varsa sabittir. Örnek bir program yazalim:
Program String_tip_ornegi;
Uses crt;
Var
isim: string;
yas: byte;
begin clrscr;
write('Adinizi yaziniz: ');readln(isim);
write('Yasinizi yaziniz: ');readln(yas);
clrscr;
writeln('Merhaba ',isim);
writeln('Sizin yasiniz ',yas);
readln;
end.
Bu programi pascal'da yazip çalistirirsaniz sizin isminizi ve yasinizi alip ekrana geri yazar. Simdi dikkat ettiyseniz 'Adinizi yaziniz: ' ifadesi de aslinda string ifadedir. Bu ifade degisken degil, sabit oldugundan iki apostrof isareti arasina yazilir. Peki bu ifadeleri de bir degiskenin degeri yapalim ve öyle yazdiralim:
Program String_tip_ornegi;
Uses crt;
Var
isim, ad_iste, yas_iste, yas_yaz, ad_yaz: string;
yas: byte;
begin clrscr;
ad_iste:='Adinizi yaziniz: ';
yas_iste:='Yassinizi yaziniz: ';
write(ad_iste);readln(isim);
write(yas_iste);readln(yas);
clrscr;
yas_yaz:='Sizin yasiniz ';
ad_yaz:='Merhaba ';
writeln(ad_yaz,isim);
writeln(yas_yaz,yas);
readln;
end.
Bu programi yazip çalistirinca bir önceki program ile tamamen ayni isi yaptigini göreceksiniz. Ama burada gereksiz yere fazla degiken kullanip fazla islem yaptik. Ama amacimiz ögrenmek. Gördügünüz gibi string tipdeki bir degiskene veri aktarimi sayisal tipli bir degiskene veri aktarimi ile ayni ama burada verileri iki apostrof isareti arasina yaziyoruz ( '.....' gibi ). Bu arada eger programlari kopyala/yapistir yolu ile pascal'a aktariyorsaniz (ki bunu yapmasaniz daha iyi ögrenirsiniz) Türkçe karakterlerde sorunlar vuku bulmus olabilir(!). Bu windows ile ms-dos'un ascii karakterlerinin farkli olmasindan kaynaklaniyor ve telafisi zor. En iyisi elle yazmak. Bu arada ilerde ascii'nin de ne olduguna deginecegimiz için "bu ascii de ne demek" diye düsünmenize gerek yok.
Bir string ifade aksi belirtilmedikçe maksimum 255 karakter uzunlugunda olur ve hafizada 256 byte alan isgal eder. Aksi belirtilmedikçe diyince hemen aksini belirtip daha uzun olabileceginiz sanmayin. Tersine daha az olabilir. Peki nasil aksini belirtecegiz.
Var
isim: string[40];
seklinde. Artik isim adli string degiskenimiz en fazla 40 karakter uzunlugunda olabilir ve 41 byte yer kaplar (Neden mi 41 byte? Unutmazsak sonra anlatiriz onu da!). Bir insanin ismi de 40 harften fazla olamayacagindan (ya da olsa bile kisa yazsin sayin kullanicilarimiz!) gereksiz yere 256 bytelik yer isgal etmeyip 215 byte kar edelim. Artik bu degskene 40 harften daha uzun bilgi girilmek istenirse sadece ilk 40 karakterini alir ve gerisini yok sayar.
String tipin çok özelligi var. Bunlari ilerdeki konularda görecegiz. Ancak simdi String tiplerde çok isinize yarayacak (ilk etapta gereksiz gözükebilir ama döngüleri ve karar deyimlerini gördükten sonra daha iyi anlayacaksiniz) bir özellige gözatalim. Bir string degiskenin x. karakterini elde etmek için string_ifade[x] seklinde kullanilir. Yani isim adli bir string degiskenimizi isim='www.kalkan.cjb.net' olarak tanimlayiip sonra da write(isim[5]); komutunu verirsek ekrana sadece k harfi yazilir. Bununla ilgili çok örnek yapacagimizdan simdilik üzerinde durmayalim ve örnek yapma isini size birakalim
Char Degisken Tipi:
String degiskenler 255 karakterlik veri alabiliyordu. Char ise tahmin edeceginiz gibi daha fazla karakter almiyor! Char tipinde bir degisken yanlizca bir adet karakter alabilir ve bir byte yer kaplar hafizada. Yine string tipindeki gibi deger atamasinda iki apostrof isareti arasina en fazla 1 karakter olabilecek sekilde yazilir. Örnek bir program yapalim daha iyi anlariz.
Program Char_Tipinde_alistirma;
Uses crt;
var
c: char;
isim: string;
a: byte;
begin
clrscr;
write('Yine adinizi girin bakalim....: ');readln(isim);
write('Simdi en fazla ',length(isim),' olacak sekilde sifindan büyük bir sayi giriniz: '); readln(a);
c:=isim[a];
writeln('Sizin isminizin ',a,'. harfi "',c,'"');readln;
end.
Bu örnek simdiye kadar yaptiklarimizin en karisigi gibi gözükebilir ama biraz dikkat ederseniz anlayacaginiz kesin. clrscr; komutuna kadar olan yeri biliyorsunuz. Ondan sonra isim adli degiskene ekrandan (daha sonra ayrintili olarak anlatacagimiz sekilde) bilgi girilmesi isteniyor. Ondan sonra yazilan write ifadesinde bilmedigimiz birsey var. Length fonksyonu bir string tipli ifadenin kaç karakter uzunlugunda oldugunu verir. Bunu da daha sonra anlatacagiz. Ondan sonra c:=isim[a]; ifadesinde c adli char degiskene isim degikeninin a. karakterini atiyoruz. Mesela isminiz "Osman" ise ve a degerine de 3 girdiyseniz c:= ifadesinin karsisindaki deger 'm' olur. Yani c degiskeninin degerine 'm' harfini (karakterini) atamis oluruz. Programi birkaç defa çalistirarak daha iyi anlayabilirsiniz.
Tabii bu sekilde bizim pek isimize yaramayabilir ama özellikle bir char tipindeki degiskeni readkey komutuyla kullanilarak faydalanabiliriz. Bunlara ilerde deginecegiz.
Bunlarin disinda su anda hemen kullanamayacak olsak da diger tiplere de kisaca deginelim.
Boolean Tipli degiskenler:
Degeri ya TRUE (dogru) ya da FALSE (yanlis) olabilen degiskenlerdir. Mantiksal karsilastirmalarda kullanilabilir. Hafizada 1 byte alan kaplar.
Bundan sonraki tipdeki olan dizi ve record tipleri için sonraki derslerde özel bir bölüm açip anlatacagi çünkü kullanim alanlari çok genis.
Dizi (Array) tipli degiskenler:
Dizi degisken genelde benzer bilgileri bulunduran degiskenlerdir. Örnek verirsek daha iyi anlasilir. Önceki programlarimizin birisinde hatirlarsaniz bir ögrencinin üç notunun ortalamasini bulmustuk. Peki 1 degil de 100 ögrenci varsa ne olacak. Her birisi için üç not ve bir ortalama olmak üzere 4 degisken tanimlarsak toplam 400 degisken tanimlamamiz lazim. Bu hem çok uzun zaman alir, hem de degisken isimlerini birbirine karistirmamiz olasidir. Bunun yerine 100 ögrencinin 3'er notunu ve ortalamasini sadece 2 degisken kullanarak kolayca tutabiliriz. Bunun için degisken tanimlarimiz
Var
notlar: Array[1..100,1..3] of byte;
ortalama: Array[1..100] of real;
seklinde olmalidir. Simdilik bunlari nasil kullanacagimiz fazla deginmeden geçelim çünkü diziler diye ayri bir bölümde hepsini anlatacagim.
Kayit (Record) tipli degiskenler:
Simdiye kadar bir ögrencinin adi, notlari ve ortalamasi için ayri degiskenler kullandik. Peki bunlarin hepsini bir ana degiskenin alt degiskenleri olarak tutsak daha kolay ve anlasilir olmaz mi? Özellikle bu tip degiskenler dosyalama konusunda çok isimize yarayacak. Genel olarak tanimlamasi su sekildedir:
Type
kayit_tipi=Record
degiskenler...
end;
Var
kayit_adi = kayit_tipi;
Gördügünüz gibi bu tip bir degiskeni tanimlamak için type etiketini kullaniyoruz ve yeni bir tip olusturuyoruz ilk önce. Sonra bir degiskeni tipi bu olacak sekilde tanimliyoruz. Hemen örnek bir program yazalim. Bunu kendi ellerinizle yazmalisiniz (ben de hep öyle yapiyorum):
Program Filiz;
uses crt;
type
ogrenci_tipi=Record
isim: string[40];
not1: byte;
not2: byte;
not3: byte;
orta: real;
end;
Var
ogrenci: ogrenci_tipi;
Begin clrscr;
write('Isminiz:');readln(ogrenci.isim);
write('1. Sinavin sonucu:');readln(ogrenci.not1);
write('2. Sinavin sonucu:');readln(ogrenci.not2);
write('3. Sinavin sonucu:');readln(ogrenci.not3);
ogrenci.orta:=(ogrenci.not1+ogrenci.not2+ogrenci.n ot3)/3;
write('Ortalamaniz: ');write(ogrenci.orta);
readln;
end.
Gördügünüz gibi kayit tipindeki bir degiskenin alt degiskenini nokta ile ayirarak kayit_degiskeni.alt_degisken seklinde yaziyoruz. Isterseniz with deyimini kullanarak alt degisken isimlerini direk de kullanabilirsiniz:
yastik;
uses crt;
type
ogrenci_tipi=Record
isim: string[40];
not1: byte;
not2: byte;
not3: byte;
orta: real;
end;
Var
ogrenci: ogrenci_tipi;
Begin clrscr;
with ogrenci do begin
write('Isminiz:');readln(isim);
write('1. Sinavin sonucu:');readln(not1);
write('2. Sinavin sonucu:');readln(not2);
write('3. Sinavin sonucu:');readln(not3);
orta:=(not1+not2+not3)/3;
write('Ortalamaniz: ');write(orta:5:2);
end;
readln;
end.
Bu iki program de birbirinin aynisi islemleri yapar. With Türkçe'de "ile, beraber" demektir. Simdilik bu record tipinin üzerinde fazla durmayalim. Dosyalar konusunda ayrintili olarak görecegiz zaten.