Professional Documents
Culture Documents
Ders 1: Giri..............................................................................................................1 Ders 2: Veri Tipleri, Deikenler ve Sabitler......................................................................9 Ders 3: Operatrler...................................................................................................17 Ders 4: Temel Giri/k Fonksiyonlar.........................................................................21 Ders 5: Temel Ktphane Fonksiyonlar........................................................................28 Ders 6: Karlatrma Deyimleri...................................................................................34 Ders 7: Dngler......................................................................................................45 Ders 8: Fonksiyonlar I (Alt programlar).........................................................................54 Ders 9: Fonksiyonlar II (Alt programlar).......................................................................66 Ders 10: Diziler........................................................................................................74 Ders 11: Gsterici (Pointer) Kavram.............................................................................90 Ders 12: Katarlar (Stringler)......................................................................................101 Ders 13: Dinamik Bellek Ynetimi..............................................................................113 Ders 14: Gsterici Uygulamalar................................................................................118 Ders 15: Yaplar ve Birlikler......................................................................................123 Ders 16: Dosya Ynetimi..........................................................................................130 Ders 18: Port Denetimi.............................................................................................138 Ders 19: Grafik Kullanm........................................................................................148 Ders 20: C Makrolar...............................................................................................155 Ders 22: Derleme Seenekleri....................................................................................165 Ders 23: Tarih ve Saat Fonksiyonlar...........................................................................174 Ders 24: Monte Carlo Yntemleri...............................................................................183
Ders 1: Giri
###################- (%95)
Giri 1.1 Tarihe 1.2 Neden C? 1.3 lk C Program 1.4 Balk Dosyalar 1.5 Kaynak Kodunun Derlenmesi 1.6 C Kodlarnn Temel zellikleri 1.7 Kod Yazm iin Baz Tavsiyeler
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. Burada verilen C notarnda, arlkl olarak ANSI C veya dier adyla Standart C konu 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 tarz alma hzn da deitirmez. */ // Bu satrlar derleyici tarafndan // deerlendirilmez. Ayrca programn tarz // alma hzn da deitirmez. C
C++
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[1]-[2]. Bu dosyalardan, Blm 20'de tekrar bahsedilecektir.
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. Aada printf() fonksiyonunun basit kullanm gsterilmitir. rnek kullanm ekli Ekranda yazlacak ifade
printf("Element: Aluminyum"); printf("Atom numaras = %d",13); printf("Younluk = %f g/cm3",2.7); printf("Erime noktas = %f derece",660.32); Element: Aluminyum Atom numaras = 13 Younluk = 2.7 g/cm3 Erime noktas = 660.32 derece
Bir ok C derleyicisinde yukardakilere ek olarak tanmlanm balk dosyalar da vardr. Bunlar derleyicinin yardm ksmndan veya derleyicinin kullanm klavuzundan renilebilir. Ayrca Bkz. Blm 20 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
Microsoft C Borland Turbo C Web MS-DOS / Borland C Windows Zortec C GCC (GNU Compiler Collection) Windows iin Web GCC (GNU Compiler Collection) UNIX / Linux Web
cl ilk.c tcc ilk.c bcc ilk.c ztc ilk.c gcc ilk.c -o ilk.exe gcc ilk.c -o ilk
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
nin Borland Turbo C ve GCC Programlar ile derlenmesi ve altrlmas: Linux (GCC)
$ gcc ilk.c -o ilk $ ./ilk
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.
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 Tf Vy y z = = = = = pow(Vo,2) / (2*g); 2*Vo/g; Vo - g*t; Vo*t - (g*t*t)/2.0; ( a*cos(x) + b*sin(x) )*log( fabs(y) );
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.
###################- (%95)
Giri 2.1 Veri Tipleri 2.2 Deikenler 2.3 Sabitler 2.4 Rakamsal Bilgiler 2.5 Deiken Bildirim Yerleri ve Trleri 2.6 Tip Dnmleri
Giri
Orta ve yksek seviyeli dillerin hemen hemen hepsinde veri tipi ve deiken kavram bulunmaktadr. Bu ksmda C programlama dilindeki temel veri tipleri, tanmlayclar, deikenler ve sabitler konu edilecektir.
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( "char sizeof(char)); printf( "short sizeof(short)); printf( "int sizeof(int)); printf( "long sizeof(long)); printf( "unsigned char sizeof(unsigned char)); printf( "unsigned short sizeof(unsigned short)); printf( "unsigned int sizeof(unsigned int)); printf( "unsigned long sizeof(unsigned long)); printf( "float sizeof(float)); printf( "double sizeof(double)); printf( "long double sizeof(long double)); }
: %d bayt\n", : %d bayt\n", : %d bayt\n", : %d bayt\n", : %d bayt\n", : %d bayt\n", : %d bayt\n", : %d bayt\n", : %d bayt\n", : %d bayt\n", : %d bayt\n",
veritipi ve trevleri ile hesaplanabilecek en kk ve en byk tamsaylar iin aadaki forml kullanlabilir:
int
Tamsay iin
-2,147,483,648 0
Uzun tamsay unsigned iin Tek duyarl gerel say iin (7 basamak) ift duyarl gerel say iin (15 basamak)
-3.4e +/- 38
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 [1], [3]. 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 isimleri verirken baz kurallara uymak zorunludur. Bunlar: 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
Bu kurallara gre aaadaki deiken (sabit, fonksiyon) adlarnn geerliliini inceleyiniz. Deiken/Sabit/Fonksiyon/Yap Ad Geerlilik asal geerli Momentum geerli ivme geerli olasilik geerli IsikHizi geerli isik_hizi geerli isik hizi geersiz k_hz geersiz 1Bit geersiz typedef geersiz Aklama Alt izgi karakteri '_' kullanlabilir Boluk karakteri kullanlamaz Trke karakter kullanlamaz rakam ile balanamaz Anahtar kelimelerden birisi kullanlamaz
2.3 Sabitler
Sabit bildirimi, balang deeri verilen deiken bildirimi gibi yaplr. Ancak, veri tipinin nne const anahtar szc konmaldr. rnein:
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
Yerel deikenler kullanld fonksiyon ierisinde bildirilir. Yalnzca bildirildii fonksiyon ierisinde tannr ve kullanlabilir.
int topla(int a,int b) { /* yerel (local) deiken c nin bildirimi */ int c; c = a + b; return c;
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 Sonu Tipi ---------int double double double unsigned
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
###################- (%95)
Giri 3.1 Aritmetik Operatrler 3.2 Atama Operatrleri 3.3 sizeof Operatr
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.
Aklama toplama
rnek
x + y
* / %
x x x x
* / %
y y y y
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 x x x x x x++ x-= 7; += 3 -= 5 *= 4 /= 2 %= 9 x x x x x x x
Anlam
x = = = = = = = = x x x x x x x 7; + * / % + 3 5 4 2 9 1 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
07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
main() { int x, y; */ x = 1; y = 3; /* /*
printf(" x = %d ve y = %d, olarak veriliyor.\n", x, y); x = x + y; printf("x <- x + y dir\n", x); atamsinin sonucunda x=%d
x = 1; /* x e tekrar 1 degeri ataniyor */ x += y; printf("x += y atamasinin sonucunda x=%d dir\n", x); return 0; }
IKTI
x = 1 ve y = 3, olarak veriliyor. x <- x + y atamasinin sonucunda x=4 dir x += y atamasinin sonucunda x=4 dir
3.3
sizeof
Operatr
Veri tiplerinin, deikenlerin ve dizilerin bellekte kaplad alan sizeof operatr ile renilebilir. Genel kullanm:
sizeof(nesne)
eklindedir. Program 3.2'de bu operatrn nasl kullanld gsterilmitir. Ayrca bkz: Program 2.1 ve Blm 10, Blm 12. Program 3.2: sizeof operatrn kullanm
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: /* 03prg02.c sizeof operatrnn deiik nesnelerle kullanm */ #include <stdio.h> int main(){ int i; int dizi[5]; tamsay dizi */ double d; double mizan[6]; gercel dizi */ /* bir tamsay */ /* 5 elemanl bir /* bir gercel say */ /* 6 elemanl bir
char c; /* tek bir karakter */ char str[] = "masa"; /* bir karakter topluluu */
21: 22: printf("sizeof(int) = 23: printf("sizeof(i) = 24: printf("sizeof(dizi) = 25: %d\n\n",sizeof(dizi)); 26: 27: printf("sizeof(double)= 28: %d\n",sizeof(double)); 29: printf("sizeof(d) = 30: printf("sizeof(mizan) = 31: %d\n\n",sizeof(mizan)); 32: printf("sizeof(char) = printf("sizeof(c) = printf("sizeof(str) = return 0; }
%d\n",sizeof(int)); %d\n",sizeof(i));
%d\n",sizeof(d));
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.
Giri 4.1 printf() Fonksiyonu 4.2 scanf() Fonksiyonu 4.3 puts() Fonksiyonu 4.4 gets() Fonksiyonu 4.5 getchar() Fonksiyonu 4.6 Formatl kt
Giri
Temel giri/k fonksiyonlar, btn programla dillerinde mevcuttur. Bu tr fonksiyonlar, kullancya ekrana veya yazcya bilgi yazdrmasna, ve bilgisayara klavyeden veri girii yapmasna izin verir. Temel giri/k fonksiyonlar kullanlrken stdio.h balk dosyas programn bana eklenmelidir. Bu ksmda, en ok kullanlan giri/k fonksiyonlar anlatlacaktr.
4.1
printf()
Fonksiyonu
Standart C ktphanesinde bulunan printf() fonksiyonu, deikenlerin tuttuu deerleri, onlarn adreslerini veya bir mesaj ekrana belli bir dzenle (format) standart ka (stdout), yani ekrana, yazdrmak iin kullanlan fonksiyondur. Daha nce yazlan rnek programlarda printf() fonksiyonundan yararlanmtk. imdi bu fonksiyonun nasl kullanldna bakalm. Genel yazm biimi:
int printf(const char *format, ...);
Basit olarak ekrana Hata olutu!.. eklinde bir mesaj yazrma ilemi:
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.
Dz metin (literal string): yazdrlmak istenen ileti. rnein: printf("Ben gelmedim kavga iin..."); gibi. 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
\\ %%
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 ... int float char
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 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
printf("3 tamsayi [TAB] : %d \t%d \t%d\n", a, b, c); printf("\n"); printf("3 reel sayi (yanyana) : %f %f %f\n", f, g, h); printf("3 reel sayi (altalta) : \n%f\n%f\n
23: %f\n\n", f, g, h); 24: 25: yuzde = 220 * 25/100.0; 26: printf("220 nin %%25 i %f dir\n", yuzde); 27: printf("%f/%f isleminin sonucu = %f\n", g, f, g / f); printf("\nprogram sonunda beep sesi cikar...\a"); return 0; }
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[6]. 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.
4.2
scanf()
Fonksiyonu
Birok programda ekrana verilerin bastrlmasnn yansra klavyeden veri okunmas gerekebilir. scanf() fonksiyonu klavyeden veri okumak iin kullanlan fonksiyondur. printf() gibi scanf() fonksiyonuda Tablo 4.1 ve Tablo 4.2'de verilen karakterleri kullanr. rnein klaveden bir x tamsays okumak iin:
scanf("%d",&x);
satrn yazmak yeterli olacaktr. Burada & iareti adres operatr olarak adlandrlr ve Bm 11'de ayntl olarak aklanacaktr. Klavyeden iki farkl say okunmak istendinde scanf() fonksiyonu yle kullanlabilir:
scanf("%d %f",&x,&y);
veriler klavyeden
16 1.56
yada veya
16 16 1.56
1.56
ekilinde girilebilir. Program 4.3'de scanf() fonsiyonunun kullanm gsterilmitir. Program 4.3: scanf() fonksiyonun kullanm
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: /* 04prg03.c scanf() fonksiyonu ile int ve float tipindeki verilerin okunmas */ #include <stdio.h> main() { int float
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
4.3
puts()
Fonksiyonu
Ekrana yazdrlacak ifade bir karakter topluluu ise, printf()'e alternatif olarak puts() fonksiyonu kullanlabilir. Ancak puts(), ekrana bu karakter topluluu yazdktan sonra, imleci alt satra geirir. Buna gre:
printf("Sevgi varln mayasdr.\n");
ile
kullanmlar edeerdir.
puts()
4.4
gets()
Fonksiyonu
Klavyeden bir karakter topluluu okumak iin kullanlr. Okuma ilemi yeni satr karakteriyle(\n) karlaslncaya kadar srer. puts() - gets() arsndaki iliki, printf() scanf() arasndaki gibidir. Yani,
scanf("%s",str);
ile
gets(str);
ayn anlamdadr. puts() - gets() fonksiyonlarnn kullanm daha sonra ayrntl ilenecektir.
4.5
getchar()
Fonksiyonu
Bu fonksiyon ile standart giriten bir karakter okunur. Program istenen bir yerde dudurup, bir karakater girinceye kadar bekletir. rnein:
... for(i=0; i<10; i++) { getchar(); printf("%d\n",i); } ...
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 k says 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 */
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. Son olarak formatl kt ile ilgili bir rnek Program 4.4'de verilmitir. nceleyiniz. 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
Giri 5.1 Matematiksel Fonksiyonlar (math.h) 5.2 Standart Ktphane Fonksiyonlar (stdlib.h) 5.3 Karakter zerinde lem Yapan Fonksiyonlar (ctype.h)
Giri
Bu ksmda, C Programlama Dili'nde sk kullanlan ve dier blmlerde yararlanacamz ktphane fonksiyonlarnn bazlar ilenecektir. Ktphane fonksiyonu C dilinde nceden tanmlanm hazr fonksiyonlardr. C dilinde birok i bu fonksiyonlarla yaplmaktadr. Her ktphane fonksiyonu bir balk dosyasnda tanmlanmtr. Bu yzden bir ktphane fonksiyonunu kullanmadan nce, onun hangi balk dosyas ile kullanlmas gerektiini bilmelisiniz.
Aklama x tamsaysnn mutlak deerini hesaplar x gerel saysnn mutlak deerini double fabs(double x); hesaplar double floor(double x'e (x'den byk) en yakn tamsayy x); gnderir x'e (x'den kk) en yakn tamsayy double ceil(double x); gnderir double sqrt(double x); pozitif x saysnn karekkn hesaplar
double pow(double x, double y); double log(double x); double log10(double x);
rnek
abs(-4) fabs(-4.0) abs(-2.7) abs(5.6) sqrt(4.0) pow(2., 3.) log(4.0) log10(4.0)
xy deerini hesaplar pozitif x saysnn doal logaritmasn hesaplar, ln(x) pozitif x saysnn 10 tabanndaki
double sin(double x); double cos(double x); double tan(double x); double asin(double x); double acos(double x); double atan(double x);
logaritmasn hesaplar radyan cinsinden girilien x saysnn sins sin(3.14) deerini hesaplar radyan cinsinden girilien x saysnn cos(3.14) kosins deerini hesaplar radyan cinsinden girilien x saysnn tan(3.14) tanjant deerini hesaplar sins deeri x olan ay gnderir. A asin(0.5) -pi/2 ile pi/2 arasndadr. cosins deeri x olan ay gnderir. A acos(0.5) -pi/2 ile pi/2 arasndadr. tanjant deeri x olan ay gnderir. A atan(0.5) -pi/2 ile pi/2 arasndadr.
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
eklinde yaplmaldr. Aksi halde bir hata mesaj ile karlalr. 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
IKTI
1 83
2 3 4 5 6 7 8 9 10
86 77 15 93 35 86 92 49 21
Aklama bir harf ise 0 dan farkl, deilse 0 gnderir A-Z, a-z veya 0-9 arasnda ise 0 dan farkl, deilse 0 gnderir c bir ASCII karakter ise 0 dan farkl, deilse 0 gnderir c bir rakam ise 0 dan farkl, deilse 0 gnderir c a-z arasnda ise 0 dan farkl, deilse 0 gnderir c A-Z arasnda ise 0 dan farkl, deilse 0 gnderir c says ile verilen ASCII koda sahip karakteri elde eden makro c karakterini kk harfe evirir c karakterini byk harfe evirir
c c
rnek
isalpha('a') isalnum('a') isascii('a') isdigit('4') islower('P') islower('P') toascii(65) tolower('D') toupper('b')
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
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
92 93 94 95 96 97 98 99 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
\ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
\ ] ^ _ ` a b c 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 0 0 0 0 0 0 0 0
Giri 6.1 Karlatrma Operatrleri ve Mantksal Operatrler 6.2 if, if-else Yaps 6.3 switch - case Yaps 6.4 ? Karlatrma Operatr
Giri
Program ierisinde bazen iki veya daha fazla deerin karlatrlmas gerekebilir. Bunun iin, btn programlama dillerinde karlatrma deyimleri mevcuttur. C dili, if, switch ve ?
olmak zere tip karlatrma ilemi yapmaya izin verir. Ancak ? bir operatrdr. if karlatrma deyimi ile, dier programlama dilinde olduu gibi if-else yaps da kurulabilir. switch deyimi, bir deikenin ieriine gre program akn ynlendirir.
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
olduu iin x deikenine 0, eitliin satarafnn sonucu olumlu olduu iin z deikenine
1 atanr.
6.2
if, if-else
Yaps
Bu deyimler, koullu ilem yapan deyimlerdir. if ve else tek bir karlatrma deyimi olup else kullanm istee baldr. Eer bu koul olumlu ise if den sonraki blm yrtlr ve else den sonraki blm atlanr. Koul olumsuz ise if den sonraki kme atlanr ve eer varsa, else den sonraki kmedeki ilemler gerekletirilir.
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. Program 6.1: if-else deyiminin kullanm
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: /* 06prg01.c Klavyeden girilen bir saynn ift olup olmadn snar. */ #include <stdio.h> int main() { int sayi; printf("Bir sayi girin: "); scanf("%d",&sayi); if (sayi % 2 == 0) printf("sayi cifttir.\n"); else printf("sayi tektir.\n");
19: 20:
return 0;
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. Genel kan "bir yl 4 ile tam blnebirse o yl artk yldr" eklindedir. Fakat 1996 artk yl iken 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. Program 6.3: if, else if, else yaps
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: /* 06prg03.c: ax*x + bx + c = 0 denkleminin (karmak sayl kkler dahil) zm */ #include <stdio.h> #include <math.h> int main() { float a, b, c, delta, x1, x2, x, kok_delta; printf("a, b, c degerlerini girin:\n"); scanf("%f %f %f",&a,&b,&c); delta = b*b - 4.0*a*c; if( delta > 0.0 ){ x1 = ( -b + sqrt(delta) )/( 2.0*a ); x2 = ( -b - sqrt(delta) )/( 2.0*a ); printf("\nReel kokler:"); printf("\nx1 = %f",x1); printf("\nx2 = %f",x2); } else if( delta < 0.0 ){ kok_delta = ( sqrt(-delta) ) / (2.0*a); x = -0.5*b/a; printf("\nKarmasik kokler:"); printf("\nx1 = %f + (%f)i", x, kok_delta); printf("\nx2 = %f - (%f)i", x, kok_delta); } else{ x = -0.5*b/a; printf("\nKokler eit:"); printf("\nx1 = x2 = %f",x); }
return 0;
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
6.3
switch - case
Yaps
Bu deyim bir deikenin ieriine bakarak, programn akn bir ok seenekten birine ynlendirir. case (durum) deyiminden sonra deikenin durumu belirlenir ve takip eden gelen satrlar (deyimler) ileme konur. Btn durumlarn aksi sz konu olduunda gerekletirilmesi istenen deyimler default deyiminden sonraki ksmda bildirilir. Genel yazm biimi:
switch(deiken) { case sabit1: ... deyimler; ... case sabit2: ... deyimler; ... . . . case sabitn: ... deyimler; ... default: ... hata deyimleri veya varsaylan deyimler; ... }
Program Program 6.4'te switch deyiminin basit bir kullanm gsterilmitir. Program 6.4: switch-case yapsnn kullanm
01: /* 06prg04.c: switch - case yapsnn kullanm 02: */ 03: 04: #include <stdio.h>
05: 06: int main(void) 07: { 08: char kr; 09: 10: printf("Lutfen bir karakter girin\n"); 11: 12: kr = getchar(); /* tek bir karakterin 13: okunmas */ 14: 15: switch (kr) 16: { 17: case 'a': 18: printf("a harfine bastiniz\n"); 19: case 'b': 20: printf("b harfine bastiniz\n"); 21: default: 22: printf("a veya b ye basmadiniz\n"); 23: } 24: 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
Lutfen bir karakter girin k a veya b ye basmadiniz
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,
Blm 7'de anlatlacak olan break deyimi ile yaplr. Derleyici bu deyim ile karlatnda, bulunduu yapnn iinden koulsuz olarak ayrlr ve takip eden ileme balar[1]. 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. Program 6.5: switch-case yaps ve break 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: 25: 26: 27: /* 06prg05.c: switch - case yaps ve break 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"); break; case 'b': printf("b harfine bastiniz\n"); break; default: printf("a veya b ye basmadiniz\n"); break; } return 0; }
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. Program 6.6: switch-case yaps ve break kullanm
01: /* 06prg06.c: switch-case yaps */ 02: 03: #include <stdio.h> 04: #include <stdlib.h>
05: 06: int main(void) 07: { 08: int secim; 09: float x,y, sonuc; 10: 11: printf("Iki sayi girin: "); 12: scanf("%f %f",&x,&y); 13: 14: puts("*** Menu ***"); 15: puts("[1] Toplama"); 16: puts("[2] Cikarma"); 17: puts("[3] Carpma"); 18: puts("[4] Bolme"); 19: 20: printf("Seciminiz: "); 21: scanf("%d",&secim); 22: 23: switch( secim ) 24: { 25: case 1: 26: sonuc = x + y; 27: printf("Toplam = %f\n",sonuc); 28: break; 29: case 2: 30: sonuc = x-y; 31: printf("Fark = %f\n",sonuc); 32: break; 33: case 3: 34: sonuc = x * y; 35: printf("Carpim = %f\n",sonuc); 36: break; 37: case 4: 38: sonuc = x/y; 39: printf("Oran = %f\n",sonuc); 40: break; 41: default: 42: puts("Yanlis secim !\a"); 43: } 44: 45: return 0; 46: }
IKTI
Iki sayi girin: 3 8 *** Menu *** [1] Toplama [2] Cikarma [3] Carpma [4] Bolme Seciminiz: 1 Toplam = 11.000000
IKTI
Iki *** [1] [2] [3] sayi girin: 3 8 Menu *** Toplama Cikarma Carpma
[4] Bolme Seciminiz: 7 Yanlis secim ! switch-case yaps if-else yapsnn bir alternatifidir. Yani, Program 6.6'daki switchcase ksm, if-else yaps ile de aadaki gibi yazlabilirdi. nceleyiniz. switch( secim ) { case 1: sonuc = x + y; printf("Toplam = %f\n",sonuc); case 2: %f\n",sonuc); case 3: %f\n",sonuc); case 4: %f\n",sonuc); break; sonuc = x-y; printf("Fark = break; sonuc = x * y; printf("Carpim = break; sonuc = x/y; printf("Oran = if(secim == 1){ sonuc = x + y; printf("Toplam = %f\n",sonuc); } else if(secim == 2){ sonuc = x-y; printf("Fark = %f\n",sonuc); } else if(secim == 3 ){ sonuc = x * y; printf("Carpim = %f\n",sonuc); } else if(secim == 4){ sonuc = x/y; printf("Oran = %f\n",sonuc); } else{ puts("Yanlis secim !\a"); }
6.4
Karlatrma Operatr
Bu operatr, if-else karlatrma deyiminin yapt ii snrl olarak yapan bir operatrdr. Genel yazm biimi:
(koul) ? deyim1 : deyim2;
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 ve deyim2 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:
if( a > b ) else x = a; x = b;
eklinde olacaktr. Program 6.7 ? karlatrma operatrnn basit bir kullanmn gstermektedir. Program 6.7: ? ve if kullanm
01: /* 06prg07.c: ? ve if-else yapsnn kullanm 02: */ 03: 04: #include <stdio.h>
05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
int main(void) { float x, y, z; printf("x : "); scanf("%f",&x); printf("y : "); scanf("%f",&y); if(y) /* y, 0'dan farkl m? */ 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;
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*y deeri atanmaktadr. Eer y = 0 ise z deikenine 0 deeri atanmaktadr.
Ders 7: Dngler
###################- (%95)
Giri 7.1 while Dngs 7.2 do ... while Dngs 7.3 for Dngs
7.4 ie Gemi Dngler 7.5 Sonsuz Dng 7.6 break Deyimi 7.7 continue Deyimi
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.
7.1
while
Dngs
Tekrarlama deyimidir. Bir kme ya da deyim while kullanlarak bir ok kez yinelenebilir. Yinelenmesi iin koul snamas dngye girilmeden yaplr. Koul olumlu olduu srece evrim yinelenir. Bu deyimin kullanm Program 7.1 de gsterilmitir. Genel yazm biimi:
while(koul) { ... dngdeki deyimler; [kme] ... }
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.
7.2
do ... while
Dngs
Bu deyimin while deyiminden fark, koulun dng sonunda snanmasdr. Yani koul snanmadan dngye girilir ve dng kmesi en az bir kez yrtlr. Koul olumsuz ise dngden sonraki satra geilir. Bu deyimin kullanm Program 7.2 de gsterilmitir. Genel yazm biimi:
do{ ... dngdeki deyimler; ... }while(koul);
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.
7.3
for
Dngs
Bu deyim, dier dng deyimleri gibi bir kmeyi bir ok kez tekrarlamak iin kullanlr. Koul snamas while da olduu gibi dngye girmeden yaplr. Bu dng deyimin iinde dierlerinden farkl olarak balang deeri ve dng sayacna sahip olmasdr. Bu deyimin kullanm Program 7.3 de gsterilmitir Genel yazm biimi:
for( balang ; koul ; artm ) { ... dngdeki deyimler; ... }
/* n! = 1 x 2 x 3
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? Cevap iin bkz: Blm 2. Program 7.3'de dngye girilmeden, faktor = 1 atmas yaplmtr.
faktor = 1; for(i=1; i<=n; i++) faktor *= i;
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 (taban-16) 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
02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
basamakl, basamaklarnn kpleri toplam kendisine eit olan tam saylara Armstrong say denir. rnein: 371 = 3^3 + 7^3 + 1^3. Bu program -ie gemi 3 dng ile btn Aramstrong saylar bulur. */ #include <stdio.h> int main() { int a,b,c, kup, sayi, k=1; for(a=1; a<=9; a++) for(b=0; b<=9; b++) for(c=0; c<=9; c++) { sayi = 100*a + 10*b + c; abc ( basamakl) */ kup = a*a*a + b*b*b + c*c*c; a^3+b^3+c^3 */
/* sayi = /* kup =
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.
for
istee baldr. Her hangi biri verilmediinde dngnn nasl davranaca iyi yorumlanmaldr. rnein for dngsnn hibir parametresi verilmezse, dng sonsuz evrime girer. Yani:
for(;;) printf("Sonsuz dng iindeyim...\n");
gibi.
7.6
break
Deyimi
Bir C programnda, bir ilem gerekletirilirken, ilemin sona erdirilmesi bu deyim ile yaplr. rnein, dng deyimleri iindekiler yrtlrken, evrimin, kouldan bamsz kesin olarak sonlanmas gerektiinde bu deyim kullanlr. Mesela:
... do{ scanf("%d",&x); if(x==0) break; printf("%f",1.0/x); }while(1); ...
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
hesaplanacak sayi girin : 2 hesaplanacak sayi girin : 3 hesaplanacak sayi girin : 5 hesaplanacak sayi girin : 9 hesaplanacak sayi girin : 0 hesaplanacak sayi girin : -4
7.7
continue
Deyimi
Bir dng ierisinde continue deyimi ile karlalrsa, ondan sonra gelen deyimler atlanr ve dng bir sonraki evrime girer. rnein:
... for(x=-50;i<=50;x++) { if(x<0) continue; /* x<0 ise alttaki satr atla */ printf("%d\t%f",x,sqrt(x)); } ...
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: /* 07prg07.c: 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 )
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)
Giri 8.1 Fonksiyon Kavram 8.2 Fonksiyon Bildirimi 8.3 Geri Dn Deerleri 8.4 void Fonksiyonlar 8.5 Fonksiyon Parametreleri 8.6 Yapsal Programlama 8.7 Makro Fonksiyon Tanmlamas
Giri
C Programlama Dili fonksiyon olarak adlandrlan alt programlarn birletirilmesi kavramna dayanr. Bir C program bir yada daha ok fonksiyonun bir araya gelmesi ile oluur. Bu zellik btn Yapsal Diller'in (C, Fortran, Pascal, ...) temelini oluturur. Yapsal Diller'e hakim olmak iin fonksiyon oluturmay ve kullanmay iyi renmek gerekir. Bu blmde, C Programlama Dili'ndeki fonksiyon kavram, sonraki blmde (Blm 9) esnek argmanl fonksiyonlar ve main() fonksiyonu irdelenecektir.
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
/* 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);
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 a,b,toplam); } return 0; %d dir.\n", /*** fonksiyon prototipi
/*** fonksiyon tanmlanmas ***/ /* Bu fonksiyon iki tamsayy toplar */ int topla( int x, int y ) { int sonuc; sonuc = x + y; return sonuc; }
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 a,b,toplam); } return 0; %d dir.\n",
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 harf fonksiyonunda 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 } ) ) ) ) ) return return return return return 'F'; 'D'; 'C'; 'B'; 'A';
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:
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 return deyimi 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
8.4
void
Fonksiyonlar
Bir fonksiyonun her zaman geri dn deerinin olmas gerekmez. Bu durumda return deyimi kullanlmayabilir. Eer bu anahtar kelime yoksa, fonksiyon ana blou bitince kendiliinden sonlanr. Byle fonksiyonlarn tipi void (bo, hkmsz) olarak belirtilmelidir. Bu tip fonksiyonlar baka bir yerde kullanlrken, herhangi bir deikene atanmas sz konusu deildir, nk geri dn deeri yoktur. Ancak, void fonksiyonlara parametre aktarm yapmak mmkndr. Program 8.3'de void fonksiyona rnek olarak bankamatik fonksiyonu ve kullanm gsterilmitir. Bu fonksiyon kendisine parametre olarak gelen YTL cinsinden para miktarn 20, 10 ve 5 YTL'lik birimler halinde hesaplar. Girilen miktar 5 YTL'nin bir kat deilse,
ekrana uygun bir mesaj gnderir. bankamatik fonksiyonu bir dizi hesap yapmasna ramen geriye hi bir deer gndermez. Program 8.3: void tipinde bir fonksiyon 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: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: /* 08prg03.c: Basit bankamatik simulasyonu. stenen para miktarn 20, 10 ve 5'lik birimlere bler ve sonucu ekrana gsterir. */ #include <stdio.h> void bankamatik(int para) { int a,yirmilik,onluk,beslik; a = para; if(a%5==0) { yirmilik = a/20; a -= yirmilik*20; onluk = a/10; a -= onluk*10; beslik = a/5; a -= beslik*5; printf("\nYirmilik = %d",yirmilik); printf("\nOnluk = %d",onluk); printf("\nBeslik = %d\n",beslik); } else printf("Girilen miktar 5 YTL ve katlari olmali!\a\n"); /* return deyimi yok !*/ } int main() { int miktar; printf("Cekilecek para miktari (YTL) = "); scanf("%d",&miktar); bankamatik(miktar); /* fonksiyon bir deikene atanmam ! */ } retrun 0;
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"); } } int main(){ kutu_ciz(8,35); } return 0; printf("\n");
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;
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
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. Program 8.5: bir fonksiyonun baka bir fonksiyon tarafndan arlmas
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: /* 08prg05.c: Verilen bir tarihin yln kanc gn olduunu hesaplar. */ #include <stdio.h> int yilin_gunu(int, int, int); int artik_yil(int); int main(void) { int gun = 1; int ay = 8; int yil = 2003;
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; }
30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
/* 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+1 veya 28+0 */ case 1: ygun } } return ygun;
+= += += += += += += += += += +=
31; 30; 31; 30; 31; 31; 30; 31; 30; 31; 28 + artik_yil(yil);
/*
+= 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. Makro fonksiyon tanmlamalar Blm 20'de tekrar ele alnacaktr. Basit bir makro fonksiyon uygulamas Program 8.6'da gsterilmitir. buyuk(a,b) makrosu a>b ise a deerini aksi halde b deerini gnderir. Program 8.6: Makro fonksiyon uygulamas
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: /* 08prg06.c: makro fonksiyon uygulamas */ #include <stdio.h> #define buyuk(a,b) ( (a>b) ? a:b) int main() { int x,y,eb; printf("iki say girin: ");
12: scanf("%d,%d",&x,&y); 13: 14: eb = buyuk(x,y); 15: 16: printf("buyuk olan %d\n",eb); 17: 18: return 0; 19: }
IKTI
iki say girin: 8,6 buyuk olan 8
Giri 9.1 Esnek Argmanl Fonksiyonlar 9.2 main Fonksiyonu 9.3 main Fonksiyonuna Parametre Aktarm 9.4 Komut Satr rnekleri
Giri
Bu ksmda, esnek argmanl fonksiyonlar, main() fonksiyonu ve komut satrndan main() fonksiyonuna parametre aktarm incelenektir.
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 iin iki temel kural vardr: 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, ...) { }
Giri 24.1 Uygulama Alanlar 24.2 Rastgele Saylar 24.3 ANSI C Fonksiyonlar 24.4 Basit Monte Carlo Programlar
Giri
Bilimsel uygulamalarda problemler iki ksmda incelenebilir: kesin = deterministik (deterministic) tahmini = olas (random).
Kesin sistemler, kurallar kanun hkmnde olan matematiksel yasalarla tanmlanabilen sistemlerdir; rnein yerekimi yasas gibi. Fakat, tahmini sistemlerin kurallar muhtemel veya raslantsal (stocastic) olan istatiksel yntemlerle belirlenir; rnein havaya atlan bir metal parann yaz veya tura gelmesi gibi. Burada raslantdan kast, tahmini sistemlerde, balang koullar kesin olarak tayin edilemedii iin sonuca dair zmn tahmin edilmesi anlamndadr. Yoksa, evrende raslantya yer yoktur. Bilgisayar ortamnda, yazlmsal (veya donanmsal) olarak rastgele saylar (random numbers) retmek mmkndr. Monte Carlo Yntemleri, bu rastgele saylar kullanarak tahmini sistemleri modelleyen algoritmalardr. Aslnda, Monte Carlo, (Fransa) Monako'nun kumarhaneleriyle nl en zengin yerleim yeridir. (bkz. Wikipedia: Monte Carlo). Bu yzden, tahmini sistemlerin modellenmeside kullanlan saysal analiz yntemlerine Monte Carlo (ksaca MC) ismi verilmitir. Bu blmde, yazlmsal olarak retilen Rastgele Saylar ve Saysal Analiz'de kullanlan basit Monte Carlo Yntemleri konu edilecektir.
[Fizik] Atom ve Molekl Fizii, Nkleer Fizik ve zellikle Yksek Enerji Fizii modellerini test eden simlasyonlar [Mhendislik] Deneysel aletlerin (rnein detektr) simlasyonu [Biyoloji] Hcre Similasyonu [Ekonomi] Borsa Modelleri [statistik] Dalm Fonksiyonlar Rastgele Say retmeyi ve kullanmay Basit MC programlarn oluturmay leri dzeyde hazrlanan MC retelerini ve programlar kullanmay
Bilgisayarlar kesin (deterministic) bir yapda altklar iin gerek anlamda rastgele say retemezler. Ancak, uygun algoritmlarla bir bilgisayarn dzgn bir dalmdan seilen ve genllikle [0,1] arasnda gerel deerler alan rastgele say retmesi salanabilir. Bilgisayarlarn rettii bu rastgele saylar yalanc rastgele say (pseudo-random numbers) olarak adlandrlr. Rastgele say reten bu algoritmalara rastgele say reteci (random number generator) denir. Gnmz derleyicilerinin bir ounda rastgele say reteleri iin hazr ktphane fonksiyonlar tanmlanmtr. Bu fonksiyonlar genellikle dorusal bir denklem kullanarak, rastgele say dizisi retir. 32-bit makinalarda, dizinin peryodu en az 231 ~ 109 (1 milyar) dur. Yani, bir rastgele say reteci birbirinden farkl 1 milyar farkl say retebilir. Bu kadar ok say gnmz bilgisaylarnda bir ka saniyede kolaylkla oluturulabilir. Rastgele say dizisini oluturacak dorusal denklemin genel biimi yledir: xn+1 = ( a xn + b ) mod m burada mod modler aritmetik ilemi anlamndadr. Dizinin ilk eleman, xo, ekirdek (seed) olarak adlandrlr. a ve b sabitleri, dizi elemanlar kargak ve dzgn dalacak ekilde seilir. 1960 ylnda IBM irketi aadaki mehur RANDU algoritmasn kullanmtr (a = 69069, b = 0):
xn+1 = ( 69069 xn ) mod 231-1 Daha sonra Park ve Miller, aadaki Minimal Standart algoritmasn nermitir (a = 16807, b = 0): xn+1 = ( 16807 xn ) mod 231-1 Park-Miller algoritmas ile oluturulan rastgele say reteci, aadaki C fonksiyonu ile kotarlabilir:
/* * Park-Miller algoritmas ile [0,1] arasnda * dzgn dalm rastgele say retir. */ float rastgele(int *cekirdek) { const int im = 2147483647, ia = 16807; const int iq = 127773, ir = 2836; const float m = 128.0/im; int k; float r; k = *cekirdek / iq; *cekirdek = ia*(*cekirdek-k*iq) - ir*k; if(*cekirdek < 0) *cekirdek += im; r = m * (*cekirdek/128); } return r;
Program 24.1'de, rastgele() fonksiyonu kullanlarak 10 say retilmitir. Program her altrldnda ayn saylar retilecektir. Bunun nedeni kmenin ilk eleman ilk_sayi sabit olmasdr. Program 24.1: 10 rastgele say
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: /* 24prg01.c rastgele() fonksiyonu ile 10 adet [0-1] arasnda rastgel say retir */ #include <stdio.h> float rastgele(int *); int main() { int ilk_sayi, i; float r; /* dizinin ekirdei (seed) */ ilk_sayi = 123456789; for(i=1; i<=10; i++){ r = rastgele( &ilk_sayi ); printf("%f\n",r); } } /* return 0;
27: * Park-Miller algoritmas ile [0,1] arasnda 28: * dzgn dalm rastgele say retir. 29: */ 30: float rastgele(int *cekirdek) 31: { 32: const int im = 2147483647, ia = 16807; 33: const int iq = 127773, ir = 2836; 34: const float m = 128.0/im; 35: int k; 36: float r; 37: 38: k = *cekirdek / iq; 39: *cekirdek = ia*(*cekirdek-k*iq) - ir*k; 40: 41: if(*cekirdek < 0) *cekirdek += im; 42: 43: r = m * (*cekirdek/128); 44: 45: return r; 46: }
IKTI
0.218418 0.956318 0.829509 0.561695 0.415307 0.066119 0.257578 0.109957 0.043829 0.633966
int rand(void) 0 ile RAND_MAX arasnda tamsay tipinde yalanc rastgele say retilir. RAND_MAX, stdlib.h'de tanml sembolik bir sabittir. Deeri (derleyiciye bal olarak) en byk int limiti ile snrldr. Bu deer Turbo C (16-bit) derleyicisinde: #define RAND_MAX #define RAND_MAX 32767 2147483647
void srand(unsigned int cekirdek) Rastgele say reteci (rand()) iin cekirdek
deerini belirler.
04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18:
#include <stdio.h> #include <stdlib.h> int main() { int i; /* rand fonksiyonu */ for(i=1; i<=10; i++) printf("%d\n",rand()); printf("RAND_MAX = %d\n",RAND_MAX); return 0; }
IKTI
1804289383 846930886 1681692777 1714636915 1957747793 424238335 719885386 1649760492 596516649 1189641421 RAND_MAX = 2147483647
Program 24.3:
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: /* 24prg03.c rand() ile 10 adet [0,1] arasnda rastgele gercel say retir */ #include <stdio.h> #include <stdlib.h> int main() { int i; /* rand fonksiyonu */ for(i=1; i<=10; i++) printf("%f\n",(float) rand()/RAND_MAX); printf("RAND_MAX = %d\n",RAND_MAX); return 0; }
IKTI
0.840188 0.394383 0.783099 0.798440
Program 24.4:
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: /* 24prg04.c rand() ile 10 adet rastgele gercel say retir */ #include <stdio.h> #include <stdlib.h> int main() { int i, cekirdek; /* cekirdei deitir */ cekirdek = 31415926; srand(cekirdek); /* rand fonksiyonu */ for(i=1; i<=10; i++) printf("%f\n", (float) rand()/RAND_MAX); return 0; }
IKTI
0.474201 0.796722 0.873683 0.191069 0.541366 0.672161 0.454705 0.901691 0.926034 0.197616
Program 24.5:
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: /* 24prg05.c rand() ile 10 adet rastgele gercel say retir */ #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int i, cekirdek;
13: /* cekirdei time fonksiyonundan se. 14: Bu sayede program her altnda farkl 15: kme retir. */ 16: cekirdek = time(NULL); 17: srand(cekirdek); 18: 19: /* rand fonksiyonu */ 20: for(i=1; i<=10; i++) 21: printf("%f\n", (float) rand()/RAND_MAX); 22: return 0; }
IKTI
0.789827 0.934420 0.980876 0.453894 0.115219 0.993930 0.945253 0.023599 0.851912 0.334151
Uygulama 1: Yaz-Tura Simlasyonu Uygulama 2: Zar Simlasyonu Uygulama 3: MC ile Pi saysnn hesab
Uygulama 1: Yaz-Tura Simlasyonu Hilesiz bir para atldnda, yaz veya tura gelme olasl (P, probability) eit ve kuramsal olarak P = 1/2 dir. Dnn ki bir para n kez atlsn ve gelen turalar sayp ve t ile gsterelim. Deney says, n, arttka t/n oran kararl (sabit) kalmaya balar. Bu durumda, olasln istatiksel tanm yle yaplr: P(t) = t/n n sonsuza giderken P(t) deeri P = 1/2 deerine yaklar.
imdi, [0, 1] aralndan rastgele seilen saylar kullanarak, para atma deneyini yapalm. Rastgele say reteleri saylar eit olaslkla retir. r bir rastgele say olsun. r < 0.5
durumuna tura, r >= 0.5 durumuna da yaz diyelim. Bu ekilde, bir dng kullanarak deney saysna (n) gre, yaz-tura simulasyonu yaplabilir. Program 24.6, klavyeden girilen n'ye gre, P(t) ve 1 - P(t) olaslklarn hesaplar. Program 24.6: Yaz-Tura Simulasyonu
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: /* 24prg06.c MC Yaz-Tura Simulasyonu */ #include <stdio.h> #include <stdlib.h> #include <time.h> /* [0, 1] aras rastgele say gnderir */ double rastgele(){ double r = (double) rand()/RAND_MAX; return r; } int main() { int i, tura, yazi, n; double r, p; /* deney says */ printf("deney sayisini girin: "); scanf("%d",&n); /* rastgele say retecini balat */ srand( time(NULL) ); /* deneyleri balat */ for(tura=0, i=1; i<=n; i++){ r = rastgele(); if(r<0.5) tura++; } p = (double) tura/n; yazi = n-tura; /* sonular ekrana */ printf("tura sayisi: %d\n",tura); printf("yazi sayisi: %d\n",yazi); printf("Olasiliklar: %lf %lf\n",p, 1.0-p); } return 0;
IKTI
deney sayisini girin: 150 tura sayisi: 76 yazi sayisi: 74 Olasiliklar: 0.506667 0.493333
Program 24.7'de deney says (n) bir d dngye balanarak, 10'un katlar (10, 100, 1000, ...) olarak deitirilmitir. Programn kts srasyla, n, gelen tura says, gelen yaz says ve tura ve yaz olaslklardr. n bydke, p'nin 0.5'e yaklatna dikkat edin. Program 24.7: Yaz-Tura Simulasyonu
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:
/* 24prg07.c MC Yaz-Tura Simulasyonu */ #include #include #include #include <stdio.h> <stdlib.h> <time.h> <math.h>
/* [0, 1] aras rastgele say gnderir */ double rastgele(){ double r = (double) rand()/RAND_MAX; return r; } int main() { int i, j, tura, yazi, n; double r, p; /* rastgele say retecini balat */ srand( time(NULL) ); for(j=1; j<=8; j++){ /* deney says 10'un katlar */ n = pow(10, j); /* deneyleri balat */ for(tura=0, i=1; i<=n; i++){ r = rastgele(); if(r<0.5) tura++; } p = (double) tura/n; yazi = n-tura; /* sonular ekrana */ printf("%9d : %9d %9d | %10.7lf %10.7lf\n",n, tura, yazi, p, 1.0-p); } } return 0;
IKTI
10 100 1000 10000 100000 1000000 10000000 100000000 : : : : : : : : 7 39 530 5006 50116 500200 5002805 49996285 3 61 470 4994 49884 499800 4997195 50003715 | | | | | | | | 0.7000000 0.3900000 0.5300000 0.5006000 0.5011600 0.5002000 0.5002805 0.4999629 0.3000000 0.6100000 0.4700000 0.4994000 0.4988400 0.4998000 0.4997195 0.5000372
Uygulama 2: Zar Simlasyonu Bu uygulamada, bir ift zar atm modellenecektir. Bu, bir ok tavla programnda kullanlan yntemdir. Bir ift zar atlyor. Zarlarn toplamnn 7 olma olasln bulan bir program
yazalm (Program 24.8). Zar, [1, 6] arasnda rastgele tamsay deeri alr. Buna gre, r [0,1] arasnda rastele gerel say ise, bir zarn MC modeli: zar = 1 + tamsay(6*r) eklinde olur. Neden?
/* [0, 1] aras rastgele say gnderir */ double rastgele(){ double r = (double) rand()/RAND_MAX; return r; } int main() { int i, j, n, zar1, zar2, yedi; double p; /* rastgele say retecini balat */ srand( time(NULL) ); for(j=1; j<=8; j++){ /* deney says 10'un katlar */ n = pow(10, j);
42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: p); }
/* deneyleri balat */ for(yedi=0, i=1; i<=n; i++) { /* iki adet rastgele say */ zar1 = 1 + (int) 6.0*rastgele(); zar2 = 1 + (int) 6.0*rastgele(); if( (zar1+zar2) == 7 ) yedi++; } p = (double) yedi/n; /* sonular ekrana */ printf("%9d : %9d | %10.7lf\n",n, yedi,
return 0; }
IKTI
10 100 1000 10000 100000 1000000 10000000 100000000 : : : : : : : : 1 20 151 1617 16730 166931 1666210 16663659 | | | | | | | | 0.1000000 0.2000000 0.1510000 0.1617000 0.1673000 0.1669310 0.1666210 0.1666366
Uygulama 3: MC ile Pi saysnn hesab Yanda verilen ekildeki gibi bir karenin iine teet olarak yerletirilmi bir ember dnelim. Karenin bir kenar 2 birim veya emberin yarap R = 1 birim olsun (birim ember). Karenin iinde, koordinatlar (x, y) olan rastgele bir Q noktas seilsin. Q noktasnn koordinatlar x2 + y2 <= 1 eklinde seilmise, Q noktas emberin iinde, aksi halde nokta emberin dsnda demektir. Bu kurumda, Q noktasnn emberin iinde kalma ihtimali yle olur:
Karenin ii n adet rastgele noktalarla doldurulsun. Eer bu n noktann, m tanesi emberin iinde kalrsa, herhangi bir noktann emberin iinde kalma ihtimali yaklak olarak:
(yaklak olarak)
eklinde hesaplanabilir. Olayn canlandrlmas adna, aada nokta saysnn (n) farkl deerleri iin oluabilecek desenler gsterilmitir.
n = 10 nokta
n = 100 nokta
n = 200 nokta
Program 24.9'da, MC yntemi ile pi saysnn hesab gsterilmitir. Program ayrca, hesaplanan pi ile math.h'de tanml sabit M_PI arasndaki hatann yzde olarak karln da ekranda gsterir. Program kts incelendiinde, hata n = 10 iin yzde 10, n = 1 milyar iin yzbinde 2 civarndadr. Program 24.9: MC ile Pi saysnn hesab
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: /* 24prg09.c: MC Yntemi ile pi saysnn hesaplanmas */ #include #include #include #include <stdio.h> <stdlib.h> <time.h> <math.h>
/* [0, 1] aras rastgele say gnderir */ double rastgele(){ double r = (double) rand()/RAND_MAX; return r; } int main() { int i, j, n, m; double x, y, pi, hata; /* rastgele say retecini balat */ srand( time(NULL) );
23: for(j=1; j<=8; j++){ 24: 25: /* deney says 10'un katlar */ 26: n = pow(10, j); 27: 28: /* deneyleri balat */ 29: for(m=0, i=1; i<=n; i++) 30: { 31: /* [-1, 1] aralnda iki adet rastgele 32: say */ 33: x = -1 + 2.0*rastgele(); 34: y = -1 + 2.0*rastgele(); 35: if( x*x + y*y < 1.0 ) m++; 36: } 37: 38: /* deney sonucu hesaplanan pi */ 39: pi = (double) 4.0*m/n; 40: 41: /* hesaplanan ve gerek pi arasndaki 42: yzde mutlak hata */ 43: hata = 100.0*fabs(pi-M_PI)/M_PI; 44: 45: /* sonular ekrana */ 46: printf("%9d : %9d | pi = %10.7lf , 47: yuzde hata = %%%10.7lf\n", 48: n, m, pi, hata); 49: } } return 0;
IKTI
10 100 1000 10000 100000 1000000 10000000 100000000 1000000000 : : : : : : : : : 7 78 794 7878 78625 785728 7853164 78536996 785380671 --> --> --> --> --> --> --> --> --> pi pi pi pi pi pi pi pi pi = = = = = = = = = 2.8000000 3.1200000 3.1760000 3.1512000 3.1450000 3.1429120 3.1412656 3.1414798 3.1415227 , , , , , , , , , yuzde yuzde yuzde yuzde yuzde yuzde yuzde yuzde yuzde hata hata hata hata hata hata hata hata hata = = = = = = = = = %10.8732319 % 0.6873155 % 1.0952199 % 0.3058113 % 0.1084592 % 0.0419961 % 0.0104104 % 0.0035910 % 0.0022272