You are on page 1of 113

C DL KULLANARAK

BLGSAYAR PROGRAMLAMA

ERCYES NVERSTES KONTROL VE BLGSAYAR MHENDSL GiRi


Bilgisayar, verileri saklayan , bunlar zerinde ok hzl ilem yapan ve istenen verileri sunan bir aygttr. Donanm (hardware) ve yazlm(software) diye iki blme ayrlr. Donanm bilgisayarn fiziksel bileenleridir. Yazlm ise donanm oluturan bileenlerin almasn ve ilevlerini yerine getirmesini salayan programlardr. lemci

Denetim Birimi

Aritmetik Mantk Birimi

Girdi kt Ana Bellek Yan Bellek

Girdi birimleri : Veri ve program girilmesini salar. Klavye, fare, kart okuyucu ... kt birimleri : stenen verilerin kullancya sunulduu ortam. Ekran, yazc... Ana Bellek Yan bellek : Programlarn ve ilenen verilerin geici olarak sakland birim. : Bilgilerin (veri, program) kalc olarak sakland ortamlar. Disket, disk,

manyetik erit. Bilgisayar brournde olan kavramlar, bit, byte, ... RAM, ROM... Bu gnk anlamda ilk bilgisayar ENIAC [Electronic Numeric integrator and computer] 30 ton, kablolar ile programlama 1842, Charles Babbag , analitik makine tasarlyor. Programlanabilir bir cihaz ncesi Hesap Makinesi. Ada Agusta programcs.

Bilgisayarlar : 1. Kusak 39 - 58 Vakum tp ile alyor 2. Kusak 58 - 64 Transistr 3. Kusak 64 - 75 Entegre 4. Kusak 75 - --- Yksek lekli entegre

Micro computer ( PC ) Workstation Mini Computer Main Frame Super Computer Bilgisayarn yaps

( bu gn 50 - MIPS)

(50 lerde 50 IPS)

Bellek (...., birimi byte CPU

bit)

( Bilgiyi ileyen ksm bellekten okur - yazar) : klavye (veya benzer) : ekran (veya benzer)

Denetim Birimi ( Hangi ilem, ne zaman yaplacak, belirler (gerekli iaretleri retir)) Giri/k

kincil ( yardmc ) bellek (Ktk olarak sakl bilgiler.) Hardware - Software Bilgisayarlar kendisine sorulan sorulara hemen cevap veren, bir sr problemi zen bir aygt deildir. Bilgisayarda yaplan her tr i, ilk nce insan aklnn szgecinden geiyor, insanlar tarafndan etraflca tasarlanyor, planlanp programlanyor [1].

ilk yaplan bilgisayarn karna geip hemen en eski soruyu sormular "Tanr var m". Bilgisayar ksa bir dnmeden sonra "Evet artk var". Bu nedenle, nce bilgisayara problemin zm retilmelidir. Fakat bunun iin bizim problemi zmemiz gerekir. Ve daha sonra bir programlama dili ile bu zm bilgisayara aktarlmaldr.

1- Problem zme ve Algoritmalar


1.1 Problem zme
Problem zmede, soruna hemen girimek yerine, dikkatli ve sistematik yaklam ilke olmaldr. Problem iyice anlalmal ve mmkn olduu kadar kk paralara ayrlmaladr. Descartes tarafndan "Discourse on Method" isimli kitabnda anlatlan problem zme teknikleri;[2] 1. Doruluu kesin olarak kantlanmadka, hibir eyi doru olarak kabul etmeyin; tahmin ve nyarglardan kann. 2. Karlatnz her gl mmkn olduu kadar ok paraya bln. 3. Dzenli bir biimde dnn; anlalmas en kolay olan eylerle balayp yava yava daha zor ve karmak olanlara doru ilerleyiniz. 4. Olaya baknz ok genel, hazrladnz ayrntl liste ise hibir eyi darda brakmayacak kadar kusursuz ve eksiksiz olsun.

1.2 Algoritmalar
Belirli bir grevi yerine getiren sonlu saydaki ilemler dizisidir.

.S. 9.yy da ranl Musaolu Horzumlu Mehmet (Alharezmi adn araplar takmtr) problemlerin zm iin genel kurallar oluturdu. Algoritma Alharezmi'nin Latince okunuu. Her algoritma aadaki kriterleri salamaldr. 1. Girdi: Sfr veya daha fazla deer dardan verilmeli. 2. kt: En azndan bir deer retilmeli. 3. Aklk: Her ilem (komut) ak olmal ve farkl anlamlar iermemeli. 4. Sonluluk: Her trl olaslk iin algoritma sonlu admda bitmeli. 5. Etkinlik: Her komut kiinin kalem ve kat ile yrtebilecei kadar basit olmaldr. Not: Bir program iin 4. zellik geerli deil. iletim sistemleri gibi program sonsuza dek alrlar . rnek 1.2.1 : 1'den 100'e kadar olan saylarn toplamn veren algoritma. 1. Toplam T, saylar da i diye arlsn. 2. Balangta T'nin deeri 0 ve i'nin deeri 1 olsun. 3. i'nin deerini T'ye ekle. 4. i'nin deerini 1 arttr. 5. Eer i'nin deeri 100'den byk deil ise 3. adma git. 6. T'nin deerini yaz. Algoritmalarn yazm dili deiik olabilir. Gnlk konuma diline yakn bir dil olabilecei gibi simgelere dayal da olabilir. Ak emas eskiden beri kullanla gelen bir yapdr. Algoritmay yazarken farkl anlamlar tayan deiik ekildeki kutulardan yararlanlr. Yine ayn ama iin kullanlan programlama diline yakn bir (szde kod = pseudo code) dil , bu kendimize zg de olabilir, kullanlabilir. Ayn algoritmay aadaki gibi yazabiliriz. 1. T=0 ve i=0 2. i'nin deerini T'ye ekle. 3. i'yi 1 arttr. 4. i<101 ise 2.adma git. 5. T'nin deerini yaz. Algoritmay bir de ak emas ile gerekleyelim. T=0

=0 nin Derini Tye ekle yi bir arttr

<101

Tyi yaz rnek 1.2.2 : ax2+bx+c=0 tipi bir denklemin kklerini veren algoritma. Girdi : a, b ve c katsaylar 1. a, b ve c katsaylarn al. 2. D = b2-4ac deerini hesapla. 3. D<0 ise gerel kk yok. 7. adma git. 4. 5. kt : denklemin kkleri

x1 = (b + D ) / (2a) x2 = (b D ) / (2a)

6. deerlerini yaz. 7. Dur. Dng Gsterimi Tekrarlanan admlar n. Koul saland srece n.1 ... n.2 ... n.3 ... rnek 1.2.3 : ki tamsaynn arpma ilemini sadece toplama ilemi kullanarak gerekleyin. Girdi : iki tamsay kt : saylarn arpm 1. a ve b saylarn oku 2. c =0 3. b>0 olduu srece tekrarla .3.1. c=c + a tekrarlanan admlar

3.2. b = b-1 4. c deerini yaz ve dur rnek 1.2.4 : Bir tamsaynn faktoriyelini hesaplaynz. Girdi : Bir tamsay kt : saynn faktoriyel lgili formul: Faktoriyel(n)=1*2*...*n 1. n deerini oku 2. F=1 3. n >1 olduu srece tekrarla .3.1. F=F*n 3.2. n= n-1 4. F deerini yaz rnek 1.2.5 : ki tamsaynn blme ilemini sadece karma ilemi kullanarak gerekleyin. Blm ve kalann ne olduu bulunacak. 1. a ve b deerlerini oku 2. m=0 3. a>=b olduu srece tekrarla 31 a=a-b 32 m = m + 1 4. kalan a ve blm m 'yi yaz rnek 1.2.6 : 100 tane sayy okuyup, ortalamasn bul 1. T=0, i=0 2. i<101 olduu srece tekrarla 21 m deerini oku 22 T = T + m 23 i = i + 1 3. T = T / 100 1. Ortalama T yi yaz 2. Dur rnek 1.2.7 : Bir snava giren rencilerin not ortalamasnn hesaplanmas 1. Tm snav katlarn inceleyip notlarn toplamn hesapla 2. Ortalamay notlarn toplamn incelenen snav kadna blerek hesapla 3. Ortalamay yaz.

1. Notlarn toplamn ve incelenen snav kad saysn sfr kabul et 2. Sradaki snav kadnn notunu notlarn toplamna ekle 3. ncelenen snav kad saysn Bir arttr 4. ncelenecek snav kad var ise 2. Adma git 5. Ortalamay notlarn toplamn incelenen snav kadna blerek hasapla 6. Ortalamay yaz 1. Notlarn toplamn ve incelenen snav kad saysn sfr kabul et 2. Her bir snav kad iin 21. Sradaki snav kadnn notunu notlarn toplamna ekle 22. ncelenen snav kad saysn bir arttr 3. Ortalamay notlarn toplamn incelenen snav kadna blerek hesapla 1. Ortalamay yaz

Koul Gsterimi n. Koul doru ise n.D.1 n.D.2 n.D.3 aksi halde n.Y.1 n.Y.2 n.Y.3 Kk bulma rneinde 3. Adm tekrar yazarsak 3. D>=0 ise yanl olduunda ilenen admlar doru olduunda ilenen admlar

3.D.1 3.D.2 aksi halde

x1 = (b + D ) / (2a) x2 = (b D ) / (2a)

3.Y.1 Reel kk yoktur

Sorular: * Girilen saydan en byn bulan algoritmay yaznz. * Tamsaylarda s alma ilemini gerekletiren algoritmay yaznz ( ab ). * 1-100 arasnda tutulan bir sayy tahmin eden algoritmay yaznz. rnek 1.2.8 : Aracn otopark cretinin hesaplanmas. Aralarn en fazla 24 saat kaldn varsayn. 0 - 2 saat 150 bin 2 - 8 saat 300 bin 8-24 saat 500 bin 1. Aracn ka saat kaldn ren ( t olsun ). 2. t <= 2 ise 2.D.1. cret = 150 bin Aksi halde 2.Y.1. t<=8 ise 2.Y.1.D.1. cret = 300 bin Aksi halde 2.Y.1.Y.1. cret = 500 bin 3. creti yaz 1. Dur rnek 1.2.9: Snavdaki en byk notun bulan algoritma. 1. En byk = ilk snav kadndaki not (ya da olabilecek en dk deer kabul edilebilir). 2. ncelenecek snav kad var ise 21 Snav kadndaki not > En byk ise En byk = Snav kadndaki not 3. En byk deerini yaz. 1. Dur Algoritmann yazm daha simgesel olabilir. Ni i. rencinin notu olsun. 1. EB = N1 2. i = 2 3. ncelenecek snav kad var ise 31 Ni>EB => EB = Ni 32 i = i + 1 4. EB yi yaz.

9 1. Dur

rnek 1.2.10 : Programn C dili ile yazlp alr hale getirilmesi. 1. 2. 3. 4. Program bilgisayara gir Kaynak dosya olarak kaydet Kaynak dosyay derle ( compile) Derleme sonucunda hata var ise 41 Hatalar dzelt 42 3. Adma git 5. Oluan ama dosyasna dier dosyalar bala (link) 1. Balama sonucunda hata var ise 61. Hatalar dzelt 62. Hatalar kaynak dosya ile ilgili ise 2. adma aksi halde 5. adma git 7. Program altrlmaya hazr

2-

Programlamaya Giri

Program : Belirli bir problemi zmek iin bir bilgisayar dili kullanlarak yazlm deyimler dizisi. nceki blmde bir problemin zm ile ilgili teknikler sunmutuk. Bir problemi bilgisayar ile zmek iin gelitireceimiz programn yazmnda izleyeceimiz admlar: i) Problemin ne olduunu kavra. zm iin gereksinimleri belirle. ii) Problemin girdilerini, ktlarn ve dier kstlama ve gereksinimleri belirle ( bilgilerin giri ve k biimlerinin nasl olacana kadar). iii) Problemin zmn veren algoritmay yaz. iv) Algoritmay bir programla dili ile yaz.

10

v) Programn doru alp almadn test et. Bu testi deiik veriler (girdiler) iin tekrarla.

2.1 lk Program rnei #include <stdio.h> main() { int i ; scanf("%d",&i); i:=i*i; printf("%d",i); } BCPL B (1967 Ken Thompson) C (Denis Ritchie unix i yazmak iin) az sayda sakl szck ksa ve etkin program ok sayda ile assembler e yakn kod tanabilir kod source -----> compiler -----> object kaynak derleyeci balama derleyeci -----> link ama balama kullancya braklan kontroller (dizinin boyutu gibi ) dk okunabilirlik Deiken tanm Programn gvdesi Kullanlan ilevler ile ilgili balk dosyas

kaynak kod : C dili ile yazlm olan program. : Kaynak kodu makina koduna evirir : Birden fazla ama kodu dosyasnn tek dosyada birletirilmesi ama kodu : Kaynak kodun makina dilindeki karl

2.2 Veri Tipleri


Veri tiplerini vermeden nce yazlan bir programn getii aamalara gz atalm. 2.2.1 Int Tip Integer = Tamsay Tamsaylar ierir. Bellekte 2 Byte tutar. 5 , -19 , 25000 gibi Minimum : -231 = -32768 Maksimum : 231-1 = 32767

11

2.2.2 Gerel Tipler (Float, Double) Gerel saylar ierirler. float : Bellekte 4 Byte yer tutar. 3.4E-38 ile 3.4E+38 aralnda deer alr. Hassasiyet 7-8 basamaktr. double : Bellekte 8 Byte ter tutar. 1.7E-308 ile 1.7E308 aralnda deer alr. Hassasiyet 1516 basamaktr. 218.1 , -5.2 , 4.0 Bilimsel gsterim biimi 2.5*103 = 2.5E3 2.2.3 Char Tip Char : Karakter : Alfanumerik karakterleri ierir. '5' , '*' , 'K' 2.5*10-3 = 2.5E-3

2.3 Sabitler (CONST)


#include <stdio.h> main() { const float PI=3.14; float r, Alan; scanf("%f",r); alan := PI*r*r; printf(('Alan = %f', alan); } CONST (sabit) : Deeri programn almas boyunca deitirilemez. Kullanm biimi const tip Belirleyici=deeri; const float PI=3.14; Tip belirtilmez ise tamsay kabul edilir. Tanmlama ksm

2.4 Deikenler
Deeri programn almas boyunca deitirilekir. Kullanm biimi:

12

Tip Belirleyici [,Belirleyici] ; int i; float alan;

2.5 Belirleyiciler (Identifier)


Bileenlere isim verme. (Sabit, deiken, altprogram, etiket, tipler (kullanc tanml)). 2.5.1 Kstlamalar . lk karakteri rakam olamaz . Sadece harfler, rakamlar ve _ (underscore) karakterinin birleiminden oluabilir. . C diline ait sakl (reserved) szckler kullanlamaz. . En fazla 31 karakter olabilir. . Kk - byk harf ayrm vardr. 2.5.2 isimlerin Seimi . Belirleyicinin kullanm amacna uygun anlaml isim sein. (Hungarian notation) . Ne fazla ksa ne de fazla uzun olsun. 3 - 10 karakter uzunluunda olmasn alkanl edinin.

2.6 Matematiksel ifadeler


Matematiksel ifadeleri gnlk hayattaki biimde bilgisayarda yazamadmz iin belli bir kurallar uymamz gerekir. Kullandmz matematiksel ilemler ve anlamlar yledir: +,-,*,/ 7. / 2 ---> 3.5 7/2 ---> 3 7 % 2 ---> 1 2 % 7 ---> 2 2/7 ---> 0 Matematiksel ifadeler hesaplanrken izlenen admlar: 1. nce parantez iindeki ifadeler hesaplanr. ie parantezler var ise hesaplamaya en iteki parantezden balanr. 2. ilk nce * , / ve % ilemleri daha sonra + ve - ilemleri yaplr. 3. ncelik sras ayn olan ilemlerde hesaplama soldan saa doru yaplr. --> 7.5 5./2*3 toplama, karma, arpma, blme (nokta saynn gerel yorumlanmasn salar) (saylar int kabul edilip sonuta int tipine dntrlr) % tamsay blme sonucundaki kalan verir (modulus)

13

Bir C Programnn Genel Yaps balk dosyalar. Kullanlan deyimler ile ilgili main() { sabitler ; deyimler; } sabitlerin tanmlama blm Program gvdesi deikenler; deikenleri tanmlama blm

2.7 Atama Deyimi (Assignment)


Bir deikene bir deer(sabit, deiken, ifade) vermek. DeikenAd = deer; x=8; y = x + 15 ; y = (8 - x) / (2 - x) ; rnek 2.7.1: 5x2+2 fonksiyonunun x=4.8 noktasndaki deerini main() { float x, y ; x = 4.8; y = 5 * x * x + 2; } } rnek 2.7.2: Vize ve final notlarnndan geme notu main() { float vize, final, ort; vize = 50; final = 60; ort = vize * 0.4 + final * 0.6; } rnek 2.7.3: 1998 ylna kadar geen gn says main() { float gun; int yil = 1996; gun = 365 * (yil - 1); gun = gun + (yil -1 ) / 4;

2.8 printf ilevi


Program iinde istenen deerleri kt birimlerine gndermek iin kullanlr. Normal kullanmnda kt birimi olarak ekran kabul edilir. Kullanm biimi: prinf( kontrol, <parametreler>)

14 <kontrol> ile belirtilen bilgiye gre parametreleri yazar. Kontrol metini iki ksmdan oluur. o sradan karakterler: dorudan yazlrlar. o dnm/biim belirleyici karakterler: Deerlerin nasl yazlaca bildirilir. printf(" sonu = %d", k); --- integer deer yazlacaktr --------ekrana aynen aktarlr Dnm belirlemek iin nce % karakteri ve ardndan dnmn nasl olacan belirten karakter verilir. Bu karakterlerden bazlar: d : decimal (integer) u : unsigned decimal c : char (tek karakter) s : string e : float/double sayy bilimsel gsterimde yaz f : float/double sayy [-] mmm.nnnnn biiminde yaz ld : long integer lu : unsigned long integer Le,Lf : long double ESC dizileri : \n : satr ba, \a : zil , \t : tab, \b : bir karakter geri

program paras i=5; printf("%d",i) ; printf("'i=%d",i) ; printf("i=") ; printf("%d",i) ; printf("i=\n") ; printf("%d",i) ; printf('i=%d\n",i) ; printf("%d - %d",i, 5*i); i=5 i= 5 i=5

ekranda grnen / imlein konumu

alt satra geer

i=5 alt satra geer 5 - 25

Biimli yazdrma % karakteri ile dnm karakteri arasna aadaki karakterler de kullanlabilir. - : sola dayal yaz m : yazlacak deer iin ayrlan alan

15 n : deerin ka karekteri yazlaca s = "ABCDEF" printf("%10s ",s); printf("%10.3s ",s); x = 128.5 ; printf("%7.2f",x) ; x = 85.47 ; printf("%6.3f",x) ; printf("%6.1f",x) ; 85.470 ## 85.5 # 128.50 ....ABCDEF .......ABC

rnek 2.8.1 : Yarap belli dairenin alann hesaplayan program yaznz. (ilk yazlan program) #include <stdio.h> main() { const float PI=3.14; float r, alan; r = 7; alan := PI*r*r; printf(('Alan = %f', alan); } rnek 2.8.2 : En fazla drt basamak olabilen saynn basamak deerlerini yazdr. % ve / ilemlerinin kullanm. #include <stdio.h> main() { int i,y; y=1985; i= y / 1000; printf("%d",i); y= y-i*1000; i= y / 100;

16

printf(" %d",i); y = y-i*100; i= y / 10; printf(" %d",i); y = y-i*10; printf(" %d\n",y); i = 1985; printf("%d ",i / 1000); printf("%d ",(i / 100) % 10); printf("%d ",(i / 10) % 10); printf("%d\n",i % 10); } rnek 2.8.3: ax2+bx+c=0 tipi bir denklemin kklerini veren program yaznz. Girdi : a, b ve c katsaylar kt : denklemim kkleri Algoritma : 1. a, b ve c katsaylarn oku. 2. Delta= deerini hesapla. 3. x1 ve x2 deerlerini hesapla. 4. Kkleri yaz. Programn kodlanmas: #include <stdio.h> #include <math.h> main() { float a, b, c; float x1, x2; float d; a = 1; b = -3; c = 2; d = b * b - 4 * a * c; x1 = (-b + sqrt(d)) / (2 * a); x2 = (-b - sqrt(d)) / (2 * a); printf("Kkler = %f , %f",x1, x2); } C dilinde karekk almak iin bir deyim yoktur. rnekte bunu yerine getiren C diline eklenmi olan sqrt() fonksiyonu kullanlmtr. Aada buna benzer artk C derleyecilerinde standart olmu baz fonksiyonlar verilmitir. Bu ilevler math.h balk dosyasnda tanmldr. /* printf ilevi iin */ /* sqrt ilevi iin */

17

Fonksiyon abs(x) fabs(x) pow(x, y) sqrt(x) exp(x) log(x) log10(x) ceil(x) floor(x)

x ,y int double double double double double double double double

Sonu int double double double double double double double double x'in mutlak deeri x'in mutlak deeri xy x'in karekk ex deeri ln(x) deeri log10(x) deeri x ten byk ilk tamsay x ten kk ilk tamsay

rnekler: ceil(5) ceil(5.2) ceil(-5.2) floor(5) floor(5.2) floor(-5.2) 5 6 -5 5 5 -6

2.9 scanf levi


Klavyeden veri okumak iin kullanlr. Yap olarak printf ilevi ile hemen hemen ayndr. Kullanm biimi: scanf( kontrol, <deikenler>) Girilen karakterler <kontrol> metininde belirtilen biimlere gre deikenlere aktarlr. Deikenler iareti tipinde olmaldr. Yani parametre olarak deikenin adresi gnderilmelidir. Ayrclar boluk, tab, enter scanf("%f %f %f ", &a, &b, &c); scanf ilevinin deeri 0 ise hibir deikene deer atanmam >0 ise baarl bir ekilde deer atanan deiken says int a,b,c; float m,n; scanf("%d", &a); Klavyeden tamsay okur. Girilen deer a deikenine aktarlr.

18

scanf("%d %d",&a,&b) deikenine aktarlr. scanf("%f %d", &m, &a);

Klavyeden girilen ilk deer a deikenine, ikinci deer b Klavyeden ilki gerel, ikincisi tamsay olmak zere iki deer okur.

kinci dereceden denklem zmnn yapld rnekte katsaylar klavyeden okutmak istersek scanf("%f %f %f ", &a, &b, &c); Farkl kullanc arayznde yazarsak printf(Katsaylar srasyla giriniz (a b c) : ); scanf("%f %f %f ", &a, &b, &c); printf(a katsaysn giriniz : ); scanf(%f, &a); printf(b katsaysn giriniz : ); scanf(%f, &b); printf(c katsaysn giriniz : ); scanf(%f, &c); rnek 2.9.1: Vize ve final notlarnndan ortalamay hesaplayan programda deerlerin klavyeden okunmu hali. main() { float vize, final, ort; printf(Vize notunu giriniz ); scanf(%f, &vize); printf(Final notunu giriniz ); scanf(%f, &final); ort = vize * 0.4 + final * 0.6; printf(Ortalamas = &f\n, ort); }

2.10 Mantksal ifadeler


Sonucu Doru veya Yanl olan ifadelerdir. Sonu sfr ise yanl aksi halde doru kabul edilir. likisel ileler(operatr) : iki deer arasndaki ilikiyi test etmek iin kullanlr. ile > >= == < <= != anlam byk byk - eit eit kk kk - eit eit deil

19

x=8, y=5 iin x > y Doru x < y Yanl x !=y Doru Mantksal ileler : ki mantksal ifade arasndaki iliki zerindeki ilikide kullanlr. ! || DEL (NOT) (AND) VEYA (OR) (X>0) && (X>Y) (X>0) || (Y>0) fadelerde ilelerin yrtlme sras ile ( ) ! *, /, % +, <, <=, >=, > ==, != &&, || = en dk (son yrtlr) = ileci sadan sola, dierleri soldan saa doru yrtlr. Grld gibi ifadelerde matematiksel ve mantksal ilemler bittikten sonra iliki test edilir. X=50, Y=80, Z=45 iin ( ( X / 4 + Y / 4 + Z / 2 ) >= 50 ) && ( Z >= 50 ) ncelii en yksek (ilk yrtlr) && VE

20

3 - Dng ve Koul Deyimleri


Programlar (algoritmalar) temel blok kullanlarak gerekletirilebilirler. Bunlar; ardarda, bir koula bal olarak ve sonlu sayda yineleme (dng) dir.

3.1 Koul Deyimleri


Birka seenekten birini semek veya bir deyimin bir koula bal olarak ilemek iin kulanlr. 3.1.1 if-then-else Deyimi if (<mantksal ifade>) blok_doru; else blok_yanl; Mantksal ifade doru ise blok_doru, yanl ise else szcnden sonraki blok_yanl yrtlr. else ksm seimlidir, gerekmiyorsa kullanlmayabilir. rnek 3.1. 1.1 Girilen saynn tek/ift olduunu yazan program #include <stdio.h> main() { int i; scanf("%d", &i); if ( i % 2 == 1) printf("Tek"); else printf("ift"); } Bileik (Compound) Deyimler { ve } karakterleri ile snrlandrlm bir dizi deyimden oluur. { i = 5; j = i/2; k = i+1; } Eer bloklarda birden fazla deyim kullanmak gerektiinde bileik deyim kullanlr. if (yil % 4 == 0) { subat =29; gunyil = 366; } else { subat =28; gunyil = 365; }

21 rnek 3.1.1.2 : kinci dereceden denklemin kklerinin bulunmas. if (delta<0) printf("Gerel kk yoktur.\n"); else { x1 = (-b + sqrt(delta)) / (2 * a); x2 = (-b - sqrt(delta)) / (2 * a); printf("Birinci kk = %f\n" , x1); printf("ikinci kk = %f\n" , x2); } rnek 3. 1.1.3 : Klavyeden girilen karakterin rakam olduunun tesbiti. char c; c = getch(); if ((c>='0') && (c<='9') printf("Rakam girdiniz."); rnek 3. 1.1.4 : Girilen saydan en knn bulunmas (ie IF kullanm). scanf("%d%d%d", &s1, &s2, &s3); if ((s1<s2) && (s1<s3)) ek =s1; else if (s2<s3) ek =s2; else ek = s3; printf('En kk olan = %f", ek); II. yol : scanf("%d%d%d", &s1, &s2, &s3); ek = s1; if (ek>s2) ek =s2; if (ek>s3) ek =s3; printf('En kk olan = %f", ek);

rnek 3. 1.1.5: Fonksiyonun girilen t deeri iin ald deeri hesaplayp yazan program.

22

main() { float y, x; printf(x deerini giriniz); scanf(%f, &x); if (x > -1 && x<2) y = 2/3 * (x + 1); else if (x>2 && x<=3) y = 2; else y = 0; printf(Fonksiyonun deeri = &f, y); }

rnek 3. 1.1.6: Vergi iadesini hesaplan program yaznz. (elseif yaps) (0-60 bin : %10, 60-120 bin : %,120-200 bin : %12,>200 bin : %5) main() { float fat_top, vergi_iade; printf("Fatura toplamlarn giriniz "); scanf("%f", &fat_top); if (fat_top < 60000) vergi_iade = fat_top * 0.10; else if (fat_top < 120000) vergi_iade = 6000 + (fat_top - 60000) * 0.20; else if(fat_top < 200000) vergi_iade = 18000 + (fat_top - 120000) * 0.12; else vergi_iade = 27600 + (fat_top - 200000) * 0.05; printf("denecek vergi iadesi = %f\n", vergi_iade); } rnek 3. 1.1.7: Girilen tarihteki gnn adn veren program yaznz. #include <studio.h> main ( ) { int gun, ay, yl ; long gt ; printf(Tarihi gir) ; scanf ( %d %d %d ,&gun) /* oncek yllardak gun saysn hesapla */

23

gt=( yl*1)*365 + yl/4; /* bu yildaki aylardaki gunleri ekle */ if (ay==2) gt = gt + 31 ; else if (ay ==3) gt = gt + 31 + 28 ; else if (ay ==4) gt = gt + 31 + 28 +31; else if (ay ==5) gt = gt + 31 + 28 +31+ 30 ; else if (ay ==6) gt = gt + 31 + 28 +31+ 30 +31; else if (ay ==7) gt = gt + 31 + 28 +31+ 30 +31+ 30 ; else if (ay ==8) gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31 ; else if (ay ==9) gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31+30 ; else if (ay ==10) gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31+30 + 31; else if (ay ==11) gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31+30 + 31+ 30 ; else if (ay ==12) gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31+30 + 31+ 30 +31; /*Bu ay ekle */ gt = gt+ gun; if(yl%4==0 && ay>2), gt =gt+1; gt=gt %7, if(gt==1) printf(Pazar); else if(gt==2) printf(Pazartesi); else if(gt==3) printf(Sal); else if(gt==4) printf(Carsamba); else if(gt==5) printf(Persembe); else if(gt==6) printf(Cuma); else if(gt==7) printf(Cumartesi); } 3.1.2 switch Deyimi switch(<seici>) { case seenek1 : Deyim; case seenek2 : Deyim; .

24 . . default : } Seicinin ald deere eit seenein olup olmadna bakar. Var ise o noktadan sonraki deyimler yrtlr. switch deyiminin sonuna gelindiinde veya break deyimi ile karlaldnda yrtme ilemi durur ve programn ak switch deyimini izleyen deyim ile devam eder. switch(i) { case 1 : printf("Bir"); case 2 : printf("ki"); default : printf("Hibiri"); } i=1 ise k BirkiHibiri i=2 ise k kiHibiri Sorunu ortadan kaldrma iin her durum iin break deyimi eklenmeli. . Seici Ordinal tiplerden biri olmaldr (Ordinal tip: tm deerleri listelenebilinen veri tipleri - integer, char). . Seici ile seenekler ayn tipte olmaldr. . default ksm seimliktir. Seeneklerin hibiri uygun deil ise yrtlr.

Deyim;

#include <stdio.h> main() { char islem; int s1, s2, s3; printf("nce ilemi sonra saylar girin "); scanf("%c%d%d",&islem, &s1, &s2); switch (islem) { case '+' : s3 = s1 + s2; break; case '-' : s3 = s1 - s2; break; case '*' : s3 = s1 * s2; break; case '/' : s3 = s1 / s2; break; default : printf ("Hatal ilem"); } printf("\nSonu = %d",s3); } rnek 3.1.2.1: Mevsimleri yaz. scanf("%d", &ay); switch (ay) { case 3: case 4: case 5: printf("ilkbahar"); break; case 6: case 7: case 8: printf("yaz"); break; case 9:

25 case 10: case 11: printf("sonbahar"); break; case 12: case 1: case 2: printf("k"); break; } switch deyimi yerine if deyimi kullanlabilir. Ancak switch deyimi program daha okunabilir kld iin gerekli olduu durumlarda kullanlmaldr. rnek 3.1.2.2 : 16'lk sistemdeki rakamn 10'luk sistemdeki karl (char tipinin say gibi davran). switch(c) { case '0': case '1': ... case '9': i = c - '0'; break; case 'a': case 'A': i = 10; break; ... case 'f': case 'F': i = 15; break; } rnek 3.1.2.3: Snav notunu harfe dntren program yaznz. ( >=90 :AA, 85-89:BA, 80-84:BB, 75-79:CB, 70-74:CC, 60-69:D, <60 :F ) rnek 3.1.2.4: Belirtilen tarihin hangi gne denk geldiini bulan program yaznz. else if yaps yerine switch kullanarak

3.2 Dng Deyimleri (Yineli)


Bir ya da birden fazla deyimin tekrar edilemesini salarlar. C dilinde while, for ve dowhile deyimleri dng ilevini salar. Tekrar edilen deyimlere dng gvdesi denir. 3.2.1 while Deyimi while <mantksal ifade> Deyim Mantksal ifade doru olduu srece Deyim yrtlr. Eer yanl ise kontrol bir sonraki deyime geer.

rnek 3.2.1.1 : 1'den 100'e kadar olan saylarn toplam. 1. i =1 2. j = 0 3. i < 101 olduu srece 31 j = j + i 32 i = i + 1 main() { int i, j; i =1; j = 0;

26 4. Toplam j yi yaz while (i<101) { j =j+i; i =i+1 } printf("Toplam = %d",j); }

rnek 3.2.1.2: Toplama ve arpma kullanarak arpma imeini gerekleyiniz. main() 1. a ve b saylarn oku { int a, b, c; 2. c =0 printf (iki sayy giriniz ); scanf(%d%d, 3. b>0 olduu srece tekrarla &a, &b); c = 0; .3.1. c=c + a while (b > 0) { 3.2. b = b-1 c = c + a; 4. c deerini yaz ve dur b = b - 1; } printf(Sonu = &d\n, c); } rnek 3.2.1.3: Girilen saynn faktoriyelini hesaplayan program yaznz. main() 1. n deerini oku { int n; 2. F=1 long f; 3. n >1 olduu srece tekrarla printf (sayy giriniz ); scanf(%d, &n); f = 1; .3.1. F=F*n while (n > 1) { 3.2. n= n-1 f = f * n; n = n - 1; 4. F deerini yaz } printf(Sonu = &d\n, f); } rnek 3.2.1.4: Klavyeden girilen saylar oku. Saylarn toplam 21'den byk veya eit olduu zaman dur. main() { int i, j = 0; while (j<21) { scanf("%d",&i); j =j+i; } printf("Toplam = %d",j); } rnek 3.2.1.5: 1993 yl itibar ile lke nfsu 60 milyondur. Yllk nfs art oran %2.3 tr. Sonraki 10 ylda lke nfsunu yllara gre listeleyen program. /* Nufus Tablosu */ #include <stdio.h> main() {

27 int i; /* sayac */ int yil; /* yillar */ float nufus; /* nufus miktari */ float artis; /* artis orani */ artis = 0.023; yil = 1993; nufus = 60000000; printf("%d - %10.0f\n",yil,nufus); i = 1; while (i < 11) { nufus = nufus * (1 + artis); printf("%d - %10.0f\n",yil + i,nufus); i = i + 1; } } rnek 3.2.1.6 : Girilen tamsaynn mkemmel say olup olmadnn syleyen program yaznz. (mkemmel say = tam blenlerin toplam saynn kendisine eit) rnek 3.2.1.7 : Girilen tamsaynn ka basamaktan olutuunu syleyen program yaznz. rnek 3.2.1.8 : Girilen tamsay ierisinde ka tane 1 olduunu syleyen program yaznz. rnek 3.2.1.9: Girilen tamsaynn son basaman yuvarlayan program yaznz. son basama >=500 > 1000 e, <500 ise 0 a yuvarlayacak (2560 3000, 2490 2000 ) rnek 3.2.1.10: Snavn ortalamasn hesaplayan program yaznz. 1. Durum : snava giren renci says belli main() { int i, ogr_say, not_top, not; float ort; not_top = 0; i = 0; printf(renci saysn giriniz ); scanf(%d, &ogr_say); while (i < ogr_say) { printfSradaki rencinin notu = ); scanf(%d, &not); not_top = not_top + not; i = i + 1; } ort = float (not_top) / ogr_say; printf(Ortalama = &f\n, ort); } 2. Durum : snava giren renci says belli deil Bu durumda giriin bittiini gsterir bir bilgiye (iarete) ihtiya vardr. Snav notu iin 0 dan kk bir deer girildiinde girme ileminin sona erdiinin varsayalm. ogr_say = 0; printfSradaki rencinin notu = ); scanf(%d, &not); while (not >= 0) { not_top = not_top + not;

28 ogr_say = ogr_say + 1; printfSradaki rencinin notu = ); scanf(%d, &not); } 3.2.2 For Deyimi for (ifade1 ; ifade2 ; ifade3 ) ifade; ifade2 doru ( veya farkl 0) olduu srece ifade yrtlr (biti koulu). Dngnn ilk admndan nce ifade1 yrtlr ( balang adm). Dngnn her admnda ifade3 yrtlr (art miktar). for (i = 1; i < 5; i++) printf("%d ",i); ifade1, ifade2 ve ifade3 seimliktir. ifade2 belirtilmez ise herzaman doru olduu ( == 1 ) kabul edilir. Yani sonsuz dng oluur. for (i = 1; ; i++) printf("%d ",i); rnek 3.2.2.1: 1'den 100'e kadar olan saylarn toplam. j =0; for (i=1; i<=100; i=i+1) j =j+i; printf("Toplam %d",j); rnek 3.2.2.2: Girilen saynn faktriyelini bulunuz. fact =1; for (j=1; j<=i; j++) fact =fact*j; printf("Faktriyel =%f",fact); }

rnek 3.2.2.3: arpm tablosu. (ii ie dngler) main() { int i,j; for (i=1; i<=10; i++) { for (j =1; j<=10; j++) printf("%4.0d",i*j); printf("\n"); } }

29

rnek 3.2.2.4: ? ilevini iziniz(0-8 noktalar arasnda). 3.2.3 do-while Deyimi Bir koul doru olana kadar dng yrtlr. do Deyim while (<mantksal ifade>) Mantksal ifade doru olduu srece dng tekrar edilir. Yanl olduunda while szcnden sonraki deyim yrtlr. 5 says girilene kadar oku do scanf("%d",&i); while (i!=5); i =1; do { printf("%d",i*i); i =i+1; } while (i<=10); rnek 3.2.3.1: Sadece +, - kullanarak * ilemini gerekletirme. main() { int a, b; int c; scanf("%d%d", &a, &b); c = 0; do { c = c + a; b = b - 1; } while (b>0); printf("%d\n", c); } Karlatrma while : Koul balangta test ediliyor. Dng sfr veya daha fazla yrtlyor. do-while : Koul sonda test ediliyor. Dngye en az bir defa kesin giriliyor. rnek 3.2.3.2: 0 - 100 arasnda tutulan saynn tahmini. main() { int tahmin; /* tahminimiz */ int min; /* Tahminin alt siniri */ int max; /* Tahminin ust siniri */

30 char cevap; /* Kullanicinin cevabi */ min = 0; max = 100; do { tahmin = (max - min) / 2 + min; printf("Tahminim %d\n",tahmin); printf("Buyuk / Kucuk / Esit "); scanf("%c",&cevap); if (cevap == 'B') max = tahmin - 1; else if (cevap == 'K') min = tahmin + 1; } while (cevap != 'E'); } rnek 3.2.3.3: Sin(x) fonksiyonun belli bie x iin deerini seri alm ile hesaplaynz. Serinin ilk 10 terimini kullannz. n tek say. main() { float x; /* fonksiyonun hesaplanaca deer */ float sinx; /* sin(x) in deeri */ float xt; /* eklenen terimin pay */ float fakt; /* eklenen terimin paydas, faktoriyel */ int isaret; /* terimin +/- olmasn salar */ int i; clrscr(); printf("Hesaplanacak deer : "); scanf("%f",&x); sinx = x; isaret = -1; fakt = 1; xt = x; for (i = 2; i<=10; i++) { xt = xt * x * x; fakt = fakt * (2 * i - 2) * (2 * i - 1); sinx = sinx + isaret * xt / fakt; isaret = -isaret; } printf("Deeri = %f\n",sinx); } rnek 3.2.3.4 : Ayn rnei belli sayda terim iin deil, sonucu 4 basamak hassasiyetle hesaplaynz.

4 - levler
Problem zmenin ilkelerinden biri problemi mmkn olduu kadar ok paraya blmek idi. Daha sonra bu paralar bamsz olarak dnlp zmleri elde edilebilir. C'de bu blme ilemi ilev kullanarak yaplr. Belli bir ii gerekletiren program deyimlerinin karmak programlar dzenlemek ve basitletirmek iin programn bir birimi olarak gruplandrlmas. (ilev kullanmann temel nedenleri : divide and conquer , software reusability ) rnek 4.1 : Bir tamsaynn faktriyelini hesaplayan ilev

31

main() { int i; prinf(Sayy giriniz ); scanf(%d, &i); printf(%d\n, fakt(i)); }

long fakt ( int n) { int j; long f = 1; for ( j = 2; j < =n; j = j + 1), f = f * j; return f; }

rnek 4.2 : Bir tamsaynn kbn veren ilev #include <stdio.h> main() { int sayi; int kub(int); /* ilevin prototipi */ printf("sayy gir "); scanf("%d", &sayi); printf("Kb = %d\n", kub(sayi)); } int kub(int i) { return i*i*i; } levin tanmlanma biimi dn_tipi ilev_ad(parametreler) { yerel tanmlamalar deyimler } dn_tipi: Eer ilev bir deer geri gnderecek ise deerin tipini belirtir. Belirtilmez ise Int kabul edilir. Eer ilev deer gndermeyecek ise dn_tipi yerine void yazlr. ilev_ad: lev arlrken kullanlacak ad (belirleyici). parametreler: lev iin gerekli deerleri ierir. Her parametre deiken tanmlar gibi tanmlanr. Herbirinin arasnda ',' kullanmak gerekir. yerel tanmlamalar: Bu ileve zg(deiken,sabit) tanmlamalar. Eer ilev bir deer gnderecek ise bu return deyimi ile yaplr. return deer; levin Prototipi Tanmlana bir ilevin ana modl ierisinde prototipinin yazlmas gerekir. Prototip ile ilevin dn deeri ve ald parametrelerin tipleri tanmlanr. Bu bilgiye gre C derleyecisi ilev arldnda deerlerin uygun olduunu snar. int kub(int) kub ilevi int bir deeri alr ve yine int bir deer retir.

32

rnek 4.3 : saydan en byn veren ilev. Girdi : tane tamsay kt : girdilerin en by int max(int s1, int s2, int s3) { if (s1>s2 && s1>s2) return s1; else if (s2>s3) return s2; else return s3; } Bu ilevi kullanan bir program #include <stdio.h> main() { int max(int, int, int); clrscr(); printf("%d \n", max(1,2,3)); printf("%d \n", max(14,8,12)); printf("%d \n", max(1,6123,3123)); } ... ilevin tanm blou ... rnek 4.4: s alma ilevini gerekleyen ilev (s bilgisi tamsay). Girdi : taban ve s deeri kt : tabann s. kuvveti float us (float a, int b) { int i; float r; r = 1; for (i = 1; i<=b; i++) r = r * a; return r; } Fonksiyonun program iinden arl d = us(2,3); d = us(a, 4); d = d * us(3,4); s alma ilemini gereklemenin dier yolu ab = eblna = Exp(b * Ln(a)) Exp(x : Real) : Real ex Ln(x : Real) : Real Ln(x)

33

float us (float a, float b) { if (a>0) return= exp( b * log (a )); else return= -1; }

Genel deiken (global): Her yerde (main ve dier ilevler) geerlidir, deerine eriilebilir. Programn en banda, main ilevinin dnda tanmlanr. Yerel deiken (local): Sadece tanmland modlde geerlidir, deerine eriilebilir. Modl iinde tanmlanr. int a; /*tm ilevlerden deerine eriilebilir, deeri deitirilebilir. (global) */ main() { int b; /* sadece main ilevi ierisinden eriilebilir (local ) */ ... } islev1(...); { int b; /* sadece islev1 ilevi ierisinden eriilebilir. main ilevindeki deikendan bamszdr (local ) */ int c; /* sadece islev1 ilevi ierisinden eriilebilir (local ) */ ... }

rnek 4.5 : 8 bit olarak girilen bir sayya elenik (parity) bitini ekleyen program yaznz (ift elenik) Elenik biti en dk anlaml bit olarak eklenecektir. Algoritma 1. Sayy oku. 2. Saydaki birlerin saysn bul. 3. Birlerin says tek ise 1, ift ise 0 ekle. Program yazarken 2. ve 3. admlar ilev olarak yazlacaktr. /* Elenik biti ekleme */ int bulbir ( int ); int eklebir ( int , int ); main()

34 { int girsayi, birler; clrscr(); scanf("%d", &girsayi); birler = bulbir(girsayi); girsayi = eklebir(birler, girsayi); printf("%d\n", girsayi); } int bulbir ( int sayi) { int kacbir = 0; while (sayi>0) { kacbir = kacbir + (sayi % 2 ); sayi = sayi / 2; } return kacbir; } /* BulBir */ int eklebir ( int birler, int sayi) { return (2 * sayi + (birler % 2)); } /* Eklebir */ * Kar taraf iin gereken algoritmay yaz (say doru mu, doru ise deeri). rnek 4.6 : A iyerindeki bir personelin hangi dilimden gelir vergisi deyeceini (yzdesini) belirten fonksiyonu yaznz. Girdi : personelin birikmi vergi matrah kt : Kesinti yzdesi lgili bilgi : 0-20 Milyon %25, 20-40 Milyon %30, 40-80 Milyon %35, 80-160 Milyon %40 >180 Milyon %45 int v_oran ( float bvd); { int i; if (bvd < 20000000) i = 25; else if (bvd < 40000000) i = 30; else if (bvd < 80000000) i = 35; else if (bvd < 160000000) i = 40; else i = 45; return i; } rnek 4.7 : Gelir vergisi matrah ve nceki aylara ait birikmi vergi matrah belli bir personelin gelir vergisini hesaplayan fonksiyonu yaznz. Vergi := Gelir vergisi matrah * Vergi oran Not : Eer personel bu ay dilim deitiriyorsa gelir vergisi gerektii ekilde eski ve yeni dilime paylatrlarak kesinti hesaplanmaldr.

35

rnek 4.8 : Girilen harfi byk harfe dntren fonksiyon Girdi : karakter kt : karakter ( girdi harf ise byk harfe dntrlm) char buyuk(char c); { if (c >= 'a' && c <= 'z') return c - 32; else return c; } rnek 4.9: Girdi : iki say ve aralarndaki ilem kt: iki say arasndaki ilemin sonucu int calculate(char islem, int a, ibt b, int c) { int s; switch( islem ) case '+' : s = a + b ; break; case '-' : s = a - b ; break; case '*' : s = a * b ; break; case '/' : s = a / b ; break; default : s = 0; } return s; } arma biimi a = calculate ('+',4,8'); a = calculate ('/', 4,2) * calculate ('*', 2,2);

rnek 4.10: Bir ilevin kklerinden birini Newton ynetimi ile bulan prg. ( x2-2 ) #include <stdio.h> #include <math.h> double fn(double); double fnt(double); main() { double x,x0; double hata; hata = 0.0001; /* izin verilen hata */ x = 8; /* balang deeri */ do { x0 = x; x = x0 - fn(x0)/fnt(x0);

36 } while (fabs(x-x0)>hata); printf ("Sonu = %f\n", x); printf ("f(x) = %f\n", fn(x)); } double fn(double x) /* ilevin deeri */ { return x*x-2; } double fnt(double x) /* ilevin trevinin deeri */ { return 2*x; } rnek :4.11: ki saynn ortak katlarnn en kn veren ilevi yaznz. #include <stdio.h> long okek(long, long); main() { long i, j; clrscr(); printf("ki tamsay giriniz :"); scanf("%ld%ld", &i, &j); printf("saylarn okeki = %ld \n" okek(i, j)); } long okek(long p, long q) /* p < q olmali. Degil ise yerlerini deitir. */ { long i, k; if (p>q) { i=p; p=q; q=i; } /* p nin yle bir katn bul ki q saysna tam blnsn 2 saysndan itibaren taranmaya balanabilir fakat p/q yeterli */ i = q / p; do { k = p*i; i = i+1; } while ( k % q != 0); return k; rnek :4.12: stenen saydaki asal sayy listeleyen program yaznz.

37 #include <stdio.h> int asal(int); main() { int i ; /* asal olup olmad snanacak saylar */ int kac; /* ilk ka asal saynn listelenecei bilgisi */ int j; /* listelenen asal saylarn adetini tutar */ clrscr(); printf("ilk ka asal say listelenecek : "); scanf("%d", &kac); /* for deyiminde ifade3 ksmnda dng deikeni yerine farkl bir deikenin deeri deitiriliyor. Dng deikeni ide incelenen say asal ise arttrlyor */ i = 2; for (j = 1; j<=kac;i++) if (asal(i)) { printf("%d \n", i); j++; } } int asal(int n) /* say asal ise 1 deilk ise 0 deerini alr */ { int i; if (n % 2 == 0) return (n==2); if (n % 3 == 0) return (n==3); if (n % 5 == 0) return (n==5); for (i=7; i*i <= n; i+=2) if (n % i == 0) return 0; return 1; } rnek :4.13: Belirtilen tarihteki ayn ka gn srdn veren ilevi yaznz. Girdi : Ay ve yl kt : Aydaki gn says int aydakigun(int ay, int yil) { int i; switch (ay) { case 1: case 3: case 5: case 7: case 8:

38 case 10: case 12 : i = 31;break; case 2 : if (yil % 4 == 0) i = 29; else i = 28; break; default : i = 30; } return i; } rnek :4.14: nmzdeki ylda Ramazan Bayram nn hangi tarihte kutlanacan hesaplayan program yaznz. Bu ylki tarih klavyeden gn ay ve yl olarak okunacakr. Girdi: Bu yl kutlanlan tarih kt : Sonraki tarih #include <stdio.h> int aydakigun(int, int); main() { int gun,ay, yil; int i, j ; clrscr(); printf("Bu ylki tarihi giriniz (G A Y) : "); scanf("%d %d %d",&gun, &ay, &yil); yil = yil + 1; gun = gun - 11; if (gun < 1 ) { ay = ay - 1; if (ay < 1 ) { ay = 12; yil = yil - 1 ; } gun = gun + aydakigun(ay, yil); } printf("\nGelecek bayram = %d/%d/%d\n",gun,ay,yil); } rnek :4.15: Girilen bir tamsaynn basamaklarnn srasnn tersinin oluturduu sayy veren ilevi yaznz. #include <stdio.h> long tersi(long); main() { long s; clrscr(); printf("Sayy giriniz : "); scanf("%ld", &s); printf("Basamaklarnn ters evirilmii = %ld \n", tersi(s));

39 } long tersi(long k) { long a, b; a = 0; while (k>0) { b = k % 10; a = a * 10 + b; k = k / 10; } return a; }

4.2 zyineleme (Recursive) levler


Kendini aran fonksiyonlardr. rnek 4.2.1: Faktoriyel hesab long fakt(long i) /* fakt = i! */ { if (i<2) return 1; else return i*fakt(i-1); } rnein n=4 iin fonksiyonun kendisini ard satr yledir: 4 * fakt(3), 3 * fakt(2), 2 * Fakt(1) 24 = 4 * 6 <-- 3 * 2 <-- 2 * 1 rnek 4.2.2: Ortak blenlerin en byn bulan program (Euklid yntemi). gcd = greatest common divisor long gcd (long m, long n ) /* m ve n saylarnn ortak blenlerinin en by*/ { if (n == 0) return m; else return gcd( n, m % n); } rnek 4.2.3: 1) ki say greceli asal olup olmadn veren fonksiyon (relativeli prime = gcd() =

rnek 4.2.4: Saynn 9 un kat olup olmadnn basamak toplamlarnn 9 olmas ile bulunmas (zyinelemeye rnek olsun) int kati9(long s) { int t;

40 if ( s < 10) return ( s == 9); else { t = 0; while ( s > 0) { t = t + s % 10; s = s / 10; } s = kati9(s); } }

41

42

5- Diziler
u ana kadar basit deikenler kullandk ( her deikinin bir deeri var). Yapsal deiken: benzer verilerin tek bir deiken altnda gruplandrlmas. Dizi veri yaps: Ayn tip verilerin toplanp tek isim verilmesi.

5.1 Dizi Tanm ve Kullanm


Tip_Ad deiken[boyut]; rnein float a[100]; Bu tanmlama ile a isimli deikeni 100 gerel deerin sakland bir diziyi gsterir. Bu 100 veriye a deikeni ile eriilir. Dizinin herhangi bir elemanna erimek veya deitirmek iin kanc eleman olduunu gsterir indis bilgisini vermek gerekir. lk elemann indisi 0 dr. A[4] A[0] A[1] A[7] dizinin 5. eleman dizinin ilk eleman := 45; dizinin 2. elemanna 45 atanr := A[7] + A[1]; dizinin 8. elemanna kendisi ile 2. elemann toplam atanr

Dizinin eleman deerler tanmlama annda yaplabilir. int a[10] = {25, 18, 20, 0, 29, 5, 4, 8,19,13} 0 25 1 18 2 20 3 0 4 29 5 5 6 4 7 8 8 19 9 13

Dizi Kullanma rnekler rnek: Dizi elemanlarna deer ata, yazdr. /* 1-10 arsndaki saylarn karesini dizi elemanlarna ykle yazdr */ main() { int a[10]; int i; for (i=0; i<=9; i++) a[i] = (i+1)*(i+1); for (i=0; i<=9; i++) printf("%d . elemann deeri = %d\n", i, a[i]); } Ekranda kacak grnt

43

0 . elemann deeri = 1 1 . elemann deeri = 4 ... 9 . elemann deeri = 100 rnek : Dizide ilk 20 Fibonacci sayy olutur /* ilk 20 Fibonacci f[0] = 0, f[1] = 1, f[i+1] = f[i] + h[i-1] */ #include <stdio.h> main() { int fib[20]; int i; fib[0] = 0; fib[1] = 1; for (i=2; i<=19; i++) fib[i] = fib[i-1] + fib[i-2]; clrscr(); for (i=0; i<=19; i++) printf("%d . Fibonacci says = %d\n", i, fib[i]); } Ekranda kacak grnt 0. Fibonacci says = 0 1. Fibonacci says = 1 2. Fibonacci says = 1 ... 19. Fibonacci says = 4181 rnek : Klavyeden 10 say oku. Tersten yazdr. #include <stdio.h> main() { int a[10]; int i; for (i=0; i<=9; i++) { printf("%d. sayy gir ",i); scanf("%d", &a[i]); } printf("\n-----------------------\n"); for (i=9; i>=0; i--) printf("%d . srada girilen say = %d\n", 9-i, a[i]); }

44 Diziyi Bir leve Gnderme u ana kadar renilen bilgi erevesinde ilevlere gnderilen parametrelerin ieriklerinin ilev ierisinde deitirilmesi mmkn deildir. leve deikenin deeri gnderilir. lev ierisindeki ilemlerden parametre etkilenmez. Dizilerde durum byle deildir. Normal kullanmda (u ana kadar grlen) dizi ileve gnderildiinde elemanlar deitirilebilir (referans). Dizinin sadece herhangi bir eleman gnderildiinde ise deeri deitirilemez (deer) Diziyi ileve gnderirken sadece adn parametre olarak yazmak yeterlidir. rnek: ilev ierisnde dizi eleman deerlerinin deitirilmesi #include <stdio.h> void kareleri(int []); main() { int a[10]; int i; for (i=0; i<=9; i++) a[i] = i + 1 ; clrscr(); printf("Dizinin elemanlarnn deerleri\n"); for (i=0; i<=9; i++) printf("%d ",a[i]); kareleri(a); printf("\n\nKare alma ilemi sonras dizinin elemanlarnn deerleri\n"); for (i=0; i<=9; i++) printf("%d ",a[i]); } void kareleri(int a[]) { int i; for (i=0; i<=9; i++) a[i] = a[i] * a[i]; } Ekranda kacak grnt Dizinin elemanlarnn deerleri 1 2 3 .. 10 Kare alma ilemi sonras dizinin elemanlarnn deerleri 1 4 9 .. 100 Notlar * Tanmlanan dizi boyutunun dnda bir eleman kullanm durumunda C dili hata vermez (uyarmaz).

45 * lk indisin deerinin sfr olmas dolaysyla dizinin n. elemann indisi n deil n-1 dir. * Gerektii durumlarda dizi elemanlarnn ilklendirilmesi (sfrlamak) unutulmamal - tanmlama annda int a[10] = {13, 45 ..}; /* fazla eleman yazlrsa hata oluur */ int a[] = { 13, 45, 56}; /* boyut belirtilen deer kadar olur */ - giri yaptrarak scanf("%d", &a[i]); - dorudan deer atayarak a[i] = 4; Dizinin Boyutunu Deiken Klma #define nilemcisi direktifi (preprocessor directive) Simgesel sabit tanmlanmasn salar. C dili deyimlerinden biri deildir (#include gibi). Kullanm biimi #define SabitAd Deeri Program altrldnde derleme ilemi ncesinde program ierisinde SabitAd simgesinim getii yerlere Deeri konur. rnek : 25 kiilik bir snftaki rencilerin snav sonularn okuyup ortalamasn bulan program. * not bilgilerin saklanaca veri yapsn belirle ve tipi tanmla * notlar girdiren yntemi yaz * Ortalamay bulan fonksiyonu yaz #include <stdio.h> #define OGR_SAY 25 void giris(int []); float ortalama(int []); main() { int ogr[OGR_SAY]; clrscr(); giris(ogr); printf("Ortalama = %f\n", ortalama(ogr)); } void giris(int ogr[]) { int i; for (i=0; i<OGR_SAY; i++) /* 0 dan balad iin < kullanld */ { printf("%d. rencinin notunu gir : ",i+1); scanf("%d", &ogr[i]); } } float ortalama(int ogr[]) { float x;

46 int i; x = 0; for (i=0; i<OGR_SAY; i++) x = x + ogr[i]; return x / OGR_SAY; } * * * * 50'den kk deerleri yazan ilev 50'den kk deerlerin saysn veren ilev en yksek notu veren ilev Standart sapmay veren ilen ( (abs(Xi - Xort) / OGR_SAY))

rnek : ki dizinin toplamn nc bir diziye yazan program yaznz (A, B ayn tip dizi, C = A + B ). Dorudan C := A + B yazlamayaca iin dizinin ilgili elemanlarn tek tek toplamalyz. #include <stdio.h> #define MAX 20 void dizitopla(int [], int [], int []); main() { int a[MAX], b[MAX], c[MAX]; int i; for (i=0; i<MAX; i++) { a[i] = i; b[i] = 2 * i; } dizitopla(a, b, c); clrscr(); for (i=0; i<MAX; i++) printf(" %4d + %4d = %4d \n", a[i], b[i], c[i]); } void dizitopla(int a[], int b[], int c[]) /* c = a +b */ { int i; for (i=0; i<MAX; i++) c[i] = a[i] + b[i]; }

5.3 Sralama
Dizi elemanlarnn kkten bye veya bykten ke doru dizilmesi ilemi.

47 Farkl performansa sahip birok yntem vardr. imdilik en basit olanlardan biri incelenecektir. Selection Sort (seim) Dizinin en kk eleman bulunur ve birinci eleman ile yer deitirilir. Bu ilem (n-1). elemana kadar tekrar edilir. Her admda en kk eleman dizinin kalan elemanlarndan bulunur. rnein aada 4 elemanl bir diziye yntemin uygulanmas gsterilmitir.

Buble Sort Bu yntemde ardl iki eleman karlatrlr. Eer nceki eleman sonrakinden byk ise elemanlar yer deitirilir. Bu ekilde dizi taranr. Eer herhangi bir deiiklik yaplm ise ilem tekrar edilir. Balang 34 21 18 25 1. adm 21 18 25 34 2. adm 18 21 25 34 3. adm 18 21 25 34

Grld gibi, bu yntemde dizi sralandktan sonra bir defa daha taranyor. Selection Sort Kodlamas 1. Dizinin en kk elemannn indisini veren ilev 2. Bu ilevi kullanarak diziyi sralama Bubble Sort Kodlamas

5.4 ok Boyutlu Diziler


ok boyutlu bilgileri veya veri tablolarn saklamak iin kullanlr. ki boyutlu diziler daha sk kullanlr. rnein; yllara ve aylara enflasyon rakamnn takibi, matematikteki matri ilemlerinin gereklenmesi, renciler ve aldklar derslerin takibi. Tanmlama biimi : ki trl yaplabilir. Tip Deiken_Ad[ indis1 ][ indis2 ][ indisn ]; rnein ; float Enf[5][12]; Enf tipi iki boyutlu bir dizidir. Birinci boyut ( satr ) yllar, ikinci boyut ( stun ) aylar gsterir.

48 1.Ay 1 2 3 4 5 2.Ay 3.Ay 4.Ay 5.Ay 6.Ay 7.Ay 8.Ay 9.Ay 10.Ay 11.Ay 12.Ay

C dilinde boyut saysnda bir snr yoktur. Biligisayarn bellei boyutu snrlar. Dizilerin bellekte saklanma biimi : Eriimin kolay olmas iin dizinin tm elemanlar pepee saklanr. Burada nce satr sonra stunlar (tanmlan srasna gre) saklanr . !!! ok boyutlu dizileri bir ileve gnderirken ilk boyut dndaki boyutlarn byklklerini vermek zorunludur. rnek : ki boyutlu dizi zerine. #include <stdlib.h> #define SATIR 5 #define SUTUN 5 double enbuyuk(double [][SUTUN], int ); void matris_oku(double [][SUTUN]); main() { double a[SATIR][SUTUN]; double b[SATIR]; /* satirlardaki en buyuk elemanlar */ double c[SATIR]; /* satirlardaki sutunlarin toplami */ int i, j; matris_oku(a); for (i = 0; i < SATIR; i++) b[i] = enbuyuk(a,i); /* Satirdaki elemanlarin toplamlarinin olusturdugu matris */ for (i = 0; i < SATIR; i++) { c[i] = 0; for (j = 0; j < SUTUN; j++) c[i] = c[i] + a[i][j]; } clrscr(); for (i = 0; i < SATIR; i++) { for (j=0; j<SUTUN; j++) printf("%3.0f ", a[i][j]); printf(" %4.0f %4.0f\n",b[i],c[i]); }

/* Biimli yazdrma */

49

} double enbuyuk(double a[][SUTUN], int sat) { double r; int i; r = a[sat][0]; /* ilk eleman en buyuk */ for (i = 1; i < SUTUN; i++) if (a[sat][i] > r) r = a[sat][i]; return r; } /* Function EnBuyuk */ void matris_oku(double a[][SUTUN]) { int i, j; for (i = 0; i < SATIR; i++) for (j = 0; j < SUTUN; j++) a[i][j] = random(10); } /* matris_oku */

rnek : Bir kare matrisin o. Matrisin simetrik olup olmamasn snayan program o. Matrisin transpozesini bir dier matrise kopyalayan program o. ki matrisinin arpmn gerekletiren program o. kegeninin alt ksmndaki elemanlar sfrlayan yntemi, o. Determinantn hesaplayan fonksiyonu, o. M<=P ve N<=Q olmak zere A matrisi MxN ve B matrisi PxQ boyutlarndadr. B matrisi ierisinde A matrisininin olup olmad belirlenecektir. A matrisinin B matrisi ierisinde ka kez bulunduunu ve bunlarn B matrisi ierisinde balang konumlarn (satr ve stun olarak) veren program yaznz. o. MxN elemanl bir matrisi tek boyutlu bir diziye dntren program o. P elemanl bir diziyi MxN boyutlu matrise dntren program (P says M ve N e tam blnr). /* Program Matris-2 */ #include <stdlib.h> #define SATIR 3 #define SUTUN 3 void matris_oku(int [][SUTUN]); void matris_yaz(int [][SUTUN]); int simetrik(int [][SUTUN]); /* matrisin simetrikliini snar */ void transpoze(int [][SUTUN], int [][SUTUN]); /* 2. = 1.nin transpozesi */ void matris_carp(int [][SUTUN], int [][SUTUN], int [][SUTUN]); /* 3 = 1*2 */

50 /* alt_ucgen_sifirla(a); matris_yaz(a); printf("------------------------\n"); transpoze(a, b); matris_yaz(b); matris_carp(a, b, c); printf("------------------------\n"); matris_yaz(c); if (simetrik(a)) printf("Simetriktir\n"); else printf("Simetrik deildir\n"); */ getch(); } void matris_oku(int a[][SUTUN]) { int i, j; for (i = 0; i < SATIR; i++) for (j = 0; j < SUTUN; j++) a[i][j] = 1 + random(5); } /* matris_oku */ void matris_yaz(int mat[][SUTUN]) { int i, j; for (i = 0; i<SATIR; i++) { for (j = 0; j<SUTUN; j++) printf("%3d ",mat[i][j]); printf("\n"); } } int simetrik(int a[][SUTUN]) { int i,j; int durum; durum = 1; /*simetrik olduunu varsay */

51

for (i = 0; i<SATIR; i++) for (j = 0; j<SUTUN; j++) if (a[i][j] != a[j][i]) { durum = 0; break; } return durum; } /* simetrik */ void transpoze(int a[][SUTUN], int b[][SUTUN]) { int i, j; for (i = 0; i<SATIR; i++) for (j = 0; j<SUTUN; j++) b[i][j] = a[j][i]; } void matris_carp(int a[][SUTUN], int b[][SUTUN], int c[][SUTUN]) /* c = a * b */ { int i, j, k; for (i = 0; i<SATIR; i++) for (j = 0; j<SUTUN; j++) { c[i][j] = 0; for (k=0; k<SUTUN; k++) c[i][j] = c[i][j] + a[i][k]*b[k][j]; } } void alt_ucgen_sifirla(int a[][SUTUN]) { int i,j; for (i = 0; i<SATIR; i++) for (j = 0; j<i; j++) a[i][j] = 0; } int det(int a[][SUTUN]) { int i, j, k; int s, sx1, sx2; s = 0; /* for (j = 0; j<SUTUN; j++) { sx1 = 1;

52 sx2 = 1; for (k = 0; k<SATIR; k++) { i = (j + k) % SUTUN; sx1 = sx1 * a[k][i]; sx2 = sx2 * a[k][SATIR-k]; } s = s + sx1 - sx2; } */ return s; }

6.

Karakter ileme

Birok program saylarn yan sra metinler zerine ilem yapar. lk akla gelen bir kelime ilem programdr. Bu tr bir programda metinlerle ilgili olarak, araya karakter girme, silme, deitirme ve arama gibi ilemler tanmldr. C dilindeki char tipi bu tr verilerin saklanmas iin kullanlr.

6.1 Tanmlamalar ve Kullanm

53 karakter: Bilgisayarda tanml herhangi bir karakteri gsterir. Karakter sabitler tek trnak iinde belirtilir. 'A', '0' '\65' : \ iaretinin ardndan belirtilen ASCII kodlu karakter C dili karakterleri ayrca int deer gibi de grr. 'A' karakteri saysal olarak A harfinin ASCII tablosundaki karl olan 65 olarakta yorumlanabilir. dizgi (string): Bir dizi karakterden oluur. '\0' karakteri dizginin sonunu gsterir.Dizgi sabitler ift trnak iinde gsterilir. "AL", "Bir say girin" Bu idafede dil \0 karakterini otomatik koyar. Karakter ile dizgi birbirinden farkl eylerdir. Dizginin sonunda herzaman \0 karakteri vardr. 'A' ile "A" birbirinin ayns deildir. 'A' karakterini gsteren 65 deerinde bellekte int olarak salanrken "A" ise bir dizgi olup A ve \0 karakterlerini ierir. Tanmlama biimi: 1. Dizi eklinde tanmlama char a[7] = {'K','O',,'C','A','E','L',''}; char a[8] = "KOCAEL"; /* Son eleman olrak \0 karakteri eklendii iin eleman saysn bir fazla belirtmeli */ 2. areti olarak tanmlama char *deiken; char *a; Dorudan Deer Atama char a[20]; char *b; a[0] = 'A'; /* dizinin bir elemanna deer verir gibi ve tek trnak iinde ( karakter sabiti) */ \0 karakteri ayrca belirtilmelidir.

Dizi biiminde tanml dizgiye sabir bir dizgi atarma iin strcpy ilevi kullanlr. strcpy(char *hedef, const char *kaynak); kaynak bilgisini hedef deikenine kopyalar (string.h) Hedef dizgisinde kaynak dizgisini ierecek kadar yer olmaldr. strcpy(a, "AL"); b = "AL"; /* ift trnak iinde atanacak deer . \0 karakteri otomatik eklenir */ Deerini Yazdrma printf("%s", a); puts(a); ( stdio.h ) sonu \0 ile biten karakter dizisini ekrana yazar ve imlei alt satra geirir

Klavyeden Deer Atama

54

scanf("%s", a); /* Boluk karakterine kadar okuma yapaca iin ierisinde bu karakterin gemesi olas girilerde doru almaz. Adres operatr kullanlmyor */ gets(a) ; Satr sonu karakterine kadar (ENTER tuu) baslan karakterleri okur ( stdio.h )

Karakter Dizisinin Herhangi Bir Karakterine Erime Dizilerde olduu gibi eriilmek istenen karakterin indisi bildirilir. a[2] = 'G'; b[2] = 'G'; a[4] = '\0'; printf("%c ", b[3]);

/* b'nin 4. elemann yazar */

rnek 6.1.1 : Girilen bir metnin uzunluunu veren program yaznz. #include <stdio.h> main() { char *s; int i; gets(s); i = 0; while (s[i]!='\0') i++; printf("Uzunluk %d \n", i); } strlen ( char *) : Gnderilen deerin uzunluunu verir. (string.h) rnek 6.1.2: Girilen bir metni tersten yazdran program yaznz. #include <string.h> #include <stdio.h> main() { char *s; int i; gets(s); for (i=strlen(s)-1; i>=0; i--) printf("%c", s[i]); printf("\n"); } rnek 6.1.3 : Girilen cmleyi oluturan kelimelerin sadece ilk harflerini yazdran program. 1. c = sradaki karakteri oku 2. Eer c boluk ise 4. adma git 3. Hi karakter yazlma ise c'yi yaz. 4. Eer son karakter ise dur aksi halde bir sonraki karakteri gster ve 1.adma git. Yukardaki algoritmada zmn en nemli noktas herhangi bir kelimenin ilk karakterinin yazlp yazlmaddr. Bunun izlenmesi iin bir deiken kullanalm.

for (i=0; s[i]!='\0'; i++) {}

/* bo ilem */

55 /* Girilen cmlenin ilk harflerini yaz */ main() { int i; int yaz; /* 1/0 -> karakteri yaz/yazma */ char *s; clrscr(); gets(s); yaz = 1; for (i = 0; i<strlen(s); i++) if (s[i] == ' ') yaz = 1; else if (yaz) { printf("%c", s[i]); yaz = 0; } } rnek 6.1.4: Girilen cmleyi, kelimeleri bozmadan tersten yazdran program. Ali zil ald --> ald zil Ali ki Dizginin Karlatrlmas C dilinde diziler dorudan karlatrlamazlar. Her bir elemann ayr ayr karlatrlmaldr. Kklk-byklk bilgisi ASCII tabloda nce-sonra bulunma bilgisine zdetir. Karlatrma amacyla strcmp(dizgi1, dizgi2) ilevi kullanlr. lev deer alr. <0 ise dizgi1 < dizgi2 =0 ise dizgi1 = dizgi2 >0 ise dizgi1 > dizgi2 rnek 6.1.5: int main() { char *s1 = "aaa", *s2 = "aba; int i; i = strcmp(s1, s2); if (i > 0) printf("s1 byk \n"); else if (i<0) printf("s2 byk\n"); else printf("eitler\n"); } ki Dizgiyi Toplama (ekleme) Dizgiler ile ilgili dier sk kullanlan ilev strcat(hedef, kaynak) tir. kaynak dizgisini hedeh dizgisine ekler. Hedef dizgisinde kaynak dizgisini ierecek kadar yer olmaldr. int main() { char *s1 = "aaa ", *s2 = "bbb"; int i; strcat(s1, s2); /* (string.h) */ printf("%s\n", s1);

56 } 6.2 atoi , atof, atol .. levlerini Gerekleme Genellikle bir programn ak boyunca baz verilerin tiplerinin deitirilmesi gerekir. Bu deiim string tipindeki bir deikenin saysal tipe dntrlmesi veya tersi biiminde olabilir. Saysal string : ierii C'nin say gsterimine uygun olan metin. '5.87' , '0.3E5' , '3423' rnek 6.2.1: String tipi bir deikenin deerini tamsaysal tipe dntren ilevi yaznz.(atoi (stdlib.h)) Girdi : Tamsaysal string kt : Karlk gelen say #include <stdlib.h> #include <string.h> int deger (char *); main() { char *c; int i; c="93t54"; i=deger(c); printf("%s dizi katarnn saysal karl %d \n",c, i); } int deger( char *s) { int i,j; int x; /*say */ x = 0; for (i = 0; i<strlen(s); i++) { j = s[i] - '0'; x = x * 10 + j ; } return x; } rnek 6.2.2 : nceki rnekteki deer ilevini ondalk saylar da (nokta dikkate alnacak) ileyecek ekilde gelitiriniz. Yukarda yazmaya altmz ilevin C dilinde karl mevcuttur (stdlib.h). int atoi(char *s) : tamsayya dntrr. long int atol(char *s) : uzun tamsayya dntrr. double atof(char *s) : gerel sayya dntrr. Bu ilevler dntrme ilemine s ierisinde geersiz bir karakter ile karlaldnda son verir. Ve bu noktaya kadar karakterlerin oluturduu sayy verir. lk karakter geersiz ise ilevin deeri tanmszdr. Ayn ilevlerin biraz daha gelimileri ise; double strtod(const char *s, char **ss) : long int strtol(const char *s, char **ss, int base) : unsigned int strtol(const char *s, char **ss, int base) : s : string bilgi ss : s deikeninde ilk geersiz karakter ve sonrasnda katar dizini gsterir base : dnmn hangi tabana gre yaplacan belirtir.

57

rnek 6.2.3: atoi, atol, atof ilevlerinin davranlar. main() { char *s; int i; long x; double f; s="5"; printf("%d %ld %f\n",atoi(s),atol(s),atof(s)); s="5.4"; printf("%d %ld %f\n",atoi(s),atol(s),atof(s)); s="5.2e4=KL"; printf("%d %ld %f\n",atoi(s),atol(s),atof(s)); } s deeri kt -------------------------------------------------5 5 5 5.000000 5 5 5 5.400000 5 5 5 52000.000000 Giri levleri main() { char c1, c2; char s[10]; clrscr(); c1 = getchar(); /* klavyeden ENTER tuuna baslana kadar tu bekler */ /* cursor on, karakter yazlr */ c2 = getchar(); /* klavyenin tamponundaki sradakini okur */ printf("\n%c , %c\n",c1,c2); c1 = getche(); /* tu baslmasn bekler, ENTER beklenmez*/ /* cursor on, karakter yazlr */ c2 = getche(); /* tu basldktan sonra kontrol bu satra geer */ printf("\n%c , %c\n",c1,c2); c1 = getch(); /* tu baslmasn bekler, ENTER beklenmez */ /* cursor on, karakter yazlmaz x int putch(int c): c ekrana yazlr*/ c2 = getch(); /* tu basldktan sonra kontrol bu satra geer */ printf("\n%c , %c\n",c1,c2); } rnek 6.2.4: Tamsay bir deeri dizgiye dntren program yaznz. (ecvt, fcvt, gcvt var ancak ANSI C deil) #include <stdio.h> int main() { char *s; int i; i = 2137; itostr(s, i); printf("%d %s\n",i, s); }

58 itostr(char *hedef, int sayi) { int i, j, kb; j = sayi; for (kb = 0; j>0; kb++) j = j / 10; i = sayi; for (j=kb-1; j>=0; j--) { hedef[j] = '0' + i % 10; i = i / 10; } hedef[kb] = '\0'; } sprintf ilevi : saysal deeri dizgiye dntrmek iin kullanlabilir. Yaps; sprintf( dizgi, kontrol, deikenler) Kullanm ekli printf ilevine yakndr. Kontrol ve deiken bilgisine gre ekrana yazlmas gereken bilgi parametre olarak gnderilen dizgiye kopyalanr. char *s; int i = 57; sprintf(s, "%d", i); ifadesi sonunda s dizgisinde "57" deeri oluur. float f = 2.1; sprintf(s, "%f", f); ifadesi sonunda s dizgisinde "2.100000" deeri oluur. rnek 6.2.5: Bir dizginin belirli bir parasn veren ilev. (strncpy(s2, s1, n)) #include <stdio.h> int main() { char *s1; char *s2; s1 = "01234567890"; altdizgi(s2, s1, 0, 5); printf("%s\n",s2); } void altdizgi(char *hedef, char *kaynak, int bas, int uzunluk) { int i; for(i = 0; i < uzunluk && kaynak[bas + i] != '\0'; i++) hedef[i] = kaynak[i + bas]; hedef[i] = '\0'; } rnek 6.2.6: Bir metin ierisinde bir metin parasn bulma (konumunu belirleme). Girdi : . aranacak metin paras (String) , aramann yaplaca metin (String) kt : aranan bilgi var ise balang konumu (Integer) =-1 ise yok demektir main() { char *a="12345";

59 char *b="34"; printf("%s %s\n",a, b); printf("%d\n",kon(a, b)); } int kon(char *s1, char *s2) { int i = 0, j, konum = -1; while (i < strlen(s1) - strlen(s2)) { konum = i; for (j = 0; j < strlen(s2); j++) if (s1[i + j] != s2[j]) konum = -1; if (konum >= 0) break; else i = i + 1; } return konum; } C dilinde benzer bir ilevi salayan deyim char *strstr(const char *dizgi1, const char *dizgi2) dizgi1 ierisinde dizgi2 yi arar. Var ise ilev dizgi1 ierisinde dizgi2 nin balad konumdan sonraki dizgiyi iaret eder. Yok ise ilevin deeri NULL dr. NULL : iaretinin herhangi bir yeri gstermemesi. Deerinin bo olmas. rnek 6.2.7: Bir dizgi ierisindeki bir karakterin bulunmas. i harfini ile deitiren program. #include <string.h> #include <stdio.h> int main() { char *s1, *s2, *s3; int i; clrscr(); s1="ali zil aldi"; strcpy(s2, s1); for (i=0; i<strlen(s1); i++) if (s1[i] == 'i') s1[i] = ''; printf("%s\n",s1); char *strchr(char *s, char c) : s dizgisi ierisinde c karakterinin konumunu gsteren dizgiyi gnderir. while (strchr(s2, 'i') !=NULL) { s3 = strchr(s2, 'i'); s3[0] = ''; } printf("%s\n",s2); } rnek 6.2.8: Bir cmledeki tm kk harfleri byye eviren program. (int tolower(int c) , int toupper(int c) ) (ctype.h)

60

#include <string.h> #include <stdio.h> void buyuk(char *); int main() { char *s1, *s2, *s3; int i; clrscr(); s1="ali zil aldi"; strcpy(s2, s1); for (i=0; i<strlen(s1); i++) printf("%c",toupper(s1[i])); buyuk(s2); printf("\n%s",s2); getch(); } void buyuk(char *s) { int i; for (i=0; i<strlen(s); i++) s[i] = toupper(s[i]); } rnek 6.2.9: Girilen metindeki harflerin skln (frekansn) hesaplar. #include <strinh.h> gets(s); main() for (i = 0 ; i <strlen(s); i++) { { c = tolower(s[i]); char *s; if (strchr(harfler, c) != NULL) char *harfler = abcdefghijklmnopqrstuvwxyz; fr[c - a]++; char c; } int fr[26] = {0,}; for (i = 0; i < 26; i++) int i; printf(%c - %d\t\t, a+i, fr[i]); clrscr(); }

7. Dier Veri Tipleri


Standart C dilinde u ana kadar rendiimiz veri tiplerine ek olarak aadaki tipler mevcuttur.

7.1 C de Tanml Veri Tipleri


Veri Tipleri Tip unsigned char char enum unsigned int short int Aralk 0 .. 255 -128 .. 127 -32,768 .. 32,767 0 .. 65,535 -32,768 .. 32,767 Uzunluk(Byte) 1 1 2 2 2

61 int unsigned long long float double long double -32,768 .. 32,767 0 .. 4,294,967,295 -2,147,483,648 .. 2,147,483,647 3.4 * (10**-38) .. 3.4 * (10**+38) 1.7 * (10**-308) .. 1.7 * (10**+308) 3.4 * (10**-4932) .. 1.1 * (10**+4932) 2 4 4 4 8 10

printf ilevinde dnm karakteriden nce h short u unsigned l long integer L long double u dnm karakteri unsigned

7.2 Kullanc Tanml Veri Tipleri


Enumerated (Sral, Numaralandrlm) Tipler Programn okunabilirliini arttrmak iin deerlerin sral bir kme olarak tanmlanmas. enum [tip_adi] { sabit ad [= deer],...} [deiken listesi]; deer : sabite otomatik atanan deer. Belirtilmez ise 0'dan balar. Sradaki sabit ncesinin bir fazlasna eittir. Belirtilen tipte tanml bir deiken ancak listedeki deerleri alr. enum renk {BEYAZ, SARI, SIYAH}; tanmlamas ile oluan enum renk tipinde BEYAZ 0, SARI 1 ve SIYAH 2 deerlerine eit sabitlerdir. Listedeki sabitler belirkeyici olmaldr. Saysal, karakter ve string bilgi yazlamaz. enum renk = {"Beyaz", "Sari"}; X enum renk = {0, 1, 2}; X . likisel ileler tanmldr. Beyaz < Siyah, Sari > Beyaz Bu tip deikenler switch ve for deyimlerinde kontrol deikeni olarak kullanlabilir. Bu tipte bir deiken bilinen yapda tanmlanr. enum renk {BEYAZ, SARI, SIYAH}; enum renk a; a deikeni BEYAZ, SARI ve SIYAH deerlerinden birini alabilir. rnek 7.2.1: enum kullanm. main() {

62

enum gunler {PAZAR,PAZARTESI,SALI,CARSAMBA,PERSEMBE,CUMA,CUMARTESI }; enum gunler gun; clrscr(); for (gun = PAZAR; gun <= CUMARTESI; gun++) printf("%d ", gun); printf("\n"); for (gun = PAZAR; gun <= CUMARTESI; gun++) switch (gun) { case PAZAR: printf("Pazar"); break; case PAZARTESI: printf("Pazartesi"); break; case SALI: printf("Sali"); break; case CARSAMBA: printf("Carsamba"); break; case PERSEMBE: printf("Persembe"); break; case CUMA: printf("Cuma"); break; case CUMARTESI: printf("Cumartesi"); break; } /* Case */ } rnek 7.2.2: enum kullanm. main() { enum gunler {PAZAR,PAZARTESI,SALI,CARSAMBA,PERSEMBE,CUMA,CUMARTESI }; enum gunler gun; char *gunad[]={"Pazar","Pazartesi","Sali","Carsamba", "Persembe","Cuma","Cumartesi"}; clrscr(); for (gun = PAZAR; gun <= CUMARTESI; gun++) printf("%s\n", gunad[gun]); } rnek 7.2.3: Sabitlere farkli deerler atama enum renkler { sari = 4, mavi, kirmizi }; enum renkler i; main() { i = mavi; printf("%d \n", i); } Ekrana 5 yazar. Problem : Bu tip deikenler dorudan okunup yazlamazlar. * Okumak ise yazmaya oranla biraz daha zordur. Okuma ilemi dier standart tipler kullanlarak dolayl bir ekilde gerekletirilir.

63

8-

Yaplar (struct)

Farkl tipte birden fazla verinin oluturduu btn. Veri tipi olarak daha nce diziyi tanmlamtk. Dizide birbirinin ayn tipi olan veriler pepee saklanyordu. Yaplar da ayn dizi gibi birbirleriyle ilgili olan verileri ierir. Fakat diziden fark, tek bir yap eleman birbirnden farkl tipte birden fazla veriyi ierir. Bu sayede bilgiler daha dzenli ekilde gsterilir. Yap yeni bir tip olmayp var olan standart tiplerden oluur.

8.1 Yap Tanm


Bir rencinin numarasn, adn ve snavdan ald notu ieren bir yap tanmlamas aadaki gibidir. struct ogryapi { char numarasi[10];

64 char adi[20]; int notu ; } struct ogryapi ogr; Artk ogryapi isimli bir veri tipi vardr ve yeden (alandan) olumaktadr ( member =ye : kayd oluturan farkl veri tiplerinin her biri). * Tanmlamada her alann ad ve tipi belirtilir. * Yap tipi olduunu gsterir struct sakl szc kullanlr. * Ayn alan ad farkl yaplarda (bamsz olarak) kullanlabilir. Tanmlama genel olarak struct Yap_Ad { Alan1; Alan2; ... Alan_n; }; Bu tipte bir deiken ise struct Yap_Ad Dei_Ad; eklinde yaplr. Tanmlanan tipte bir deiken tanmlandnda, deiken iin bellekte tm alanlar ierecek ekilde yer ayrlr. lgili deikendeki herhangi bir alan zerinde ilem yapmak iin aralarnda nokta karakteri olmak kouluyla srasyla deikenin ad ve ilgili alann ad verilir. Yukardaki renci rneinde recinin numarasna ogr.numarasi eklinde eriilir. rnek 8.1.1: Karmak saylarda toplama ilemi gerekletirme. main() { struct complex { float real, imag; }; struct complex z1, z2, z3; clrscr(); printf("1. saynn reel ve imajiner ksmlar gir "); scanf("%f %f", &z1.real, &z1.imag); printf("2. saynn reel ve imajiner ksmlar gir "); scanf("%f %f", &z2.real, &z2.imag); z3.real = z1.real + z2.real; z3.imag = z1.imag + z2.imag; printf("%2.0f + %2.0fj\n",z3.real, z3.imag); } rnek 8.1.2: Yap ierisinde baka bir yap kullanm. struct tarih {

65 int gun; int ay; int yil; }; struct kisiler { char adi[21]; struct tarih dogum; }; main() { struct kisiler a; strcpy(a.adi,"veli"); a.dogum.gun = 15; a.dogum.ay = 8; a.dogum.yil = 1905; printf("%s %d\n",a.adi,a.dogum.yil); getch(); } Dier bir tanmlama ekli struct { Alan1; Alan2; ... Alan_n; } deikenler; struct { float real, imag; }z1, z2, z3; rnek 8.1.3: renci ile ilgili olarak numara ve snav notu oku. Snavn ortalamasn ve ortalamay geenleri listele #define OGRSAY 3 main() { struct ogrenci{ char no[10]; int notu; }; struct ogrenci ogr[OGRSAY]; int i, j; float t, ort; clrscr(); for (i=0; i<OGRSAY; i++) { printf("%d. rencinin numaras ve notu : ", i+1); scanf("%s%d",ogr[i].no, &ogr[i].notu);

66 } t = 0; for (i=0; i<OGRSAY; i++) t = t + ogr[i].notu; ort = t / OGRSAY; printf("--------------------------------------------\n"); printf("Ortalama = %f\n", ort); printf("--------------------------------------------\n"); printf("Ortalamay geen renciler\n"); for (i=0; i<OGRSAY; i++) if (ogr[i].notu > ort) printf("%s\t\t%d\n", ogr[i].no, ogr[i].notu); getch(); }

Tanmlama Annda Yap Deikenine Deer Atama struct ogryapi a = {"95003", 56}; Veri Tiplerine Yeni sim Verme C dilinde var olan veri tiplerini yeni bir isim vermekmmkndr. Tanmlama biimi: typedef tanml_tip yeni_ismi; typedef int tamsayi; Artk tamsay isminde bir veri tipi vardr. Deiken tanmlamada kullanlabilir. tamsayi i, j; typedef unsigned char byte; byte x; Yaplar ile kullanm struct complexyapi { float re, im; }; tydef struct complexyapi complex; complex z1, z2; veya typedef struct { float re, im } complex; complex z;

67

rnek 8.1.4: levin deerinin yap olmas durumu typedef struct { float re, im; } complex; main() { complex topla(complex, complex); complex cikart(complex, complex); complex carp(complex, complex); complex z1={1,1}, z2={2,2}; complex z3; clrscr(); printf("%3.0f %3.0fj %3.0f %3.0fj\n",z1.re,z1.im,z2.re,z2.im); z3 = topla(z1, z2); printf("%3.0f %3.0f\n",z3.re,z3.im); z3 = cikart(z1, z2); printf("%3.0f %3.0f\n",z3.re,z3.im); z3 = carp(z1, z2); printf("%3.0f %3.0f\n",z3.re,z3.im); getch(); } complex topla(complex a, complex b) { complex z; z.re = a.re + b.re; z.im = a.im + b.im; return z; } complex cikart(complex a, complex b) { complex z; z.re = a.re - b.re; z.im = a.im - b.im; return z; } complex carp(complex a, complex b) { complex z; z.re = a.re * b.re - a.im * b.im; z.im = a.re * b.im + a.im * b.re; return z; } Union: Deiken Yaps

68 Bir yapdaki yelerin hepsi ayn durumda kullanlmayabilir. yelerin bir blm belirli bir durum iin geerli iken bir ksm farkl bir durum iin geerlidir. Gereksiz yer harcamalarna kar union tipi kullanlabilir. Tanmlama biimi: union ad { tip deiken_1; tip deiken_2; ... tip deiken_n }; Ayn yerde belirtilen alanlardan herhangi biri saklanr. En uzun alan ne ise o kadar yer ayrlr.

union ikisi { int kisa; long uzun; }; union ikisi i; main() { i.uzun = 32768; printf("%d %ld \n",i.kisa, i.uzun); {-32768 32768 } }

Union Deikenin Tanmlama Annda Deer Almas Deikene tanmlama annda deer atandnda alanlardan ilki kullanlyor gibi davranr dil. Bu nedenle atanacak deerin tipine dikkat edilmelidir. union sayilar { int i; float f; }; union sayilar a = {2}; union sayilar a = {2.7};

/* a.i = 2 anlamndadr */ /* a.i = 2 deeri atanr. */

Bitler zerine almalar VE , VEYA ve DEL ileleri mantksal ifadeleri balamakta kullanld gibi dorudan tamsaylar zerinde de kullanlabilir. Bu kullanmda ileler dorudan tamsayy oluturan bitleri etkiler. x & y : x ve y tamsaylarnn bitlerinin srayla VE ilemine tutar. (AND) x|y : x ve y tamsaylarnn bitlerinin srayla VEYA ilemine tutar. (OR) ~x : x tamsaynn her bir bitinin tersini alr (NOT) x^y : x ve y tamsaylarnn bitlerinin srayla dlayan VEYA ilemine tutar. (exclusive OR)

69 x << n : x saysn n bit sola kaydrr. Boalan yerlere 0 gelir. x >> n : x saysn n bit saa kaydrr. Boalan yerlere 0 gelir. x 0 0 1 1 y 0 1 0 1 & 0 0 0 1 | 0 1 1 1 ^ 0 1 1 0

5 & 3 =1 (101) & (011) = (001) | = (111) yani 7 5 << 1 = 10 --> (101) shl 1 = (1010) Hex-Octal gsterim 0xn : n 16 ldr (HEXADECIMAL) 0n : n 8 lidir (OCTAL) n : n 10 ludur (DECIMAL)

0x11 : 17 011 : 9 11 : 11

Klavyedeki tularn durumunu gsterir bilgi bellekten okunduunda her bitin anlam yledir. Bit No 0 sa shift basl/basl deil 1 sol shift basl/basld deil 2 kontrol tuu basl/basl deil 3 alt tuu basl/basl deil 4 scroll tuu ak/kapal 5 num lock tuu ak/kapal 6 caps lock tuu ak/kapal Bu durumda num lock tuunun ak olup olmadn anlamak iin okunan bilginin 5. bitinin deerini snamak gerekecektir. Okunan bilginin x olduunu varsayr ise; if (x & 32) printf("num lock ak"); else printf("num lock kapal"); x & 32 ilemine x deerinin 32 says ile maskelenmesi denir. 32 deeri maske diye arlr. 32 saysnn 8 bit olduunu dnrsel saynn sadece 5. biti bir olup dierleri sfrdr. 32 = (0010 0000) x & 32 ilemi ile x deerinin 5. bitinin bir olup olmamas snanr. Bir ise sonu 32 (farkl sfr), sfr ise sonu 0 olur. rnek 8.1.5: Klavyedeki Num Lock tuunun durumunu syleyen program yaznz. #include <dos.h> main() { unsigned int b1; clrscr(); b1 = peek(0x0040, 0x0017); /* dos.h> */ if (b1 & 32)

70 printf("Num lock ak\n"); else printf("Num lock kapal\n"); getch(); lgili ilevler poke (segment, offset, int value) pokeb (segment, offset, char value) X X peek (segment, offset) peekb(segment, offset)

rnek 8.1.6: rencinin doum tarihi 2 Byte tamsay olarak saklanmaktadr. Bu bilginin kodlamas yledir. bit anlam 0-4 gn 5-8 ay 9 -15 yl (+1970) Byle bir bilgiyi zen program. #include <dos.h> main() { unsigned int i; clrscr(); scanf("%d", &i); printf("%2d", i&0x1f); i = i >> 5; printf("/%2d", i&0x1f); i = i >> 4; printf("/%4d", i+1970); } rnek 8.1.7 unsigned swap(unsigned) deitirilmiini verir unsigned max(unsigned) byn verir main() { unsigned i, j; i = 0xAA11; clrscr(); printf("%x %x %x\n", i, swap(i), max(i)); getch(); } unsigned swap(unsigned a) { return (a>>8) | (a<<8);

: gnderilen tamsaynn dk ile yksek sekizlisinin yerini : gnderilen tamsaynn dk sekizlisi ile yksek sekizlisinden

71 } unsigned max(unsigned a) { unsigned lo, hi, m; lo = a & 0x00FF; hi = a >> 8; m = (lo>hi) ? lo:hi; return m; } rnek 8.1.8: Aadaki ilevlerin gerekletirilmesi. void binary_yaz(unsigned x); { x tamsaysnn 2li dzendeki karln yazar } unsigned copybits(x, b, n) { x saysnn sadan b. bitinden itibaren n bitini verir} unsigned ters(x, b, n): { x saysnn sadan b. bitinden itibaren n bitini tersini alr} unsigned rdon(x, n): { x saysn n bit saa dndrr} /* Programn balangc */ typedef unsigned int word; /* kolaylk i.in */ void binary_yaz(word); word copybits(word x, word b, word n); word ters(word x, word b, word n); word rdon(word x, word n); word sdon(word x, word n); main() { word i, j; clrscr(); for (i=16; i>0; i--) printf("%x", i-1); printf("\n"); i = 0xee; binary_yaz(i); printf("\n"); j = copybits(i, 5, 4); binary_yaz(j); printf(" copybits(i, 5, 4) \n"); j = ters(i, 5, 4); binary_yaz(j); printf(" ters(i, 5, 4)\n"); j = rdon(i, 4); binary_yaz(j); printf(" rdon(i, 4)\n"); getch(); } word copybits(word x, word b, word n) /* x saysnn sadan b. bitinden itibaren n bitini verir. */ /* ilk bitin numaras 0 */ { word i;

72 i = x >> (b + 1 - n); /* ilgili bit blounun saa dayal olacak */ /* biimde kaydr. */ i = i & ~(~(0) << n); /* sadaki n bit iin maske olutur */ return i; } /* End Of copybits */ word ters(word x, word b, word n) /* x'in b. bitinden itibaren n bitin tersini alr */ { word p, r; p = ~(x); r = ~(~(0) << n) << (b - n + 1); /* seilen bitler iin maske */ p = p & r; x = x & ~(r); return x | p; /* 8 bit iin ters(. ,5,4) 76543210 x = 0110 1000 p = 1001 0111 r = 00111100 ~(~(0) << n) << (b - n + 1) p = 00010100 p=p&r x = 0100 0000 x & ~(r) = 01010100 x | p dnen } /* End of test */ word rdon(word x, word n) /* x'i n bit saa dndrr */ { word i; for (i = 1; i <= n; i++) { if (x % 2 == 1) { x = x / 2; x = x | 0x8000; } else x = x / 2; } return x; } /* End of rdon */ word sdon(word x, word n) /* x'i n bit saa kaydrr. RDon fonksiyonun baka biimi */ { word i; i = copybits(x,n - 1,n); x = x >> n; i = i << (16 - n + 1); return x | i; } /* End of RDon */

73

void binary_yaz(word x) { int i; word m; m = 0x8000; for (i = 0; i<16; i++) { if (x & m) printf("1"); else printf("0"); m = m >> 1; } }

9. Pointer (gsterici, iareti)


9.1 Tanmlanmas ve Kullanm
Bir veri blounun bellekte bulunduu adresi ieren (gsteren) veri tipidir. Tanmlama biimi: veri tipi *p; p deikeni <veri tipi> ile belirtilen tipte bir verinin bellekte sakland adresi ierir. int *iptr; float *fptr;

Bu kadar tanmla sonucunda bellekte p deikeni mevcuttur. Ancak iaret ettii veri blou yoktur. Bunun iin iki yol vardr. Birincisi kullanlan herhangi bir deikeni iaret etmek, ikincisi ise veri blounu bo bellei kullanarak oluturmak. 1. areti deikenin var olan bir deikenin bulunduu adresi gstermesi. Bu ilemi yapabilmek iin var olan deikenin adresinin bilinmesi gerekmektedir. & ileci : Bir deikenin adresinin belirlenmesi iin kullanlr. Kullanm biimi:

74

&deiken &i : i deikenin adresini verir. main() { int i; int *iptr; i = 5; iptr = &i; clrscr(); printf("i deikeninin adresi %p\n", &i); printf("iptr deikeninin deeri %p\n", iptr); } Bellek modeline gre SSSS:OOOO veya OOOO biiminde adres yazar. 8FF8:1000 2. Veri blounu bo bellei kullanarak oluturmak. Bu yolla veriler iin dinamik yer ayrlr. Bunun iin malloc ilevi kullanlr void *malloc(n) : Bo bellekten n byte yer ayrp balang adresini dndrr. iptr = (*int) malloc(2); !!!!!!!!! Daha sonra dn yaplacak. sizeof, cast ileci (*tip) ... Veriye iareti deiken yoluyla eriim Bir iaretinin gsterdii adresteki veriye erimek iin iareti deikeninin nne * karakteri konur. main() { int i; int *iptr; iptr = &i; *iptr = 8; printf("i deikeninin deeri %d\n", i); printf("iptr adresinin ierii %d\n", *iptr); } Ekranda kt : i deikeninin deeri 8 iptr adresinin ierii 8 !!! areti deikenin gsterdii adresin ierii deiken ilklendirmeden kullanlmamaldr

9.2 areti Aritmetii


areti deikenler zerinde toplama ve kartma ilemleri (++, --) geerlidir. Ancak

75 eklenecek deer tamsay olmaldr. areti deikenin deeri 1 arttrld zaman deiken bir sonraki veri blounu isaret eder. Deikenin alaca yeni deer iareti deikenin ne tip bir veri blounu iaret ettiine baldr. int *iptr, i; ... iptr = &i; dir. iptr++;

i deikenin adresinin 1000 olduunu varsayalm. iptr nin deeri 1000 iptr nin deeri 1002 olur. ( int deeri iaret ettii iin)

ayn rnei double iin yaparsak double *iptr, i; ... iptr = &i; i deikenin adresinin 1000 olduunu varsayalm. iptr nin deeri 1000 dir. iptr++; iptr nin deeri 1008 olur. ( double deeri iaret ettii iin) int *iptr, i, j; ... iptr = &i; dir. *(iptr+4)=2;

i deikenin adresinin 1000 olduunu varsayalm. iptr nin deeri 1000 1008 adresinin ieriini 2 yapar.

!!! Arttrma iaret edilen veri blouna gre yaplr Yani bir sonraki veri blounun gsterilmesi salanr. iptr++ ; bir sonraki veri blounu gster (*iptr)++; iptr deikeninin gsterdii adresteki deeri 1 arttr

9.3 aretiler ve Diziler


arteiler zerinde geerli aritmetik yardmyla dizilere iareti deikenler ile erimek mmkndr. #include <stdio.h> main() { int i[10], j; int *iptr; for (j=0; j<10; j++) i[j]=j; /* Dizinin balang adresine erimek iin ilk elemann adresi kullanlabilir &i[0] veya dorudan */ iptr = i;

76 clrscr(); for (j=0; j<10; j++) { printf("%d ", *iptr); iptr++; } printf("\n"); /* iptr artk dizinin ban gstermez */ iptr = i; for (j=0; j<10; j++) printf("%d ", *(iptr+j)); printf("\n"); /* iptr hala dizinin ban gsterir */ getch(); } rnek 9.3.1: areti ve dizgi kullanm. #include <stdio.h> main() { char *a="1234567890"; char b[11]; char *p1, *p2; printf("%s\n", a); p1 = a; p2 = b; while (*p1 != '\0') { *p2 = *p1; p1++; p2++; } printf("%s\n", b); }

9.4 levleri Referans Yoluyla arma


u ana yazdmz ilevlerde gnderilen parametrelerin (diziler hari) deerlerinin deitirilmesi mmkn deil idi. lev arld zaman parametrelerin bir kopyas kartlp ileve gnderiliyordu. Bir ilevin birden fazla deer gnderebilmesi iin iaretilere gereksinimiz vardr. void arttir(int); main() { int i; i = 5; printf("ncesi %d\n", i); arttir(i); printf("sonras %d\n", i);

77 getch(); } void arttir(int k) { k++; } kt : ncesi 5 sonras 5 Gnderilen parametrenin kopyas ileve gnderildii iin ilev ierisinde yaplan deiiklikler ilevin arld yeri etkilemez. Eer parametredeki deiikliklerin ilevin arld yerde de geerli olmasn istiyorsak ileve parametrenin adresini gndermek gerekir. void arttir(int*); main() { int i; i = 5; printf("ncesi %d\n", i); arttir(&i); printf("sonras %d\n", i); getch(); } void arttir(int *k) { (*k)++; } ncesi 5 sonras 6

rnek 9.4.1: Saysal dizgiyi tamsayya dntren ilevde iyiletirme. Geersiz karakterin konumu da verilsin. int deger(char *s, int *konum) konum = -1 ise tm karakterler rakam >=0 ise geersiz karakterin konumu rnek 9.4.2 : Sraya dizme. Yer deiiklii ilevde ve parametrelere referans yolu ile eriim. #include <stdio.h> #include <conio.h> #define N 20 void degistir (int *, int *); main() {

78 int s[N]; int i, k; clrscr(); for (i=0; i<N; i++) { s[i] = rand() % 100; printf("%4d",s[i]); } printf("\n"); k=1; do { k=0; for (i=0; i<N-1; i++) if (s[i] > s[i+1]) { degistir (&s[i], &s[i+1]); k = 1; } } while (k); for (i=0; i<N; i++) printf("%4d",s[i]); printf("\n"); getch(); } void degistir (int *a, int *b) { int gec; gec = *a; *a = *b; *b = gec; }

!!! Dizilerde iareti olduu iin a deikeni bir dizi(veya iareti ise) a[i] ile *(a+i) ifadeleri ayn anlam tar. rnek 9.4.3: leve gnderilen dizinin ilev ierisinde iareti olarak kullanm. #include <stdio.h> #include <conio.h> #define N 5 float ort (int *); main() { int s[N]; int i, k;

79 clrscr(); for (i=0; i<N; i++) { s[i] = rand() % 100; printf("%4d",s[i]); } printf("\n"); getch(); } float ort (int *a) { int i; float t = 0; for (i=0; i<N; i++) t = t + *(a+i); return t/N; }

rnek 9.4.5: ileve gnderilen iaretinin ilev ierisinde dizi olarak kullanm .

void malloc(n): En az n byte uzunluunda bellekten yer ayrr. levin deeri >0 ise bloun bellekteki yeri, NULL yer yok demektir. int *i; i = (int *) malloc(2000) ; 2000 byte yer ayrp bloun balang adresini i 'ye atar ( 1000 elemanl int dizisi )

double *x; x = (double *) malloc(8*2000); 2000 elemanl double dizi sizeof(n) : n ifadesinin/tipinin byte olarak uzunluunu verir. i = (int *) malloc(1000*sizeof(int)) ; 1000 tane int deer ierecek bellek uzunluu x = (double *) malloc(2000*sizeof(double)); 2000 elemanl double dizi void free (void *block) : mallock ilevivi tersi. Block deikenin tuttuu yeri bo bellee gnderir

#include <stdio.h> #include <conio.h> #define N 8 float ort (int []); main() { int *s; int i, k; s = (int *) malloc(2*N); clrscr();

80 for (i=0; i<N; i++) { s[i] = rand() % 10; printf("%4d",*(s+i)); } printf("\n"); printf("Ortamala = %.2f\n",ort(s)); getch(); } float ort (int a[]) { int i; float t = 0; for (i=0; i<N; i++) t = t + a[i]; return t/N; }

rnek 9.4.6 : Bir dizinin elemanlarnn iareti olmas. Daha nce yaplan bir rnekte ay isimleri bir dizide saklanmt. main() { char *aylar[] = {"", "Ocak", "ubat", "Mart", "Nisan", "Mays", "Haziran", "Temmuz", "Austos", "Eyll", "Ekim", "Kasm", "Aralk"}; int i; printf("Ayn srasn gir "); scanf("%d", &i); if (i>0 && i<13) printf("%s\n", aylar[i]); getch(); } Benzer ekilde float *a[100]; tanmlamas her bir eleman bellekte bir 'float' sayy gsteren iareti olan 100 elemanl bir dizidir. rnek 9.4.7 : Bir iaretinin adresini ieren iaretiler. main() {

81 int i; int *iptr; int **iptrptr; i = 5; iptr = &i; iptrptr = &iptr; clrscr(); printf(" i ve &i : %d %p\n", i, &i); printf(" *iptr ve iptr : %d %p\n", *iptr, iptr); printf("*iptrptr ve iptrptr : %p %p\n", *iptrptr, iptrptr); getch(); } Ekrana kt: i ve &i : 5 8FDD:1000 *iptr ve iptr : 5 8FDD:1000 *iptrptr ve iptrptr : 8FDD:1000 8FDD:0FFC

9.5 aretiler ve Yaplar


Bir iareti ileve parametre olarak gnderildiinde basit deiken gibi deikenin kopyas alnp gnderiliyordu. Yapnn byk olduu durumlarda bu da sorun kartr. aretinin bir yap verisini gstermesi. struct ogrenci{ char no[10]; int notu; }; struct ogrenci *a Tanmlamasnda a deikenini oluturan alanlara erimek iin, bilinen yol: *a.notu=56; strcpy((*a).no, "95001"); Bunun farkl kullanm: a->notu=56; strcpy(a->no, "95001"); rnek 9.5.1 : Yapnn adresinin ileve gnderilmesi. #include <stdio.h> typedef struct { char adi[35]; char adres1[40];

82 char adres2[40]; char tel[15]; float borc; } kisiler; void yaz(kisiler *z); main() { kisiler a; clrscr(); printf("Adn gir : "); gets(a.adi); printf("Adres-1 : "); gets(a.adres1); printf("Adres-2 : "); gets(a.adres2); printf("Telefonu : "); gets(a.tel); printf("Borcu : "); scanf("%f", &(a.borc)); yaz(&a); } void yaz(kisiler *z) { clrscr(); printf("Ad : "); puts(z->adi); printf("Adresi : "); puts(z->adres1); printf(" : "); puts(z->adres2); printf("Telefonu : "); puts(z->tel); printf("Borcu : "); printf("%.0f\n", z->borc); }

9.6 Dinamik bellek kullanm


boyutlu dizi tanm ve kullanm. boyut --> Gerilim - Akm - Zaman rnek 9.6.1: Tek boyutlu diziyi boyutlu gibi kullanma. /* boyutlu dinamik dizi kullanm. Her boyut farkl uzunlukta Dizi tek boyutlu gzkyor. Ancak indis, hesaplanarak bulunuyor Yani *(a + i*y*z + j*z +k) ^ ^ ^ ^ 3. boyutun uzunluu ^2. boyutun uzunluu eklinde kullanlabilir. */ #define x 4 #define y 5 #define z 9 void matris_yaz(int *); main()

83 { int *a; int i, j, k; a=(int *) malloc(x * y * z * sizeof(int)); /* eleman sayisi kadar yer ac */ clrscr(); for (i=0; i<x; i++) { printf("i = %d \n", i); for (j=0; j<y; j++) { for (k=0; k<z; k++) { *(a + i*y*z + j*z +k) = i*j*k; printf("%5d ",*(a + i*y*z + j*z +k)); } printf("\n"); } } matris_yaz(a); } void matris_yaz(int *m) { int i, j, k; clrscr(); for (i=0; i<x; i++) { printf("i = %d \n", i); for (j=0; j<y; j++) { for (k=0; k<z; k++) { printf("%5d ",*m); *m++; } printf("\n"); } getch(); } } rnek 9.6.2: /* Uc boyutlu dinamik dizi kullanimi. Her boyut farkli uzunlukta Bu yontem ile diziye normal dizi gibi erismek mumkun Yani a[i][j][k] seklinde kullanilabilir. */ #define x 8 #define y 4 #define z 10 main() { /*

84 typedef int *boyut1; typedef boyut1 *boyut2; typedef boyut2 *boyut3; boyut3 a; */ double ***a; int i,j,k; a=(double *) malloc(x*sizeof(double*)); /* 1. boyut icin yer ayir (iaretiler) */ for (i=0; i<x; i++) /* 2. boyut icin yer ayir. (iaretiler) */ *(a+i)=(double *) malloc(y*sizeof(double*)); /* 1. boyutun her elemani n */ /* elemanli diziyi gosterir */ for (i=0; i<x; i++) /* 3. boyut icin yer ayir (matrisin elemanlar) for (j=0; j<y; j++) *(*(a+i) + j) = (double *) malloc(z*sizeof(double)); clrscr(); for (i=0; i<x; i++) for (j=0; j<y; j++) for (k=0; k<z; k++) *(*(*(a + i) + j) + k) = i*j*k; for (i=0; i<x; i++) { printf("i = %d \n", i); for (j=0; j<y; j++) { for (k=0; k<z; k++) printf("%4.1f ",a[i][j][k]); printf("\n"); } getch(); } } */

9.7 aretilerle lgili Dier Konular


aretinin Belirli Bir Adresi Gstermesi #include <dos.h> #include <stdio.h> char far *ekran; void kaydir_Y(void); void kaydir_A(void); void main() { int i, j; char c; ekran = MK_FP(0xB800, 0); clrscr();

85 for (i=0; i<25; i++) for (j=0; j<80; j++) ekran[160*i+2*j] = 65+i; while (1) { c = toupper(getch()); switch(c) { case 'A' : /* yukari */ kaydir_Y(); break; case 'Z' : /* asagi */ kaydir_A(); break; case 'Q' : exit(0); } } } void kaydir_Y(void) { int i, j; for (i=8; i<=12; i++) for (j=30; j<60; j++) ekran[160*(i-1) + 2*j] = ekran[160*i + 2*j]; } void kaydir_A(void) { int i, j; for (i=12; i>=8; i--) for (j=30; j<60; j++) ekran[160*(i+1) + 2*j] = ekran[160*i + 2*j]; } lev aretileri aretinin bir ilevin bulunduu adresi iermesi durumudur. Normal iareti gibi ilevin adresini ieren deiken tanm yaplmaldr. rnein; int (*fnptr) (int, int) fnptr deikeni iki tane int parametresi olup bir int deer geri gnderen bir ilevin adresini ierebilir. (int *fnptr (int, int) : iki int parametresi olup int iareti geri gnderir ) rnek 9.7.1: Ayn isim ile farkl iki ilevi arma. int kare(int); int kub(int); main() { int (*islem)(int); int i; char c;

/* bir int deer alp geriye int deer gnderen bir ilevin adresi */

86 clrscr(); printf("1 / 2 : kare / kb hesab : "); c = getch(); printf("\nSayy gir : "); scanf("%d", &i); if (c == '1') islem = kare; else islem = kub; /* kare ilevinin adresi islem deikenine kopyalanr */

printf("Sonu = %d\n", islem(i)); getch(); } int kare(int s) { return s*s; } int kub(int s) { return s*s*s; }

Void aretiler aretiler void olarak tanmlanabilir. Bu biimde tanmlanan iaretilerin gsterdii adresteki deere erimek iin veri tipi belirtilmelidir. main() { void *a; a = (char*) malloc(10); strcpy(a,"12345"); printf("%s\n", a); free(a); a = (double*) malloc(sizeof(double)); *(double*)a = 3.123; /* deere eriirken veri tipi belirt */ printf("%f\n", *(double *)a); getch(); }

87

10. Daha nce Gemeyen Konular


Deyimler continue: Dngnn herhangi bir satrnda iken, bir sonraki dng admn geilmesini salar. rnek 10.1: #include <stdio.h> int main() { int i; for(i = 1 ; i < 10 ; i++) { if (i == 5) break; printf("%d\n", i); } for(i = 1 ; i < 10 ; i++) { if (i == 5) continue; printf("%d\n", i); } }

gotoxy(x, y) : mleci metin ekrannda istenilen noktaya tar. void gotoxy(int x, int y) gotoxy(25, 23); printf("Bir tua basnz."); wherex(), wherey() : Bulunulan yer exit: Herhangi bir yerde programn almasn sonlandrr. void exit(int durum); : Dosyalar kapatlr, durum parametresinin deeri programn arld yere geri gnderilir. goto : Programn herhangi bir yerinden baka bir yere atlanmasn salar ( ayn ilev ierisinde). Gidilecek yerin tanmlanmas gerekir. Kulanm ekli; goto son programn ak son: etiketinin alduu yerden devam eder

88

... son : return;

rnek: Matriste sfrdan kk deerli ilk elemann yerini bulan program. #include <stdlib.h> main() { int a[10][10]; int i, j; randomize(); for (i = 0; i<10; i++) for (j = 0; j<10; j++) a[i][j] = (rand() % 100) - 20; for (i = 0; i<10; i++) for (j = 0; j<10; j++) if (a[i][j] < 0) goto bulundu; printf("Sfrdan kk say yok\n"); goto son; bulundu: printf("Saynn konumu ve deeri (%d, %d) = %d \n",i, j, a[i][j]); son: return 0; } ? : leci deiken = mantksal ifade ? ifade1 : ifade2 mantksal ifade doru is deikene ifade1, yanl ise ifade2 deeri atanr. a = (i == 5) ? 1 : 0; Eer i'nin deeri 5 ise a'ya 1, aksi halde 0 atanr. Ayn ifade ak olarak yazlrsa; if (i ==5) a = 1; else a = 0; rnek 10.2:

89

main() { int a; int i, j; scanf("%d%d", &i, &j); a = (i > j) ? i : j; printf("%d\n", a); }

Bileik Atama leci a = a + b ilemi a += b eklinde de yazlabilir. = ileci ile birlikte bu ekilde kullanlabilen dier ileler; * / % + - << >> & ^ |

Bu ileler iin a = a ile b ile a ile= b ayn anlam tar.

Virgl leci u ana kadar kullanlan biim dnda, Birden fazla deyimin ayn ifadede yrtlmesini salar. fade tek bir sonu verecek ise parantez ierisine alnmaldr. fadeler soldan saa yrtlr ve son ifade parantez ii ifadenin deeri olur. i = (5, 3, 8); i=8

i = (j = 2; j = j + 5); i = 7 for dngsnn blmlerinde birden fazla deyim yrtmede kullanlr. for (t = 0, i = 0; i<100; i++) t = t + i;

Geici Veri Tipi Deitirme (type cast)

90

Bir deerin tipinin geici olarak deitirmek mmkndr. Kullanm ekli,. (veri tipi) ifade; ifade (deiken, sabit) tipi belirtilen tipe dntrlr.

rnek 10.3: #include <stdlib.h> main() { float a, b; int i, j; i = 500; j = 500; a = i * j; b = (float) i*j; printf("%f %f\n", a, b); } -12144.000000 250000.000000 fade erisinde Atama Deyimi Kullanma #include <stdlib.h> main() { char c; while ((c=getch()) != 'S') printf("%c", c); printf("\n%c tuuna bastnz\n", c); getch(); } ((c=getch()) != 'S') ifadesinde ilk nce en iteki parantez c = getch() yrtlr. Daha sonra karlatrma ilemi yaplr. ++ / -- leleri fade ierisinde deikenin ardnda ise deikenin deeri ifadede kullanlr ve deeri bir arttrlr nnde ise deikenin deeri deeri bir arttrlr ve yeni deeri ifadede kullanlr.

91

i = 2; k = 5*i++; k = 5*++i; --> k = 10 --> k = 15

#define nilemcisi define nilemcisi ile ilev benzeri makrolar yazmalar mmkndr. #define kub(x) ((x)*(x)*(x)) main() { int i; i = 5; printf("%d \n", kub(i)); } Makro tanm satrnda parametrelerin parantez ierisine alnmas unutulmal. Makro kub(i+1) biiminde arldnda, i=2 iin ((x)*(x)*(x)) --> (i+1)*(i+1)*(i+1) --> 27 (x * x * x) --> (i+1* i+ 1* i+1) --> 6

#define ustal(a, b) (pow((a), (b)))

92

11. Grafik
Basit grafik ilemleri nasl gerekletirilir (sorumlu deiller). Normal alma annda text ekranda (25, 80) boyutlarnda. * void textbackground(int newcolor); : alt zemin rengi * void textcolor(int newcolor); : yaz rengi * void textattr(int newattr); 8 bitlik say. hem alt zemin hem de yaz rengi verilir Bbbbffff (B = blink) * void highvideo(void); Yaz parlakl * void lowvideo(void); * void normvideo(void); Bu ilevler dorudan ekrana yazan deyimlere yneliktir (cprintf, cput) #include <conio.h> main() { int i; textbackground(BLACK); clrscr(); for (i=0; i<=15;i++) { textcolor(i); cputs("HSEYN PEKTA\r\n"); } getch(); } Grafik izimi iin bilgisayarn grafik modunda olmas gerekir. /* * void far initgraph(int far *graphdriver, int far *graphmode, char far *pathtodriver); Grafik sistemini verilen degerlere gore ayarlar. Grafik komutlarini kullanmadan once calistirilmalidir.

93 * closegraph; Grafik sistemini kapatir. * graphresult: int; Grafik islemi ile ilgili bilgi verir. * char *far grapherrormsg(int errorcode); Belirtilen grafik hatasi icin mesaji verir. * line(x1, y1, x2, y2); * lineto(x, y); Bulunulan yerden (x,y) ye kadar izer * linerel(x, y); Bulunulan yerin (x,y) tesine kadar izer * moveto(x, y); * void far cleardevice(void); Grafik ekrann siler * circle(x, y , r); * putpixel(x, y, renk); * getpixel(x, y); Belirtilen noktanin piksel degerini verir * getx; Bulunulan * gety; noktalar * getmaxx; Maksimum olabilecek * getmaxy; noktalar * outtext(char far *) : Bulunulan yere metni yazar * outtextxy(x, y, char far *) : Belirtilen yere metni yazar * int far getcolor(void); : izim rengi ren * void far setcolor(int color); : izim rengini deitir * int far getbkcolor(void); : alt zemin rengini ren void far setbkcolor(int color);: alt zemin rengini deitir EGA_BLACK EGA_BLUE EGA_GREEN EGA_CYAN EGA_RED EGA_MAGENTA EGA_LIGHTGRAY EGA_BROWN 0 1 2 3 4 5 7 20 EGA_DARKGRAY EGA_LIGHTBLUE EGA_LIGHTGREEN EGA_LIGHTCYAN EGA_LIGHTRED EGA_LIGHTMAGENTA EGA_YELLOW EGA_WHITE 56 57 58 59 60 61 62 63

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> main() { int gd, gm, hata; int x, y; gd = DETECT; /* ekran srcsn otomatik tan */ /* CGA, HERC, VGA..*/

94

initgraph(&gd, &gm, "c:\\diller\\tc3\\bgi\\"); /* gd gm VGA VGALO 0 640 x 200 16 color 2 9 VGAMED 1 640 x 350 16 color 2 VGAHI 2 640 x 480 16 color 1 */ hata = graphresult(); if (hata != grOk) /* grOk = 0 tanml */ { printf("Grafik hatas: %s\n", grapherrormsg(hata)); getch(); exit(1); } x = getmaxx(); y = getmaxy(); setbkcolor(EGA_RED); setcolor(EGA_YELLOW); cleardevice(); line(0, 0, 0, y); line(0, y, x, y); line(x, y, x, 0); line(x, 0, 0, 0); getch(); cleardevice(); moveto(50, 50); lineto(50, 100); lineto(100,100); lineto(100,50); lineto(50, 50); getch(); closegraph(); } rnek 11.1: lev izimi #include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <math.h> double fonk(double x); double fonk1(double x); main() {

95 int gd, gm, hata; double x, y; int orgx, orgy; gd = DETECT; initgraph(&gd, &gm, "c:\\diller\\tc3\\bgi\\"); hata = graphresult(); if (hata != grOk) { printf("Grafik hatas: %s\n", grapherrormsg(hata)); getch(); exit(1); } orgx = 20; orgy = getmaxy() / 2; line(0, orgy, getmaxx(), orgy); /* x ekseni */ line(20, 0, 20, orgy+50); /* y ekseni */ outtextxy(getmaxx()-50, orgy-10, "Zaman"); outtextxy(22, 0, "Volt"); for (x = 0; x< 6.28; x = x + 0.005) { y = fonk1(x); putpixel(orgx + 80*x, orgy - y, 2); /* renk yeil EGA_GREEN*/ /* - nk eksenin zerinde izsin */ } getch(); closegraph(); } double fonk(double x) { double y; y = 100 * sin(10 * x); return y; } double fonk1(double x) { double y; y = 1 - exp(-x); return 200*y; }

96

12. KTKLER
12.1 TEXT Ktkler
(sral eriim, ascii, metin) Ktk(file): Bilgilerin diskte saklan biimi. Text kt : - karakterlerden oluur. - her satrn sonunda satr sonunu gsterir zel karakter '\n' vardr. - ktn sonunda ktk sonunu gsterir zel karakter 'eof' vardr. rnek: Birinci satr<\n> Bu da ikincisi<\n><eof> Diskte satrlar pepeedir. lk satrdaki <\n> karakterinden hemen sonra ikinci satrn ilk karakteri gelir. Ktklerin Kullanm Bir kt kullanmadan nce iki ilemim yaplmas germektedir. Ktk ile ilgili iaretinin tanmlanmas ve ktn almas. Tanml FILE tipinde iareti deiken tanmlayarak ilk ilem gerekletirilir. FILE *kp; /*FILE yaps stdio.h ierisinde tanml */ kinci aamada ktk ama deyimi kullanlr. kp = fopen(ktk ad, mod) ktk ad : amak istediimiz ktn ad (string). Byk - kk harf ayrm yok. mod : kullanm amac (string). Okuma, yazma deiiklik ... r w a r+ w+ a+ : okumak iin : yazmak iin. Ktk yok ise oluturulur, var ise ierii silinir. : : : : eklemek iin. Ktk yok ise oluturulur , var ise sondan itibaren yazlr Var olan bir kt okumak ve yazmak iin Okumak ve yazmak iin yeni bir ktk olutur. Dosya var ise ierii silinir. Eklemek iin. Okuma ve yazma yaplabilir. . Dosya yok ise oluturulur..

rnek 12.1.1 : Kte yazma #include <stdio.h> main() { FILE *kp; char *s; int i;

97

kp = fopen("dene", "w"); /* NULL ise ilem baarsz */ if (kp == NULL) exit(1); for (i=0; i<5; i++) { gets(s); fprintf(kp, "%s\n", s); } getch(); fclose(kp); /* kt kapatr. Program sona erdiinde otomatik kapatlr */ /* fcloseall() hepsini kapatr. Dnen , kapanan ktk says. Hata var ise EOF dner */ } Yazarken kullanlan fprintf deyiminin almas printf gibidir. Sadece ilk parametre olarak ktk deikenini vermek gerekir. Benzer ktk ilevleri int fgetc(FILE *stream); int fputc(int c, FILE *stream); char *fgets(char *s, int n, FILE *stream); int fputs(const char *s, FILE *stream);

n-1 karakter veya satr sonuna kadar okur satr sonu bilgisini ayrca yazmak gerekir

rnek 12.1.2: Ktkten okuma #include <stdio.h> main() { FILE *kp; char *s; int i; kp = fopen("dene", "r"); if (kp == NULL) exit(1); clrscr(); for (i=0; i<5; i++) { fscanf(kp, "%s", s); printf("%s\n", s); } /* Ktkteki kayt says bilimiyor ise */ rewind(kp); /* fseek(stream, 0L, SEEK_SET) SEEK_SET 0 batan SEEK_CUR 1 bulunulan yerden SEEK_END 2 sondan */ fscanf(kp, "%s", s); while (!feof(kp)) { printf("%s\n", s);

98 fscanf(kp, "%s", s); } getch(); } int feof(FILE *) : ktn sonuna eriilmi ise sfrdan farkl bir deer alr. Aksi halde sfrdr. rewind(FILE *) : ktk iaretisinin (ktkteki hang kaydn okunaca bilgisi) ktn ban gstermesini salar. rnek 12.1.3: Ekleme ve okuma a+ modunda ktk a. + eklenmez ise ktk iaretisi ktk bana tanmyor #include <stdio.h> main() { FILE *kp; char *s; int i; kp = fopen("dene", "a+"); if (kp == NULL) exit(1); clrscr(); for (i=0; i<2; i++) { gets(s); fprintf(kp, "%s\n", s); } rewind(kp); fscanf(kp, "%s", s); while (!feof(kp)) { printf("%s\n", s); fscanf(kp, "%s", s); getch(); } getch(); } rnek 12.1.4: Matrisin elemanlarnn deerlerinin ktkten renilmesi. ktn ismi matrisa.dat matris elemanlar double boyut 4x3 #define SAT 4 #define SUT 3 #include <stdio.h> main() { FILE *kp; double a[SAT][SUT]; int i, j; kp = fopen("matrisa.dat", "r");

99 if (kp == NULL) exit(1); for (i=0; i<SAT; i++) for (j=0; j<SUT; j++) fscanf(kp, "%lf", &a[i][j]); clrscr(); for (i=0; i<SAT; i++) { for (j=0; j<SUT; j++) printf("%8.1f", a[i][j]); printf("\n"); } getch(); } rnek 12.1.5: Hesaplanan deerlerin kte yazdrlmas. 1-exp(-x) fonksiyonu 0-10 aralnda 0.02 admlarla hesaplanp kte yazlyor #include <stdio.h> #include <math.h> #define ADIM 0.02 #define T0 0 #define TS 10 main() { FILE *kp; double f, t; kp = fopen("sonuc.dat", "w"); if (kp == NULL) exit(1); for (t=T0; t<TS; t = t + ADIM) { f = 1 - exp(-t); fprintf(kp, "%6.3f %12.8f\n", t, f); printf("%6.3f %12.8f\n",t, f); } getch(); } 12.1.1 Text Ktkte Deiiklik Ktk iaretisi deiiklik yaplacak kayd gstermelidir. Ayrca yeni bilgi eski bilgi ile ayn olmaldr. Bu nedenle text ktklerde deiiklik bavural bir ey deil. Gerektii durumlarda kaytlar geici olarak baka bir kte yazlr. int remove(const char *k_adi) : kt siler int rename(const char *eski, const char *yeni) : ktn ismi deitirilir

100

rnek 12.1.6: Girilen dosyada herbir harfin kadefa getiini bulup, oktan aza doru yazar. #include <stdio.h> #include <stdlib.h> void degistir(int *, int *); main(int argc, char *argv[]) { char dosyaadi[64]; FILE *fp; char c; long toplam = 0; int frek[2][26] = {0,}; int i, j, k; for (i=0; i<26; i++) frek[0][i] = 65 + i; if (argc<2) { printf("Dosya adn belitmediniz\n"); exit(1); } else strcpy(dosyaadi, argv[1]); fp = fopen(dosyaadi, "r"); while (!feof(fp)) { c = toupper(fgetc(fp)); if (c >= 'A' & c <='Z' ) frek[1][c - 'A']++; } for (i = 0; i < 26; i++) toplam = toplam + frek[1][i]; clrscr(); printf("ncelenen Dosya : %s\n", dosyaadi); printf("Toplam harf : %ld", toplam); /* oktan aza doru srala */ do { k = 0; /* bayrak */ for (i=0; i < 25; i++) if (frek[1][i] < frek[1][i+1] ) { k = 1; degistir(&frek[0][i], &frek[0][i+1]); degistir(&frek[1][i], &frek[1][i+1]); } } while (k == 1);

101

for (i = 0; i < 26; i++) { if (i<13) gotoxy(1, 5+ i); else gotoxy(40, 5 + i - 13); printf("%c: %6d %5.3f",frek[0][i] , frek[1][i], (float)frek[1][i]/toplam); } getch(); } void degistir(int *a, int *b) { int c; c = *a; *a = *b; *b = c; } rnek kt: (frekans classics.txt) ncelenen Dosya : classics.txt Toplam harf : 122850 E: T: A: I: S: O: N: R: H: L: D: C: U: 14657 0.119 10449 0.085 9902 0.081 9889 0.080 9504 0.077 9492 0.077 8521 0.069 7706 0.063 6215 0.051 5333 0.043 4463 0.036 3760 0.031 3121 0.025 M: F: P: Y: W: G: B: V: K: Z: J: X: Q: 2870 0.023 2630 0.021 2440 0.020 2292 0.019 2257 0.018 2172 0.018 1779 0.014 1279 0.010 1260 0.010 288 0.002 236 0.002 218 0.002 117 0.001

12.2 Rastgele Eriimli Ktkler


- Veriler sabit uzunluktaki bloklar (kayt) eklinde saklanr. - Veriler karekterler dizisi biiminde sakl. - Deikenlerin ierii bellekte saklan biimiyle kte yazld iin okuma/yazma ilemleri text ktklere gre daha hzl. - Ayn sebepten dolay veriler ktkte daha az yer kaplar. - Gerel saylarda hassasiyet kayb yok. - stenilen kayda dorudan erimek mmkn.

102 Bilgiler sabit uzunlukta sakland iin deiiklik annda kayt bozulmas yok stenilen bilgiye erimesi kolay. Ktklerin Bu Biimde Kullanlmas in fwrite ve fread deyimleri kullanlr fwrite(veri_ptr, uzunluk, kac_tane, kp) : Belirtilen sayda sabit uzunluktaki veriyi kte yazar veri_ptr : Yazlacak veriye iareti uzunluk : Yazlacak verinin uzunluu kac_tane : Verinin ka defa ard arda yazlaca kp : Ktk iaretisi Kte uzunluk * kac_tane kadar byte yazlr. Dn deeri yazlan veri says ( byte deil) fead(veri_ptr, uzunluk, kac_tane, kp) : Belirtilen sayda sabit uzunluktaki veri ktkten okunur rnek 12.2.1: Rastgele eriimli ktk #include <stdio.h> #include <math.h> #include <errno.h> typedef struct { char no[11]; int notu; } ogryapi; FILE *kp; ogryapi ogr; void giris(void); void liste(void); main() { int i; char c; kp = fopen("ogr.dat", "r+"); if (kp == NULL) { printf("%d\n", errno); /* 2 ise file not found */ kp = fopen("ogr.dat", "w+"); } do { clrscr(); fseek(kp, 0, 2); printf("Dosya uzunluu %ld\n", ftell(kp)); printf("Kayt says %d\n\n", ftell(kp) / sizeof(ogryapi)); printf("1-Giri\n2-Liste\n3-k\n"); c = getch();

103 switch (c) { case '1': giris(); break; case '2': liste(); break; case '3': exit(0); }; } while (1); void giris(void) { int i; clrscr(); printf("renci no : "); scanf("%s", ogr.no); printf(" Notu : "); scanf("%d", &ogr.notu); i = atoi(ogr.no); fseek(kp, (i-1)*sizeof(ogryapi), 0); fwrite(&ogr, sizeof(ogryapi), 1, kp); fflush(kp); /*int fflush(FILE *) tampon bllektekiler diske yazlr int flushall(void) */ } void liste(void) { clrscr(); fseek(kp, 0, 0); fread(&ogr, sizeof(ogryapi), 1, kp); while (!feof(kp)) { printf("%s %d\n", ogr.no,ogr.notu); fread(&ogr, sizeof(ogryapi), 1, kp); } getch(); } rnek 12.2.2 : Dizinin kte yazlmas, okunmas #include <stdlib.h> #include <stdio.h> #define MAX 10 FILE *kp; int a[MAX]; void giris(void); void liste(void); main() {

104 nceki rnek gibi } void giris(void) { int i; clrscr(); for (i=0; i<MAX; i++) a[i] = rand() % 100; fseek(kp, 0, 0); fwrite(a, sizeof(int), MAX, kp); } void liste(void) { int i; clrscr(); fseek(kp, 0, 0); fread(a, sizeof(int), MAX, kp); for (i=0; i<MAX; i++) printf("%d ", a[i]); printf("\n"); getch(); }

EK A. rnekler
rnek A.1: Paralel portun kullanm
/* PC deki paralel porta eriim

105 oku : paralel portu okur. Eski tip portlar ift ynl olmad iin durum ular giri amal kullanld ( 4-bit , bi-directiona, EPP, ECP ) : paralel port data ularna bilgi gnderir

yaz

oku_yaz : durum ularndan okuduunu veri ularna gnderir */ #include <stdio.h> #include <dos.h> #include <conio.h> typedef unsigned word; void binary_yaz(word); void oku(void); void yaz(void); void oku_yaz(void); word pdata=0x378; word pstat=0x379; word bout, bin; char c; main() { do { clrscr(); printf("1 - Oku\n"); printf("2 - Yaz\n"); printf("3 - Okuduunu Yaz\n"); printf("4 - k\n"); c = getch(); switch(c) { case '1' : oku(); break; case '2' : yaz(); break; case '3' : oku_yaz(); break; case '4' : exit(0); } } while (1); } void yaz(void) { clrscr(); printf("Gnderilecek veri :"); scanf("%d", &bout); binary_yaz(bout); printf("\n"); outport(pdata, bout); c = getch(); }

106

void oku(void) { clrscr(); do { bin = inportb(pstat); binary_yaz(bin); printf(" %d\n", bin); c = getch(); } while (c != 'q'); } void oku_yaz(void) { clrscr(); do { bin = inportb(pstat); gotoxy(1,8) ; printf("Okunan = "); binary_yaz(bin); outport(pdata, bin); gotoxy(1,9) ; printf("Yazlan = "); binary_yaz(bin); printf(" %d\n", bin); c = getch(); } while (c != 'q'); } void binary_yaz(word x) { word i; word m; m = 0x8000; for (i = 0; i<16; i++) { if (x & m) printf("1"); else printf("0"); m = m >> 1; } printf(" "); }

rnek A.2. Kesme (interrupt) kullanm


Intel 8086 Registers General Purpose Registers AH/AL AX (EAX) Accumulator Segment Registers CS Code Segment

107 BH/BL BX (EBX) Base CH/CL CX (ECX) Counter DH/DL DX (EDX) Data (Exx) 386+ 32 bit register DS SS ES (FS) (GS) Data Segment Stack Segment Extra Segment 386 and newer 386 and newer

Pointer Registers SI (ESI) Source Index DI (EDI) Destination Index IP Instruction Pointer

Stack Registers SP (ESP) Stack Pointer BP (EBP) Base Pointer

FLAGS - Intel 8086 Family Flags Register 0 CF Carry Flag 1 1 2 PF Parity Flag 3 0 4 AF Auxiliary Flag 5 0 6 ZF Zero Flag 7 SF Sign Flag 8 TF Trap Flag (Single Step)

9 A B C,D E F 10 11

IF Interrupt Flag DF Direction Flag OF Overflow flag IOPL I/O Privilege Level (286+ only) NT Nested Task Flag (286+ only) 0 RF Resume Flag (386+ only) VM Virtual Mode Flag (386+ only)

#include <dos.h> #include <stdio.h> main() { union REGS a; clrscr(); a.h.ah = 0x2A; /* Dos servislerinden 2Ah = get system date */ int86(0x21,&a,&a); /* int 21h dos servisleri */ printf("makinanin tarihi = %d/%d/%d\n", a.h.dl, a.h.dh, a.x.cx); a.h.ah = 0x36; /* Diskteki bos alan */ a.h.dh = 0; /* bulunulan, A=1 */ int86(0x21,&a,&a); printf("makinanadaki yer = %ld\n", (long)a.x.ax*a.x.bx*a.x.cx); getch(); }

RNEKLER

108

rnek : 1996-97 2.dnem vize /*Soru 1 */ #include <stdio.h> #include <string.h> char *kelime(char *); main() { char *cumle = "ali zil caldi mi"; char *s, *kelimeler[20]; int i, kk = 0; clrscr(); /* yol 1: s = kelime(cumle); while (strlen(s)) { strcpy(kelimeler[kk++], s); s = kelime(cumle); } */ /* yol 2: strtok islevini kullanarak s = strtok(cumle, " "); while (s !=NULL) { strcpy(kelimeler[kk++], s); s = strtok(NULL, " "); } */ for (i=kk-1; i>=0; i--) printf("%s ", kelimeler[i]); getch(); } char *kelime(char *s) { char a[20], *b, d[20]; int i; while (s[0] == ' ') s++; strcpy(d, s); b = strchr(s, ' '); if (b == NULL) strcpy(a, s); else { i = abs(b-s); strncpy(a, d, i); a[i] = '\0'; }

109 strcpy(s, b); return a; } /* Soru 3 struct veriler { double ka, ya, yg; }; struct veriler a[60000]; for (i=0; i<60000; i++) if (a[i].ka == a[i].ya) printf("%f %f\n",i*20, a[i].ka); Soru 3*/

EK B. DNAMK VER YAPILARI


Self-referential structure : ye, tanml olduu yapya bir iareti struct yapi { char adi[21]; struct yapi *ptr; };

B.1 Sral Bal Liste


.....

110

rnek B.1: Sral bal listenin gerekletirilmesi.


#include <stdlib.h> #include <string.h> struct listyapi { char adi[21]; struct listyapi *sonraki; }; typedef struct listyapi listnode; typedef listnode *listptr; listptr headnode; /* Herzaman listenin ban gsterir */ void seeklist(char *searchthis, listptr *prevnode) { listptr c; c = headnode; *prevnode = c; while ((c->sonraki != NULL)) { c = c->sonraki; if (strcmp(c->adi, searchthis) >= 0) break; *prevnode = c; } } void kayit(char *s) /* prevnode kayd newnode kaydn, newnode kayd prevnode'nin daha nce gsterdii kaydn gsterir. */ { listptr newnode, prevnode; newnode = malloc(sizeof(listnode)); /* yeni kayda yer a */ strcpy(newnode->adi, s); /*bilgiyi yeni kayda yaz */

seeklist(newnode->adi, &prevnode); /* listedeki yerini bul */ newnode->sonraki = prevnode->sonraki; /* listeye ekle */ prevnode->sonraki = newnode; } void iptal(char *s) /* newnode kayd silinir. prevnode kayd newnode kaydnn gsterdii kaydn gsterir. */ { listptr newnode, prevnode; seeklist(s, &prevnode); newnode = prevnode->sonraki; prevnode->sonraki = newnode->sonraki; free(newnode); } void listlist(void) {

111 listptr currentnode; currentnode = headnode; if (currentnode != NULL) currentnode = currentnode->sonraki; while (currentnode != NULL) { printf("%s ",currentnode->adi); currentnode = currentnode->sonraki; } printf("\n"); } /* Procedure listlist; */ main() { char sec; char *s; headnode = malloc(sizeof(*headnode)); strcpy(headnode->adi," listenin ba"); headnode->sonraki = NULL; do { clrscr(); printf("Bo yer : %ld\n\n",coreleft()); listlist(); printf("\n\n1 - Giri\n2 - iptal\n3 - Son\n\nSe \n"); sec = getch(); switch (sec) { case '1': printf("Ad "); gets(s); kayit(s); break; case '2': printf("Ad \n"); gets(s); iptal(s); break; case '3': exit(0);break; } } while (1); } Problem : Polinomlar sral bal listede sakl. ki polinomun toplamn cn polinomda oluturan program

B.2 Listelerin zel Biimleri (Uygulamalar)


B.2.1 Stack (yn) : Son giren ilk kar (LIFO) (Fonksiyon arldnda geri dn adresi, Fonksiyona gnderilecek

112 parametreler ) rnek B.2.1: Stack kullanarak girilen cmleyi kelimeleri bozmadan tersten yazdr #include <stdio.h> #include <stdlib.h> struct stackyapi { char deger[50]; struct stackyapi *sonraki; }; typedef struct stackyapi stacknode; typedef stacknode *stackptr; stackptr top; void push(char *gelen) { stackptr newnode; newnode = malloc(sizeof(stacknode)); strcpy(newnode->deger, gelen); newnode->sonraki = top; top = newnode; } int pop(char *giden) { stackptr oldnode; if (top != NULL) { oldnode = top; strcpy(giden, top->deger); top = top->sonraki; free(oldnode); return 0; } else return 1; /* yn bo */ } main() { char *kelime, *cumle; stackptr current; top = NULL; clrscr(); printf("Cumleyi girin : "); gets(cumle); kelime = strtok(cumle, " "); while (kelime) { push (kelime); kelime = strtok(NULL, " "); } kelime = (char *) malloc(20); /* kelime NULL idi, yer aalm*/ while (!pop(kelime)) printf("%s ", kelime); printf("\n"); getch();

113 } Problem : infix : operand operator operand 2+7 postfix : operand operand operator 2 7+ Soldan saa ilem yaplr. ncelik (parantez) yok. postfix biimindeki ifadeyi hesaplama ? infix postfix dnm ?

B.2.1: Kuyruk (queue) ilk giren ilk kar (FIFO) Bilgisayarda oklu ilem Yazcy ortak kullanm B.2.3: Aa (tree) Dorusal olmayan yap kili aa (kk, ocuk, yaprak, derece)

MEMORY MODELLER Tiny : Code + data + stack ayn 64 K lk segment te Small : Code iin 64 K, data + stack ayr 64 K lk segment Medium : Code iin far pointer ( yani 1 MB code) , data 64 K ( data kullanmayan uzun programlar) Compact: Medium un tersi. ( ok data kullanan ksa programlar) Large : Code iin 1 MB, data iin 1 MB Huge : Large ile ayn fakat static data 64 K dan fazla olabilir.

You might also like