You are on page 1of 94

C Programlama Ders Notlar

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 rnek

8/13.02.2012 16:19:00

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 d o 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 u c s e f G 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 \t \\ \" Yeni Satr Karakteri 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;] } 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 :

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

8/13.02.2012 16:19:00

38

C Programlama Ders Notlar

case case case case case case case

: : : : : : : 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

3 4 5 6 7 8 9

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

1
2

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 Cos(x)= 1 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.

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. Dosyaya sadece yazabilir veya sadece okuyabilirsiniz. Bir kayda istenildii anda dorudan eriebilirsiniz. Bu kaydn sras bilindii takdirde okuma yaplabilir. Bu nedenle geriye doru okuma yapmak mmkndr. 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