1. C programlarının Yapısı
Bu bölümde bir C programının yapısını inceleyeceğiz. Şekil 2.1’de verilen C programı derleyicinin editöründe yazılıp, ornek.cpp kütüğünün içinde saklandıktan sonra, menüden Compile seçilerek derlenir ve bu derleme sonucunda ornek.obj kütüğü yaratılır. Bu kütükte saklanan makina dilindeki program, menüden Run seçilerek çalıştırılır.
1 /* Yazar: CPG Öğretim Üyesi
2 * Tarih: Ekim 2009
3 *
4 * Basit bir C programi
5 *
6 * Bu program adinizi okur ve adinizi Merhaba kelimesi ile birlikte basar.
7 */
8
9 #include <stdio.h>
10 #define UZUNLUK 10
11
12 int
13 main(void)
14 {
15 char yourName[UZUNLUK];
16
17 /* Adi oku */
18 printf("Adinizi girin ve enter tusuna basin> ");
19 scanf("%s", yourName);
20 /* Mesaji yaz */
21 printf("Merhaba %s! ", yourName);
22
23 return(0);
24 } |
Şekil 2.1: Basit Bir C Programı
Örnekte satır numaraları açıklama yapmak için kullanılmıştır.Bu programı kendi bilgisyarınıza yüklemek için buraya tıklayınız.(Farenizin sag tusuna basip,Save Taget As secenigi tiklayin)
Programın açıklamalarını görmek için tıklayın
Örnek programda ’/*’ ile başlayıp ’*/’ biten kısımlardaki herşey açıklamalardır. Programlama açısından hiçbir önemi olmayan bu satırlar yalnızca programı açıklamak için kullandığımız bilgileri kapsar. C derleyicisi bu bölümleri açıklama olarak görür ve dikkate almaz.
Programımızın içinde, kodun okunmasını kolaylaştırmak için, istediğimiz kadar boş satır kullanabiliriz. C derleyicisi bu boş satırları gözönüne almaz.
1.1. Önişlemci bildirimleri
Şimdi bu örnek programı kullanarak C programlarının genel yapısını inceleyelim.Bu C programı iki kısımdan oluşur: Önişlemci bildirimleri ve main işlevi.
Önişlemci bildirimleri
Önişlemci bildirimleri # ile başlayan komutlardır. Bunlar C’nin önişlemcisi tarafından kullanılır. C’nin önişlemcisi program derlenmeden önce programın metininde bu komutları kullanarak bazı değişiklikler yapar ve program ondan sonra derlenir. #include ve #defineC’de en çok kullanılan önşlemci bildirimleridir.
C dili program yazmada yararlı olabilecek birçok hazır işlevi programcının kullanımına sunar. Bu hazır işlevler C’nin değişik kütüphanelerinde saklanır. Her kütüphanede adı .h uzantısıyla biten bir üstbilgi kütüğü vardır. #include bildirimi programın C’nin kütüphanelerinden birine erişimini sağlar. Bu bildirim ile C önişlemcisi bir kütüphanenin üstbilgi kütüğündeki bazı tanımları programa aktarır ve program bu değişikliklerden sonra derlenir. Örneğin şekildeki programda kullanılan
#include <stdio.h>
önişlemciye bu programda kullanılan bazı işlev isimlerinin (printf ve scanf gibi) stdio.h adlı üstbilgi kütüğünde olduğunu bildirir.
Diğer önişlemci bildirimi
#define UZUNLUK 10
C önişlemcisinin, program içinde UZUNLUK sözcüğünün geçtiği her yerde bu sözcüğü 10 rakamı ile değiştirmesini sağlar. Örnek programımızda UZUNLUK yalnızca
char yourName[UZUNLUK];
satırında kullanılmış. Bu durumda C önişlemcisi bu satırı
char yourName[10]
olarak değiştirecektir. #define bildiriminde programımızda kullanacağımız, değeri program çalıştığı sürece değişmeyecek olan sabit değerleri tanımlayabiliriz. Bu programda UZUNLUK 10 olarak belirtildiği için programımız sadece 10 harfe kadar olan isimleri okuyabilir.
1.2. main işlevi
main işlevi Her C programının bir main işlevi içermesi gerekir. Bu işlevin başlangıcı
int main(void)
ya da
int main()
sözcükleriyle belirtilir ve { ile } arasında kalan kısım işlevin gövdesidir. Bu programı çalıştırdığımızda ilk olarak bu main işlevine girilecek ve programın komutları o noktadan itibaren sırayla çalışmaya başlayacaktır.
C’de her işlevin gövdesi iki kısımdan oluşur: tanımlamalar kısmı ve çalıştırılabilir ifadeler.Tanımlamalar kısmında işlevin bellekte kullanacağı alanların isimleri tanımlanır ( yourName gibi) ve bu bilgiler derleyici tarafından kullanılır. Çalıştırılabilir ifadeler algoritma basamaklarının C’deki yazılımlarıdır ve makina koduna bunlar çevirilip çalıştırılırlar.
main işlevi noktalama işaretleri ve bazı özel semboller (*,= gibi) içerir. Örneğin noktalı virgül (;) işareti her çalıştırılabilir ifadenin sonunu gösterir. { ve } işaretleri işlevin başlangıç ve bitiş yerlerini belirtir. Genelde her işlevde bir return ifadesi olmak zorundadır.
1.3. Özel sözcükler
Programımızda açıklamaların dışındaki satırlarda görülen bütün sözcükler ya özel sözcüklerdir ya da tanımlayıcılardır. Özel sözcüklerin hepsi küçük harflerle yazılırlar ve C’de hepsinin bir anlamı vardır. Bu sözcükler bilinen anlamlarından farklı bir amaçla kullanılamazlar. Değişken isimleriniz için bu özel sözcükleri kulllanamazsınız. C’deki özel sözcükler şunlardır:
auto |
double |
int |
long |
break |
else |
long |
switch |
case |
enum |
register |
typedef |
char |
extern |
return |
union |
const |
float |
short |
unsigned |
continue |
for |
signed |
void |
default |
goto |
sizeof |
volatile |
do |
if |
static |
while |
Programda geçen özel sözcükler ve anlamları aşağıdaki tabloda özetlenmiştir.
Özel Sözcük |
Programdaki Anlamı |
int |
integer(tam sayı) |
void |
main işlevi işletim sisteminden hiç veri almıyor |
char |
karakter veri türü |
return |
kontrol işlevden işletim sistemine geçiyor |
1.4. Tanımlayıcılar
İşlev isimleri, bellek bölgelerinin isimleri (değişken ya da sabit isimleri) tanımlayıcılar olarak adlandırılır.İki türlü tanımlayıcı vardır: standart tanımlayıcılar ve kullanıcının tanımladığı tanımlayıcılar. Standart tanımlayıcıların da özel sözcükler gibi özel anlamları vardır. Örneğin programda printf ve scanf C’nin stdio (standard input/output) kütüphanesinde tanımlanmış iki işlevin isimleridir. Bunların özel sözcüklerden farkı anlamlarının programcı tarafından değiştirilebilir olmasıdır.
Programlarımızda kullandığımız ya da hesapladığımız verileri tutan bellek bölgelerine kendimiz isimler veririz. Bunlara kullanıcının tanımladığı tanımlayıcılar denir. Örnek programda yourName ve UZUNLUK bu tip tanımlayıcılardır. Tanımlayıcılara istediğimiz isimleri verebiliriz. Yalnız şu kurallara dikkat etmemiz gerekir:
- Tanımlayıcı isimleri sadece harfler, rakamlar ve _ işaretini içerebilir.
- Tanımlayıcı ismi rakamla başlayamaz.
- Özel sözcükler tanımlayıcı ismi olarak kullanılamaz.
Örnek bazı tanımlayıcılar: x, y, number1, number2, p5, newValue, birKelime
Bazı geçersiz tanımlayıcılar: 1a (rakamla başlıyor), b+1 (’+’ karakteri tanımlayıcıda kullanılamaz)
C büyük harf küçük harf ayrımına duyarlı olduğundan, aynı harfin büyük harfi küçük harfinden farklıdır. Bu nedenle örneğin test1, Test1 ve TEST1 üç farklı tanımlayıcı olarak algılanır.
2. Veri Türleri
Tanımlayacağımız her değişken bellekte bir bölgeye denk gelecektir. Bir değişkenin türü o değişkene denk düşen bellek bölgesinin büyüklüğünü ve o bölgenin içindeki bilginin nasıl yorumlanacağını gösterir. Bir değişkene yeni bir değer verdiğimizde, verdiğimiz bu değer o değişkene denk düşen bellek bölgesine eski değeri yok ederek saklanır.
Örneğin,
int x; tanımlaması, x değişkeni için 32 bitlik bir bellek bölgesinin kullanılacağını ve bu bölgenin içindeki bitlerin bir tamsayı (integer) olarak yorumlanacağını gösterir.
Aşağıdaki atama ifadesi ile x değişkenine 10 değerini verebiliriz: x = 10;
Bu atama ifadesinden sonra, x değişkenine denk gelen bellek bölgesi 10 sayısını 32 bitlik bölgeyi kullanarak bir tamsayı olarak tutacaktır. Bu bellek bölgesi sonradan yeni bir atama ifadesi ile değiştirilebilir. Örneğin,
x = 20; atama ifadesi x değişkenin içine 20 sayısını koyacaktır ve eski değer olan 10 buradan silinecektir.
2.1. İkilik Düzendeki (Binary) Sayılar
Bilgisayardaki her değer, ikilik düzendeki sayılar ile gösterilir. İkilik düzendeki tek bir rakam (0 ya da 1) bir bit olarak adlandırılır. Her bir bit iki değişik durumu gösterir. Bit dizgileri daha büyük sayıları göstermekte kullanılır. Her bit dizgisinin kaç değişik değeri gösterebileceği o dizgideki bit sayısına bağlıdır. Eğer bir bit dizgisinde N bit varsa, o dizgi 2N değişik değeri gösterebilir. Örneğin bit sayısına göre kaç değişik değer gösterilebileceği 2. sayfadaki tabloda verilmiştir:
1 bit 21=2 değişik değer : 0 1
2 bit 22=4 değişik değer : 00 01 10 11
3 bit 23=8 değişik değer : 000 001 010 011 100 101 110 111
:
32 bit 232=4,294,967,296 değişik değer
64 bit 264=18,446,744,073,709, 551,616 değişik değer |
Gördüğünüz gibi dizgiye her bit eklediğimizde, o dizginin gösterebileceği değişik değerin sayısı iki katına çıkar. Tanımlayacağımız her değişken bellekte bir bit dizgisi olarak tutulacaktır ve bu bit dizgisinin nasıl yorumlanacağı ise o değişkenin türüne bağlı olacaktır. Örneğin veri türü int olan bir değişken 32 bitlik bir bit dizgisi olarak tutulacaktır ve bu bit dizgisi artı ya da eksi bir tamsayı olarak yorumlanacaktır.
C’deki her veri türü bir değerler kümesinden ve onların üzerinde yapılabilecek işlemlerden oluşur. Her veri türünün int, double, char gibi bir adı olacaktır. Bellekte tutulan her değer belirli bir veri türü kullanılarak yorumlanacaktır. C�deki her değişkenin bir türü olacaktır ve bir değişkenin türünün ne olacağını tanımlama (declaration) ifadesi ile belirtiriz. Örneğin,
int x, y;
int z;
double d; tanımlama ifadeleri x, y, z değişkenlerinin türlerinin tamsayıların gösteriminde kullanılan bir veri türü olan int olacağını ve d değişkeninin türünün ise reel sayıların gösteriminde kullanılan bir veri türü olan double olacağını belirtir. C’de kullanılan her literalin (sabit sayı) de bir veri türü vardır. Örneğin, 5 bir tamsayıyı (yani int) ve 5.0 bir reel sayıyı (yani double) gösteren birer literaldir. Bellekte 5 ve 5.0 gösteren bit dizgileri tamamen farklı iki dizgi olacaklardır.
C’de standart veri türleri char,double,int gibi önceden tanımlanmış veri türleridir. double ve int reel ve tamsayıları programlarımızda göstermek için kullanılır. char ise her türlü karakter bilgisini saklamak için kullanılan bir veri türüdür. Standart veri türleri ile tanımlanan değişkenler için gerekli bellek, tanımlama (declaration) sırasında otomatik olarak ayrılır. C ’de standart veri türleri dışında programcı kendisi değişik veri türleri de tanımlayabilir (enumerated types). Ayrıca dinamik veri türleri de vardır (pointers). Dinamik veri türü olarak tanımlanan bir değişken için gerekli bellek bölgesi tanımlama anında değil de programın çalışma zamanında ayırılır.
Biz bu derste sadece standart veri türlerini anlatacağız. Önce sayısal veri türlerini, daha sonra da karakter veri türünü tanıtacağız.
2.2. Standart Veri Türleri
C programlama dilinde aşağıdaki anahtar sözcüklerle ifade edilen 10 standart veri türü vardır:
short, unsigned short, int, unsigned, long, unsigned long, float, double, long double, char
Tamsayılar için standart veri türleri:
Tamsayıların gösteriminde altı değişik veri türü kullanabiliriz. Bu veri türleri şunlardır:
- short
- unsigned short
- int
- unsigned
- long
- unsigned long
Bu dört veri türü de artı ve eksi tamsayıların gösteriminde kullanılır; tek farklı olan nokta değişik miktarlarda bellek kullanmalarıdır. Bu durumda gösterebilecekleri tamsayıların büyüklükleri de farklı olacaktır. Bu veri türlerinden biri ile tanımlanan değişkene denk düşen bellekteki bit dizgisi bir tamsayı (artı ya da eksi) olarak yorumlanacaktır. Her bir veri türü, yalnızca biri eksi (en küçük değer) diğeri artı (en büyük değer) olan belirli iki tam sayı arasındaki değerleri gösterebilir. Aşağıdaki tablo her veri türünün kaç bitlik bellek bölgesi kullandığını ve bu veri türü ile gösterilebilen en küçük ve en büyük tamsayıları gösterir.
Veri Türü |
Bellek Kapasitesi |
En Küçük Değer |
En Büyük Değer |
short |
16 bit |
-215 = -32,768 |
215-1 = 32,767 |
unsigned short |
16 bit |
0 |
216 - 1 = 65,535 |
int |
16 bit |
-215 = -32,768 |
215-1 = 32,767 |
long |
32 bit |
-231 = -2,147,483,648 |
231-1 = 2,147,483,647 |
unsigned long |
32 bit |
0 |
232 - 1 = 4,294,967,295 |
C programlama dilinde tamsayıları aşağıdakiler gibi yazabiliriz: 5, 3344, -89 C’de int veri türü değerleri aynı zamanda mantıksal değerler olan doğru ve yanlışı ifade etmek için de kullanılır. Bir int değer sıfır ise yanlış; değil ise doğru olan bir durumu gösterebilir. Örneğin, int bir değer bir lambanın açık ya da kapalı olması gibi iki değişik değeri olan durumları göstermekte kullanılabilir. Sıfır ise lamba kapalı; değilse açık olarak kabul edilebilir. int değerlerinin bu tip kullanımını daha sonraki derslerimizde detaylı olarak inceleyeceğiz.
Reel sayılar için standart veri türleri:
Reel sayılar için kullanılan üç standart veri türü vardır:
Bu üç veri türü de reel sayıların gösteriminde kullanılır. Bir reel sayı, bilimsel notasyonda mantissa * 2power formülüyle gösterilebilir; böylece bir reel sayıyı bilgisayarda göstermek için kullanılan bit dizgisinin bir bölümü sayının rakamlarını gösteren mantissa için ayrılmış ve diğer bir bölümü de üs (power) göstermek için ayrılmıştır. float, double ve long veri türlerinin kullandıkları bellek büyüklüğü ve mantissa ve power için ayırdıkları bit miktarı farklıdır. Aşağıdaki tablo bu veri türlerinin kaç bitlik bir alan kullandıklarını ve yaklaşık olarak gösterebilecekleri en küçük ve en büyük sayıları gösterir.
Veri Türü |
Bellek Kapasitesi |
En Küçük Değer |
En Büyük Değer |
float |
32 bit |
-3.4x10-37 |
3.4x1038 |
double |
64 bit |
-1.7x10308 |
1.7x10308 |
long double |
80 bit |
-3.4x104932 |
1.1x104932 |
float veri türü sayının 6 rakamını, double veri türü 15 rakamını, long double veri türü ise 19 rakamını saklayabilir.
Reel sayıları yazmak için noktalı notasyonu ya da bilimsel notasyon olarak bilinen e-notasyonunu kullanabiliriz. Bazı reel sayıları aşağıdaki gibi yazabiliriz:
5.0 7.34 0.5e+12 -15.35e-15 e-notasyonunda yazılan 0.5e+12 sayısı 0.5x10 12 sayısına, -15.35e-15 sayısı -15.35x10 -15 sayısına eşittir.
char standart veri türü:
char veri türü, harf, rakam ya da noktalama işareti gibi herhangi bir karakter değeri temsil eder. Her karakter sabiti iki tırnak işareti (’’) arasına yazılır.
Örneğin, bazı karakter sabitleri aşağıdaki gibi yazılabilir:
’A’ ’B’ ’a’ ’b’ ’0’ ’1’ ’*’ ’:’ ’"’ ’ ’ e-notasyonunda yazılan 0.5e+12 sayısı 0.5x10 12 sayısına, -15.35e-15 sayısı -15.35x10 -15 sayısına eşittir.
2.3. Değişkenlerin Tanımlanması
Bir değişken belirli bir veri türünü tutan bir bellek bölgesini gösteren bir tanımlayıcıdır. Bütün değişkenler kullanılmadan önce tanımlanmalıdır. Bir tanımlama ifadesi aynı veri türüne sahip olacak bir ya da daha fazla değişkenin tanımlanmasında kullanılır. Bir tanımlama ifadesinin yapısı aşağıdakiler gibi olmalıdır:
veri-türü değişken-adı;
veri-türü değişken-adı1,değişken-adı2,... ,değişken-adın; Örneğin: int sum;
int x,y;
double z; Birinci tanımlama ifadesi sum değişkeninin türünün int olacağını, ikinci tanımlama ifadesi x ve y değişkenlerinin türünün int olacağını ve üçüncü ifade de z değişkeninin türünün double olacağını gösterir. Bir tanımlama ifadesinde birden fazla değişken tanımlanacaksa, bu değişkenler virgüllerle ayrılır.
Değişkenlere ilk değerleri istenirse tanımlanma anında verilebilir. Örneğin,
int sum = 0;
int x=0, y=10; tanımlama ifadeleri aynı zamanda sum, x ve y değişkenlerine ilk değerlerini verirler.
3. Atama İfadesi
Atama ifadesi, bir değişkene yeni bir değer vermek için kullanılır. Genelde aritmetik hesapların yapılmasında kullanılır. Bir atama ifadesinin yapısı aşağıdaki gibidir:
değişken = deyim; C’de = işareti atama işlecidir.Sağdaki deyimin (expression) değeri bulunur ve bulunan değer soldaki değişkeniniçine konur.
Deyim sadece bir değişken ya da sabit olabilir. Örneğin, int x, y;
x = 5;
y = x;
x = 6; komutları ilk önce x değişkenin içine 5 değerini koyar; daha sonra x değişkenin içindeki değeri y değişkenin içine kopyalar ve en son olarak da x değişkenin içine 6 değerini, içindeki eski değeri silerek koyar. Genel olarak bir deyim, işleçler (operators) ve işlenenlerden (operands) oluşan bir dizgidir. C’deki bazı aritmetik işleçler şunlardır:
- + toplama
- - çikartma
- * çarpma
- / bölme
- % kalan(mod operator)
İşlenen (operand) ise bir değişken, bir sabit ya da diğer tek bir değeri gösteren yapılar olabilir. Örneğin
x = y + 1;
y = x * z;
atama ifadelerinde, önce y+1 deyimini hesaplamak için y�nin içindeki değer 1 ile toplanır ve sonuç x değişkeni içinde saklanır; sonra x*z deyimini hesaplamak için de x�in içindeki değer z�nin içindeki değer ile çarpılır ve sonuç y değişkeninin içinde saklanır.
3.1. İşleçlerin Öncelikleri (Operator Precedence)
Eğer bir deyimde birden fazla işleç varsa bu işleçleri hangi sırada yapacağımız işleçlerin önceliğine göre belirlenir. Örneğin,
x = y + z * 5; ifadesinde ilk önce çarpma işlemini mi, yoksa toplama işlemini mi yapacağız?
Bu iki değişik sıra deyim sonucunun tümüyle iki farklı değerde olması demektir. C programlama dilinde çarpma işlecinin önceliği toplama işlecininkinden daha yüksek olduğu için ilk önce çarpma işlemi yapılacaktır. Yani ilk önce z ve 5 çarpılacak ve elde edilen sonuç ile y toplanacaktır.
Bazen bir deyimde ardarda gelen iki işlecin önceliği aynı olabilir. Bu durumda, işleçlerin hangi sırada yapılacağını gösteren birleşme (associativity) kuralına bakılarak işlem sırası belirlenir. Örneğin C’de toplama ve çıkartma aynı önceliğe sahiptir. Aşağıdaki ifadede toplama işlemleri soldan sağa doğru yapılacaktır:
x = y + z + 5; Yani ilk önce x ve y toplanacak ve o toplamın sonucu 5 ile toplanacaktır. Bu örnekte toplamaların hangi sırada yapılacağı sonucu etkilemeyebilir; ama aşağıdaki örnekte etkileyecektir: x = y - z + 5; Yukarıdaki örnekte - ve + işleçleri aynı önceliğe sahip olduklarından, bu işlemleri soldan sağa doğru yaparız (ilk önce � işlemi, sonra + işlemi).
İşleç öncelikleri parantezler kullanılarak değiştirilebilir. Örneğin, x = (y+z) * 5; komutunda parantezleri kullanarak + işleci, * işlecinden daha önce yapılmaya zorlanmıştır. Ders kitabımızın 2.5. kısmında C’deki işleçlerin öncelik sırası anlatılmıştır.
Örnekler:
Deyim Deyimin Degeri
|
3.2. Atama İfadesinde Türlerin Uyuşması
Normal olarak bir atama ifadesinin solundaki değişkenin türü ile sağındaki deyimin türü aynı olmak zorundadır. Eğer sol taraftaki değişken türü int ise, sağ taraftaki deyimin türü de int olmak zorundadır. Örneğin,
int x;
double y;
x = y; atama ifadesiyle bir double değeri, bir int değişkeni içine saklanmak istendiğinden, C derleyicisi bu atama ifadesine hata mesajı verecektir. Bunun nedeni herhangi bir double değeri, bir bilgi kaybı olmadan bir int değeri olarak saklanamaz.
Ancak bazı durumlarda C derleyicisi, değişkenin türü ile deyim türünün aynı olmasında ısrar etmez. Örneğin, int x;
double y;
y = x; komutuna C derleyicisi hata vermez. x değişkenin içindeki int değeri otomatik olarak bir double değere çevrilir ve bu double değer, y değişkenin içinde saklanır. Bu, otomatik tür değiştirme (automatic type casting) olarak bilinir. Örneğin, bütün tamsayı veri türlerindeki değerler otomatik olarak double değerine dönüştürülebilir. Bir tamsayı veri türündeki değer, o veri türünden daha fazla bellek kullanan tamsayı veri türüne otomatik olarak dönüştürülebilir. Örneğin, bir short değeri otomatik olarak int ya da long değerine dönüştürülebilir.
Deyimlerin hesaplanması anında da otomatik tür değiştirme meydana gelebilir. Örneğin, 5 + 3.2 deyiminin değeri hesaplanırken, 5 ilk önce double bir değere dönüştürülür ve bu double değerle 3.2 double değeri toplanır. Diğer bir deyişle, bu deyimdeki toplama işlemi, double değerlerin toplama işlemidir. Bu deyimin sonucunun türü de double olacaktır.
4. Basit Girdi/Çıktı
Hemen hemen bütün programlar dışarıdan girdi aygıtları vasıtasıyla veri alırlar ve hesapladıkları verileri kullanıcıya ekran, yazıcı gibi çıktı aygıtları vasıtasıyla sunarlar. Programın dış dünyadan veri almasına girdi işlemi; hesapladığı sonuçları sunmasına da çıktı işlemi denir.
C’de bütün girdi ve çıktı işlemleri girdi/çıktı işlevleri dediğimiz özel programlar tarafından yapılır. En çok kullanılan girdi/çıktı işlevleri C’nin standart girdi/çıktı kütüphanesinin bir parçası olarak sunulmuştur. Bu programlara
#include <stdio.h> önişlemci yönlendirmesiyle erişebiliriz. Bu derste en temel girdi ve çıktı işlevleri olan scanf ve printf’in nasıl kullanıldıklarını göstereceğiz.
4.1. Basit Çıktı
Bir programın sonuçlarını görebilmek için, sonuçları tutan değişkenlerin değerlerini ya da mesajları bir çıktı aygıtında gösterebilmek gerekir. Bu amaçla printf işlevini kullanırız. Örneğin
printf( "bir dizgi. " ); işlev çağırma komutu, bilgisayarın ekranına çift tırnak (") sembolleri arasında kalan kısmı yazar ve imleç bir sonraki satıra geçer. Yani, ekranda, bir dizgi. yazısını görürüz. Burada kullanılan satır değiştirme damgasıdır (newline escape sequence). Bu karakter dizisi o andaki çıktı satırını sonlandırır ve imleci yeni satıra geçirir. Bir sonraki printf işlevini çağırma komutu verileri yeni satıra yazar. Eğer çıktımızı ekrana yazdırırken bir sonraki çıktı için alt satıra gitmek istemezsek, kullanmamalıyız. Örneğin, printf( "bir dizgi." ); işlev çağırma komutu, ekrana bir dizgi yazdıktan sonra, imleç bir alt satıra gitmeyecek o yazıdan hemen sonraki noktada bulunacaktır. Örneğin, printf( "bir dizgi." );
printf( "diger dizgi" ); komutları ekrana bir dizgi. diger dizgi çıktısını üretecektir.
printf işlevini çağırma ifadesinin genel yapısı aşağıdaki gibidir:
printf(biçimleme dizgisi, çikti_listesi) Biçimleme dizgisi çift tırnak içinde yazılır, çıktı listesinde de değişkenler virgüllerle ayrılarak sıralanır. Örneğin printf("Toplam uzunluk %f kilometredir. ",kms); ifadesi çalıştığında, eğer kms değişkeninin değeri 10.0 ise, ekranda Toplam uzunluk 10.0 kilometredir. yazısı görülecektir. Burada %f damgası double veri türünde bir değişken değeri için yer tutma görevini yapar. printf biçimleme dizgisini ekrana yazarken %f yerine çıktı listesindeki double değişkenin değerini yazar.
printf işlevi değişkenlerin değerlerini yer tutucu damgalar vasıtasıyla yazar. Bütün yer tutucular % işareti ile başlar. Her veri türü için ayrı bir yer tutucu damga vardır. Aşağdaki tablo char, int ve double veri türleri için kullanılan yer tutucu damgaları göstermektedir. Diğer yer tutucu damgaları ve değiştirme damgalarını kitabımızın 598-599. sayfalarında bulabilirsiniz.
Yer tutucu |
Veri türü |
Kullanıldığı işlev |
%c |
char |
printf/scanf |
%d |
int |
printf/scanf |
%f |
double |
printf |
%lf |
double |
scanf |
Biçimleme dizgisi birden fazla yer tutucu damga içerebilir. Eğer çıktı listesinde birden fazla değişken ya da sabit varsa biçimleme dizgisi aynı sayıda yer tutucu damga içermelidir. C bunlarla değişkenleri soldan sağa olmak üzere sırasıyla eşleştirir. Örneğin, i ve j’nin int veri türünde değişkenler olduklarını ve değerlerinin sırasıyla 5 ve 9 olduğunu varsayarsak,
printf("%d %c %d esittir %d", i, ’+’, j, i+j); ifadesi, 5 + 9 eşittir 14 yazacaktır.Bu ifadedeki biçimleme dizgisi ekrana yazılırken ilk %d i ’nin değeri ile, %c ’+’ ile, ikinci %d j’nin değeri ve üçüncü %d i+j değeri ile yer değiştirmiştir.
4.2. Basit Girdi
Örnek programımızda gördüğünüz
scanf("%s", yourName); ifadesi scanf işlevini standart girdi aygıtından yourName değişkenine veri kopyalamak için çağırır. Standart girdi aygıtı çoğu kez klavyedir. Dolayısıyla bilgisayar kullanıcı klavyeden ne veri girerse onu yourName değişkeninin içinde saklamaya çalışacaktır.
scanf işlevini çağırma ifadesinin genel yapısı printf işlevini çağırma ifadesininkine benzer: scanf(biçimleme dizgisi, girdi_listesi) Biçimleme dizgisi scanf’e ne tür bir veri girileceğini söyler. Örnekte görülen "%s" yer tutucu damgası yourName değişkeni için bir karakter dizisi beklendiğini belirtir. Tamsayı okuyacak olsaydık biçimleme dizgisine "%d", reel sayı için "%lf", karakter veri için ise "%c" yazacaktık. Örneğin, scanf("%c%c", &harf1, &harf2); ifadesi veri türü char olduğunu varsaydığınız harf1 ve harf2 değişkenlerine klavyeden girilen iki karakter değerini kopyalayacaktır. scanf("%d%lf", &age, &average); ifadesi ise int veri türündeki age değişkeni ile double veri türündeki average değişkenine değerlerini klavyeden okur.
Bu örneklerde programdaki ifadeden farklı olarak değişkenlerin başına & işareti koyduk. & işareti önüne koyulduğu değişkenin bellekteki adresini döndüren bir işlemcidir. Bu işareti char, int ve double veri türündeki değişkenleri okurken koymamız gerekir. Ancak örnek programımızdaki tanımlama kısmında yaptığımız gibi bir dizi(array) tanımlamışsak veya bir değişkeni tanımlarken * kullanıldıysa bu işarete gerek yoktur. Bunun neden böyle olduğunu daha sonraki derslerimizde açıklayacağız!
Klavyeden kaç tane veri alınacağı biçimleme dizgisindeki yer tutucu damgaların sayısıyla belirtilir. Verileri okuma işleminde verilerin türleri çok önemlidir. C int ya da reel sayıları okurken sayıların başındaki boşlukları atlar ve sayının bir parçası olamayacak ilk karaktere kadar (boşluk ya da baska herhangi bir karakter) olan karakterleri sayı olarak okur. char veri türü okunurken ise her boşluk ayrı bir karakter olarak görülür. char veri türü okurken de boşlukları atlamak istersek, kaç boşluk atlamak gerekiyorsa o kadar boşluk karakterinin biçimleme dizgisine yazmamız gerekir.
Bir programa klavyeden veri girerken biçimleme dizgisinde belirtilenden daha fazla veri girersek fazladan girilen veriler bellekte saklanır ve programda (varsa) bir sonraki scanf ifadesi tarafından okunur. Daha az veri girersek, program biz gerekli veri bilgisini tamamlayana kadar bekler.
4.3. Çıktıların Biçimlendirilmesi
Bu bölümde programımızın çıktılarının ekrandaki görüntülerini nasıl kontrol edeceğimizi göstereceğiz.
int veri türündeki değerlerin görünüşünü düzenlemek için, değeri yazmak için kaç kolonluk yer ayırmak gerektiğini "%d" damgasına ekleriz. Örneğin
printf(" Sonuc = %3d kilo %4d gramdir. ", k, g); ifadesi, eğer k değişkeninin değeri 21, g değişkeninin değeri 50 ise Sonuc = 21 kilo 50 gramdir. çıktısını verecektir. Burada 21 değeri 3 karakterlik bir alana, 50 değeri de 4 karakterlik bir alana yazılmıştır.
Reel sayıların görünüşünü ayarlamak için hem kaplayacağı toplam kolon sayısını hem de noktadan sonra kaç basamak basılacağı bilgisini vermek gerekir. Toplam alanı belirtirken noktanın kaplayacağı bir kolonu da saymak gerekir. Örneğin 3.14159 değerini taşıyan pi değişkenini
printf(" PI = %5.2f ", pi); ifadesiyle yazmak istersek, ekranda PI = 3.14 görülecektir. "%5.2f" damgasıyla pi değişkenini toplam 5 kolonluk alana noktadan sonra 2 basamak bırakarak yazmak istediğimizi söylüyoruz. Çıktıda = işaretinden sonra 2 boşluk vardır. Biri biçimleme dizgisinde yazdığımız boşluktur, diğeri ise pi’yi yazmak için kullandığımız toplam 5 kolonluk alandan kalan boşluktur.
Örnek Program
/* Yazar : CPG Öğretim Üyesi
* Tarih : Ekim 2009
*
* Bu program, iki tamsayiyi klavyeden okur ve
* bu iki sayinin toplamini ve birinci ile ikinci sayi arasindaki
* farki bularak ekrana bastirir.
*/
#include <stdio.h>
int
main (void) {
int i,j; /* okunan iki sayi */
int toplam, fark; /* bulunacak toplam ve fark */
/* Tamsayilari bildirim basarak oku*/
printf("Birinci sayiyi girin:");
scanf("%d", &i);
printf("Ikinci sayiyi girin:");
scanf("%d", &j);
/* Toplami bul */
toplam = i+j;
/* Farki bul */
fark = i-j;
/*Toplami ve farki ekrana yazdir */
printf("Toplam = %3d ", toplam);
printf("Fark = %3d ", fark);
return(0);
}
|
Bu programı bilgisayarınıza yüklemek için bu linki kullanabilirsiniz.(Farenizin sag tusuna basip,Save Target As secenegini seciniz)
Bir önceki sayfadaki program, her sayıyı okumadan önce, ekrana, printf işlevi ile kullanıcıya ne yapacağını söyleyen bildirimi bastırır ve kullanıcının yazdığı sayı okunarak değişkenin içinde saklanır.
Sayılar okunup değişkenler içinde saklandıktan sonra, toplamları ve farkları atama ifadeleri ile bulunur. Bulunan sonuçlar, printf işleviyle ekrana gönderilir.
Bu örnek programı kendi bilgisayarınızda çalıştırın. Daha sonra biçimleme dizgisini değiştirerek sonuçların ekranda nasıl gösterildiğini inceleyin.
5. Hata Mesajları
Bu haftadan itibaren kendi programlarımızı yazmaya başlayacağız. İdeal bir durumda, yazdığımız program bilgisayarda ilk denememizde hiç hata vermeden tam istediğimiz gibi çalışabilir. Ama bu büyük ihtimalle hiç olmayacağı için karşılaşacağımız hata çeşitlerini bilmemizde yarar vardır. Üç hata çeşidi ile karşılaşabiliriz: Derleme sırasındaki hatalar, çalıştırma sırasındaki hatalar ve mantık (ya da tasarım) hataları.
Derleme Hataları
Derleme hataları program derlenirken ortaya çıkan hatalardır. Bunlar aynı zamanda syntax hataları olarak da bilinir. Programınızı yazarken yazım hataları yaparsanız (imla hatası gibi), C’nin kurallarına uymazsanız (örneğin ; ya da { ve } gibi işaretleri yanlış yerlerde kullanmak gibi) derleme hataları alırsınız. Bunlar bulması ve düzeltmesi en kolay hatalardır. C’de en sık yapılan yazım hatalarından birkaçını sıralayalım.
C’de komut içeren her ifade ’;’ işareti ile bitirilmelidir. Bu C’nin ifadeleri birbirinden ayırabilmesi için gereklidir. Eğer ’;’ unutulursa C derleyicisi hata mesajı verecektir.
Açıklamalar mutlaka ’/*’ ile başlamalı ve ’*/’ ile bitmelidir.
Programların bölümlerinin başlangıç ve sonlarını belirleyen ’{’ ve ’}’ işaretlerini unutmak ya da yanlış kullanmak da en yaygın hatalardır.
Programda kullanılan bir değişkenin tanımlanması unutulursa bu da bir derleme hatasına sebep olur.
Çalıştırma Hataları
Çalıştırma hataları program derlendikten sonra çalıştırılırken alınan hatalardır. Programınızı syntax hatalarından temizledikten sonra çalıştırdığınızda programın çıktısı yerine hata mesajı alırsanız ya da programınız hiç sonuç vermeden ekran kilitlenmiş gibi boş kalırsa çalıştırmada bir hata var demektir. Bu tip hataların nedeni daha zor bulunur, çünkü nedenler programın içeriğine göre çok çeşitlidir. Örneğin programınızda bir bölme işlemi vardır ve programın çalışma sırasında bölen değer sıfır oluyordur. İşte bu durumda sıfıra bölme işlemi çalıştırma hatası verecektir. Bu tip hataları programlama yeteneğiniz arttıkça bulmanız ve düzeltmeniz kolaylaşacaktır.
Mantık Hataları
Mantık hataları da algoritma tasarımı sırasında ya da algoritmayı programa kodlarken yapılan bir hatadan kaynaklanır. Mantık hataları genelde derleme ve çalıştırma hatalarından kurtulduktan sonra ortaya çıkar. Bu aşamada programınız çalışır ve bir çıktı verir. Ancak çıktıyı incelediğinizde bunun sizin istediğiniz çıktı olmadığını görürsünüz. Örneğin çıktılar düzgün bir sırada alt alta çıkmamıştır, ya da rakamlar hatalı hesaplanmıştır ya da program eksik çıktı vermiştir. Bu tip hataları düzeltmek için programın bazı kısımlarını yeniden yazmak hatta bazen algoritmayı değiştirmek gerekebilir.
6. Okuma Ödevi
Referans kitanızdan veya türkçe kaynaklardan aşağıdaki başlıklı bölümleri okumunazı tavsiye ediyoruz.
2. Overview of C
2.1 C Language Elements
2.2 Variable Declarations and Data Types
2.3 Executable Statements
2.4 General form of a C program
2.5 Arithmetic Expressions
2.6 Formatting Numbers in Program Outputs
2.7 Interactive Mode, Batch Mode, and Data Files
2.8 Common Programming Errors
Yorumlar |
|
Henüz yorum yapılmamış
|
Yorum Ekle |
|
|
|