Professional Documents
Culture Documents
Giri
Bu ilk derste, bir C programn nasl derlenip altrlaca ve Internet'te bulabileceiz derleyicilerden bahsedilecektir. En basit C programnn derleyip altrdktan sonra, geriye kalan sadece C Programlama Dili'nin kurallarn, yapsn ve deyimlerini renmekten ibarettir.
1.1 Tarihe
C Programlama Dili genel amal orta seviyeli ve yapsal bir programlama dilidir. 1972 ylnda Dennis Ritchie tarafndan Bell Telefon Labaraturvarnda Unix iletim sistemi ile kullanlmak iin tasarlanmtr. C, zellikle sistem programlamada sembolik makine dili (Asembler) ile tercih edilmektedir. letim sistemleri, derleyiciler ve debug gibi aa seviyeli sistem programlarnn yazlmnda youn olarak C programlama dili kullanlr. C'nin yaylmas ve gelimesi, byk bir blm C dili ile yazlan UNIX iletim sisteminin popler olmasyla balamtr. C Programlama Dili, hemen her alanda kullanlmaktadr. Gnmzde nesneye ynelik programlama dilleri (C++, Java) ve script dilleri (JavaScript, JavaApplet, PHP) gibi programlama dilleri C Programlama Dili'nden esinlenmitir. C tanabilir (portable) bir dildir. Yani herhangi bir C program hibir deiiklie uramadan, veya ok az bir deiimle, baka bir derleyicide ve/veya iletim sisteminde derlenebilir. rnein, Windows iletim sistemlerinde yazlan bir C kodu, Linux, UNIX veya VAX gibi iletim sistemlerinde de derlenebilir. Tanabilirlik, herkesin kabul ettii bir standart ile gerekletirilebilir. Bugn, C Programla Dili iin American National Standards Institute (ANSI) kurumunun Mart 2000'de belirledii C99: ISO/IEC 9899:1999 standart Standart C olarak kabul edilmitir.
1.2 Neden C?
C Programlama Dili'ni popler klan nemli nedenler aada listelenmitir:
C, gl ve esnek bir dildir. C ile iletim sistemi veya derleyici yazabilir, kelime ilemciler oluturabilir veya grafik izebilirsiniz. C, iyi bir yazlm gelitirme ortamna sahiptir. C, zel komut ve veri tipi tanmlamasna izin verir. C, tanabilir bir dildir. C, geliimini tamamlam ve standard olumu bir dildir. C, yapsal bir dildir. C kodlar fonksiyon olarak adlandralan alt programlardan olumutur. C++, Java, JavaScript, JavaApplet, PHP, C#, ... gibi diller C dilinden esinlenmitir.
1.3 lk C Program
Program 1.1 de verilen C program derlendikten sonra, ekrana 'Merhaba Dnya!' yazsn basan yaln bir C programdr. Satr balarna yerletirilen 1:, 2: 3: ... rakamlarnn yazlmasna gerek yoktur. Bu rakamlar sadece daha sonra program ile ilgili aklama yaplrken, ilgili satrda bulunan kodlar izah edilirken kullanlacaktr. Bu programn bilgisayarda ilk.c ad ile kaydedilmitir. Program 1.1: Derlendikten sonra ekrana 'Merhaba Dnya!' yazar
01: /* ilk.c: ilk C programi */ 02: #include <stdio.h> 03: 04: main() 05: { 06: printf("Merhaba Dnya!\n"); 07: } /* ... */
Programda, 1. satrda /* ... */ sembolleri grlmektedir. Bu ifadeler arasnda yazlan herhangi bir metin, ilem vb. satrlar, derleyici tarafndan ilenmez (deerlendirilmez). Yani /* */ifadeleri aklama operatrdr.
NOT Aklama operatr olarak C++ tarz iki-bl (//) de kullanlmaktadr. Gnmzde birok C derleyicisi // operatrn desteklemektedir. Bu operatr kullanmadan nce derleyicinizin bu operatr desteklediinden emin olun.
/* Bu satrlar derleyici tarafndan deerlendirilmez. Ayrca programn alma hzn da deitirmez. */ // Bu satrlar derleyici tarafndan // deerlendirilmez. Ayrca programn // alma hzn da deitirmez. C++ tarz C tarz
#include <stdio.h>
2. satrdaki #include deyimi, programda eklenecek olan balk dosyann iaret eder. Bu rnekte verilen balk dosyas (header file) stdio.h dir. #include <stdio.h> ifadesi stdio.h dosyasnn derleme ilemine dahil edileceini anlatr.
main()
4. satrdaki main() zel bir fonksiyondur. Ana program bu dosyada saklanyor anlamndadr. Programn yrtlmesine bu fonksiyondan balanr. Dolaysyla her C programnda bir tane main() adl fonksiyon olmaldr.
printf()
6. satrdaki printf() standart ktphane bulunan ekrana formatl bilgi yazdrma fonksiyondur. stdio.h dosyas bu fonksiyonu kullanmak iin program bana ilave edilmitir. Aadaprintf() fonksiyonunun basit kullanm gsterilmitir.
Bir ok C derleyicisinde yukardakilere ek olarak tanmlanm balk dosyalar da vardr. Bunlar derleyicinin yardm ksmndan veya derleyicinin kullanm klavuzundan renilebilir. programnda kullanlan balk dosyas stdio.h, #include <stdio.h> ifadesi ile derleme ilemine dahil edilmitir. stdio.h standard giri/k (STandarD-Input-Output) ktphane fonksiyonlar iin baz bildirimleri barndran bir dosyasdr. Programda kullanlan printf() fonksiyonunu kullanmadan nce bu balk dosyas programn bana mutlaka ilave edilmelidir. Aksi halde derleme esnasnda
ilk.c undefined reference to _printf
altrma
ilk.exe ilk.exe ilk.exe ilk.exe ilk.exe ./ilk ilk
MS-DOS / Windows
UNIX / Linux
veya nice
Bunlarn dnda, komut satrn kullanmadan, kodlarnz Windows ortamnda alan GCC tabanl DevC++ veya Salford Plato3 derleyicileri ile derlemek mmkn. Bu tip derleyicilerde hata ayklama ilemini kolaylatrmak iin kodlar farl renkte gsterilir. Fakat program ktlar iin kullanlan ekran klasik DOS ekrandr. ekil 1.1 ve 1.2"de bu programlarn ekran grntleri verilmitir.
ekil 1.1: DevC++ derleyicine ait editr. Derleme ve altrma ilemleri ara ubuu zerindeki butonlarla yaplr.
ekil 1.2: Silverfrost Salford (Plato3) derleyicine ait editr. Derleme, balama ve altrma ilemleri ara ubuu zerindeki butonlarla yaplr. Derslerimizde kullanlan kaynak kodlar, Turbo C ve GCC derleyicileri ile komutsatrnda derlenmitir. Turbo C derleyicisi istee bal editrden veya komut satrndan derlenebilir. Editr balatmak iin C:\TC> dizini altndaki TC.EXE dosyasnn altrlmas yeterlidir. ekil 1.3'de Turbo C editr ortam gsterilmitir.
ekil 1.3: Turbo C derleyicisine ait editr. Derleme iin F9, Derleme balama ve altrma ilemleri iin CTRL+F9 tu kombinasyonu kullanlabilir..
NOT DevC++, Salford, GCC ve Turbo C derleyicilerini C/C++ Derleyicileri ksmnda bulabilirsiniz.
ilk.c
DERLEME ve ALITIRMA
MS DOS (Turbo C)
C:\TC> tcc ilk.c C:\TC> ilk.exe ilk.c
nin kts:
IKTI
Merhaba Dnya!
Yazlmda kullanlacak olan her fonksiyon iin ilgili balk dosyas programn bana ileve edilmedlidir. Her C program main() fonksiyonunu iermelidir. Program iinde kullanlacak olan deikenler ve sabitler mutlaka tanmlanmaldr. Satrn sonuna ; iareti konmaldr. Her bloun ve fonksiyonun balangc ve bitii srasyla { ve } sembolleridir. C dilinde yazlan kodlarda kk-byk harf ayrm vardr (case sensitive). rnein A ile a derleyici tarafndan farkl deerlendirilir. Aklama operatr /* */ sembolleridir.
Program aklamalar ve dkman hazrlama program yazldka yapn! Bu unutulmamas gereken ok nemli husustur. Deiken, sabit ve fonksiyon adlar anlaml kelimelerden seilip yeterince uzun olmaldr. Eer bu isimler bir ka kelimeden oluacak ise, kelimeler alt izgi ( _ ) ile ayrlmaldr veya her kelime byk harfle balamaldr. rnein:
int son_alinan_bit; void KesmeSayisi(); float OrtalamaDeger = 12.7786;
Her alt yapya girerken birka boluk veya TAB tuunu kullann. Bu okunabilirlii arttracaktr. rnein:
k = 0; for(i=0; i<10; i++) { for(j=0; j<i; j+=2) { do{ if( j>1 )
k = i+j;
Aritmetik operatrler ve atama operatrlerinden nce ve sonra boluk karakteri kullann. Bu, yazlan matematiksel ifadelerin daha iyi anlalmasn salayacaktr.rnein:
h_max = pow(Vo,2) / (2*g);
Tf Vy y z
= = = =
Program bittikten sonra tekrar tekrar programnz inceleyerek, programnz daha iyi ekilde yazma yollarn arayn ve ayn fonksiyonlar daha ksa algoritmalarla ve/veya daha modler ekilde elde etmeye aln.
Fakat baz zel niteleyiciler vardr ki bunlar yukardaki temel tiplerin nne gelerek onlarn trevlerini oluturur. Bunlar:
short long unsigned
Bu niteleyiciler sayesinde deikenin bellekte kaplayaca alan istee gre deitirilebilir. Ksa (short), uzun (long), ve normal (int) tamsay arasnda yalnzca uzunluk fark vardr. Eer normal tamsay 32 bit (4 bayt) ise uzun tamsay 64 bit (8 bayt) uzunluunda ve ksa tamsay 16 biti (2 bayt) gemeyecek uzunluktadr. aretsiz (unsigned) n eki kullanld taktirde, veri tipi ile saklanacak deerin sfr ve sfrdan byk olmas salanr. aretli ve iaretsiz verilerin bellekteki uzunluklar ayndr. Fakat, iaretsiz tipindeki verilerin st limiti, iaretlinin iki katdr.
NOT Ksa ve uzun tamsay tutacak tanmlayclar iin int anahtar kelimesinin yazlmasna gerek yoktur.
short s; long k; /* short int s; anlamnda */ /* long int k; anlamnda */
Bir C program ierisinde, veri tiplerinin bellekte kaplad alan sizeof operatr ile renilebilir. lgi cekici olan, bu alanlarn derleyiciye ve iletim sistemine bal olarak deiiklik gstermesidir. Program 2.1'de, sizeof operatr kullanlarak, veri tiplerinin bellek uzunlularnn nasl ekrana yazdrlaca gsterilmitir. Programn kts, farkl derleyiciler ve iletim sisteminde denendiinde bu durum daha iyi anlalr. Ltfen inceleyin. Program 2.1: Deiken tipleri ve trevlerinin bellekte kapladklar alanlar
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: /* 02prg01.c : sizeof operatrnn kullanm */ #include <stdio.h> main() { printf( printf( printf( printf( printf( char)); printf( short)); printf( int)); printf( long)); printf( printf( printf( double)); }
: : : : :
%d %d %d %d %d
"unsigned short : %d bayt\n", sizeof(unsigned "unsigned int "unsigned long "float "double "long double : %d bayt\n", sizeof(unsigned : %d bayt\n", sizeof(unsigned : %d bayt\n", sizeof(float)); : %d bayt\n", sizeof(double)); : %d bayt\n", sizeof(long
IKTI
Windows (32 bit) Turbo C
char short int long unsigned char unsigned short unsigned int unsigned long float double long double bayt int : : : : : : : : : : : 1 bayt 2 bayt 2 bayt 4 bayt 1 bayt 2 bayt 2 bayt 4 bayt 4 bayt 8 bayt 10
veritipi ve trevleri ile hesaplanabilecek en kk ve en byk tamsaylar iin aadaki forml kullanlabilir:
Alt snr = -28*sizeof(tip) st snr = 28*sizeof(tip)-1 rnein 4 baytlk bir int tipi iin: Alt snr = -28*sizeof(int) = -232 = -2147483648 st snr = 28*sizeof(int)-1 = 232-1 = 2147483647 Tablo 2.1'de btn tipler, bellekte kapladklar alanlar ve hesaplanabilcek (bellekte doru olarak saklanabilecek) en byk ve en kk saylar listelenmitir.
Veri Tipi
char unsigned char short int unsigned short int int unsigned int long int unsigned long int float
Aklama Tek bir karakter veya kk tamsay iin Ksa tamsay iin Tamsay iin Uzun tamsay iin Tek duyarl gerel say iin (7 basamak) ift duyarl gerel say iin (15 basamak)
st snr
-2,147,483,648 2,147,483,647 0 4,294,967,295 9,223,372,036,854,775,807 9,223,372,036,854,775,808 0 18,446,744,073,709,551,615 +3.4e +/- 38 +1.7e +/- 308
4 8
double
2.2 Deikenler
Deikenler bilgisayarn geici belleinde bilginin sakland gzlere verilen sembolik adlardr. Bir C programnda, bir deiken tanmlandnda bu deiken iin bellekte bir yer ayrlr. Her deikenin tuttuu deerin nasl bir veri olduunu gsteren (nceki blmde anlatlan) bir veri tipi vardr. C programlama dilinde, deikenler ve sabitler programn banda bulunmaldr. Baz uygulamalarda deikenin bir balang deerinin olmas istenir. Byle durumlarda deiken bildirilirken balang deeri verilebilir. rnein:
char isim='X', z; /* deer atamak zorunlu deil */ int sayi=0, n; float toplam=0.0, sonuc=22.14;
Deiken adlar en fazla 32 karakterden oluabilir. 32 karakterden uzun deiken adlar ilk 32 karakteri deerlendirilir. Geriye kalan karakterler ileme tabi tutulmaz. Deiken adlar ingiliz alfabesinde bulunan karakterler (A-Z) veya (a-z) yada rakamlar (0-9) ile yazlmaldr. Trke karakterler, zel karakter veya boluk karakteri kullanlamaz. Deiken adlar herhangi bir rakam ile balayamaz. Ilk karakter bir harf olamaldr. Sonrakiler rakamlardan oluabilir. Aada verilen kelimeler ANSI C 'nin anahtar kelimeleridir (key words) ve deiken ismi olarak kullanlamaz.
auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while
2.3 Sabitler
Sabit bildirimi, balang deeri verilen deiken bildirimi gibi yaplr. Ancak, veri tipinin nne const anahtar szc konmaldr. rnein:
const const const const float PI = 3.142857; double NOT= 12345.8596235489; int EOF= -1; char[] = "devam etmek iin bir tua basn...";
gibi sabit bildirimleri geerli olup bunlarn ierikleri program boyunca deitirilemez. Yalnzca kullanlabilir. Genellikle, sabit olarak bildirilen deiken isimleri byk harflerle, dier deiken isimlerinin ise kk harflerle yazlmas (gsterilmesi) C programclar tarafndan geleneksel hale gelmitir. Birok C programnda sabitler #define nilemci komutu ile de tanmlandn grebilirsiniz. Bu komutla sabit bildirimi, bir program parasna ve makro fonksiyon tanmlamas yaplabilir. Bir program gelitirilirken simgesel sabitlerin kullanlmas programn okunurluunu arttrr ve bazen gerekli de olabilir. Aada verilen simgesel sabit bildirimleri geerlidir. #define nilemcisi ile makro fonksiyon tanmalama ilemi, Blm 8 ve Blm 20'de anlatlacaktr.
#define MAX 100 #define DATA 0x0378 #define YARICAP 14.22
C dilinde btn tamsay sabitler varsaylan (default) olarak int tipinde, gerel say sabitler varsaylan olarak double tipindedir. Ancak sabitleri gsteren rakamlarn sonuna eklenecek U (veya u), L (veya l) ve F (veya f) harfleri ile bu durum deitirilebilir. Bu yzden, aadaki atamalar ayn anlamda deildir.
i i i i i = = = = = 25; 25U; 25L; 25UL; 25L; /* /* /* /* /* int unsigned int long int unsigned long long int rakam rakam rakam rakam rakam */ */ */ */ */
Tamsay (int) rakamsal bilgiler, 8 (oktal) ve 16 (hexadesimal) say tabannda da gsterilebilir. Bunun iin sabit rakamn bana, 8 taban iin 0 (sfr) ve 16 tabann iin 0x sembolleri eklenir. 16'lk sistemdeki hafler byk (A, B, C, D, E ve F) veya kk (a, b, c ,d, e ve f) olabilir. Buna gsterime gre, aadaki atmalar ayn anlamadadr:
i i i i = = = = 75; 0113; 0x4b; 0x4B; /* /* /* /* i i i i = = = = 75, 10 tabannda */ 75, 8 tabannda */ 75, 16 tabannda */ 75, 16 tabannda */
Gerel saylar ondalkl veya stel olmak zere iki biimde gsterilebilir. rnein 123.456 saysnn ayn anlama gelen drt farkl gsterimi aada verilmitir. stel gsterimde, 1.23456e+2 veya 1.23456E+2 says matematikteki 1.23456 x 102 gsterimi ile edeerdir.
x x x x = = = = 123.456; 123.456e+0; 1.23456e+2; 1234.56E-1; /* /* /* /* ondalkl gsterimi */ stel gsterim */ stel gsterim */ stel gsterim */
Karakter sabitler, bir harf iin tek trnak, birden ok karakter iin ift trnak iinde belirtilirler.
'A' "Merhaba Dunya" /* bir karakter */ /* bir karakter kmesi */
Program 2.1'de, program iinde tanmlanan deiken sabitlerin ekrana nasl yazdrlaca gsterilmitir. Program 2.2: Deikenlerin ve sabitlerin ekrana yazdrlmas
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: /* 02prg02.c : Deikenler ve sabitlerin ekrana yazdrlmas */ #include <stdio.h> #define PI 3.141593 int main() { const int MAX = 100; char c = 'a'; char *s = "Bu bir sicim"; int i = 22; float f = 33.3; double d = 44.4; printf("PI = printf("MAX= printf("c = printf("s = printf("i = printf("f = printf("d = return 0; } %lf\n",PI); %d\n", MAX); %c\n", c); %s\n", s); %d\n", i); %f\n", f); %lf\n",d);
IKTI
PI = MAX= c = s = i = f = d = 3.141593 100 a Bu bir sicim 22 33.299999 44.400000
Genel (general) Bildirim Genel deikenler btn fonksiyonlarn dnda bildirilir. Bir deiken program boyunca srekli olarak kullanlyorsa genel olarak bildirilmelidir.
#include <stdio.h> void karesi(); /* m ve n global tip deikendir. Bu iki deiken tm program boyunca kullanlmaktadr. */
int m,n; main() { m=7; karesi(); printf("%d nin karesi %d dir",m,n); } void karesi(){ n = m*m; }
bildirimlerine gre:
Bant ------kr+5 kr+5.0 d+tam f+d-2 utam-tam ltam*tam tam/2 tam/2.0 Sonu Tipi ---------int double double double unsigned long int double
NOT Tamsaylar aras blme kesme hatalarna (truncation error) neden olur. Bunun anlam iki tamsaynn oran yine bir tamsaydr. rnein: 4/2=2; ama 3/2=1 (1.5 deil).
Bir deikenin sabit deerin veya bantnn nne tr veya tak (cast) yazlarak sonucun hangi tip kmas istendii sylenebilir. Genel yazm biimi:
(tr tipi) bant;
rnein:
int x=9; float a,b,c; double d; ... a = x/4; b = x/4.0; c = (float) x/4;
ileminin sonucunda a deikenine 2.0, b ve c deikenlerine 2.25 deeri aktarlr. Yani 9/4 ile 9/4.0 farkl anlamdadr.
Ders 3: Operatrler
Giri
Operatrler, deikenler veya sabitler zerinde matematiksel ve karlatrma ilemlerini yapan simgelerdir. Yani bir operatr bir veya daha fazla nesne (deiken) zerinde ilem yapan sembollerdir. Bu ksmdam aritmetik operatrler, atama operatrleri ve sizeof operatr anlatcaktr. Karlatrma Operatrleri, Mantksal Operatrler ve Bit Dzeyinde ilem yapan operatrler daha sonraki blmlerde incelenektir.
rnek
x + y x - y x * y x / y x % y
Anlam x ve y nin toplam x ve y nin fark x ve y nin arpm x ve y nin oran x / y den kalan say
olarak yazlabilir. Bu operatrler Tablo 3.2'de listelenmitir. Tablo 3.2: Atama Operatrleri
Operatr
= += -= *= /= %= ++ --
Aklama atama ekleyerek atama eksilterek atama arparak atama blerek atama blp, kalann atama bir arttrma bir azaltma
rnek
x = 7; x += 3 x -= 5 x *= 4 x /= 2 x %= 9 x++
Anlam
x = 7; x = x + 3 x = x - 5 x = x * 4 x = x / 2 x = x % 9 x = x + 1 x = x - 1
Bir arttrma veya eksiltme operatrlerini kullanrken dikkatli olunmaldr. nk aadaki trden atamalar bazen karkla neden olur.
a = 5; b = a++; c = ++a; // a = 5 // a = 6 ve b = 5 // a = 7 ve c = 7
IKTI
x = 1 ve y = 3, olarak veriliyor. x <- x + y atamasinin sonucunda x=4 dir x += y atamasinin sonucunda x=4 dir
c; /* tek bir karakter */ str[] = "masa"; /* bir karakter topluluu */ = %d\n",sizeof(int)); = %d\n",sizeof(i)); = %d\n\n",sizeof(dizi));
printf("sizeof(double)= %d\n",sizeof(double)); printf("sizeof(d) = %d\n",sizeof(d)); printf("sizeof(mizan) = %d\n\n",sizeof(mizan)); printf("sizeof(char) printf("sizeof(c) printf("sizeof(str) return 0; } = %d\n",sizeof(char)); = %d\n",sizeof(c)); = %d\n",sizeof(str));
IKTI
sizeof(int) sizeof(i) sizeof(dizi) = 4 = 4 = 20
Programda sizeof(int) deeri ile sizeof(i) deerinin ayn olduu grlr. dizinin boyutu 5 olduu iin, sizeof(dizi) = sizeof(int)*5 = 20 eklinde hesaplanmaktadr. Dierleri iin benzer durum sz konusu. Ancak, str 4 elemanl bir dizi olduu halde sizeof(str) = 5 dir. Neden? Bunu ilerideki blmlerde reneceiz.
olutu!..
printf("Hata Olutu!..");
eklindedir. ou zaman ekrana, programda kullanlan bir deikenin deeri yazdrlmak istenebilir. rnein ekrana bir tamsay deikeninin ieriini basrmak iin, printf()
.... int x = 12; printf("x in deeri %d dir", x); ....
Bu rnekte printf fonksiyonuna iki parametre aktarlmtr. Birincisi ekranda gsterilecek ve ift trnaklar arasna yazlan ifadeler, ikincisi ise ekranda saysal deeri gsterilmek istenen deiken (x).
*format
ksmdan olumaktadr:
I. II.
Dz metin (literal string): yazdrlmak istenen ileti. rnein: printf("Ben gelmedim kavga iin..."); gibi. Konrol karakterleri (escape squence): deikenlerin ve sabitlerin nasl yazlacan belirtmek veya imlecin alt satra geirilmesi gibi baz ilemlerin gerekletirilmesi iin kullanlr. Bu karakterler Tablo 4.1'de listelenmitir. rnein: printf("\tDostun evi gnldr...\n"); gibi. Tablo 4.1: Kontrol karakterleri
Karakter
\a \b \f \n \r \t \v \" \' \\ %%
Anlam Ses retir (alert) imleci bir sola kaydr (backspace) Sayfa atla. Bir sonraki sayfann bana ge (formfeed) Bir alt satra ge (newline) Satr ba yap (carriage return) Yatay TAB (horizontal TAB) Dikey TAB (vertical TAB) ift trnak karakterini ekrana yaz Tek trnak karakterini ekrana yaz \ karakterini ekrana yaz % karakterini ekrana yaz
III.
Tip belirleyici (conversion specifier): % iareti ile balar ve bir veya iki karakterden oluur (%d gibi). Ekrana yazdrlmak istenen deikenin tipi, % iaretinden sonra belirtilir (Bkz. Tablo 4.2) rnein: printf("x in deeri %d dir"); gibi. Tablo 4.2: Tip karakterleri
Tip Karakteri
%c %s %d %ld %u %lu %f %lf
Anlam tek bir karakter karakter dizisi (string) iaretli ondalk tamsay uzun iaretli ondalk tamsay iaretsiz ondalk tamsay iaretsiz uzun tamsay Gerel say ift duayarl gerel say
gibi.
fonksiyonu esnektir. Parametreler herhangi bir C deyimi olabilir. rnein x ve y nin toplam yle yazlabilir:
printf() printf("%d", x+y); printf
IKTI
3 tamsayi : 2 10 50 3 tamsayi [TAB] : 2 10
50
3 reel sayi (yanyana) : 1.050000 25.500000 -0.100000 3 reel sayi (altalta) : 1.050000 25.500000 -0.100000 220 nin %25 i 55.000000 dir 25.500000/1.050000 isleminin sonucu = 24.285715 program sonunda beep sesi cikar...
fonksiyonunun geri dn deeri int tipindedir. Bu geri dn deeri ktnn ka karakter olduunu gsterir. Yani, printf fonksiyonu, *format ile tanmlanm karakter topluluunun ka bayt olduu hesaplar. Program 4.2, printf'in bu ynnde ortaya karan bir programdr.
printf
IKTI
Ugurlu sayim = 1234 Ust satirda karakter sayisi: 20 dir
11. satrdaki ilemle, hem ekrana Ugurlu sayim = 1234 iletisi bastrlmakta, hem de karSay deikenine bu iletinin uzunluu atanmaktadr. Ekrana baslan karakterlerin says (\n karakteri dahil) 20 dir.
satrn yazmak yeterli olacaktr. Burada & iareti adres operatr olarak adlandrlr. Klavyeden iki farkl say okunmak istendinde scanf() fonksiyonu yle kullanlabilir:
scanf("%d %f",&x,&y);
veriler klavyeden
16 1.56
yada
16 1.56
veya
16 1.56
t; g;
printf("Bir gercel sayi girin: "); scanf("%f",&g); printf("Bir tamsayi girin : "); scanf("%d",&t); printf("\n"); printf("\t %f * %f = %f\n",g,g,g*g); printf("\t %d * %d = %d\n",t,t,t*t); return 0; }
IKTI
Bir gercel sayi girin: 1.34 Bir tamsayi girin : 12 1.340000 * 1.340000 = 1.795600 12 * 12 = 144
ile
puts("Sevgi varln mayasdr.");
kullanmlar edeerdir.
puts()
ile
gets(str);
- gets()
Yukardaki program paras 0-9 aras saylar srasyla ekranda gstermek iin kullanlr. Fakat her rakam yazdrlmadan nce klavyeden herhangi bir karakter girip [Enter] tuuna baslmas beklenir. Bu bekleme getchar() fonksiyonu ile gerekletirilir.
4.6 Formatl kt
Bundan nceki programlardaki deikenler serbest biimde (free format), yani derleyicinin belirledii biimde ekrana yazdrlmt. Bazen giri ve kn biimi kullanc tarafndan belirlenmesi gerekebilir. Bu ilem: Tamsaylarda %d yerine %wd Gerel saylarda %f yerine %w.kf Stringlerde %s yerine %ws biimindeki kullanm ile salanr. Burada w yazlacak olan saynn alan genilii olarak adlandrlr. Gerel bir deiken ekrana yazlacaksa, deikenin virglden sonra ka basamann yazdrlaca ksays ile belirlenir. Ancak w > k + 2 olmaldr.
int i=583,j=1453; printf("%d %d\n",i,j); printf("%5d %8d\n",i,j); /* serbest biim */ /* formatl */
IKTI
583 1453 583 1453
Birinci satr serbest formatta ikinci satr ise formatl yazlmtr. i deikeninin tuttuu 583 says %5d formatyla yazdrlnca, bu say iin 5 alan genilii tanmlanr arakasndan sadan balayarak say bu alana yazlr. Benzer olarak j deikeni, 8 alan genilikli bir blgeye yazlr. Gerel saylarda i biraz daha kark. rnein:
int x=123.456; printf("%f\n",x); printf("%8.2f\n",x); /* serbest biim */ /* formatl */
Birinci satr serbest formatta ikinci satr ise formatl yazlmtr. kinci satrda x deikeni iin ayrlan alan genilii 8 ve noktadan sonra 2 basamaa kadar hassasiyet nemsenmitir. Dikkat edilirse noktadan sonra say uygun bir ekilde yuvarlanm ve say saa dayal olarak yazlmtr. Program 4.4: printf() in formatl kullanm
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: /* 04prg04.c: Formatl kt */ #include <stdio.h> main() { float x = 7324.25, y = 244.531; int i = 1299; char *c = "Merhaba C"; printf("%10d\n" printf("%10s\n" ,i); ,c);
IKTI
1299 Merhaba C 7324.25000 244.5
Aklama x tamsaysnn mutlak deerini hesaplar x gerel saysnn mutlak deerini hesaplar x'e (x'den byk olmayan) en yakn tamsayy gnderir x'e (x'den kk olmayan) en yakn tamsayy gnderir pozitif x saysnn karekkn hesaplar x deerini hesaplar pozitif x saysnn doal logaritmasn hesaplar, ln(x) pozitif x saysnn 10 tabanndaki logaritmasn hesaplar radyan cinsinden girilien x saysnn sins deerini hesaplar radyan cinsinden girilien x saysnn kosins deerini hesaplar radyan cinsinden girilien x saysnn tanjant deerini hesaplar sins deeri x olan ay gnderir. A -pi/2 ile pi/2 arasndadr. cosins deeri x olan ay gnderir. A -pi/2 ile pi/2 arasndadr. tanjant deeri x olan ay gnderir. A -pi/2 ile pi/2 arasndadr.
y
rnek
-1 0 2.000000 8.000000 1.386294 0.602060 0.001593 0.999999 0.001593 0.523599 1.047198 0.463648
double log10(double x); double sin(double x); double cos(double x); double tan(double x); double asin(double x); double acos(double x); double atan(double x);
NOT Bir programda math.h ktphanesi kullanlacakca, GCC derleyicisi lm seenei ile birlikte kullanlmaldr. rnein test.c iinde math.h'i kullanyorsa derleme:
gcc -lm test.c -o test
Trigonometrik (sin, cos, tan) fonksiyonlar kendisine parametre olarak gelen deeri radyan olarak kabul eder ve sonucu hesaplar. Eer alar derece cinsinden hesaplanmas gerekiyorsa u dnm kullanlanlabilir:
radyan = (3.141593/180.0) * derece;
int main() { double aci = 30.0; aci *= PI/180.0; /* radyana evir */ sin(aci)); cos(aci)); tan(aci)); 1.0/tan(aci));
puts("30 derecenin"); printf("sinusu : %lf\n", printf("kosinusu : %lf\n", printf("tanjanti : %lf\n", printf("kotanjanti: %lf\n", return 0; }
IKTI
30 derecenin sinusu : 0.500000 kosinusu : 0.866025 tanjanti : 0.577350 kotanjanti: 1.732051
rnek
atoi("-12345")
Sonu -12345
Bir karakter topluluunu uzun tamsayya evirir atol("1234567890") 1234567890 Bir karakter topluluunu gercel sayya evirir Program sonlandrarak kontrol iletim sistemine geri verir. 0 ile RAND_MAX arasnda rastgele say retir. RAND_MAX, stdlib.h iinde tanmlanm bir sembolik sabittir stdlib.h'de tanmlanm iki saydan en byn bulan makro fonksiyon stdlib.h'de tanmlanm iki saydan en kn bulan makro fonksiyon
atof("-123.546") exit(1)
-123.456 50485132 9 5
int rand(void);
rand()
max(a,b) min(a,b)
max(5, 9) min(5, 9)
IKTI
1 2 3 4 5 6 7 8 9 10 83 86 77 15 93 35 86 92 49 21
Sonu 8 1 1 2 0 4 A d B
IKTI
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
d e f g h i j k l m n o p q r s t u v w x y z { | } ~
d e f g h i j k l m n o p q r s t u v w x y z { | } ~
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Operatr
> < == >= <= !=
rnek
x > y x < y x == y x >= y x <= y x != y
Anlam x, y den byk m? x, y den kk m? x, y ye eit mi? x, y den byk yada eit mi? x, y den kk yada eit mi? x, y den farkl m?
Birden ok karlatrma ilemi, Tablo 6.2'deki Mantksal Operatrler'le birletirilebilir. Tablo 6.2: Mantksal Operatrler
Operatr
&& ||
rnek
x>2 && x<y x>2 || x<y
C dilinde, bir mantksal ilemin sonucu tamsay 0 (sfr) veya baka bir deer olur. 0 olumsuz 0'dan farkl deerler olumlu olarak yorumlanr. Buna gre, aadaki program parasnn
... int x = 1, y = 2, s, u, z; s = 2 > 1; u = x > 3; z = x <= y && y >0; printf("%d\t%d\t%d", s, u, z); ...
kts:
1 0 1
2 her zaman 1 den byk olduu iin s deikenine 1, x = 1 < 3 olduu iin x deikenine 0, z = x <= y && y >0; eitliin satarafnn sonucu olumlu olduu iin z deikenine 1 atanr.
if
deyimi kullanlrken kmenin balangc ve bitiini gsteren, kme parantezleri kullanlmasnda kullancya bir esneklik sunulmutur. Eer if deyiminden sonra icra edilecek deyimler tek satrdan oluuyorsa, bu iaretlerin kullanlmas zorunlu deildir. Yani, if deyimden sonra { ve } iaretleri kullanlmamsa, bu deyimi takip eden sadece ilk satr ileme konur. Bu durum, else if, else deyimlerinde ve daha sonra ilenecek for ve while gibi dng deyimlerinde de geerlidir.
if
ile
if(x == y) puts("x ve y esit");
edeerdir.
if
Bu yapnn kullanlmasna dair bir rnek Program 6.1'de gsterilmitir. Program, klavyeden girilen bir tamsaynn ift olup olmadn snar. Bilindii gibi, ift saylar, 2 ile kalansz blnebilen saylardr.
IKTI
Bir sayi girin: 3 sayi tektir.
Mantksal Operatrler kullanarak birden ok karlatrma birletirilebilir. Buna iyi bir rnek Program 6.2'de gsterilmitir. Program, bir yln artk yl olup olmadn snar. Bir yl iinde, ubat ay 29 gn olursa o yl artk yl olarak adlandrlr. Artk yl peryodik olarak 4 ylda bir gelir. 1800 artk yl deildir. Genel sorgulama syle olmaldr: Eer bir yl
4 ile tam blnyorsa VE 100'e tam blnmyorsa VEYA 400 'e tam blnryorsa
IKTI
Bir yil girin: 1996 1996 artik yil
Eer program iinde kullanlacak koullarn says ikiden ok ise aadaki yap kullanlr:
if(koul_1) { ... deyimler; (kme_1) ... } else if(koul_2) { ... deyimler; (kme_2) ... } . . . else if(koul_n-1) { ... deyimler; (kme_n-1) ... } else { ... deyimler; (kme_n) ... }
Program 6.3, ax2 + bx + c = 0 formundaki ikinci dereceden bir polinomun kklerini hesaplamaktadr. Programda delta deerinin sfrdan kk olmas durumda kklerin karmak sayya dneceide gz nne alnmtr. Bu program if, else if ve else yaps gstermek iin klasik bir rnektir.
IKTI
a, b, c degerlerini girin: 2 4 -8 Reel kokler: x1 = 1.236068 x2 = -3.236068
IKTI
a, b, c degerlerini girin: 1 1 1 Karmasik kokler: x1 = -0.500000 + (0.866025)i x2 = -0.500000 - (0.866025)i
Program Program 6.4'te switch deyiminin basit bir kullanm gsterilmitir. Program 6.4: switch-case yapsnn kullanm
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: /* 06prg04.c: switch - case yapsnn kullanm */ #include <stdio.h> int main(void) { char kr; printf("Lutfen bir karakter girin\n"); kr = getchar(); /* tek bir karakterin okunmas */ switch (kr) { case 'a': printf("a harfine bastiniz\n"); case 'b': printf("b harfine bastiniz\n"); default: printf("a veya b ye basmadiniz\n"); } return 0; }
IKTI
Lutfen bir karakter girin a a harfine bastiniz b harfine bastiniz a veya b ye basmadiniz
IKTI
Lutfen bir karakter girin b b harfine bastiniz a veya b ye basmadiniz
IKTI
IKTI
Ltfen bir karakter girin c a veya b ye basmadiniz
Programda, klavyeden okunan tek bir karakter deikenin ieriine baklp uygun dallanmalar yaptrlmtr. 11. satrda deiken getchar() fonksiyonu ile okutulmutur. Eer 'a' veya 'b'karakterlerinden biri girilirse, ekrana bu harflerin girildiine dair mesaj yazlacak, aksi takdirde bu karakterin dnda bir karakterin giri olarak kullanld gsteren bir mesaj yazlacaktr. rnein 'c'karakteri klavyeden girilmi ise a veya b ye basmadiniz gibi. Fakat 'a' karakterleri girildiinde ekrana her durumda yazdrlmaktadr. Bunun sebebi, case 'a': durumunda srasyla 16, 18 ve 20. satrlarn ileme konmasdr. Bunu engellemek iin 16. satrdan sonra programn baka bir yere ynlendirilmesi gerekir. Bu ynlendirme break deyimi ile yaplr. Derleyici bu deyim ile karlatnda, bulunduu yapnn iinden koulsuz olarak ayrlr ve takip eden ileme balar. Program 6.4'te case 'a': durumu iin 16, 18 ve 20. satrlar da ileme konumutu. Eer klavyeden 'a' karakterini girip ekrana sadece a harfine bastiniz iletisi yazdrlmak isteniyorsa, 20. satra break deyimi ilave edilmelidir. break deyiminin kullanm Program 6.5'te gsterilmitir.
IKTI
Lutfen bir karakter girin a a harfine bastiniz
IKTI
Lutfen bir karakter girin k a veya b ye basmadiniz
Program 6.6 switch-case yapsn farkl bir kullanm ile ilgili bir rnektir. Programda, nce iki say isteniyor ardndan yaplan seimle bu saylarn toplam, fark, arpm veya oran ekrana yazdrlyor.
printf("Seciminiz: "); scanf("%d",&secim); switch( secim ) { case 1: sonuc = x + y; printf("Toplam = %f\n",sonuc); break; case 2: sonuc = x-y; printf("Fark = %f\n",sonuc); break; case 3: sonuc = x * y; printf("Carpim = %f\n",sonuc); break; case 4: sonuc = x/y; printf("Oran = %f\n",sonuc); break; default: puts("Yanlis secim !\a"); } return 0; }
IKTI
Iki sayi girin: 3 8 *** Menu *** [1] Toplama [2] Cikarma [3] Carpma [4] Bolme Seciminiz: 1 Toplam = 11.000000
IKTI
Iki sayi girin: 3 8 *** Menu *** [1] Toplama [2] Cikarma [3] Carpma [4] Bolme Seciminiz: 7 Yanlis secim !
yaps if-else yapsnn bir alternatifidir. Yani, Program 6.6'daki switchcase ksm, if-else yaps ile de aadaki gibi yazlabilirdi. nceleyiniz.
switch-case switch( secim ) { case 1: sonuc = x + y; printf("Toplam = if(secim == 1){ sonuc = x + y; printf("Toplam =
%f\n",sonuc); } %f\n",sonuc); else if(secim == 2){ break; sonuc = x-y; case 2: printf("Fark = %f\n",sonuc); sonuc = x-y; } printf("Fark = %f\n",sonuc); else if(secim == 3 ){ break; sonuc = x * y; case 3: printf("Carpim = sonuc = x * y; %f\n",sonuc); printf("Carpim = } %f\n",sonuc); else if(secim == 4){ break; sonuc = x/y; case 4: printf("Oran = %f\n",sonuc); sonuc = x/y; } printf("Oran = %f\n",sonuc); else{ break; puts("Yanlis secim !\a"); default: } puts("Yanlis secim !\a"); }
lk nce koul snanr. Eer koul olumluysa deyim1 aksi takdirde deyim2 deerlendirilir. deyim1 ve deyim2 de atama ilemi yaplamaz. Ancak koul deyiminde atama ilemi yaplabilir. deyim1 vedeyim2 yerine fonksiyon da kullanlabilir. Aada bu deyimin kullanmna ait rnekler verilmitir.
x = ( a > b ) ? a : b;
Yukardaki ifadede koul a'nn b'den byk olmasdr. Eer olumluysa x adl deikene a, deilse b deeri atanr. Bu ekilde kullanm if-else yaps ile kurulmak istenirse:
x = a; x = b;
eklinde olacaktr. Program 6.7 ? karlatrma operatrnn basit bir kullanmn gstermektedir. Program 6.7: ? ve if kullanm
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: /* 06prg07.c: ? ve if-else yapsnn kullanm */ #include <stdio.h> int main(void) { float x, y, z; printf("x : "); scanf("%f",&x); printf("y : "); scanf("%f",&y); if(y) */ z = ( y > x ) ? x/y : x*y; /* y>x ise z = x/y, deilse z = x*y */ else z = 0.0; printf("z = %f\n",z); return 0; } /* y, 0'dan farkl m?
IKTI
x : 3 y : 5 z = 0.600000
IKTI
x : 11 y : 0 z = 0.000000
12. satrdaki if deyimindeki koul biraz farkldr. Genel olarak koul bu ekilde bildirilirse, koulun 0 dan farkl olup olmad snanr. Yani:
if(y)
ile
if( y != 0 )
ayn anlamdadr. Bu kullanm ok yagndr. Eer y, 0 dan farkl ise koul olumlu olarak deerlendirilecektir. 13. satrda ? ile bir snama yaplmaktadr. Eer y, x den byk ise z deikenine x/y, aksi takdirde x*ydeeri atanmaktadr. Eer y = 0 ise z deikenine 0 deeri atanmaktadr.
Ders 7: Dngler
Giri
Dng (loop) deyimleri, bir kmenin belli bir koul altnda tekrar edilmesi iin kullanlr. C programlama dilinde, while, do...while ve for olmak zere tip dng deyimi vardr. Dier programlama dillerinde olduu gibi, bu deyimlerle istenildii kadar i-ie dng yaps kullanlabilir.
IKTI
0 1 2 3 4 5 6 7 8 9 10
Program 7.1, 0-10 arasndaki saylar ekrana yazdrmaktr. 9. satrdaki while deyiminden sonra { iareti kullanlmamtr. Bu durumda, sadece takip eden satr (10. satr) dngnn iine dahil edilir.
IKTI
Bir sayi girin : 1 iki kati : 2 Bir sayi girin : 3 iki kati : 6 Bir sayi girin : 4 iki kati : 8 Bir sayi girin : -3 iki kati : -6 Cevrim sona erdi.
15. satrdaki koul olumlu olduu srece (sayi>0 olduu srece), klavyeden yeni bir deer 12. satrda okunur. Aksi takdirde (sayi<=0 ise) evrimin sona erdiine dair mesajla program sonlanr.
/* n! = 1 x 2 x 3 x ... x n */
IKTI
Faktoriyeli hesaplanacak sayi girin : 4 4! = 24
IKTI
Faktoriyeli hesaplanacak sayi girin : 15 15! = 2004310016
Program da faktoriyel hesab 16. satrda gerekletirilmitir. Faktriyel, bilindii gibi n! = 1x2x3x ... xn tanmlanr. Gerekte 15! = 1307674368000 olmasna ramen, program 15! = 2004310016 olarak hesaplamtr. Sizce bunun sebebi nedir?
= 1
atmas yaplmtr.
Bu dng ncesi ilk deer atamas, dngnn balang ksmnda u ekilde de yaplabilir:
for(faktor=1, i=1; i<=n; i++) faktor *= i;
fonksiyonu ile desimal (taban-10) saylarlarn nasl yazdrlaca bundan nceki ksmlarda gsterilmiti. Program 7.4'te 0-15 aras desimal saylarn Oktal (taban-8) ve Heksadesimal (taban16) karlklar ile printf kullanlarak yazdrlmas gsterilmitir.
printf
IKTI
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 0 1 2 3 4 5 6 7 8 9 a b c d e f 0 1 2 3 4 5 6 7 8 9 A B C D E F
IKTI
1. 2. 3. 4. 153 370 371 407
yada
... while(7>3) { printf("Sonsuz dng iindeyim...\n"); } ...
Her iki durumda da evrimler, sonsuz dng durumundadr. nk while(1) ve while(7>3) ifadelerdeki koullar daima olumludur. Bu durumda evrim sonsuz dngye girer. dngsnde, balang, koul ve artm parametrelerinden herhangi birini kullanmak istee baldr. Her hangi biri verilmediinde dngnn nasl davranaca iyi yorumlanmaldr. rnein fordngsnn hibir parametresi verilmezse, dng sonsuz evrime girer. Yani:
for for(;;) printf("Sonsuz dng iindeyim...\n");
gibi.
Yukardaki program parasnda, do ... while dngsndeki koul daima olumludur. Bu durumda dng sonsuzdur. Fakat dng iinde if deyimindeki koul gerekleirse, dng kouluna baklmakszn terkedilir. Bu ilemi salayan break deyimidir.
Program 7.6 klavyeden girilen say pozitif olduu srece saynn faktoriyelini hesaplar. Say negatif olduunda dng break ile sonlandrlr. Inceleyiniz. Program 7.6: break deyiminin kullanm
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: /* 07prg06.c: n>=0 olduu srece n! deerini hesaplar */ #include <stdio.h> int main() { long int i,n,faktor; while(1) /* sonsuz dng */ { printf("Faktoriyeli hesaplanacak sayi girin : "); scanf("%ld",&n); if(n<0) break; /* dngy sonlandr */ for(faktor=1, i=1; i<=n; i++) faktor *= i; printf("%ld! = %ld\n",n,faktor); } return 0; }
IKTI
Faktoriyeli 2! = 2 Faktoriyeli 3! = 6 Faktoriyeli 5! = 120 Faktoriyeli 9! = 362880 Faktoriyeli 0! = 1 Faktoriyeli hesaplanacak sayi girin : 2 hesaplanacak sayi girin : 3 hesaplanacak sayi girin : 5 hesaplanacak sayi girin : 9 hesaplanacak sayi girin : 0 hesaplanacak sayi girin : -4
Program 7.7, x, y'den farkl olmak zere |x|+|y|<=3 eitsizliini salayan tamsay iftlerini bulup ekrana yazar. Bu eitsizlii salayan toplam 22 ift vardr. Programda, her bir ift parantez iinde yazdrlmtr. nceleyiniz. Program 7.7: continue deyiminin kullanm
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: /* x, y'den farkl olmak zere |x|+|y|<=3 eitsizliini salayan tamsay iftlerini ekrana yazar */ #include <stdio.h> int main() { int x,y,k=1; for (x=-3;x<=3;x++) for (y=-3;y<=3;y++) { /* x=y ise yeni evrime gir, alt satrlar atla */ if(x==y) continue; if( abs(x)+abs(y)<=3 ) printf("%2d. (%2d,%2d)\n",k++,x,y); } return 0; }
IKTI
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. (-3, 0) (-2,-1) (-2, 0) (-2, 1) (-1,-2) (-1, 0) (-1, 1) (-1, 2) ( 0,-3) ( 0,-2) ( 0,-1) ( 0, 1) ( 0, 2) ( 0, 3) ( 1,-2) ( 1,-1) ( 1, 0) ( 1, 2) ( 2,-1) ( 2, 0) ( 2, 1) ( 3, 0)
ekil 8.1:Bir fonksiyonun kutu gsterimi Fonksiyonlarn girdilerine parametreler yada argumanlar denir. Bir fonksiyon bu parametreleri alp bir ileme tabi tutar ve bir deer hesaplar. Bu deer, kt veya geri dn deeri (return value) olarak adlandrlr. Unutmayn ki, bir fonksiyonun ka girii olursa olsun sadece bir k vardr. C Programlama Dili, kullancsna bu trden fonksiyon yazmasna izin verir. C dilinde hazrlanan bir fonksiyonun genel yaps yledir:
FonksiyonTipi FonksiyonAd(argman listesi) argumanlarn tip bildirimleri { Yerel deikenlerin bildirimi ... fonksiyon iindeki deyimler veya dier fonksiyonlar ... return geri dn deeri; }
veya
/* modern biim */ int topla(int x,int y) { int sonuc; sonuc = x + y; return sonuc; }
veya
/* modern biim */ int topla(int x,int y) { return (x+y); }
Her program parasnda da return (geri dn) deyimi kullanlmaktadr. Bu deyim C programlama dilinin anahtar szcklerinden biridir ve fonksiyon ierisinde sonucu, kendisini aran yere gndemek iin kullanlr. Yani topla fonksiyonu herhangi bir programn ierisinde kullanldnda, fonksiyonun retecei sonu return deyiminden sonra belirtilen deiken veya ilem olacaktr. rnein fonksiyon:
... int t; ... t = topla(9,6); ...
eklinde kullanlrsa, t deikenine 9+6=15 deeri atanr. topla() fonksiyonunun kullanm Program 8.1'in zerinde aklanmtr.
12. Ana programdan sonra: Bu durumda fonksiyon rnei (function prototype) ana programdan nce bildirilmelidir.
13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. ... int topla(int x, int y); ... main() { ... } ... int topla(int x, int y) { ... } /* fonksiyon rnei */
/* fonksiyon */
Bir C program iinde, yazm olduunuz fonksiyonlar genellikle bu iki tipte kullanlr. kinci kullanmda fonksiyon prototipi mutlaka bildirilmelidir. Aksi halde bir hata mesaj ile karlalr. Fonksiyon prototipinde arguman isimlerinin yazlmas zorunlu deildir. Sadece arguman tiplerini belirtmek de yeterlidir. Yukardaki topla fonksiyona ait prototip:
int topla(int x, int y);
eklinde de yazlabilir.
Buraya kadar anlatlanlar Program 8.1 zeride zetlenmitir. Program 8.1: topla fonksiyonunun ana programda kullanlmas
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: /* 08prg01.c: iki sayy toplar ve sonucu ekranda gsterir */ #include <stdio.h> int topla(int, int); int main() { int toplam,a,b; printf("Iki sayi girin : "); scanf("%d %d",&a,&b); /* fonksiyon arlp, a ve b deerleri parametre olarak aktarlyor. topla(a,b) = a + b deeri toplam deikenine atanmas */ toplam = topla(a,b); printf("%d ve %d nin toplami return 0; } /*** fonksiyon tanmlanmas ***/ /* Bu fonksiyon iki tamsayy toplar */ int topla( int x, int y ) { int sonuc; sonuc = x + y; return sonuc; } %d dir.\n", a,b,toplam); /*** fonksiyon prototipi ***/
IKTI
Iki sayi girin : 5 12 5 ve 12 nin toplami 17 dir.
Programda, klavyeden okunan a ve b deikenleri fonksiyonuna parametre olarak aktarlmtr. Bu deikenlerin isimleri ile topla fonksiyonunda kullanlan deikenlerin (x ve y) isimleri ayn olmas zorunlu deildir. Burara a ve b deikenleri srasyla x ve y deikenleri yerine konmutur. 16. satrda toplam adl tamsay deikenine topla fonksiyonunun dn deeri (a + b deeri) atanmtr.
Belki karmak gelmi olabilir. Fakat Program 8.1 daha ksa yle yazlabilirdi: Program 8.1b: topla fonksiyonunun ana programda kullanlmas
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: /* 08prg01b.c: iki sayy toplar ve sonucu ekranda gsterir */ #include <stdio.h> int topla( int x, int y ){ return (x+y); } int main(void) { int toplam,a,b; printf("Iki sayi girin : "); scanf("%d %d",&a,&b); toplam = topla(a,b); printf("%d ve %d nin toplami return 0; } %d dir.\n", a,b,toplam);
1. fonksiyonun geri dn deerini oluturur 2. fonksiyonu sonlandrr Bu deyiminden sonra bir deiken, ilem, sabit veya baka bir fonksiyon yazlabilir. rnein:
return (a+b/c); return 10; return topla(a,b)/2.0; /* parantez kullanmak zorunlu deil */ /* deiken kullanmak mecbur deil */ /* nce topla fonksiyonu alr */
Bir fonksiyonda birden ok geri dn deeri kullanlabilir. Fakat, ilk karlalan return deyiminden sonra fonksiyon sonlananr ve arlan yere bu deer gnderilir. rnein aadaki harffonksiyonunda be tane return deyimi kullanlmtr.
char harf(int not) { if( not>=0 && not<50 if( not>=50 && not<70 if( not>=70 && not<80 if( not>=80 && not<90 if( not>=90 }
) ) ) ) )
Bu fonksiyon kendisine parametre olarak gelen 0-100 arasndaki bir notun harf karln gnderir. Aslnda geri gnderilen deer bir tanedir. Eer bu fonksiyon aadaki gibi arlrsa:
char harfim; ... harfim = harf(78); ... harfim
Program 8.2'de bildirilen artik_yil fonksiyonu, kendisine parametre olarak gelen bir tamsayy yl bilgisi olarak kabul eder. Eer yl artk yl ise 1 aksi halde 0 gnderir. Programda iki tane returndeyimi kullanldna dikkat ediniz. Artk yl tanm Blm 6'da verilmiti. Program 8.2: iki return deyimi kullanan bir fonksiyon
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: /* 08prg02.c: Bir fonksiyonda iki return deyimi */ #include <stdio.h> int artik_yil(int); /* fonksiyon prototipi */ void main() { int yil; printf("Bir yil girin: "); scanf("%d",&yil); if( artik_yil(yil) ) printf("%d artik yil\n",yil); else printf("%d artik yil degil\n",yil); } /* yil artl yl ise 1 aksi halde 0 gnderir */ int artik_yil(int yil) { if( yil % 4 == 0 && yil % 100 != 0 || yil % 400 == 0 ) return 1; else return 0; }
IKTI
Bir yil girin: 1996 1996 artik yil
IKTI
Cekilecek para miktari = 135 Yirmilik = 6 Onluk = 1 Beslik = 1
IKTI
Cekilecek para miktari = 456 Girilen miktar 5 YTL ve katlari olmali!
anahtar szc C'ye sonradan dahil edilmitir. Standart C'de (ANSI C) bu deyimin kullanlmas zorunlu deildir. Ancak bu deyim okunabilirlii arttrmaktadr. rnein:
void void bankamatik(int para) { ... } bankamatik(int para) { ... }
eklindeki kullanmlar geerli ve ayn anlamdadr. Baka bir void fonksiyon rnei Program 8.4'de verilmitir. Programdaki kutu_ciz fonksiyonu, iki for dngs kullanarak 'X' karakterlerinden oluan basit bir kutu izimi yapar. Programda de sadece 18. satr defalarca ileme konur. Program altrldnda 8*35=280 adet 'X' karakteri ekrana bastrlr. nceleyiniz. Program 8.4: basit kutu izen fonksiyon
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: /* 08prg04.c: Basit bir kutu izen fonksiyon */ #include <stdio.h> void kutu_ciz( int satir, int sutun ) { int sut; for ( ; satir > 0; satir--) { for (sut = sutun; sut > 0; sut--) printf("X"); printf("\n"); } } int main(){ kutu_ciz(8,35); return 0; }
IKTI
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
eklinde yada:
int faktoriyel(int n) { int i=1, f=1; while(i<=n) f *= i++; return f; } /* modern biim */
eklinde yazlabilir. Bir fonksiyona parametre aktarm yaplmas zorunlu deildir. Parametresiz bir fonksiyon da tanmlamak mmkndr. Bu durumda argmanlar ksm ya bo braklr yada bu ksma void yazlr. rnein standard C'de stdlib.h ktphanesinde tanml rand fonksiyonu yle tanmlanmtr:
int rand(void);
Son olarak, ne parametresi ne de geri dn deerine olan bir fonksiyon yle tanmlanabilir:
void mesaj_yaz() { printf("Hata olustu !..\n"); }
yada
void mesaj_yaz(void) { printf("Hata olustu !..\n"); }
ekil 8.2: Ana programdan alt programlarn (fonksiyonlarn) arlmas. Fonksiyonu armak iin, fonksiyonun adn yazmak yeterlidir. Fonksiyonlarn sadece ana program tarafndan arlmas zorunlu deildir. Bir fonksiyon baka bir fonksiyon tarafndan da arlabilir. Bu tr kullanma dair bir rnek Program 8.5'de verilmitir.yilin_gunu fonksiyonu, verilen bir tarihin yln kanc gn olduunu hesaplar ve arld yere gnderir. nceleyiniz.
printf("%02d %02d %d yilinin\n",gun,ay,yil ); printf("%d. gunudur\n",yilin_gunu(gun,ay,yil) ); return 0; } /* yil artl yl ise 1 aksi halde 0 gnderir */ int artik_yil(int yil) { if( yil%4==0 && yil%100!=0 || yil%400==0 ) return 1; else return 0; } /* yln kanc gn olduunu hesaplar ve o gn gnderirir */ int yilin_gunu(int gun, int ay, int yil) { int ygun = gun; switch(ay-1) { case 12: ygun case 11: ygun case 10: ygun case 9: ygun case 8: ygun case 7: ygun case 6: ygun case 5: ygun case 4: ygun case 3: ygun case 2: ygun 28+0 */ case 1: ygun } return ygun; }
+= += += += += += += += += += +=
31; 30; 31; 30; 31; 31; 30; 31; 30; 31; 28 + artik_yil(yil);
/* 28+1 veya
+= 31;
IKTI
01 08 2003 yilinin 213. gunudur
Bu ekilde tanmlanan fonksiyonlarn kullanm dierleri gibidir. Yalnzca programn banda tanmlanr. Ancak, bu tanmlamalarla fonksiyon bellekte bir yer igal etmez. Basit bir makro fonksiyon uygulamas Program 8.6'da gsterilmitir. buyuk(a,b) makrosu a>b ise a deerini aksi halde b deerini gnderir.
IKTI
iki say girin: 8,6 buyuk olan 8
Buna gre, x = 1.7 iin, P(x) = 1 - 2x deerini hesaplamak iin bu fonksiyon aadaki gibi arlmaldr:
sonuc = p(1.7, 1.0, -2.0, 0.0, 0.0);
Burada, kullanlmayan katsaylar iin 0.0 deeri mutlaka fonksiyona geirilmelidir. Kullanlmayan argumanlar geirilmeden de fonksiyonu armak mmkndr. C++, Fortran 90 gibi dillerde olduu gibi, C Programlama Dili, kullanclarna argmanlar esnek olarak geirme imkan verir. Bunun anlam, belli kurallar salandnda, p() fonksiyonu aadaki gibi arlabilmesidir:
/* x n sonuc = p(1.7, 2, a b */ 1.0, -2.0);
Esnek argmanlar kullanm istee baldr. Esnek argmanlar oluturan kme ardk olarak listeye eklenmelidir.
Bu trden argmanlar, aadaki gibi, fonksiyonun parametre listesi ksmnda ... ile belirtilir.
double p(double x, int n, ...) { }
Esnek Argumanl Fonksiyon tanmlamas yapabilmek iin stdarg.h ktphanesinde tane makro fonksiyon tanmlanmtr. Bu fonksiyonlar Tablo 9.1'de listelenmitir. Tablo 9.1: stdarg.h'te tanml tip ve makro fonksiyonlar
Tip / Fonksiyon
va_list va_start(ap, n) va_arg(ap, tip) va_end(ap)
Bu kurallar nda, p() fonksiyonunun genel kullanm Program 9.1'de gsterilmitir. p(), kendisine parametre olarak gelen x, n ve ai katsaylarna gre P(x,n) = a0 + a1x + a2x2 + ... + anxn polinomu hesaplar. ai (i = 0, 1, 2, ..., n) katsaylar esnek argman olarak bildirilmitir.
IKTI
x = 1.700000 icin: p(x, 1, 1.0) = 1.000000 p(x, 2, 1.0, -2.0) = -2.400000 p(x, 3, 1.0, -2.0, 0.2) = -1.822000 p(x, 4, 1.0, -2.0, 0.2, 1.1) = 3.582300 p(x, 5, 1.0, -2.0, 0.2, 1.1, -0.6) = -1.428960
Program 9.2'de, argmanlar esnek olarak bildirilmi topla(int tamsaynn saynn toplamn hesaplar. Program 9.2: n tane saynn toplamn hesaplar
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: /* 09prg02.c n tane saynn toplamnn hesaplanmas */ #include <stdarg.h> #include <stdio.h> int topla(int, ...); int main(void) { printf("topla(2, 11,22) 11,22)); printf("topla(3, 11,22,33) 11,22,33)); printf("topla(4, 11,22,33,44) 11,22,33,44)); printf("topla(5, 11,22,33,44,55) 11,22,33,44,55)); printf("topla(6, 11,22,33,44,55,66) 11,22,33,44,66,66)); return 0; }
n, ...)
fonksiyonu, n tane
= %d\n", topla(2, = %d\n", topla(3, = %d\n", topla(4, = %d\n", topla(5, = %d\n", topla(6,
/* Esnek argumanla tanmlanm n tane tamsaynn saynn toplamn gnderir */ int topla(int n, ...) { va_list ap; int i, top = 0; va_start(ap, n); for (i=1; i<=n; i++) top += va_arg(ap, int); va_end(ap); return top; }
IKTI
topla(2, topla(3, topla(3, topla(5, topla(6, 11,22) 11,22,33) 11,22,33,44) 11,22,33,44,55) 11,22,33,44,55,66) = = = = = 33 66 110 165 242
Argman says bilidirilmeden de bir kme zerinde ilem yaplabilir. Ancak bu durumda kmenin boyutu baka bir yntemle hesaplanmaldr. Program 9.3'de, argmanlar esnek olarak bildirilmiargyaz(int arg, ...) fonksiyonu, son eleman -1 olan bir kmenin elemanlarn ekrana yazar. Kmenin sonu (yani boyutu) -1 ile belirlenmi olur. Program 9.3: Sonu -1 ile biten kmeyi ekrana yazar
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: /* 09prg03.c: Esnek argumanlarn yazdrlmas #include <stdio.h> #include <stdarg.h> /* herbiri int tipinde ve sonu -1 ile biten kmeyi ekrana yazar */ void argyaz(int arg, ...) { va_list ap; int i; va_start(ap, arg); for (i = arg; i != -1; i = va_arg(ap, int)) printf("%d ", i); va_end(ap); putchar('\n'); } int main(void) { argyaz(5, 2, 14, 84, 97, 15, 24, 48, -1); argyaz(84, 51, -1); argyaz(-1); argyaz(1, -1); return 0; } */
IKTI
5 2 14 84 97 15 24 48 84 51 1
program, kullancnn talebi dorultusunda (olumlu anlamda) "yapmas gereken ii yapt" mesajn iletim sistemine bildirilir. 0'dan farkl herhangi bir deer ise programn sorunlu sonland anlamna gelecektir. Bu yzden btn C programlarmzn sonuna return 0; ilave ediyoruz. Baz programclar main fonksiyonunun bana ey yazmaz.
main() { ... return 0; }
Bu durumda geri dn deeri tamsay (int) kabul edilir. Bu ekilde kullanmda, yeni tip derleyiciler uyar (warning) mesaj verebilirler. Bu yzden, aadaki kullanm tavsiye ediyoruz.
int main() { ... return 0; }
Eer ana programdan bir deer dndrlmeyecekse, main fonksiyonunun nne aadaki gibi void deyimi eklelenmelidir. Ancak bu baz derleyiciler tarafndan hata olarak yorumlanr. Bu nedenle, aadaki kullanmlar pek tavsiye edilmez.
void main() { ... }
yada
void main(void) { ... }
Ana programa parametre aktarm, derlenmi (altrlabilir) bir program komut satrndan (iletim sistemi ortamndan) altrlaca zaman yaplr. Parametre aktarm, programn ad yazlp bir boluk brakldktan hemen sonra yaplr. Parametreler, komut satrndan saysal olarak girilse bile program iinde karakter topluluu (string) olarak gelir. Bu durumda, bu ifadeleri saysal deerlere eviren (atoi(), atol(), atof() gibi) fonksiyonlar kullanlr[1]. Genel kullanm biimi:
... int main(arguman_says, arguman_vektr) int arguman_says; char *arguman_vektr[]; { . . . if(arguman_says < ...){ printf("Eksik parametre !\n"); exit(1); } if(arguman_says > ...){ printf("Cok fazla parametre !\n"); exit(1); } . ... arguman_vektr[0] ... /* 1. eleman program ad */ ... arguman_vektr[1] ... /* 2. eleman 1. parametre */ ... arguman_vektr[2] ... /* 3. eleman 2. parametre */ . }
Program 9.1, topla.c derlendikten sonra retilen Windows ortamnda retilen topla.exe ve Linux ortamnda retilen topla dosyasnn altrlmas yledir:
Turbo C 2.0 Derlecisi kullanlarak (topla.c program C:\TC adl dizinin altna kaydedildii varsaylmtr)
Dev-C++ Derlecisi kullanlarak (topla.c program C:\Users\bingul\Desktop adl dizinin altna kaydedildii varsaylmtr)
Linux gcc derleyicisi kullanlarak (topla.c program /home/bingul/ adl dizinin altna kaydedildii varsaylmtr)
Komut satrnda yazlan dosya ad dahil toplam parametre says 3 tr. Bunlar:
topla | V argvek[0] 4 | V argvek[1] 9 | V argvek[2]
eklindedir.
Program 9.1, komut satrndan girilen iki saynn toplamn hesaplar. Bu programn daha gelimi hali Program 9.2'de verilmitir. Program 9.2 altrldnda, komut satrndan girilen iki say ve bir operatr bekler. Girilen operatre gre be aritmetik ilemden birinini yapp sonucu ekranda gsterir. nceleyiniz. Program 9.2: Komut satrndan girilen iki say ve bir operatr bilgisine gre 5 ilemden birini hesaplar
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: /* hesap.c: Komut satrndan girilen iki say zerinde 5 ilem yapar. Kullanm: hesap <sayi1> <operator> <sayi2> */ #include <stdio.h> #include <stdlib.h> int main(int args, char **argv) { int s1, s2; float sonuc; char op; if(args != 4){ printf("Eksik veya fazla parametre !\n"); printf("Kullanimi: hesap <sayi1> <operator> <sayi2>\n"); return 1; } s1 = atoi(argv[1]); op = argv[2][0]; karakteri: operator */ s2 = atoi(argv[3]); /* 1. parametre: sayi1 */ /* 2. parametrenin ilk /* 3. parametre: sayi2 */
switch(op) { case '+': sonuc = s1 + s2; break; case '-': sonuc = s1 - s2; break; case '*': sonuc = s1 * s2; break; case '/': sonuc = (float) s1 / s2; break; case '%': sonuc = s1 % s2; break; default: sonuc = 0.0; printf("Yanlis operator %c\n",op); printf("Operatorler: +, -, *, / veya %%\n"); } printf("sonuc = %f\n",sonuc); return 0; }
Program hesap.c adl dosyada sakland varsaylrsa, programn Linux ortamndaki kts yle olacaktr:
oluturur.
(word count) komutu, bir dosyann ka karakter, kelime satrdan olutuunu bulup ekrana yazar.
Kullanm: wc dosya_ad
rnein, 5 elemanl, ktle verilerini bellekte tutmak iin, kutle dizisi yle tanmlanabilir:
float kutle[5];
Bildirim srasnda dizilerin eleman says tamsay trnden bir sabit ifadesiyle belirtilmesi zorunludur. rnein:
int n = 100; int a[n];
eklindeki tanmlama, dizi uzunluunun deiken (n) ile belirtilmesi nedeniyle geersizdir. Bunun yerine, dizilerin eleman says aadaki gibi sembolik sabitlerle belirtmek mmkndr.
#define n ... int a[n]; 100
Bir dizinin bellekte kaplad alann bayt cinsinden karl sizeof operatr ile renilebilir.
int a[5], b, c; ... b = sizeof(a); c = sizeof(a) / sizeof(int);
Kme parantezlerinin sonlandrc ; karakteri ile bittiine dikkat ediniz. Bir dizinin uzunluu belirtilmeden de balang deeri atamak mmkndr.
int a[] = { 100, 200, 300, 400 }; float v[] = { 9.8, 11.0, 7.5, 0.0, 12.5};
Derleyici bu ekilde bir atama ile karlatnda, kme parantezi iindeki eleman saysn hesaplar ve dizinin o uzunlukta aldn varsayar. Yukardaki rnekte, a dizisinin 4, v dizisinin 5 elemanl olduu varsaylr.
Program 10.1, klavyeden girilen N = 10 adet saynn ortalamasn hesaplar. Ortalama forml ile hesaplanabilir.
IKTI
1. sayi : 1 2. sayi : 0 3. sayi : 9 4. sayi : 7 5. sayi : 2 6. sayi : 10 7. sayi : 11 8. sayi : 4 9. sayi : 6 10. sayi : 5 Sayilarin ortalamasi = 5.500000
Bu programda, ortalamas alnacak saylar ad x olan 10 elemanl tamsay tipindeki bir dizide saklanmtr. Bu ekilde saklanan saylarn hepsi program alt srece bellekte kalacaktr. Bu sayede, program iinde daha sonra (gerektiinde) ayn saylar tekrar kullanlabilir. Bu program, dizi kullanmadan da yazlabilirdi. Fakat, baz hallerde dizi kullanmak kanlmaz olur. Porgram 10.2, n = 10 tane saynn ortalamasn ve standart sapmasn hesaplar. Standart sapma,
IKTI
1. sayi : 7 2. sayi : 8 3. sayi : 9 4. sayi : 6 5. sayi : 5 6. sayi : 8 7. sayi : 8 8. sayi : 10 9. sayi : 11 10. sayi : 6 Ortalama = 7.000000 Standart sapma = 2.054805
IKTI
En buyuk eleman = 900
En byk sayy bulan bu algoritma olduka kolaydr. 12. satrda eb = a[0]; atamas ile dizinin ilk elemannn en byk olduu varsaylr. Daha sonra bye rastladka (15. satr) eb = a[k]; ileeb deimektedir. Program 10.3 bir dizinin en byk elemann bulur. En byk elemann kanc indis (eleman) olduu sorgulanmak istendiinde: programdaki koul yapsn aadaki gibi deitirmek yeterlidir. ebdeitike, i deikeni en byk elemann indisini tutar.
for(k=0; k<10; k++){ if( a[k] > eb ){ eb = a[k]; i = k; } }
n elemanl bir dizinin, elemanlarn bykten ke doru sralamak iin ok popler iki algoritma aada verilmitir[2].
Seerek Sralama (Selection Sort): En byk eleman bul baa koy biimindeki sramadr. Algoritmann uygulamas Program 10.4'de gsterilmitir. Bu algoritmada kullanlan kombinasyon says (algoritmann karmakl): n*(n-1)/2 dir. Program 10.4: Seerek Sralama (Selection Sort) Algoritmas
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: /* 09prg04.c Seerek Sralama (Selection Sort) Algoritmas ile bir dizinin elemanlarn bykten ke dogru sralar */ #include <stdio.h> #define n 10 int main(void) { int a[n] = {100, -250, 400, 125 ,550, 900, 689, 450, 347, 700}; int i, j, k, eb; /* Dizinin kendisi */ printf("Once : "); for(k=0;k<n;k++) printf("%5d ",a[k]); /* Srala */ for(k=0; k<n; k++){ eb = a[k]; i = k; for(j=k+1; j<n; j++) if( a[j]>eb ){ eb = a[j]; i = j; } a[i] = a[k]; a[k] = eb; } /* Sralama bitti */ printf("\nSonra: "); for(k=0; k<n; k++) printf("%5d ",a[k]); printf("\n"); return 0; }
IKTI
Once : 700 Sonra: -250 100 900 -250 700 400 689 125 550 550 450 900 400 689 347 450 125 347 100
Kabarck Sralama (Bubble Sort): Yanyana elemanlar karlatrarak yer deitir biimde sralamadr. Algoritmann uygulamas Program 10.5'de gsterilmitir. Bu algoritmann karmakl: (n-1)2 dir. Program 10.5: Kabarck Sralama (Bubble Sort) Algoritmas
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: /* 09prg05.c Kabarck Sralama (Bubble Sort) Algoritmas ile bir dizinin elemanlarn bykten ke dogru sralar */ #include <stdio.h> #define n 10 int main(void) { int a[n] = {100, -250, 400, 125 ,550, 900, 689, 450, 347, 700}; int j,k,gecici; /* Dizinin kendisi */ printf("Once : "); for(k=0; k<n; k++) printf("%5d ",a[k]); /* Srala */ for(k=0; k<n-1; k++) for(j=0; j<n-1; j++) if( a[j]<a[j+1] ){ gecici = a[j]; a[j] = a[j+1]; a[j+1] = gecici; } /* Sralama bitti */ printf("\nSonra: "); for(k=0; k<n; k++) printf("%5d ",a[k]); printf("\n"); return 0; }
IKTI
Once : 700 Sonra: -250 100 900 -250 700 400 689 125 550 550 450 900 400 689 347 450 125 347 100
dizinin bittii yeri gsterir, ASCII tablosunun sfr numaral ('\0') karakteridir.
char s[7] = {'d','e','n','e','m','e','\0'};
Birinci tanmlamada sonlandrc karakter programc tarafndan konmaldr. Ikinci tanmlamada ise buna gerek yoktur. nk, sonlandrc karakter bu atamayla, derleyici tarafndan eklenir.
NOT
char s[7] = "deneme";
Karakter dizleri veya katarlar Blm 12'de daha ayrntl ilenecektir. Burada sadece iki basit rnek sunulmutur. Program 10.6'da bir karakter dizisinin uzunluunun nasl bulunduu, Program 10.7'de ise bir karakter dizisinin tersyz edilii gsterilmitir. nceleyiniz.
IKTI
Birseyler yazin : Marmara Universitesi Dizinin uzunlugu : 21
IKTI
Bir seyler yazin : Deneme Tersi : emeneD
Bir dizi birden ok boyuta sahip olabilir. rnein iki boyutlu b dizisi yle tanmlanabilir:
float b[9][4];
ki boyutlu diziler matris olarak adlandrlr. ilk boyuta satr, ikinci boyuta stn denir. Yukarda b matrisinin eleman says 9x4=36 dr. Bu durumda, genel olarak bir dizi yle gsterilir: Tablo 10.1: Dizlerin Bildirimi
Dizi eiti Tek boyutlu diziler (Vektrler) ki boyutlu diziler (Matrisler) ok boyutlu diziler Genel Bildirimi
tip dizi_ad[eleman_says] tip dizi_ad[satr_says][sutun_says] tip dizi_ad[boyut_1][boyut_2]...[boyut_n];
rnek
int veri[10]; float mat[5][4]; double x[2][4][2];
ok boyutlu diziler tek boyuta indir generek bellekte tutulurlar. Tek indisli dizilerde olduu gibi, ok indisli dizilere de balang deeri vermek mmkn. rnein 3 satr ve 4 stnlu (3x4=12 elemanl) bir x matrisinin elemanlar yle tanmlanabilir:
int x[3][4] = {11,34,42,60, 72,99,10,50, 80,66,21,38};
kts:
11 72 80 34 99 66 42 10 21 60 50 38
eklinde olacaktr.
Program 10.8, iki matrisin toplamn baka bir matrise aktarr. Matris toplam forml ile tanmldr. nceleyiniz.
0, 1, 2}; 4, 5, 6};
IKTI
A Matrisi: 5 3 0 1 B Matrisi: 1 2 4 5
7 2 3 6
C Matrisi: 6 5 10 4 6 8
Program 10.9, iki kare matrisin arpm baka bir matrise aktarr. Matris arpm forml ile tanmldr.
int main() { int a[N][N], b[N][N], c[N][N]; int i,j,k,toplam; puts("A Matrisini girin:"); for(i=0; i<N; i++) for(j=0; j<N; j++) scanf("%d",&a[i][j]); puts("B Matrisini girin:"); for(i=0; i<N; i++) for(j=0; j<N; j++) scanf("%d",&b[i][j]); puts("\nC Matrisi:"); for(i=0; i<N; i++){ for(j=0; j<N; j++){ for(toplam=0, k=0; k<N; k++) toplam += a[i][k]*b[k][j]; c[i][j] = toplam; printf("%4d",c[i][j]); } printf("\n"); } return 0; }
IKTI
A Matrisini girin: 5 3 7 0 1 2 9 0 4 B Matrisini girin: 1 2 3 4 5 6 7 8 9 C Matrisi: 66 81 96 18 21 24 37 50 63
IKTI
8.471 3.683 9.107 4.739 3.918
Eer dizi boyutu #define nilemcisi ile belirtilirse boyutun ayrca parametre olarak kullanlmasna gerek youktur. Bu durumda Program 10.10 yle deitirlebilir:
... #define BOYUT 5 void dizi_yaz(float x[]); void main(void) { float kutle[BOYUT]= { 8.471, 3.683, 9.107, 4.739, 3.918 }; dizi_yaz(kutle); } ...
Program 10.3'de bir dizinin en byk elemannn nasl bulunduu gsterilmiti. En byk eleman bulma ilemi bir fonksiyona nasl yaptrld Program 10.11'de gsterilmitir.
IKTI
En buyuk eleman = 900
Son olarak, bir kare matrisin iz (trace) deerini bulup ekrana yazan bir fonksiyon Program 10.12'de verilmiitir. Bir kare matrisin izi, matrisin asal kegen zerinde bulunan elemanlarn toplam olarak tanmldr. Bu tanma gre, aadaki matrisin izi 2 + 8 + 4 = 14 tr..
IKTI
matrisi girin: 2 1 -5 3 8 6 7 1 4 matrisin izi = 14.000000
Matrisler, fonksiyonlara parametre olarak geirilirken ikinci boyununda verildiine dikkat edin.
rnein tam adl bir tamsay deikenini aadaki gibi tanmladmz varsayalm:
int tam = 33;
Bu deiken iin, int tipinde bellekte bir hcre ayrlr ve o hcreye 33 says ikilik (binary) say sitemindeki karl olan 4 baytlk (32 bitlik): 00000000 00000000 00000000 00100001 says elektronik olarak yazlr. tam deikenine ait drt temel zellik ekil 11.1'deki gibi gsterilebilir:
ekil 11.1: Bir deikene elik eden drt temel zellik Bellek adresleri genellikle onaltlk (hexadecimal) say sisteminde ifade edilir. 0x3fffd14 says onluk (decimal) say sisteminde 67108116 sayna kark gelir. Bunun anlam, tam deikeni, program alt srece, bellekte 67108116. - 67108120. numaral gzler arasndaki 4 baytlk hcreyi igal edecek olmasdr. ekil 11.1'deki gsterim, basit ama anlalr bir tasvirdir. Gerekte, int tipindekitam deikeninin bellekteki yerleimi ve ierii (deeri) ekil 11.2'de gsterildii gibi olacaktr.
ekil 11.2: tam adl deikenin bellekteki gerek konumu ve ikilik dzendeki ierii Deikenin sakl olduu adres, & karakteri ile tanml adres operatr ile renilebilir. Bu operatr bir deikenin nne konursa, o deikenin ierii ile deil adresi ile ilgileniliyor anlamna gelir. Aadaki program parasnn:
int tam = 33; printf("icerik: %d\n",tam); printf("adres : %p\n",&tam);
kts:
icerik: 33 adres : 3fffd14
eklindedir. Burada birinci satr tam deikeninin ierii, ikinci ise adresidir. Adres yazdrlrken %p tip belirleyicisinin kullanldna dikkat ediniz.
Burada tip_ad herhangi bir C tip ad olabilir. Deikenin nnedeki * karakteri ynlendirme (indirection) operatr olarak adlandrlr ve bu deikenin veri deil bir adres bilgisi tutacan iaret eder. rnein:
char *kr; int *x; float *deger, sonuc; deikenler */ /* tek bir karakter iin */ /* bir tamsay iin */ /* deger gsterici tipinde, sonuc sradan bir gerel
Yukarda bildirilen gstericilerden; kr bir karakterin, x bir tamsaynn ve deger bir gerel saynn bellekte sakl olduu yerlerin adreslerini tutar. Bir gstericiye, bir deikenin adresini atamak iin adres operatrn kullanabiliriz. rnein tamsay tipindeki tam adl bir deiken ve ptam bir gsterici olsun. Derleyicide, aadaki gibi bir atama yapldnda:
int *ptam, tam = 33; . . . ptam = &tam;
gstericisinin tam deikeninin sakland adresi tutacaktr. Bu durum ekil 11.3'deki gibi tasvir edilir.
ptam
ekil 11.3'deki gsterimde, ptam gstericisinin ierii tam deikeninin ierii (33) deil adresidir (0x3fffd14). Ayrca, ptam deikeni, bellekte baka bir hcrede saklandna ve bu hcrenin intdeil int * tipinde bir blge olduuna dikkat ediniz. Buraya kadar anlatlanlar, Program 11.1'de zetlenmitir. Program 11.1: Bir deikenin ieriini ve adresini ekrana yazdrma
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: /* 10prg01.c: ilk gsterici program */ #include <stdio.h> int main() { int *ptam, tam = 33; ptam = &tam; printf("tam: printf("tam: printf("tam: return 0; } icerik = %d\n", tam); adres = %p\n",&tam); adres = %p\n",ptam);
7. satrda deikenler bildirilmitir. 9. satrdaki atama ile tam deikeninin adresi, ptam gstericisine atanmtr. Bu satrdan itibaren ptam, tam deikeninin gsterir. 11. satda tam'n ierii (33 says), 12. ve 13. satrda tam'n adresi, %p tip karakteri ile, ekrana yazdrlmtr. Ekran kts incelendiinde, &tam ve ptam iereriinin ayn anlamda olduu grlr. IKTI
tam: tam: tam: tam icerik = 33 adres = 0x3fffd14 adres = 0x3fffd14
adl deikenin ieriine ptam gsterici zerinde de eriilebilir. Bunun iin program iinde ptam deikeninin nne ynelendirme operatr (*) koymak yeterlidir. Yani *ptam, tam deikeninin adresini deil ieriini tutar. Buna gre:
*ptam = 44;
komutuyla, ptam'n adresini tuttuu hcreye 44 deeri atanr. Bu durum, Program 11.2'de gsterilmitir.
printf("&tam = %p\n",&tam); printf("ptam = %p\n",ptam); printf("\n"); printf("tam = %d\n",tam); printf("*ptam = %d\n",*ptam); printf("\n"); *ptam = 44; /* tam = 44 anlamnda */
IKTI
&tam ptam = 0x3fffd14 = 0x3fffd14
zetle ptam
*ptam
= &tam
atamasyla:
ve tam, tam adl deikenin ierii ile ilgilidir. ptam ve &tam, tam adl deikenin adresi ile ilgilidir. * ynlendirme ve & adres operatrdr.
Bu gstericiler srasyla, bir karakter, bir tamsay ve bir gerel saynn bellekte saklanaca adreslerini tutar. Herhangi bir anda, tuttuklar adresler de srasyla 10000 (0x2710), 20000 (0x4e20) ve 30000 (0x7530) olsun. Buna gre aadaki atama ielemlerinin sonucu:
kar++; tam++; ger++;
srasyla 10001 (0x2711), 20004 (0x4e24) ve 30008 (0x7538) olur. Bir gstericiye ekleme yapldnda, o anda tuttuu adres ile eklenen say dorudan toplanmaz. Byle olsayd, bu atamalarn sonular srasyla 10001, 20001 ve 30001 olurdu. Gerekte, gstericiye bir eklemek, gstericinin gsterdii yerdeki veriden hemen sonraki verinin adresini hesaplamaktr. Genel olarak, bir gstericiye n saysn eklemek (veya karmak), bekllekte gsterdii veriden sonra (veya nce) gelen n. elemann adresini hesaplamaktr. Buna gre aadaki atamalar yle yorumlanr.
kar++; tam = tam + 5; ger = ger - 3; /* kar = kar + sizeof(char) */ /* tam = tam + 5*sizeof(int) */ /* ger = ger - 3*sizeof(double) */
Program 11.3, bu blmde anlatlanlar zetlemektedir. nceleyiniz. Program 11.3: Gsterici aritmetii
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: /* 10prg03.c: gsterici aritmetii */ #include <stdio.h> int main() { char *pk, k = 'a'; int *pt, t = 22; double *pg, g = 5.5; pk = &k; pt = &t; pg = &g; printf("Onceki pk, pt, pg); pk++; pt--; pg = pg + 10; printf("Sonraki adresler: pk= %p pk, pt, pg); return 0; } pt= %p pg= %p \n", adresler: pk= %p pt= %p pg= %p \n",
IKTI
Onceki adresler: pk= 0xbfbbe88f 0xbfbbe880 Sonraki adresler: pk= 0xbfbbe890 0xbfbbe8d0 pt= 0xbfbbe888 pt= 0xbfbbe884 pg= pg=
eklinde bir bildirim yaplsn. Buna gre aada yaplan atamalar geerlidir:
p = &kutle[0]; p = kutle; q = &kutle[4]; /* birinci elemann adresi p gstericisne atand */ /* birinci elemann adresi p gstericisne atand */ /* son elemann adresi q gstericisne atand */
lk iki satrdaki atamalar ayn anlamdadr. Dizi ad bir gsterici olduu iin, dorudan ayn tipteki bir gstericiye atanabilir. Ayrca, i bir tamsay olmak zere,
kutle[i];
ile
*(p+i);
ayn anlamdadr. Bunun sebebi, p gstericisi kutle dizisinin balang adresini tutmu olmasdr. p+i ilemi ile i+1. elemann adresi, ve *(p+i) ile de bu adresteki deer hesaplanr.
NOT Bir dizinin, i. elemanna erimek iin *(p+i) ilemi yaplmas zorunludur. Yani
*p+i; /* p nin gsterdii deere (dizinin ilk elemanna) i saysn ekle */ *(p+i); /* p nin gsterdii adresten i blok tedeki sayy hesapla */ anlamndadr. nk, * operatr + operatrne gre ilem nceliine
sahiptir.
Program 11.4'de tanmlanan fonksiyon kendine parameter olarak gelen n elemanl bir dizinin aritmetik ortlamasn hesaplar.
IKTI
Dizinin ortalamas = 3.300000
Bu fonksiyonda, dng sayac iin (i deikeni) kullanlmayp, dng iinde dizinin balang adresi p gstericisine atanm ve koul ksmnda adres karlatrlmas yaplmtr. Bu durumda dng,p'nin tuttuu adresten balar, ve p'nin adresi dizinin son elemannn adresinden (&dizi[n-1]) kk veya eit olduu srece evrim yinelenir.
: %d\n",x);
: %d\n",x);
: %d\n",n);
: %d\n",*n);
5. ve 6. satrlada kendine geilen parametrenin deerini alan f1 fonksiyonu ve parametrenin adresini alan f2 adl iki fonksiyon rnei belirtilmidir. 11. satrdaki x deikeni 16. ve 21. satrlarda,f1(x) ve f2(&x) fonksiyonlarna, srasyla deer ve adres geerek aktarlmtr. f1 iinde x (n = 66; ilemi ile) deiime uram, fakat arlma ileminin
sonucunda, x'in deeri deimemitir. Ancak f2 iinde x'in ( *n = 77 ilemi ile) deiimi, arldktan sonrada korunmutur. Yani, adres geerek yaplan aktarmda, f2'ye aktarlan deer deil adres olduu iin, yollanan x parametresi f2iinde deiiklie urayacak ve bu deiim arld 21. satrdan itibaren devam edecektir. IKTI
x in degeri, Fonksiyonlar cagrilmadan once: 55 f1 fonksiyonu icinde : 66 f1 cagirildiktan sonra : 55 f2 fonksiyonu icinde : 77 f2 cagirildiktan sonra : 77
Program 11.6'da iki tamsay deikeninin nasl takas (swap) edilecei gsterilmitir. Bu ilemi C porgramlama dilinde, eer deikenler global olarak bildirilmemise, gsterici kullanmadan bu ilemi yapmak imkanszdr. Program 11.6: ki tamsaynn birbiri ile takas edilmesi
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: /* 10prg06.c: iki saynn birbiri ile takas edilmesi */ #include <stdio.h> void takas(int *, int *); int main() { int a, b; a=22; b=33; printf("takas oncesi : a=%d takas(&a, &b); printf("takas sonrasi: a=%d return 0; } void takas(int *x, int *y) { int z; z = *x; *x = *y; *y = z; } b=%d\n",a,b); b=%d\n",a,b);
IKTI
takas oncesi : a=22 takas sonrasi: a=33 b=33 b=22
#include <stdio.h> double* maxAdr(double a[], int boyut){ double ebd = a[0]; double *eba = &a[0]; int i; for(i=1; i<boyut; i++){ if(a[i]>ebd){ ebd = a[i]; // en byk deger eba = &a[i]; // en byk adres } } return eba; } int main() { double x[6] = {1.1, 3.3, 7.1, 5.4, 0.2, -1.5}; double *p; int k; // indis, dizi ve adresini ekrana bas for(k=0; k<6; k++){ printf("%d %lf %p\n", k, x[k], &x[k]); } p = maxAdr(x,6); printf("En byk deger: %lf\n", *p); printf("En byk adres: %p \n", p); printf("En byk konum: %d \n", int(p-&x[0])); return 0; }
Dizi elemanlar 21. satrda belirlenir. Bu dizinin indisleri, deerleri ve adresleri 26. satrda ekrana baslmtr. En byk elemann adresi 29. satrdaki p = maxAdr(a,6); ile p gstericisine atanmtr. 5. satrda bildirilen maxAdr(); fonksiyonu, en byk elemann adresini hesaplayp arlan yere gnderir. Burada dikkat edilmesi gereken husus, fonksiyonun dn deerinin yerel eba gstericisi olmasdr. eba gstericisi 12. satrda hesaplanan ve fonksiyon parametersi olan dizinin en byk elemann adresini tutmaktadr. Son olarak, fonksiyon arldktan sonra, p gstericisin gsterdii deer, tuttuu adres ve dizinin birinci elemanna gre konumu (indisi) ekrana baslmtr. Indis
hesab int(p-&x[0]) ilemi ile yaplabilir. Bu aslnda, p gstericisin tuttuu adres ile dizinin ilk elemannn adresi arasndaki farktr. Sonu yine bir adres olduu iin tamsay deer elde etmek iin int() taks kullanlmtr. Netice itibaryla bir fonksiyon ile ey ayn anda renilmi olur. IKTI
0 1 2 3 4 5 1.100000 0x7fff41b29ec0 3.300000 0x7fff41b29ec8 7.100000 0x7fff41b29ed0 5.400000 0x7fff41b29ed8 0.200000 0x7fff41b29ee0 -1.500000 0x7fff41b29ee8
#include <stdio.h> int f(int n){ int f=1, i; for(i=1; i<n; i++) f*=i; return f; } int main() { int (*pf)(int); pf = &f; printf("Fonksiyonun adresi = %p\n", &f); printf("Fonksiyonun adresi = %p\n", pf); return 0; }
IKTI
Fonksiyonun adresi = 0x4005b0 Fonksiyonun adresi = 0x4005b0
Aadaki ikinci rnekte, bir fonksiyon dier fonksiyona parametre olarak geirilmi ve saysal trevi hesaplanmtr. Trev hesaplanrken merkezi fark yaklam (central difference approximation) yntemi kullanlmtr.
NOT mfy ynteminde f(x) fonksiyonunun (h kk bir deer olmak zere) Taylor almlar syledir:
f(x+h) = f(x) + h*f'(x) + h2*f''(x)/2! + h3*f'''(x)/3! f(x-h) = f(x) - h*f'(x) + h2*f''(x)/2! - h2*f'''(x)/3! --f(x+h) - f(x-h) = 2*h*f'(x) + O(h3) + ... + ...
--------------------------------------------------------------------
IKTI
Fonksiyon x = 1.100000 deki degeri = 4.131000 Fonksiyon x = 1.100000 deki turevi = 1.630001
gibi. gstericiler yalnzca adres saklamak iin kullanlr. Bu yzden dier gstericiler arasnda atama ilemlerinde kullanlabilir. rnein aadaki atamada derleyici bir uyar veya hata mesaj vermez:
void void *v; char *c; . . . v = c; /* sorun yok !*/
Program 11.10'de void tipindeki bir gstericinin, program iinde, farkl tipteki verileri nasl gsterecei ve kullanlaca rneklenmitir. nceleyiniz.
#include <stdio.h> int main() { char kar = 'a'; int tam = 66; double ger = 1.2; void *veri; veri = &kar; printf("veri -> kar: veri %c gosteriyor\n", *(char *) veri); veri = &tam; printf("veri -> tam: simdi veri gosteriyor\n", *(int *) veri); karakter degerini
%d
tamsayi degerini
veri = &ger; printf("veri -> ger: simdi de veri %lf gercel sayi degerini gosteriyor\n", *(double *) veri); return 0; }
IKTI
veri -> kar: veri a karakter degerini gosteriyor veri -> tam: simdi veri 66 tamsayi degerini gosteriyor veri -> ger: simdi de veri 1.200000 gercel sayi degerini gosteriyor
Benzer olarak, fonksiyon parameterelerinin kopyalanmas srasnda da bu trden atama ilemleri kullanlabilir. Uygulamada, tipten bamsz adres ilemlerinin yapld fonksiyonlarda, parametre deikeni olarak void gstericiler kullanlr. rnein
void free (void *p) { . . . }
Parametresi void
*p
Yararlanlan Kaynaklar
1. 2. 3. 4. 5. " te C ", Dr. Rifat LKESEN, Beta Basm Yaym A., 1996 " A'dan Z'ye C Klavuzu ", Kaan ASLAN, Pusula Yaynclk ve iletiim, 1998 " A'dan Z'ye Turbo C ", Cemit BAHMENYAR, Trkmen Kitapevi, 1994 " C ile Programlama ", Yk.Mh. Hakan ERDUN, Byte Dergisi, ubat 1997 " Sams Teach Yourself C in 24 Hours ", Tony ZHANG, Macmillan Computer Publishing, 1997