String degiskenler 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.
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 degisken genelde benzer bilgileri bulunduran degiskenlerdir. Örnek verirsek daha iyi anlasilir. Önceki programlarimizin birisinde hatirlarsaniz bir ögrencinin üç notunun ortalamasini bulmustuk. Peki 1 degil de ögrenci varsa ne olacak. Her birisi için üç not ve bir ortalama olmak üzere 4 degisken tanimlarsak toplam degisken tanimlamamiz lazim. Bu hem çok uzun zaman alir, hem de degisken isimlerini birbirine karistirmamiz olasidir. Bunun yerine ögrencinin 3'er notunu ve ortalamasini sadece 2 degisken kullanarak kolayca tutabiliriz. Bunun için degisken tanimlarimiz
Var notlar: Array[,] of byte; ortalama: Array[] of real;seklinde olmalidir. Simdilik bunlari nasil kullanacagimiz fazla deginmeden geçelim çünkü diziler diye ayri bir bölümde hepsini anlatacagim.
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(monash.pw); write('1. Sinavin sonucu:');readln(monash.pw1); write('2. Sinavin sonucu:');readln(monash.pw2); write('3. Sinavin sonucu:');readln(monash.pw3); monash.pw:=(monash.pw1+monash.pw2+monash.pw3)/3; write('Ortalamaniz: ');write(monash.pw); readln; end.Gördügünüz gibi kayit tipindeki bir degiskenin alt degiskenini nokta ile ayirarak kayit_monash.pw_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); 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.
Detaylı anlatım Video anlatım
İfade (expression) adı verilen yapı içinde, program değişken ve sabitlerden oluşan verilere işlemciler yoluyla bir işlem yapar. Artık, ifadeleri oluşturan veri kavramını incelemeye başlayabiliriz.
C'de aşağıda gösterilen 5 temel veri çeşidi vardır:
Anahtar kelime | Veri türü |
---|---|
char | Karakter |
int | Tamsayı |
float | Kayan noktalı sayı |
double | Çift duyarlıklı kayan noktalı sayı |
void | Değersiz |
Sadece char, int ve double veri türlerinin önüne aşağıda gösterilen değiştiricileri koyarak, veri tiplerinin işaret (+/-) durumunu, byte olarak boyutlarını ve sınırlarını değiştirebiliriz. C++'da kullanılan veri türü değiştiricileri ve uygulandıkları veri türleri aşağıda gösterilmektedir:
Değiştirici | Uygulandığı veri türü |
---|---|
signed | char, int |
unsigned | char, int |
long | int, double |
short | int |
Değişken tanımlamalarında signed değiştirici ifadesi kullanıldığında, tanımlanan değişkenin ikili sayı sistem değeri içinde en üst sırada yer alan bit'i işaret bit'i olarak kullanılır. Bu değer 0 olursa sayı pozitif, 1 olursa sayı negatif olur. Ancak, bu durumda bir bit sayının işaretini belirlemek için ayrıldığından tanımlanan değişkene atanacak değer otomatik olarak azalır.
Bilgisayarlarda, bir sayının ikili sayı sisteminde gösteriminde en solda yer alan bit, sayının negatif veya pozitif olduğunu göstermek üzere, işaret bit'i olarak kullanılır.
Pozitif bir sayıyı negatif bir sayıya çevirmek için, sayıdaki bütün bit değerlerinin tersi alınır ve elde edilen sayıya 1 değeri eklenir. Biri signed diğeri unsigned olan iki adet char ve iki adet short int veri türünden değişken tanımlayalım:
cd ve sid değişkenleri için el solda yer alan değer işaret bit'i olarak kullanıldığından, değişkenlerin alabileceği maksimum değer sırasıyla ve olacaktır. ucd ve usid değişkenleri en solda yer alan bit'i sayı değerleri için kullanabileceğinden, değişkenlerin alabileceği maksimum değer sırasıyla ve olacaktır.
C'de, unsigned, short veya long int değerlerin bildirimi yapılırken int ifadesinin kullanılması tamamen isteğe bağlıdır. Başka bir ifade ile, bu tip tanımlamalarda int ifadesini kullanmayabiliriz. Örneğin, aşağıdaki işlem satırlarının her ikisi de id adlı unsigned int bir değişken tanımlar:
C dilinde temel veri çeşitleri kullanılarak oluşturulabilen bütün veri çeşitleri ile byte uzunlukları ve sınırlarının genel olarak kullanılan değerleri ile printf() ve scanf() fonksiyonları ile kullanılan format tanımlayıcıları aşağıdaki tabloda gösterilmektedir:
C'nin diğer önemli bir özelliği de, char değişkenlerin ASCII karakter seti dışında değerler taşıyabilmesidir. Eğer, ile arasında kalan küçük int değerlerle işlem yapıyorsak, bu int değerleri atamak için int değişken yerine char bir değişken kullanabiliriz.
Veri türü | Bit genişliği | Alt sınır | Üst sınır | Format tanımlayıcısı | |
---|---|---|---|---|---|
printf() | scanf() | ||||
char | 8 | %c | %c | ||
unsigned char | 8 | 0 | %c | %c | |
signed char | 8 | %c | %c | ||
int | 16 veya 32 | veya | veya | %d | %d |
unsigned int | 16 veya 32 | 0 | veya | %u | %u |
short int | 16 | %hd | %hd | ||
unsigned short int | 16 | 0 | %hu | %hu | |
long int | 32 | %ld | %ld | ||
long long int (C99) | 64 | − | %lld | %lld | |
unsigned long int | 32 | 0 | %lu | %lu | |
unsigned long long int (C99) | 64 | 0 | %llu | %llu | |
float | 32 | e | e+ | %f | %f |
double | 64 | e | e+ | %f | %lf |
long double | 96 | e | e+ | %Lf | %Lf |
Aşağıdaki program çalıştırıldığı bilgisayardaki tanımlı veri türlerinin byte ve bit olarak genişlikleri ile limits.h ve float.h başlık dosyalarında tanımlı alt ve üst sınır değerlerini ekrana yazar.
Yukarıdaki program aşağıdaki verileri ekrana yazar.
char -> byte: 1 bit: 8 min: max: unsigned char -> byte: 1 bit: 8 min: 0 max: signed char -> byte: 1 bit: 8 min: max: int -> byte: 4 bit: 32 min: max: unsigned int -> byte: 4 bit: 32 min: 0 max: short int -> byte: 2 bit: 16 min: max: unsigned short int -> byte: 2 bit: 16 min: 0 max: long int -> byte: 4 bit: 32 min: max: long long int -> byte: 8 bit: 64 min: max: unsigned long int -> byte: 4 bit: 32 min: 0 max: unsigned long long int -> byte: 8 bit: 64 min: 0 max: float -> byte: 4 bit: 32 min: e+ max: e+ double -> byte: 8 bit: 64 min: e+ max: e+ long double -> byte: 12 bit: 96 min: E max: E+