Bilgisayar Ve Programlamaya Giriş Dersi 5. Ünite Özet
C'de Veri Tipleri Ve Tanımlamalar
- Özet
- Sorularla Öğrenelim
Giriş
Programlama, bilgisayar programlarının yazılması, test edilmesi ve bakımının yapılması sürecine verilen isimdir. Programlama, Java, C, assembly veya makine dili gibi bir programlama dilinde yapılır. Yazılan kaynak kodu, genellikle bir derleyici yardımıyla belirli bir donanımda çalıştırılabilir hale getirilir. Derleyicilerde daha önceden tanımlanmış veri tipleri kullanılmak zorundadır. Bilgisayara girilen işlenmemiş (ham) bilgilere “veri” denir. Bilgisayarın alabildiği, işleyebildiği, sonuç üretebildiği ve saklayabildiği her şey veridir.
Fortran, Pascal, C/C++, Java gibi bazı programlama dilleri veri tiplerini önceden ayırır, Python, Ruby gibi bazı programlama dilleri ise ayırmaz. Teknik olarak veri tipini önceden belirleyen programlama dilleri, belleğe yerleşecek verileri, orada kaplayacakları alanlara göre gruplara ayırır. Programlama dilleri, bu veri gruplarını pratikteki kullanımlarına göre adlandırır. Örneğin; karakterler, tam sayılar, kesirli sayılar vb. gibi yalın tipler yanında dizim (array) gibi birleşik veri yapıları bu ayrımı yapan her dilde vardır. Veri tiplerini önceden ayırmayan diller ise önce veriyi belleğe yerleştirmekte ve sonra verinin tipini belirlemektedir. Bu iki yöntemin avantajlı ve dezavantajlı kabul edilebilecek yanları vardır.
C programlama dilinde aşağıdaki üç temel veri tipi vardır:
- Sayı
- Karakter
- Dizgi (String)
Bu veri tipleri çeşitli alt gruplara ayrılırlar (s:80, Tablo 5.1). Alt grupların oluşturulmasında ortak bir kuraldan söz edilemez. Farklı derleyiciler, farklı sınıflandırmalar ve farklı adlar kullanmıştır. Onları, bilinen adlarına ve bellekte kapladıkları büyüklüklere göre sınıflandırmak yeterli olacaktır. Ancak, her programlama dilinde karakterler (character), tam sayılar (integer), kesirli sayılar (float) temel veri tipleridir. Dizim (array), dizgi (string), fonksiyon (function), dosya (file), işaretçi (pointer) vb. veri tipleri birleşik (yapısal) tiplerdir. Bazı programlama dilleri dizgi (string) veriyi de temel veri tipi olarak ele alır. C programlama dilinde ise dizgi (string) veri tipi karakter dizimi olarak tanımlanır.
Sayılar, tam sayılar ve kesirli sayılar diye ikiye ayrılır. Bunlar da kendi içlerinde de alt gruplara ayrılmaktadır. Bu sınıflandırma, sayıya bellekte ayrılacak yerin büyüklüğüne göre değişir. C programlama dilinde tam sayılar için “int” anahtar sözcüğü kullanılır. Bu anahtar sözcüğün iki alt grubu, derleyiciye bağlı olarak, “long” ve “short” veya “long int” ve “short int” olarak adlandırılır (s:81, Tablo 5.2). Aksi ifade edilmedikçe, bütün tam sayı tipleri işaretli (signed) sayılır; yani hem negatif hem de pozitif değerler alırlar. Kesirli sayılar ise “float”, “double” ve “long double” olmak üzere üç gruba ayrılmaktadır (s:82, Tablo 5.3). Ondalık basamak kısmının hassasiyetine göre kullanım yerleri değişmektedir.
Klavyede her tuşa dokunulduğunda bir karakter yazılmış olur. Karakterler, C programlama dilinde “char” veri türü ile tanımlanır. Bir karakter sabiti tek tırnak içine yazılan bir karakterdir. Boşluk veya her bir rakam da bir karakter olabilir. Boşluk karakteri '', rakamlar ise '0', '1', … , '9' karakter sabitleri ile ifade edilebilir. Rakam karakterleri, normal tam sayı rakamlarından tamamen farklıdır ve bilgisayar tarafından farklı yorumlanır. Bütün bastırılabilir karakterlere ek olarak bastırılamaz karakterler de vardır. Bu özel karakterlerin sabitleri bir escape (kaçış) karakteri kullanılarak verilir. Kullanılan escape karakteri ‘\’ karakteridir. C programlama dilinde bütün karakterlerin 0 ile 255 değeri arasında değişen bir kodu vardır ve toplamda 256 değişik karakter olabilmektedir. Kullanılan bu kodlama sistemi, ASCII kodlama sistemidir. Bu kodlama sisteminde kullanılan ilk 128 karakter, İngilizce harfler, rakamlar ve çok kullanılan diğer bazı karakterlerden oluşur. Bu kodlama sistemi ile aynı zamanda bütün karakterler bir sıraya konmuş olurlar.
Dizgiler (strings) karakterlerden oluşan dizilerdir. Karakter dizilerinin her bir elemanı da bir karakterdir. Diğer dizilerde olduğu gibi, bir dizginin her bir elemanına veya parçalarına erişebilir veya bir karakterin bir dizgi içindeki yerini bulabiliriz. C programlama dilinde dizgiler bir dizi gibi tanımlanmaktadır. Tanımlanan dizgiler, indisleri 0 ile başlamak üzere tanımlanan dizgi boyutu kadar herhangi bir karakter dizisini saklayabilirler. Her dizginin sonunu belirtmek için dizginin en son karakterinden sonra, bellekte bir elemanlık yer kaplayan, ‘\0’ (bos karakter, null character) konur. Dizgilerle ilgili bütün işlevler bos karakterden sonraki elemanlarda olan değerleri dikkate almazlar Dizgilerin kullanım alanları çok geniş olduğu için C programlama dilinde diğer veri türündeki dizilerden farklı olarak dizgilerin ilk değerleri tanımlama sırasında kısaca iki çift tırnak içinde belirtilebilir (''abc'' gibi).
C Programlama Dilinde Değişken Adlandırma ve Tanımlamalar
Değişkenler, bellekte bilginin saklandığı gözlere verilen sembolik adlardır. Bir C programında, bir değişken tanımlandığında bu değişken için bellekte bir yer ayrılır. Her değişkenin tuttuğu değerin nasıl bir veri olduğunu gösteren bir veri tipi vardır.
Programcı nasıl bir program yazıyor olursa olsun, programın tasarlanması aşamasında en çok dikkat etmesi gereken faktörlerden biri değişken tanımlamalarıdır. Değişkenin ti-pinin ve isminin yanlış seçilmesi o an için bir problem teşkil etmeyebilir ancak sonrasında çok büyük sorunlara da neden olabilmektedir. Bu nedenle, program tasarımı aşamasında amaca uygun veri tiplerinin tanımlanması ve yazılan programın takip edilebilmesi ve anlaşılabilmesi için anlamlı değişken isimlendirmeleri yapılması büyük önem taşımaktadır.
C programlama dilinde, değişkenler ve sabitler programın başında bulunmalıdır. Örneğin:
#include
main() {
int x;
int a,b,c;
float OrtalamaNot;
}
Bazı uygulamalarda değişkenin bir başlangıç değerinin olması istenebilir. Eğer yukarıdaki örnekte aynı değişkenlere başlangıç değeri atayarak programda kullanmak istiyorsak değişkenlerin başlangıç değeri atanmış tanımlamaları aşağıdaki gibi yapılabilir:
#include
main() {
int x = 5;
int a = 2, b = 5, c = 1;
float OrtalamaNot = 50.5;
}
C programlama dilinde kullanılan değişken isimlendirme kuralları aşağıdaki gibi sıralanmıştır:
- C programlama dili komutları değişken adı olarak verilemez (Örneğin; if, for, case gibi).
- Değişken ismi birden çok kelimeden oluşacaksa aralarına boşluk verilmez. Örneğin, “maksimum sayi” adı ile bir değişken tanımlanamaz, bu değişken ancak “maksimum_sayi” ya da “MaksimumSayi” şeklinde tanımlanabilir.
- Değişken adları en fazla 32 karakterden oluşabilir. 32 karakterden uzun değişken adlarında ilk 32 karakter değerlendirilir. Geriye kalan karakterler işleme tabi tutulmaz.
- Değişken adları İngiliz alfabesinde bulunan karakterler (A-Z) veya (a-z) ya da rakamlar (0-9) ile yazılmalıdır. Türkçe karakterler, özel karakterler veya boşluk karakteri kullanılamaz.
- Değişken adları herhangi bir rakam ile başlayamaz. İlk karakter bir harf olmalıdır. Sonrakiler ise rakamlardan oluşabilir.
- Aşağıda verilen kelimeler ANSI (American National Standards Institute) C’nin anahtar kelimeleridir (key words) ve değişken ismi olarak kullanılamaz:
Temel giriş/çıkış fonksiyonları, bütün programlama dillerinde mevcuttur. Bu tür fonksiyonlar, kullanıcıya ekrana veya yazıcıya bilgi yazdırmasına ve bilgisayara klavyeden veri girişi yapmasına izin verir. Temel giriş/çıkış fonksiyonları kullanılırken “stdio.h” baslık dosyası (header file) programın basına eklenmelidir.
Standart C programlama dili kütüphanesinde bulunan printf() fonksiyonu, değişkenlerin tuttuğu değerleri, onların adreslerini veya bir mesajı ekrana belli bir düzenle (format) yazdırmak için kullanılan fonksiyondur. printf() fonksiyonunun genel yazım biçimi aşağıdaki şekildedir:
int printf ( const char *format,...);
printf() fonksiyonu içerisine üç farklı parametre alabilir:
- Düz metin. Örneğin:
printf(''Ben okula gitmedim'');
- Kontrol karakterleri (escape sequence): Değişkenlerin ve sabitlerin nasıl yazılacağını belirtmek veya imlecin alt satıra geçirilmesi gibi bazı işlemlerin gerçekleştirilmesi için kullanılır. Örneğin:
printf(''\tBen okula gitmedim\n'');
- Tip belirleyici (conversion specifier): % işareti ile başlar ve bir veya iki karakterden oluşur. Ekrana yazdırılmak istenen değişkenin veri tipi, % işaretinden sonra belirtilir. Örneğin:
printf(''x in değeri %d dir'', x);
printf fonksiyonunun geri dönüş değeri “int” tipindedir. Bu geri dönüş değeri *format ile tanımlanmış karakter topluluğunun kaç bayt olduğunu göstermektedir.
Birçok programda ekrana verilerin bastırılmasının yanı sıra klavyeden veri okunması gerekebilir. scanf() fonksiyonu klavyeden veri okumak için kullanılan fonksiyondur. printf() gibi scanf() fonksiyonu da benzer kontrol karakterlerini ve tip belirleyicilerini kullanır. Örneğin klavyeden bar x tam sayısı okumak için,
scanf(''%d'',&x);
satırını yazmak yeterli olacaktır. Burada & işareti adres operatörü olarak adlandırılır.
“enum” anahtar sözcüğü İngilizcedeki enumerate sözcüğünün kısaltmasıdır ve bir grup sabiti sıralayıp sıra numarası verme eylemini yapar. Özel sıra numarası verilmemişse ilk sabite 0 numarası verilir. Sonrakiler, yazılış sırasına göre 1’er artarak numara alır.
Mantıksal değerler, ikili mantık sisteminde yanlış (false) ve doğru (true) değerleridir. Bu değerlere boolean değerler denilir. C#, Java, C++ gibi üst düzey diller, hatta C99 ile belirlenen standartlarda mantıksal işlemler için bool (Boolean) tipinde bir veri tipi tanımlanmıştır. Bu veri tipi, sadece true ve false değerlerini alabilir. Ancak C dilinde özel bir mantıksal veri tipi yoktur. Bunun yerine, herhangi tam sayı olabilen değer;
- Sıfır ise FALSE (Yanlış),
- Sıfırdan farklı ise TRUE (Doğru), kabul edilir.
C Programlama Dilinde Depolama Türleri
C programlama dilinde değişkenler, yaşam sürelerine göre iki sınıfa ayrılır:
- Geçici Depolama (Volatile Storage):
“auto” (automatic) ve register depo sınıflarına konulan değişkenler, ait oldukları program blokunun (program kod parçasının) işi bitince bellekten silinirler. “auto” depo sınıfına konulacak değişkenlerin tanımlanması, örneğin:
auto float x, y;
şeklinde yapılır. Bir program blokunun içinde tanımlaması yapılan değişkenler “auto” depo sınıfındandır ve ayrıca “auto” olarak tanımlamaya gerek yoktur.
Register’ler (yazmaçlar), CPU (Central Processing Unit – Merkezi İşlem Birimi) içinde veri tutmaya yarayan küçük depolardır. Makine diline dönüşen kodlar çalışırken çok kullanılan veriler bir yazmaca alınır; böylece işlemlerin daha hızlı yapılması sağlanır. Yazmaca konulması istenen değişkenlerin tanımlanması, örneğin:
register int m, n;
şeklinde yapılır. Ancak derleyici, boş register olmaması durumunda bu isteğe uyamaz. Öte yandan gelişkin derleyiciler çok kullanılan verileri kendiliğinden yazmaca koyabilme yeteneğine sahiptir. Bu tür derleyicilerde, programcının yazmaca konulacak değişkeni tanımlamasına gerek kalmaz.
Geçici depolama, belleğin ekonomik kullanımı açısından önemlidir. Büyük programlarda çok sayıda değişken ve program bloku bulunur. Bazı değişkenler çok kısa süre için kullanılır, bazı değişkenler ise program boyunca kullanılır. İşi biten değişkenlerin bellekten silinmeleri, belleğin o alanlarının başka işler için kullanılmasına olanak sağlar.
- Kalıcı Depolama (Non-Volatile Storage):
“extern” ve “static” depo sınıflarına konulan değişkenler, program süresince silinmeden bellekte kalırlar. Global değişkenler ön tanımlı (default) olarak “extern” değişken sayılırlar ve program boyunca bellekte saklanırlar. O nedenle, global değişkenleri “extern” diye ayrıca tanımlamaya gerek olmamaktadır. Ancak bazı durumlarda bir blok içindeki değişkenin program boyunca bellekte kalması istenebilir. O zaman bu tür bir değişken “static” olarak tanımlanmak zorundadır. “extern” ve “static” depo sınıfına konulacak degiskenlerin tanımlanması, örneğin:
extern int tc_kimlik_no;
static char ad_soyad[20];
şeklinde yapılır.