You are on page 1of 94

C Programlama Ders

Notlar

www.eemdersnotlari.com

Revizyon ve Bask Bilgisi


21/13.02.2012 13:15:00

C Programlama Ders Notlar

indekiler
indekiler................................................................................................................................... 2
nsz .......................................................................................................................................... 5
Yaralanlabilecek Dier Kaynaklar ........................................................................................ 5
Program Nedir ............................................................................................................................ 6
Programlama Dili Nedir? ........................................................................................................... 7
C Nasl Bir Programlama Dilidir? .............................................................................................. 8
C'de Program Yazma... ............................................................................................................... 9
nn niversitesi nternet Merkezinde Program Yazma...................................................... 9
Kendi Yerel Bilgisayarnzda program yazma ..................................................................... 10
Yazlm Program Kat zerinde altrma ...................................................................... 11
Genel Program Yaps .............................................................................................................. 12
Balarken .............................................................................................................................. 12
Deikenler ve Aritmetik ilemler ....................................................................................... 14
Deiken Tanmlama Kurallar ................................................................................................ 17
Sabitler ................................................................................................................................. 17
Deiken Trleri ................................................................................................................... 18
Deiken Adlandrma Kurallar ....................................................................................... 18
Alfa saysal Deikenler................................................................................................... 18
Saysal Deikenler .......................................................................................................... 19
Tanmlamalar ................................................................................................................... 19
Aritmetik fadeler ................................................................................................................. 20
Aritmetik Operatrler ........................................................................................................... 20
Mantksal ifadeler ................................................................................................................. 21
Karlatrma leleri ve Mantksal Operatrler ................................................................. 21
Karlatrma ileleri ....................................................................................................... 21
Mantksal Operatrler ...................................................................................................... 22
Tr Dnmleri .................................................................................................................. 23
Artrma ve Eksiltme operatrleri.......................................................................................... 24
Mantksal Bit operatrleri .................................................................................................... 25
Deer Atama ifadeleri .......................................................................................................... 25
Koullu fadeler .................................................................................................................... 25
Giri k lemleri ................................................................................................................. 26
Standart Ktphaneye Eriim............................................................................................... 26
Standart Giri, Standart k ve Hata k noktalar ......................................................... 26
Standart Giri k Fonksiyonlar ....................................................................................... 27
Biimlendirilmi klar ..................................................................................................... 29
Biimlendirilmi Giriler...................................................................................................... 30
Bellek Biim dnm fonksiyonlar ................................................................................... 31
Karakter dizesinin Okunup-Yazlmas ................................................................................. 32
nemli bir takm fonksiyonlar ............................................................................................. 32
Karakter Snama ve dntrme fonksiyonlar ................................................................ 32
ungetc ............................................................................................................................... 33
Program Ak ve Program Ak Denetimi .............................................................................. 34
Komutlar ve Bloklar ............................................................................................................. 34
If-Else komutu ...................................................................................................................... 34
Else if komutu ................................................................................................................... 36

8/13.02.2012 16:19:00

C Programlama Ders Notlar

Etiketler ve goto komutu ...................................................................................................... 37


switch komutu ...................................................................................................................... 38
Dng Komutlar - while ..................................................................................................... 40
Dng Komutlar - for.......................................................................................................... 41
Dng Komutlar - do...while .............................................................................................. 44
Dng k Komutu - break ............................................................................................... 45
Dng devam Komutu - continue ........................................................................................ 46
Fonksiyonlar ve Genel Program Yaps ................................................................................... 47
Ana program blou (main) ................................................................................................... 47
C program genel yaps ....................................................................................................... 48
#include Tanmlar ........................................................................................................... 48
#define Tanmlar ............................................................................................................. 48
Dier blmler ................................................................................................................. 48
Temeller ............................................................................................................................... 49
Fonksiyon parametreleri hakknda ....................................................................................... 50
Deikenlerin etkili olduu blgeler .................................................................................... 51
Genel Deikenler ................................................................................................................ 51
extern deikenler ................................................................................................................ 52
static deikenler .................................................................................................................. 52
register deikenler .............................................................................................................. 52
Blok Yaps ........................................................................................................................... 53
lk deer atama ..................................................................................................................... 53
zyineleme (Recursion) ....................................................................................................... 53
C dili nilemcisi.................................................................................................................. 54
Dosya Dahil etme ............................................................................................................. 54
Makro veya sembolik sabit tanmlama............................................................................. 55
Diziler ....................................................................................................................................... 56
Dizi Nedir? ........................................................................................................................... 56
Bir Vektrn veya matrisin Tanmlanmas .......................................................................... 56
Diziler ve Matrisler zerinde uygulanabilecek ilemler ...................................................... 57
Dizi sralama .................................................................................................................... 58
Dizi ierisinde istenilen bir eyler bulma ......................................................................... 58
Matrisin devriini alma .................................................................................................... 59
Karakter dizeleri (Dizge) .......................................................................................................... 61
Karakter dizesi tanmlama ve kullanma ............................................................................... 61
Gstergeler-aretiler .............................................................................................................. 64
aretiler ve Adresler .......................................................................................................... 64
aretiler ve Fonksiyon parametreleri ................................................................................. 66
aretiler ve diziler .............................................................................................................. 67
Adres Aritmetii ................................................................................................................... 68
Karakter aretileri ve Fonksiyonlar .................................................................................. 69
Dosyalarla ilgili ilemler .......................................................................................................... 71
Dosya Trleri ve eriim ........................................................................................................ 71
Metin Dosyalar .................................................................................................................... 72
Dosya ama ilemi ........................................................................................................... 72
Dosyadan okuma .............................................................................................................. 73
Dosyaya yazma ................................................................................................................ 73
Dosya kapama .................................................................................................................. 73
Dorudan Eriimli Dosyalar................................................................................................. 74
Dosya ama ilemi ........................................................................................................... 74

8/13.02.2012 16:19:00

C Programlama Ders Notlar

Dosyadan okuma .............................................................................................................. 74


Dosyaya yazma ................................................................................................................ 75
Dosya kapama ilemleri ................................................................................................... 75
Dorudan eriimli dosyalara zel durumlar. .................................................................... 75
Veri Yaplar (structure) ........................................................................................................... 76
Temel Tanmlar .................................................................................................................... 76
Veri Yaplarnn fonksiyonlarla kullanlmas ....................................................................... 78
TypeDef ................................................................................................................................ 79
Hazr Fonksiyonlar ................................................................................................................... 81
Diyagnostik ile ilgili fonksiyonlar........................................................................................ 81
void assert(int ifade); ........................................................................................................ 81
Derleyici Bildirimleri ............................................................................................................... 89
#include bildirimi ................................................................................................................. 89
#define bildirimi ................................................................................................................... 89
#if...#endif bildirimi ............................................................................................................. 91
#error ve #pragma bildirimleri ............................................................................................. 92
Parametre Tanmlama .............................................................................................................. 93
C Kodlamada en ok yaplan hatalar........................................................................................ 94

8/13.02.2012 16:19:00

C Programlama Ders Notlar

nsz
Bu ders notlarnn yazlmasnda Brian W Kernighan ve Dennis Ritchie isimli
yazarlarn The C Programming Language isimli kitabndan
faydalanlmtr. Bu kitab nn niversitesi Ktphanesinde bulabilmeniz
mmkndr. Bu ders notlar hem ierik olarak hem de takip ettii
mfredat olarak yukarda bahsi geen kitab rnek olarak almtr.

Yaralanlabilecek Dier Kaynaklar


1. Palme Yaynclk, Programlamay C ile reniyorum, Muhammet
Yorulmaz, Seher Yorulmaz
2. Papatya Yaynevi, C Programlama Dili, Dr. Rifat lkesen

8/13.02.2012 16:19:00

C Programlama Ders Notlar

Program Nedir?
Program, gnlk hayatta bir sorunu bilgisayar ile zmek ve rutin ilemleri
kolaylatrmak iin yazlan yazlmlardr. Bir program bilgisayar zerinde
alr ve insanlarn gnlk hayatlarn kolaylatrr.
Kiinin program yazmas iin ncelikle Genel Programlama Bilgisine sahip
olmas gerekir. Peinden bir Programlama Dili bilmek gereklidir. Burada
nemli olan programlama bilgisidir. Bu konuda kendinizi iyi
hissedebiliyorsanz herhangi bir programlama dili ile programlarnz
yazabilirsiniz. Dil tercihi yazlacak programa, soruna ve platforma uygun
olarak yaplabilir.

8/13.02.2012 16:19:00

C Programlama Ders Notlar

Programlama Dili Nedir?


Programlama Dili bilgisayarda zlecek bir sorun iin zmn
bilgisayara adm adm yazlmasn salayan biimsel kurallar olan ve bu
kurallara sk skya bamll gerektiren bir tanmlar kmesidir.
Belki daha ksa bir tanm ile sizinle bilgisayar arasnda bir tercmandr
demek doru olur.
Bir sorun zlecei zaman ncelikle iyice anlalm olmaldr. Sonra bu
sorunu zebilecek bir zm zihinsel olarak hazrlanr. Bu zm
bilgisayara uygun bir zm olmaldr. yle ki her zm bilgisayarda
uygulanamaz. nk her zmn takip ettii yol yeteri kadar basit
olmayabilir. retilen zm son derece basit admlarla anlatlabilmelidir.
Bu admlarla zmn anlatlmasna Algoritma denir Bu admlarn alt alta
yazlmas suretiyle oluturulan zm bilgisayar iin uygundur. Ancak
ihtiya var ise bu admlar Ak izgesine evrilebilir. Algoritma doal bir
dille yazlr ve sk skya kurallar bulunmaz. Anlalmasnn kolay olmas
yeterlidir. Ak izgesinde belirlenmi semboller yer alr ve bu semboller
tm dnyada standarttr. Ksmen biimsel olan bu izge sorunun
zmn daha evrensel bir dille ifade eder.
Son adm olarak sra Ak izgesi veya Algoritma ile elde edilen zmn
bir Programlama dili ile Bilgisayar ortamna aktarlmasna gelmitir.
Programlama dili son derece standart tanmlar ierir ve bir program
yazarken bu tanmlardan bir an iin bile uzaklaamazsnz. O nedenle de
bir program parasndan bakalarnn baka eyler anlamas mmkn
deildir. Yazlan bu programlar bir derleyici vastas ile Makine diline
evrilir varsa hatalarn bulunmasn salar ve kullanc bu hatalar dzeltir.

8/13.02.2012 16:19:00

C Programlama Ders Notlar

C Nasl Bir Programlama Dilidir?


C Makine Dili ile st dzey programlama dili arasnda olan son derece
esnek kullanml bir programlama dilidir. Esnek olmas yazacanz
programda daha dikkatli olmanz gerektii anlamna gelir. Unutulacak bir
iaret belki derleyici hatasna neden olmayacaktr ancak programnz da
doru altrmayacaktr.
Genel Amal, olduka ok sayda ifade, denetim komutlar bulunduran,
gl veri yaplarna sahip olan bir programlama dilidir. lk balarda UNIX
zerinde tasarlanp gelitirilen bu dil imdi tm iletim sistemlerin de
yaygn olarak kullanlmakta ve dier baz programlama dillerinde olduu
gibi modernlik kavramn yitirmemektedir.
"Bir Assembler derleyicisinin salad esneklik ve gc salarken st
dzey bir programlama dilinin salad kolay anlalabilirlik zelliini de
sunmaktadr"

8/13.02.2012 16:19:00

C Programlama Ders Notlar

C'de Program Yazma...


ok basit anlamda bir metin dzenleyici ve bir derleyiciniz var ise C'de
program yazabilirsiniz.
Eer TC (Turbo C) ortamn kullanyorsanz metin dzenleyici ve derleyici
i iedir.

Bir Linux Sunucuya uzaktan balanarak


Program Yazma
Eer uzak masast benzeri bir ortamda C Programlarn LINUX zerinde
gelitirecekseniz u admlar takip etmeniz gerekecek:
1. ncelikle Kendinize -hala yoksa- bir mail adresi aln. Bu ayn
zamanda sizin LINUX makine zerinde kullanc ifreniz olacaktr.
2. ster Windows makinelerden isterseniz de LINUX makinelerden bir
Linux sunucu adresine (rnekte stu.inonu.edu.tr) telnet yapn

3. Kullanc ad ve ifrenizi kullanarak sisteme login olun.


4. pico merhaba.c
yazarak Pico editorunun bo bir sayfa ile gelmesini salayn.

rnein u program yazn:


#include <stdio.h>
main(){
printf("Merhaba Millet\n");

8/13.02.2012 16:19:00

C Programlama Ders Notlar

5. Ctrl-X tularna basarak pico editrnden kn. Soraca


"Kaydedilsin mi?" (Save modified buffer....?) sorusuna "Y"
ile karlk verin. Dosya ad ne olacak eklindeki soruya uygun bir
dosya ad ile cevap verin. Burada merhaba.c zaten yazyordur. Enter
tuuna basp geebilirsiniz.
6. Linux'a dnnce komut satrndan
gcc merhaba.c -o merhaba
yazarak program derleyin hata mesaj alrsanz 4. adma geri
dnn. Eer o ksmndan sonra bir ey yazmazsanz bu programn
derlendikten sonra a.out ismiyle kaydedilmesini salam olursunuz.
Burada unutulmamas veya kartrlmamas gereken ey
merhaba.c programn kaynak kodlardr. Sizin yazdnz C
komutlardr. Merhaba dosyasna kaydedilen program ise makine
diline evrilmi olan programdr. Ve program altrmak iin
merhaba dosyasna zerinde deiiklik yapmak iin merhaba.c
dosyasna ihtiya vardr.
./merhaba
yazarak programnz altrn.
Bu komut yazlp ENTER tuuna basldktan sonra ekrana Merhaba
Millet yazld grlecektir.
7. Tm almalarnz bitirdikten sonra sistemden kmak iin
logout veya exit
yazmay unutmayn.

Kendi Yerel Bilgisayarnzda program yazma


Bilgisayarnzda herhangi bir C derleyicisi var ise kolay yoldan uzak masa
st balants vb. ortamlara ihtiya duymadan kendi bilgisayarnzda C
program gelitirebilirsiniz. Turbo C derleyicisi bu tip bir ilem iin

8/13.02.2012 16:19:00

10

C Programlama Ders Notlar

uygundur. Ancak TC derleyicisi ticari bir yazlm olduu iin kullanabilmek


iin satn almanz gerekebilir. Buna ramen Sourceforge sitesinden hibir
cret demeden edinebileceiniz onlarca C yazlm gelitirme ortam bulup
indirebilir ve bilgisayarnza ykleyebilirsiniz.
Bu amala http://www.bloodshed.net/ adresindeki Bloodshed C
Derleyicisi, daha dorusu C program gelitirme ortam (IDE) iinizi
fazlasyla grecektir. nce Program Download kesiminden indirin.
Dev-C++ balantsndan C Programlama iin olan gelitirme ortamn
indirmeniz gerekecektir. ndireceiniz program devcpp-4.9setup.exe gibi
bir ada sahip olacaktr. Bu program Windows bilgisayarnz iin gerekli tm
yardmc programlar da ierisinde barndryor olacaktr.

Yazlm Program Kt zerinde altrma


Algoritma altrma konusunda grdmz gibi bazen de yazlan
programlar kat zerinde altrlmak zorunda kalnabilir. Geri bir fiziksel
bilgisayar ortam var ise bu ileme gerek olmayabilir. Ancak mantksal bir
hatann nerde olduunu grmenin en iyi yollarndan biri program el ile
kat zerinde altrmaktr. Yani programn her bir adm tek tek
programc tarafndan altrlr ve deikenlere ilikin deerler bir tabloda
sra ile gsterilir. Bu hem programda nerede hata yaptnz anlatr hem
de programn ne sonular reteceini size gsterir.

8/13.02.2012 16:19:00

11

C Programlama Ders Notlar

Genel Program Yaps


Bu blmde Genel bir C Programnn yapsn C programlama dilinin
detaylarna fazla girmeden gstermeye alacaz. Bu noktada amacmz
mkemmel programlar ve eksiksiz tanmlar yapmak deil olabildiince
hzl bir ekilde C programlarnn genel grnleri ve ileyileri hakknda
bilgi vermektir. lerleyen blmlerde bu programlarda yazdmz bir takm
yaplar, komutlar detaylca anlatlacaktr.
Bu nedenle bu blmde ele alp ilemi olabileceimiz bir konu dier
blmlerde daha detayl ilenebilecektir. Umarz bu sizlerin daha iyi
renmenizi ve daha fazla zevk almanz salayacaktr.

Balarken
Bir Programlama dilini renmenin en iyi ve en kolay yolu o dilde
programlar yazmaktr. Birok programlama dilinde genellikle kullanlan u
program yazalm. Ekrana Merhaba yazan bir programdan bahsediyoruz.
Bu birok programlama dilinde temel olarak ele alnan en basit konudur.
nemli olanlardan biri bu program yazabilmek, baarl bir ekilde
derleyebilmek, altrabilmek ve elde edilen sonular grebilmektir.
#include <stdio.h>
main(){
printf(Merhaba Dnya\n);
}
Bu program nasl derleyip altracanz kullandnz iletim sistemi ve
derleyiciye baldr. Bir nceki konuda bunun hakknda yeterli bilgi verdik.
Dier sistemlerde bu ilem farkllklar gsterebilecektir. Yukardaki
program yazarak derleyiniz ve altrmaya alnz.
Program hakknda yaplacak bir takm aklamalar unlar olabilir. Bir C
program boyutu ne olursa olsun bir ya da daha fazla fonksiyon denilen
bloktan oluur. Bu fonksiyonlarn her biri gerek ilemlerin yapld
yerlerdir. Bu rnekte main byle bir fonksiyondur. Normal olarak
fonksiyonlarnza istediiniz ad verme zgrlne sahipsiniz. Ancak main
zel bir isimdir. C programnz bu fonksiyonun balad yerden itibaren
icra edilmeye balanr. Bu ayn zamanda her programn bir main
fonksiyonunun olmas gerektii anlamna gelir. Genellikle bu fonksiyon
dier fonksiyonlar ararak, C komutlarn icra ederek veya hazr dier
fonksiyonlar ararak yapmas gereken ilemleri yapar.
Fonksiyonlar arasnda haberleme ve deerlerin transferi parametreargmanlar maharetiyle gerekleir. Fonksiyon adndaki parantezler
8/13.02.2012 16:19:00

12

C Programlama Ders Notlar

arasnda parametre listesi yer alr. Bu rneimizde main fonksiyonunun


parametresi olmad iin parantezler arasnda herhangi bir ifade
bulunmamaktadr. Kme parantezleri arasnda yazlan C ifadeleri bu
fonksiyonu meydana getiren komutlarn balad ve bittii yerleri
tanmlar. Bir fonksiyon normal olarak isminin anlmas ile icra edilir. Eer
fonksiyonun parametreleri var ise parantezler arasnda bu parametre
listesi virgllerle ayrlm olarak verilir. Fonksiyonu aran zel ayrlm
bir kelime ya da komut bulunmamaktadr. Fonksiyon parametre listesi
almasa bile parantezler yazlmak zorundadr.
printf(Merhaba Dnya\n); satr ad printf olan bir fonksiyon arr. Bu
arda parametre olarak Trnak ierisinde yazl olan ifade kullanlr. printf
ekrana bir bilginin yazlmasn salayan bir ktphane fonksiyonudur. Bu
durumda bu fonksiyon, ekrana, parametre olarak gnderilen ifadeyi
yazacaktr.
... eklindeki ift trnaklarn arasna yazlan ifadelere karakter sabiti veya
alfabetik sabit denir. imdilik biz bu tr sabitleri sadece printf ve benzeri
fonksiyonlarda parametre olarak kullanacaz.
Bu karakter dizisi iinde yer alan \n ifadesi yeni satr veya bir alt satr
anlamna gelen dizedir. Bu dizenin karlald karakter sabitinde bir alt
satra geilir. Eer bu \n ifade iinde yer almazsa program ktsnda bir alt
satra geilmediini greceksiniz. Yeni bir satra geebilmek iin
programda \n ifadesini uygun bir yerde kullanmak zorundasnz. Aksi halde
printf(Merhaba Dnya
);
eklinde bir ifade yazarak yeni bir satr elde etme ansnz olmad gibi
derleyici hatalar ile karlaacaksnz.
printf fonksiyonu asla otomatik bir yeni satra gei ilemi salamaz. O
nedenle bir satr bilgi yazabilmek iin birden fazla printf kullanlabilir.
rnein programmz u ekilde yazlabilir.
main(){
printf(Merhaba, );
printf(Dnya);
printf(\n)
}
eklindeki bir kt demin ki ktnn aynsn retecektir.
\n ifadesinin tek bir karakter anlattn bilmenizde fayda var. Escape
sequence denilen bu sistemde grnmeyen karakterleri ifade edebilmek
mmkndr. Bu tarz karakterlerin arasnda unlarn da bulunduunu
syleyebiliriz: \t tab iin, \b geriye doru silme ilemi iin (Backspace), \
ift trnan kendisi iin, \\ \ kendisi iin kullanlan dizelerdir.

8/13.02.2012 16:19:00

13

C Programlama Ders Notlar

Deikenler ve Aritmetik ilemler


Sonraki program Fahrenheit scaklk deerleri ile santigrat scaklk l
karlklarn veren bir tabloyu ekrana yazabilecektir. Bu ilem iin
kullanlan forml u ekildedir. C=(5/9)(F-32).
/* Fahrenheit ve santigrat Tablosu
f=0, 20, ... ,300 deerleri iin */
#include <stdio.h>
main(){
int alt, ust, adim;
float fahr, celcius;
alt=0;
ust=300;
adim=20;
fahr=alt;
while (fahr<=ust){
celcius=(5.0/9.0) * (fahr-32.0);
fahr=fahr + adim;
printf(%f\t%f\n, fahr, celcius)
}
getchar();
}
Bu programdaki ilk iki satr aklama satr olarak anlrlar. Bu satrlar
ounlukla programn veya o kesimin ne i yaptn ksaca aklayan
satrlardr. /* ile */ ifadeleri arasna yazlan tm karakterler derleyici
tarafndan gz ard edilirler. O nedenle programn daha kolay anlalmas
iin rahatlkla kullanlabilirler.
C Programlama dilinde deikenler kullanlmadan nce tanmlanmaldrlar.
Bu tanm genellikle programn en banda herhangi bir komuttan nce yer
alr. Eer bir deikeni tanmlamay unutmusanz derleyicinin size
durumu hata raporu ile bildirdiini grrsnz. Bir tanm; tr ve bu trde
tanmlanmak istenen deiken listesinden oluur. yle ki:
int alt,ust, adim;
float fahr,celcius;
int tr yanndaki deikenlerin tamsay olduunu vurgulamaktadr. float
ise kesirli saylar vurgular. int ve floatn hassasiyeti kullandnz
bilgisayara ve iletim sistemine hatta derleyiciye bal olarak deiebilir.
Genellikle int trndeki bir say 32768 ile +32767 aralnda bulunabilir.
float trdeki bir deiken ise 32 bit yer igal eder ve 10-38 ile 10+38
aralnda deerleri tayabilir.

8/13.02.2012 16:19:00

14

C Programlama Ders Notlar

C dilinde baka temel deiken trleri bulunur.char, double, long, short


gibi ifadelerle bunlar anlatlrlar. Bu deikenlerin byklkleri makineye
bamldr. Bunlarn haricinde diziler (arrays), yaplar (structures), unions
tarznda deiken trlerinin tanmlanabilecei ifadeler bulunacaktr.
Programda aadaki ilemler aritmetik deer atama ilemleridir. Deer
hesaplama bu ksmda bahsi geen komutlar ile balar.
alt=0;
ust=300;
adim=20;
fahr=alt;
Bu komutlar deikenlerimize ilk deer atamalarn salar. Her komutun
noktal virgl ile bittiine dikkatlerinizi ekmek isteriz.
Tablonuzun her satrndaki deer ayn yntemle hesaplanr. yleyse her
satr her seferinde hesaplayan bir dng komutu ilemimizi rahatlkla
ifade edebilir. Bu amala while komutu kullanlmtr.
while (fahr <= ust){
...
}
Bu komutta parantezler arasnda yer alan koul test edilir. Eer sonu
doru ise (yani fahr iindeki deer ust iindeki deerden byk veya eit
ise) kme parantezleri arasnda kalan ilem gerekletirilir. Bu koul
tekrar kontrol edilir ve bu ilem tekrarlanr. Ta ki yaplan kontrol yanl
oluncaya kadar. Koul yanl sonuca ularsa program ak, dng
komutundan sonraki komuttan devam eder. Bu programda dng
komutundan sonra komutlar bulunmad iin program sonlandrlr.
while dng komutunun gvdesi bir komuttan oluabilecei gibi kme
parantezleri ierisine yerletirilmi birden fazla komuttan da oluabilir.
stenirse tek komutta kme parantezi ierisine yerletirilerek anlatlabilir.
Genellikle while komutunun iindeki komutlar okunmas ve bir bakta
kolay anlalmas iin bir tab ieriden yazlrlar. Bu biimleme
programnzn mantksal yapsn vurgular. Buna ramen C dilinin satrda
yazlacak bilgilerin hangi stuna konulmasnn belirlenmesi hususunda
kstlamasnn olmadn bilmelisiniz. Dzenli girinti ve kntlarn
programda vurgulanabilmesi programlarnzn baka insanlar tarafndan
kolay okunmasn salar.Bir satra bir komut yazmanz ve operatrler
arasna boluk brakarak yazmanz tavsiye ederiz. Kme parantezlerinin
konumu ok nemli deildir. Ancak okunakll arttrmak iin bir stil sahibi
olmanzda fayda bulunmaktadr.
lemlerin ou Dnglerin iinde halledilir. Programda celcius=(5.0/9.0) *
(fahr-32.0) komutunda 5.0/9.0 yazlmtr. Halbuki 5/9 yazmak daha

8/13.02.2012 16:19:00

15

C Programlama Ders Notlar

kolay olabilecekken neden byle bir yol seilmitir? nk C dilinde


tamsay blme ileminden elde edilen sayda tam ksm alnr kesirli
ksmlar imha edilir. Kesirli bir ondalk basamann sfr olsa bile
belirtilmesi bu ifadenin bir kesirli blme olduunu C diline anlatr ve sonu
kesirli say olarak istediimiz ekilde elde edilir.
Tr evrimleri ile ilgili konulara daha sonra deinilecektir. Ancak burada
unu syleyebiliriz
fahr=alt veya while (fahr<=ust) komutlarnda int deerler ileme
alnmadan nce float trne dntrlrler.
printf fonksiyonunun tam olarak nasl alt daha sonraki konularda
anlatlacaktr. Ancak u konuyu burada hatrlatmakta fayda var. Esasnda
printf C dilinin bir paras deildir. Daha dorusu C dili komutu deildir.
Esasnda olduka kullanl ve ok amal bir k fonksiyonudur.
Altrma 1
Yukardaki programn aksine celcius dereceden fahrenheit dereceye
deerlerin verildii bir tablo oluturunuz.

8/13.02.2012 16:19:00

16

C Programlama Ders Notlar

Deiken Tanmlama Kurallar


Deiken, bir programda deiik zamanlarda deiik deerler tutan bellek
birimleridir. Bir deiken, programlar iin ok nemlidir. nk
matematiksel, alfabetik vb. tm ilemler bu deikenler zerinde yaplr ve
sonular bu deikenler zerinde tutulur. Her programlama dilinde
deikenler, ilerinde saklayaca bilginin trne gre snflandrlr.
Deikenler haricinde bir bilgisayar programnda sabitler bulunur. Bu
sabitler yine trlerine gre snflandrlr ancak ifade ettikleri deer sabittir.
Deiken Tanmlarnda deiken listesi, deikenin tr ve gerekiyorsa ilk
deerler verilir.

Sabitler
Bir Program ierisinde kullanlan tm alfabetik ve saysal deerler sabit
olarak adlandrlr. Bu adan sabitler saysal ve alfabetik sabitler olarak
ikiye ayrlr.
SABTLER
SAYISAL SABTLER
TAM SAYILAR
KESRL SAYILAR
8
12.45
12
3.345e+03
12564 gibi
72.0 gibi

ALFASAYISAL SABTLER
"Ekonometri Blm"
"nn niversitesi"
"4.56" Gibi

Dikkat edilirse alfa saysal sabitler -"-(Trnak) karakterleri arasnda


yazlarak ifade edilirler. Trnak ierisinde yazlan her ey Alfa saysal sabit
olup bu deerleri aritmetik ileme sokmak ya da bunlar bir say gibi
deerlendirmek mmkn deildir. Trnak iindeki ifade her ne kadar say
olsa da aslnda o bir alfa saysal ifadedir. ki harf veya daha fazla harften
oluan alfabetik sabitler ift trnak iinde anlatlrken tek harfli sabitler tek
trnak iinde anlatlr. Ekranda belki grnmeyen ancak zel etkileri olan
bir takm karakterlerimizde iki harf gibi grnseler de tek karakterlik
deikenler grubunda ele alnrlar ve tek trnak iinde yazlrlar. \n, \t,
\0, \\ \ \ gibi. Ayrca \ddd eklinde yazlan bir ifade aslnda ddd
deeri ile ifade edilen sradaki karakteri anlatr. rnein \014 FormFeed
karakterini anlatan bir sabittir.
Sekizli ve Onaltl gsterimde tutulan sabitlerin de belirtilmesi gerekebilir.
Herhangi bir deerin nndeki 0 (sfr) sekizli bir sabiti anlatr. 0x eklinde
balayan bir say ise on altl bir sabiti ifade ediyor demektir. rnein 31
deeri onlu bir sabiti anlatrken 037 sekizli bir sayy anlatyor demektir.
Ve 0x15 gibi bir say da on altl bir sabiti anlatyor demektir.

8/13.02.2012 16:19:00

17

C Programlama Ders Notlar

\0 sabiti bir karakter katarnda katarn sonland noktay gsteren zel


sfr deerli karakterdir.
Sabit ifade sadece sabit deerleri anlatan ifadelerdir. Bu ekildeki ifadeler
derleme aamasnda hesaplanrlar. alma zaman iin byle bir tanmn
etkisi bulunmaz. Hatta derleyici derleme aamasnda ilgili sabit tanmlarn
yerine sabit deerleri yerletirerek derleme ilemine devam eder.
#define MAXSAT 1250
char satirlar[MAXSAT+1]; ifadesinde define ile yaplan tanmda ad
MAXSAT olan sabite 1250 deeri yklenir ve aslnda derleyici MAXSAT
grd tm yerlere 1250 yazar ve gerekiyorsa hesap yapar ve sonra
derler.

Deiken Trleri
C'de Temel olarak alfa saysal ve saysal deiken trleri bulunmaktadr.
Aslnda yukardakine benzer bir tablodan bahsetmek mmkn. Ancak
saysal deiken trleri sayca daha fazladr.
C'de Bir deiken Tanmlamak iin Genel olarak u biim kullanlr:
Tr_ad Deiken_ad1 [,Deiken_ad2[...]];
Burada Tr_ad ile verilen bilgi C Deiken trlerinden biridir. Deiken ad
ise sizce isimlendirilecek olan ihtiyacnza cevap verecek bir veya daha
fazla deikendir. Deikenler birden fazla olacak ise virgl ile
ayrlmaldrlar. Sonuna noktal virgl konulmas zorunludur.

Deiken Adlandrma Kurallar


Bir deikene isim verilirken harf ile balamanz gerekmektedir. Sonraki
karakterler harf-rakam kark olabilir.
Deiken adlar ierisinde Trke harf olarak isimlendirebileceimiz ve
sadece Trke alfabede bulunan , , , , , , , , , , , harfleri
kullanmamanz gerekmektedir. Ayrca deikenlerinize vereceiniz isimler
ierisinde *, /, +, }, ], gibi zel simgeler ve boluk karakteri bulunamaz.
Boluk Karakteri yerine _ -alt tire- sembol kullanlabilir.
C iin ayrlm szck olarak kullanlan ifadeler deiken ad olarak
kullanlamaz.

Alfa saysal Deikenler


char deiken_adi;

8/13.02.2012 16:19:00

18

C Programlama Ders Notlar

Kuralna gre tanmlanan deikenlerdir. C dilinde bu ekilde


tanmladnz bir alfa saysal deiken ierisinde sadece 1 harf
saklayabilirsiniz. Eer birden fazla harf saklanmas gerekiyorsa u tanm
kullanmanz daha uygun olacaktr:
char isim[28];
Bu tanmda ise toplam 28 karakter uzunluunda, ad isim olan bir alfa
saysal deiken tanmlanmtr.

Saysal Deikenler
Tr Ad
int
Unsigned int
long int
Unsigned long int
Float
Double
long double

Tanm ve Aklama
Tamsay deiken tanmlama iin kullanlr.
aretsiz yani Pozitif Tamsay deiken tanmlama iin kullanlr.
Uzun Tamsay (Yani daha byk tam saylar) deiken tanmlama iin
kullanlr.
aretsiz uzun Tamsay deiken tanmlama iin kullanlr.
Kesirli deiken tanmlama iin kullanlr.
Kesirli ift duyarlkl deiken tanmlama iin kullanlr.
Kesirli ift duyarlkl uzun deiken tanmlama iin kullanlr.

Tanmlamalar
Kullanlmadan nce tm deikenler tanmlanmaldr. Hatta baz deiken
tanmlar sadece kullanldklar fonksiyon iinde yer verilebilir. Bir tanm bir
tr bilgisi ve yannda bu trden olacak deiken listelerinden oluur.
rnein:
int alt, ust, adim;
char c, ad[25];
Deikenler muhtelif tanm satrlar ierisinde datlm olabilirler. Yani
yukardaki tanm u ekilde yazlm olabilirdi:
int alt;
int ust;
int adim;
char c;
char ad[25];
Bu gsterim programnzn kaynak kodlarnda daha fazla yer igal
edecektir. Ancak her deikene aklama satrlar koymak vb.
dzeltmelerin kolay yaplmasn salamak amacyla uygun bir gsterim
olabilir.

8/13.02.2012 16:19:00

19

C Programlama Ders Notlar

Deikenler tanmlandklar srada ilk deer atamas ile sfrlanabilirlerde.


Eer bir deiken tanmlama satrnda deiken adndan sonra = iareti ve
onun yanna bir sabit yazyorsanz bir deikeni herhangi bir deerle
sfrlam olursunuz.
char bs = \\
int i = 0; gibi.
Bu tr bir ifadede sz konusu deiken external ya da static tanmlanm
ise bu deer sfrlama ilemi bir kez ve program almaya balamadan
nce yaplr. Dier normal tanmlanm deikenler. Fonksiyon her
arldnda yeniden sfrlama ilemine tabii tutulurlar. Eer her hangi bir
deiken sfrlanmadan (balang deeri verilmeden) kullanlacak olursa
ilk deeri tanmsz bir deer olacaktr. External ve static deikenlerin ilk
deerleri 0 (Sfr) olarak atanacaktr. Byle olmasna ramen hangi tr
deiken ile alyor olursanz olun sizin bir deer atama ilemi yapmanz
en iyisidir.
Yeni deiken trleri ile tantka deer sfrlama ilemlerini anlatmaya
devam edeceiz.

Aritmetik fadeler
Matematiksel ilemler yapabilen deimlerdir. ounlukla bir deer
aktarma ve deer ileme blmlerinden oluur. lenen deerler bir
aktarma deimi ile (ounlukla =) baka bir deikene aktarlr. Ancak
bazen bu bulunan deer dorudan ekrana yazdrlabilir veya baka bir
noktaya ynlendirilebilir.
rnein k=5*l+2 ifadesi bir deer aktarma deimidir ve bir aritmetik
ifadedir.
Ancak Tek bana l*25/100 ifadesi de bir aritmetik ifadedir. Bir aritmetik
ifade ierisinde saysal deikenler, saysal sabitler ve aritmetik
operatrler yer alr.

Aritmetik Operatrler
C dili aritmetik operatrler yn ile ok zengin bir dildir. lemleri
kolaylatran bir ok ifadeyle karlamak mmkndr. kili (Binary)
operatrler +,-, /, * ve % operatrleridir. Tekil (Unary) operatrler ise ve + olarak karmza kmaktadr. Tamsay blme yapldnda elde edilen
sonucu tamdr. Kesirler kesilip atlr. X % Y ilemi Xin Yye blmnden
kalan bulur. rnein artk yl 4e tam blnebilen, fakat 100e tam
blnemeyen ancak 400e tam blnebilen yllardr.

8/13.02.2012 16:19:00

20

C Programlama Ders Notlar

if (yil %4 == 0 && yil % 100 != 0 || yil % 400 == 0)


artk yldr
else
artk yl deildir.
% operatr float ve doublea yani kesirli deerlere uygulanamaz.
+ ve operatrleri ayn ncelie sahiptir. Ancak bu operatrlerin ncelii
*, /, % operatrlerinden daha dktr. aret deitirme operatr olan
en ncelikli ilemdir. E ncelikli operatrler soldan saa doru ilenirler.
Ancak parantezler kullanlarak ilem ncelikleri deitirilebilir. Genelde a +
(b + c) ilemi (a + b) + c ilemi ile ayn sonucu retir. Ancak bazen
deiken ierisine deerin smamas ve alt tama veya st tamadan
dolay bu deerler birbirine eit olmayabilir.

Mantksal ifadeler
Sonucunda doru ya da yanl deer retilen ifadelere mantksal ifade
denir. Ancak C dili asndan zellikle doru ya da yanl diye bir kavram
bulunmaz. Onun yerine 0 ve 0'dan farkl deerler sz konusudur. Bu
bakmdan 0 deeri yanl olarak alglanmaldr. Dier deerler doru
olarak alglanmaldr.
Bu sebeple bir C Mantksal ifadesi aslnda herhangi bir saysal deer'dir ve
illa karlatrma operatrleri veya mantksal operatrlerle ifade edilmi
olmak zorunda deildir. C dilinin bu zelliini bir ok program parasn
incelediinizde grmeniz mmkndr.
if (1)
printf("Merhaba\n");
else
printf("Yanl\n");
ifadesinde ekrana her halkarda Merhaba yazlacaktr. nk 1 deeri
mantksal doru deerini de tamaktadr.

Karlatrma leleri ve Mantksal


Operatrler
Karlatrma ileleri
ki Deeri birbirleri ile karlatrp mantksal doru ya da mantksal yanl
deerlerinden birini elde eden operatrlerdir. Bu iki deerin birbirine gre
eitlik, byklk veya kklk gibi ilgilerini karlatrr.
Op. Aklama

8/13.02.2012 16:19:00

rnek

21

C Programlama Ders Notlar

>
<
>=
<=
==
!=

Operatrn solundaki deer sandaki deerden byktr.


Operatrn solundaki deer sandaki deerden kktr.
Operatrn solundaki deer sandakinden byk ya da eittir.
Operatrn solundaki deer sandaki deerden kktr.
ki deer biri birine eittir
ki deer biri birinden farkldr.

k>123
k<123
k>=123
k<=123
k==123
k!=123

Bu deer karlatrma ilemleri ya saysal deerler iin ya da alfa saysal


tek karakterler iin geerlidir. ki alfa saysal dizenin karlatrlmas iin
birtakm fonksiyonlarn kullanlmas gerekmektedir. Tek karakterler ise
'Tek trnak' simgeleri arasnda yazlrlar.
ncelik olarak tm karlatrma operatrleri ayn ncelie sahiptir. Ancak
tahmin edeceiniz gibi karlatrma ilemlerinin ncelii aritmetik
operatrlerinkinden dktr. Yani karlatrma ileminde ncelikli olarak
var ise aritmetik ilemler gerekletirilir.

Mantksal Operatrler
Mantksal Operatrler birden fazla mantksal ifadeyi biri birine balamak
iin kullanlabilecek mantksal deimlerdir. Bu deimler ve, veya, deil
ilemlerine karlk gelen ifadelerdir.
Op. Aklama
rnek
ve operatr. ki Mantksal ifadenin de doru olmasn gerektiren
operatrdr. Yani iki farkl mantksal ifade ayn anda doru deil
ise elde edilecek sonu yanl olmaktadr.
P
Q
P && Q
&&
(k>123) && (k<321)
1
1
1
1
0
0
0
1
0
0
0
0
veya Operatr ki Mantksal ifadeden sadece birinin doru
olmasn gerektiren operatrdr. Yani iki farkl mantksal ifadeden
en az biri doru ise elde edilecek sonu doru aksi halde sonu
yanl olmaktadr.
P
Q
P || Q
||
(k>123) || (k<321)
1
1
1
1
0
1
0
1
1
0
0
0
deil operatr. Bir mantksal ifadenin mantksal deilini elde
!
eden operatrdr. ! (k>=123) eklinde kullanlr ve k<123
! (k>=123)
ifadesine edeerdir.

8/13.02.2012 16:19:00

22

C Programlama Ders Notlar

Bu ilemlerde ncelik soldan saadr. Hesaplama; doru yada yanl


deerin bulunduu anda; eer deer ne yaplacan belirleme iin yeterli
ise durdurulur. Bu kriterler alan bir program yazmak iin nemlidir.
rnein bu tanm netletirecek bir komut inceleyelim
For ( i=0; i<lim-1 && (c=getchar()) != \n && c !=EOF;++i) s[i]=c;
Bu rnekte yeni bir karakter okumadan nce tampon sahada (s dizgisi)
yeterli yer olup olmad denetlenmelidir. O nedenle i<lim-1 kontrol ilk
yaplr. Eer bu kontrol yanl sonu verirse daha fazla karakter
okumamaldr. Ve program sonraki admlardan devam edebilmelidir.
Benzeri bir ekilde c iine okunan deer EOF karakteri olmamaldr yada
satr sonu iareti olmamaldr. && ileminin ncelii || ileminden
yksektir. Bu nedenle i<lim-1 && (c=getchar()) != \n && c
!=EOF;++i tarzndaki ilemlerin ek parantezlere ihtiyac bulunmaz. Ancak
!= ileminin ncelii deer atamadan yksek olduu iin parantezlere
ihtiya vardr.
(c=getchar()) != \n ilemi istenilen sonuca ulamamz salar.
! operatr mantksal doru deerini mantksal yanla veya mantsal
yanl mantksal doruya evirir.

Tr Dnmleri
Eer bir ilemde ilenen deerlerin trleri farkl ise genel bir ortak tre
dntrlr ve yle ilem yaplrlar. Bu dnmde u kurallar uygulanr.
Genelde otomatik olarak yaplan tek dnm ilemi tamsay deerin
kesirli deere dntrlmesidir. rnein f + i ilemi srasnda i kesirli
sayya evrilir. Ancak bunun yan sra bir kesirli deiken/deer dizilerde
indis deeri olarak kullanlrsa otomatik dnm gereklemez.
ncelikli olarak; char ve int trleri rahatlkla biri biri iinde aritmetik
ifadelerde kullanlabilirler. Her char otomatik olarak bir int deerine
dntrlr. Bu bir takm karakter ilemlerinde inanlmaz kolaylklar
salar. Ayrca karakter dizilerini integer deere eviren atoi fonksiyonu
tanmlanmtr. Karakterler zerinde aritmetik ilem yapan bir rnek
byk harfi kk harfe evirmek ya da tersi ilemidir.
char ch;
if (ch>=a && ch<=z)
ch-=32;
ifadesi ch iindeki harfi kk harf ise byk harfe dntrr.
Altrma 2

8/13.02.2012 16:19:00

23

C Programlama Ders Notlar

Yukarda bir blm verilen program parasn dier C zellikleri


kullanlarak tmleik bir C Program haline dntrnz.
Altrma 3
Yukarda bir blm verilen program parasndan elde ettiiniz program
Byk harfleri kk harfe evirecek ekilde oluturunuz.
Bu ilem ASCII karakter kmesi ve bu kmenin zelliinden kaynaklanr.
ASCII karakter kmesinde a ile A harfleri arasnda 32 fark vardr.
Char ve short tanmlar int tre evrilir float trler doublea evrilir.
Eer trlerden biri double ise dieri de double evrilir ve sonu double
olarak bulunur.
Eer trlerden bir long ise dier tr longa evrilir ve sonu long olarak
bulunur.
Trlerden bir unsigned ise dieri de unsigned tre evrilir ve sonu
unsigned olarak bulunur.
Dier durumlarda ilenenler int trdedir ve sonu int olarak bulunur.
Sonu olarak baz durumlarda da tr dnmleri zorunlu olarak
program/programc tarafndan yaplmaldr. Bu durumda
(tr-ad) ifade
tanm ile ifade ile belirtilen deerler istenilen tre dntrlrler. Bu
ileme cast denilir.

Artrma ve Eksiltme operatrleri


C dilinde deikenlerin deerini artran veya eksilten allmadk iki
operatr bulunur. Arttrma operatr ++ ilemi yanndaki deikenin
deerini bir arttrrken eksiltme operatr olan yanndaki deikenin
deerini bir eksiltir. Deikenlerin deerlerini ++ operatr ile arttrrz.
Allmadk dier bir konu ise ++ veya operatrlerinin hem nek
(deikenden nce ++n) hem de sonek (deikenden sonra n++) olarak
kullanlabiliyor olmasdr. Her iki durumda da nin deeri bir arttrlr. Fakat
++n ileminde nin deeri kullanlmadan nce arttrlrken; n++ ileminde
n deeri nce kullanlr. sonra 1 arttrlr. Bu durumda unu syleyebiliriz:
nin deeri 5 olmak kaydyla
X=n++ ilemi sonucunda xin deeri 5 n'in deeri ise 6 olurken

8/13.02.2012 16:19:00

24

C Programlama Ders Notlar

X=++n ilemi sonucunda xin deeri 6 ni deeri ise 6 olur. Grld


zere her iki durumda da nin deeri ayn olurken xin deeri
deimektedir. ++ veya operatrleri sadece deikenlerle birlikte
kullanlabilir. Yani x=(+j)++ uygun bir kullanm deildir.

Mantksal Bit operatrleri


C dilinde bir grup operatr bit dzeyinde ilem yapabilmektedir. Bu
operatrler float ve double trleri zerinde ilem yapamamaktadr.

& Bit dzeyli VE ilemi


| Bit dzeyli VEYA ilemi
^ Bit dzeyli XOR ilemi (Dlayan ya da)
<< bitleri sola kaydr
>> bitleri saa kaydr

& operatr ounlukla saysal bir deer zerinde istenilen bitlerin


maskelenmesini salar. | operatr bu ilemin tersinin yaplmasn salar.
Bu operatrlerin && ve || ile kartrlmamas gereklidir.

Deer Atama ifadeleri


i=i+1 eklindeki ifadeleri C dilinde i+=2 biiminde anlatabiliriz. Burada +=
eklinde bir deer atama operatr kullanlmtr. kili operatrlerin
hepsinin bu ekilde deer atama deimleri bulunur. yle ki;
ifade1 op= ifade2 ifadesi ifade1 = ifade1 op ifade2 eklinde anlatlabilir.

Koullu fadeler
if (a>b)
z=a;
else
z=b;
ifadesi a veya b deerlerinden byk olann deerini bulan ifadedir. Bu
ilemin karl olarak u ekilde bir ifade ile yazmak mmkn olmaktadr.
z=(a>b) ? a : b;
bu ifadenin genel gsterimi u ekildedir:
(KOUL) ? ifade2 : ifade3
Bu gsterimde ncelikle KOUL mantksal ifadesi hesaplanr. Eer
mantksal olarak doru ise veya 0dan farkl bir deer hesaplanrsa ifade2
ile gsterilen ilemler; deilse de ifade3 ile gsterilen ilemler yaplr.
8/13.02.2012 16:19:00

25

C Programlama Ders Notlar

Giri k lemleri
Giri k Komutlar bir Programlama dili iin olduka nemlidir. nk
oluan ktlarn kullanc veya programcya ulamas gerektii gibi
kullancnn da Programa veri vermesi gerekebilir. Ancak gerekte
giri/k imknlar C dilinin bir paras deillerdir. C Programlama dilinde
Giri k ilemleri gerekte komutlar ile deil stdio.h ktphanesinde
bulunan fonksiyonlar ile gerekletirilir. Bu blmde standart G/
ktphanesinde yer alan ve C programlarnda kullanlan fonksiyonlardan
bahsedeceiz. Fonksiyonlar G/ ilemlerini kolaylkla yapabilecek
tanmlara sahipler. Uygulamann ne kadar kritik olmasna bakmakszn tm
programclar bu rutinleri rahatlkla ve etkin bir ekilde kullanabilirler. Ve
son olarak bu fonksiyonlar tanabilir ekilde tasarlanmlardr. Yani
herhangi bir programc yazd C programn C derleyicisinin bulunduu
herhangi bir iletim sistemi platformuna tayabilir.
Bu blmde G/ ktphanesi iinde yer alan tm fonksiyonlar
anlatamayacaz. Bizim iin daha nemlisi youn kullanlan fonksiyonlarla
tanmak ve bir C programnn iletim sistemi evre ortamyla etkileimini
salayacak kurallardan bahsetmektir.

Standart Ktphaneye Eriim


Standart G/ ortamna mracaat eden tm C program kaynak kodlarnda
aadaki satr bulunmaldr:
#include <stdio.h>
Bu satr bir C programnn en balarnda yer alr. stdio.h dosyas iinde
G/ ktphanesi tarafndan kullanlan bir takm makrolar ve deikenler
tanmlanmtr. <> iaretlerini ktphane adnn etrafnda kullanmay
iaretlerini kullanmaya tercih ederiz. nk derleyiciye, bu ktphane
dosyasnn sistem tarafndan tanmlanan include klasrnde (balk
dosyalarnn bulunduu klasrde) olduunu belirtmek isteriz. Eer
iaretleri kullanlm olsayd bu ktphane dosyas klasrn iindedir
anlamna gelecektir.

Standart Giri, Standart k ve Hata k


noktalar
Bir C Programnda oluan deerler standart olarak ekrana yazlr. Bu
birime standart k birimi denir (Standart Output stdout).
Bir C Programnda girilecek deerler standart olarak klavyeden okunur. Bu
birime standart giri birimi denir (Standart Input  stdin).

8/13.02.2012 16:19:00

26

C Programlama Ders Notlar

Bir C Programnda oluan hatalar standart olarak ekrana yazlr. Bu birime


standart hata birimi denir (Standart Error  stderr).
Bir giri k fonksiyonu kullanldnda bu fonksiyonun zelliine gre
standart Giri veya Standart k ortamndan deer iletiiminde
bulunulur.

Standart Giri k Fonksiyonlar


En basit giri yntemi tek bir karakterin standart giri biriminden
okunmasdr. getchar() fonksiyonu giri biriminde sradaki dier karakteri
dndrr. Birok iletim sistemi ortamnda C programlama dili
terminalden/klavyeden deer okuyacana baka bir dosyadan karakterleri
okuyabilir. Eer bir programda getchar() fonksiyonu kullanlm ise u
ekilde yazlan bir komut satr
prog <girisdosyasi
prog adndaki programn ekran yerine girisdosyasi adl dosyadan girdileri
okuyacaktr. Burada < iareti girdinin ynlendirildii ve dier bir doyann
girdi dosyas olduunu anlatr. Eer bu ekildeki bir programa veriler
baka bir programdan gelecek ise boru (pipe |) ilemi yaplarak sorun
halledilebilir. yle ki:
baskaprog | prog
komut satr iki program da altrr ve baskaprog adndaki programn
ktsn prog adndaki programa girdi olarak yollar.
Bir giri dosyasnda dosya sonu olunca getchar fonksiyonu EOF deerini
dndrr. EOF deeri Standart Ktphane iinde 1 olarak tanmlanmtr.
Ancak programda EOF tanm kullanlmas tanabilirlik asndan daha
uygundur.
k ilemi iin putchar( c ) fonksiyonunu kullanabiliriz. Bu fonksiyonu tek
bir karakteri standart k birimine yazacaktr. k karakterleri >
iareti ile ynlendirilebilir. rnein:
prog > cikisdosyasi
eklindeki komut satrnda prog isimli programn kts terminale
yazlacana cikisdosyasi isimli dosyaya yazlacaktr. Eer bu programn
kts baka bir programa gnderilecekse boru iareti kullanlabilir.
Bunun haricinde dosyalar zerinde Okuma/Yazma yapan komutlar ilerdeki
konularmzda ele alnp rneklenecektir. Bu komutlar da iki farkl
kategoride incelemek hi de yanl olmasa gerek.

8/13.02.2012 16:19:00

27

C Programlama Ders Notlar

char c;
...
c=getchar();
Biiminde gsterilebilecek ekilde yazlan komutumuz standart giri
biriminden bir karakter okur. Yada
char c;
...
c=getc(stdin); eklinde kullanldn grebilirsiniz.
char c;
...
/* Tek karakter yazar */
putc(c,stdout);
putchar(c); eklinde yazlr ve c ile ifade edilen tek karakteri standart
k biriminden yazar.
rnek 1
Aadaki Program Klavyeden girilen harfleri ekrana szerek yazmaktadr.
yle ki klavyeden girilen harflerden a harfini ekrana yazmamaktadr ve
bu ilemi enter tuuna baslncaya kadar devam ettirmektedir.
#include <stdio.h>
main(){
char c;
while((c=getchar())!='\n')
if (c!='a') putchar(c);
printf("\n");
}
Bir ok program tek bir giri kaynandan okur ve tek bir k noktasna
bu bilgileri yazar. Bu amala da getchar, putchar veya printf gibi G/
fonksiyonlar kullanlr.
rnek 2
Aadaki rnek klavyeden girilen karakterleri kk harfe evirerek
ekrana yazan bir programdr.
#include <stdio.h>
main(){
int c;
while((c=getchar()) != EOF)

8/13.02.2012 16:19:00

28

C Programlama Ders Notlar

putchar(isupper( c ) ? tolower( c ) : c);


}
Bu rnekteki isupper ve tolower makrolar stdio.h ktphanesinde
tanmlanm olan fonksiyonlardr. Bu fonksiyonlardan isupper kendisine
gnderilen karakterin byk harf olmas durumunda doru deer yanl
olmas durumunda yanl deer dndrr. Tolower fonksiyonu ise
kendisine gnderilen karakteri kk harfe evirir.

Biimlendirilmi klar
stenilen deerlerin uygun ekilde ve uygun yerlerde grnebilmesi iin
Biimlendirilmi k Komutu kullanlabilir.
printf("Biim Tanmlar ve Sabit
ifadeler"[,Deiken1[,Deiken2...]])
eklinde kullanlan komut bu ama iin son derece uygundur. Bu
Fonksiyon Sabit ifadelerin ve deikenlerin belirlenmi biim tanmlarna
gre ekrana yazlmasn salar. Biim tanmlar ve Sabit ifade dediim
karakter dizisinde iki farkl trde bilgi bulunur. Bunlar normal karakterler
ile ifade edilen ifadeler ve c iin bir anlam tayan dnm ifadeleri. Bu
dnm ifadeleri istenilen bir deikenin parametre olarak yazlm ise
istenilen bir biimde ekrana yazlmasn salar.
printf("Merhaba %s u anda Hava %d scaklnda\n", ad, hava);
Bu deyim Merhaba Ahmet u anda Hava 23 scaklnda gibi bir
ifadeyi ekrana yazacaktr. Bu satrda yer alan ve % ile balayp bir
dntrme karakteri ile biten ifade dnm yapan biim tanmdr. %
iareti ile dntrme karakteri arasnda yer alan blmde u karakterler
bulunabilir:

- iareti : yazlacak ifadenin sola yanak yazlmasn salayacaktr.


Saysal bir deer : yazlacak ifadenin ekranda ka basamaklk alana
sacan belirleyen saysal bir deerdir. Eer ifade belirlenen yere
samayacaksa sol taraftan krplacaktr. . iareti : alan kesirli
saysal alandan ayran nokta.
l iareti : Biim tanmnn uzun olup olmadn veren bir tanmlayc .

Biimlendirme tanmlar ya da dntrme karakterleri iin aadaki


tabloda yer alan tanmlar kullanlmaktadr.
Biim

Tanm

Karlk olarak gelen deikenin deerini say olarak ekrana


yazar.

Karlk olarak gelen deikenin deerini 8'lik say olarak ekrana

8/13.02.2012 16:19:00

29

C Programlama Ders Notlar

yazar.
x

Karlk olarak gelen deikenin deerini 16'lk say olarak ekrana


yazar.

Karlk olarak gelen deikenin deerini iaretsiz bir deer


olarak ekrana yazar.

Karlk olarak gelen deikenin deerini tek bir karakter olarak


ekrana yazar.

Karlk olarak gelen deikenin deerini bir karakter dizesi


olarak ekrana yazar. Bu karakter dizesi dize sonu anlamna gelen
null karakteri bulununcaya kadar yazlr.

Karlk olarak gelen deikenin deerini bilimsel gsterimdeki


say olarak ekrana yazar.

Karlk olarak gelen deikenin deerini kesirli say olarak


ekrana yazar.

%e veya %fden ksa olann kullanmasn salar

Eer % iaretinden sonra kullanlan iaret dntrme karakteri deil ise


ve normal bir karakter olarak % iareti kullanlacaksa %% eklinde
kullanlmaldr
Kullanlan zel Karakterler
\n

Yeni Satr Karakteri

\t

TAB Karakteri

\\

\ Karakteri

\"

" (Trnak) Karakteri

Biimlendirilmi Giriler
stenilen Deer ve ifadelerin bilgisayara girilmesini salar. Kullanm olarak
printf ile ayn artlar salar. Ve bilgisayara giri yn ile alr.
scanf("Biim Tanmlar"[,Deiken1[,Deiken2...]])
eklinde kullanlr. scanf standart giri biriminden karakterleri okur ve
verdiiniz biim tanmlarna gre okunan karakterleri yorumlar ve
deerleri ilgili deikenlere yerletirir. Ancak dikkat edilmelidir ki Deiken
olarak ifade edilen deikenlerin adresleri bu fonksiyona gnderilmelidir.
Burada deikenleri her biri biim tanmlar ile belirlenen tanmlara birebir
rtmek zorundadr. printf'de grlen tm biim tanmlayclar scanf iin
de geerlidir. Deikenler ise adresleri ile verilmelidir. Eer deiken basit
deiken ise bu adres deeri "&" operatr ile bulunmaldr. Eer deiken
karakter dizesi gibi bir deiken ise sadece deiken adn vermek yeterli
olacaktr.

8/13.02.2012 16:19:00

30

C Programlama Ders Notlar

rnek 3
Bu Program klavyeden farkl zelliklere sahip deerler okuyup farkl
zellikler ile ekrana yazmaktadr.
#include <stdio.h>
#include <string.h>
main(){
char ifade[100];
int k,uzunluk;
float kesir;
char cevap;
printf("Ad, Scaklk, d1, kesir, cevap deerlerini
giriniz?\n");
scanf("%s %d %d %f %c", ifade, &k, &uzunluk, &kesir, &cevap));
/* Bu komut aralarnda boluk olmak zere bir dizi deeri
karlk deikenlere aktaracaktr.*/
printf("Sonu\n%s\n%d\n%d\n%f\n%c", ifade, &k, &uzunluk,
&kesir, &cevap));
}
Altrma 4
int k;
char ad[20];
scanf(....,&k,ad);
eklinde yazlm bir ifade de .... ile belirlenmi yere ne
konmaldr.
Altrma 5
Klavyeden girilecek iki tam say ve bir kesirli say iin yazlmas gerekecek
scanf fonksiyonunun parametreleri nelerdir?

Bellek Biim dnm fonksiyonlar


Scanf ve printf fonksiyonlarnn benzeri olarak sprintf ve sscanf eklinde
fonksiyonlar tanmlanmtr. Ancak bu fonksiyonlar kty ekrana
yazacana bir karakter dizesine yerletirir veya girdii klavyeden
okuyacana bir karakter dizesinden okur. Fonksiyonlar tanmlar u
ekilde verilebilir:
sprintf(karakter dizesi deikeni, Biim ve sabit tanmlar, deiken
listesi)
sscanf(karakter dizesi deikeni, Biim tanmlar, deiken listesi)

8/13.02.2012 16:19:00

31

C Programlama Ders Notlar

Karakter dizesinin Okunup-Yazlmas


Bazen tek bir karakter veya tek bir kelime deil de Enter tuuna
baslncaya kadar ya da satr sonu iaretini buluncaya kadar tm
yazlanlarn okunmas gerekebilir. Bu nedenle u fonksiyonlar kullanmak
yerinde olacaktr.
char ad[30];
...
gets(ad);//Bir karakter dizesini klavyeden okur
puts(ad);//Bir karakter dizesini ekrana yazar
rnek 4
Bu rnek'te Klavyeden girilen bir karakter dizesinin tersi bulunarak ekrana
yazlmaktadr.
#include <stdio.h>
#include <string.h>
main(){
char ifade[100];
int k,uzunluk;
puts("fadenizi Giriniz\n");
gets(ifade);
uzunluk=strlen(ifade);
for(k=uzunluk-1;k>=0;k--)
putchar(ifade[k]);
putchar('\n');}

nemli bir takm fonksiyonlar


stdio.h ktphanesi iinde kullanl olabilecek bir takm fonksiyonlar
bulunur.

Karakter Snama ve dntrme fonksiyonlar


isalpha( c ) c karakter bilgisi tayorsa 0dan farkl bir deer deilse 0
dndrr.
isupper( c ) c karakteri byk harf ise 0dan farkl bir deer deilse 0
dndrr
islower( c ) c karakteri kk harf ise 0dan farkl bir deer deilse 0
dndrr

8/13.02.2012 16:19:00

32

C Programlama Ders Notlar

isdigit( c ) c rakam bilgisi tayorsa 0dan farkl bir deer deilse 0


dndrr.
isspace( c ) c boluk bilgisi tayorsa 0dan farkl bir deer deilse
dndrr.
Toupper ( c ) c karakterini byk harfe evirir.
Tolower ( c ) c karakterini kk harfe evirir.

ungetc
standart giri ortamndan veya herhangi bir dosyadan okunmu karakteri
geri o ortama yazan fonksiyondur.
ungetc(c, dosyaisaretcisi);

8/13.02.2012 16:19:00

33

C Programlama Ders Notlar

Program Ak ve Program Ak
Denetimi
C Programlarnda Program satrlar dier programlama dillerinde olduu
gibi yukardan aaya icra edilirler. Her komut sonunda ; (noktal virgl)
karakteri bulunur. Blok yapl bir dildir ve bu balamda deikenler
tanmlandklar blok ierisinde etkilidirler. Birden fazla komutlar {...}
simgeleri arasnda ele alnarak ek bir komutmu gibi bloklanabilir. Belki
daha nce tantnz komutlar burada daha ayrntl bir ekilde
incelemeye alacaz.

Komutlar ve Bloklar
C Dilinde Noktal virgl komut sonlandrma belirtecidir.
x=0;
i++;
printf(.....);
yukardaki her bir ; komutun bittiini ve dier komuta geildiini
sembolize eder. Komutlar bloklamak iin {...} kme parantezleri
kullanlmaktadr. Bu parantezler arasnda yazlan komutlar ka tane olursa
olsun tek bir komutmu gibi alglanr. if, else, for, while gibi komutlarn
hemen peinden ; kullanlmaz. Ayrca bir blou bitiren } iaretinin
peinden de noktal virgl konulmaz. Bu da zmlemede istenilen
ksmlarn kapal bir kutu imi gibi gsterilmesini salar.

If-Else komutu
Karar vermeyi salayan Komut'tur. Temel Yaps
if (mantksal_ifade)
Komut-1;
else
Komut-2;
Bu yapda else ksm seimliktir. Yani kullanlmasa da olur. Komutun
almas u ekilde izah edilebilir:

ncelikle mantksal ifade hesaplanr ve bir deer bulunur.


Bu deer 0 haricinde bir deer ise (yani mantksal ifade doru ise)
Komut-1 ile gsterilen komut uygulanr

8/13.02.2012 16:19:00

34

C Programlama Ders Notlar

Bu deer 0 ise (yani mantksal ifade yanl ise) else'den sonraki


komut-2 ile gsterilen komut uygulanr.
Eer else ksm yok ise ve deer 0 ise Komut-1 uygulanmadan ;'den
sonraki komutlardan devam edilir.

Gerekte if komutu bir saysal deikenin deerini kontrol ediyorsa bir


takm ksaltmalar kullanmak mmkndr. rnein;
if (deiken !=0) ifadesi yerine
if (deisken) yazlabilir. Ancak tercihen birinci yazlan daha anlalr ve
allagelmi olandr.
Bu yapda Komut-1 veya Komut-2 ile gsterilen yerlerde birden fazla
komut uygulanmak zorunda ise bu komutlar kme parantezleri ierisine
alnp tek komutmu gibi gsterilebilir.
Bu yapda else ksm seimlik olduu iin i ie if yazmlarnda sorunlarla
karlaabilirsiniz. zellikle bir if komutunun else tmcesi yok ise belirsizlik
ortaya kar. Bu durumda else son ife aittir. Daha dorusu ifler iten da
doru kapatlr. yle ki:
if (n>0)
if (a>b)
z=a;
else
z=b;
komut topluluunda else komutu ikinci sradaki if komutuna aittir. Daha
anlalabilir olsun diye komutlarn yazm srasnda girinti kntlara dikkat
edilmitir. Eer anlatlmak istenen bu deil de baka bir sra idiyse kme
parantezleri kullanlabilirdi.
if (n>0) {
if (a>b)
z=a;
}
else
z=b;
baz durumlarda bu belirsizlikler hatalara dahi neden olabilir. yle ki
if (n>0)
for(i=0; i<n; i++)
if (s[i]>0) {
printf(....);
return(i);
}
else
/* Yanl fade */
printf(n negatif olamaz \n);

8/13.02.2012 16:19:00

35

C Programlama Ders Notlar

Girinti kntlarn konumuna gre yaptnz ile derleyicinin anlad farkl


olacaktr. Derleyici ikinci if komutunun else komutunu yazdnz sanacak
ve kodu buna gre retecektir.Bylece programnzda ciddi mantksal bir
hata yapm olursunuz. Bu tr bir hatay ayklamak olduka zordur.
rnek 5
Bu rnekte klavyeden girilen iki saysal deer karlatrlyor, byk
olandan kk olan karlyor ve sonu ekrana yazlyor.
#include <stdio.h>
#include <string.h>
main(){
int a,b;
printf("A iin bir deer giriniz?");
scanf("%d",&a);
printf("B iin bir deer giriniz?");
scanf("%d",&b);
if (a>b)
printf("A-B=%d\n", a-b);
else
printf("B-A=%d\n", b-a);
}

Else if komutu
Temel yaps u ekildedir.
if (koul)
komut;
else if (koul)
komut;
else if (koul)
komut;
else
komut;
Bu ekilde oklu seim eklinde bir dizi if deimi arasndan bir tanesi
seilecektir. Koullar sra ile kontrol edilir, koullardan ilk doru olann
iliiindeki komut icra edilir. Bu doru koulun bulunup altrlmasndan
sonra tm bloun almasn bitirir. Her bir komut ile ifade edilen blm
tek bana bir komut olabilecei gibi kme parantezleri arasndaki bir ok
komut ta olabilir.

8/13.02.2012 16:19:00

36

C Programlama Ders Notlar

Komutlarn sonundaki else deimi koullardan hibirinin gerekleememesi


durumunda icra edilir. Bazen koullardan hibirinin doru olmad
durumlarda yaplacak deiik bir komut bulunmayabilir. Bu durumda bu
satrlar (en son else satr) yazlamayabilir. Bazen de bu durum ile asla
karlalmayacaksa imkansz durumu grebilmek iin yazlabilir.

Etiketler ve goto komutu


C iin hi tercih edilmeyen bir komut olan bu komut program akn bir
noktadan dier bir noktaya ynlendirir. C Programlama dili ok etkili blok
yapl bir dildir. Gl Dng Komutlar, Fonksiyonel yap ve hatta harici
ktphaneler oluturup bunlar programa balama ileminden dolay byle
bir komuta kesinlikle ihtiya bulunmamaktadr. Hatta onsuz program
yazmann Cde ok kolay olduunu syleyebiliriz.
Yine de eski Programlama alkanlklar olanlar iin bu komut kullanlabilir
bir komut olarak C dili ierisinde vardr.
etiket:
.......
goto etiket;
eklinde kullanlmaktadr. ncelikle goto komutu ile saplacak veya
dallanlacak konuma bir ad verilir. Bu konum iin verilecek ad deiken
isimlendirme kurallarndaki gibi adlandrlabilir. Bu ad (: -iki nokta st
ste) sembol takip etmelidir. Dng oluturmak iin tercih edilmese de
belki kullanlmas gerekecek birka nokta sylenebilir. yle ki:
ie birden fazla dng olan bir yapda en d dngye ulamak iin...
Hata ayklama amacyla oluturulacak yaplarda kullanmak iin...
Zorunlu olmasa da bir grup saynn iinde aradnz bulduunuzda bu
durumu anlatabilmek iin...
Altrma 6
Klavyeden 0-Sfr girilinceye kadar girilen bir grup saynn karelerinin
ortalamasn bulacak program iin C Programlama dili ile gelitiriniz.
Altrma 7
Klavyeden girilecek iki Pozitif tam saynn OBEB (Ortak Blenlerin En
By)ini bulacak C Programn gelitiriniz. rnein elimizde 3654 ve
1365 deerleri olsun. Bu deerlerin OBEBi u ekilde bulunmaktadr.

8/13.02.2012 16:19:00

37

C Programlama Ders Notlar

3654 / 1365
1365 / 924
924 / 441
441 / 42
42 / 21

Kalan
Kalan
Kalan
Kalan
Kalan

924
441
42
21
0

Bu ilem srasn ve yineleme zelliklerini kullanarak iki saynn OBEBini


bulunuz. Bu rnekte OBEB 21 deeridir.
Altrma 8
Klavyede girilen kesirli bir sayy a/b eklinde rasyonel olarak ifade edip
ekrana yazabilecek program c ile gelitiriniz. rnein klavyeden girilecek
olan 0.5 deeri iin 1/2 deerini ekrana yazmaldr.

switch komutu
Switch Komutu birden fazla deerden seim yapmak iin kullanlabilecek
zel karar verme komutudur. ie fazla sayda if..else komutunu
kullanmay gerektiren durumlarda kullanlabilecek etkili bir karar verme
aracdr.
switch(ifade){
case sabit_deer1:
case sabit_deer2:
case sabit_deer3:
case sabit_deer4:
case sabit_deer5:
......
case sabit_deerN:
default: [Komut;]
}

[Komut1;]
[Komut2;]
[Komut3;]
[Komut4;]
[Komut5;]
[KomutN;]

rnek 6
Aadaki program bir ifade iindeki rakamlar, boluklar ve dier
karakterleri sayan bir programdr.
#include <stdio.h>
int c,i,nwhite,nother,ndigit[10];
main(){
nwhite = nother = 0;
for (i=0; i<10;i++)
ndigit[i]=0;
while ((c=getc(stdin)) != EOF )
switch ( c ){
case 0 :
case 1 :
case 2 :

8/13.02.2012 16:19:00

38

C Programlama Ders Notlar

case
case
case
case
case
case
case

3
4
5
6
7
8
9

:
:
:
:
:
:
:
ndigit[c-0]++;
break
case :
case \n:
case \t :
nwhite++;
break;
default :
nother++;
break;
}
printf(digits = );
for (i=0;i<10;i++)
printf( %d,ndigit[i]);
printf(\nwhite space = %d, other =
%d\n,nwhite,nother);
}
Bu komut ifade ile belirtilen tamsay ifadeyi hesaplar. Yukardaki rnek bu
c karakteridir. Sonrasnda bu hesaplanan deer case ile belirtilmi olan
deerlerden birine eit mi diye kontrol eder. Eer eit olan bir case
ifadesine rastlarsa onun karsndaki ve dier altndaki komutlar icra eder.
Eer burada belli bir ksm komutlarn uygulanmas bir ksmnn
uygulanmamas isteniyorsa switch deiminden break komutuyla klr.
Eer bu case deerlerinden hibiri eldeki deere eit deilse default ile
gsterilen komut uygulanr.
Her case deiminin yannda bir komut bulunmak zorunda olmad gibi
birden fazla komutu {...} ifadeleri arasna yazmadan da kullanabilirsiniz.
Ancak bu durumda komutlarn uygulamasnn bitmesini istediiniz yere
break komutunu koymay unutmamanz gerekecek.
break komutu switch bloundan hemen kmanz salayan bir komuttur.
Her bir case etiket gibi davrand iin biri karsndaki ilem
gerekletirildikten sonra dierlerinden devam eder. Devam edilmemesini
salamak amacyla break veya return deimleri ile buradan klmas
gerekir. Daha sonra greceimiz zere break komutu while, for, do
dnglerinden de klmasn salar.
Bu case deimlerinden devam edip gidilmesi kargaaya yol aacak gibi
grnse de bazen olumlu sonular olabilir. yle ki birden fazla eylemi tek

8/13.02.2012 16:19:00

39

C Programlama Ders Notlar

bir case satrnda kullanmanz mmkn olabilmektedir. Veya birden fazla


case satr iin ayn satrlarn altrlmasn salamaktadr.
yi programlama rnekleri iin son case satrndan sonra da break komutu
kullanmak gerekebilir. Mantksal olarak gereksiz grnse de bu daha sonra
buraya eklenecek yeni case satrlarna yanllkla dallanmay engelleyecek
be mantksal hatalarn oluumunu azaltacaktr.
Altrma 9
Klavyeden girilen iki say ve bir operatre gre ilem yapp sonucu ekrana
yazan bir C Program gelitiriniz.
Altrma 10
Klavyeden girilecek olan ay ve yl bilgisine gre ayn ka gn ektiini
bulacak C Programn gelitiriniz.

Dng Komutlar - while


Bir koul salanncaya kadar baz komutlarn tekrar edilmesini salayan
dng komutudur. Bu Dng komutunun znde sadece koul snama
bulunmaktadr. Deer arttrma veya ilk deer atama gibi gerekli olabilecek
dier ilemler ayrca belirtilmelidir.
while(koul)
{
komut1;
komut2;
......
}
eklinde kullanlr ve koul doru olduu srece komutlarn uygulanmasn
salar. Koul ile belirtilen ifade mantksal bir ifade olup doru olduu
srece komut1, komut2 vb komutlarn tekrar tekrar uygulanmasn salar.
Ta ki koul yanl oluncaya kadar. Koul yanl olursa veya saysal olarak 0
deerini tarsa program ak dng komutundan sonraki komuttan
devam eder.
rnek 7
Aadaki rnekte Fibonecci dizisini bir N deerine kadar ekrana yazan
program while komutu kullanlarak yazlmtr.
#include <stdio.h>
int a,b,c;

8/13.02.2012 16:19:00

40

C Programlama Ders Notlar

int n;
main(){
printf(n deerini klavyeden giriniz);
scanf(%d,&n);
a=1;
b=1;
printf(%d\n%d\n,a,b);
c=a+b;
while(c<=n){
printf(%d\n,c);
a=b;
b=c;
c=a+b;
}
}
Altrma 11
Sfr 0 girilinceye kadar klavyeden girilen tm deerlerin ortalamasn
bulup ekrana yazan C programn gelitiriniz.
Altrma 12
t=0;
while(t<10){
printf(%d\n,t);
t++;
} eklindeki bir ifadeyi for komutu ile yazmaya alnz.

Dng Komutlar - for


C Programlama dili ierisinde son derece gl bir dng komutudur. Belli
bir koul salanncaya kadar otomatik olarak artan deerlerle dng
oluturmay salar.
for(ifade1;ifade2;ifade3)
{
komut1;
komut2;
......
}
eklinde kullanlr.
Bu komut while ile aadaki gibi ifade edilebilir

8/13.02.2012 16:19:00

41

C Programlama Ders Notlar

ifade1;
while(ifade2){
komut1;
komut2;
ifade3;
}
Teknik olarak ifade olarak tanmlanm ifadelerden ifade1 ve ifade3
aritmetik ifadeleri anlatr. fade2 ise mantksal bir karlatrma ifadesidir.
Bu ifadeden her hangi biri yazlmadan pas geilebilir. Ancak bu
durumda bile noktal virgller yerlerinde kalmaldr.eer ifade1 ve ifade3
yazlmazsa ve hatta ifade2 for komutu iine yerletirilmezse ortaya kan
komut dorudur. yle ki
for(;;){
...
}
eklinde yazlan komut bir sonsuz dngy anlatr. Bu tr bir dngden
break veya return gibi bir komutla klaca kabul edilir.
Burada deiken ile belirtilen ilk ksm tek bir deer aktarma ifadesi yerine
virgllerle ayrlmak sureti ile birden fazla deer aktarma ifadesini
barndrabilir. Bu ksm bir ilk deer aktarma ifadesi olup dng
uygulanmaya balamadan nce icra edilir.
kinci ksmda kullanlan koul dngnn sonlanma kouludur. Bu koul
doru olduu srece dng yinelenir.
Son Ksmda kullanlan deer aktarma deimleri aralarnda virgl
bulunmak koulu ile birden fazla olabilir. Bu ksm ise dng iindeki
komutlarn her uygulanmasndan sonra icra edilen ilemlerdir. ounlukla
deer artran ifadelerdir.
for(x=0;x<10;x++){
printf("Sradaki Say %d\n",x);
}
rnei Sfrdan 9'a kadar saylar ekrana alt alta yazan bir program
paasdr.
Acaba nerede while nerede for komutlarn kullanmalym? Eer
deikenlere ilk deer atama ifadeleri yok ise ve dngnn ka defa
uygulanaca hakknda saysal net bir tanm sylenemiyorsa kullanc
davranlarna bal bir koul ile ifade edilebiliyorsa while komutu uygun
bir komuttur. Eer ilk deer atama ifadeleri var ve dngnn almas
konusunda saysal bir takm deerler ifade ediliyorsa for komutu daha
uygun bir komuttur. nk for komutu gerek ilk deer atamalarn
8/13.02.2012 16:19:00

42

C Programlama Ders Notlar

gerekse de koulu ilk satr zerinde gsterdii iin daha kolay anlalr ve
derli toplu olarak karmzda duruyor. Bu da dng komutumuzun
merkezilemesini ve programn kontrolnn kolaylamasn salar.
rnek 8
Bu rnekte klavyeden girilen bir N deerinin faktryeli for komutu
kullanlarak hesaplanmtr.
#include<stdio.h>
int f,n,x;
main(){
printf(n deerini giriniz);
scanf(%d,&n);
for(f=1,x=1;x<=n;x++) f*=x;
printf(Faktryel=%d\n,f);
}
Bu rnekte aslnda faktryeli hesaplayan kesim sadece for komutunun
yazl olduu satrdr.
rnek 9
Klavyeden girilecek X deerinde N deerine kadar tm doal saylar
ekrana listeleyen C Programn gelitiriniz.
#include<stdio.h>
int x,n,k;
main(){
printf(X deerini giriniz);
scanf(%d,&x);
printf(N deerini giriniz);
scanf(%d,&n);
for(k=x;k<=n;k++) printf(%d\n,k);
}
Altrma 13
Altrma 6 rneini goto komutu kullanmadan while veya for ile yeniden
yaznz
Altrma 14
Altrma 7 rneini goto komutu kullanmadan while veya for ile yeniden
yaznz
Altrma 15

8/13.02.2012 16:19:00

43

C Programlama Ders Notlar

Sadece toplam ve karma kullanarak iki sayy arpan ve sonucu ekrana


yazan C Programn gelitiriniz.
Altrma 16
Sadece toplam ve karma kullanarak iki sayy blerek blm ve kalan
bulan ve sonucu ekrana yazan C Programn gelitiriniz.
Altrma 17
Klavyeden girilecek 20 saynn tek olanlarn ayr ift olanlarn ayr toplayp
sonucu ekrana yazan bir C program gelitiriniz.
Altrma 18
n

F(x)=

x
x =1

eklinde tanmlanm bir fonksiyonda girilen n deeri iin

sonucu hesaplayan ve ekrana yazan C programn gelitiriniz. Program


yazarken kesinlikle goto komutu kullanmaynz.
Altrma 19
Klavyeden girilen bir tam saynn tm tam blenlerini bulup ekrana
listeleyen bir C Program gelitiriniz.
Altrma 20
for (x=1,f=1;x<10;x++) f*=x;
eklindeki program parasn while komutunu kullanarak yaznz
Altrma 21
x2 x4 x6
eklinde tanmlanm bir alm iin klavyeden
+

2! 4! 6!
girilecek bir x deerine gre ilk 10 terim iin sonucu hesaplayp ekrana
yazacak C programn gelitiriniz. s alma ilemi iin math.h
ktphanesindeki pow fonksiyonunu kullannz.

Cos(x)= 1

Dng Komutlar - do...while


while ve for komutlarnda dng sonlanma koulu dngnn en banda
snanr. Ancak bu nc dng komutu olan do komutu dng sonlanma
koulunu dng sonunda snar. Bu nedenle ve dng komutunun genel
grnnden dolay dng komutu iindeki komutlar en az bir kez icra
edilirler.

8/13.02.2012 16:19:00

44

C Programlama Ders Notlar

do
{
komut1;
komut2;
.......
}
while (koul);
ncelikli olarak komutlar icra edilir sonra koul snanr. Doru ise komutlar
tekrar uygulanr yani aslnda dng komutlar tekrar icra edilir. Eer ifade
yanl olmusa dng son bulur.
Tahmin edebileceiniz gibi do komutu for ve while komutuna gre olduka
az kullanlan bir komuttur. Ancak tabi ki baz durumlarda olduka etkili bir
dng komutudur.
rnek 10
Aadaki rnei inceleyelim. Bu rnekte kullanc klavyeden 0 ile 100
arasnda bir say girmeye zorlanyor. While ile yazlm olan koul inceleme
satrna dikkat ediniz. Eer x<0 veya x>100 ise dng iindeki komut
tekrar ediliyor. nk bu istemediimiz bir durum. Asl istenen kullancnn
geerli bir vize notu girebilmesidir.
#include <stdio.h>
int x;
main(){
do {
printf(0 ile 100 arasndaki vize notunu giriniz);
scanf(%d, &x);
}while(x<0 || x>100);
}
yukardaki do...while blou klavyeden girilecek deerin 0...100 aralnda
olmasn zorlar. Ve bu aralkta deilse tekrar deer girilmesini salar.

Dng k Komutu - break


Normal olarak bir dng koulda oluan duruma gre sonlanr veya devam
eder. Dngnn ba ve sonunu belirleyen ifade veya kme parantezlerine
gre dng ii ve d ayrlm durumdadr. Eer bir dngden herhangi bir
anda kma ihtiyac oluursa bu komut kullanlabilir. Bu komut icra
edildikten sonra dngnn sonunu belirten noktadan sonraki ilk komuttan
program ak devam eder.
break;

8/13.02.2012 16:19:00

45

C Programlama Ders Notlar

eklinde Kullanlr. Bu komut en iteki dngden kmay salar.


rnek 11
#include <stdio.h>
int i;
main(){
i=0;
while (1){
if(i >100) break;
printf(%d\n,i);
i++;
}
}

Dng devam Komutu - continue


Break komutu tarznda bir komuttur. Bir dngde bu komutun bulunduu
noktadan teye komutlarn kullanlmamasn salar. Onun yerine dng
bana dnp oradan program akn devam ettirmeyi salar.
continue;
eklinde Kullanlr.
Tm dng komutlarnda kullanlabilirken breakden farkl olarak switch
komutu ile kullanlamaz. Dngdeki bir sonraki iterasyonun yaplmasn
salar. rnek olarak:
rnek 12
Aadaki rnek i deeri ift olan durumlar iin dng bandan devam
edilmesini salar. Yani ekrana sadece tek saylarn yazlmasn salar.
#include <stdio.h>
int i;
main(){
i=0;
while (i < 100){
if(i % 2 == 0) continue;
printf(%d\n,i);
i++;
}
}

8/13.02.2012 16:19:00

46

C Programlama Ders Notlar

Fonksiyonlar ve Genel Program


Yaps
Fonksiyonlar byk programlar kk paralara blen grevlerdir. Ayrca
daha nce insanlarn retmi olabilecekleri zmleri sizin tekrar batan
kefetmemenizi salarlar. lgili fonksiyonlar genellikle detaylar gizler.
Zaten bu detaylarn programc tarafndan bilinmesinin bir anlam yoktur.
C fonksiyon kullanmn verimli ve kolay kullanml bir ekilde tasarlamtr.
Genellikle C programlar kk fonksiyonlardan olumutur. Bu arada bir C
program bir yada daha fazla kaynak dosyasndan oluabilir. Bu kaynak
dosyalar ayr ayr derlenmi ve birlikte ykleniyor olabilecei gibi hep
birlikte de balanm olabilir.
Aslnda C programlama dili ile yazlan tm programlar bir grup
fonksiyondan ibarettir. Hatta C dilinin komutlarndan hari ok kullanl bir
yn fonksiyon tanmlar sz konusudur. Belki de C dilini gl klan
yaplardan biri de bu fonksiyon tanmlama ve fonksiyonlar istenilen
yerlerde kullanmadr.
Bir ok programda ktphanelerin iinde yer alan fonksiyonlar
kullanmnzdr. getc, putc, sin, cos vb. fonksiyonlar bunlardandr. Bu
blmde biz daha ok bu fonksiyonlar kullanmaktansa bunlar
tanmlamay reneceiz. Bu ekilde kendinize ait program ktphaneleri
oluturabilir ve bu program paralarn bir yerden baka bir yere
tayabilirsiniz.

Ana program blou (main)


Bu kadar fonksiyon ierisinde unu belirtmek gerekir: Aslnda C
programnn ana blou da bir fonksiyon tanmdr. Yani main diye
adlandrlan bir fonksiyondur. Her Programda mutlaka bulunmas gerekir
ancak parametre almak zorunda deildir ve deer dndrmek zorunda da
deildir.
tanmlar.......
main(){
......
/* Program ile ilgili ana giri ifadeleri buraya
yazlacaktr.*/
......
}

8/13.02.2012 16:19:00

47

C Programlama Ders Notlar

C program genel yaps


#include tanmlar
#define tanmlar
Global deiken tanmlar
fonksiyon_ad(){
.......
/*Fonksiyon tanm buraya*/
.......
}
/* Bu programda kullanlabilecek tm fonksiyon tanmlar */
main(){
......
/* Program ile ilgili ana giri ifadeleri buraya
yazlacaktr.*/
......
}

#include Tanmlar
Programda kullanlacak harici ya da nceden tanmlanm fonksiyonlarn
bulunduu ktphanenin tanmland ifadelerdir.
Bu cins ktphane stdio.h, string.h, conio.h time.h vb. Ktphaneler olup
bu ktphanelerin herbiri bir ilem grubu belirleyen fonksiyonlarn bir
arada bulunduu dosyalardr.
Bu ktphaneler, nceden tanmlanm ktphaneler (Programlama dili
gelitiricileri tarafndan) olabilecei gibi, sizin oluturduunuz bir
ktphaneler de olabilir.

#define Tanmlar
Bir Program ierisinde kullanmak isteyebileceiniz sabit ifadeleri
tanmlamak iin kullanlan szcktr. Hemen ilk ksmda yer alr.

Dier blmler
Tm program ierisinde kullanlacak deikenler main bloundan nce
tanmlanmaldr. Bu ekilde tanmladnz deikenler Global olurlar ve
tm program ierisinde tanml hale gelirler.
Daha sonra fonksiyonlar tanmlanr. Bu fonksiyonlarn tanmlanmas bir
sonraki blmde ele alnmtr.
Ana Program blounu tanmlanmas ve kodlarnn yazlmas ile program
tamamlanm olur. aslnda main() diye adlandrlan bu blok normal bir
fonksiyon tanmnda olduu gibi tanmlanr. Ancak ad zeldir ve

8/13.02.2012 16:19:00

48

C Programlama Ders Notlar

deitirilemez veya deiik amalar iin kullanlamaz. Ayrca bir C


program altrlmaya balandnda ilk olarak bu blok uygulanr. Dier
fonksiyonlar veya program paralar buradan arlr veya buradan icra
edilirler. Bu anlamda zel bir fonksiyondur. main() fonksiyonu. Eer
altrlrken parametre ile kullanlan bir program olarak altrlrsa ()'ler
arasnda gelen ifadeler o programn parametreleridir.

Temeller
Program birbirinden bamsz bir ksm fonksiyon tanmlarndan oluur.
Fonksiyonlar arasnda haberleme, parametreler ve fonksiyonlarn
dndrd deerler ile gerekleir. Bazen de bu deer transferi harici
deikenler ile gerekleir.
Fonksiyonlar kaynak kodda herhangi bir srada yazlabilir. Hatta kaynak
kod birden fazla dosyaya blnebilir. nemli olan fonksiyonlarn
blnmemesidir.
Return deimi fonksiyondan deer dndrmeyi salayan ve arld yere
deeri dndren deimdir. Return deimini herhangi bir ifade izleyebilir.
return (ifade);
aran fonksiyon dnen deeri dikkate almama hususunda serbesttir.
Fonksiyonda return yanna deer yazmak da zorunlu deildir bu durumda
aran fonksiyona deer dndrlmez.
Fonksiyon, arld noktaya deer ya da hizmet dndren program
paras olarak tanmlanabilir. Kullanm amac bir ilemin ok sk tekrar
edilmesinden dolay paketlenmesini salamak ve kullanm annda sadece
bu paketin adn kullanmaktr. Bu yntem ile ayn ii yapan bir program
paras ok defa yazlacana bir defa yazlp ok yerde kullanma
sunulmu olur.
Bu yntemle yapsal programlar gelitirebilirsiniz. C dili ile en pratik
program yazmann yolu fonksiyonlardan geer. zellikle ok youn ve
karmak programlarn yazlmasnda hem yazm kolaylatrmak hem de
anlalrl arttrmak iin fonksiyon kullanm son derece idealdir. Ayrca
sorunlar zmlerken fonksiyonel kavramlarla zmlemek sorunun kolay
zmlenebilmesine neden olacaktr.
Bir Fonksiyon tanm genel olarak aadaki yapya sahiptir.
[fonksiyonun tr] fonksiyonun_adi([P1[,P2..]])
[deiskentr P1;
degiskentr P2;
................]
{

8/13.02.2012 16:19:00

49

C Programlama Ders Notlar

Fonksiyona ait deikenler ve tanmlar


Fonksiyona ait yaplacak ilemler ve komutlar
[return deer];
}
Bu tanmda fonksiyon eer bir deer dndrmyor ise fonksiyonun_tr
denilen ksm bo olabilecei gibi eer fonksiyon parametre almyor ise P1,
P2 gibi ifadelere ihtiya bulunmamaktadr.
Eer fonksiyon deer dndrmyor ise en sondaki return deer ifadesine
gerek yoktur. burada deer denilen ifade fonksiyonun dndrecei deeri
sembolize eder.
Eer fonksiyonun parametreleri yok ise bu parametrelerin tr tanm
yaplmaz. Burada tanmlanan bu parametreler sadece fonksiyon ierisinde
kullanlabilir.
Parametre: Bir fonksiyonda farkl deerler iin farkl sonular elde
etmemizi salayan ve fonksiyona gnderilen deerlere verilen addr.

Fonksiyon parametreleri hakknda


u ana kadar grdmz fonksiyonlar parametreleri deerle
arlmlard. Bu ynteme call by value denir ve arlan fonksiyon tm
parametreler iin deeri alr ve zel yerel bir deikene kopyasn
oluturur. Bu ilemde o deikenin adresi kullanlmaz. Bu ilemden de bu
fonksiyonun bu deikenin deerini deitiremeyecei gibi bir sonu kar.
Her fonksiyon bu tip deikenleri ve kendi yerelinde tanmlanm
deikenleri sadece kendi ierisinde deitirebilir.
Bir Fonksiyon parametresi olarak bir dizinin ad kullanldnda bu dizinin
giri adresi fonksiyona iletilir. Dizinin tm deerleri fonksiyona
kopyalanmaz. Fonksiyon dizinin elemanlarn indis deerleri ile marifeti ile
rahatlkla deitirebilir. Buradan u sonu karlabilir diziler referans
deeri ile yani adres ile fonksiyona iletilirler. Sonraki konularmzda
iaretilerin kullanmnn anlatlmas ile bu konu daha net olarak
aklanacaktr.
Bu arada deiken sayda parametre alan fonksiyonlar portatif olarak
yazmann bir yolu maalesef bulunmuyor. Bu nedenle de deiken sayda
deerlerden en byn veya en kn bulabilecek fonksiyonu
yazmak Cde yazmak ok da kolay olmasa gerek.
Altrma 22
Kendisine gnderilen a ve b gibi iki deikenin ierisindeki deerleri
eviren swap adnda bir fonksiyon tanmlaynz. Bu tanmn program iinde
nasl kullanlacan gsteriniz.
8/13.02.2012 16:19:00

50

C Programlama Ders Notlar

Altrma 23
Kendisine gnderilen bir tamsay dizisini sralayarak arana geri
dndren fonksiyonu C dili ile gelitiriniz.

Deikenlerin etkili olduu blgeler


C Blok yapl bir programlama dilidir. Bu nedenle deikenler aslnda
tanmlandklar blok ierisinde kullanlabilirler. Bir baka blok ierisinde o
deiken tanmsz kabul edilir. Bir deikenin bir blok ierisinde tanmlanp
tanmlanmad derleme aamasnda anlalabilir. Eer Syntax Error
hatas ile karlalp undefined variable gibi hatalar alnyorsa deiken
tanmlanmam veya yanl bloklarda bu deiken kullanlmaya allyor
demektir.
Bu tanmlara gre "Her deiken sadece tanmland fonksiyon
ierisinde kullanlabilir" demektir. Ancak Global olarak tanmlanm
deikenleriniz var ise bu deiken tm fonksiyonlarnz ierisinde
kullanlabilir.

Genel Deikenler
C Program bir grup harici nesneden oluur. Bunlar bazen deikenler
bazen de fonksiyonlardr. Bir fonksiyonun iinde tanmlanan deikenler
yerel deiken olarak adlandrlrlar. Baz durumlarda bunlara dahili
deiken de denebilir. Fonksiyonlarn dnda tanmlanan deikenler
Genel deikenler olup bazen de harici deiken olarak adlandrlrlar.
Genel deikenler tm fonksiyonlar tarafndan eriilebilir olduundan
fonksiyon parametrelerine ve deer dndrme mekanizmasna alternatif
olarak kullanlabilir. Bir fonksiyon genellikle genel olarak tanmlanm
herhangi bir deikene adn anmak suretiyle eriebilir.
Eer fonksiyonlar arasnda ortak kullanlacak deikenler ok ise uzun
parametre listeleri yerine genel deiken tanmlamalar daha etkili
olacaktr. Ancak bu da fonksiyonun portatifliini ve program yaps
konusunda dankl belirtecektir. Bu ekilde fonksiyonlar arasnda bir
ok veri ba bulunacaktr.
Genel deikenlerin kullanlmasnn temel nedenlerinden biri de deiken
deerlerinin sfrlanmasn salamaktr.
Genel olarak tanmlanm bir deiken tm dier fonksiyonlarda tanml
olaca gibi programn almasnn bittii ana kadarda bellekte tutulurlar.
Halbuki bir fonksiyonun iinde tanmlanm yerel deikeniniz ise
fonksiyona girdiinizde bellee alnr ve fonksiyondan kncaya kadar

8/13.02.2012 16:19:00

51

C Programlama Ders Notlar

bellekte kalr. Bu nedenle iki ya da daha fazla fonksiyon verileri


paylaacaksa bu verilerin genel deikenler ile paylalmas mmkndr.

extern deikenler
Eer bir program birden fazla dosya zerinde tanmlanmsa ve baz
deikenler tm dosyalarda kullanlabilmek ve eriilebilmek istiyorlarsa bu
deikenler extern olarak tanmlanrlar. rnein main fonksiyonunun
olduu bir program blounda genel deikenler dzeyinde
int kalem; eklinde bir tanm yapm olsanz ve dier bir program
dosyasndan bu deikeni kullanmak isteseniz o dosyada u ekilde
tanmlamanz gerekecektir.
extern int kalem;
bu ekilde bu deikenin bu dosya iinde deil dier bir dosya iinde
tanmlanm olduunu ve bir iliki iinde olduunu grebilirsiniz.

static deikenler
static tanm extern gibi bir deikeninize zel bir sfat katan deimdir.
Static deikenler genel tanmlanabildikleri gibi yerel de tanmlanabilirler.
Yerel olarak tanmlanan bir static deiken sadece o fonksiyon iinde
kullanlabilir ve dier fonksiyonlarda tannmaz ancak dier yerel
deikenlerden farkl olarak deiken fonksiyon bitiminde bellekten
atlmaz. Hatta ierisindeki deer dahi statik olarak korunur. Fonksiyonun
sonraki tekrar arlmasnda iindeki deer kullanlr. Bu da u anlama
gelir: yerel static bir deiken zel ama kalc bellek sahalar oluturur.
Bu ekilde tanmlanmak istenen bir deiken iin nne static ifadesini
koyanz yeterli olacaktr.
static int k;
static char buf[128] gibi.

register deikenler
register tanm ile verilen bir deiken program tarafndan ska
kullanlacaktr anlamna gelir. Eer mmkn olursa bu deikenler
bilgisayarn yazmalarna (register) yerletirilir. Bu sayede bu programlar
hem hzl hem de daha kk olurlar. Register tanm ile yaplan bir
deiken tanmlama satr u ekildedir:
register int x;

8/13.02.2012 16:19:00

52

C Programlama Ders Notlar

register char harf;


Uygulamada register deikenleri ile ilgili olarak bir takm kstlamalar
bulunacaktr. Bu kstlamalar donanmdan kaynaklanana kstlamalardr.
Bir fonksiyonun iinde sadece birka tane deiken register olarak
ayarlanabilir. Ayrca tm trlerin register olabilmesi mmkn deildir.
Uygun olmayan tanmlar iin register ifadesi kullanlsa bile derleyici
tarafndan grlmez. Ayrca bu kstlamalar makinadan makinaya
deiebilecektir.

Blok Yaps
C Pascal, PL/I ve algolde olduu gibi i ie bloklarn tanmlanabildii
yapda bir dil deildir. C dilinde tm fonksiyonlar ayn dzeyde
tanmlanrlar ve i ie olamazlar. Ancak bu tarz bir tanm deikenler iin
sz konusudur. Yani deikenler i ie bloklarda tanmlanabilirler. Ve bu
bloklar kme parantezi ile belirlenir. Eer bir blok iinde tanmlanan bir
deiken var ise o deiken o bloun sonuna kadar geerlidir. Bir deiken
bir blok iinde tanmlanm ise ve bir st blokta da tanml ise alttaki bloa
girildiinde yeni tanm geerli olur dier tanm bu blok bitinceye kadar
bekletilir.

lk deer atama
Bu blm tanmladnz deikenlere nasl ilk deer atayabileceinizi veya
ilk deer atamazsanz nelerin varsaylacan anlatr.
extern ve static deikenler sizin tarafnzdan ayrca bir tanm yaplmad
ise 0 deeri ile otomatik olarak balarlar. Register ve dier deikenlerde
ilk deer atam ilemi yaplmad ise deikenin deeri rast gele bir deer
olur.
Basit deikenlere tanmlandklar anda ilk deer atamas yapabilirsiniz.
Register deikenler ve normal deikenlere ilk deer atanrken sabit olma
zorunluluu bulunmamaktadr. Tanml deerlerle olumu olan herhangi
bir ifade de deer atama iin kullanlabilir.

zyineleme (Recursion)
C fonksiyonlar zyineli olarak kullanlabilirler. Yani bir C fonksiyonu
kendini dorudan ya da dolayl olarak arabilir. En klasik rneklerinden
biri faktriyel hesaplama olarak gsterilebilir. nk faktryel tanm
gerei u ekilde anlatlabilmektedir
rnek 13

8/13.02.2012 16:19:00

53

C Programlama Ders Notlar

N!=N*(N-1)! Bu ilem n 1 oluncaya kadar devam edecek ekilde alabilir.


N bir olduunda faktryel deeri zaten 1 olacaktr.
#include <stdio.h>
int fak(int n){
if (n==1) return 1;
else
return n*fak(n-1) ;
}
main(){
int n;
printf(Faktryeli hesaplanacak deeri giriniz);
scanf(%d,&n);
printf(N deerinin faktryeni=%d\n,fak(n));
}
Bu programda n deeri faktryeli hesaplanmak zere fak fonksiyonuna
gnderiliyor. Ancak fak fonksiyonu da kendisini tekrar ararak faktryeli
hesaplamaya altn grebilirsiniz.
Altrma 24
Klavyeden girilen herhangi bir tam saynn ikilik say sistemindeki
karln ekrana yazabilecek fonksiyonu zyineli olarak tanmlaynz.

C dili nilemcisi
C dili dilin zelliklerini geniletmek iin bir takm deimler kullanr. Bunlara
nilemci komutlar denir.

Dosya Dahil etme


Bir takm fonksiyonlarn prototip tanmlarn ve define ile yaplm bir takm
tanmlar programa dahil edebilmek iin include adndaki komuttur.
#include dosya
eklinde kullanlr ve ad dosya olan dosyann iindeki tm bilgileri bu
programa dahil eder. Hemen hemen her C programnda 1 yada belki 2
satr bu ekildeki tanmlar grmek mmkndr. Byk programlarda belli
bir takm tanmlar tm yardmc dosyalarda grebilmek iin include ile
tanmlam olabileceiniz genel bir tanm dosyasn tm dosyalara dahil
ederek tanmlarn ortakln garantilemi olabilirsiniz.

8/13.02.2012 16:19:00

54

C Programlama Ders Notlar

Makro veya sembolik sabit tanmlama


#define EVET 1
eklindeki bir tanm en basit sembolik sabit sayy tanmlar. Bu tanm ile
programmzda kullanlmak zere EVET adnda sembolik bir sabit
tanmlam oluruz. Derleyici program derlerken define ifadesi yannda
tanmlam olabileceiniz sabiti programda yerletirir ve o ifade yerine
sabiti koyarak programn derlenmesini salar.
Bu artlar altnda u ekilde yapabileceiniz tanmlarda ilgili almn
yaplmasn salarlar.
#define kare(x) x * x
eklindeki tanm program derlenince kare(x) yerine x*x konmasn
salayacaktr.
Altrma 25
n

Kendisine gnderilen n deeri iin f(x)= x fonksiyonunu hesaplayp


x =1

arana dndren fonksiyonu C dili ile yaznz.

8/13.02.2012 16:19:00

55

C Programlama Ders Notlar

Diziler
Bazen basit deikenler bir takm sorunlarn zlmesi iin yeterli
olmazlar. rnein iki matrisin toplamn bulabilecek bir program basit
deikenler ile yazlamaz. Ya da bir dizi deer zerinde sralama
yapabilecek program, bir dizi say ierisinde istenilen deeri bulabilecek
program yine basit deikenler ile yazlamaz.
Bu tip programlar iin hatta bir ok benzeri program iin dizi veya matris
tanmlar yapabilmeniz gerekmektedir.

Dizi Nedir?
Ayn zellikte olan ve ayn amala kullanlan bir grup saynn bilgisayar
ortamnda tutulduu veri yapsdr.Kavramsal olarak bir dizi kutuyu
dnerek benzetim yapabilirsiniz.
Genel olarak yle tanmlanr.
degisken_tr ad[eleman says][ikinci_boyut]...;
Bu tanmda deikene bir ad ve tr belirlemesi yapmak gerekecektir.
Tanmlayacanz dizi tek boyutlu ise sadece eleman_says ile belirtilen
tanm yaplacak iki boyutlu bir matris isteniyor ise ikinci_boyut denilen
alan da tanmlamak gerekecektir.
Sonraki Blmde rneklerle bu daha geni anlatlacaktr.

Bir Vektrn veya matrisin Tanmlanmas


Bir vektr yani tek boyutlu bir dizi tanmlayabilmek iin u ifadenin
yazlmas yeterli olacaktr(tr olarak tamsay dnlmtr):
int ts[100];
Bu tanmda ad ts olan ve tamsay deerleri tutabilen 100 elemanl bir dizi
tanmlanmtr. Yani bilgisayar belleinde ad ts olan bir deikenler zinciri
almtr. Bu zincir halkasnn ilk esinin indis deeri 0 son esinin indis
deeri 99'dur.
Bu dizinin herhangi bir esine program ierisinde eriirken u ekilde bir
kullanm uygulamak gerekir:
ts[12]+=12; //veya
ts[x]=23;
ts[x]=23;

8/13.02.2012 16:19:00

56

C Programlama Ders Notlar

Grnd gibi indis deerleri [] ifadeleri arasna yazlmtr. Daha da


nemlisi bu indis deerleri deiken olabilmektedir. te dizileri kullanmay
zorunlu hale getiren bu zelliidir. Tek bir komut satr ile tm elere
erimeyi salayabilen bir yapdr bu yap. Tm dizi elerini tek bir satrla
ekrana bu zellii sayesinde yazabilirsiniz.
Matris tanmlamada ayn zellikleri ierir. Yine tamsay trnde bir 100 X
100 elemanl bir matris tanmlamak iin u komut satrn kullanabilirsiniz:
int mtr[100][100];
Bu satr ile tanmlanan matris yine ayn ekilde iki indisi birden belirtilmek
artyla kullanlabilir. Satr ya da stun kavramlar tamamen programcnn
dncesine braklmtr. Ancak bir program iin ilk boyut satr ikinci
boyut stun olarak dnlmse o program sonuna kadar yntem hep
yle uygulanmaldr. Bir matrisi okuyup yazabilmek iin i ie iki for
dngs kullanlmaldr. Ama yine de olabilecek baka yntemlere oranla
son derece salkl bir yntemdir.
Altrma 26
3X3lk bir birim matrisi matris dzeninde ekrana yazan C programn
gelitiriniz. Kegen zerindeki deerleri 1 dierlerinin 0 olduu matris
birim matris olup bu matrisi sadece ekrana yazmanz yeterli deildir.
Hafzada tutulacak ekilde ayarlamanz gerekmektedir.
Altrma 27
Bir matrisin her bir eleman bulunduu satr ile stun deerlerinin toplam
deere sahiptir. Bu ekilde 5X5lik bir matrisi oluturup ekrana matris
biiminde yazacak C programn gelitiriniz.

Diziler ve Matrisler zerinde


uygulanabilecek ilemler
Diziler ve matrislerin temel kullanm nedeni baz ilemleri basit
deikenlere oranla ok daha basit zmeyi salamalarndandr. Bu
amala diziler veya matrisler zerinde u ilemler kolaylkla
yaplabilmektedir.

8/13.02.2012 16:19:00

57

C Programlama Ders Notlar

Dizi sralama
Bir say dizisinin sralanmas salanabilir. Sralanacak saylar dizi zerinde
deil de baka bir deiken zerinde tutuluyor ise ilem karmaklaacak
hatta belki imkansz duruma dnecektir. Ancak bir dizi zerinde dizinin
ne kadar ok deerden olutuu nemli deildir ve sralama ayn sadelikte
yaplacaktr.
rnek 14
Max 100 elemanl bir dizinin elemanlarn ekrandan okuyacak, artan srada
sraladktan sonra tekrar ekrana yazacaktr.
#include <stdio.h>
int temp, dsay, k, l, dizi[100];
main(){
printf("Girilecek eleman saysn Veriniz?\n");
scanf("%d",&dsay);
for(k=0;k<dsay;k++){
printf("%d. sayy giriniz",k);
scanf("%d",&dizi[k]);
}
for(k=0;k<dsay-1;k++)
for(l=k+1;l<dsay;l++)
if (dizi[k]<dizi[l]){
temp=dizi[k];
dizi]k]=dizi[l];
dizi[l]=temp;}
for(k=0;k<dsay;k++)
printf("%d",dizi[k]);
}
Bu amala deiik sralama algoritmalar bulunabilir.

Dizi ierisinde istenilen bir eyler bulma


Bir grup eleman ierisinde bir takm eyler aramak zorunda kalacamz
durumlar olacaktr. Bu durumlarda Aadakine benzer Algoritmalar
kullanlabilir.
rnek 15
Bu programda 100 elemanl dizinin dolu olduu varsaylmtr.
#include <stdio.h>
int deger, k, dizi[100];
main(){

8/13.02.2012 16:19:00

58

C Programlama Ders Notlar

printf("Aranacak Deeri Giriniz?\n");


scanf("%d",&deger);
for(k=0;k<=100;k++)
if(dizi[k]==deger) printf(%d deeri %d. Srada
bulundu,deger,dizi[k]);
if (k>100) printf(Deer Bulunamad\n);
}
Bu amala deiik arama algoritmalar bulunabilir.

Matrisin devriini alma


Aslnda Tm matrisli ilemlerde tabi ki matris tanmlarna ihtiyacnz
olacaktr. ki matrisi toplayp arpmak iin veya karmak ya da devriini
almak iin mutlaka matris tanmna ihtiyacnz var demektir.
rnek 16
#include <stdio.h>
int k, l, matris[100][100];
main(){
// Bu blm bir matrisin elemanlarnn tek tek ekrandan
okunmasn salar
for(k=0; k<100; k++)
for(l=0; l<100; l++)
scanf(%d, &matris[k][l]);
// Bu blmde matrisin transpozu yani devrii alnyor
for(k=0; k<100; k++)
for(l=k+1; l<100; l++){
tmp=matris[k][l];
matris[k][l]=matris[l][k];
matris[l][k]=tmp;
}
// Bu blmde matris matris biiminde ekrana yazlyor.
for(k=0; k<100; k++){
for(l=0; l<100; l++)
printf(%d\t, &matris[k][l]);
printf(\n);
}
}
rnek 17
Bu rneklerde matris boyutunun daha anlalr olmas iin include
deiminden sonra define deimi ile matrisin boyutlar sabit olarak
tanmlanabilir ve programda belili bir takm yerlerde bu sabitler
kullanlarak program yeniden dzenlenebilir. yle ki:
#include <stdio.h>
#define MAXSAT 100

8/13.02.2012 16:19:00

59

C Programlama Ders Notlar

#define MAXSUT 100


int k, l, matris[MAXSAT][MAXSUT];
main(){
// Bu blm bir matrisin elemanlarnn tek tek ekrandan
okunmasn salar
for(k=0; k<MAXSAT; k++)
for(l=0; l<MAXSUT; l++)
scanf(%d, &matris[k][l]);
// Bu blmde matrisin transpozu yani devrii alnyor
for(k=0; k<MAXSAT; k++)
for(l=k+1; l<MAXSUT; l++){
tmp=matris[k][l];
matris[k][l]=matris[l][k];
matris[l][k]=tmp;
}
// Bu blmde matris matris biiminde ekrana yazlyor.
for(k=0; k<MAXSAT; k++){
for(l=0; l<MAXSUT; l++)
printf(%d\t, &matris[k][l]);
printf(\n);
}
}
Bu ikinci rnekte kullanlan define satrlar MAXSAT ve MAXSUT tanmlar
sembolik sabitlerdir. Bu sabitler kullanldklar yerlerde derleme
aamasnda karlklarndaki saysal deerleri derlenen yerlere korlar. Bu
sabitler sadece programda kullanlacak matrisin boyutunu ok pratik
ekilde deitirmenizi salayacaktr.
Altrma 28
Klavyeden girilen maksimum 100 tane deeri bubble sort (Kabarck Srala)
algoritmasna gre kkten bye sralayp ekrana yazan C Programn
gelitiriniz.

8/13.02.2012 16:19:00

60

C Programlama Ders Notlar

Karakter dizeleri (Dizge)


Bir programda karakterlerin oluturduu diziye karakter dizesi veya dizge
(string) denir. Alfabetik deerleri ad, soy ad, aklama vb gibi deerleri
saklamak iin bu tip deikenlere ihtiyacnz vardr. Bu tip sabitleri de yine
ift trnaklar ierisinde yazarak ifade edebilirsiniz.

Karakter dizesi tanmlama ve kullanma


Diziler sadece saysal deikenlerde ve saysal ilemlerde kullanlmazlar.
Bir ok kez Cmle vb. yaplarda aslnda karakter dizileri kullanrz.
Karakter dizileri normal bir dizi tanmlanyormu gibi tanmlanr sadece tr
deimi char olarak seilir. Bu ekilde ierisinde saklanacak toplam harf
saysn belirtmi olursunuz.
char cumle[100];
ifadesi toplam 100 harfli bir ifade tanmlar. Bu ifadenin tm 100 harfi
kullanlmak zorunda deildir. Saysal dizilerden farkl olarak bu karakter
dizileri zerinde yaplabilecek ilemler ya da kullanm amalar farkl
olabilecei iin bize sunulan destek ve fonksiyonlar da yer yer farkllklar
gsterir. Zaten biz bu tr dizilere "karakter dizesi" deriz.
Bu ekilde tanmlanm bir dize iinde yer alan harflerin en sonuncusu
karakter dizesinin sonunu belirleyen \0 karakteridir. Bu karakter bir
karakter dizesi iinde nemli zellie sahiptir. Gerek C dili fonksiyonlarnn
kendisi gerekse de sizin yazacanz programlar bu karakterden
faydalanacaktr. Blm sonuna doru rnekleri inceleyerek \0
karakterinin nasl kullanlacan grebilirsiniz.
Bu karakter dizeleri ile ilgili bir takm ilemleri gerekletirmek iin gerekli
olabilecek fonksiyonlar "string.h" ktphanesi ierisindedir. Bu
Fonksiyonlar ve kullanm amalar unlardr.
strlen(s):s ile belirtilen karakter dizesinin uzunluunu bulur.
strcpy(s1,s2):s2 ile belirtilen karakter dizesini s2 ile belirtilen karakter
dizesine kopyalar. Bu fonksiyon olduka nemlidir nk C dilinde bir
karakter dizesine normal deer atama ifadesi kullanlarak bir dizeye
yerletirilemez. nk aslnda C dilinde bir karakter dizesi ad bir
deikene gstergedir ve ona yapacanz bir deer atama yanl sonu
verecektir.
strcmp(s1,s2):s1 ile belirtilen karakter dizesi ile s2 karakter dizesinin
karlatrlmasn salar. Bu karlatrma sonucunda iki deer eit ise

8/13.02.2012 16:19:00

61

C Programlama Ders Notlar

sonu 0, birincisi byk ise sonu pozitif, ikincisi byk ise sonu negatif
olarak dndrlr.
strcat(s1,s2): s1 ile belirtilen karakter dizesinin sonuna s2 ile belirtilen
karakter dizesini ekler. Sonu s1 ile belirtilen dize iinde saklanr.
rnek 18
Klavyeden enter tuuna baslncaya girilen bir ifadenin bir deikende
saklanmasn salayan bir program yaznz.
#include <stdio.h>
char cumle[1024],ch;
int s=0;
main(){
ch=getc(stdin);
while (ch!=\n){
cumle[s]=ch;
s++;
ch=getc(stdin);
}
cumle[s]=\0; // girilen ifadenin sonuna karakter dizesi
sonu iaretini yerletiriyoruz.
}
rnek 19
Klavyeden girilmi bir ifadenin uzunluunu strlen fonksiyonu kullanmadan
bulan program yaznz.
#include <stdio.h>
char cumle[1024];
int s=0;
main(){
gets(cumle);
while (cumle[s]!=\0)s++;
printf(Uzunluk:%d\n,s);
// girilen ifadenin sonuna kadar harfler saylr.karakter
dizesi sonu iaretini bulmaya alyoruz
}
rnek 20
Klavyeden istenilen uzunlukta veya enter tuuna baslncaya kadar
ifadelerin okunmasn salayan program yaznz.
#include <stdio.h>
#define SAY 15

8/13.02.2012 16:19:00

62

C Programlama Ders Notlar

char kelime[SAY];
int l;
main(){
l=0;
while((kelime[l]=getc(stdin))!=\n && l<SAY)
l++;
if (l>=SAY) l=SAY-1;
kelime[l]=\0;
}

8/13.02.2012 16:19:00

63

C Programlama Ders Notlar

Gstergeler-aretiler
areti herhangi bir deikenin adresini saklayan bir deikendir.
aretiler C programlama dilinde olduka ok kullanlrlar. Bunun nedeni
bazen ok karmak ilemleri kolay hale getirmelerindendir. Bazen de
baka yollarla ok zor yapacanz ilemleri daha kolay ifade etmenizi
saladndandr.

aretiler ve Adresler
Bir iareti bir deikenin adresini saklad iin bir deer dolayl yoldan
erimek mmkndr.xin bir tam say deiken olduunu kabul edelim. px
deikeni ise bu x deikenine iaret eden bir iareti deiken olsun. &
operatr bir nesnenin adresini bulmamz salar.
Px = &x;
lemi xin adresini px deikenine atar. Artk px x deerine bir iaretidir.
& operatr sadece deikenlere, dizilere ve veri yaplarna
uygulanabilirler. &(x+1) ve &3 eklindeki kullanmlar geersizdir. Register
niteleyicisi ile tanmlanm bir deikeninde adresini almak geersiz
ilemdir.
* operatr de yanndaki ifadenin bir iareti olduunu anlatr ve bu
adresin ifade ettii yerdeki deikeni anlatr. Eer ad y olan bir int
deiken olsun
y= *px;
ifadesi y deerine pxin gsterdii yerdeki deeri atar. Yani:
px = &x;
y = *px
ifadesi
y = x;
ifadesine denk bir ilem yapar.
Yukardaki ilemi yapabilmek iin tabii ki ilgili deiken tanmlarn da
aadaki gibi yapmak gerekecektir.
int x,y;
int *px;

8/13.02.2012 16:19:00

64

C Programlama Ders Notlar

x ve y ile ilgili tanmlar daha nceden grdmz gibidir. *px tanm ise
yeni bir tanm olarak karmza kyor. Bu tanma gre *pxin bir tam say
olduunu anlatr. Her hangi bir ifadede px ile karlalrsa bunun bir int tr
olduunu anlatr. Bu da ounlukla derleyici dzeyinde hatalarn
giderilmesini salar.
aretiler aritmetik ifadeler ierisinde kullanlrlar. rnein px bir tam say
xe iareti ise xin kullanlabilecei tm ifadelerde *px kullanlabilir.
y = *px +1;
ifadesi ynin deerini xin bir fazla olarak ayarlar.
Printf(%d\n, *px);
Xin deerini ekrana yazacaktr.
d=sqrt((double) *px);
xin karekkn hesaplar. Burada xin deeri nce double tre evrilir
sonra sqrt fonksiyonuna iletilir.
y = *px +1
eklindeki ifadelerde * ve & dier aritmetik operatrlere gre nceliklidir.
Ve nce pxin gsterdii deer bulunur bunun zerine 1 eklenerek elde
edilen sonu yye aktarlr.
y = *(px+1)
ifadesi ncelikle px ile gsterilen deikenden sonraki deikeni bulur ve
bu deikenin ieriindeki deeri yye aktarr.
aretiler eitliklerin sol tarafnda da bulunabilirler. rnein
*px = 0;
ifadesinde xin deeri 0 olarak deitirilir.
*px += 1;
ifadesi xin deerini bir arttrr. (*px)++ ifadesi de ayn ilemi yapar. Bu
son ifade de parantezler zorunludur. Parantez kullanmadan ifade edilseydi
ncelikle pxin deeri ncelikli olarak 1 arttrlr. nk ++, *, & gibi tekil
operatrler sadan sola ncelikte hesaplanr.
Son olarak iaretiler de birer deiken olduundan dier deikenlerde
olduu gibi ilemlere girebiliyorlar. Bu durumda pyin bir baka inte

8/13.02.2012 16:19:00

65

C Programlama Ders Notlar

iareti olduunu kabul edersek py = px ifadesi pxin iindeki deeri pye


kopyalar. Bu da pynin pxin gsterdii deeri gstermeyi salar.

aretiler ve Fonksiyon parametreleri


Normal artlarda C fonksiyonlar call by value deer ile arma
yntemine gre alt iin aran fonksiyondan gnderilen parametreler
deise bile arana geri yollamann dorudan bir yolu bulunmamaktadr.
yleyse normal bir parametreyi fonksiyonda deitikten sonra geri
arana nasl dndreceiz. rnein bir sralama algoritmasnda iki
elemann srasnn deitirilmesi gerekirse swap ad altnda yazlacak bir
fonksiyon maalesef aadaki gibi basit bir ekilde arlamayacaktr.
swap(a,b);
bu fonksiyonun tanm aadaki gibi ise
swap(x,y)
int x,y;
{
int temp;
temp = x;
x = y
y = temp;
}
call by value yntemiyle arlan bu fonksiyonda yerleri deitirilen x ve y
deikenleri arana dndrlemeyecektir.
Tabii ki beklenilen sonucu elde etmek iin bir yol bulunmaktadr. aran
program fonksiyona iaretileri geirirse bu iaretilerin gsterdii deerler
deitirilebilecektir.
swap(&a,&b);
& operatr bir deikenin adresini bulduu iin &a a deikeni iin bir
adres deeri dolays ile bir iaretidir. swap fonksiyonunun kendisi de
parametreleri iareti olarak tanmlar. Gerekli olan parametreler bu
iaretiler kanalyla fonksiyona aktarlr.
swap(px,py)
int *px, *py;
{
int temp;
temp=*px;
*px = *py;
*py = temp;
}

8/13.02.2012 16:19:00

66

C Programlama Ders Notlar

areti cinsinden parametre kullanan fonksiyonlarn genel kullanm


nedenlerinden biri bir deerden fazla deer dndrme ihtiyacndan
kaynaklanr. swap fonksiyonu da iki deer dndryor olduunu dikkatinizi
ekmitir.
Altrma 29
Kendisine gnderilen bir dizi saynn ierisindeki en byk eleman bulup
arana dndren C programn gelitiriniz.

aretiler ve diziler
C programlama dilinde iaretiler ve diziler arasnda olduka gl bir iliki
vardr. yle ki bu ikisi neredeyse ayn eylermi gibi anlatlabilirler.
Herhangi bir dizi indisleme ilemi ile yaplabilen tm ilemler iaretiler ile
de yaplabilir. aretiler ile yazlm modeli dierine gre daha hzl
alabilecektir.
int a[10] tanm 20 elemanl bir dizi tanmlyordu. Yani ad ayn olan
birbirine benzer on eleman tanmlanm oluyordu. a[i] ifadesi de a
dizisinin i. Konumundaki eleman anlatyordu. Eer pa bir tamsayya
iareti ise ve int *pa olarak tanmlanm ise pa=&a[0] ifadesi dizinin
sfrnc elemanna iaret eder. Bu da pa a[0]n adresini ierir anlamna
gelir.
x = *pa ifadesi a[0]n iindeki deeri xin iine atar.
Eer pa bir dizinin belirli bir elemanna iaret ediyorsa pa+1 bir sonraki
elemanna iaret eder. Ve tanm gerei pa-i ise pann gsterdii
elemandan i tane ncekini gsterecektir. Bu nedenle pa a[0] elemanna
iaret ediyorsa *(pa+1) ifadesi a[1] elemanna iaret eder. pa+i
i.elemann adresini *(pa+i) ise i.elemann ieriini anlatr.
Bu tanmlarn tamam a dizisinin trne bal kalmakszn her zaman iin
dorudur. Bir iaretiye bir deerin eklenmesi ve benzeri tm iareti
aritmetikleri o dizinin iinde iaretinin trne bal olarak hesaplanr.
aretinin gsterdii tre gre bir sonraki saklama ifadesini ya da bir
nceki adresi bulur. Byle olunca pa+i eklindeki bir ifadede i deeri
deikenin boyutu ile arplr sonra pa deerine eklenerek yeni adres
deeri bulunur. Bu ekilde yeni hesaplanan adres deeri deiken trne
bal olmu olur.
ndisler ve iaretiler ilgili benzerlik olduka yakndr. Gerekte bir dizinin
herhangi bir eleman derleyici tarafndan iaretiye derleme srasnda
evrilir. Aslnda dizinin ad bu diziye bir iareti deeridir. Bu nedenle
pa=&a[0] eklinde yazdmz ifadeyi aslnda pa=a eklinde de
yazabilirdik.

8/13.02.2012 16:19:00

67

C Programlama Ders Notlar

Aslnda ksaca u ekilde syleyebiliriz. A[i]ifadesi derleyiciniz tarafndan


hemen *(pa+i) ekline evrilmektedir. Her ikisinin birebir eit olduunu
bilmeniz yeterli olacaktr.
Bir dizi adnn bir iaretiden farkl bir konunun olduunun bilinmesi
gerekir. aretiler normalde birer deikendir. Pa=a veya pa++ gibi
tanmlar geerlidir. Fakat bir dizi ad sabit bir iareti deeridir. Bu nedenle
a=pa, a++ veya p=&a gibi tanmlar geersizdir.
Bir fonksiyona bir dizinin adn geirdiiniz zaman aslnda dizinin balang
adresi fonksiyona geirilmi olur. arlan bu fonksiyonun iinde bu
parametre dier deikenler gibi kullanlabilen bir deikendir. Ve bu
deiken bir diziye iaret eden iaretidir. Bu gerei gz nnde
bulundurarak fonksiyonlara dizi gnderip bu dizinin adresi ile ne
yaplacan u rnekle grelim
int strlen(s)
char s;
{
int n;
for(n=0; *s != \0;s++) n++;
return (n);
}
s deerinin arttrlmas gayet normal bir davrantr. nk s++ ileminin
aran fonksiyondaki karakter dizesi zerinde herhangi bir ilem
yapmamaktadr. Ancak yerel s iaretisinin deerini arttrarak karakter
dizesi iindeki sonraki karakterler ulamaktadr. Fonksiyonu tanmlarken
char s[]; eklindeki tanm ile char *s; eklindeki tanm tamamen
ayndr. Fonksiyondaki kullanmn nasl olaca hakknda bilgi verse de bu
konuda bir kural belirlemez. stediinizi kullanabileceiniz gibi ayn
fonksiyon iinde karkta kullanabilirsiniz.

Adres Aritmetii
p bir iareti ise p++ ayn trdeki bir sonraki deere iaret eder. p+=i ise
pnin deerini i kadar arttrarak i sra sonraki deere iaret eder. Bu ve
buna benzer ilemler en basit iareti aritmetiini anlatr.
C dilinin iareti, dizi ve iareti aritmetii ile ilgili entegrasyonu ve
btnl dilin ok gl olmasn salamtr. imdi bellekten yer ayran
ve bu yeri geri serbest brakabilen program satrlarn inceleyeceiz.
Programda malloc(n) ve free(p) eklindeki fonksiyonlar kullanlmtr. Bu
fonksiyonlardan malloc(n) n bytelk bir alan ayrr ve bu alana bir iaret.i
deer dndrrken free(p) p ile iaret edilen alann bellekte serbest
braklmasn salar. Bu ilemlerin sra bakmndan ters olarak yaplmas
gerektii aktr. Yani bir bellek sahas nce malloc ile ayrlm olmaldr ki
free ile serbest braklabilsin. Bu ekilde zellikle istenilen zamanlarda
8/13.02.2012 16:19:00

68

C Programlama Ders Notlar

istenilen kadar bellek ayrlabilir ve dizi ya da ona benzer kullanmlar statik


olmaktan kar ve dinamik kullanma geerler.bu uygulamalarda bo bellek
sahalar heap-yn dediimiz yerden kullanlrlar.
rnek 21
Bu rnek malloc kullanarak heap denilen sahadan bellek tahsis eder ve bu
bellei kullandktan sonra geri serbest brakr.
#include <stdio.h>
int p;
main(){
p=(int *) malloc(sizeof(int)*20);
// 20 elemanl bir int dizisi tanmlamakla edeer
if (p==NULL){
printf(Yeterli Bellek Yok\n);
return;
}
for(k=0;k<20;k++) scanf(%d,p+k);
for(k=0;k<20;k++) printf(%d\n,*(p+k));
free(p);
}

Karakter aretileri ve Fonksiyonlar


Ben bir karakter dizesiyim eklinde yazlm olan bir ifade aslnda
karakterlerden olumu bir dizidir. Ancak gerek C fonksiyonlar gerekse
derleyici bu diziyi ifade ederken \0 ile sonlandrr. Bylelikle dizenin
sonunu bulabilmek mmkn olur. Bu tr karakter dizesi sabitleri
ounlukla fonksiyon arlarnda parametre olarak kullanlrlar. Genellikle
bu tip durumlarda fonksiyonlar bu karakter dizesinin balangcn bir
iareti olarak alr ve kullanrlar.
Eer bir tanm u ekilde yaplm ise bu da bir karakter dizesi tanmlam
olabilir. char * mesaj; ve peindeki satr mesaj = Bu bir Cmledir;
komutu ise aslnda gerek bir kopyalama ilemi yaplmaz onun yerine
karakter dizesinin adresi mesaj iareti deikenine atanr.
Konunun daha iyi anlalmas iin strcpy fonksiyonunu biz kendi
imkanlarmzla yazalm. yle ki bu fonksiyon strcpy(s1,s2) eklinde
kullanlyordu ve s2 iindeki deeri s1 iine kopyalyordu.
strcpy(s,t)
char s[],t[]
{
int i;
i=0;
while((s[i] = t[i])!=\0)
8/13.02.2012 16:19:00

69

C Programlama Ders Notlar

i++;
}
Yukardaki dizi kullanm eklinde olan fonksiyon tanm idi. imdi de ayn
fonksiyonu iaretileri kullanarak yazmaya alalm.
strcpy(s,t)
char *s,*t
{
while((*s = *t)!=\0){
s++;
t++;
}
}
s ve t iareti deerleri fonksiyona deer olarak iletildiine gre fonksiyon
iinde bu deerler istenildii ekilde deitirilebilecektir. Hatta yukardaki
rnek pratikte daha ksa bile ifade edilebilecektir. yle ki:
strcpy(s,t)
char *s,*t
{
while((*s++ = *t++)!=\0);
}
Bu rnek s ve tyi while komutunun koul snama blmnde arttracaktr.
*t++ ifadesinde ise t arttrlmadan nceki t adresinde duran deeri
anlatmaktadr. Sonda yer alan ++ ilemi tnin gsterdii deere
ulamadan tyi deitirmez. Ayn ekilde s iinde ayn eyleri
syleyebiliriz.
Benzer algoritmalar kullanarak strcmp ve benzer dier string
fonksiyonlarn yeniden yazabilirsiniz.
Altrma 30
Klavyeden girilen bir kelimenin ka harften olutuunu bulan fonksiyonu C
programlama dili ile gelitiriniz. Bu fonksiyonun bir program ierisinde
nasl arlacan gsteriniz.

8/13.02.2012 16:19:00

70

C Programlama Ders Notlar

Dosyalarla ilgili ilemler


Yazdnz program verileri klavyeden okumak yerine sabit bir ortamdan
alacaksa veya ekrana yazmak yerine sabit bir ortama yazacaksa
programnzda dosya ilemleri yapmak zorunda kalacaksnz. Dosyay
amak okuma-yazma yapp geri kapatmak zorunda kalacaksnz. O halde
bu konuya bir gz atmanz gerekecektir.

Dosya Trleri ve eriim


Hemen her programlama dilinde olduu C Programlama dilinde de genel
olarak iki tr dosya bulunmaktadr. Bunlardan birincisi Sradan eriimli
(Sequential), dieri de dorudan ya da rast gele eriimli (Random) olarak
bilinirler. Her programlama dili ve iletim sistemi iin u genel kurallar bu
iki dosya tr iin geerlidir.
Sradan Eriimli Dosyalar
Sequential ACCESS
Bir dosya sadece okumak ya da
yazmak iin alabilir. Ayn anda bir
dosya hem okunup hem de
yazlamaz

Dorudan ya da rastgele eriimli


dosyalar
Random ACCESS
Bir dosya ayn anda hem okunup
hem yazlabilir.

Bu dosyalarda ise kaytlar sabit


uzunlukludur. Yani her bir kaydn
Bu dosyalarda kayt uzunluklar sabit
ka byte yer igal ettii programc
deildir. Dosyadaki her bir kayt bir
tarafndan bilinir ve her okumada ve
satrdr ve satr sonu iareti ile
yazmada o kadar byte okunupsonlandrlmtr. Dosya da dosya
yazlr. Bu nedenle kayt sonu iareti
sonu (EOF) iareti ile
bulunmaz ve Dosya sonu iaretinin
sonlandrlmtr.
de fazla bir nemi yoktur. Esas olan
dosyann toplam uzunluudur.
Bir kayda dorudan eriim sz
konusu deildir. rnein 8. kayd
okumak isterseniz ilk 7 kayd da
okumanz gerekecektir okumalar tek
ynl ve ileriye dorudur. Yani
nceki kayda eriip okumaya
alamazsnz.

Bir kayda istenildii anda dorudan


eriebilirsiniz. Bu kaydn sras
bilindii takdirde okuma yaplabilir.
Bu nedenle geriye doru okuma
yapmak mmkndr.

Dosyaya sadece yazabilir veya


sadece okuyabilirsiniz.

Dosyaya hem yazabilir hem de


okuyabilirsiniz

8/13.02.2012 16:19:00

71

C Programlama Ders Notlar

Genellikle metin Dosyalar, Belgeler, Program dosyalar ve benzeri


dosyalar sradan eriimli dosyalar iken, Bilgi kayt dosyalar gibi dosyalar
dorudan eriimli dosyalardan seilirler.

Metin Dosyalar
ncelikli olarak bu ekilde bir dosyann tantlmas gerekir bu amala da
FILE adnda bir tr ile tanmlanm bir deiken olmaldr.

Dosya ama ilemi


Bir dosyann zerinde ilem yapabilmek iin mutlaka dosyann alarak
program ile ilikilendirilmesi gerekir.
Bir dosyay aabilmek iin ncelikle bu dosyay sembolize edecek bir
deikene ihtiyacmz bulunmaktadr. Bu deiken FILE deimi ile
tanmlanmaktadr.
FILE *dosya;
ifadesi ad dosya olan ve disk zerinde bir dosyay belirtecek olan
mantksal bir dosya tanmlar. Daha sonra bu tanma gre dosya u ekilde
alr:
fp=fopen("deneme.dat","r");
Burada dosyamzn adnn deneme.dat olduu varsaylmtr. Bu dosya
okuma amal olarak alm olup bundan sonra dosyann program iinde
fp adyla anlaca ngrlmtr.
Eer dosya alabilmi ise fp o dosyaya bir gsterge deeri tutar. Eer
dosya herhangi bir nedenle alamam ise fp'nin deeri 'NULL' dir (Yani
BO).
dosya_deikeni=fopen("dosya_ad","dosyann_modu");
Bu biim kullanmda dosya_deikeni FILE deimi ile tanmlanm olan
deiken olmaldr. "dosya_ad" amak istediimiz dosyann disk
zerindeki tam konumunu ve adn belirtmelidir. "dosyann modu ise
aadakilerden biri olabilir:
r: Dosyann sadece okumak iin alacan belirtir. Bu ekilde alacak
dosya mutlaka sistem zerinde bulunmaldr aksi halde hatal bir sonu
alnr.
w: Dosyann sadece yazmak iin alacan belirtir. Bu ekilde alacak bir
dosya sistem zerinde oluturulacaktr. Buna dikkat edilmelidir. Eer bu
dosya var ve "w" modu ile alyorsa dosya silinerek yerine yenisi
konulacaktr.
8/13.02.2012 16:19:00

72

C Programlama Ders Notlar

a: Dosyann sona ekleme iin alacan belirtir. Dosya yoksa yeni


oluturulacak var ise ncekinin sonundan yazmak zere hazr hale
gelecektir.

Dosyadan okuma
getc c=getc(fp) eklinde kullanlr ve fp ile temsil edilen dosyadan 1
karakter okuyup c deikenine getirir.
fscanf fscanf(fp, "biim tanmlar", deikenler) eklinde
kullanlr. Bildiimiz scanf gibi almaktadr. Ancak klavyeden deil de
bilgileri fp ile temsil edilen dosyadan okumaktadr. Biim tanmlar ksm
normal scanf komutu ile ayndr.

Dosyaya yazma
putc putc(fp, c) eklinde kullanlr ve fp ile temsil edilen dosyaya c
deikenindeki 1 karakteri yazar.
fprintf fprintf(fp, "biim tanmlar", deikenler) eklinde
kullanlr. Bildiimiz printf gibi almaktadr. Ancak sonucu ekrana deil de
fp ile temsil edilen dosyaya yazmaktadr. Biim tanmlar ksm normal
printf komutu ile ayndr.

Dosya kapama
fclose dosyalarn program tarafndan ileri bitmi ise kapatlmalar
gerekir. Kapatma komutu iin fclose(fp); kullanlmaldr
Altrma 31
Klavyeden girilen deerlerden pozitif olanlarn p.dat, negatif olanlarn
n.dat isimli dosyaya yazan ve sfr girildiinde ilemi sonlandran program
C dili yaznz.
Altrma 32
Kendisine gnderilen iki dosya ismine gre birinden dierine kopyalama
yapp toplam kopyalanan karakter saysn aran programa dndren
fonksiyonu yaznz.
Altrma 33

8/13.02.2012 16:19:00

73

C Programlama Ders Notlar

Bir dosyadan okunan 3X3lk bir matrisi ekrana matris biiminde yazan C
Programn gelitiriniz.
Altrma 34
Bir dosyadan okunacak saylarn iinden en byk ve en kklerini bulup
ekrana yazacak C programn gelitiriniz.

Dorudan Eriimli Dosyalar


Dorudan eriimli dosyalarda da program ierisinde bu dosyay sembolize
edebilecek bir deikene ihtiya duyulur. Ancak bu tip dosyalarda bu
deiken int tipindedir.

Dosya ama ilemi


int dosya;
eklinde tanmlanr.
dosya=open("deneme.dat");
disk zerinde ad deneme.dat olan bir dosyay dorudan eriimli olmak
zere aacaktr.
dosya_deikeni=open("dosyann_fiziksel_ad"); ekliyle genel
tanm yazlabilir.
Bu ekilde bir dosya alnca dosyann program iinde temsil edilebilmesi
iin bir deer programa dndrlr ve bu deer dosya_deikeninde
saklanr. Eer bu deer -1 ise bu dosya bir takm nedenlerden dolay
alamamtr. Sonraki Okuma, Yazma vb. ilemlerde dosyamzn bu
numarasn kullanarak ilem yapmamz gerekecektir.
Bu dosyalarn ama komutlarnn biraz farkl olduunu grm olmalsnz.
Bu nedenle okuma yazma komutlar da biraz farkl olacaktr.

Dosyadan okuma
read read(dosya_no,okunanlar,okunacak_byte); eklinde kullanlr. Bu
fonksiyon ile dorudan eriimli dosyadan okuma yazma kafasnn
bulunduu noktadan itibaren okunacak_byte kadar karakter okunarak
okunanlar dizisine yerletirir. Sonu olarak bu fonksiyon okuduu karakter
saysn dndrr.

8/13.02.2012 16:19:00

74

C Programlama Ders Notlar

Dosyaya yazma
Yazma ilemi iin write komutu kullanlmaktadr. Bu Komut
write(dosya_no, yazlacaklar, yazlacak_byte); biiminde kullanlr.
Bu tanmda dosya_no bilgilerin yazlaca dosyay temsil eder. Yazlacaklar
ierisinde yazlacak bilgilerin bulunduu diziyi ifade eder. yazlacak_byte
ise dosyaya ka byte bilgi yazlacan belirtir. Bu fonksiyon yazlanlarn
toplam ka byte olduunu geri dndrr. Eer -1 deeri dnm ise
yazmada bir sorun ile karlalm demektir.

Dosya kapama ilemleri


Bu ekilde alan bir komutun kapatlmas iin close(fp); komutu
kullanlr.

Dorudan eriimli dosyalara zel durumlar.


Bu tip bir dosyada okuma yazma kafasnn konumunu okuma ya da yazma
yapmadan deitirmek mmkndr. Bu amala kullanlan bir lseek
fonksiyonu bulunmaktadr. lseek(dosya_no, mesafe, nereye_gore);
eklinde kullanlr. Burada dosya_no kafa hareketinin hangi dosyada
yaplacan belirtir. mesafe kafa hareketinin ka byte olacan belirtirken
(saysal bilgi) nereye_gore bilgisi bu hareket miktarnn nereye gre
yaplacan belirler (Dosya bana gre, dosya sonuna gre ve bulunduu
yere gre).

8/13.02.2012 16:19:00

75

C Programlama Ders Notlar

Veri Yaplar (structure)


Veri yaps iinde birden fazla deiken saklayan bir bilgi topluluudur.
Genellikle bu veriler farkl trdedir. Ancak ayn nesne iin kullanlan verileri
sembolize ederler ve tek bir nesne ad altnda anlatlrlar.
Basit bir rnek olarak bir renci kayd verilebilir. Bir renci nesnesinin
sahip olduu bir takm zellikler; ad, soyad, vize, final ve btnleme notu
gibi veriler tek bir isim altnda toplanabilir.
Bu tarzdaki veri yaplar karmak verilerin dzenli tutulmasn salar. Bu
zellikle byk programlarda dzenli bir yaplanma salayacaktr.

Temel Tanmlar
Bir tarih bilgisini ele alalm. Tarih birka blmden oluan bir bilgidir. Bu
blmler gn, ay, yl, haftann gn, ayn ad gibi deerlerden oluur. Bu
deerlerin tm tek bir veri yaps iinde u ekilde anlatlabilir.
struct date {
int day;
int month;
int year;
int yearday;
char mon_name[4];
};
struct kelimesi bir veri yaps tanmnn yapldn belirtir. Bu tanm kme
parantezleri iinde bu veri yapsnn detaylarnn anlatld bir tanmdr. Bu
sz dizimde kme parantezinden sonra noktal virglden nce bu veri
yaps cinsinden tanmlarnz yapmak zere deiken trlerinizi
anlatabilirsiniz.
Bir veri yaps tanm iinde bahsi geen her bir deiken o veri yapsnn
eleman veya yesidir. Bir veri yaps iinde geen bir elemana verdiiniz
bir ismi c programnn iinde bir baka deikene verebilirsiniz. Bunlar
bulunduklar ve hkmettikleri yerler itibari ile biri birlerine kartrlmazlar.
struct {...} x,y,z; eklindeki bir tanm grsellik olarak int x,y,z ile
ayndr. nk her ikisi de x,y,z adnda deiik trlerde de olsa
deikenler tanmlar ve bu deikenler uygun miktarda yer ayrr.
Deiken ad kullanlmakszn yaplan bir veri yaps tanm bellekte yer
ayrlmasna neden olmaz. Byle bir tanm sadece deikenin genel
grn ve ekli hakknda bir ablon bilgisi sunar. Eer veri yaps
tanmnda bir isimlendirme yaplm ise bu isimler ile programn dier
blmlerinde deikenler tanmlanabilir. rnein biraz nce tanmladmz

8/13.02.2012 16:19:00

76

C Programlama Ders Notlar

date adl veri yapsn u ekilde kullanarak gerek deikenlerin


tanmlanmasn salayabilirsiniz.
struct date tarih;
eklindeki bir satr ad tarih ve tr date olan bir deiken tanmlar. Bu
ekilde yaplacak bir tanmlama ile ilk deer atamas da yaplabilir. yle
ki:
struct date tarih={3, 3, 2004, 61, Mar};
Bir veri yapsndaki tek bir elemana deer atamak iin aadaki ekli
kullanabilirsiniz.
veriyapsad.elemanad
Bu tanmdaki . Veri yaps ile bu veri yapsnn iindeki elemann birbiriyle
ilikilendirilmesini salar.
Yukardaki date rneinde tanmlanan tarih adl deikenin iindeki
herhangi bir elemana eriebilmek iin programda u ekilde kullanmlar
bulunmaldr.
tarih.year=1994;
tarih.month=12;
tarih.day=22;
Veri yaplar ii ie tanmlardan da oluabilir. rnein bir renci veri
yapsnn u ekilde tanmlandn varsayalm:
struct ogrenci {
char adsoy[25];
char adres[40];
unsigned short vize, final, butunleme;
struct date dtarihi;
struct date kaytarihi;
}
Bu veri yaps tanmnda renci hem doum tarihi hem de kayt tarihi
olmak zere iki tarih bilgisine sahip olacaktr. Bu tarih bilgilerinin her biri
de yukarda bahsedilen tm elemanlara sahip olacaktr. Bu ekildeki bir
yapnn deikenle ifade edilmesi ve kullanlmas ise yle olmaktadr:
struct ogrenci ogr;
ogr.dtarihi.ay=8;
eklindeki kullanmda rencinin doum tarihinin ay bilgisi 8 olarak
verilmitir.

8/13.02.2012 16:19:00

77

C Programlama Ders Notlar

Altrma 35
Bir dairenin parametrelerinin struct deimi ile ifade edilmesi gerekirse
nasl tanmlanmas gerektiini gsteriniz.

Veri Yaplarnn fonksiyonlarla kullanlmas


C Veri yaplar zerinde tanml ilemler pek fazla deildir. Genel kural
olarak u sylenebilir: yaplabilecek tek ilem bir veri yapsnn &
operatr ile adres bilgisini elde etmektir. Bu, veri yaplarnn bir yerden
bir yere kopyalanamayaca ve fonksiyonlarda parametre olarak
geirilemeyecei anlamna gelir. Ancak yeni kurallara gre bu
kstlamalarn ou kaldrlmtr. Ancak veri yaplarna iaretiler bu
kstlamalardan etkilenmezler. O halde fonksiyonlarla veri yaplar
beraberce sorunsuz ekilde alr.
Bunlar konusundaki tanmlar daha fazla aklayabilmek iin rnekleri
yazmaya alalm. Kendisine gnderilen bir tarih bilgisinin yl iinde
kanc gne geldiini bulan bir fonksiyon yazalm. Bu fonksiyon u ekilde
yazlabilecei gibi;
Yilin_gunu=yil_gun(tarih.yil, tarih.ay, tarih.gun);
Bu fonksiyon tarih isimli veri yaps ile dorudan arlacak ekilde de
yazlabilir;
Yilin_gunu=yil_gun(&tarih);
Bu tanm fonksiyona tarih isimli veri yapsnn adresini gnderir ve bir tam
say dndrr. Bu fonksiyonun yazlm ekli u ekildedir.
rnek 22
int yil_gun(struct date *ti){
int i, day, leap;
day=ti->day;
for (i=1;i<ti->month;i++){
switch(i){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:day+=31;break
case 4:
case 6:
case 9:
case 11: day+=30;break
8/13.02.2012 16:19:00

78

C Programlama Ders Notlar

case 2:if(ti->year %4 ==0) day+=29;


else
day+=28;
}
return (day);
}
struct date *ti; ifadesi ti adnda date veri yapsna bir iareti tanmlar.
Bu ekilde tanmlanm bir veri yaps iaretisinin elerin eriirken
ti->day eklinde ifade etmek gerekir. Eer ad p olan bir veri yaps
iaretisi var ise bu veri yapsnn elemanlarna p->eleman eklinde
eriilebilir. (-> operatr bir tire iareti ile yanna yazlm byktr
iaretinden olumutur.)
Bu gsterimde p bir iareti olduuna gre (*p).day gsterimi de doru bir
gsterimdir. Ancak allagelmi gsterim -> eklinde olandr.
rnek 23
Aadaki rnekte Karmak bir saynn zerinde toplama ilemi yapan bir
fonksiyon tanmlanmtr. Sonra bu fonksiyon arlmtr.
struct karma{
double gercek,sanal;
};
void ktopla(struct karma a, struct karma b, struct karma *c){
c->sanal=a.sanal+b.sanal;
c->gercek=a.gercek+b.gercek;
}

// Program ierisinde bu fonksiyon u ekilde arlr.


ktopla(a,b,&c);

TypeDef
Cde varolan deiken trlerine yenilerini eklemek iin kullanlan bir
komuttur. rnein:
typedef int LENGTH;
kullanm int adl trn aynndan LENGTH ismiyle oluturur. Bu smi
kullanarak yeni deikenler tanmlayabilir tr dnmlerinden
faydalanabilirsiniz.
LENGTH len,maxlen;

8/13.02.2012 16:19:00

79

C Programlama Ders Notlar

Benzer eilde
typedef char *STRING;
eklindeki bir tanm karakter iaretisinin yeniden tanmlanmasn ve
adnn STRING olmasn salar.
STRING p,lineptr[LINES]; eklindeki kullanmlar p isminde bir karaktere
iareti tanmlar.
Dikkat edilirse typedef szc ile tanmlanan yeni tr deiken
tanmlanan konumda bulunur. Ve kullanm olarak static veya extern
ifadelerinde olduu gibi grlr. Genellikle oluturulan yeni trleri var
olanlarndan ayrt etmek iin byk harf kullanrz.
Daha karmak bir rnek olarak nceden verdiimiz renci rneini
burada kullanalm.
typedef struct ogrenci {
char adsoy[25];
char adres[40];
unsigned short vize, final, butunleme;
struct date dtarihi;
struct date kaytarihi;
} OGRENCI;
yazmnda ad OGRENCI olan yeni bir tr tanmlanmtr.
Aslnda typedef komutu yeni bir tr yaratmaz. Sadece bir ksm tanmlara
bir yenisini ekler. Gerekte de define gibi alr ve programn derlenmesi
srasnda typedef ile oluturulmu tanmlar ilgili yerlerde deitirerek elde
ettii yeni kaynak kodunu derler.

8/13.02.2012 16:19:00

80

C Programlama Ders Notlar

Hazr Fonksiyonlar
Diyagnostik ile ilgili fonksiyonlar
void assert(int ifade);
Bu fonksiyon sorunlar ile ilgili nedenlerin renilmesini salayacak satrlar
program iine yerletirir. fade hesaplanr ve eer yanl deer dnerse
assert fonksiyonu ar ile ilgili olarak dosya ad, hatal satrn numaras
ifadenin kendisini standart hata ktsna yazlr. Karlaacanz hata
mesaj ekilde bir ey olacaktr:
Assertion failed: ifade, file dosya_ad, line satr_no
Bu mesajdan sonra assert fonksiyonu abort fonksiyonunu arr. Eer
derleyici bildirimlerinden #define NDEBUG var ise assert fonksiyonu
ilevini yerine getirmez.

Karakter Fonksiyonlar
Bu blmdeki fonksiyonlar kedilerine parametre olarak gnderilen c
deerinin fonksiyon ad ile doru ifade edilebiliyorsa sfrdan farkl bir
deer aksi halde sfr deerini dndrrler.

int isalnum(int c)
c karakterinin rakam veya harf olmas durumunda 0 den farkl deilse sfr
dndren fonksiyondur.

int isalpha(int c)
c karakterinin harf olup olmadn kontrol eder ve harf ise bir dndrr.

int iscntrl(int c)
c karakterinin kontrol karakteri olup olmadn kontrol eder.

int isdigit(int c)
c karakterinin rakam olup olmadn kontrol eder

int islower(int c)
c karakterinin kk harf olup olmadnn kontrol eder.

8/13.02.2012 16:19:00

81

C Programlama Ders Notlar

int isspace(int c)
c karakterinin boluk olup olmadn kontrol eder. Bu boluk karakteri ,
\f, \n, \r, \t ve \v karakterlerinden biridir.

int isupper(int c)
c karakterinin byk harf olup olmadn kontrol eder.

int tolower(int c)
Kendisine gnderilen c karakterinin byk harf olmas durumunda kk
harfe eviren ve dndren byk harf olmamas durumunda olduu gibi
dndren fonksiyondur.

int toupper(int c)
Kendisine gnderilen c karakterinin kk harf olmas durumunda byk
harfe eviren ve dndren kk harf olmamas durumunda olduu gibi
dndren fonksiyondur.

Matematik Fonksiyonlar
Bu fonksiyonlar kullanabilmek iin math.h ktphanesini programnza
include deimi ile dahil etmeniz gerekecektir.

double acos(double x)
x deerinin Arc Cosinsn hesaplar. X deeri 1 ile 1 arasnda olmaldr
ve dnen deer 0 ile 3.14 olur.

double asin(double x)
x deerinin Arc Sinsn hesaplar. X deeri 1 ile 1 arasnda olmaldr ve
dnen deer 0 ile 3.14 olur.

double atan(double x)
x deerinin Arc Tanjantn hesaplar.

double cos(double x)
x deerinin Cosinsn hesaplar. X deeri radyan cinsinden bir a deeri
olmaldr.

8/13.02.2012 16:19:00

82

C Programlama Ders Notlar

double sin(double x)
x deerinin sinsn hesaplar. X deeri radyan cinsinden bir a deeri
olmaldr.

double tan(double x)
x deerinin tanjantn hesaplar. X deeri radyan cinsinden bir a deeri
olmaldr.

double log(double x)
x deerinin tabi logaritmasn hesaplar. X deeri pozitif bir say olmaldr.

double log10(double x)
x deerinin 10 tabanna gre logaritmasn hesaplar. X deeri pozitif bir
say olmaldr.

double pow(double x, double y)


x zeri y deerini hesaplar.

double sqrt(double x)
x deerinin karekkn hesaplar. X deeri pozitif bir say olmaldr.

double log(double x)
x deerinin tabi logaritmasn hesaplar. X deeri pozitif bir say olmaldr.

double ceil(double x)
xden kk olmayan en kk tam sayy bulan fonksiyondur. Yani x
deerini yukar yuvarlayan fonksiyondur.

double floor(double x)
xden byk olmayan en byk tam sayy bulan fonksiyondur. Yani x
deerini aa yuvarlayan fonksiyondur.

double fabs(double x)
x deerinin mutlak deerini hesaplar.

8/13.02.2012 16:19:00

83

C Programlama Ders Notlar

Genel Amal Fonksiyonlar


double atof(const char *nptr)
nptr ile gsterilen ifadenin ilk blmndeki anlaml saysal deerleri kesirli
deere dndrr.

int atoi(const char *nptr)


nptr ile gsterilen ifadenin ilk blmndeki anlaml saysal deerleri tam
deere dndrr.

long int atol(const char *nptr)


nptr ile gsterilen ifadenin ilk blmndeki anlaml saysal deerleri uzun
tamsayya deere dndrr.

int rand(void)
0 ile RAND_MAX aralnda rasgele bir say retir.

void srand(unsigned int sed)


sed deeri ile rasgele say retecini balatr. Bu fonksiyona gnderilecek
sed deeri retilecek rasgele deerlerin her seferinde farkl diziler eklinde
retilmesini salayacaktr.
Altrma 36
Srand() ve rand() fonksiyonlarn kullanarak 0..1000 aralnda gerek
rasgele saylar reten ve rettii bu saylar rast.txt isimli bir dosyaya
yazan C programn gelitiriniz.

void *malloc (size_t miktar)


miktar ile belirtilen (iaretsiz tam say) miktarda bellek sahasn heap
dediimiz yerden ayrarak arlan programa bu bellek sahasnn adresini
dndrr.

void *realloc(void *ptr, size_t miktar)


ptr ile gsterilen bellek sahas iin ayrlm miktarn miktar kadar bir alana
deitirilmesini salayan ve ayrlan yeni alan iin bellek sahasn dndrr

8/13.02.2012 16:19:00

84

C Programlama Ders Notlar

void free(void *ptr)


ptr ile gsterilen bellek sahas iin ayrlm alann serbest braklmasn
salar.

void exit(int status)


Programn normal ekilde sonlandrlmasn salar.

int abs(int j)
j ile gsterine deerin mutlak deerini dndrr.

Karakter Dizisi Fonksiyonlar


Bu fonksiyonlar karakter dizeleri zerinde ilemler yapan fonksiyonlardr.
Programlarnzda kullanlabilmeleri iin string.h ktphanesini dahil
etmemiz gerekecektir.

char *strcpy(char *s1, const char *s2)


s2 ile gsterilen dize iindeki ifadeyi s1 ile gsterilen dizeye kopyalar.

char *strncpy(char *s1, const char *s2, size_t n)


s2 ile gsterilen dize iindeki ifadeyi n harften fazla olmamak zere s1 ile
gsterilen dizeye kopyalar.

int strcmp(char *s1, const char *s2)


s2 ile gsterilen dize iindeki ifadeyi s1 ile gsterilen dize ile karlatrr.
ki dize eit ise 0, birincisi byk ise pozitif ikincisi byk ise negatif sonu
retilir

int strncmp(char *s1, const char *s2, size_t n)


s2 ile gsterilen dize iindeki ifadeyi n harften fazla olmamak zere s1 ile
gsterilen ifade ile karlatrr.

char *strcat(char *s1, const char *s2)


s2 ile gsterilen dize iindeki ifadeyi s1 ile gsterilen dizenin peine ekler.

char *strncat(char *s1, const char *s2, size_t n)


s2 ile gsterilen dize iindeki ifadeyi n harften fazla olmamak zere s1 ile
gsterilen dizenin peine ekler.
8/13.02.2012 16:19:00

85

C Programlama Ders Notlar

size_t strlen(const char *s)


s ile gsterilen dize iindeki ifadeni ka harften olutuunu bulan
fonksiyondur.

Tarih ve Saat Fonksiyonlar


Bu fonksiyonlar sistem tarih ve saati ile ilgili ilemleri yerine getiren
fonksiyonlardr. Kullanlabilmeleri iin time.h ktphanesini programnza
dahil etmeniz gerekecektir. Bu fonksiyonlar kullanrken aadaki veri
yapsn kullanmanz da gereklidir.
struct
int
int
int
int
int
int
int
int
int
}

tm {
tm_sec;
tm_min;
tm_hour;
tm_mday;
tm_mon;
tm_year;
tm_wday;
tm_yday;
tm_isdst

Bu arada bu ktphane iinde tanml u yeni trleri de fonksiyon


tanmlarnda greceksiniz.
clock_t zaman gstermeyi salayan aritmetik bir tr.
time_t zaman gstermeyi salayan aritmetik bir tr.
size_t unsigned int trnde yeni bir deiken.

Double difftime(time_t zaman1, time_t zaman0)


ki zaman ls arasndaki fark hesaplar fark saniye cinsinden ve double
trnde dndrlr. (zaman1-zaman0)

time_t time(time_t timer)


Bu fonksiyon geerli zaman bulur.

char *asctime(const struct tm *timeptr)


struct tm yapsndaki bir zaman bilgisini Sun Sep 16 01:03:52 1973\n\0
eklindeki bir karakter dizesine evirir.

8/13.02.2012 16:19:00

86

C Programlama Ders Notlar

struct tm *gmtime(const time_t *timer)


Gncel zaman bilgisini struct tm eklindeki bir zamana dntrr.

struct tm *localtime(const time_t *timer)


Gncel zaman bilgisini struct tm eklindeki bir zamana dntrr.
Bulunan bu zaman bilgisi yerel zaman bilgisidir.
rnek 24
Sistem zerindeki saat bilgisini ekrana yazan bir C Program gelitiriniz.
#include <stdio.h>
#include <time.h>
int main(){
struct tm zaman;
time_t zz;
zz=time();
zaman=localtime(zz);
printf(Gn:%d\nAy :%d\nYl:%d\n,
zaman.tm_mday,zaman.tm_mon+1,zaman.tm_year);
}

8/13.02.2012 16:19:00

87

C Programlama Ders Notlar

8/13.02.2012 16:19:00

88

C Programlama Ders Notlar

Derleyici Bildirimleri
Bu blmde yer alan konular byk programlar yazabilmek iin #include
ifadesinin nasl kullanlacan; makro ve sembolik sabitler tanmlamak iin
#define ifadesinin nasl kullanlacan ve Koullu derlemenin ne demek
olduunu anlatacaktr. Bu konular C n derleyicisinin ne olduunu
anlamanz salayacaktr. n derleme ilemi C derleyicisi programnz
derlemeye balamadan nce gerekleen ilemdir. Bu admda u ilemler
yaplr.

Baka dosya ve ktphanelerin programa dahil edilmesi,


Sembolik sabit ve makrolarn tanmlanmas,
Program kodlarnn koullu derlenmesinin salanmas,
n derleyici kodlarnn koullu olarak derlenmesi,

Tm n derleyici bildirimleri # (diyez) iareti ile balar.

#include bildirimi
Bu bildirim ile belirtilen dosyann bir kopyasn bildirimin bulunduu yere
kopyaladmz syleyebiliriz. Bu bildirim aada grld gibi iki farkl
ekilde kullanlabilir.
#include<dosyaad>
#include dosyaad
Bu iki kullanm arasndaki fark derleyicinin dosyay arayaca yeri
belirtmekten kaynaklanr. Trnak arasna yazlm bir dosya derleyici
tarafndan dosyann bulunduu klasrn iinde aranr. Bu tarz genellikle
programcnn kendi yazd dosyalar kaynak koda yerletirmek istedii
zaman kullanlr. Dier gsterimde eklenecek dosya sistemin standart
include klasrnn iinde aranr. Bu genellikle iletim sisteminden ve
derleyiciden bamsz noktalar iaret eder. ounlukla da Derleyiciye ait
ktphane balk dosyalarn programnza eklemenizi salar.
Bu bildirim genellikle programnzda kullandnz ktphanelere ait balk
dosyalarnn programnza dahil edilmesini salar. Bir balk dosyasnn
iinde ise ounlukla o konu ile ilgili sembolik sabitlerin, fonksiyon prototip
tanmlarnn, veri yaplarnn, union ve enum tr tanmlarn bulunduu
bilinir.

#define bildirimi
Bu bildirim programnzda sembolik bir sabit oluturmanz salar. Genel
kullanm u ekildedir:

8/13.02.2012 16:19:00

89

C Programlama Ders Notlar

#define sembolik_ifade yerine_konacak_ifade


Derleyici byle bir satrla karlatnda programn geri kalan ksmnda
sembolik_ifade ile gsterilen yere yerine_konacak_ifade denilen deerleri
yerletirir ve sonra derlemeye devam eder.
#define PI 3.14159
eklindeki bir ifade PI adnda bir sembolik sabit tanmlar. n derleyici
derleme ileminden nce program ierisinde PI grd yere 3.14159
deerini yerletirir. Bu tarz bir ilem programclara belirli deerler iin
sabitler tanmlamay ve programda bu sabitleri kullanmay salar. Bu
ilem ise kullancnn bir takm deerlere isim vermesini ve gerektiinde
ok kolay bir ekilde deitirmesini salar. rnein yukardaki PI
rneinde 3.14159 deerinin deimesi gerekirse sadece #define
tanmndaki saysal deerin deimesi yeterlidir. Programn yeniden
derlenip altrlmas durumunda tm hesaplamalar PInin yeni deeri iin
yaplr. Bu tr sabitler iin anlaml isimlerin kullanlm olmas programn
anlalabilirlii ve belgelendirilmesi noktasnda yardmc olacaktr.
Ancak #define ifadesi sadece sembolik sabitler tanmlamaz. Ayn zamanda
makro tanmlar yapmanz da salar. Bu ilem iin de yukardaki kullanm
ekli ayndr. Makrolar hem parametreleri hem de parametresiz
tanmlanabilirler. Parametresiz bir Makro sembolik sabit gibi ilem grr.
Parametreli kullanmda ise parametreler yerine konan ifadesinde uygun
yerlere yerletirilerek alrlar. u ekilde bir rnek dnelim.
#define CIRCLE_AREA(x) (PI * (x) * (x) ) byle bir tanmn
bulunduu programda u satr yazlrsa,
alan=CIRCLE_AREA(4); ifadesi n derleyici tarafndan u ekle alr
alan=(3.14159 * (4) * (4) );
Bu rnekte parantezlerin gereksiz olduu dnlebilir. Ancak makro
tanm daha farkl arlm olsayd parantezlerin son derece gerekli olduu
ortaya kacakt.
alan=CIRCLE_AREA(c+2); ifadesi n derleyici tarafndan u ekle alr
alan=(3.14159 * (c+2) * (c+2) );
Burada parantezlerin gereklilii ortaya kmaktadr. Aksi halde ilem
nceliinden dolay ilem yanl hesaplanacakt. yle ki
alan=(3.14159 * c+2 * c+2 );
ilemi tamamen hatal bir sonuca bizi gtrecektir.

8/13.02.2012 16:19:00

90

C Programlama Ders Notlar

#if...#endif bildirimi
#if ve #endif deimleri derleyicinin ve n derleyicinin derleme srecini
kontrol edecektir. Tm #if deimleri bir sabit tamsay hesaplar. Genel
grn u ekildedir:
#if !defined(NULL)
#define NULL 0
#endif
Bu tmce NULL diye bir sabitin tanml olup olmadna bakar ve tanml
deil ise NULL sabitini 0 olarak tanmlar. Aksi halde NULL zaten tanmldr.
Her #if bir #endif ile bitmek zorundadr. #ifdef ve #ifndef eklinde iki
ksa bildirim daha tanmldr ve bunlar #if define(SABIT) ve #if
!define(SABIT) eklindeki tanmlarn ksa biimleridir. Bunun haricinde
#elif ve #else eklinde koulun olumsuz durumlarn deerlendirmek
zere iki bildirim daha tanmldr.
Program gelitirme srecinde bazen programclar baz blmlerin
derlenmesini istemeyebilirler. Bu durumda n derleme bildirimlerinde u
ekilde faydalanlabilir.
#if 0
derlenmesini istemediiniz kod blmleri
#endif
Bu ekildeki bir blmn derlenmesini salamak amacyla 0 yerine 1
konulabilir.
Bu ekildeki koullu derleme ilemleri ounlukla hata ayklama
maksadyla kullanlr. Aslnda bu tr bir ilem iin debugger ad verilen
yazlmlar vardr ama bunlar anlayp kullanabilmek her zaman kolay
olmayabilir. Onun yerine programclar zaman zaman printf komutunu
istedikleri yerlerde kullanarak kendileri iin yeterli olacak bir takm
deerlerin yazlmasn salayabilirler.
#if DEBUG
printf(Deer:%d\n, x);
#endif
eklindeki bir blmde eer DEBUG adnda sembolik sabit tanmlanmsa
printf satr derlenip koda katlacaktr. Aksi halde bu satr
derlenmeyecektir. Bu programn datm srmn elde ettiimizde
DEBUG sembolik sabitini tanmlayan satrlar kaldrlarak derlenmelidir. Bu
da elde edilen kodda printf satrnn olmamasn salayacaktr.

8/13.02.2012 16:19:00

91

C Programlama Ders Notlar

#error ve #pragma bildirimleri


#error mesaj kelimeleri
gerekletirime bal olan bir hata mesaj grntlemeyi salar. Mesaj
kelimeleri istediiniz kadar kelimeden oluabilir. rnein
#error 1 Deer Tamas
eklindeki bir ifade derleyici tarafndan ilenirken#error ifadesi yanndaki
kelimeler hata mesaj olarak ekrana yazlacaktr. Derleme ilemi
duracaktr. Program derlenmeyecektir.
#pragma bildirimi de derleyiciye bal davranlar sergiler. Eer
kullandnz derleyici gerekletirimi #pragma bildirimini desteklemiyor ise
bildirim dikkate alnmaz.

8/13.02.2012 16:19:00

92

C Programlama Ders Notlar

Parametre Tanmlama
C dilini destekleyen bir ok ortamlarda komut satrndaki parametre veya
argmanlarn programa aktarlmasn ve deerlendirilmesini salayan
yaplar mevcuttur. main fonksiyonu ilk altrld zaman iki parametre ile
kendisine deer aktarlr. Bunlardan ilki (genellikle argc olarak adlandrlr)
komut satrndaki parametrelerin says verir. kinci parametre ise (argv
olarak adlandrlr) bir karakter dizesine iareti deeridir. Bu karakter
dizesinin her bir eleman parametre olarak verilen ifadeleri saklayan
deerledir. Bu karakter dizesi ve iaretiler zerinde oynamak iaretilerle
ilgili derste grdmz ilemleri yapabilmenizi gerektirir.
Bu zelliin nasl kullanldn gsterebilecek en basit program echo olarak
adlandrlabilir. Bu program kendisine parametre olarak gnderilen
ifadeleri ekrana yazan bir program olsun. u ekilde kullanldnda;
Echo merhaba dnya
kt merhaba dnya biiminde olacaktr.
Allagelmi olarak argv[0] programn altrlmasn salayan
altrlabilir komut dosyasnn adn bildirir. Bu artlar altnda argc en az 1
deerine sahiptir. Yukardaki rnekte argc 3 olmaldr. argv[0] echo;
argv[1] merhaba; argv[2] ise dnya deerlerine sahip olur. Birinci gerek
parametre argv[1] olarak elde edilirken son parametre ise argv[argc-1]
eklinde elde edilir. Bu durumda argc 1 ise program gerek bir parametre
ile altrlmamtr. Yukardaki echo programnn u ekilde yazldn
dnebiliriz.
rnek 25
main(argc, argv)
int argc;
char *argv[];
{
int i;
for (i=1; i<argc; i++)
printf(%s,%c,argv[i],(i<argc-1) ? : \n)
}
argv bir iareti olduu iin bu program yazmak iin farkl algoritmalar
dnlerek yazlabilir. areti aritmetii ve mant ile ilgili olarak
gelitirilecek bu programlardan biri u ekilde olabilir:
main(argc, argv)
int argc;
char argv[];

8/13.02.2012 16:19:00

93

C Programlama Ders Notlar

{
while (--argc>0)
printf(%s%c,*++argv,(argc>1) ? : \n);
}
argv bir karakter dizisine iareti olduu iin ++argv bu dizi iinde sradaki
dier eleman gsterir. areti deerinin her artmnda argc bir
azaltlaca iin argc>0 olduu srece geerli bir dizi elemanna bu tanm
salanm olacaktr.
Altrma 37
Klavyeden islem 8 X 3 eklinde belirtilen bir drt ilemi yapabilen sonucu
ekrana yazan ve eksik parametre girildiinde kullancy ekran vastasyla
uyaran bir C program gelitiriniz.
Altrma 38
Dosya ad klavyeden parametre olarak girilen bir dosyay ekrana listeleyen
program C Programlama dili ile gelitiriniz.

8/13.02.2012 16:19:00

94

You might also like