You are on page 1of 74

indekiler

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)

En son gncelleme: Fri, 03 Jul 2009 16:40:45 +0300


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

#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[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

Daha fazla bilgi iin bkz. Blm 5.

1.4 Balk Dosyalar


C dilinde bir program yazlrken, balk dosyas (header file) olarak adlandrlan bir takm dosyalar #include nilemcisi kullanlarak program iine dahil edilir. C ktphanesinde bulunan birok fonksiyon, balk dosyalar iindeki baz bildirimleri kullanr. Bu tr dosyalarn uzants .h dir. ANSI C'deki standart balk dosyalar unlardr:
assert.h ctype.h errno.h float.h limits.h locale.h math.h setjmp.h signal.h stdarg.h stddef.h stdio.h stdlib.h string.h time.h

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

eklinde bir hata mesaj ile karlalr.

1.5 Kaynak Kodunun Derlenmesi


C programlar veya kaynak kodlar (source code) uzants .c olan dosyalarda saklanr. Kaynak kod, bir C derleyicisi (C compiler) ile nesne koduna (object code) daha sonra uygun bir balayc (linker) program ile iletim sistemininde altrlabilen (executable) bir koda dntrlr. Derleme ilemi ayrntl olarak Blm 22'de anlatlmtr. Baz iletim sistemleri ile kullanlan C Derleyicileri ve bu derleyicilerde ilk.c programnn komut satrnda nasl derlenecei Tablo 1.1'de verilmitir. Eer ismi geen derleyicinin bir editr varsa ilk.c bu editr de derlenebilir. Tablo 1.1: letim sistemleri, baz derleyiciler ve derleme komutlar letim Sistemi Derleyici Derleme altrma

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

ilk.exe ilk.exe ilk.exe ilk.exe ilk.exe ./ilk 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

DERLEME ve ALITIRMA MS DOS (Turbo C)


C:\TC> tcc ilk.c C:\TC> ilk.exe ilk.c

nin kts:

IKTI
Merhaba Dnya!

1.6 C Kodlarnn Temel zellikleri


Bir C program aada verilen zellikleri mutlaka tamaldr.

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.

1.7 Kod Yazm iin Baz Tavsiyeler


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;

Sabitlerin btn harflerini byk harfle yazn. rnein:


#define PI 3.14; const int STATUS=0x0379;

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;

x[k] = 1.0/k; }while(k!=0); } }

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.

Ders 2: Veri Tipleri, Deikenler ve Sabitler

###################- (%95)

En son gncelleme: Fri, 03 Jul 2009 16:40:45 +0300


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.

2.1 Veri Tipleri


Veri tipi (data type) program iinde kullanlacak deiken, sabit, fonksiyon isimleri gibi tanmlayclarn tipini, yani bellekte ayrlacak blgenin bykln, belirlemek iin kullanlr. Bir programc, bir programlama dilinde ilk olarak renmesi gereken, o dile ait veri tipleridir. nk bu, programcnn kullanaca deikenlerin ve sabitlerin snrlarn belirler. C programlama dilinde drt tane temel veri tipi bulunmaktadr. Bunlar:
char int float double

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",

IKTI Windows (32 bit) Turbo C


char short int long unsigned char unsigned short unsigned int unsigned long float double long double : : : : : : : : : : : 1 bayt 2 bayt 2 bayt 4 bayt 1 bayt 2 bayt 2 bayt 4 bayt 4 bayt 8 bayt 10 bayt

Windows (32 bit) Salford


char short int long unsigned char unsigned short unsigned int unsigned long float double long double : : : : : : : : : : : 1 bayt 2 bayt 4 bayt 4 bayt 1 bayt 2 bayt 4 bayt 4 bayt 4 bayt 8 bayt 10 bayt

Linux (32 bit) GCC


char short int long unsigned char unsigned short unsigned int unsigned long float double long double : : : : : : : : : : : 1 bayt 2 bayt 4 bayt 4 bayt 1 bayt 2 bayt 4 bayt 4 bayt 4 bayt 8 bayt 12 bayt

Linux (64 bit) GCC


char : 1 bayt short : 2 bayt int : 4 bayt long : 8 bayt unsigned char : 1 bayt unsigned short : 2 bayt unsigned int : 4 bayt unsigned long :

8 bayt float : 4 bayt double : 8 bayt long double : 16 bayt

veritipi ve trevleri ile hesaplanabilecek en kk ve en byk tamsaylar iin aadaki forml kullanlabilir:
int

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. Tablo 2.1: Deiken tipleri ve bellekte kapladklar alanlar Bellekte igal ettii Veri Tipi Aklama Alt snr boyut (bayt) char Tek bir -128 karakter veya unsigned 1 kk 0 char tamsay iin short int -32,768 Ksa tamsay unsigned 2 iin 0 short int
int unsigned int long int long int float

st snr 127 255 32,767 65,535 2,147,483,647 4,294,967,295

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)

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

-3.4e +/- 38

double

-1.7e +/- 308

+1.7e +/- 308

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:

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

2.4 Rakamsal Bilgiler


C programlama dili iinde tanmlanabilecek sabit rakamlar rakamsal bilgi (literal) olarak adlandrlr. Her veri tipi kendi rakamsal bilgisine sahiptir. Bu bilgiler, kaynak kod ierisinde, zel deerleri ifade eder. rnein aadaki atama ileminde 25 ve 17.2 saylar gibi:
i = 25; r = 17.2; /* 25, int tipinde bir rakamsal bilgidir */ /* 17.2, double tipinde bir rakamsal bilgidir */

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 */ */ */ */ */

r = 17.2; /* double r = 17.2L; /* long double r = 17.2F; /* float

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

2.5 Deiken Bildirim Yerleri ve Trleri


Yerel (local) Bildirim

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; }

2.6 Tip Dnmleri


Bir forml ierisinde bir ok deiken veya sabit olabilir. Bu deiken ve sabitler birbirinden farkl tipte olursa, hesap sonucunun hangi tipte olaca nemlidir. Bir bantda, ierii dnme urayan deikenler eski ieriklerini korurlar. Dntrme ilemi iin geii bellek alan kullanlr; dntrlen deer kullanldktan sonra o alan serbest braklr.
char kr; int tam; long int ltam; unsigned int utam; short int stam; float f; double d;

bildirimlerine gre:
Bant ------kr+5 kr+5.0 d+tam f+d-2 utam-tam Sonu Tipi ---------int double double double unsigned

ltam*tam tam/2 tam/2.0

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
###################- (%95)

En son gncelleme: Fri, 03 Jul 2009 16:40:45 +0300


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.

3.1 Aritmetik Operatrler


Deiken veya sabitler zerinde temel aritmetik ilemleri gerekleyen operatrlerdir. Bunlar Tablo 3.1'de listelenmitir. Tablo 3.1: Aritmetik Operatrler Operatr
+

Aklama toplama

rnek
x + y

Anlam x ve y nin toplam

* / %

karma carpma blme artk blme

x x x x

* / %

y y y y

x ve y nin fark x ve y nin arpm x ve y nin oran x / y den kalan say

3.2 Atama Operatrleri


Bu operatrler bir deikene, bir sabit vaya bir aritmetik ifade atamak (eitlemek) iin kullanlr. Birleik atama: baz ifadelerde ilem operatr ile atama operatr birlikte kullanlarak, ifadeler daha ksa yazlabilir. Eer ifade
deiken = deiken [operatr] aritmetik ifade;

eklinde ise, daha ksa bir biimde


deiken [operatr]= aritmetik ifade;

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

veya ++x veya --x

Bu tanmlamalara gre, aadaki atamalar inceleyiniz:


/* bir arttrma ilemleri */ i++; ++i; i += 1; i = i + 1; /* karmak atamalar */ f *= i; // f = f * i; anlamnda f *= i+1; // f = f * (i+1); anlamnda z /= 1 + x; // z = z / (1+x); anlamnda

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

Program 3.1: Aritmetik ve atama operatrlerinin kullanm


01: /* 03prg01.c: Aritmetik ve atama operatorlerinin 02: kullanimi */ 03: 04: #include <stdio.h> 05: 06:

07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:

main() { int x, y; */ x = 1; y = 3; /* /*

/* yerel degikenlerin bildirimi x in baslangic degeri */ y nin baslangic degeri */

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));

%d\n",sizeof(char)); %d\n",sizeof(c)); %d\n",sizeof(str));

IKTI
sizeof(int) sizeof(i) sizeof(dizi) = 4 = 4 = 20

sizeof(double)= 8 sizeof(d) = 8 sizeof(mizan) = 48 sizeof(char) sizeof(c) sizeof(str) = 1 = 1 = 5

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.

Ders 4: Temel Giri/k Fonksiyonlar


###################- (%95)

En son gncelleme: Fri, 03 Jul 2009 16:40:45 +0300


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); ....

gibi kullanlr. Bu program parasnn ekran kts yle olacaktr:


x in deeri 12 dir

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 \" \'

II. Konrol karakterleri (escape squence): deikenlerin ve sabitlerin nasl yazlacan

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

Yazdrlacak veri tipi


char char int, short long unsigned int, unsigned short unsigned long float double

Tip karakterlerini kullanarak, birden ok veri tipi yazdrlabilir. rnein:


not= 12; pi = 3.14; kr = 'A';

printf(" not = %d , pi = %f ve kr = %c dir", not, pi, kr); ...

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:

fonksiyonu kullanm Program 4.1'de verilmitir.

Program 4.1: printf() fonksiyonunun kullanm


/* 04prg01.c Saysal deerleri ekrana yazdrmak iin printf fonksiyonunun kullanm */ #include <stdio.h> main() { int a = 2, b = 10, c = 50; float f = 1.05, g = 25.5, h = -0.1, yuzde; printf("3 tamsayi c); : %d %d %d\n", a, b,

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

Program 4.2: printf() fonksiyonunun kullanm


01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: /* 04prg02.c printf fonksiyonunun geri dn deerini gsterir */ #include <stdio.h> int main() { int karSay; int sayi = 1234; karSay = printf("Ugurlu sayim = %d\n",sayi); printf("Ust satirda karakter sayisi: %d dir\n", karSay); return 0; }

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

puts("Sevgi varln mayasdr.");

kullanmlar edeerdir.
puts()

fonksiyonu Tablo 4.1 de verilen kontrol karakterleri ile kullanlabilir.

puts("Bu birinci satr...\nBu ikinci satr."); Bu birinci satr... Bu ikinci satr.

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 */

program parasnn ekran kts yledir: 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 */

program paras altrldnda aadaki sonu gzlenir: IKTI


123.456001 123.46

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);

printf("%10.5f\n",x); printf("%10.1f\n",y); return 0; }

IKTI
1299 Merhaba C 7324.25000 244.5

Ders 5: Temel Ktphane Fonksiyonlar


##################-- (%90)

En son gncelleme: Fri, 03 Jul 2009 16:40:45 +0300


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.

5.1 Matematiksel Fonksiyonlar (math.h)


Matematiksel fonksiyonlarn hemen hemen hepsi double veri tipindedir. Bu fonksiyonlardan biri program iinde kullanlacaksa math.h balk dosyas program iine eklenmelidir. En ok kullanlan matematiksel fonksiyonlar Tablo 5.1'de listelenmitir. Tablo 5.1: math.h ktphanesinde tanml baz fonksiyonlar Fonksiyon Bildirimi
int abs(int x);

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)

Sonu 4 4.000000 3.000000 5.000000 2.000000 8.000000 1.386294 0.602060

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.

0.001593 0.999999 0.001593 0.523599 1.047198 0.463648

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;

Program 5.1: sin(), cos(), and tan() fonksiyonlarnn kullanm


01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: /* 05prg01.c 30 dercelik ann sins, kosins, tanjant ve kotanjant deerleri */ #include <stdio.h> #include <math.h> #define PI 3.141593

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

5.2 Standart Ktphane Fonksiyonlar (stdlib.h)


Standart ktphanede, program sonlandran, dinamik bellek ynetiminde kullanlan veya rastgele say retme vb. ilevleri yerine getiren bir ok fonksiyon mevcuttur. Bu ksmda, bunlardan bir ka Tablo 5.2'de listelenmitir. Tablo 5.2: stdlib.h ktphanesinde tanml baz fonksiyonlar Fonksiyon BildirimiAklama rnek Sonu int atoi(const Bir karakter topluluunu tamsayya atoi("-12345") -12345 char *s); evirir long atol(const Bir karakter topluluunu uzun atol("1234567890") 1234567890 char *s); tamsayya evirir double atof(const Bir karakter topluluunu gercel atof("-123.546") -123.456 char *s); sayya evirir void exit(int Program sonlandrarak kontrol exit(1) durum); iletim sistemine geri verir. 0 ile RAND_MAX arasnda rastgele say retir. int rand(void); rand() 50485132 RAND_MAX, stdlib.h iinde tanmlanm bir sembolik sabittir stdlib.h'de tanmlanm iki max(a,b) 9 saydan en byn bulan makro max(5, 9) fonksiyon stdlib.h'de tanmlanm iki min(a,b) 5 saydan en kn bulan makro min(5, 9) fonksiyon Program 5.2: rand() fonksiyonu kullanm
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: /* 05prg02.c 0-100 arasnda 10 tane rasgele say retir */ #include <stdio.h> #include <stdlib.h> int main() { int i, ri; for(i=1; i<=10; i++) { ri = rand() % 100; /* 0-100 aras tamsay */ printf("\%d\t%d\n",i,ri); } puts("10 tane rasgele sayi uretildi."); return 0; }

IKTI
1 83

2 3 4 5 6 7 8 9 10

86 77 15 93 35 86 92 49 21

5.3 Karakter zerinde lem Yapan Fonksiyonlar (ctype.h)


Tablo 5.3: ctype.h Ktphanesinde tanml fonksiyonlar Fonksiyon Bildirimi
isalpha(c) isalnum(c) isascii(c) isdigit(c) islower(c) isupper(c) toascii(c) tolower(c) toupper(c)

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

Program 5.3: ctype.h ktphansinde bulunan baz makrolarn kullanm


01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: /* 05prg03.c ASCII kodlar 32-127 arasnda olan karakterler zerinde ctype.h ktphanesinde tanml baz makrolarn kullanm */ #include <stdio.h> #include <ctype.h> int main(void) { int i; char c; for(i=32; i<127; i++) { c = toascii(i); printf("%d\t%c\t%c\t%d\n", i,c,tolower(c),isdigit(c)); } return 0; }

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 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 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

Ders 6: Karlatrma Deyimleri


###################- (%95)

En son gncelleme: Fri, 03 Jul 2009 16:40:45 +0300


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.

6.1 Karlatrma Operatrleri ve Mantksal Operatrler


Tablo 6.1'de listelenen Karlatrma Operatrleri, saysal deerleri veya karakterleri mukayese etmek iin kullanlr. Tablo 6.1: Karlatrma Operatrleri Aklama rnek Anlam x > y byktr x, y den byk m? x < y kktr x, y den kk m? x == y eittir x, y ye eit mi? x >= y byk-eittir x, y den byk yada eit mi? x <= y kk-eittir x, y den kk yada eit mi? x != y eit deil x, y den farkl m? Birden ok karlatrma ilemi, Tablo 6.2'deki Mantksal Operatrler'le birletirilebilir.
> < == >= <= !=

Operatr

Tablo 6.2: Mantksal Operatrler Operatr


&& ||

Aklama mantksal VE mantksal VEYA

rnek
x>2 && x<y x>2 || x<y

Anlam x, 2 den byk VE y den kk m? x, 2 den byk VEYA y den kk m?

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

eklinde olur. Bunun nedeni:


2 her zaman 1 den byk olduu iin s deikenine 1,


x = 1 < 3

olduu iin x deikenine 0, eitliin satarafnn sonucu olumlu olduu iin z deikenine

z = x <= y && y >0;

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

deyiminin yapnn genel biimi yledir:


if(koul) { ... deyimler; (kme) ... }

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

Buna gre aadaki kullanm


if(x == y){ puts("x ve y esit"); }

ile
if(x == y) puts("x ve y esit");

edeerdir.
if

deyiminin else ile birlikte kullanm u ekildedir:


if(koul){ ... deyimler; (kme1) ... } else{ ... deyimler; (kme2) ... }

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

o yl artk yldr. Program 6.2: if-else deyiminin kullanm


01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: /* 06prg02.c: Bir yln artk yil olup olmadn snar. */ #include <stdio.h> void main() { int yil; printf("Bir yil girin: "); scanf("%d",&yil); if( yil % 4 == 0 && yil % 100 != 0 || yil % 400 == 0 ) printf("%d artik yil\n",yil); else printf("%d artik yil degil\n",yil); }

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"); }

break; default: 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)

En son gncelleme: Fri, 03 Jul 2009 16:40:45 +0300


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] ... }

Program 7.1: while dngs


01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: /* 07prg01.c: while dngs */ #include <stdio.h> main() { int x=0; while(x <= 10) printf("%d\n",x++); return 0; }

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);

Program 7.2: do-while dngs


01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: /* 07prg02.c: do-while yaps */ #include <stdio.h> main() { int sayi; do { printf("Bir sayi girin : "); scanf("%d",&sayi); printf("iki kati : %d\n",2*sayi); }while( sayi>0 ); /* koul */

puts("Dng sona erdi."); } return 0;

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; ... }

Program 7.3: for dngs


01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: /* 07prg03.c: for dngs ile faktoriyel hesab. */ #include <stdio.h> int main() { long i, n, faktor; "); printf("Faktoriyeli hesaplanacak sayi girin : scanf("%ld",&n); faktor=1; for(i=1; i<=n; i++){ faktor *= i; x ... x n */ }

/* n! = 1 x 2 x 3

printf("%ld! = %ld\n", n, faktor); } return 0;

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

Program 7.4: Say sistemi


01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: /* 07prg04.c: Say sistemi %d : desimal 10 tabanndaki %o : oktal 8 tabanndaki %x : hexadesimal 16 tabanndaki harf) %X : hexadesimal 16 tabanndaki harf) */ #include <stdio.h> int main() { int i; for (i=0; i<16; i++) printf("%2d %2o %x return 0; } %X\n", i,i,i,i); say say say (kk say (byk

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

7.4 ie Gemi Dngler


Bir program iinde birbiri iine gemi birden ok dng de kullanlabilir. Bu durumda (btn programlama dillerinde olduu gibi) nce iteki dng, daha sonra dtaki dng icra edilir. basamakl, basamaklarnn kpleri toplam kendisine eit olan tam saylara Armstrong say denir. rnein: 371 bir Armstrong saydr nk 3^3 + 7^3 + 1^3 = 371. Program 7.5'de i ie gemi for dngs ile btn Armstrong saylar bulup ekrana yazar. nceleyiniz. Program 7.5: i-ie for dngleri
01: /* 07prg05.c:

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 =

if( sayi==kup ) printf("%d. %d\n",k+ +,sayi); } return 0; }

IKTI
1. 2. 3. 4. 153 370 371 407

7.5 Sonsuz Dng


Bir dng ilemini sonsuz kere tekrarlarsa bu dng sonzuz dng olarak adlandrlr. Byle bir dng iin, koul ok nemlidir. rnein while dngs iin:
... while(1) { printf("Sonsuz dng iindeyim...\n"); } ...

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

dngsnde, balang, koul ve artm parametrelerinden herhangi birini kullanmak

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

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

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


0 1 2 3 . . . 50 0.000000 1.000000 1.414213 1.732050 . . . 7.071067

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 )

20: 21: 22: }

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)

Ders 8: Fonksiyonlar I (Alt programlar)


###################- (%95)

En son gncelleme: Fri, 03 Jul 2009 16:40:45 +0300


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.

8.1 Fonksiyon Kavram


Fonksiyon, belirli sayda verileri kullanarak bunlar ileyen ve bir sonu reten komut grubudur. Her fonksiyonun bir ad ve fonksiyona gelen deerleri gsteren argumanlar (bamsz deikenleri) vardr. Genel olarak bir fonksiyon ekil 8.1'deki gibi bir kutu ile temsil edilir:

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; }

rnein iki saynn toplamnn hesaplayacak bir fonksiyon yle tanmlanabilir:


/* klasik biim */ int topla(x,y) int x,y { int sonuc; sonuc = x + y; return sonuc; }

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); }

Bu rnekte, fonksiyonun kimlik kart! ve kutu gsterimi yledir:


Fonksiyon tipi: int Fonksiyon ad : topla parametreler : x ve y geri dn deeri: 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.

8.2 Fonksiyon Bildirimi


Bir fonksiyonun bildirimi iki trl yaplr:
1. Ana programdan nce:
2. ... 3. int topla(int x,int y) 4. { 5. ... 6. } 7. ... 8. main() 9. { 10. ... 11.} /* fonksiyon */

12. Ana programdan sonra: Bu durumda fonksiyon rnei (function prototype) ana

programdan nce bildirilmelidir.


13.... 14.int topla(int x, int y); 15.... 16.main() 17.{ 18. ... 19.} 20.... 21. int topla(int x, int y) /* fonksiyon rnei */

/* fonksiyon */

22.{ 23. ... 24.}

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);

ekinde yazlabilei gibi eklinde de yazlabilir.

int topla(int, int);

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",

8.3 Geri Dn Deerleri


return

anahtar szcnn iki nemli ilevi vardr:

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:

char harfim; ... harfim = harf(78); ... harfim

deikenine 'C' deeri (karakteri) atanr.

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

8.5 Fonksiyon Parametreleri


Fonksiyon parametreleri (argmanlar) klasik ve modern olmak zere iki trl tanmanabilir. rnein aadaki fonksiyon kendisine parametre olarak gelen tamsaynn faktoriyelini

gnderir. Bu fonksiyonun parametresi (n):


int faktoriyel(n) int n { int i=1, f=1; /* kalsik biim */

while(i<=n) f *= i++; } return f; /* modern biim */

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

void mesaj_yaz(void) { printf("Hata olustu !..\n"); }

8.6 Yapsal Programlama


Program iinde birden ok fonksiyon tanmlayp kullanmak mmkndr. Yani C Programlama Dili fonksiyonlarn inas dayal bir dildir. Bu zelliklik btn Yapsal Programlama Dilleri'nin (Structred Programming) temelini oluturur. Birden ok fonksiyonun main tarafndan nasl arldn temsil eden blok diyagram ekil 8.2'de gsterilmitir.

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;

/* tarih: 01 Austos 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

8.7 Makro Fonksiyon Tanmlamas


Balk dosyalarnda, bol miktarda makro fonksiyon uygulamalarna rastlanr. Makro tanmlamas #define nilemci komutu kullanlarak yaplr. rnein aadaki makro fonksiyonlar geerlidir.
#define kare(x) (x)*(x) #define delta(a,b,c) ((b)*(b)-4*(a)(c)) #define yaz() puts("Devam etmek iin bir tua basn...")

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

Ders 9: Fonksiyonlar II (Alt programlar)


##################-- (%90)

En son gncelleme: Fri, 03 Jul 2009 16:40:45 +0300


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.

9.1 Esnek Argmanl Fonksiyonlar


Aadaki gibi nc dereceden bir polinom dnelim: P(x) = a + bx + cx2 + dx3 burada a, b, c, d katsaylar gerel say sabitleridir. Bu polinomu temsil eden en basit fonksiyon yle tanmlanabilir.
double p(double x, double a, double b, double c, double d) { double p = a + b*x + c*x*x + d*x*x*x; return p; }

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, ...) { }

Esnek Argumanl Fonksiyon tanmlamas yapabilmek iin stdarg.h ktphanesinde tane

Ders 24: Monte Carlo Yntemleri


###################- (%95)

En son gncelleme: Fri, 03 Jul 2009 16:40:45 +0300


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.

24.1 Uygulama Alanlar


Monte Carlo (MC), rastgele saylar baz alarak tahmini sistemleri modeller. Hatta, baz kesin sistemlerde de kullanlabilir; rnein rastgele saylarla Pi saysn veya bir fonksiyonun integralini hesaplamak gibi. MC yntemleri, Fizik ve Mhendislik alanlarnda pekok uygulama alan bulmutur. Bunlardan balcalar: [Matematik] Saysal Analiz [Fizik] Doal olaylarn simlasyonu

[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

Tahmini sistemleri modelleyebilmek iin:

iyi renmek gerekir.

24.2 Rastgele Saylar


Bilgisayarlarn en ok uyguland alanlardan bir tanesi kukusuz doa olaylarnn modellenmesidir. Baz durumlarda, bilgisayarn rettii rastgele saylar kullanlarak belirsiz yani tahmini sistemler modellenebilir. Rastgele say zel bir dalmdan seilen kargak (caotic) bir saydr.

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

24.3 ANSI C Fonksiyonlar


Standart C (ve C++), RANDU ve Minimal Standart'a gre daha verimli alan (stdlib.h balk dosyasnda bildirilen) aadaki iki fonksiyonu kullanclarna sunmutur:

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

eklinde, gcc gibi (32-bit) uygulamalarda: eklinde tanmlanmtr.

void srand(unsigned int cekirdek) Rastgele say reteci (rand()) iin cekirdek

deerini belirler.

Aada bu fonksiyonlarn uygulamalar gsterilmitir. nceleyiniz. Program 24.2:


01: /* 24prg02.c 02: rand() ile 10 adet rastgele tamsay say 03: retir */

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

0.911647 0.197551 0.335223 0.768230 0.277775 0.553970 RAND_MAX = 2147483647

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

24.4 Basit Monte Carlo Programlar


Bu ksmda, rastgele saylar kullanlarak basit MC uygulamas verilmitir.

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?

Program 24.8: Zar 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: /* 24prg08.c: MC Zar Simulasyonu Atlan bir ift zarn toplamnn yedi olma olasln hesaplar. Olaslk kuramna gre, birift zarn toplamnn 7 olma olasl aadaki formlden hesaplanabilir: Ptoplam(7) = P(1,6) + P(2,5) + P(3,4) + P(4,3) + P(5,2) + P(6,1) Dier taraftan: P(1,6) = P(2,5) = P(3,4) = P(4,3) = P(5,2) = P(6,1) = 1/36'dr. Buna gre: Ptoplam(7) = 6*(1/36) = 1/6 = 0.16666.. dr. */ #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, 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:

eklinde olur. Bu iki denklem birletirilirse, pi says

(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

You might also like