You are on page 1of 169

C Programlama

Dili'ne Giri
cdernek
Ders 1: Giri

Tarihe
Neden C?
lk C Program
Kaynak Kodunun Derlenmesi
Balk Dosyalar
C Kodlarnn Temel zellikleri
Kod Yazm iin Baz Tavsiyeler

NOT
Bu web sayfasnda halen baz ksmlarnda kk deiiklikler yaplmaktadr.
neri ve sorularnz iin bize e-mail atn.

Tarihe
C Programlama Dili genel amal orta seviyeli ve yapsal bir programlama dilidir. 1972
ylnda Dennis Ritchie tarafndan Bell Telefon Labaraturvarnda tasarlanmtr. C, zellikle
sistem programlamada sembolik makine dili (Asembler) ile tercih edilmektedir. letim
sistemleri, derleyiciler ve debug programlar 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 tamamen C tabanldr. Ksacas Standart C (ANSI
C) dilini grenmekle bu dillerin tamamna iyi bir hazrlk yapm olursunuz. Bu yzden
derslerimizde arlkl olarak ANSI C konu edilmitir.

Neden C?

C gl ve esnek bir dildir. C ile iletim sistemi 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. Yani herhangi bir C kodu hibir deiiklie uramadan, veya
ok az bir deiimle, baka bir derleyicide derlenebilir. rnein, Windows iletim
sistemlerinde yazlan bir C kodu, Linux, UNIX veya VAX gibi iletim sistemlerinde
de derlenebilir.
C yapsal bir dildir. C kodlar fonksiyon olarak adlandralan altprogramlardan
olumutur.
C++, Java, JavaScript, JavaApplet, PHP, C#, ... gibi dillerin temelinde C vardr.

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.
Program 1.1: Derlendikten sonra ekrana Merhaba Dnya! yazar
1:
2:
3:
4:
5:
6:
7:

/* ilk.c: ilk C programi */


#include <stdio.h>
main()
{
printf("Merhaba Dnya!\n");
}

Kaynak Kodunun Derlenmesi


C kaynak kodlar (programlar) uzants .c olan dosyalarda saklanr ve derlenir. 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
Microsoft C
Borland Turbo C Web
MS-DOS /
Borland C
Windows
Zortec C
GCC (GNU Compiler Collection)
for Windows Web
GCC (GNU Compiler Collection)
UNIX / Linux
Web
ilk.c

Derleme

altrma

cl ilk.c

ilk.exe

tcc ilk.c

ilk.exe

bcc ilk.c

ilk.exe

ztc ilk.c

ilk.exe

gcc ilk.c -o
ilk.exe

ilk.exe

gcc ilk.c -o
ilk

run ilk veya ./ilk


veya ilk

nin Borland Turbo C ve GCC Programlar ile derlenmesi ve altrlmas:

MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc ilk.c


C:\TC> ilk.exe

$ gcc ilk.c -o ilk


$ ./ilk

NOT
Turbo C Editr ortamnda derlenirken CTRL + F9 ksayol tularn kullanabilirsiniz.
ilk.c

nin kts:

IKTI
Merhaba Dnya!

programnda, 1. satrda /* ... */ ifadeleri grlmektedir. Bu ifadeler arasnda


yazlan herhangi bir metin, ilem vb. satrlar, derleyici tarafndan ilenmez (deerlendirilmez).
Yani /* */ ifadeleri aklama operatrdr.
ilk.c

NOT
Aklama operatr olarak C++ tarz iki-bl (//) de kullanlmaktadr. Gnmzde
birok C derleyicisi // operatrn desteklemektedir. Bu operatr kullanmadan nce
derleyicinizin bu operatr desteklediinden emin olun.
/*
Bu satrlar derleyici tarafndan
deerlendirilmez. Ayrca programn
alma hzn da deitirmez.

C tarz

*/
// Bu satrlar derleyici tarafndan
// deerlendirilmez. Ayrca programn
// alma hzn da deitirmez.

C++ tarz

2. satrda yazl olan #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[2]. Bu dosyalar Ders
20: C Makrolar ksmlarnda tekrar incelenecektir. 4. satrdaki main() ve 6. satrdaki
printf() birer fonksiyondur. main() zel bir fonksiyondur ve programn yrtlmesine bu
programdan balanr. Dolaysyla her C programnda bir tane main() adl fonksiyon
olmaldr. printf() ise standart ktphane bulunan ekrana yazdrma fonksiyondur (bkz. Ders
5: Temel G/ Fonksiyonlar). stdio.h bu fonksiyon iin kullanlmtr.

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

locale.h
math.h

stddef.h
stdio.h

errno.h
float.h
limits.h

setjmp.h
signal.h
stdarg.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 Baknz: Ders20: C Makrolar
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 undefined reference to _printf eklinde bir
hata mesaj ile karlalr.
ilk.c

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.

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
arrtracaktr. rnein:
for(i=0;i<10;i++)
{

for(j=0;j<i;j+=2)
{
do{
k = i+j;
}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 fonsiyonlar daha ksa algoritmalarla ve daha
modler ekilde elde etmeye aln. Programnzn anlalmas iin elinizden ne
geliyorsa yapn. Bilginizi ve eserinizi bakalarna en iyi ekilde akatarn.

C Programlama
Dili'ne Giri
Ders 2: Deikenler ve Sabitler

Giri
Deiken iin Kurallar
Deikenler ve Sabitlerin Bildirimi
Deiken Bildirim Yerleri ve Trleri
Tip Dnmleri

Giri
Orta ve yksek seviyeli dillerin hepsinde deiken kavram bulunmaktadr. Deikenler
bellekte 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 bir tipi vardr. C dilinde temelde birka tane deiken
tipi vardr[1], [3]. Bunlar Tablo 2.1'de listelenmitir.
Tablo 2.1: Deiken tipleri ve bellekte kapladklar alanlar
Deiken
tipi

Aklama

char

tek bir karakter iin

Bellekte igal ettii boyut


(byte)
1

tamsay iin
tek duyarl gerel say iin (6 basamak
hassasiyet)
ift duyarl gerel say iin (12 basamak
hassasiyet)

int
float
double

2 yada 4
2 yada 4
4 yada 8

Fakat baz zel niteleyiciler vardr ki bunlar yukardaki temel tiplerin nne gelerek onlarn
trevlerini oluturur. Bunlar short, long, unsigned dr. 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 16 bit (2 byte) ise
uzun tamsay 32 bit uzunluundadr. Ksa tamsay 16 biti gemeyecek uzunluktadr. Deiken
tiplerinin bellekte kaplad alan sizeof operatr ile renilebilir. Program 2.1 bu amala
yazlmtr.
Program 2.1: Deiken tipleri ve trevlerinin bellekte kapladklar alanlar
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:

/* 02prg01.c : sizeof operatrnn kullanm */


#include <stdio.h>
main()
{
printf(
printf(
printf(
printf(
printf(
printf(
printf(
printf(
printf(
printf(
printf(

"\nchar
"\nint
"\nshort
"\nlong
"\nunsigned char
"\nunsigned int
"\nunsigned short
"\nunsigned long
"\nfloat
"\ndouble
"\nlong double

:
:
:
:
:
:
:
:
:
:
:

%d
%d
%d
%d
%d
%d
%d
%d
%d
%d
%d

byte",
byte",
byte",
byte",
byte",
byte",
byte",
byte",
byte",
byte",
byte",

sizeof(
sizeof(
sizeof(
sizeof(
sizeof(
sizeof(
sizeof(
sizeof(
sizeof(
sizeof(
sizeof(

char ));
int ));
short ));
long ));
unsigned char ));
unsigned int ));
unsigned short ));
unsigned long ));
float ));
double ));
long double ));

return 0;
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 02prg01.c


C:\TC> 02prg01

$ gcc 02prg01.c -o 02prg01


$ ./02prg01

IKTI
Turbo C
char
int
short
long
unsigned char
unsigned int

GCC
:
:
:
:
:
:

1
2
2
4
1
2

byte
byte
byte
byte
byte
byte

char
int
short
long
unsigned char
unsigned int

:
:
:
:
:
:

1
4
2
4
1
4

byte
byte
byte
byte
byte
byte

unsigned short
unsigned long
float
double
long double

:
:
:
:
:

2 byte
4 byte
4 byte
8 byte
10 byte

unsigned short
unsigned long
float
double
long double

:
:
:
:
:

2 byte
4 byte
4 byte
8 byte
12 byte

Deikenler iin Kurallar

Deiken isimleri en fazla 32 karakterden oluabilir. 32 karakterden uzun deiken


isimlerinin 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.
Deiken adlar herhangi bir rakam ile balayamaz. Ilk karakter bir harf olamaldr.
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

Deikenler ve Sabitlerin Bildirimi


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;
int sayi=0, n=10;
float toplam=0.0, sonuc=22.14;

Sabit bildirimi, balang deeri verilen deiken bildirimi gibi yaplr. Ancak; veri tipinin
nne const anahtar szc koyulmaldr. 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 Ders20: C Makrolar
blmnde anlatlacaktr.
#define MAX 100
#define DATA 0x0378
#define YARICAP 14.22

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

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
ltam*tam
tam/2
tam/2.0

Sonu Tipi
---------int
double
double
double
unsigned
long
int
double

Bir deikenin sabit deerin veya bantnn nne tr veya tak (cast) yazlarak sonucun
hangi tip kmas istendii sylenebilir. Genel yazm biimi:
(tr tipi)

bant;

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).
x int, a

ve b float tipinde iki deiken olsun:

int x=9;
float a,b,c;
...
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.

C Programlama
Dili'ne Giri
Ders 3: Operatrler

Giri
Aritmetik Operatrler
Atama Operatrleri

Karlatrma Operatrleri ve Mantksal Operatrler


Bit Dzeyinde Ilem Yapan Operatrler

Giri
Operatrler, deikenler veya sabitler zerinde matematiksel ve karlatrma ilemlerini
yapan simgelerdir. Baz kitaplarnda operatr yerine ilemci kelimesi de kullanlmaktadr.
Derslerimiz boyunca bu iki ismi biribiri yerine kullanabiliriz. ANSI C'de drt tip operatr
tanmldr.

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
karma
carpma
blme
artk blme

rnek
x+y
x-y
x*y
x/y
x%y

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

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

eklinde ise, daha ksa bir biimde


deiken [operatr]= ifade;

olarak yazlabilir. Bu operatrler Tablo 3.2'de listelenmitir.


Tablo 3.2: Atama Operatrleri
Operatr
=

Aklama
atama

rnek

Anlam

x=7;

x=7;

+=

ekleyerek atama
eksilterek atama
arparak atama
blerek atama
blp, kalann atama
bir arttrma
bir azaltma

-=
*=
/=
%=
++
--

x+=3

x=x+3

x-=5

x=x-5

x*=4

x=x*4

x/=2

x=x/2

x%=9

x=x%9

x++

x=x+1

veya ++x
x-- veya --x

x=x-1

Program 3.1: Aritmetik ve atama operatrlerinin kullanm


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:

/* 03prg01.c: Aritmetik ve atama operatorlerinin kullanimi */


#include <stdio.h>
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

atamsinin sonucunda x=%d dir\n", x);

x = 1; /* x e tekrar 1 degeri ataniyor */


x += y;
printf("x += y atamasinin sonucunda x=%d dir\n", x);
return 0;
}

Bu program, x = x + y atamas ile x += y atamasn ayn anlamda olduu gsterir. 9. ve 10.


satrlarda x ve y deikenlerine balang deerleri atanmtr. Bu deerler 12. satrda ekrana
Ders 5: Temel G/ Fonksiyonlar ayrntl olarak ilenecek olan printf() fonksiyonu ile
ekrana yazdrlmtr. 14. ve 18. satrdaki ifadeler ekrana yazdrldnda sonucun deimedii
grlr.
DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 03prg01.c


C:\TC> 03prg01

$ gcc 03prg01.c -o 03prg01


$ ./03prg01

IKTI
x = 1 ve y = 3, olarak veriliyor.

x <- x + y atamsinin sonucunda x=4 dir


x += y atamasinin sonucunda x=4 dir

Karlatrma Operatrleri ve Mantksal Operatrler


Tablo 3.3'de listelenen bu operatrler, saysal deerleri veya karakterleri karlatrmak iin
kullanlr. Bu operatrlerin kullanm Ders 7: Karlatrma Deyimleri ksmnda
gsterilecektir.
Tablo 3.3: Karlatrma Operatrleri ve Mantksal Operatrler
Operatr
>
<
==
>=
<=
!=
&&
||

Aklama
byktr
kktr
eittir
byk-eittir
kk-eittir
eit deil
mantksal VE
mantksal VEYA

Ornek
x>y
x<y
x==y
x>=y
x<=y
x!=y
x>2 && x<y
x>2 || x<y

Anlam
x, y den byk m?
x, y den kk m?
x, y ye eit mi?
x, y den byk yada eit mi?
x, y den kk yada eit mi?
x, y den farkl m?
x 2 den byk VE y den kk m?
x 2 den byk VEYA y den kk m?

Bit Dzeyinde lem Yapan Operatrler


Saysal veya karakter deikenlerin zerinde bit dzeyinde mantksal ilem yapan
operatrlerdir. Bunlar Tablo 3.4'te listelenmitir.
Tablo 3.4: Bit dzeyinde ilem yapan operatrler
Operatr
&
|
^
~
>>
<<

Aklama
ve
veya
zel veya
deil
saa kaydrma
sola kaydrma

rnek

Sonucu

10 & 25 (00001010 & 00011001)

8 (00001000)

10 | 25 (00001010 | 00011001)

27 (00011011)

10 ^ 25 (00001010 ^ 00011001)

19 (00010011)

~10 (00001010)

245 (11110101)

12 >> 3 (00001100 >> 3)

1 (00000001)

12 << 3 (00001100 << 3)

96 (01100000)

Bit dzeyinde ilem yapan operatrler C dilinde ska kullanlmakatadr. rnein Ders 4:
Ktphane Fonksiyonlar ksmnda grlecek olan ctype.h ktphanesinde tanml
toascii(c) makro fonksiyonu, c says ile verilen ASCII koda sahip karakteri verir. Bu
fonksiyon aslnda Program 3.2'deki ilemi yapmakatadr.
Program 3.2: Bit dzeyinde VE ilemi
1: /* 03prg02.c:

2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:

Bir tamsaynn ASCII karakter kod karlnn bulunmas.


(ctype.h ktphanesinde tanmlanan toascii(c) makrosuna ait kod) */
#include <stdio.h>
int c=65;
char kr;

/* gloabal deiken bildirimi */

void main()
{
kr = c & 0x7f; /* kr = c & 127 */
printf("%d sayisinin ASCII karsiligi %c\n",c,kr);
}

12. satrda kr deikenine kr = 65 & 127 (01000001 & 01111111) ilemi kr = 65


(01000001) deeri atanmaktadr ve bu 'A' karakteridir. Eer c>127 olursa 12. satrdaki
ilemle bu say maskelencektir. rnein c=163 olduunda kr=163 & 127 (10100011 &
01111111) = 35 (00100011) ilemiyle kr deikenine 35 saysna karlk gelen '#'
karakteri atanr. Oysa kr=c atamas yaplsayd: k=163 (10100011) = ''. yle ise 13.
satrdaki ilemle kr = c & 127 = c-128 atamas gerekletirilmektedir.
DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 03prg02.c


C:\TC> 03prg02

$ gcc 03prg02.c -o 03prg02


$ ./03prg02

IKTI
65 sayisinin ASCII karsiligi A

C Programlama
Dili'ne Giri
Ders 4: Temel G/ Fonksiyonlar

Giri
printf() Fonksiyonu
puts() Fonksiyonu
scanf() Fonksiyonu
gets() Fonksiyonu
getchar() Fonksiyonu

Formatl kt

Giri

Temel giri/k fonksiyonlar kullanlrken stdio.h balk dosyas programn bana


eklenmelidir. Bu fonsiyonlardan en ok kullanlanlar aada verillmitir. Fakat bunlarn
dnda olan bir ka fonksiyon daha vardr.

printf() Fonksiyonu
Standart C ktphanesinin bir paras olan printf() fonksiyonu, deikenlerin ieriini veya
bit mesaj ekrana bir dzenle(formatla) standart ka(stdout) yazmak iin belki de en ok
kullanlan fonksiyondur. Daha nce yazlan rnek programlarda printf() fonksiyonu
kullanlmt. imdi bu fonsiyonun nasl kullanld aklanacaktr. Genel yazm biimi:
int printf(const char *format,...);

Basit olarak eer ekrana Hata olutu!.. eklinde bir mesaj yazrmak iin, printf
fonksiyonu armak ve fonsiyon iinde, ift trnaklar arasna, bu iletiyi yazmak yeterli
olacaktr. Yani:
printf("Hata Olutu!..");

ou zaman ekrana, programda kullanlan bir deikenin deeri yazdrlmak istenebilir.


rnein ekranda bir alt satra geerek x tamsay deikeninin saysal deerini ekrana
yazdrmak istediimizi varsayalm. Bu durumda printf() fonksiyonun kullanm u ekilde
olacaktr:
printf("\nx in deeri %d dir",x);
x=12

iin bu ilemin sonucunda ekrana u ileti kacaktr:


x in deeri 12 dir

Bu rnekte printf fonsiyonuna iki parametre aktarlmtr. Birincisi ekranda gsterilecek ve


ift trnaklar arasna yazlan ifadeler, ikincisi ise ekranda saysal deeri gsterilmek istenen
deiken (x). Ayrca bir alt satra geme ilemi \n ile gerekletirilmitir.
*format

ksmdan olumaktadr:

Dz metin (literal string): yazdrlmak istenen ileti.


Konrol karakterleri (escape squence): deikenlerin ve sabitlerin nasl yazlacan
belirtmek ve imlecin alt satra geirilmesi gibi baz basit ilemlerin gerekletirilmesi
iin kullanlr. Bu karakterler Tablo 4.1'de listelenmitir.
Tip belirleyici (conversion specifier): % iaretinden oluur(%d gibi). Ekrana
yazdrlmak istenen deikenin tipi, % iaretinden sonra belirtilir (Bkz. Tablo 4.2)
Yani % iaretinin hemen ardna yazlan bir veya bir ka karakter, ilgili deiken ve
sabitin nasl yazlacan dzenleme bilgisidir.

Tablo 4.1: Kontrol karakterleri


Karakter
\a
\b
\f

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

\n
\r
\t
\v
\"
\'
\\
%%

Tablo 4.2: Tip karakterleri


Tip Karakteri
%c
%d
%ld
%u
%f
%s
%lu

Anlam
tek bir karakter
iaretli ondalk tamsay
uzun iaretli ondalk tamsay
iaretsiz ondalk tamsay
Gerel say
karakter dizisi (string)
iaretsiz uzun tamsay

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

Tip karakterlerini kullanarak, not=12, pi=3.14 ve kr='A' deikenleri printf() fonsiyonu


ile ekrana yazdrlmak istensin. Bunun iin:
...
int not=12;
float pi=3.14;
char kr='A';
...
printf("Not=%d , pi=%f ve kr=%c dir",not,pi,kr);
...
printf() fonksiyonu ile yazdrabilecek ifadeler iin bir snr yoktur.
bir C deyimi olabilir. rnein x ve y nin toplam syle yazlabilir:
z = x + y;
printf("%d",z);

parametreler herhangi

Bu ifade u ekilde de yazlabilir:


printf("%d",x+y);
printf

fonksiyonu kullanm Program 4.1'de verilmitir.

Program 4.1: printf() fonksiyonunun kullanm


1: /* 04prg01.c: saysal deerleri ekrana yazdrmak iin printf
fonksiyonunun kullanm */
2:
3: #include <stdio.h>;
4:
5: /* global deiken tanmlamalar */
6: int
a = 2,
b = 10,
c = 50;
7: float f = 1.05, g = 25.5, h = -0.1 ,yuzde;
8:
9: main()

10: {
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26: }

printf("3 tamsayi
: %d %d %d\n", a, b, c);
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%f\n\n", f, g, h);
yuzde = 220 * 25/100.0;
printf("220 nin %%25 i %f dir\n", yuzde);
printf("%f/%f isleminin sonucu = %f\n", g, f, g / f);
printf("\nprogram sonunda beep sesi cikar...\a");
return 0;

Program 4.1, printf() fonksiyonu ile deikenlerin ekrana nasl yazldn gstermektedir.
6. ve 7. satrlarda deikenler global olarak bildirilmitir. Program iinde \t, \n ve \a kontrol
karakterlerinin nasl kullanld ok aktr.
DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 04prg01.c


C:\TC> 04prg01

$ gcc 04prg01.c -o 04prg01


$ ./04prg01

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 bayt


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


1: /* 04prg02.c: printf fonksiyonunun geri dn deerini gsterir */
2:
3: #include <stdio.h>

4:
5: main()
6: {
7:
int karSay;
8:
int sayi = 1234;
9:
10:
karSay = printf("Ugurlu sayim = %d\n",sayi);
11:
printf("Katarin uzunlugu : %d dir",karSay);
12: }

10. satrdaki ilemle, hem ekrana Ugurlu sayim = 1234 iletisi bastrlmakta, hem de karSay
deikenine bu iletinin uzunluu atanmaktadr. Ekrana baslan katarn uzunluu (\n karakteri
dahil) 20 dir.
DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 04prg02.c


C:\TC> 04prg02

$ gcc 04prg02.c -o 04prg02


$ ./04prg02

IKTI
Ugurlu sayim = 1234
Katarin uzunlugu : 20 dir

puts() Fonksiyonu
puts(*string);

olarak belirtilen karakter topluluunu ekrana yazdktan sonra, imleci alt satra geirir.
rnein:
*katar

puts("puts() fonksiyonunun gsterimi!");

ekinde kullanlrsa k yle olacaktr.


puts() fonksiyonunun gsterimi!
puts()

fonksiyonu Tablo 4.1 de verilen kontrol karakterleri ile kullanlabilir.

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


Bu birinci satr...
Bu ikinci satr.

scanf() Fonksiyonu
Birok programda ekrana verilerin yazlmasnn yansra klavyeden veri okunmas gerekebilir.
scanf() fonksiyonu bu amala 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 Ders
10: Pointerler ksmnda ayntl olarak aklanacaktr. Klavyeden iki farkl say okunmak
istendinde scanf() fonksiyonu yle kullanlr:
scanf("%d %f",&x,&y);

veriler klavyeden
16 1.568

yada
16

1.568

veya
16
1.568

ekilinde girilebilir. Program 4.3'de scanf() fonsiyonunun kullanm gsterilmitir.


Program 4.3: scanf() fonksiyonun kullanm
1: /* 04prg03.c: scanf() fonksiyonu ile int, char ve float tipindeki
verilerin okunmas */
2:
3: #include <stdio.h>
4:
5: main()
6: {
7:
int
x;
8:
float y;
9:
char c;
10:
11:
printf("Bir tamsayi girin : "); scanf("%d",&x);
12:
printf("Bir karakter girin : "); scanf("%s",&c);
13:
printf("Bir reel sayi girin: "); scanf("%f",&y);
14:
15:
printf("\n\ttamsayi
: %d",x);
16:
printf("\n\tkarakter : %c",c);
17:
printf("\n\treel sayi : %f\n",y);
18:
19:
puts("girdin.");
20:
puts("Bye.");
21: }

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 04prg03.c


C:\TC> 04prg03

$ gcc 04prg03.c -o 04prg03


$ ./04prg03

IKTI

Bir tamsayi girin : 236


Bir karakter girin : H
Bir reel sayi girin: 177.778
tamsayi
: 236
karakter : H
reel sayi : 177.778000
girdin.
Bye.

gets() Fonksiyonu
Klavyeden bir karakter topluluu (katar) okumak iin kullanlr. Okuma ilemi yeni satr
karakteriyle(\n) karlaslncaya kadar srer. puts()-gets() arsndaki iliki, printf() scanf() arasndaki gibidir. puts() ile ekrana bir katar yazdrlrken, gets() ile okunur.
rnein:
...
char ktr[10];
puts("Bir eyler yazn:");
gets(ktr);
...

Yukardaki program paras, klavden girilen karakterlerin, gets() fonksiyonu ile ktr
katarna aktarmak iin kullanlr.
ktr[10] eklindeki kullanm girilen katarn ierisinden ilk 10 karakteri deerlendir
manasndadr. Bu kullanm daha sonra aklanacaktr.

getchar() Fonksiyonu
Standart giriten bir karakter okur. 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.

Formatl kt
Bundan nceki ksmlarda kullanlan programlardaki deikenler serbest formatta
(derleyicinin belirledii format) yazlmtr. Bazen giri ve kn format kullanc tarafndan
belirlenmesi gerekebilir. Bu ilem:

Tamsaylarda %d yerine %wd


Reel saylarda %f yerine %w.kf
Stringlerde %s yerine %ws
biimindeki kullanm ile salanr. Burada w yazlacak olan saynn alan genilii olarak
adlandrlr. Reel bir deiken ekrana yazlacaksa, deikenin virglden sonra ka
basamann yazdrlaca k says ile belirlenir (w>k+2 olmal).
int i=583,j=1453;
printf("%d %d\n",i,j);
printf("%5d %8d\n",i,j);

program paras altrldnda aadaki sonu gzlenir:


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. Yani:
12345
----583

Benzer olarak ikinci sayda


12345678
-------1453

Reel saylarda i biraz daha kark. rnein:


int x=123.456;
printf("%f\n",x);
printf("%8.2f\n",x);

program paras altrldnda aadaki sonu gzlenir:


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. Format ayrntl olarak incelersek:
12345678
-------123.46

Program 4.4: printf() in formatl kullanm


1:
2:
3:
4:
5:
6:
7:

/* 04prg04.c: Formatl kt */
#include <stdio.h>
main()
{
float x

= 7324.25;

8:
9:
10:
11:
12:
13:
14: }
15:

int
char

i
= 1299;
c[15] = "Merhaba C";

printf("%10.5f\n",x);
printf("%10d\n" ,i);
printf("%10s\n" ,c);

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 04prg04.c


C:\TC> 04prg04

$ gcc 04prg04.c -o 04prg04


$ ./04prg04

IKTI
7324.25000
1299
Merhaba C

C Programlama
Dili'ne Giri
Ders 5: Temel Ktphane Fonksiyonlar

Giri
Matematiksel Fonksiyonlar (math.h)
Standart Fonksiyonlar (stdlib.h)
Karakter zerinde lem Yapan Fonksiyonlar (ctype.h)

Giri
Bu ksmda C Programlama Dili'nde ska kullanlan ktphane fonksiyonlarnn bazlar liste
halinde sunulmutur. Ktphane fonksiyonu C dilinde nceden tanmlanm hazr
fonksiyonlardr. C dilinde birok i bu fonksiyonlarla yaplabilmektedir. Aslnda her i iin
bir fonksiyon bulmak olas. Btn ktphane fonksiyonlarnn tamam buradakilerden ok
daha fazladr.
NOT
Her ktphane fonksiyonu bir balk dosyasnda tanmlanmtr. Bu yzden bir
ktphane fonksiyonunu kullanmadan nce, onun hangi balk dosyas ile
kullanlmas gerektiini bilmelisiniz.

Matematiksel Fonksiyonlar (math.h)

Matematiksel fonksiyonlarn tipleri double dr. 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
Aklama
int abs(int x);
x tamsaysnn mutlak deerini hesaplar
x gerel saysnn mutlak deerini
double fabs(double x);
hesaplar
x'e (x'den byk) en yakn tamsayy
double floor(double
x);
gnderir
x'e (x'den kk) en yakn tamsayy
double ceil(double x);
gnderir
double sqrt(double x); pozitif x saysnn karekkn hesaplar
Fonksiyon Bildirimi

double pow(double x,
double y);

x^y (x ) deerini hesaplar

pozitif x saysnn doal logaritmasn


hesaplar, ln(x)
pozitif x saysnn 10 tabanndaki
log10(double
logaritmasn hesaplar
radyan cinsinden girilien x saysnn
sin(double x);
sins deerini hesaplar
radyan cinsinden girilien x saysnn
cos(double x);
kosins deerini hesaplar
radyan cinsinden girilien x saysnn
tan(double x);
tanjant deerini hesaplar
sins deeri x olan ay gnderir. A asin(double x);
pi/2 ile pi/2 arasndadr.
cosins deeri x olan ay gnderir. A
acos(double x);
-pi/2 ile pi/2 arasndadr.
tanjant deeri x olan ay gnderir. A
atan(double x);
-pi/2 ile pi/2 arasndadr.

rnek
abs(-4)

Sonu
4

fabs(-4.0)

4.000000

abs(-2.7)

3.000000

abs(5.6)

5.000000

sqrt(4.0)

2.000000

pow(2.0,3.0) 8.000000

double log(double x);

log(4.0)

1.386294

double
x);

log10(4.0)

0.602060

sin(3.14)

0.001593

double
double
double
double
double
double

cos(3.14)
tan(3.14)

0.999999
0.001593

asin(0.5)

0.523599

acos(0.5)

1.047198

atan(0.5)

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 kullanlmaldr:
radyan = (3.141593/180.0)*derece;

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

1: /* 05prg01.c: 30 dercelik bir ann sins, kosins ve tanjant


deerleri */
2:
3: #include <stdio.h>
4: #include <math.h>
5:
6: #define PI
3.141593
7: #define CARPAN PI/180.0
8:
9: void main()
10: {
11:
double x;
12:
13:
x = 30.0;
/* 30 derece !
*/
14:
x *= CARPAN;
/* radyana evir */
15:
16:
printf("30 derecenin sinusu
: %f\n", sin(x));
17:
printf("30 derecenin kosinusu : %f\n", cos(x));
18:
printf("30 derecenin tanjanti : %f\n", tan(x));
19: }

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 05prg01.c


C:\TC> 05prg01

$ gcc -lm 06prg01.c -o 05prg01


$ ./05prg01

IKTI
30 derecenin sinusu
: 0.500000
30 derecenin kosinusu : 0.866025
30 derecenin tanjanti : 0.577350

Standart Fonksiyonlar (stdlib.h)


Tablo 5.2: stdlib.h ktphanesinde tanml baz fonksiyonlar
Fonksiyon Bildirimi

Aklama

int atoi(const char


Bir
*s);

rnek

katar tamsayya evirir atof("-12345")

long atol(const
char *s);

Bir katar uzun tamsayya


evirir

double atof(const
char *s);

Bir katar reel sayya evirir atof("-123.546")

void exit(int
durum);

int rand(void);

atof("1234567890")

Program sonlandrarak
kontrol iletim sistemine exit(0)
geri verir.
0 ile RAND_MAX arasnda
rastgele say retir.
rand()
RAND_MAX, stdlib.h iinde
tanmlanm bir sembolik

Sonu
-12345
1234567890
-123.456
-

504851

sabittir
stdlib.h'de tanmlanm
max(a,b)

min(a,b)
void
*malloc(unsigned
boyut);
void free(void
*ptr);

max(5,9)
9
iki saydan en byn
bulan makro fonksiyon
stdlib.h'de tanmlanm
min(5,9)
5
iki saydan en kn
bulan makro fonksiyon
Bellekte boyut ile belirtilen
sayda bayt kadar yer tahsis p=malloc(sizeof(int)*5) ?
eder
malloc ile ayrlan bellek
free(p)
blgesini boaltr

Program 5.2: rand() fonksiyonuun kullanm


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:

/* 05prg02.c:
(a) 0-100 arasnda 10 tane rasgele say retir
(b) 0-1
arasnda 10 tane rasgele say retir */
#include <stdio.h>
#include <stdlib.h>
void main()
{
int
i,ri;
float rf;
/* randomize(); Turbo C iin */
for(i=0;i<10;i++)
{
ri = rand() % 100;
/* 0-100 aras tamsay
*/
rf = (float) rand()/RAND_MAX; /* 0-1
aras reel say */
printf("%d\t%f\n",ri,rf);
}
puts("\n20 tane rasgele sayi urettim...");
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 05prg02.c


C:\TC> 05prg02

$ gcc 05prg02.c -o 05prg02


$ ./05prg02

IKTI
57
10
36
18
90

0.928434
0.204596
0.638691
0.682974
0.790521

73
16
46
4
36

0.090518
0.118015
0.250557
0.593158
0.437132

20 tane rasgele say rettim...

Karakter zerinde lem Yapan Fonksiyonlar (ctype.h)


Tablo 5.3: ctype.h Ktphanesinde tanml fonksiyonlar
Fonksiyon
Bildirimi

Aklama

rnek

isalpha(c)

bir harf ise 0 dan farkl, deilse 0 gnderir


c 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

isalpha('a') 8

isalnum(c)
isascii(c)
isdigit(c)
islower(c)
isupper(c)
toascii(c)
tolower(c)
toupper(c)

isalnum('a') 1
isascii('a') 1
isdigit('4') 2
islower('P') 0
islower('P') 4
toascii(65)

tolower('D') d
toupper('b') B

Program 5.3: ctype.h ktphansinde bulunan baz makrolarn kullanm


1: /* 05prg03.c:
2:
ASCII kodalar 32-127 arasnda olan karakterler zerinde
3:
ctype.h ktphanesinde tanml baz makrolarn kullanm */
4:
5: #include <stdio.h>
6: #include <ctype.h>
7:
8: void main(void)
9: {
10:
int i;
11:
char c;
12:
13:
for(i=32;i<127;i++)
14:
{
15:
c = toascii(i);
16:
printf("%d\t%c %c %d
%d\n",i,c,tolower(c),isalpha(c),isdigit(c));
17:
}
18: }

DERLEME ve ALITIRMA

Sonu

MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 05prg02.c


C:\TC> 05prg02

$ gcc 05prg02.c -o 05prg02


$ ./05prg02

IKTI
32
33
34
35
36
37
...
47
48
49
50
...
65
66
...
97
98
...
122
123
124
125
126

!
"
#
$
%

!
"
#
$
%

0
0
0
0
0
0

0
0
0
0
0
0

/
0
1
2

/
0
1
2

0
0
0
0

0
2
2
2

A
B

a
b

4
4

0
0

a
b

a
b

8
8

0
0

z
{
|
}
~

z
{
|
}
~

8
0
0
0
0

0
0
0
0
0

C Programlama
Dili'ne Giri
Ders 6: Karlatrma Deyimleri

Giri
if, if-else Yaps
switch - case Yaps
? Karlatrma Operatr

Giri
C dilinde if, switch ve ? olmak zere tip karlatrma ilemi yaplr. Ancak ? bir
operatrdr. if karlatrma deyimi ile, dier programlarda olduu gibi if-else yaps
kurulabilir. switch deyimi, bir deikenin ieriine gre program akn ynlendirme
ilemini yapar[1].

if, if-else Yaps


Bu deyimler koullu ilem yapma deyimidir. 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(koul)
{
...
deyimler; (kme)
...
}

Program 6.1'de basit olarak if deyiminin kullanm gsterilmitir. Programda bu deyim


kullanlrken kmenin balangc ve bitiini gsteren, kme parantezleri kullanlmamtr.
Eer if deyiminden sonra icra edilecek deyimler tek satrdan oluuyorsa, bu iaretlerin
kullanlmasna gerek yoktur. Yada if deyimden sonra { ve } iaretleri kullanlmamsa, bu
deyimi takip eden sadece ilk satr ileme konur.
Program 6.1: if deyiminin kullanm
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:

/* 06prg01.c: if deyiminin kullanm */


#include <stdio.h>
int x, y; /* global deikenler */
void main()
{
printf("x degeri: ");
scanf("%d",&x);
printf("y degeri: ");
scanf("%d", &y);
/* deerleri karlatr ve sonucu ekrena yaz */
if (x == y)
printf("x, y ye esit\n");
if (x > y)
printf("x, y den buyuk\n");
if (x < y)
printf("x, y den kucuk\n");
}

5. satrnda global olarak bildirilen x ve y tamsay deikenleri, 10. ve 12. satrlarda scanf
fonksiyonu ile klavyeden okutulmutur. 16., 19. ve 22. satrlarda kullanlan if deyimlerindeki
koul ifadeleri (Bkz Tablo 3.3) ile x, y saylar karlatrlm ve sonu ekrana uygun bir
biimde gsterilmitir. if deyimlerinden sonra { ve } karakterlerinin kullanlmadna dikkat
edin. Eer bu ekilde kullanlrsa, sadece bu deyimlerden sonra gelen ilk satr ileme konur.

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 06prg01.c


C:\TC> 06prg01

$ gcc 06prg01.c -o 06prg01


$ ./06prg01

IKTI
x degeri: 3
y degeri: 8
x, y den kucuk
if

deyiminin else ile birlikte kullanm u ekildedir:


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

Bu yaonn kullanlmasna dair bir rnek. 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. Bir yln artk yl olup olmad aadaki gibi bir if deyimi ile kontrol
edilebilir:
if( yil%4==0 && yil%100!=0 || yil%400==0 ) ... yil artk yl dr

Dikkate edilirse koul, birden ok koul birlikte kullanlarak, mantksal operatrlerle


birletirilmiitir. Program 6.2, klavyeden girilen bir yln artk yl olup olmadn snayan basit
bir programdr. Bu kontrol if-else yaps ile yaplmtr.
Program 6.2: if-else deyiminin kullanm
1: /* 06prg02.c: Bir yln artk yil olup olmadn snar. */
2:
3: #include <stdio.h>
4:
5: void main()

6: {
7:
int yil;
8:
9:
printf("Bir yil girin: ");
10:
scanf("%d",&yil);
11:
12:
if( yil % 4 == 0 && yil % 100 != 0 || yil % 400 == 0 )
13:
printf("%d artik yil\n",yil);
14:
15:
else
16:
printf("%d artik yil degil\n",yil);
17:
18: }

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 06prg02.c


C:\TC> 06prg02

$ gcc 06prg02.c -o 06prg02


$ ./06prg02

IKTI
Bir yil girin: 1996
1996 artik yil

Eer program iinde kullanlacak koullarn says 2 den 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 ikinci dereceden bir polinomun kklerini hesaplamaktadr. Programda delta
deerinin 0 dan kk olmas durumda kklerin karmak sayya dneceide gz nne
alnmtr. Bu program if, else if ve else yaps gstermek iin olduka iyi ve klasik bir
rnektir.
Program 6.3: if, else if, else yaps
1: /* 06prg03.c:
2:
ax^2 + bx + c = 0 denkleminin (karmak sayl kkler dahil) zm
*/
3:
4: #include <stdio.h>
5: #include <math.h>
/* sqrt iin */
6:
7:
8: void main(void)
9: {
10:
float a,b,c,delta,x1,x2,x,kok_delta;
11:
12:
printf("a, b, c degerlerini girin:\n");
13:
scanf("%f %f %f",&a,&b,&c);
14:
15:
delta = b*b - 4*a*c;
16:
17:
if( delta > 0.0 )
18:
{
19:
x1 = ( -b + sqrt(delta) )/( 2*a );
20:
x2 = ( -b - sqrt(delta) )/( 2*a );
21:
22:
printf("\nReel kokler :");
23:
printf("\nx1 = %f ve x2 = %f",x1,x2);
24:
}
25:
26:
else if( delta < 0.0 )
27:
{
28:
kok_delta = ( sqrt(-delta) ) / (2*a);
29:
x = -0.5*b/a;
30:
31:
printf("\nKarmasik kokler :");
32:
printf("\nx1 = %f + %fi ve x2 = %f %fi",x,kok_delta,x,kok_delta);
33:
}
34:
35:
else
36:
{
37:
x = -0.5*b/a;
38:
39:
printf("\nKokler eit :");
40:
printf("\nx1 = x2 = %f",x);
41:
}
42:
43: } /* main */

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 06prg03.c


C:\TC> 06prg03

$ gcc -lm 06prg01.c -o 06prg03


$ ./06prg03

IKTI
a, b, c degerlerini girin:
1. 1. 1.
Karmasik kokler :
x1 = -0.500000 + 0.866025i

switch - case

ve

x2 = -0.500000 - 0.866025i

Yaps

Bu deyim bir deikenin ieriine bakarak, programn akn bir ok seenekten birine
ynlendiren bir deyimdir. case (durum) deyiminden sonra deikenin durumu yazlr ve takip
eden gelen satrlar (deyimler) ilenir. Btn durumlarn aksi sz konu olduunda
gerekletirilmesi istenen deyimler default deyiminden sonraki ksmda bildirilir. Genel
yazm biimi:
switch(deiken)
{
case sabit_1:
...
deyimler;
...
case sabit_2:
...
deyimler;
...
.
.
.
case sabit_n:
...
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
1:
2:
3:
4:
5:
6:
7:

/* 06prg04.c: switch - case yapsnn kullanm */


#include <stdio.h>
void main(void)
{
char kr;

8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:

printf("Lutfen bir karakter girin\n");


kr = getchar(); /* tek bir karakterin okunmas */
switch (kr)
{
case 'a':
printf("a harfine bastiniz\n");
case 'b':
printf("b harfine bastiniz\n");
default:
printf("a veya b ye basmadiniz\n");
}
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 06prg04.c


C:\TC> 06prg04

$ gcc 06prg04.c -o 06prg04


$ ./06prg04

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, bir
sonraki derste 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
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:

/* 06prg05.c: switch - case yaps ve break kullanm */


#include <stdio.h>
void 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;
}
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 06prg05.c


C:\TC> 06prg05

$ gcc 06prg05.c -o 06prg05


$ ./06prg05

IKTI

Lutfen bir karakter girin


a
a harfine bastiniz

Program 6.6 switch-case yapsn farkl bir kullanm ile ilgili bir rnektir. Programda, nce
iki say isteniyor ardndan yaplan seimle bu saylarn toplam yada arpm ekrana
yazdrlyor.
Program 6.6: switch-case yaps ve break kullanm
1:
2:
3:
4:
5:
6:
7:
8:
9:
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:

/* 06prg06.c: switch-case yaps */


#include <stdio.h>
#include <stdlib.h>
int menu(void);
int topla(int,int);
int carp(int,int);
void main(void)
{
int x,y,sonuc,sec;
printf("Iki tam sayi girin: ");
scanf("%d,%d",&x,&y);
printf("Seciminiz: [1] topla, [2] carp, [3] cikis\n");
scanf("%d",&sec);
switch( sec )
{
case 1:
sonuc = x+y;
printf("Toplamlari : %d\n",sonuc);
break;
case 2:
sonuc = x*y;
printf("carpimlari : %d\n",sonuc);
break;
case 3:
printf("Program sonu...\n");
exit(0);
default:
printf("Yanlis secim !...\n\n\a");
}
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 06prg06.c


C:\TC> 06prg06

$ gcc 06prg06.c -o 06prg06


$ ./06prg06

IKTI

Iki tam sayi girin: 5,9


Seciminiz: [1] topla, [2] carp, [3] cikis
2
carpimlari : 45

IKTI
Iki tam sayi girin: 1,8
Seciminiz: [1] topla, [2] carp, [3] cikis
7
Yanlis secim !...

Karlatrma Operatr

C dilinde if-else karlatrma deyiminin yapt ii snrl olarak yapan bir operatrdr.
Genel yazm biimi:
(koul) ? deyim1 : deyim2;

lk nce koul snanr. Eer koul olumluysa (1 ise) 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
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:

/* 06prg07.c: ? ve if-else yapsnn kullanm */


#include <stdio.h>
void main(void)
{
int x,y,z;
printf("x : ");scanf("%d",&x); /* x okunuyor */
printf("y : ");scanf("%d",&y); /* y okunuyor */
if( x )
/* x 0 dan farkl m? */
z = ( y > x ) ? x*y : x+y; /* y>x ise z=x*y, deilse z=x+y */

14:
15:
16:
17:
18:

else
z = 0;
printf("z = %d",z);
}

12. satrdaki if deyimindeki koul biraz farkldr. Genel olarak koul bu ekilde bildirilirse,
koulun 0 dan farkl olup olmad snanr. Yani if( x ) ile if( x!=0 ) ayn anlamdadr.
Bu kullanm ok yagndr. Eer x 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 x=0 ise z deikenine 0 deeri atanmaktadr.
DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 06prg07.c


C:\TC> 06prg07

$ gcc 06prg07.c -o 06prg07


$ ./06prg07

IKTI
x : -5
y : 8
z = -40

Bu operatr birok durumda okunabilirlii kuvvetlendirmek iin tercih edilir. rnein:


Program 6.8: ? operatrnn kullanm
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:

/* 06prg08.c: ? operatoru */
#include <stdio.h>
main()
{
int k;
for(k=0;k<100;k++)
printf("%3d%c",k,(k % 10 == 9) ? '\n':' ');
}

10. satrdaki %d formatna karlk gelen parametre k dr. %c formatna karlk gelen karakter
ise (k % 10 == 9) ifadesinin sonucuna gre '\n' ya da
' ' (boluk) olmaktadr. Her 10 sayda bir bu ifadenin sonucu doru olacana gre imle
aadaki satra geecektir [2].
DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 06prg08.c


C:\TC> 06prg08

$ gcc 06prg08.c -o 06prg08


$ ./06prg08

IKTI
0
10
20
30
40
50
60
70
80
90

1
11
21
31
41
51
61
71
81
91

2
12
22
32
42
52
62
72
82
92

3
13
23
33
43
53
63
73
83
93

4
14
24
34
44
54
64
74
84
94

5
15
25
35
45
55
65
75
85
95

6
16
26
36
46
56
66
76
86
96

7
17
27
37
47
57
67
77
87
97

8
18
28
38
48
58
68
78
88
98

9
19
29
39
49
59
69
79
89
99

C Programlama
Dili'ne Giri
Ders 7: Dngler

Giri
while Dngs
do ... while Dngs
for Dngs

Sonsuz Dng
break Deyimi
continue Deyimi

Giri
Dng deyimleri bir kmenin belli bir koul altnda yinelenmesi iin kullanlr. while,
do...while ve for olmak zere tip dng deyimi vardr. C de dier programlama
dillerinde olduu gibi, bu deyimlerle istenildii kadar i-ie dng yaps kullanlabilir [1].
while

Dngs

Tekrarlama deyimidir. Bir kme ya da deyim while kullanlarak bir ok kez yinelenebilir.
Yinelenmesi iin koul snamas evrim banda yaplr. Koul olumlu olduu srece evrim
yinelenir. ki veya daha ok koul mantksal operatrler birletirilerek verilebilir. Bu deyimin
kullanm Program 7.1 de gsterilmitir. Genel yazm biimi:
while(koul)
{
...
dngdeki deyimler; [kme]
...
}

Program 7.1: while dngs


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:

/* 07prg01.c: while dngs */


#include <stdio.h>
void main(void)
{
int x=0;
while(x <= 10)
printf("%d\n",x++);
}

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.
DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 07prg01.c


C:\TC> 07prg01

$ gcc 07prg01.c -o 07prg01


$ ./07prg01

IKTI
0
1
2
3
4
5
6
7
8
9
10

do ... while

Dngs

Bu deyimin while deyiminden fark, koulun dng sonunda snanmasdr. Yani koul
snanmadan evrime 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


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:

/* 07prg02.c: do-while yaps */


#include <stdio.h>
void main(void)
{
int sayi;
do
{
printf("Bir sayi girin : ");
scanf("%d",&sayi);
printf("iki kati
: %d\n",2*sayi);
}while( sayi>0 );

/* koul */

puts("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 mesaj 17.
satrdaki puts fonksiyonu ile verilir.
DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 07prg02.c


C:\TC> 07prg02

$ gcc 07prg02.c -o 07prg02


$ ./07prg02

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

for

Dngs

Bu deyim, dier dng deyimleri gibi bir bei bir ok kez tekrarlamakta 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


1: /* 07prg03.c:
2:
for dngs ile faktoriyel hesab. n!=1*2*3...n eklinde
tanmlanr. */
3:
4: #include <stdio.h>
5:
6: void main()
7: {
8:
long int i,n,faktor;
9:
10:
printf("Faktoriyeli hesaplanacak sayi girin : ");
11:
scanf("%ld",&n);
12:
13:
faktor=1;
14:
for(i=1;i<=n;i++)
15:
{
16:
faktor *= i;
/* n! = 1 x 2 x 3 x ... x n */
17:
}
18:
19:
printf("%ld! = %ld\n",n,faktor);
20: }

Program da faktoriyel hesab 16. satrda gerekletirilmitir. n ve faktor tamsay


deikenkeri long tipinde bildirilmitir. nk faktoriyel deeri 4 bayt byklnde bir
tamsay olabilir.
DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 07prg03.c


C:\TC> 07prg03

$ gcc 07prg03.c -o 07prg03


$ ./07prg03

IKTI
Faktoriyeli hesaplanacak sayi girin : 4
4! = 24

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

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:

/* 07prg04.c: Say sistdemi:


%d : desimal
10 tabanndaki
%o : oktal
8 tabanndaki
%x : hexadesimal 16 tabanndaki
%X : hexadesimal 16 tabanndaki

say
say
say (kk harf)
say (byk harf) */

#include <stdio.h>
main()
{
int i;
for (i=0; i<16; i++)
printf("%2d %2o %x

%X\n", i,i,i,i);

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 07prg04.c


C:\TC> 07prg04

$ gcc 07prg04.c -o 07prg04


$ ./07prg04

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

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
1: /* 07prg05.c:

2:
basamakl, basamaklarnn kpleri toplam kendisine eit olan tam
3:
saylara Armstrong say denir. rnein: 371 = 3^3 + 7^3 + 1^3.
4:
Bu program -ie gemi 3 dng ile btn Aramstrong saylar
bulur. */
5:
6: #include <stdio.h>
7:
8: main()
9: {
10:
int a,b,c,kup,sayi,k=1;
11:
12:
for(a=1;a<=9;a++)
13:
for(b=0;b<=9;b++)
14:
for(c=0;c<=9;c++)
15:
{
16:
sayi = 100*a + 10*b + c;
/* sayi = abc ( basamakl) */
17:
kup = a*a*a + b*b*b + c*c*c; /* kup = a^3+b^3+c^3
*/
18:
19:
if( sayi==kup ) printf("%d. %d\n",k++,sayi);
20:
}
21:
22: }

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 07prg05.c


C:\TC> 07prg05

$ gcc 07prg05.c -o 07prg05


$ ./07prg05

IKTI
1.
2.
3.
4.

153
370
371
407

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

for(;;)
printf("Sonsuz dng iindeyim...\n");

gibi.
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. rnein:
...
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
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:

/* 07prg06.c: n>=0 olduu srece n! li hesaplar */


#include <stdio.h>
void main()
{
long int i,n,faktor;
do{
printf("Faktoriyeli hesaplanacak sayi girin : ");
scanf("%ld",&n);
if(n<0) break; /* dngy sonlandr */
faktor=1;

16:
17:
18:
19:
20:
21:
22:
23: }

for(i=1;i<=n;i++)
faktor *= i; /* n!= 1 x 2 x 3 x ... x n */
printf("%ld! = %ld\n",n,faktor);
}while(n>=0);

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 07prg06.c


C:\TC> 07prg06

$ gcc 07prg06.c -o 07prg06


$ ./07prg06

IKTI
Faktoriyeli
2! = 2
Faktoriyeli
3! = 6
Faktoriyeli
5! = 120
Faktoriyeli
9! = 362880
Faktoriyeli
0! = 1
Faktoriyeli

continue

hesaplanacak sayi girin : 2


hesaplanacak sayi girin : 3
hesaplanacak sayi girin : 5
hesaplanacak sayi girin : 9
hesaplanacak sayi girin : 0
hesaplanacak sayi girin : -4

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


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:

/* 07prg07.c:
x, y'den farkl olmak zere |x|+|y|<=3 eitsizliini salayan
tamsay iftlerini ekrana yazar */
#include <stdio.h>
main()
{
int x,y,k=1;
for (x=-3;x<=3;x++)
for (y=-3;y<=3;y++)
{
if(x==y) continue; /* x=y ise alt satr atla */
if( abs(x)+abs(y)<=3 )
printf("%2d. (%2d,%2d)\n",k++,x,y);
}
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 07prg07.c


C:\TC> 07prg07

$ gcc 07prg07.c -o 07prg07


$ ./07prg07

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)

C Programlama
Dili'ne Giri
Ders 8: Fonksiyonlar (Alt programlar)

Giri
Fonksiyon Kavram
Fonksiyon Bildirimi
Geri Dn Deerleri
Fonksiyon Parametreleri
main Fonksiyonu
Fonksiyon Says
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. C Dilini
renmek iin ilk nce fonksiyon oluturmay ve onlarn dierleri ile birlikte kullanlmasn
renmek gerekir. Bundan sonraki derslerde fonksiyonlar kullanlacaktr.

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, geri dn deeri
(return value) olarak adlandrlr. Unutmayn ki, bir fonksiyonun ka girii olursa olsun sadece
bir k vardr. Aada bir ve iki girili iki fonksiyonun kutu gsterimi verilmitir.
Tek parametreli sqrt(x) fonksiyonu:

ki parametreli F(x,y) = x*x + x*y fonksiyonu:

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:


int topla(x,y)
int x,y
{
int sonuc;
sonuc = x + y;
return sonuc;
}

/* klasik biim */

int topla(int x,int y)


{
int sonuc;
sonuc = x + y;
return sonuc;
}

/* modern biim */

int topla(int x,int y)


{
return (x+y);
}

/* modern biim */

veya

veya

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.

Fonksiyon Bildirimi
Bir fonksiyonun bildirimi iki trl yaplr:
1. Ana programdan nce:
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.

...
int topla(int x,int y)
{
...
}
...
main()
{
...
}

/* fonksiyon */

12. Ana programdan sonra: Bu durumda fonksiyon rnei (function prototype) ana
programdan nce bildirilmelidir.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.

...
int topla(int x,int y);
...
main()
{
...
}
...
int topla(int x,int y)
{
...
}

/* fonksiyon prototipi */

/* fonksiyon */

Bir C program iinde, yazm olduunuz fonksiyonlar genellikle bu iki tipte kullanlr. kinci
kullanmda fonksiyon prototipi mutlaka bildirilmelidir. Aksi halde bir hata mesaj ile
karlalr. Fonksiyon prototipinde arguman isimlerinin yazlmas zorunlu deildir. Sadece
arguman tiplerini belirtmek de yeterlidir. Yukardaki topla fonksiyona ait prototip:
int topla(int x,int y);

ekinde yazlabilei gibi


int topla(int,int);

eklinde de yazlabilir.
Buraya kadar anlatlanlar Program 8.1 zeride zetlenmitir.
Program 8.1: topla fonksiyonunun ana programda kullanlmas

1: /* 08prg01.c: iki sayy toplar ve sonucu ekranda gsterir */


2:
3: #include <stdio.h>
4:
5: int topla( int x,int y ); /*** fonksiyon prototipi ***/
6:
7: void main(void)
8: {
9:
int toplam,a,b;
10:
11:
printf("Iki sayi girin : ");
12:
scanf("%d %d",&a,&b);
13:
14:
/* fonksiyon arlp, a ve b deerleri parametre olarak
aktarlyor.
15:
topla(a,b) = a + b deeri toplam deikenine atanmas */
16:
toplam = topla(a,b);
17:
18:
printf("%d ve %d nin toplami %d dir.\n", a,b,toplam);
19: }
20:
21: /*** fonksiyon tanmlanmas ***/
22:
23: /* Bu fonksiyon iki tamsayy toplar */
24: int topla( int x, int y )
25: {
26:
int sonuc;
27:
sonuc = x + y;
28:
return sonuc;
29: }

fonksiyonun prototipi 5. satrda, kendisi 23-29. satrlarda bildirilmitir. 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.
13. satrda toplam adl tamsay deikenine topla fonksiyonunun dn deeri (a + b
deeri) atanmtr.
topla

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 08prg01.c


C:\TC> 08prg01

$ gcc 08prg01.c -o 08prg01


$ ./08prg01

IKTI
Iki sayi girin : 5 12
5 ve 12 nin toplami 17 dir.

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);
/* parantez kullanmak zorunlu deildir */
return 10;
/* deiken kullanmak mecbur deil */
return topla(a,b)/2.0; /* 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 Ders 6:
Karlatrma Deyimleri ksmnda verilmiti.
Program 8.2: iki return deyimi kullanan bir fonksiyon
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:

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

15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:

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

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 08prg02.c


C:\TC> 08prg02

$ gcc 08prg02.c -o 08prg02


$ ./08prg02

IKTI
Bir yil girin: 1996
1996 artik yil

Bir fonksiyonun her zaman geri dn deerinin olmas gerekmez. Bu durumda return
deyimi kullanlmaz. 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
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:

/* 08prg03.c: 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;

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:

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 !*/
}
main()
{
int miktar;
printf("Cekilecek para miktari (YTL) = ");
scanf("%d",&miktar);
bankamatik(miktar);

/* fonksiyon bir deikene atanmam ! */

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 08prg03.c


C:\TC> 08prg03

$ gcc 08prg03.c -o 08prg03


$ ./08prg03

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.
Program 8.4: basit kutu izen fonksiyon
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:

/* 08prg04.c: Basit bir kutu izen fonksiyon */


#include <stdio.h>
void kutu_ciz(int,int);
main()
{
kutu_ciz(8,35);
}

/* 8 satr, 35 stn */

void kutu_ciz( int satir, int sutun )


{
int sut;
for ( ; satir > 0; satir--)
{
for (sut = sutun; sut > 0; sut--)
printf("X");
printf("\n");
}
}

Programda de sadece 18. satr defalarca ileme konur. Program altrldnda 8*35=280
adet 'X' karakteri ekrana bastrlr. 5. satrda kutu_ciz fonksiyonunun prototipi
tanmlanmtr. Bu fonksiyonun parametreleri (satir, sutun) ile izilecek olan kutunun
ebatlar belirlenir. Bu fonksiyon 8 satr ve 35 stun iin main() fonsiyonundan 9. satrda
arlmtr. 15. satrda ilk for dngs evrime balar. Fakat bir baalang deeri
belirtilmemitir. Bu durumda satir deikeni fonksiyondan buraya aktarlr. 17. satrda ikinci
for dngs evrime balar ve sadece 18. satr bu dngnn iinde deerlendirilir. Yani
satir deikeninin herbir deeri iin, btn sutun deerleri tekrarlanr. kinci dng
tamamlandnda 20. satrda alt satra geilir ve birinci evrim yeni bir deer iin yinelenir.
DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 08prg04.c


C:\TC> 08prg04

$ gcc 08prg04.c -o 08prg04


$ ./08prg04

IKTI

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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):
long faktoriyel(n)
int n
{
int i=1;
long f=1;

/* kalsik biim */

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

eklinde yada:
long faktoriyel(int n)
{
int i=1;
long f=1;

/* modern biim */

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

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

Bu fonksiyon her arldnda geriye 0 ile RAND_MAX arasnda rasgele bir say gnderir.
RAND_MAX, stdlib.h'de tanml sembolik bir sabittir. Deeri (derleyiciye ve iletim sistemine
bal olarak) en byk int limiti ile snrldr. Turbo C 16 bit bir uygulamalarda kullanld
iin bu deer:
#define RAND_MAX

32767

eklinde, GCC 32 bit uygulamalarda kullanld iin bu deer:


#define RAND_MAX

2147483647

eklinde tanmlanmtr. Bu fonksiyonun kullanm Program 5.2'de gsterilmiti.


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

Fonksiyonu

Ana program anlamna gelen main de bir fonksiyondur. C programlarnn balangc ve sonu
bu fonksiyonla belirlenir. Ancak main fonksiyonu da geri dn deeri kullanabilir. main
fonksiyonunun geri dn deerinin grevi programn almas bittikten sonra sonucu iletim
sistemine iletmektir.
Programclar ounlulukla main fonksiyonunun bana ey yazmaz.
main()
{
...
}

Bu durumda geri dn deeri tamsay (int) kabul edilir. Bu ekilde kullanmda, yeni tip
derleyiciler uyar (warning) mesaj verebilirler. Bu yzden, programclar main fonksiyonunun
nne aadaki gibi void deyimi eklerler.
void main()
{
...
}

fonksiyonuna parametre aktarmak ta mmkndr. Ana programa parametre aktarm,


derlenmi bir program komut satrndan (iletim sistemi ortamndan) ilk altrlaca zaman
yaplr. main fonksiyonunun bu ekildeki kullanm Ders 17: letim Sistemi Ynetimi
ksmnda ayrntl olarak ilenecektir. Eer parametre aktarlmayacaksa:
main

main()
{
...
}

yada
void main(void)
{
...
}

eklinde kullanlabilir.

Fonksiyon Says
Ana programdan, main fonksiyonundan, istee gre birden ok fonksiyon armak
mmkndr. Bir fonksiyonun arlmas demek, o fonksiyonun geri dn deerinin ana
programda kullanlmas demektir. 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
1:
*/
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:

/* 08prg05.c: Verilen bir tarihin yln kanc gn olduunu hesaplar.


#include <stdio.h>
int yilin_gunu(int,int,int);
int artik_yil(int);
void main(void)
{
int gun = 1;
/* tarih: 01 Austos 2003 */
int ay = 8;
int yil = 2003;
printf("%02d %02d %d yilinin\n",gun,ay,yil );
printf("%d. gunudur\n",yilin_gunu(gun,ay,yil) );
}

18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:

/* yil artl yl ise 1 aksi halde 0 gnderir */


int artik_yil(int yil)
{
if( yil%4==0 && yil%100!=0 || yil%400==0 ) return 1;
else return 0;
}
/* yln kanc gn olduunu hesaplar ve o gn gderirir */
int yilin_gunu(gun,ay,yil)
int gun,ay,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
case 1: ygun
}

+=
+=
+=
+=
+=
+=
+=
+=
+=
+=
+=
+=

31;
30;
31;
30;
31;
31;
30;
31;
30;
31;
28+artik_yil(yil); /* 28+1 veya 28+0 */
31;

return ygun;
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 08prg05.c


C:\TC> 08prg05

$ gcc 08prg05.c -o 08prg05


$ ./08prg05

IKTI
01 08 2003 yilinin
213. gunudur

Makro Fonksiyon Tanmlamas


Balk dosyalarnda da bolca olan makro fonksiyon 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. Makro fonksiyon tanmlamalar Ders 20: C Makrolar ksmnda 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
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:

/* 08prg06.c: makro fonksiyon uygulamas */


#include <stdio.h>
#define buyuk(a,b) ((a>b)?a:b) /* makro fonksiyon */
main()
{
int x,y,eb;
printf("iki say girin: ");
scanf("%d,%d",&x,&y);
eb = buyuk(x,y);
printf("buyuk olan

%d\n",eb);

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 08prg06.c


C:\TC> 08prg06

$ gcc 08prg06.c -o 08prg06


$ ./08prg06

IKTI
iki say girin: 8,6
buyuk olan 8

C Programlama
Dili'ne Giri
Ders 9: Diziler

Giri
Dizilerin Bildirimi
Dizilere Balang Deeri Verme
Dizileri Yazdrma/Okuma
Sralama (Sorting)
Karakter Dizileri (Strings)
ok Boyutlu Diziler

Dizilerin Fonksiyonlarda Kullanlmas

Giri
Dizi bir kmedir. Ayn tipteki verilere tek bir isimle erimek iin kullanlr. Bir dizi
bildirildikten sonra, dizinin btn elemanlar bellekte pepee saklanr [1]. Bu yzden dizilere
tek bir isim altnda ok sayda deiken ieren bellek blgesi de denir. Buna gre bir diziyi
dizi yapan iki temel zellik vardr [2]:

dizi elemanlarn bellekte srekli biimde bulunmas


dizi elemanlarn ayn trden deikenler olmas

Dizilerin Bildirimi
Bir dizi ok sayda deiken barndrdndan, bunlar birbirinden ayrdetmek iin indis ad
verilen bir bilgiye ihtiya vardr. C Programlama Dili'nde, bir dizi hangi tipte tanmlanm
olursa olsun balang indisi her zaman 0'dr.
Bir dizinin bildirim ileminin genel biimi syledir:
tip dizi_ad[eleman_says];

rnein, 5 elemanl baz ktle verilerini tutmak iin kutle dizisi yle tanmlanabilir:
float kutle[5];

Bu dizinin elemanlarna bir deer atama ilemi yle olabilir:


kutle[0]
kutle[1]
kutle[2]
kutle[3]
kutle[4]

=
=
=
=
=

8.471
3.683
9.107
4.739
3.918

NOT
1. elemann indisi 0, 5. elemann indisinin 4 olduuna dikkat edin.
Bildirim srasnda dizilerin eleman says tamsay trnden bir sabit ifadesiyle belirtilmesi
zorunludur. rnein:
int n=100;
int a[n];

eklindeki tanmlama, dizi uzunluunun deiken (n) ile nelirtilmesi nedeniyle geersizdir.
Bunun yerine dizilerin eleman says sembolik sabitlerle belirtmek mmkndr. rnein:
#define n 100
...
int a[n];

Bir dizinin bellekte kaplad alan bayt cinsinden sizeof operatr ile renilebilir[4].
rnein:
int
...

a[5],b,c;

b = sizeof(a);
/* bellekte kaplad alan: b = 4*5 = 20
bayt */
c = sizeof(a)/sizeof(int); /* Dizinin boyutu
: c = 20/4 = 5
*/

Dizilere Balang Deeri Verme


Bir diziye balang deerleri aadaki gibi ksa formda atanabilir:
float kutle[5]= { 8.471, 3.683, 9.107, 4.739, 3.918 };
int
kilo[3] = { 25, 72, 94 };
double a[4]
= { 10.0, 5.2, 7.5, 0.0};

Kme parantezlerinin sonlandrc ; karakteri ile bittiine dikkat ediniz. Bir dizinin uzunluu
belirtilmeden de balang deeri atamak mmkndr. rnein:
int
a[] = { 100, 200, 300, 400 };
float v[] = { 9.8, 11.0, 7.5, 0.0, 12.5};

Derleyici bu ekilde bir atama ile karlatnda, kme parantezi iindeki eleman saysn
hesaplar ve dizinin o uzunlukta aldn varsayar. Yukardaki rnekte, a dizisinin 4, v
dizisinin 5 elemanl olduu varsaylr.

Dizileri Yazdrma/Okuma
ve scanf fonksiyonlar bir dizinin okunmas ve yazdrlmas iin de kullanlr.
rnein bir A dizisinin aadaki gibi bildirildiini varsayalm:
printf

int A[10];

Bu dizinin elemanlarn klavyeden okumak iin:


for(i=0;i<10;i++)
scanf("%d",&A[i]);

daha sonra bu deerlerini ekrana yazmak iin:


for(i=0;i<10;i++)
printf("%d\n",A[i]);

Program 9.1, klavyeden girilen n = 10 adet saynn ortalamasn hesaplar. Ortalama


forml ile hesaplanabilir.
Program 9.1: 10 saynn ortalamasn hesaplar
1: /* 09prg01.c: 10 tamsaynn aritmetik ortalamasn hesaplar */
2:
3: #include <stdio.h>
4:

5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:

#define n 10
void main(void)
{
int
i,x[n],toplam=0;
float ort;
for(i=0;i<n;i++)
{
printf("%d. sayi : ",i+1);
scanf("%d",&x[i]); /* i+1. say okunuyor ... */
toplam += x[i];
}
ort = (float) toplam/n;
printf("Sayilarin ortalamasi = %f\n",ort);
}

Bu programda, ortalamas alnacak saylar ad x olan 10 elemanl tamsay tipindeki bir dizide
saklanmtr. Bu ekilde saklanan saylarn hepsi program alt srece bellekte kalacaktr.
Bu sayede, program iinde daha sonra (gerektiinde) ayn saylar tekrar kullanlabilir.
DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 09prg01.c


C:\TC> 09prg01

$ gcc 09prg01.c -o 09prg01


$ ./09prg01

IKTI
IKTI
1. sayi : 1
2. sayi : 0
3. sayi : 9
4. sayi : 7
5. sayi : 2
6. sayi : 10
7. sayi : 11
8. sayi : 4
9. sayi : 6
10. sayi : 5
Sayilarin ortalamasi = 5.500000

Program 9.1 dizi kullanmadan da yazlabilirdi. Baz dizi kullanmak kanlmaz olur. Porgram
9.2, n = 10 tane saynn ortalamasn ve standart sapmasn hesaplar.

Standart sapma:

forml ile hesaplanabilir, burada

Program 9.2: n=10 saynn ortalamasn ve standart sapmasn hesaplar

dir.

1:
2:
*/
3:
4:
5:
6:
7:
8:
9:
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:

/* 09prg02.c:
10 tamsaynn aritmetik ortlamasn ve standart sapmasn hespalar.
#include <stdio.h>
#include <math.h>
#define n 10
void main(void)
{
int
i,x[n];
int
toplam=0;
float ort,std_sap=0.0;
/* ortalama hesab */
for(i=0;i<n;i++)
{
printf("%d. sayi : ",i+1);
scanf("%d",&x[i]);
toplam += x[i];
}
ort = (float) toplam/n;
/* standart sapma hesab */
for(i=0;i<n;i++)
std_sap += pow(x[i]-ort,2);
std_sap = sqrt( std_sap/(n-1) );
printf("Ortalama
= %f\n",ort);
printf("Standart sapma = %f\n",std_sap);
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 09prg02.c


C:\TC> 09prg02

$ gcc 09prg02.c -o 09prg02


$ ./09prg02

IKTI
IKTI
1.
2.
3.
4.
5.
6.
7.
8.
9.

sayi
sayi
sayi
sayi
sayi
sayi
sayi
sayi
sayi

:
:
:
:
:
:
:
:
:

7
8
9
6
5
8
8
10
11

10. sayi : 6
Ortalama
= 7.000000
Standart sapma = 2.054805

Sralama (Sorting)
Baz uygulamalarda bir grup saynn bykten ke, veya kkten bye, doru
sralanmas gerekebilir. Bu tip sralama problemleri iin eitli algoritmalar gelitirilmitir.
Sralama mantn anlamadan nce bir dizinin en byk (veya en kk) elemannn nasl
bulunduunu anlamak gerekir. Program 9.3 bir dizinin en byk elemann bulup ekrana
yazar.
Program 9.3: Bir dizinin en byk elemannn bulunuu
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:

/* 09prg03.c:
Bir dizinin en byk elemann bulup ekrana yazar */
#include <stdio.h>
void main(void)
{
int
a[10] = {100, -250, 400, 125 ,550, 900, 689, 450, 347, 700};
int
k,eb;
eb = a[0]; /* ilk eleman en byk kabul ediliyor */
for(k=1;k<10;k++)
if(a[k]>eb) eb = a[k];
printf("En buyuk eleman = %d\n",eb);
}

En byk sayy bulan bu algoritma olduka kolaydr. 11. satrda eb = a[0]; atamas ile
dizinin ilk elemannn en byk olduu varsaylr. Daha sonra bye rastladka (14. satrda)
eb = a[k]; ile eb deimektedir.
DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 09prg03.c


C:\TC> 09prg03

$ gcc 09prg03.c -o 09prg03


$ ./09prg03

IKTI
IKTI
En buyuk eleman = 900

Program 9.3 bir dizinin en byk elemann bulur. En byk elemann kanc indis (eleman)
olduu sorgulanmak istendiinde: programdaki koul yapsn aadaki gibi deitirmek
yeterlidir. eb deitike, i deikeni en byk elemann indisini tutar.
for(k=0;k<10;k++)
if( a[k]>eb ){
eb = a[k];
i = k;
}

n elemanl bir dizinin, elemanlarn bykten ke doru sralamak iin ok popler iki
algoritma aada verilmitir[2].
Seerek Sralama (Selection Sort):
En byk eleman bul baa koy biimindeki sramadr. Algoritmann uygulamas Program
9.4'de gsterilmitir.
Bu algoritmada kullanlan kombinasyon says (algoritmann karmakl): n*(n-1)/2 dir.
Program 9.4: Seerek Sralama (Selection Sort) Algoritmas
1:
2:
3:
4:
5:
6:
7:
8:
9:
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:

/* 09prg04.c:
Seerek Sralama (Selection Sort) Algoritmas ile bir
dizinin elemanlarn bykten ke dogru sralar */
#include <stdio.h>
#define n 10
void main(void)
{
int
a[n] = {100, -250, 400, 125 ,550, 900, 689, 450, 347, 700};
int
i,j,k,eb;
printf("Once : ");
for(k=0;k<n;k++)
printf("%5d ",a[k]);
for(k=0;k<n;k++)
{
eb = a[k];
i = k;

/* Ekrana yaz */
/* Srala */

for(j=k+1;j<n;j++)
if(a[j]>eb){
eb = a[j];
i = j;
}
a[i] = a[k];
a[k] = eb;
}
printf("\nSonra: ");
for(k=0;k<n;k++)
printf("%5d ",a[k]);
printf("\n");
}

/* Ekrana yaz */

38:

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 09prg04.c


C:\TC> 09prg04

$ gcc 09prg04.c -o 09prg04


$ ./09prg04

IKTI
IKTI
Once :
Sonra:

100
900

-250
700

400
689

125
550

550
450

900
400

689
347

450
125

347
100

700
-250

Kabarck Sralama (Bubble Sort):


Yanyana elemanlar karlatrarak yer deitir biimde sralamadr. Algoritmann uygulamas
Program 9.5'de gsterilmitir.
Bu algoritmann karmakl: (n-1)2 dir.
Program 9.5: Kabarck Sralama (Bubble Sort) Algoritmas
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:

/* 09prg05.c:
Kabarck Sralama (Bubble Sort) Algoritmas ile bir
dizinin elemanlarn bykten ke dogru sralar */
#include <stdio.h>
#define n 10
void main(void)
{
int
a[n] = {100, -250, 400, 125 ,550, 900, 689, 450, 347, 700};
int
j,k,gecici;
printf("Once : ");
for(k=0;k<n;k++)
printf("%5d ",a[k]);
for(k=0;k<n-1;k++)
for(j=0;j<n-1;j++)
if(a[j]<a[j+1]){
gecici = a[j];
a[j] = a[j+1];
a[j+1] = gecici;
}
printf("\nSonra: ");
for(k=0;k<n;k++)
printf("%5d ",a[k]);
printf("\n");
}

/* Ekrana yaz */
/* Srala */

/* Ekrana yaz */

32:

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 09prg05.c


C:\TC> 09prg05

$ gcc 09prg05.c -o 09prg05


$ ./09prg05

IKTI
IKTI
Once :
Sonra:

100
900

-250
700

400
689

125
550

550
450

900
400

689
347

450
125

347
100

700
-250

Karakter Dizileri (Strings)


Karakter dizileri en sk kullanlan dizilerdir. Karakterler zerinde ilemlerin hzl ve etkin bir
biimde yaplabilmesi iin sonlandrc karakter denilen bir tanmlamdan
faydalanlmaktadr[2].
Sonlandrc karakter:

dizinin bittii yeri gsterir


ASCII tablosunun sfr numaral ('\0') karakteridir.

Karakter dizilerine iki ekilde balang deeri verilebilir.


char s[7] = {'d','e','n','e','m','e','\0'};

yada
char s[7] = "deneme";

Birinci tanmlamada sonlandrc karakter programc tarafndan konmaldr. Ikinci


tanmlamada ise buna gerek yoktur. Karakter dizileri gets fonksiyonu ile klavyeden
okunabilir. rnein:
char ad[20];
...
gets(ad);

Karakter dizleri veya katarlar ders 11'de daha ayrntl ilenecektir. Burada sadece iki basit
rnek sunulmutur. Program 9.6'da bir karakter dizisinin uzunluunun nasl bulunduu,
Program 9.7'de ise bir karakter dizisinin tersyz edilii gsterilmitir. nceleyiniz.
Program 9.6: Bir karakter dizisinin uzunluunu bulur
1: /* 09prg06.c: Bir karakter dizisinin uzunluunu bulur */
2:
3: #include <stdio.h>
4:

5: void main(void)
6: {
7:
char s[20];
8:
int k=0;
9:
10:
printf("Bir seyler yazin : ");
11:
gets(s);
/* diziyi oku */
12:
13:
while(s[k]!='\0')
/* sonlandrc karaktere kadar */
14:
k++;
15:
16:
printf("Dizinin uzunlugu : %d\n",k);
17: }
18:

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 09prg06.c


C:\TC> 09prg06

$ gcc 09prg06.c -o 09prg06


$ ./09prg06

IKTI
IKTI
Birseyler yazin : ahmet
Dizinin uzunlugu : 5

Program 9.7: Bir karakter dizisinin tersini bulur


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:

/* 09prg07.c: Bir karakter dizisini tersyz eder */


#include <stdio.h>
void main(void)
{
char s[20];
int i,n,gecici;
printf("Bir seyler yazin : ");
gets(s);
/* diziyi oku */
for(n=0;s[n]!='\0';n++)
;

/* sonlandrc karaktere kadar */

for(i=0;i<n/2;i++)
{
gecici
= s[n-i-1];
s[n-i-1] = s[i];
s[i]
= gecici;
}
printf("Tersi
}

: %s\n",s);

25:

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 09prg07.c


C:\TC> 09prg07

$ gcc 09prg07.c -o 09prg07


$ ./09prg07

IKTI
IKTI
Bir seyler yazin : Deneme
Tersi
: emeneD

ok Boyutlu Diziler
Bir dizi aadaki gibi bildirildiinde bir boyutlu (tek indisli) dizi olarak adlandrlr. Bu tip
dizilere vektr denir.
float a[9];

Bir dizi birden ok boyuta sahip olabilir. rnein iki boyutlu b dizisi yle tanmlanabilir:
float b[9][4];

Uygulamada genellikle iki boyutlu dizilere rastlanr. ki boyutlu diziler matris olarak
adlandrlr. ilk boyut satr, ikinci boyut stn denir. Yukarda b matrisinin eleman says
9x4=36 dr. Bu durumda, genel olarak bir dizi yle gsterilir:
Tablo 9.1: Dizlerin Bildirimi
Dizi eiti
Tek boyutlu diziler (Vektrler)
ki boyutlu diziler (Matrisler)
ok boyutlu diziler

Genel Bildirimi

rnek

tip dizi_ad[eleman_says]

int veri[10];

tip dizi_ad[satr_says][sutun_says]

float mat[5][4

tip dizi_ad[boyut_1][boyut_2]...[boyut_n];

double x[2][4]

ok boyutlu diziler tek boyuta indir generek bellekte tutulurlar. Tek indisli dizilerde olduu
gibi, ok indisli dizilere de balang deeri vermek mmkn. rnein 3 satr 4 stnlu
(3x4=12 eleman) bir x matrisinin elemanlar yle tanmlanabilir:
int x[3][4] = {11,34,42,60, 72,99,10,50,

80,66,21,38};

yada
int x[3][4] = {11,34,42,60, /* 1. satr elemanlar */
72,99,10,50, /* 2. satr elemanlar */
80,66,21,38}; /* 3. satr elemanlar */

Bu matris ekrana 'matris formunda' yazlmak istendiinde:


for(i=0;i<3;i++){
for(j=0;j<4;j++)

printf("%4d",x[i][j]);
printf("\n");
}

kts:
11
72
80

34
99
66

42
10
21

60
50
38

eklinde olacaktr.

Program 9.8 iki matrisin toplamn baka bir matrise aktarr. Matris toplam
forml ile tanmldr. nceleyiniz.
Program 9.8: ki matrisin toplam
1:
2:
3:
4:
5:
6:
7:
8:
9:
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:

/* 09prg08.c: iki matrisin toplam */


#include <stdio.h>
#define SAT 2
#define SUT 3
void main(void)
{
int a[SAT][SUT] = {5,3,7, 0,1,2};
int b[SAT][SUT] = {1,2,3, 4,5,6};
int c[SAT][SUT];
int i,j;
puts("A Matrisi:");
for(i=0;i<SAT;i++){
for(j=0;j<SUT;j++)
printf("%4d",a[i][j]);
printf("\n");
}
puts("B Matrisi:");
for(i=0;i<SAT;i++){
for(j=0;j<SUT;j++)
printf("%4d",b[i][j]);
printf("\n");
}
puts("\nC Matrisi:");
for(i=0;i<SAT;i++)
{
for(j=0;j<SUT;j++)
{
c[i][j] = a[i][j] + b[i][j];
printf("%4d",c[i][j]);
}
printf("\n");
}
}

DERLEME ve ALITIRMA

MS DOS (Turbo C)

Linux

C:\TC> tcc 09prg08.c


C:\TC> 09prg08

$ gcc 09prg08.c -o 09prg08


$ ./09prg08

IKTI
IKTI
A Matrisi:
5
3
0
1
B Matrisi:
1
2
4
5

7
2
3
6

C Matrisi:
6
5 10
4
6
8

Program 9.9 iki kare matrisin arpm baka bir matrise aktarr. Matris arpm
forml ile tanmldr.
Program 9.9: ki matrisin arpm
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:

/* 09prg09.c: iki kare matrisin arpm */


#include <stdio.h>
#define N 3

/* kare matrislerin boyutu */

void main(void)
{
int a[N][N] = {5,3,7, 0,1,2, 9,0,4};
int b[N][N] = {1,2,3, 4,5,6, 7,8,9};
int c[N][N];
int i,j,k,toplam;
puts("A Matrisi:");
for(i=0;i<N;i++){
for(j=0;j<N;j++)
printf("%4d",a[i][j]);
printf("\n");
}
puts("B Matrisi:");
for(i=0;i<N;i++){
for(j=0;j<N;j++)
printf("%4d",b[i][j]);
printf("\n");
}
puts("\nC Matrisi:");

29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41: }

for(i=0;i<N;i++){
for(j=0;j<N;j++){
toplam = 0.0;
for(k=0;k<N;k++)
toplam += a[i][k]*b[k][j];
c[i][j] = toplam;
printf("%4d",c[i][j]);
}
printf("\n");
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 09prg09.c


C:\TC> 09prg09

$ gcc 09prg09.c -o 09prg09


$ ./09prg09

IKTI
IKTI
A Matrisi:
5
3
0
1
9
0
B Matrisi:
1
2
4
5
7
8

7
2
4
3
6
9

C Matrisi:
66 81 96
18 21 24
37 50 63

Program 9.10 bir kare matrisin determinantn Gauss Yoketme Yntemi ile hesaplar.
nceleyiniz.
Program 9.10: Bir matrisin determinant
1: /* 09prg10.c: nxn bir kare matrisin determinant.
2:
1. Matris Gauss yoketme yntemi ile st-gen forma getirilir.
3:
2. "st-gen matrisin determinant asal kegen zerinde bulunan
4:
elemanlarn arpmna eittir" kuralna gre determinat
hesaplanr. */
5:
6: #include <stdio.h>
7:
8: #define n 3 /* kare matrisin boyutu */
9:
10: int main(void)

11: {
12:
float a[n][n];
13:
float det=1.0;
14:
int
i,j,k;
15:
16:
printf("Matrisin kendi formunu girin:\n");
17:
for(i=0;i<n;i++)
18:
for(j=0;j<n;j++)
19:
scanf("%f",&a[i][j]);
20:
21:
/* Gauss yoketme yntemi */
22:
for(k=0 ; k<n-1;k++)
23:
for(i=k+1; i<n ;i++)
24:
for(j=k+1; j<n ;j++)
25:
a[i][j] -= a[k][j] * a[i][k]/a[k][k];
26:
27:
/* determinant hesaplanyor */
28:
for(i=0;i<n;i++)
29:
det *= a[i][i];
30:
31:
printf("Matrisin determinanti = %f\n",det);
32:
33:
return 0;
34: }

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 09prg10.c


C:\TC> 09prg10

$ gcc 09prg10.c -o 09prg10


$ ./09prg10

IKTI
IKTI
Matrisin kendi formunu girin:
3 2 5
2 3 6
5 4 3
Matrisin determinanti = -32.000000

Dizilerin Fonksiyonlarda Kullanlmas


Diziler de sradan deikenler gibi bir fonksiyona parametere olarak akratlabilir. Fakat,
aktarma kural biraz farkldr. Her zaman dizinin yannda boyutunun da bilinmesi gerekir.
Program 9.11 de float tipindeki bir dizinin elemanlarnn yazdrlmas ii bir fonksiyona
yaptrlmtr. Fonkisyona parametre olarak dizinin yannda boyutu da ilave edilmitir.
nceleyiniz.
Program 9.11: Bir dizinin yazdrlmas

1:
2:
3:
4:
5:
*/
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:

/* 09prg11.c: Bir dizinin yazdrlmas */


#include <stdio.h>
void dizi_yaz(float x[],int boyut); /* yazdrma fonksiyonunun prototipi
void main(void)
{
float kutle[5]= { 8.471, 3.683, 9.107, 4.739, 3.918 };
dizi_yaz(kutle,5); /* dizi yazdrlyor... */
}
void dizi_yaz(float x[],int boyut)
{
int i;
for(i=0;i<boyut;i++)
printf("%7.3f",x[i]);
printf("\n");
}

Bu prgramda, dizinin prototipi 5. satrda verilmitir. Dikkat edilirse birinci parametre dizi ismi
ve [] parantezlerinden olumutur. Fakat 10. satrda fonksiyon arlrken, kullanm deimi
sadece dizinin ismi yazlmtr. Dizinin boyutu ayrca fonksiyona girilmitir.
DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 09prg11.c


C:\TC> 09prg11

$ gcc 09prg11.c -o 09prg11


$ ./09prg11

IKTI
IKTI
8.471

3.683

9.107

4.739

3.918

Eer dizi boyutu #define nilemcisi ile belirtilirse boyutun ayrca parametre olarak
kullanlmasna gerek youktur. Bu durumda Program 9.11 yle deitirlebilir:
...
#define BOYUT 5
void dizi_yaz(float x[]);
void main(void)
{
float kutle[BOYUT]= { 8.471, 3.683, 9.107, 4.739, 3.918 };
dizi_yaz(kutle);
}
...

Program 9.3'de bir dizinin en byk elemannn nasl bulunduu gsterilmiti. En byk
eleman bulma ilemi bir fonksiyona nasl yaptrld Program 9.12'de gsterilmitir.

Program 9.12: Bir dizinin en byk elemannn bulunmas


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:

/* 09prg12.c:
Bir dizinin en byk elemann bulup ekrana yazar */
#include <stdio.h>
#define n 10
int en_buyuk(int a[]);

/* dizinin boyutu */
/* fonksiyon prototipi */

void main(void)
{
int a[n] = {100, -250, 400, 125 ,550, 900, 689, 450, 347, 700};
printf("En buyuk eleman = %d\n",en_buyuk(a));
}
int en_buyuk(int a[])
{
int
k,eb;
eb = a[0]; /* ilk eleman en byk kabul ediliyor */
for(k=1;k<n;k++)
if(a[k]>eb) eb = a[k];
return eb;

/* en by gnder! */

Bu programda, dizinin boyutu sembolik bir sabit olarak 6. satrda belirtilmitir. 11. satrda
tanmlanan a dizisinin en byk eleman 12. satrda ekrana yazdrlmtr. 15. satrdaki
en_buyuk fonksiyonunun geri dn deeri eb deikeninde sakldr. Bu fonksiyon a
dizisinin en byk elemann gnderir.
DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 09prg12.c


C:\TC> 09prg12

$ gcc 09prg12.c -o 09prg12


$ ./09prg12

IKTI
IKTI
En buyuk eleman = 900

Son olarak bir matrsin bir fonksiyona nasl aktarlaca anlatlacaktr. Program 9.10'da bir
kare matrisin determinant hesab gsterilmiti. Program 9.13'de tanmlanan det fonksiyonu,
kendinine parametre olarak gelen bir matrisin determinantn bulup arld yere gnderir.
nceleyiniz.
Program 9.13: Bir matrisin determinant

1:
2: /* 09prg13.c: nxn bir kare matrisin determinantn hesaplar */
3:
4: #include <stdio.h>
5:
6: #define n 3
/* kare matrisin boyutu */
7: float det(float matris[][]); /* fonksiyon prototipi */
8:
9: void main(void)
10: {
11:
float a[n][n],determinant;
12:
int
i,j;
13:
14:
printf("Matrisin kendi formunu girin:\n");
15:
for(i=0;i<n;i++)
16:
for(j=0;j<n;j++)
17:
scanf("%f",&a[i][j]);
18:
19:
determinant = det(a); /* det fonksiyonu arlyor */
20:
21:
printf("Matrisin determinanti = %f\n",determinant);
22: }
23:
24: /* det(a) fonksiyonu: a matrisinin determinantn gnderir.
25:
1. Matris Gauss yoketme yntemi ile st-gen forma getirilir.
26:
2. "st-gen matrisin determinant asal kegen zerinde bulunan
27:
elemanlarn arpmna eittir" kuralna gre determinat
hesaplanr. */
28:
29: float det(float matris[][n])
30: {
31:
int
i,j,k;
32:
float d=1.0;
33:
34:
for(k=0 ; k<n-1;k++) /* Gauss yoketme yntemi */
35:
for(i=k+1; i<n ;i++)
36:
for(j=k+1; j<n ;j++)
37:
matris[i][j] -= matris[k][j] * matris[i][k]/matris[k][k];
38:
39:
for(i=0;i<n;i++)
/* determinant hesaplanyor */
40:
d *= matris[i][i];
41:
42:
return d;
/* determinant gnder! */
43: }

29. satrdaki tanmlamada fonksiyon parametresi bir matrisdir. Matrisler parametre olarak
girildiinde indislerden bir tanesi verilmedir. Ama, 7. fonksiyon prototipi belirtilirken buna
gerek yoktur.
DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 09prg13.c


C:\TC> 09prg13

$ gcc 09prg13.c -o 09prg13


$ ./09prg13

IKTI

IKTI
Matrisin kendi formunu girin:
7 9 2
3 5 1
0 4 6
Matrisin determinanti = 44.000002

C
Programlama
Dili'ne Giri
Ders 10: Pointer Kavram

Giri
Pointer Nedir?
Pointer Aritmetii
Pointer ve Diziler arasnki liki
Pointern Fonksiyonlarda Kullanlmas

Giri
Btn programlama dillerinin temelinde pointer veri tipi bulunmaktadr. Bir ok dil pointer
kullanmn kullancya sunmamtr veya ok snrl olarak sunmutur. Fakat C'de pointer
kullanm en st dzeydedir. Anlalmas zor olmasna karn pointer kavram C dilinin bel
kemiidir.
Trke yazlan C kitaplarda pointer kelimesi yerine aadaki ifadelerden biri karlalabilir:
pointer = iareti = gsterici
Anlatmda bu terimi birbiri yerine kullanabiliriz. Bu blmde iareti bildirimi,
kullanlmas ve dizilerin iaretilerle olan ilgisi konu edilecektir.

Pointer Nedir?
Bilgisayarn ana bellei (RAM) sral kaydetme blgelerinden(gzlerinden) olumutur. Her
gze bir adres atanmtr. Bu adreslerin deerleri 0 ila RAMe bal olarak MAX arasnda
deerler alabilir.
Programlama dillerinde bir deiken tanmlandnda, o deikene tipine bal olarak
RAMden bir blge ayrlr. rnein rate adl bir deiken tanmladmz varsayalm. Bu
deiken bellekte aadaki ekil deki bir yere yazlr.

Pointer(iareti), bellek alanndaki bir gzn adresinin sakland deikendir. Pointerlara,


veriler(yani deikenlerin ierii) deil de, o verilerin bellekte sakl olduu bellek gzlerinin
balang adresleri atanr. Bir pointer, dier deikenler gibi, saysal bir deikendir. Bu
sebeple kullanlmadan nde program iinde bildirilmelidir. Pointer deikenler yle
tanmlanr:
tipad *ptrad;

Burada tipad herhangi bir C tip ad olabilir. Deikenin nne konan * karakteri indirection
operatr olarak adlandrlr ve tipad ile bildirilen ptrad deikenini iaret eder. rnein:
char *kr1;
/* karakter iin */
int *x;
/* tamsay iin */
float *deger,sonuc; /* deger pointer tipinde sonuc sradan bir
reel deikenler */

Yukarda bildirilen pointer deikenlerden; kr bir karakterin, x bir tamsaynn ve deger bir
gerel saynn bellekte sakl olduu yerlerin adreslerini tutar. Fakat sonuc adl float deiken
sradan bir gerel saydr.
Bir pointera, bir deikenin adresini atamak iin & adres-operatr kullanlr. Bu operatr bir
deikenin nne konursa, o deikenin ierii ile deilde adresi ile ilgileniliyor anlamna
gelir. rnein karakter tipindeki rate adl bir deiken ve p_rate ise pointer tipinde, rate
deikenini iaret eden bir deiken olsun. Bu durum aadaki ekilde gsterilmektedir:
Derleyicide yle ifade edilir:
char rate;
char *p_rate;
...
p_rate = &rate;

Yani p_rate pointeri rate deikeninin sakland adresi iaret etmektedir. Program Progream
sdf pointer kavramn anlamak iin olduka nemli bir rnektir.
"ilk Pointer program"
/*ptr01.c*/
1: main()
2: {
3:
int x, *isaret;
4:
5:
x = 888;
6:
iaret = &x;
7:
8:
printf("x in degeri
9:
printf("x in adresi
10:
printf("x in deeri
11:
printf("x in adresi
12: }
x in degeri = 888
x in adresi = ffde
x in degeri = 888
x in adresi = ffde

=
=
=
=

%d\n",x);
%x\n",isaret);
%d\n",*isaret);
%x\n",&x);

zetle, eer ptr adnda bir pointera, deg adl bir deikene sahipseniz ve ptr = & deg;
eklinde bir atama yapmsanz:

*ptr ve deg, deg adl deikenin ierii ile ilgilidir.


ptr ve & deg, deg adl deikenin adresi ile ilgilidir.

* indirection opreratr olarak adlandrlr.


& adres operatrdr.

Dinamik Diziler
Bir dizi daha nce anlatld gibi, programn banda ka elemanl olduu belirtilerek
bildirilirse, derleyici o dizi iin gerekli bellek alann program sonlandrlncaya kadar sakl
tutar ve o alan baka amalar iin kullanlmaz. Dizilerde dinamik alma, programn
akltrlmas srasnda gerekli bellek alannn iletim sisteminden istenmesi ve ii bittiinde
bu alann geri verilmesidir. Bu amala standart ktphanede malloc(), calloc(), realloc() ve
free() fonksiyonlar vardr. Bu ekilde dizileri kullanmak iin:
...
tip *ptr;
...
ptr = malloc(50); /* herbiri 8 bit olan 50 elemanlk yer
isteniyor */
.
.
/* kullanlyor */
.
free(ptr);
/* geri veiliyor */
...

Program x.x ile basit olarak dinamik bir dizinin kullanm gsterilmitir.
"Dinamik bir dizinin kullanm"
1: #include <stdio.h>
2: #include <stdlib.h>
3:
4: main(){
5:
int *x,i,N,toplam=0;
6:
float ortalama;
7:
8:
printf("Eleman says ");
9:
scanf("%d",&N);
10:
11:
x = (int *) malloc(N*sizeof(int)); /* N tane int gz
12:
isteniyor (Nx2 byte) */
13:
14:
puts("Elemanlar girin:");
15:
for(i=0;i<N;i++){
16:
printf("%d.eleman = ",i+1);
17:
scanf("%d",&x[i]); /* x[i] ile *(x+i) ayn anlamda !... */
18:
toplam += x[i];
19:
}
20:
21:
free(x); /* ayrlan yer boaltlyor... */
22:
23:
ortalama = (float) toplam/N;
24:
25:
printf("Bu %d saynn ortlamas %f dir\n",N,ortalama);

26:
27: }

5. satrda x deikeni pointer tipinde tanmlanmtr. N says 9. satrda klavyeden


okutlmutur. 11. satrda x pointeri iin malloc() fonksiyonu ile bellekten N tane int tipinde
bellek gz istenmitir. malloc() fonksiyonu bellekten istenen yerin balang adresini x
deikenine aktarr. N tane yer istendiine gre, x, artk N elemanl bir dizidir. Buna gre x[0]
ayrlan blgenin ilk adresindeki deikeni temsil eder. Benzer olarak dier elemanlar da,
bellekte pepee sralanr. Bu yzden, x 17. satrda bir dizi gibi okutulmutur. Eer x bir dizi
gibi ifade edilmek istenmiyorsa i. eleman x[i], *(x+i) eklinde de kullanlabilir. x in
elemanlarn toplam toplam adl deikene 18. satrda aktarlmaktadr. 21. satrda x iin
ayrlan bellek alan free fonksiyonu ile serbest braklmtr.
Program x.x sradan bellek kullanmndan olduka farkldr. Eer x bir pointer deil de,
sradan bir dizi gibi bildirilseydi, programn banda x in eleman says mutlaka belirtilmesi
gerekirdi. Bu bize, pointer kullanmn ne kadar nemli olduunu gsterir.

Pointer Tipindeki Fonksiyonlar


Bir fonksiyon tanmlanrken, parametreleri pointer olabilecei gibi, tipi de pointer olabilir.
Bu, o fonksiyonun kendisini arana bir adres gnderecei anlamna gelir. Bu tip
uygulamalar zellikle string uygulamalarnda sk kullanlr.
PRogram x.x de, geri dn deeri int tipinde olan bir pointer fonksiyon rnei verilmitir. Bu
fonksiyon iki saynn toplamnn sakland toplam adl deikenin adresini, arlan yere
gnderir.
Geri dn deeri, pointer olan bir fonksiyon
1: #include <stdio.h>
2:
3: int *topla(int,int);
4:
5: main(){
6:
int a,b;
7:
int *p;
8:
9:
a = 2;
10:
b = 4;
11:
12:
p = topla(a,b);
13:
14: printf("Toplam : %d (adresi %p)\n",*p,p);
15: }
16:
17: int *topla(int x,int y)
18: {
19:
int *ptr,toplam;
20:
21:
toplam = x+y;
22:
ptr = &toplam;
23:
24:
return ptr;
25: }
Toplamlar 6 (adresi 0xbbb7fc4)

C Programlama
Dili'ne Giri
Ders 11: Stringler (Katarlar)

Giri
String Bildirimi
Stringlere Balang Deeri Atama
String zerinde lem Yapan Standart G/ Fonksiyonlar
Baz String Fonksiyonlar
Stringlerin Fonksiyonlarda Kullanlmas

Giri
Stringler anlalmas en zor konulardan biridir. C programlama dilinde "iki trnak iine
alnan" her ifadeye string denir. rnein:
"Izmir"
"sonuc = %d\n"
"Devam etmek icin ENTER tusuna basin."

Trke yazlan C kitaplarda string kelimesi yerine aadaki ifadelerden biri karlalabilir:
String = katar = karakter topluluu = karakter dizisi
Bu blmde stringlerin bildirimi, kullanlmas ve iaretilerle olan ilgisi konu edilecektir.

String Bildirimi
Stringler, char tipinde bildirilen karakter dizileridir ve ierii harfler, rakamlar, veya baz
sembolleri tutmak (saklamak) iin kullanlr. C dilinde string bildirimi iin bir tip deyimi
yoktur. Bu yzden, bir stringe bir dizi veya iareti gzyle baklr. Genel olarak bir stringin
bildirimi:
char string_ad[eleman_says];

yada
char *string_ad;

eklinde yaplr. rnein bir rencinin isim bilgisi ad adl bir stringle tutulmak istenirse:
char ad[10];

yada
char *ad;

eklinde programn banda bildirilmelidir.

Stringlere Balang Deeri Atama


Dier dizi bildirimlerinde olduu gibi, karakter dizilerine balang deeri verilebilir. rnein
aada verilen iki bildirim ayn anlamdadr:
char s[5]={'I','z','m','i','r','\0'};
char s[5]="Izmir";

Birinci satrdaki bildirimde '\0' (NULL) sonlandrc karakter dizisinin sonlandn gsterir.
Daha nce de bahsedildii gibi sonlandrc karakter, karakter dizileri zerinde ilemlerin hzl
ve etkin bir biimde yaplabilmesine olanak salar. kinci bildirimde buna gerek yoktur.
Eer bir karakter dizisinin ka elemandan oluaca belirtilmezse, balangta bildirilen
karakter says ka tane ise dizinin eleman says o kadar olduu varsaylr.
char s[]="Ankara"; /* 6 elemanl */

Eer bildirim iareti ile yaplmak isterirse:


char *s="Ankara";

/* 6 elemanl */

yada
char *s;
...
s = "Ankara";

Ancak
char s[6];
...
s = "Ankara";

eklindeki bir atama geersizdir. nk bu ekilde yaplan bildirimde s bir deiken deil
dizidir.
Elemanlar string olan diziler tanmlamak mmkndr. rnein en uzunu 7 karakter olan 5
farkl isim bir at altnda yle toplanabilir:
char isim[5][8] = { "Semra", "Mustafa", "Ceyhun", "Asli", "Leyla"
};

yada
char isim[][8]

= { "Semra", "Mustafa", "Ceyhun", "Asli", "Leyla"

char *isim[5]

= { "Semra", "Mustafa", "Ceyhun", "Asli", "Leyla"

};

yada
};

Grld gibi, bu tip tanmlamalarda birinci boyut (satr) dizinin eleman saysn, ikinci
boyut (stun) her bir elemann sahip olabilecei maksimum karakter saysn gsterir.
NOT
String ifadelerinde dorudan ift trnak " veya ters bl \ karakterleri kullanlamaz. Bu
durumda string ifadeleri ierisinde
"

yerine \"

yerine \\

kullanlmaldr. rnein:
char *mes = "\"ilk.c\" dosyasinin yeri:";
char *yol = "C:\\WINDOWS\\DESKTOP\\C";
...
puts(mes);
puts(yol);

ile ekrana aadaki satrlar bastrlr:


"ilk.c" dosyasinin yeri:
C:\WINDOWS\DESKTOP\C

String zerinde lem Yapan Standart G/ Fonksiyonlar


Daha nce klavyeden tek bir karakter alan ve ekarana yazan fonksiyonlar incelemitik. imdi
ise ayn ilemi birden ok karakter iin nasl yapld incelenecektir.
ve scanf fonksiyonlar dier tiplerde olduu gibi formatl okuma/yazma amal
kullanlr. String format %s dir. rnein:
printf

char str[20];
...
scanf("%s",str);
printf("%s\n",str);

satrlar ile klavyeden okunan stringin ilk 20 karakteri ekrana yazdrlabilir. Burada printf
fonksiyonu:
printf(str);

eklinde de kullanlabir. Bu durumda, string ekrana yazdrlr fakat imlec (cursor) bir alt satra
gemez.
fonksiyonu klavyeden karakter dizisi almakta kullanlan bir C fonksiyonudur. Bu
fonksiyon, klavyeden girilen karakterleri diziye yerletirdikten sonra dizinin sonuna NULL
karakterini koyar.
gets

char str[20];
...
gets(str);

fonksiyonu bir karakter dizisini ekrana yazdrmak iin kullanlr. Bu fonksiyon diziyi
ekrana yazdrdktan sonra imleci (cursor) bir sonraki satra geirir.
puts

char str[20];
...
gets(str);
puts(str);

Dikkat edilirse puts(str) ile printf("%s\n",str) ilevsel olarak birbirine edeerdir.


Buraya kadar anlatlanlar Program 11.1-3 de zetlenmitir.

Program 11.1: Bir stringin farkl yntemlerle ekrana yazdrlmas


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:

/* 11prg01.c:
Bir karakter dizisinin farkl yntemlerle ekrana yazlmas */
#include <stdio.h>
main()
{
char dizi[7] = {'S', 'e', 'l', 'a', 'm', '!', '\0'};
int i;
/*--- Herbir karakteri ayr ayr alt alta yaz ---*/
printf("Dizi elemanlari:\n");
for (i=0; i<7; i++)
printf("dizi[%d] icerigi: %c\n", i, dizi[i]);
printf("\n");
/*--- 1. yntem: her eleman yanyana yaz ---*/
printf( "Butun dizi (1.yontem): ");
for (i=0; i<7; i++)
printf("%c", dizi[i]);
/*--- 2. Yntem: btn diziyi yaz ---*/
printf( "\nButun dizi (2.yontem): ");
printf( "%s\n", dizi);
printf("\n");
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 11prg01.c


C:\TC> 11prg02

$ gcc 11prg01.c -o 11prg01


$ ./11prg01

IKTI
IKTI
Dizi elemanlari:
dizi[0] icerigi:
dizi[1] icerigi:
dizi[2] icerigi:
dizi[3] icerigi:
dizi[4] icerigi:
dizi[5] icerigi:
dizi[6] icerigi:

S
e
l
a
m
!

Butun dizi (1.yontem): Selam!


Butun dizi (2.yontem): Selam!

Aadaki program kalvyeden girilen bir stringin iindeki 'm' karakterlerinin saysn blup
ekrana yazar. nceleyiniz.

Program 11.2: Bir string iinde 'm' karakterinin saysn renme


1:
*/
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:

/* 11prg02.c: Bir stringin iindeki 'm' karakterlerinin says hesaplar


#include <stdio.h>
void main(void)
{
char str[20];
int i,sayac=0;
printf("Bir string girin: ");
gets(str);
for(i=0;str[i]!='\0';i++)
if(str[i]=='m') sayac++;
printf("'m' karakteri sayisi = %d\n",sayac);
}

13. satrdaki dngde , str[i]!='\0', koulu ile sonlandrc karaktere gelinip gelinmedi
sorgulanmaktadr. 14. satrda stringin iindeki 'm' karakterine rastlanrsa sayac deeri bir
artmaktadr. String sonuna kadar btn 'm' karakterlerinin toplam hesaplanp 16. satrda
ekrana yazdrlmtr.
DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 11prg02.c


C:\TC> 11prg02

$ gcc 11prg02.c -o 11prg02


$ ./11prg02

IKTI
IKTI
Bir string girin: marmara
'm' karakteri sayisi = 2

Program 11.2'deki dng yle de yazlabilirdi:


...
for(i=0;str[i];i++)
if(str[i]=='m') sayac++;
...

Buradaki ilemle str[i] NULL karakterinden farkl olduu srece dng devam ettirilmitir.
Program 11.3: Bir string dizisini yazdrma

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:

/* 11prg03.c: Bir string dizisini yazdrma */


#include <stdio.h>
main()
{
char *gun[7] = { "Pazartesi", "Sali", "Carsamba",
"Persembe", "Cuma", "Cumartesi", "Pazar" };
int i;
for(i=0;i<7;i++)
printf("%d. %s\n",i+1,gun[i]);
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 11prg03.c


C:\TC> 11prg03

$ gcc 11prg02.c -o 11prg03


$ ./11prg03

IKTI
IKTI
1.
2.
3.
4.
5.
6.
7.

Pazartesi
Sali
Carsamba
Persembe
Cuma
Cumartesi
Pazar

Baz String Fonksiyonlar


Bu fonksiyonlar standart C'de iki stringi karlatrmak, bir stringin ieriini dierine
kopyalamak ve stringin uzunluunu bulmak vb ilemler iin tanml fonksiyonlardr. Bu ve
benzeri fonksiyonlar kullanlrken string.h ktphanesi programn bana ilave edilmelidir.
Burada sadece bunlardan bir ka Tablo 11.1 de verilmitir.
Tablo 10.1: string.h ktphanesine ait, baz string fonksiyonlar
Fonksiyon
int strcmp(char *str1,char *str2);

char *strcpy(char *str1, char *str2);


char *strcat(char *str1,char *str2);
char *strrev(str);

Aklama
str1 ve str2 yi karlatrr.
Eitse 0, str1 bykse 0'dan
byk bir deer aksi halde
0'dan kk bir deer gderir.
str2 yi str1 e kopyalar
str2 yi str1 e ekler
str yi ters evirir (NULL
karakteri hari)

str

nin ka karakterden
olutuunu hesaplar
kr karakterinin str iindeki
(batan itibaren) ilk karlat
yeri verir
str2 stringinin str1 iindeki
(batan itibaren) ilk karlat
yeri verir
str nin btn karakterini
kk harfe evirir
str nin btn karakterini
byk harfe evirir

int strlen(str);

char *strchr(char *str,char kr);

char *strstr(char *str1,char *str2);

char *strlwr(char *str);


char *strupr(char *str);

Bu fonksiyonlarn kullanlmas Program 11.4-8'de verilmitir. Programlar Dikkatle


inceleyiniz.
Program 11.4: strcmp fonksiyonunun kullanm
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:

/* 11prg04.c: Basit bir ifre program.


Kullanc en fazla 3 kez yanl ifre girebilir. */
#include <stdio.h>
#include <string.h>
main()
{
char sifre[8];
int sonuc,hak=3;
while( hak-- > 0 )
{
printf("Sifre : ");
gets(sifre);

/* ifreyi al */

sonuc = strcmp(sifre,"elma%xj4");
if( sonuc==0 ){
puts("sifre dogru");
break;
}
else
puts("sifre yanlis");

/* ifre kontrol */

}
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 11prg04.c


C:\TC> 11prg04

$ gcc 11prg04.c -o 11prg04


$ ./11prg04

IKTI

IKTI
Sifre
sifre
Sifre
sifre
Sifre
sifre

: admin
yanlis
: root
yanlis
: elma%xj4
dogru

Program 11.5: strcpy fonksiyonunun kullanm


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:

/* 11prg05.c: Bir stringi dierine kopyalama */


#include <stdio.h>
#include <string.h>
main()
{
char str1[] = "Deneme";
char str2[15],str3[15];
int i;
strcpy(str2,str1);

/* strcpy kullanarak

kopyalama */

for(i=0;str1[i];i++)
str3[i] = str1[i];
str3[i] = '\0';

/* strcpy kullanmadan kopyalama */


/* sonlandrc ekle */

printf("str1 : %s\n",str1); /* sonular ekrana */


printf("str2 : %s\n",str2);
printf("str3 : %s\n",str3);
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 11prg05.c


C:\TC> 11prg05

$ gcc 11prg05.c -o 11prg05


$ ./11prg04

IKTI
IKTI
str1 : Deneme
str2 : Deneme
str3 : Deneme

Program 11.6: strcat fonksiyonunun kullanm


1: /* 11prg06.c: Bir stringi dierine ekler */

2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:

#include <stdio.h>
#include <string.h>
main()
{
char mesaj[20] = "Selam ";
char isim[10];
printf("Adiniz ? : ");
gets(isim);
strcat(mesaj,isim);

/* ekle */

printf("%s\n",mesaj);
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 11prg06.c


C:\TC> 11prg06

$ gcc 11prg06.c -o 11prg06


$ ./11prg06

IKTI
IKTI
Adiniz ? : Mert
Selam Mert

Program 11.7: strlen fonksiyonunun kullanm


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:

/* 09prg06.c: Bir karakter dizisinin uzunluunu bulur */


/* 11prg07.c: Bir karakter dizisinin uzunluunu bulur */
#include <stdio.h>
#include <string.h>
void main(void)
{
char s[20];
int k=0;
printf("Bir seyler yazin : ");
gets(s);
while( s[k]!='\0' ) /* sonlandrc karaktere kadar */
k++;
puts("Dizinin uzunlugu");
printf("strlen kullanarak = %d\n",strlen(s));
printf("strlen kullanmadan = %d\n",k);
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 11prg07.c


C:\TC> 11prg07

$ gcc 11prg07.c -o 11prg07


$ ./11prg07

IKTI
IKTI
Bir seyler yazin : deneme stringi
Dizinin uzunlugu
strlen kullanarak = 14
strlen kullanmadan = 14

Stringlerin Fonksiyonlarda Kullanlmas


Stringlerin fonksiyonlara parametre olarak geirilmesi durumuna soklkla rastlanr. Gerekte
fonksiyona parametre olarak aktarlan karakter dizisini gsteren bir adrestir. Bu yzden
karakter dizileri fonksiyonlara ounlukla iareti tipinde geirilir.
Aadaki iki rnekte yazlan struzn ve strcev fonksiyonlar srasyla strlen ve strrev
fonksiyonlarn dengi niteliindedir. Burada kullanlan benzer mantkla, string.h
ktphanesindki birok fonksiyon yazlabilir. nceleyiniz.
Program 11.9: strlen dengi bir fonksiyon: struzn
1:
*/
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:

/* 11prg09.c: Bir stringin uzunluunu bulan strlen dengi bir fonksiyon


#include <stdio.h>
#include <string.h>
int struzn(char *str);
main()
{
char *s;
printf("Bir string girin: ");
gets(s);
printf("Uzunlugu (struzn) : %d\n",struzn(s));
printf("Uzunlugu (strlen) : %d\n",strlen(s));
}
int struzn(char *str)
{
int n=0;
while(str[n]) n++;
return n;
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 11prg09.c


C:\TC> 11prg09

$ gcc 11prg09.c -o 11prg09


$ ./11prg09

IKTI
IKTI
Bir string girin: Gaziantep Universitesi
Uzunlugu (struzn) : 22
Uzunlugu (strlen) : 22

Program 11.10: strrev dengi bir fonksiyon: strcev


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:

/* 11prg10.c: Bir stringin tersini veren bir fonksiyon */


#include <stdio.h>
#include <string.h>
char *strcev(char *str);
main()
{
char s[50];
printf("Bir string girin: ");
gets(s);
printf("\nString
printf("Tersi

: %s\n",s);
: %s\n",strcev(s));

}
char *strcev(char *str)
{
int i,n;
char gecici;
n = strlen(str);
for(i=0;i<n/2;i++)
{
gecici
= str[i];
str[i]
= str[n-i-1];
str[n-i-1] = gecici;
}
return str; /* geri dn deeri bir gsterici */
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux

C:\TC> tcc 11prg10.c

$ gcc 11prg09.c -o 11prg10

C:\TC> 11prg10

$ ./11prg10

IKTI
IKTI
Bir string girin: C ile programlama
String
Tersi

: C ile programlama
: amalmargorp eli C

Program 11.11: str_alt fonksiyonu


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

/* 11prg11.c: Bir stringin parcalarini (alt string) veren fonksiyon */


#include <stdio.h>
#include <string.h>
char *str_alt(char *str,int,int);
main()
{
int i;
char s[50],*alt;
printf("Bir string girin: ");
gets(s);
for(i=0;s[i];i++)
{
alt = str_alt(s,0,i);
puts(alt);
}
}
/* bir str'nin p1. elemanindan p2. elemanina
kadar olan alt string gonderir. */
char *str_alt(char *str,int p1,int p2)
{
int i,j=0,n;
static char *sub_str;
n = p2-p1;
sub_str = (char *) malloc( n*sizeof(char) );
for(i=p1;i<=p2;i++)
sub_str[j++] = str[i];
return sub_str;
}

C Programlama
Dili'ne Giri

Ders 14: Yaplar ve Birlikler

Giri
Deyimi (Enumeration Constants)
Yap, struct Deyimi (Structures)
typedef Deyimi
Birlik, union Deyimi
enum

Giri
C, kullancnn kendi veri tipini tanmlamasna msaade eder. Bu ksmda byle veritiplerinin
nasl oluturulaca anlatlacaktr.
enum

Deyimi (Enumeration Constants)

Bu tip, deikenin alabilecei deerlerin belli (sabit) olduu durumlarda program daha
okunabilir hale getirmek iin kullanlr. Genel yazm biimi:
enum tip_ad{deer_1, deer_2, ..., deer_n} deiken_ad;

programc tarafndan verilen tip ismidir. deiken_ad ise program iinde


kullanlacak olan deikenin addr. Eer kullanlmazsa program iinde daha sonra enum ile
birlikte kullanlr. rnein:
tip_ad

enum bolumler{programcilik, donanim, muhasebe, motor};

tanm ile derleyici programcilik iin 0, donanim iin 1, muhasebe iin 2 ve motor iin 3
deerini kabul ederek atamalar buna gre yapar. Deiken ad bildirilirse daha sonra enum
kullanmaya gerek kalmaz. rnein:
enum renkler{kirmizi,mavi,sari} renk;
enum gunler{pazartesi,sali,carsamba,persembe,cuma,cumartesi,pazar};

gibi yaplan sabit tanmlamalar program iinde kullanlabilir:


enum bolumler bolum;
enum gunler gun;
...
bolum = muhasebe
gun
= cuma;
renk = kirmizi;

/* bolum = 2 anlamnda */
/* gun
= 4 anlamnda */
/* renk = 0 anlamnda */

Program 14.1 ve 14.2'de, enum anahtar kelimesinin basit kullanmlar gsterilmitir.


Program 14.1: enum kullanm

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:

/* 14prg01.c: adet sabit renk iin enum kullanm */


#include <stdio.h>
enum renkler{kirmizi,sari,mavi};
main()
{
enum renkler renk;
renk = sari;
printf("renk = %d\n",renk);
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 14prg01.c


C:\TC> 14prg01

$ gcc 14prg01.c -o 14prg01


$ ./14prg01

IKTI
renk = 1

Program 14.2: enum kullanm


1:
*/
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:

/* 14prg02.c: Klavyeden girilen bir saynn tek olup olmadn snar


#include <stdio.h>
enum BOOLEAN{ FALSE, TRUE };

/* 0,1 */

int tek(int);
void main(void)
{
enum BOOLEAN sonuc;
int x;
printf("Bir sayi girin: ");
scanf("%d",&x);
sonuc = tek(x);

/* tek mi? */

if( sonuc==TRUE ) puts("Girilen sayi tek ");


else
puts("Girilen sayi cift");
}
int tek(int n){
return (n % 2);
}

/* n, tek mi? */

DERLEME ve ALITIRMA

MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 14prg02.c


C:\TC> 14prg02

$ gcc 14prg02.c -o 14prg02


$ ./14prg02

IKTI
Bir sayi girin: 5
Girilen sayi tek

blou iinde tanmlanm deikenlerin sahip sabit olaca deerler Program 14.3 ve
Program 14.4'de olduu gibi programc tarafndan belirlenebilir.
enum

Program 14.3: enum kullanm


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:

/* 14prg03.c: Be sabit blm iin enum kullanm */


enum bolumler{
programcilik=1,
donanim,
muhasebe,
motor,
buro
} bolum;

/*
/*
/*
/*
/*

1
2
3
4
5

*/
*/
*/
*/
*/

void main(void)
{
bolum = donanim;
printf("bolum : %d\n",bolum);
bolum +=2;

/* bolum=motor */

printf("Yeni bolum : %d\n",bolum);


}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 14prg03.c


C:\TC> 14prg03

$ gcc 14prg03.c -o 14prg03


$ ./14prg03

IKTI
bolum : 2
Yeni bolum : 4

Program 14.4: enum kullanm


1:

/* 14prg04.c: enum blou iinde farkl deerler */

2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:

#include <stdio.h>
#include <dos.h>
enum PC
{
DATA = 0x0378,
STATUS,
CONTROL,
COM1 = 0x3FD,
COM2 = 0x2F8
} Port;

/*
/*
/*
/*
/*

378h
379h
37ah
3fDh
2f8h

*/
*/
*/
*/
*/

void main(void)
{
int veri;
Port = COM1;
/* portu se */
veri = inportb(Port); /* COM1 portundaki veriyi al */
Port = DATA;
outportb(Port,veri);

/* portu deitir
*/
/* DATA portuna yaz */

printf("%xh portuna %d yazildi.",Port,veri);


}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 14prg04.c


C:\TC> 14prg04

$ gcc 14prg04.c -o 14prg04


$ ./14prg04

IKTI
378h portuna 96 yazildi.

Yap, struct Deyimi (Structures)


Aralarnda mantksal bir iliki bulunan farkl trden bilgiler "yaplar (structures)" ierisinde
mantksal bir btn olarak ifade edilebilir. Yaplar diziler gibi bellekte srekli kalr.
Programc yap bildirimini tanttktan sonra, o yap trnden bir deiken tanmlayabilir. Bu
sayede kendi tipinizi retebilirsiniz. Genel yap bildirimi:
struct yap_ad{
tip yap_deiken_ismi;
tip yap_deiken_ismi;
...
};

NOT
ile sabit bildirimi yaplrken struct ile deiken bildirimi yaplr.

enum

Bir renciye ait bilgileri bir at altnda toplamak iin:


struct kayit{

char ad[10];
long no;
short sinif;
};

Bu tipte bir deiken tanmlama:


struct kayit ogr1,ogr2;

eklinde olmaldr. ogr1 deikeni ile tanmlanan 1. rencinin numarasna bir deer atama
ilemi:
ogr1.no = 2012597;

eklinde yaplr. Bu deyimin kullanm Program 14.5,6,ve 7'de gsterilmitir. Inceleyiniz.


Program 14.5: struct deyiminin kullanm
1: /* 14prg05.c:
2:
Bir renciye ait bilgilerin struct deyimi ile bir at altnda
toplanmas */
3:
4: #include <stdio.h>
5:
6: struct kayit{
/* kayit yaps */
7:
char ad[10];
8:
long no;
9:
int sinif;
10: };
11:
12: void main(void)
13: {
14:
struct kayit ogr; /* ogr deikeni kayit tipinde */
15:
16:
printf("Ogrenci Nosu : "); scanf("%ld",&ogr.no);
17:
printf("Ogrenci Adi
: "); scanf("%s" , ogr.ad);
18:
printf("Ogrenci Sinifi: "); scanf("%d" ,&ogr.sinif);
19:
20:
printf("\n*** Girilen bilgiler ***");
21:
printf("\nNo
: %ld",ogr.no);
22:
printf("\nAdi
: %s ",ogr.ad);
23:
printf("\nSinifi: %d ",ogr.sinif);
24: }

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 14prg05.c


C:\TC> 14prg05

$ gcc 14prg05.c -o 14prg05


$ ./14prg05

IKTI
Ogrenci Nosu
Ogrenci Adi

: 948589
: Ahmet

Ogrenci Sinifi: 2
*** Girilen bilgiler ***
No
: 948589
Adi
: Ahmet
Sinifi: 2

Program 14.6: struct deyiminin kullanm


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:

/* 14prg06.c:
Yaplarn bir fonksiyona parametere olarak aktarlabilmesi */
#include <stdio.h>
struct TARIH{
int gun,ay,yil;
};
void goster(struct TARIH x){
printf("Tarih: %02d-%02d-%4d\n",x.gun,x.ay,x.yil);
}
void main(void)
{
struct TARIH n;

/* n deikeni TARIH tipinde */

n.gun = 1;
n.ay = 8;
n.yil = 2003;
goster(n);
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 14prg06.c


C:\TC> 14prg06

$ gcc 14prg06.c -o 14prg06


$ ./14prg06

IKTI
Tarih: 01-08-2003

Program 14.7: struct deyiminin kullanm


1:
2:
3:
4:
5:
6:
7:

/* 14prg07.c:
lk hz ve atis acisi verilen bir topun eik at
hareketi simulasyonu. */
#include <stdio.h>
#include <math.h>

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

#define PI 3.141593
#define g 9.81

/* pi says */
/* yerekim ivmesi */

struct NOKTA{
float x,y;
} top;
void main(void)
{
float v0,aci,t;
printf("Ilk hiz (m/s): "); scanf("%f",&v0);
printf("Aci (derece): "); scanf("%f",&aci);
t = 0.0;
aci *= PI/180.0; /* radyana evir */
do{
top.x = v0*cos(aci)*t;
/* hareket denklemleri */
top.y = v0*sin(aci)*t-0.5*g*t*t;
printf("%5.1f %7.3f %7.3f\n",t,top.x,top.y);
t += 0.1;

/* zaman 0.1 saniye arttr */

}while(top.y>=0.0); /* top havada kald srece! */


}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 14prg07.c


C:\TC> 14prg07

$ gcc 14prg07.c -o 14prg07


$ ./14prg07

IKTI
Ilk hiz (m/s): 8
Aci (derece): 60
0.0
0.000
0.000
0.1
0.400
0.644
0.2
0.800
1.189
0.3
1.200
1.637
0.4
1.600
1.986
0.5
2.000
2.238
0.6
2.400
2.391
0.7
2.800
2.446
0.8
3.200
2.403
0.9
3.600
2.262
1.0
4.000
2.023
1.1
4.400
1.686
1.2
4.800
1.251
1.3
5.200
0.717
1.4
5.600
0.086
1.5
6.000 -0.644
typedef

Deyimi

ile oluturulan yapda typedef deyimi kullanlrsa, bu yapdan deiken tanmlamak


iin tekrar struct deyiminin kullanlmasna gerek kalmaz.
struct

typedef struct kayit{


char ad[10];
long no;
short sinif;
} ogr1,ogr2;

Program 14.6 kk bir deiiklike Program 14.8'de yeniden yazlmtr. Inceleyiniz.


Program 14.8: typedef - struct deyiminin kullanm
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:

/* 14prg08.c:
Yaplarn bir fonksiyona parametere olarak aktarlabilmesi
typedef deyimi kullanldnda struct deyimine gerek yoktur */
#include <stdio.h>
typedef struct{
int gun,ay,yil;
}TARIH;
void goster(TARIH x){
printf("Tarih: %02d-%02d-%4d\n",x.gun,x.ay,x.yil);
}
void main(void)
{
TARIH n;
n.gun = 1;
n.ay = 8;
n.yil = 2003;
goster(n);
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 14prg08.c


C:\TC> 14prg08

$ gcc 14prg08.c -o 14prg08


$ ./14prg08

IKTI
Tarih: 01-08-2003

baka kullanm da vardr. C dilinde program kodlar bu deyimle tamamen


trkeletirilebilir. rnein bu deyim:
typedef

typedef int tamsayi;

eklinde kullanlrsa programda daha sonra int tipinde bir deiken tanmlarken u biimde
kullanlmasna izin verilir.
tamsayi x,y;

/* int x,y anlaminda */

Birlik, union Deyimi


Birlikler de yaplar gibi srekli bellee yerleen nesnelerdir. Birlikler yaplara gre seyrek
kullanlr. Bir programda veya fonksiyonda deikenlerin ayn bellek alann paylamas iin
ortaklk bildirimi union deyimi ile yaplr. Bu da bellein daha verimli kullanlmasna imkan
verir. Bu tipte bildirim yaplrken struct yerine union yazlr. Genel yazm biimi:
union birlik_ad{
tip birlik_deiken_ismi;
tip birlik_deiken_ismi;
...
};
union paylas{
float f;
int
i;
char kr;
};

Yukardaki bildirim yapldnda, deikenler iin bellekte bir yer ayrlmaz. Deiken
bildirimi:
union paylas bir,iki;

eklinde yaplr. yelere erimek aadaki gibi olur:


bir.kr= 'A';
iki.f = 3.14;
bir.i = 2000;

Program 14.9: union deyiminin kullanm


1: /* 14prg09.c: union x ve y nin ayn bellek alann igal ettiinin
kant */
2:
3: #include <stdio.h>
4:
5: union paylas{
6:
int x;
7:
int y;
8: }z;
9:
10: void main(void)
11: {
12:
int *X,*Y;
13:
14:
z.x = 10;
15:
X = &z.x;
16:
printf("\nTamsayi(x) = %d - bellek adresi %X",z.x,X);
17:
18:
z.y = 20;
19:
Y = &z.y;
20:
printf("\nTamsayi(y) = %d - bellek adresi %X",z.y,Y);
21: }

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 14prg09.c


C:\TC> 14prg09

$ gcc 14prg09.c -o 14prg09


$ ./14prg09

IKTI
Tamsayi(x) = 10 - bellek adresi DF23
Tamsayi(y) = 20 - bellek adresi DF23

C
Programlama
Dili'ne Giri
Ders 15: Dosya Ynetimi

Giri
Dosya Ama ve Kapama
Metin ve kili Dosyalar
Dosya Fonksiyonlar
Standart Dosyalar

Giri
ou programda, baz verilerin disk zerinde saklanmasna gerek duyulur. C programlama
dilinde, disk dosyasna erime (okuma ve yazma iin) iki farkl yntemle yaplr. Bunlar st
dzey ve alt dzey olarak adlandrlr. Bunlardan st dzey G/ yntemi ANSI C tarafndan
desteklenmektedir. Alt dzey G/ ANSI C tarafndan desteklenmemektedir. Bu ksmda st
dzey G/ konu edilecektir[1].

Dosya Ama ve Kapama


Bir dosyaya okuma/yazma yapmak iin onun almas gerekir. Bunun iin fopen()
fonksiyonu kullanlr. Alan dosya fclose() ile tekrar kapatlr. Genel olarak:
#include <stdio.h>
...
FILE *dosya; /* dosya iaretisi */
...
dosya = fopen(char dosya_ad,char mod);
dosya ilemleri ...
fclose(dosya);

...

Burada FILE, stdio.h ierisinde bildirilmi bir yapdr. mod ile alacak olan dosyann ne
amala alaca belirlenir[2]. Bunlar:
Tablo 15.1: Dosya ama modlar
Al Modu
r
w
a
r+
w+
a+
deneme.dat

lem Tr
Yalnzca okuma (read only). Dosyann alabilmesi iin nceden olutrulmu
olmas gerekir. Bu modda alm olan bir dosyaya yazma yaplamaz.
Yalnzca yazma (write only). Dosya diskte kaytl olsun veya olamsn dosya
yeniden oluturulur. Bu modda alm olan bir dosyadan okuma yaplamaz.
Ekleme (append). Kaytl bir dosyann sonuna veri eklemek iin alr. Bu
modda alm olan bir dosyadan okuma yaplamaz.
Okuma ve yazma. Bu modda alm olan bir dosyann daha nce varolmas
gerekir.
Okuma ve yazma. Bu modda alm olan bir dosya var olsun veya olmasn
dosya yeniden oluturulur.
Okuma ve yazma. Kaytl bir dosyann sonuna veri eklemek iin alr.
adl bir dosyann, yazmak iin alp almadn test etmek iin aadaki kod

kullanlr:
#include <stdio.h>
...
FILE *yaz; /* dosya iaretisi */
...
yaz = fopen("deneme.dat","w");
if( yaz==NULL )
{
puts("bu dosya acilmiyor...");
exit();
}
/* alrsa! dosya ilemleri */
...
fclose(yaz);
...

NOT
Yukardaki program parasnda, deneme.dat ile ana program ayn dizin iinde
olmaldr. Aksi halde dosyann tam yolu bildirilmelidir.
rnein dosyann yolu C:\WINDOWS\DESKTOP\deneme.dat ise dosya alrken
yaz = fopen("C:\\WINDOWS\\DESKTOP\\deneme.dat","w");

eklinde ak yol bildirilmelidir.


Ayn ilem Linux ortamnda rnein
yaz = fopen("/home/bingul/DATA/deneme.dat","w");

eklinde olabilir.

Metin ve kili Dosyalar

letim sistemlerinde genelde iki eit dosya kullanmna rastlanmaktadr. Bunlar metin (text)
ve ikili (binary) dosyalar olmak zere ikiye ayrlr. Dosyann hangi trden olduu alrken
fopen() fonksiyonu ile belirtilebilir. Al modunda metin dosyalar iin t ikili dosyalar iin
b eklenir. rnein "r+t" eklinde bir al modu var olan bir dosyann okuma yazma ve
metin olarak alaca anlamna gelir. Benzer olarak "wb" al modu dosyann ikili modda
oluturulacan gsterir. Fakat bu belirleme yaplmamsa, varsaylan al modu metindir
(yani t).

Dosya Fonksiyonlar
Bu ksmda, Tablo 15.2'de verilen dosyalama foksiyonlarnn bazlarnn kullanm, rnek
programlar zerinde anlatlmtr.
Tablo 15.2: st dzey dosyalama fonksiyonlar
Fonksiyon
fopen()
fclose()
putc()
getc()
feof()
fprintf()
fscanf()
fputs()
fgets()
fwrite()
fread()

Grevi
Dosya oluturur, aar
Dosyay kapatr
Dosyaya bir karakter yazar
Dosyadan bir karakter okur
Dosya sonuna gelindiini sorgular
Dosyaya formatl veri yazar
Dosyadan formatl veri okur
Dosyaya katar yazar
Dosyadan katar okur
Dosyaya dizi yazar
Dosyadan dizi okur

Program 15.1: Bir dosyaya veri yazma


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:

/* 15prg01.c:
10 renciye ait bilgileri ogrenci.txt dosyasna kaydeder. */
#include <stdio.h>
#include <stdlib.h>
main()
{
FILE *di;
/* dosya iaretisi */
const int n=10; /* renci says */
char ad[10];
int
no,Not,i=0;
if( (di=fopen("ogrenci.txt","w"))==NULL ){
puts("Dosya acilmadi... !\n");
exit(0);
}
puts("10 ogrenciye ait bilgileri girin:");
while( i++<n )

22:
23:
24:
25:
26:
27:
28:
*/
29:
30:
31:
32:
33:
34:

{
printf("%d. ogrencinin numarasi: ",i); scanf("%d",&no);
printf("%d. ogrencinin adi
: ",i); scanf("%s",ad);
printf("%d. ogrencinin notu
: ",i); scanf("%d",&Not);
printf("\n");
fprintf(di,"%5d %10s %3d\n",no,ad,Not); /* verileri formatl yaz!
}
fclose(di);

/* dosyay kapat */

puts("Bilgiler kaydedildi.\a");
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 15prg01.c


C:\TC> 15prg01

$ gcc 15prg01.c -o 15prg01


$ ./15prg01

IKTI
1. ogrencinin numarasi: 2248
1. ogrencinin adi
: Ahmet
1. ogrencinin notu
: 45
2. ogrencinin numarasi: 1823
2. ogrencinin adi
: Meltem
2. ogrencinin notu
: 88
...
9. ogrencinin numarasi: 6548
9. ogrencinin adi
: Cemil
9. ogrencinin notu
: 38
10. ogrencinin numarasi: 4591
10. ogrencinin adi
: Hasan
10. ogrencinin notu
: 77
Bilgiler kaydedildi.

Oluturulan dosyann ieriini grmek iin:


MS DOS (Turbo C)

Linux

C:\TC> edit ogrenci.txt

$ edit ogrenci.txt
yada
$ pico ogrenci.txt

NOT
dosyas daha nce oluturulmusa Program 15.1 nceki verileri silip
yerine yeni verileri yazacaktr. Bu dosyaya yeni bir veri eklemek iin fopen()
fonksiyonunu 'a' modu ile kullanlmaldr.
ogrenci.txt

Bir dosyadan veri okumann bir ok ekli vardr. Veri okuma ilemine basit bir rnek Program
15.2 de sunulumutur. Bu program ogrenci.txt dosyasnda kaytl rencilerden, en dk
notu, en yksek notu ve snf ortalamasn (0'lar hari) hesaplamaktadr.
Program 15.2: Bir dosyadan veri okuma
1: /* 15prg02.c:
2:
ogrenci.txt dosyasndan no, isim ve not bilgileri okur ve
3:
notlar arasndan en by, en k ve snf ortlamasn (0'lar
hari) hesaplar. */
4:
5: #include <stdio.h>
6: #include <stdlib.h>
7:
8: main()
9: {
10:
FILE *di;
/* dosya iaretisi */
11:
char Ad[10];
12:
int
Not,No,eb,ek,n,top;
13:
float ort;
14:
15:
if( (di=fopen("ogrenci.txt","r"))==NULL ){
16:
puts("Dosya almad !\n");
17:
exit(0);
18:
}
19:
20:
/* balang deerleri ata */
21:
ek = 1e+4;
/* ok byk */
22:
eb = 1e-4;
/* ok kk */
23:
top = 0;
24:
n
= 0;
25:
26:
while( !feof(di) )
/* dosyann sonuna kadakar !
*/
27:
{
28:
fscanf(di,"%d %s %d",&No,Ad,&Not); /* verileri oku! */
29:
30:
if(Not>eb) eb=Not;
/* en byk ve en kk
bulunuyor... */
31:
if(Not<ek) ek=Not;
32:
33:
if(Not) n++;
/* Not 0'dan farkl m? */
34:
35:
top += Not;
/* Notlarin toplam */
36:
}
37:
38:
fclose(di);
/* dosyay kapat */
39:
40:
ort = (float) top/n;
/* ortalama (0 lar hari!) */
41:
42:
printf("En yuksek not = %2d\n",eb);
/* sonular ekrana ... */
43:
printf("En dusuk not = %2d\n",ek);
44:
printf("Ortalama
= %4.2f\n",ort);
45:
46: }

DERLEME ve ALITIRMA

MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 15prg02.c


C:\TC> 15prg02

$ gcc 15prg02.c -o 15prg02


$ ./15prg02

IKTI
En yuksek not = 92
En dusuk not = 0
Ortalama
= 69.22

Bir program iinde birden ok dosya amak mmkndr. rnein bir dosyadan okunan
veriler farkl bir formatta baka bir dosyaya yazlmas istenebilir.Program 15.3 kelvin.sck
dosyasnda bulunan 100 adet kelvin cinsinden scaklk bilgilerini derece karlklarn
derece.sck dosyasna yazar. Bu iki scaklk arasndaki evrim kural: K = 273 + C
eklindedir.
Program 15.3: Bir dosyada sakl verileri farkl bir biimde baka bir dosyaya yazma
1:
2:
3:
4:
*/
5:
6:
7:
8:
9:
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:

/* 15prg03.c:
kelvin.sck dosyasnda bulunan 100 adet kelvin cinsinden scaklk
bilgilerini derece karlklarn derece.sck dosyasna yazar.
Bu iki scaklk arasndaki evrim kural: K = 273 + C eklindedir.
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
FILE *oku,*yaz; /* dosya iaretileri
float K,D;
int
i=0,n=100;

*/

if( (oku=fopen("kelvin.sck","r"))==NULL ){
puts("kelvin.sck acilmadi.\n");
exit(0);
}
if( (yaz=fopen("derece.sck","w"))==NULL ){
puts("derece.sck acilmadi.\n");
exit(1);
}
for(i=0;i<n;i++){
fscanf(oku,"%f",&K);
D = K - 273.0;
fprintf(yaz,"%8.2f\n",D);
}

/* verileri oku
*/
/* dnm denklemi */
/* verileri yaz
*/

fclose(oku); /* kapat */
fclose(yaz);
puts("cevirme islemi tamamlandi.");
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 15prg03.c


C:\TC> 15prg03

$ gcc 15prg03.c -o 15prg03


$ ./15prg03

IKTI
cevirme islemi tamamlandi.

Standart Dosyalar
C Programlama Dili'nde bilgisayarn sahip olduu ekran, klavye ve portlar birer dosya olarak
tanmlanmtr. Bu dosyalara standart dosyalar denir. Program almaya baladnda be
adet standart dosya otomatik olarak alr. C, stdio.h balk dosyasnda tanmlanan btn bu
standart dosyalara birer sembolik isim vermitir[3]. Bu isimler Tablo 15.3'de listelenmitir.
Tablo 15.3: Standart Dosyalar
Dosya ad
stdout
stderr
stdin
stdprn
stdaux

Grevi
Standart k ortam (ekran)
Standart hata k ortam (ekran)
Standart giri ortam (klavye)
Standart LPT (paralel port)
Standart COM (seri port)

Bu dosyalarn sembolik isimleri birer dosya iaretisidir. Bu sebeple FILE yapsal deikeni
ile kullanlabilen dosya fonksiyonlar bu dosyalar iin de kullanlabilir. rnein ekrana
(standart ka) bir yaz bastrmak iin:
fprintf(stdout,"Merhaba C\n");

Bilgilerin yazcya gnderilmesi iin yine fprintf fonksiyonu kullanlr. rnein:


fprintf(stdprn,"Merhaba C\n");

satr yazcya Merhaba C iletinini gnderir.


Ayrca, LPT1 veya PRN ismini dosya ismi olarak kullanp yazcya basm yapmak da
mmkndr [4]. rnein:
FILE *di;
...
di = fopen("LPT1","wt");
fprintf(di,"Merhaba C\n");
...
flcose(di);

NOT
Tablo 15.3 de verilen standart dosyalardan stdprn ve stdaux Turbo C'de tanml iken
ANCI C'de tanml deildir. (bkz: stdio.h)

Program 15.4 Turbo C derleyicisinde derlendiinde hem ekrana hemde yazcya birer mesaj
yazar.
Program 15.4: Standart dosyalarn kullanm
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:

/* 15prg04.c:
Standart dosyalar kullanarak hem ekrana hemde
yazcya birer mesaj yazar. (sadece Turbo C) */
#include <stdio.h>
main()
{
fprintf(stdout,"Bu mesaj *ekrana*
yazilacak ...\n");
fprintf(stdprn,"Bu mesaj *yaziciya* yazilacak ...\n");
}

DERLEME ve ALITIRMA
MS DOS (Turbo C)

Linux (GCC)

C:\TC> tcc 15prg04.c


C:\TC> 15prg04

- - -

IKTI
Bu mesaj *ekrana*

yazilacak ...

NOT
Eer yazc bal yada ak deilse, iletim sistemi kullancy uyaracak ve programn
kts yle olacaktr:
Bu mesaj *ekrana*

yazilacak ...

Yazma hatas yazlan aygt PRN


Durdur, yeNiden dene, Yoksay, ipTal?d

C Programlama
Dili'ne Giri
Ders 17: letim Sistemi Ynetimi

system() Fonksiyonu
main() Fonksiyonuna Paremetre

rnekler

system()

Fonksiyonu

Aktarm

Bu ksmda standart bir derleyicinde bulunan, stdlib.h ktphanesindeki system()


fonksiyonu anlatlacaktr. Bu fonksiyon kendisine parametre olarak gelen ifadeyi UNIX,
Linux veya MS-DOS komut satrna yazar ve altrr. system() fonksiyonu ile, bilgisayarn
tm dosya ve evre birimleri, kk program paralar sayesinde kontrol edilebilir. Genel
yazm biimi:
system("iletim sistemi komutu");

rnein, Windows dizininde bulunan tm dosyalar listelemek iin


system("dir c:\\windows");

Bu fonksiyonun Linux letim sistemindeki kullanm da ayndr. rnein /home/bingul/web


dizinindeki dosya ve alt dizinleri listelemek iin
system("ls -asl /home/bingul/web");

Program 17.1, D: srcsnde bulunan tm dosyalar gizli ve salt okunur hale getirmek iin
kullanlr. Son olarak, derleyicinin EXE kodu reteceini unutmayn. Bu EXE kodu her
bilgisayarda alr.
Program 17.1: D: srcsnde bulunan btn dosyalar gizli ve salt-okunur hale getirir
1:
2:
*/
3:
4:
5:
6:
7:
8:
9:

/* 17prg01.c:
D: srcsndeki btn dosyalar gizli ve salt-okunur hale getirir
#include <stdlib.h>
main()
{
system("attrib d:\\*.* +h+r");
}

Program 17.2 proramnda autoexec.bat dosyasna DOSKEYin nasl yklenecei


gsterilmitir. Bunun iin >> ynlendirme operatr kullanlmtr. Bu operatr MSDOS
iletim sisteminde olduu gibi Linux iletim sisteminde de kullanm ayndr.
Program 17.2: Bilgisayar alnda DOSKEY in yklenmesi
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:

/* 17prg02.c: autoexec.bat dosyasna 'doskey /insert' yazar */


#include <stdio.h>
#include <stdlib.h>
main()
{
system("echo. >> c:\\autoexec.bat");
system("echo doskey /insert >> c:\\autoexec.bat");
printf("DOSKEY ala yklendi...\n");
}

NOT
Program 17.2 sadece bir kez altrlmal. Aksi halde autoexec.bat dosyasna
defalarca doskey /insert ifadesi eklenir.
main()

Fonksiyonuna Paremetre Aktarm

Fonksiyon inasna dayanan bir C programnda, ana programn kendisi, main(), de bir
fonksiyondur. Ana programa parametre aktarm, derlenmi bir program komut satrndan
(iletim sistemi ortamndan) ilk altrlaca zaman yaplr. Aktarlacak parametreler,
programn ad yazlp bir boluk brakldktan hemen sonra yazlr. Parametreler, komut
satrndan saysal olarak girilse bile program iinde karakter topluluu (string) olarak gelir. Bu
durumda, string ifadeleri saysal deerlere eviren fonksiyonlar (atoi(), atol(), atof(),...)
kullanlmaldr[1]. Genel kullanm biimi:
...
main(arguman_says,arguman_vektr)
int arguman_says;
char *arguman_vektr[];
{
.
.
.
if(arguman_says < ...){
printf("Eksik parametre !\n");
exit(0);
}
if(arguman_says > ...){
printf("Cok fazla parametre !\n");
exit(1);
}
.
... arguman_vektr[0] ... /* 1. eleman program ad */
... arguman_vektr[1] ... /* 2. eleman 1. parametre */
... arguman_vektr[2] ... /* 3. eleman 2. parametre */
.
}

Program 17.3, komut satrndan girilen iki saynn toplamn hesaplamaktadr.


Program 17.3: Komut satrndan girilen iki saynn toplamn hesaplar
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:

/* 17prg03.c yada topla.c:


Komut satrndan girilen iki saynn toplamn hesaplar.
Kullanm: topla say1 say2 */
#include <stdio.h>
#include <stdlib.h>
main(int argsay, char *argvek[])
{
int toplam;
if(argsay < 3)
{
printf("Eksik parametre !\n");

15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:

exit(0);
}
if(argsay > 3)
{
printf("Cok fazla parametre !\n");
exit(1);
}
toplam = atoi(argvek[1]) + atoi(argvek[2]);
printf("Toplamlari %d\n",toplam);
}

Program 17.3 derlendikten sonra MS DOS ve/veya Linux ortamnda altrlmas yledir:
Derleme:
MS DOS (Turbo C)

Linux

C:\TC> tcc topla.c

$ gcc topla.c -o topla

altrma ve kt:
MSDOS (Turbo C)

Linux

C:\TC>topla 1 2
Toplamlar 3

$ topla 1 2
Toplamlar 3

C:\TC>topla 9 5 8
ok fazla parametre !

$ topla 9 5 8
ok fazla parametre !

C:\TC>topla 5
Eksik parametre !

$ topla 5
Eksik parametre !

Komut satrnda yazlan dosya ad dahil toplam parametre says 3 tr. Bunlar:
argsay = 3
1
----topla
^
|
argvek[0]

2
----58
^
|
argvek[1]

3
----34
^
|
argvek[2]

eklindedir.
Program 17.3, komut satrndan girilen iki saynn toplamn hesaplar. Bu programn daha
gelimi hali Program 17.4'de verilmitir. Program 17.4 altrldnda, komut satrndan
girilen iki say ve bir operatr bekler. Girilen operatre gre be aritmetik ilemden birinini
yapp sonucu ekranda gsterir. nceleyiniz.
Program 17.4: Komut satrndan girilen iki say ve bir operatr bilgisine gre 5 ilemden
birini hesaplar

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

/* 17prg04.c yada hesap.c:


Komut satrndan girilen iki say zerinde 5 ilem yapar.
Kullanm: Kullanimi: hesap <sayi1> <operator> <sayi2> */
#include <stdio.h>
#include <stdlib.h>
void main(int argsay, char *argvek[])
{
int
x,y;
float sonuc;
char op;
if(argsay != 4){
printf("Eksik veya fazla parametre !\n");
printf("Kullanimi: hesap <sayi1> <operator> <sayi2>\n");
exit(0);
}
x = atoi(argvek[1]);
op =
argvek[2][0];

/* 1. parametre: sayi1 */
/* 2. parametrenin ilk karakteri: operator

/* 3. parametre: sayi2 */

= atoi(argvek[3]);

if(op=='+') sonuc = (float) x+y;


else if(op=='-') sonuc = (float) x-y;
else if(op=='*') sonuc = (float) x*y;
else if(op=='/') sonuc = (float) x/y;
else if(op=='%') sonuc = (int)
x%y;
else{
sonuc = 0.0;
printf("Yanlis operator %c\n",op);
printf("Operatorler: +, -, *, / veya %\n");
exit(1);
}
printf("\nSonuc : %f\n",sonuc);
}

Derleme:
MS DOS (Turbo C)
C:\TC> tcc hesap.c

Linux
$ gcc hesap.c -o hesap

altrma ve kt:
MSDOS (Turbo C)

Linux

C:\TC>hesap 1 2
Eksik veya fazla parametre !
Kullanimi: hesap <sayi1>
<operator> <sayi2>

$ hesap 1 2
Eksik veya fazla parametre !
Kullanimi: hesap <sayi1>
<operator> <sayi2>

C:\TC>hesap 13 / 3
Sonuc : 4.333333

$ hesap 13 / 3
Sonuc : 4.333333

C:\TC>hesap 35 & 27
Yanlis operator &

$ hesap 35 & 27
Yanlis operator &

Operatorler: +, -, *, / veya
%

Operatorler: +, -, *, / veya
%

rnekler
Aada verilen iki program Linux iletim sistemindeki cp ve wc komutlarnn basit kaynak
kodlardr:

cp komutunun kaynak kodlar

/*
cp komutu: Dosya kopyalama rnei.
Kullanm: cp <kaynak dosya ad> <hedef dosya ad>
*/
#include <stdio.h>
#include <stdlib.h>
void main(int argsay,char *argvek[])
{
FILE *kaynak, *hedef;
char kr;
if(argsay != 3){
printf("Eksik veya fazla parametre !\n");
exit(0);
}
if( (kaynak = fopen(argvek[1],"r+b")) == NULL ){
printf("%s dosyasi bulunamadi\n",argvek[1]);
exit(0);
}
if( (hedef = fopen(argvek[2],"w+b")) == NULL ){
printf("%s dosyasi olusturulamiyor...\n",argvek[2]);
exit(1);
}
kr = fgetc(kaynak);
while( !feof(kaynak) )
{
fputc(kr,hedef);
kr = fgetc(kaynak);
}
printf("Dosya kopyalandi.\n");
printf("%s --> %s \n",argvek[1],argvek[2]);
fclose(kaynak);
fclose(hedef);
}

wc komutunun kaynak kodlar

/*
wc command for DOS without options
Program counts number of lines, words and characters in a file
-------------------------------------USAGE : wc filename
OUTPUT : #ofLine #ofWord #ofCharacter filename
EXAMPLE: wc test.php
20 355 1546 test.php
-------------------------------------Ahmet Bingul ,March 2002, Gaziantep/TURKEY
bingul@gantep.edu.tr
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define
#define
#define
#define

CR
TAB
SPACE
ZERO

'\n'
'\t'
' '
0u

/* carriage return */
/* horizontal tab */
/* space
*/

main( argnum,argvec )
int argnum;
char *argvec[];
{
FILE *fp;
int stroke=0;
unsigned long chr,word,line;
unsigned char ch;
chr=word=line=ZERO;
if( argvec[0] )
{
if( (fp = fopen(argvec[1],"r"))==NULL )
{
printf("USAGE: wc filename\n");
exit(0);
}
while( !feof(fp) )
{
fscanf(fp,"%c",&ch);
chr++;
if( ch==CR ) line++;
if( ch==SPACE || ch==CR || ch==TAB )
stroke = 0;
else if(stroke==0) {
stroke = 1;
word++;
}
} /* while */
} /* if */
fclose(fp);
printf(" %lu %lu %lu %s\n",line+1,word,chr,argvec[1]);

} /* main */

C Programlama
Dili'ne Giri
Ders 18: Port Denetimi

Port Kavram
Port G/ Fonksiyonlar
Paralel Port rnekleri
Seri Port rnekleri

Port Kavram
Bu ksmda sadece Turbo C derleyicisine ait basit port uygulamalar anlatlacaktr. Ancak,
balamadan nce port kavramlar konusunda giri seviyesinde bilgi gerekir. Bunun iin
buray tklayn. Eer port kavram konusunda yeterli bilgiye sahip olduunuzu
dnyorsanz bu ksm atlayabilirsiniz.
Gelitirilen bir program ierisinden donanmsal elere erimek veya onlar kullanmak iin
birok yol vardr. En yaln, ki sistem mimarisi buna izin veriyorsa, bu gibi birimlere ayn
bellek gzne eriilmiyormu gibi iareti deikenler kullanmaktr; ancak bu durum sistem
mimarisinden dolay her zaman mmkn olmayabilir. Bu durumda, ilgili birimlere erimek
iin derleyicilerin sahip olduu hazr ktphane fonksiyonlar kullanlr[1].

Port Giri/k Fonksiyonlar


Bir bilgisayarn portlarna erimek iin (outport(), intport() gibi) birok fonksiyon vardr.
Bunlar, sistemin sahip olduu donanmsal elere port zerinden eriilmesi imkann sunar.
Sistemin donanmsal elerine erimek iin derleyiciler birok fonksiyona sahiptir; tm listesi
iin kullanlan derleyicinin bavuru kitabna baklmaldr. Tablo 18.1'de, Turbo C
derleyicisinde bululunan ve bu konu ile ilgili birka fonksiyon tantlmtr (bunlar dnda
birok fonksiyon da vardr!).
NOT
Port fonksiyonlarnn kullanlmas iin dos.h balk dosyas #include nilemci
komutu ile programa ilave edilmelidir.
Tablo 18.1: dos.h'te tanml baz port eriim fonksiyonlar
Port Fonksiyonu

Aklama

Porta bir baytlk veri yazar


void outport(int port_adresi,int deger);
Porta bir kelime* yazar
void outportb(int port_adresi,unsigned char deger); Porta bir baytlk veri yazar
int inp(int port_adresi);
Porttan bir baytlk veri okur
int inport(int port_adresi);
Porttan bir kelime okur
char inportb(int port_adresi);
Porttan bir baytlk veri okur
(*) kelime (word) : Porta yazlacak veya porttan okunacak, bir tamsaynn bellekte
kaplayaca alan temsil eder. (Bu alan sizeof() operatr ile renilebilir)
void outp(int port_adresi,int bayt_degeri);

Port foksiyonlarnn kullanm, rnek programlar zerinde, bir sonraki blmlerde


incelenmitir. Btn programlar Turbo C derleyicisinde denemitir. Eger bu derleyiciye sahip
degilseniz, buradan inderbilirsiniz.

Paralel Port rnekleri


Bu blmde, bir nceki ksmda verilen port fonksiyonlar ile, bir PC'nin paralel portunun
nasl denetlenecei 6 tane rnek programda anlatlmtr.
NOT
Standart bir PC'de LPT nin alt portlarnn adresleri,
DATA iin 0x378, STATUS iin 0x379 ve CONTROL 0x37A dr;
Program 18.1: outp fonksiyonunun kulanm
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:

/* 18prg01.c: outp rnei */


#include <stdio.h>
#include <dos.h>

/* port fonksiyonlar iin */

#define DATA 0x0378 /* LPT data portuna ait adres */


void main(void)
{
int deger = 25;
outp(DATA,deger);
printf("\n%X nolu adrese %d degeri yazildi.",DATA,deger);
}

Derleme ve altrma:
MS DOS (Turbo C)
C:\TC> tcc 18prg01.c
C:\TC> 18prg01

kt:
IKTI

Linux
- - -

378 adresine 25 degeri yazildi.

Program 18.1'de 6. satrda tanmlanan porta, 11.satrda 25 deeri yazlmaktadr. Bu deer PC


paralel portunun DATA ularna yazlr. Bu sebeple 25 deeri ikili sistemde (binary) ifade
edilip 8 bite blnr, yani 25 = 00011001 ekinde DATA portuna yazlr. Burada 1 portun
ilgili bacana +5V DC sinyalini gnderir. 0 olan balant noktalarna ise sinyal gnderilmez.
Bu deerler basit bir voltmetre ile llp test edilebilir.

Porta yazlmak veya porttan okunmak istenen veriyi ikili (binary) olarak grntlemek yararl
olabilir. Program 18.2'de cevir_taban2 fonksiyonu bu amala yazlmtr.
Program 18.2: outportb fonksiyonun kullanm
1: /* 18prg02.c: outportb fonksiyonu */
2:
3: #include <stdio.h>
4: #include <dos.h>
5: #include <math.h>
6:
7: #define DATA 0x0378
8:
9: long cevir_taban2(int);
10:
11: main()
12: {
13:
int deger = 0x19; /* deger=25 */
14:
outportb(DATA,deger);
15:
printf("\nDATA portuna gonderilen deger %d :
%08ld",deger,cevir_taban2(deger));
16: }
17:
18: /* Bu fonksiyon 10 tabanndaki bir sayy
19:
2 tabnndaki karln hesaplar. */
20:
21: long cevir_taban2(int x)
22: {
23:
int i=0,k;
24:
long bin=0;
25:
26:
while( x>0 )
27:
{
28:
if(x%2) k = 1;
29:
else
k = 0;
30:
bin += k*pow(10,i++);
31:
x /= 2;
32:
}
33:
34:
return bin;
35: }

9. satrdaki cevir_taban2 fonksiyonu, kendisine parametere olarak gelen bir tamsayy iki
tabana evirir. Ekranda porta yazlan deer ve onun iki tabanndaki karl, uygyn bir
formatla, 8 bit halinde gsterilmitir.
Derleme ve altrma:
MS DOS (Turbo C)
C:\TC> tcc 18prg02.c
C:\TC> 18prg02

Linux
- - -

kt:
IKTI
DATA portuna gonderilen deger 25 : 00011001

ve inportb fonksiyonlar, PC balant noktalarndan srasyla bir karakter ve bir baytlk


veri okumak mmkndr. Program 18.3, bu fonksiyonlar ile nasl veri okunacana dair iyi
bir fikir verir.
inp

Program 18.3: inp ve inportb fonksiyonlaryla paralel porta atanan varsaylan deerleri
renme
1: /* 18prg03.c: inp ve inportb fonksiyonlarnn kullanm */
2:
3: #include <dos.h>
4: #include <stdio.h>
5:
6: #define DATA
0x0378
7: #define STATUS DATA+1
8: #define CONTROL DATA+2
9:
10: main()
11: {
12:
int veri;
13:
14:
puts("Paralel porta atanan degerler (Hex):");
15:
16:
veri = inp(DATA);
17:
printf( "Data portu
: %X\n",veri );
18:
19:
veri = inp(STATUS);
20:
printf( "Status portu : %X\n",veri );
21:
22:
veri = inportb(CONTROL);
23:
printf( "Kontrol portu : %X\n",veri );
24: }

Port adresleri 6. 7. ve 8. satrlarda tanmlanmtr. inp ve inportb foksiyonlar ile okunanan


deerler (srasyla DATA,STATUS ve CONTROL) veri deikenine aktarlm ve ekrana
yazldrlmtr. Bu deerler porta hi bir mdehale olmadan elde edilmitir ve her

bilgisayarda baka bir sonu verebilir. Bu fonksiyonlarn tek parameteresi olduuna dikkat
ediniz.
Derleme ve altrma:
MS DOS (Turbo C)
C:\TC> tcc 18prg03.c
C:\TC> 18prg03

Linux
- - -

kt:
IKTI
Paralel porta
Data portu
Status portu
Kontrol portu

atanan degerler (Hex):


: 4
: 7F
: CC

Bir porta herhangi bir veri yazldktan sonra, bu veri o portun saklaycsna (register) yazlr
ve yeni bilgi yazlmadka orada kalr. Program 18.4 CONTROL portuna ouportb ile yazlan
bir verinin inportb fonksiyonu ile okunmas gsterilmitir.
Program 18.4: inportb ve outportb fonksiyonlarnn kullanm
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:

/* 18prg04.c: inportb ve outportb rnei */


#include <stdio.h>
#include <dos.h>
#define PORT 0x037A

/* kontrol portu */

main()
{
int deger;
deger = inportb(PORT); /* varsaylan deger */
printf("\nPorta veri yazilmadan onceki deger : %X",deger);
deger = 0x0A; /* deger = 10 */
outportb(PORT,deger);
deger = inportb(PORT);
printf("\nPorta veri yazdiktan sonraki deger : %X",deger);
}

6. satrda belirtilen porta, Ah deeri, 12. satrdaki outportb fonksiyonu ile yazlmtr.
Yazlan deer CONTROL portunun saklaycsnda saklanmaktadr. Daha sonra bu
saklaycdan ayn veri 18. satrdaki inport fonksiyonu ile okunmaktadr. Program kts
incelendiinde, portta varsaylan deerin CCh, veri yazldktan sonraki deerin CAh olduu
grlmektedir.

Unutmayn, CONTROL portunun ilk ilk drt bitine mdehale edilebilir. Yani birinci C deeri
deitirilemez.
Derleme ve altrma:
MS DOS (Turbo C)

Linux

C:\TC> tcc 18prg04.c


C:\TC> 18prg04

- - -

kt:
IKTI
Porta veri yazilmadan onceki deger : CC
Porta veri yazdiktan sonraki deger : CA

Bazen paralel porttan istenen k 8 bitten fazla olabilir. Bu durumda DATA portuna ek
olarak CONTROL portunun kullanlmas gerekir. DATA portunun 8 bitlik kna,
CONTROL portunun 4 bitlik klar da ilave edilirse toplam 12 bitlik k almak mmkn
olur. Asagidaki program 12 bitlik veri knn nasl yaplabilceini gsterilmitir. Kullanlan
yntem zetle yledir:
1. Veri 3 basamakl Hex olarak ifade edilir. nk 3 basamakl Hex veri 12 bitlik binary
veriye denktir.
rnein A2F = 101000101111
2. Sadan ilk 8 bit DATA portuna son 4 bit CONTROL portuna yazlr. Yani veri, veriC
ve veriD olarak iki ksma blnr.
rnein A2F = 1010 00101111
3. Soldan ilk 4 bit CONTROL portuna yazlmas iin, veri bitleri 8 basamak saa
kaydrlr.
veriC = A2f >> 8 = 000000001010 = A

4. Daha sonra veri bitleri 4 sola ardndan 4 saa kaydrlr.


A2F << 4 = 001011110000 = 2F0
2F0 >> 4 = 000000101111 = 2F
veriD = 2F

5. Bylece veri iki ksma ayrlm olur. Belki siz daha kolay bir yol bulabilirsiniz :)
Program 18.5: PC Paralel portundan 12 bitlik veri k
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:

/* 18prg05.c:
PC Paralel portundan 12 bitlik veri k.
veri deikeni bit dzeyinde ilem yapan operatrlerle
iki ksma ayrlr: veri = veriC + veriD */
#include <stdio.h>
#include <dos.h>
#include <math.h>
#define DATA

0x0378

11: #define CONTROL DATA+2


12:
13: long cevir_taban2(int x);
14:
15: main()
16: {
17:
18:
int veri,veriC,veriD;
19:
20:
veri = 0xF48;
/* 3-dijit Hex say = 12 bit binary say */
21:
22:
veriC = veri >> 8; /* CONTROL portuna yazlacak veri */
23:
24:
veri <<= 8;
25:
veri >>= 8;
26:
27:
veriD = veri;
/* DATA Portuna yazlacak veri */
28:
29:
outport(DATA,
veriD);
30:
outport(CONTROL,veriC);
31:
32:
printf("\n12 bitlik veri
: %X%X (%04ld%08ld)",
33:
veriC,veriD,cevir_taban2(veriC),cevir_taban2(veriD));
34:
35:
printf("\nCONTROL portuna yazilan veri: %3X
(%04ld)",veriC,cevir_taban2(veriC));
36:
printf("\nDATA
portuna vazilan veri: %3X
(%08ld)",veriD,cevir_taban2(veriD));
37: }
38:
39: /* Bu fonksiyon 10 tabanndaki bir sayy 2 tabnndaki karln
hesaplar */
40: long cevir_taban2(int x)
41: {
42:
int i=0,k;
43:
long bin=0;
44:
45:
while( x>0 )
46:
{
47:
if(x%2) k = 1;
48:
else
k = 0;
49:
bin += k*pow(10,i++);
50:
x /= 2;
51:
}
52:
53:
return bin;
54: }

Derleme ve altrma:
MS DOS (Turbo C)
C:\TC> tcc 18prg05.c
C:\TC> 18prg05

kt:
IKTI

Linux
- - -

12 bitlik veri
:
CONTROL portuna yazilan veri:
DATA
portuna vazilan veri:

F48 (111101001000)
F (1111)
48 (01001000)

Paralel porttan belli bir formatla veri k almak mmkndr. rnein DATA ularna belli
zaman aralklaryla srasyla 1 deeri gndemek mmknkr. Bu ilem, bit dzeyinde ilem
yapan operatrler ve basit bir dng yardmyla Program 18.6 programnda gsterilmitir.
Programda kullanlan delay fonksiyonu ile zaman aralklar seilmitir. conio.h
ktphanesinde bulunan bu fonksiyon, programn almasna (mikroilemciye hzna bal
olarak) verilen say kadar ara verir.
Program 18.6: DATA-port uclarna srasyla 1 deerini gnderme
1: /* 18prg06.c: DATA-port ularna srasyla 1 deerini gnderir */
2:
3: #include <stdio.h>
4: #include <dos.h>
5: #include <conio.h>
6: #include <math.h>
7:
8: #define DATA 0x0378
9:
10: long cevir_taban2(int);
11:
12: main()
13: {
14:
int veri,sayac;
15:
16:
sayac = 0; /* dng sayac */
17:
veri = 1;
18:
19:
do
20:
{
21:
outportb(DATA,veri); /* DATA portuna int veri yaz */
22:
printf("\nPorta yazilan veri : %3d
%08ld",veri,cevir_taban2(veri));
23:
24:
veri <<= 1; /* veriyi binary olarak birer-birer sola kaydr! */
25:
26:
delay(500); /* bekle... */
27:
sayac++;
28:
}while( sayac<8 );
29: }
30:
31: /* Bu fonksiyon 10 tabanndaki bir sayy 2 tabnndaki karln
hesaplar */
32: long cevir_taban2(int x)
33: {
34:
int i=0,k;
35:
long bin=0;
36:
37:
while( x>0 )
38:
{
39:
if(x%2) k = 1;
40:
else
k = 0;

41:
42:
43:
44:
45:

bin += k*pow(10,i++);
x /= 2;
}
return bin;

14. satrda veri deikenine dgye girmeden nce 1 (00000001) deeri atanmtr. Dng
koulu snandktan sonra 18. satrda veri DATA portuna yazlmtr. 21. satrda verinin ierii
1 bit sola kaydrlrak DATA portunun sadece bir sonraki ucuna 1 deeri gnderilmitir. 23.
satrda bu verinin DATA portunun saklaycsnda, ilemci hzna bal, bir sre saklanm ve
ardndan bir sonraki evrime girilmitir. Btn verilerin ekran kts incelendiinde 2
saysnn kuvvetleri olduu grlr.
Derleme ve altrma:
MS DOS (Turbo C)

Linux

C:\TC> tcc 18prg06.c


C:\TC> 18prg06

- - -

kt:
IKTI
Porta
Porta
Porta
Porta
Porta
Porta
Porta
Porta

yazilan
yazilan
yazilan
yazilan
yazilan
yazilan
yazilan
yazilan

veri
veri
veri
veri
veri
veri
veri
veri

:
1
:
2
:
4
:
8
: 16
: 32
: 64
: 128

00000001
00000010
00000100
00001000
00010000
00100000
01000000
10000000

Seri Port rnekleri


Bu blmde, yine Standart C'de olmayan bilgisayarn seri portlar zerinden iletiim konu
edilecektir.
NOT
Standart bir PC'de COM1 iin ilk adres 0x3F8, COM2 iin 0x2F8 dir;
Standart PC'lerin seri iletiim portlarna eriim UART olarak adlandrlan bir birim zerinden
gerekletirilir. Bu birim anakat zerindeki bir entegre devredir. Ancak temel olarak bilinmesi
gereken alma saklaycsna ve gnderme saklaycsna nasl eriilecei ve UART'n
ayarlarnn nasl yaplacadr. Program 18.7'de bir dosya ieriinin karakter karakter seri port
zerinden kar tarafa nasl gnderilecei grlmektedir[1].
Program 18.7: Bir metin dosyasnn ieriini seri porta aktarr.
1:
2:

/* 18prg07.c: Bir metin dosyasnn ieriini seri porta aktarr

*/

3: #include <stdio.h>
4: #include <dos.h>
5: #include <stdlib.h>
6:
7: main()
8: {
9:
char kr;
10:
FILE *dosya;
11:
12:
/* UART'n ayarlanmas */
13:
outportb(0x3FB,0x80);
14:
outport (0x3F8,0x0C);
15:
outportb(0x3FB,0x1B); /* 9600 bps.dur biti 1.cift eslik, 8 bit
veri*/
16:
17:
if ( (dosya=fopen("deneme.txt","r")) == NULL) { /* dosya alyor
*/
18:
puts ("Hata oldu! Dosya acilmadi!");
19:
exit(1);
20:
}
21:
22:
while(!feof(dosya))
23:
{
24:
kr=getc(dosya);
/* dosyadan bir karakter
oku */
25:
while ( (inportb(0x3FD) & 0x20)==0 ); /* gnderme saklayicisi
snanyor */
26:
ouportb(0x3F8,kr);
/* porta gnderiliyor */
27:
}
28:
fclose(dosya);
/* dosya kapatiliyor */
29:
30: } /* main */

Bir UART iletiim iine gemeden nce ayarlanmaldr; yani, iletiim hz, hata biti kullanp
kullanlmayaca gibi birtakm bilgilerin yerletirimi yaplmaldr. UART'n herhangi bir
andaki durumu, yani veri gndermeye hazr olup olmad, yeni veri gelip gelmedii gibi
bilgiler hat durum saklaycs zerindeki bitlere baklarak anlalr. rnein, UART'a
gnderilmesi iin bir veri yazlmadan nce, gndermek iin uygun olup olmad
snanmaldr. Program 18.8'de seri port zerinden gelen karakterleri alp ekrana nasl yazld
grlmektedir[1].
Program 18.8: Seri port zerinden gelen karakterleri alp ekrana yazar.
1:
*/
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:

/* 18prg08.c: Seri port zerinden gelen karakterleri alp ekrana yazar


#include <stdio.h>
#include <dos.h>
main()
{
char kr;
/* UART'n ayarlanmas */
outportb(0x3FB,0x80);
outport (0x3F8,0x0C);
outportb(0x3FB,0x1B); /* 9600 bps.dur biti 1.cift eslik, 8 bit

veri*/
14:
15:
while(1)
16:
{
17:
while( (inportb(0x3FD) & 0x01)==0 ); /* yeni karakter gelene
kadar bekle */
18:
kr=inportb(0x3F8);
/* geleni al ve kr'ye
yerletir */
19:
printf("%c", kr);
20:
}
21:
22: } /* main */

Program 18.7 bir bilgisayarda Program 18.8 baka bir bilgisyarda altrldnda 1.
bilgisayardaki deneme.txt adl dosyann iindeki karakterler 2. bilgisayarn ekrannda
grlecektir.
Soru 1: Bu iki program yle deitirin ki, birinin klavyesinden girilen, dierinin ekrannda
grlsn.
Soru 2: Program 18.7'de verilen programn karl olan alma programn yaznz; seri
porttan gelen karakterleri alp gelen.txt adl dosyaya yazan program gelitiriniz. Yazdnz
program nasl sonlanr? Yani, son karakteri aldn nasl belirler? Bunun iin Program
18.7'de ne gibi deiiklik yaplmaldr?

C Programlama
Dili'ne Giri
Ders 19: Grafik Kullanm

Giri
Grafik Ekranna Gei
Baz Grafik Fonksiyonlar
Renk Kodlar
rnekler

Giri
Bu ksmda sadece Turbo C derleyicisine ait basit grafik uygulamalar ksaca anlatlmtr.
rneklerde verilen grafik fonksiyonlar ANSI C de bulunmamaktadr. Bu yzden bir ok C
derleyicisi, kendi bnyesinde farkl grafik fonksiyonlarna sahiptir. rnein Linux
ortamndaki grafik kullanmak iin g2 ktphanesi gelitirilmitir.

Grafik Ekranna Gei

Turbo C'de, Grafik sistemine gemek iin, initgraph() fonksiyonunu kullanlr. Btn
izimler sadece DOS ortamnda alr. Grafik fonksiyonlarnn kullanlmas iin graphics.h
balk dosyas programn bana ilave edilmelidir. Grafik ilemleri iin temel ilemler:
#include <graphics.h>
#include <stdlib.h>
...
int surucu=DETECT,grmod,hata_kodu; /* DETECT grafik srcsn
otomatik seer */
.
.
.
initgraph(&surucu,&grmod,"");
/* grafik ekrann balat */
hata_kodu = graphresult();
/* hata_kodu al */
if (hata_kodu != grOk)
/* hata_kodu 0 dan farkl ise
balatma */
{
puts("Hata olustu.");
puts("Grafik ekrani baslatilamiyor.");
exit(1);
}
.
. /* grafik ilemleri ... */
.
closegraph();
/* grafik ekrann kapat */

eklindedir.
NOT
initgraph fonksiyonundaki 3. parametre ("")
C:\TC> dizininde olmas zorunludur.

bo brakldnda kaynak dosyann

Eer kaynak dosya baka bir dizinin altnda ise o zaman


initgraph(&surucu,&grmod,"C:\\TC"); eklinde kullanlmaldr.
Turbo C'de varsaylan grafik modu (640,480) znrle ayarlanmtr. Bu modda, izim
ekrennn sol-st kesine ait koordinat (0,0) olarak tanmldr. Varsaylan moddaki baz
koordinatlar ekil 19.1'de gsterilmitir.

ekil 19.1: Turbo C varsaylan moddaki koordinatlar

Baz Grafik Fonksiyonlar


Bu blmde Turbo C grafik fonksiyonlarnn bazlar tantlmtr. Bunlarn dnda biok
fonksiyon vardr. Bu fonksiyonlar derleyicinin bavuru kitabndan veya derleyicinin yardm
ksmndan renilebilir.
Tablo 19.1: graphics.h'te tanml baz grafik fonksiyonlar
Fonksiyon
moveto(x,y);
lineto(x,y);
line(x1,y1,x2,y2);
circle(x,y,r);

arc(x,y,ba_a,bit_a,r);

ellipse(x,y,ba_a,bit_a,xr,yr);

putpixel(x,y,renk);

rectangle(sol,st,sa,alt);
bar(sol,st,sa,alt);
bar3d(sol,st,sa,alt,derinlik,apka);

Aklama
Son noktay (x,y) noktasna tar
Son noktadan (x,y) noktasna dz bir
izgi izer.
(x1,y1) noktasndan (x2,y2) noktasna
dz bir izgi izer.
Merkezi (x,y) olmak zere yarap r
olan bir ember izer.
Merkezi (x,y) noktasnda ve yarap r
olan, ba_a asndan dan balayp
bit_a asna kadar bir yay izer.
Elipsin bir paras olan yay, merkezi
(x,y) ve yaraplar xr, yr olacak biimde
ba_a asndandan balayarak
bit_a asna kadar bir yay izer.
(x,y) noktasna verilen renkte bir nokta
izer.
Sol st kesi (sol,st) ve sa alt kesi
(sa,alt) koordinatlarnda olacak ekilde
bir dikdrtgen izer.
ki boyutlu ve taral bir bar izer.
boyutlu n yzeyi taral bar izer.

setcolor(renk);
setbkcolor(renk);
outtext(*katar);
outtextxy(x,y,*katar);

settextstyle(font,yn,boyut);

cleardevice();
closegraph();

apka 0 ise barn st ksm izilmez.


izilen olan eklin rengini belirler
Arka alann rengini belirler.
Grafik ekrannda katar yazdrr.
Grafik ekrannda yazlacak katar', (x,y)
ile belirlenen noktadan balayarak yazar.
Ekranda yazlacak olan bir katarn
yaztipini, ynn ve boyutunu belirler.
yn=0 ise yatay, yn=1 ise dikey yazar.
Ekran temizler. DOS'taki CLS komutu
gibi.
Grafik ekrann kapatp normal yaz
ekranna (DOS ekran) dner.

Renk Kodlar
Grafik ekrannda kullanlan renkler 0-15 arasnda renk kodlar, yada simgesel sabit karlklar
ile tanmldr. Bu tanmlamalarn tamam graphics.h'de yle bildirilmitir (bkz
graphics.h):
enum COLORS {
BLACK,
BLUE,
GREEN,
CYAN,
RED,
MAGENTA,
BROWN,
LIGHTGRAY,
DARKGRAY,
LIGHTBLUE,
LIGHTGREEN,
LIGHTCYAN,
LIGHTRED,
LIGHTMAGENTA,
YELLOW,
WHITE
};

/* koyu renkler */

/* ak renkler */

Ayrca bu kodlar liste halinde Tablo 19.2 de bulabilirsiniz.


Tablo 19.2: conio.h ve graphics.h'te tanml Standart CGA Video Renk Kodlar
Renk (TR)

Renk (EN)

Siyah
Mavi
Yeil
?
Krmz
Meneke
Kahverengi

BLACK
BLUE
GREEN
CYAN
RED
MAGENTA
BROWN

Renk
rnei

Renk Kodu
0
1
2
3
4
5
6

Ak Gri
Koyu Gri
Ak Mavi
Ak Yeil
Ak ?
Ak Krmz
Ak Meneke
Sar
Beyaz

LIGHTGRAY
DARKGRAY
LIGHTBLUE
LIGHTGREEN
LIGHTCYAN
LIGHTRED
LIGHTMAGENTA
YELLOW
WHITE

7
8
9
10
11
12
13
14
15

rnekler
NOT
Buradaki rnek programlar Turbo C'nin editr ortamnda derlenmitir.
Program 19.1: Grafik ekrannda; bir izgi, bir ember, bir yay, bir dikdrtgen ve bir elips
izer
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:

/* 19prg01.c:
izim ekrannda bir izgi, bir ember,
bir yay, bir dikdrtgen ve bir elips izer.
*/
#include <stdio.h>
#include <graphics.h>
main()
{
int sur=DETECT,gmod;
initgraph(&sur,&gmod,""); /* grafik ekrann balat */
line(12,12,298,198);
circle(200,100,75);
arc(200,100,90,180,50);
rectangle(10,10,300,200);
ellipse(320,240,0,180,50,70);
getchar();
closegraph();
}

/* grafik ekrann kapat */

Program kts

Program 19.2: outtext, outtextxy, setcolor, settextstyle, setlinestyle fonksiyonlar


1: /* 19prg02.c:
2:
Bu program ekranda yatay ve dikey iki yaz yazar ve
3:
farkl kalnlkta iki izgi izer.
4: */
5:
6: #include <graphics.h>
7: #include <stdio.h>
8:
9: main()
10: {
11:
int surucu=DETECT,mod;
12:
13:
initgraph(&surucu,&mod,"C:\\TC");
14:
15:
setcolor(3);
16:
outtext("Merhaba C.");
17:

18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:

setcolor(10);
outtextxy(30,40,"Bu yazi YATAY");
setcolor(YELLOW);
settextstyle(1,1,5);
outtextxy(50,60,"Bu yazi DIKEY");
setcolor(WHITE);
setlinestyle(3,0,1);
line(320,240,500,350);
setcolor(RED);
setlinestyle(1,1,3);
circle(320,240,100);
getchar();
closegraph();
}

Program kts

Program 19.3: y=f(x) ile belirlenen bir fonksiyonu izer


1: /* 19prg03.c:
2:
(-20,+20) aralnda y=5*sin(x) fonksiyonunun grafiini izer. */
3:
4: #include <graphics.h>
5: #include <stdio.h>
6: #include <math.h>
7:
8: main()
9: {
10:
int sur=DETECT,grmode;
11:
float x,y,olcek;
12:
int
X,Y;
13:
14:
initgraph(&sur,&grmode,"C:\\TC");
15:
16:
setcolor(BLUE);
/* x-y coordinatlar mavi */
17:
line(0,240,640,240);
18:
line(320,0,320,480);
19:
20:
olcek=15.0;
/* lek deitirilerek zoom
yaplabilir. */
21:
22:
setbkcolor(WHITE);
/* zemin rengi beyaz */
23:
setcolor(RED);
/* Fonksiyonun rengi krmz */
24:
25:
x=-20.0;
/* x deerleri [-20,20] aralnda */

26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:

do
{
x += 0.01;
y = 5*sin(x);
X = 320 + x*olcek;
Y = 240 - y*olcek;
line(X,Y,X,Y);

/* y=5*sin(x) fonksiyonu
*/
/* Lineer Dnm denklemleri */
/* Fonksiyon iziliyor...

*/

}while(x<20.0);
getchar();
closegraph();
}

Program kts

C Programlama
Dili'ne Giri
Ders 20: C Makrolar

Giri
#include direktifi
#define direktifi
#undef direktifi
#if, #elif, #else, #endif direktifleri
#ifdef ve #ifndef direktifleri
#pragma direktifi
#error direktifi

nceden Tanmlanm Sembolik Sabitler

Giri
Makro bildirimleri veya nilemcileri (direktifleri) derleme ncesi komutlardr. Bunlar tipik
olarak:

programlar deitirmek
parogram paralarn kaynak programnda birletirmek
derleme srasnda baz uyar mesajlarn aktif veya pasif hale getirmek

iin kullanlr. Genel olarak makro bildirimleri kaynak dosyalarn en banda verilir.
C dilinde kullanlan nilemciler yledir:
#include
#error
#if

#define
#undef
#else

#pragma
#ifdef
#elif

#ifndef
#endif

#include

Bu nilemci verilen dosyann ieriini, kullanld yerde kaynak dosyasnn iine ekler.
ounlukla derleyiciye ait komut ktphanelerinde bulunan fonksiyonlarn prototiplerinin ve
dier eitli tanmlamalarn bulunlunduu (h uzantl) balk dosyalarnn programa dahil
edilmesinde kullanlr[2]. ki tr kullanm vardr:
#include <dosya_ad.h>

veya
#include "dosya_ad.h"

Birinci kullanmda dosyann nerede bulunduu derleyici iin verilen ulam yolu ile
belirlenir. Bu yol genellikle include dizini ile son bulur. Balk dosyalarnn sakland
include dizini
o Borland firmasna ait Turbo C derleyicisinde : C:\TC\INCLUDE
o Linux ortamnda : /usr/include eklindedir.
kinci kullanmlada dosyann bulunduu yer aktif dizin olarak kabul edilir. Aksi halde
yol tam olarak verilmelidir.

deyimi ile program ilave edilecek dosya C fonksiyonlar ierebilecei gibi basit
deyimler de ierebilir. Bunun iin bir snrlandrma yoktur. Hatta uzantlar .h olmas bile
gerekmez. Program 20.1 ve Program 20.2'yi inceleyin.
#include

Program 20.1: #include nilemcisinin kullanm iin bir rnek


1: /* 20prg01.c: DATA-port ularna srasyla 1 deerini gnderir */
2:
3: #include <stdio.h>
4: #include <dos.h>
5: #include <conio.h>
6: #include <math.h>
7: #include "port.h"
8:
9: main()
10: {
11:
int veri,sayac;
12:
13:
sayac = 0; /* dng sayac */
14:
veri = 1;
15:
16:
do
17:
{
18:
outportb(DATA,veri); /* DATA portuna int veri yaz */
19:
printf("\nPorta yazilan veri : %3d
%08ld",veri,cevir_taban2(veri));
20:
veri <<= 1; /* veriyi binary olarak birer-birer sola kaydr! */

21:
22:
23:
24:

delay(500); /* bekle... */
sayac++;
}while( sayac<8 );
}

Program 20.1'e 7.satrda #include nilemcisi ile port.h adl balk dosyas eklenmitir. Bu
dosya, port denetimi iin gerekli baz tanmlamalar ve fonksiyonlar barndrr. rnein
18.satrdaki DATA simgesel sabiti ve 19. satrdaki cevir_taban2 fonksiyonu port.h'de
tanmlanmtr.
Derleme ve altrma:
MS DOS (Turbo C)

Linux

C:\TC> tcc 20prg01.c


C:\TC> 20prg01

- - - -

kt:
IKTI
Porta
Porta
Porta
Porta
Porta
Porta
Porta
Porta

yazilan
yazilan
yazilan
yazilan
yazilan
yazilan
yazilan
yazilan

veri
veri
veri
veri
veri
veri
veri
veri

:
1
:
2
:
4
:
8
: 16
: 32
: 64
: 128

00000001
00000010
00000100
00001000
00010000
00100000
01000000
10000000

Program 20.2: #include nilemcisinin kullanm iin bir rnek


1: /* 20prg02.c: DATA-port ularna srasyla 1 deerini gnderir */
2:
3: #include <stdio.h>
4: #include <dos.h>
5: #include <conio.h>
6: #include <math.h>
7: #include "port.h"
8:
9: main()
10: {
11:
#include "bildirim.inc"
12:
13:
do
14:
{
15:
outportb(DATA,veri); /* DATA portuna int veri yaz */
16:
printf("\nPorta yazilan veri : %3d
%08ld",veri,cevir_taban2(veri));
17:
veri <<= 1; /* veriyi binary olarak birer-birer sola kaydr! */
18:
delay(500); /* bekle... */
19:
sayac++;
20:
}while( sayac<8 );
21: }

Dikkat edilirse Program 20.2 iinde deikenler tanmlanmamtr. 11. satrdaki bildirim.inc
dosyas deiken bildirimlerini barndrmaktadr. Bu zellik (veya esneklik), ok byk ve
profesyonel programlarda kullanlmaktadr. Sonu olarak, Program 20.1 ve Program 20.2
zde ayn programlardr. port.h, 20prg01.c ve bildirim.inc dosyalarnn ayn dizin iinde
olmas gerektiini unutmayn.
Derleme ve altrma:
MS DOS (Turbo C)

Linux

C:\TC> tcc 20prg02.c


C:\TC> 20prg02

- - - -

kt:
IKTI
Porta
Porta
Porta
Porta
Porta
Porta
Porta
Porta

yazilan
yazilan
yazilan
yazilan
yazilan
yazilan
yazilan
yazilan

veri
veri
veri
veri
veri
veri
veri
veri

:
1
:
2
:
4
:
8
: 16
: 32
: 64
: 128

00000001
00000010
00000100
00001000
00010000
00100000
01000000
10000000

#define

Bu nilemci komutu, kaynak dosyada bir isim yerine baka bir isim yerletirilmesini salar.
Programda kullanlan bu sembolik isimler bata ana program olmak zere btn alt
programlarda da ayn deere sahiptir. Yani #define nilemcisi ile tanmlanan her ne olursa
olsun, tanmlama btn fonksiyonlarda kullanlabilir. Bir eit genel (global) bildirim gibi
davranr. rnein:
Program 20.3: #define nilemcisinin kullanm
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:

/* 20prg03.c: #define nilemcisinin kullanm */


#include <stdio.h>
#define
#define
#define
#define

PROGRAM
BASLA
BIT
YAZ

main()
{
}
printf

PROGRAM
BASLA
YAZ("Merhaba C!..\n");
BIT

Program 20.3 derleme ileminden nce #define ile verilen ilk sembolik isimler yerine ikinci
isimler yerletirildikten sonra program aadaki durmuma gelir:

/* 20prg03.c: #define nilemcisinin kullanm */


#include <stdio.h>
main()
{
printf("Merhaba C!..\n");
}

Bu nilemciyi kullanak sembolik sabitler tanmlamak mmkndr. rnein:


#define PI
#define IKI_PI
#define YUZ

3.1415926
2.0*PI
100

gibi. #define nilemcisinin kullanm iin iyi bir rnek Program 20.4 de verilmitir.
Program km/s biriminde verilen bir hz m/s birimine evirir[4].
Program 20.4: #define nilemcisinin kullanm
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:

/* 20prg04.c: km/s biriminde verilen hz m/s cinsinden hesaplar */


#include <stdio.h>
#define km
*1000.0
#define saat *3600.0
main()
{
float yol,zaman,hiz;
yol
= 2.5 km;
zaman = 4.2 saat;
hiz = yol/zaman;
printf("HIZ = %f m/s\n",hiz);
}

5. ve 6. satrda tanmlanan sembolik sabitler km ve saat program iinde kullanldnda sol


taraflarndaki sayy srasyla 1000 ve 3600 ile arparlar. 12. satrdaki yol deikeni 2.5 km
ilemi ile 2.5*1000.0 haline gelir. Benzer olarak 13. satrdaki zaman deikenine 4.2*3600.0
says atanr. Dikkat edilirse sembolik sabitler kullanldnda programn okunurluu artmakta
ve bundan dolay hata ayklama kolaylamaktadr.
Derleme ve altrma:
MS DOS (Turbo C)

Linux

C:\TC> tcc 20prg04.c


C:\TC> 20prg04

$ gcc 20prg04.c -o 20prg04


$ ./20prg04

kt:

IKTI
HIZ = 0.165344 m/s

nilemcisi ile parametrik tanmlamalar veya global fonksiyonlar tanmlamak


mmkn olur. rnein:
#define

Program 20.5: Makro fonksiyon tanimlama


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:

/* 20prg05.c: Makro fonksiyon tanimlama. */


#include <stdio.h>
#include <math.h>
#define
#define
#define
#define

kare(x)
topl(x,y)
carp(x,y)
hipo(x,y)

(x*x)
(x+y)
(x*y)
sqrt(x*x+y*y)

void main(void)
{
float a=3.0, b=4.0;
printf("kare(2)
printf("topl(a,b)
printf("carp(a,b)
printf("hipo(a,b)

=
=
=
=

%f\n",kare(2));
%f\n",topl(a,b));
%f\n",carp(a,b));
%f\n",hipo(a,b));

6-9. satrlarnda tanmlanan makro fonksiyonlar 15-18. satrlarda kullanlmtr. 6. satrdaki


kare makrosu kendisine parametre olarak aktarlan x deikeninin karesini hesaplar.
Derleyici, 15. satrdaki kare(2) ifadesi (2)*(2) eklinde yorumlar. Benzer durum dier
makrolar iin de geerlidir. Buna gre programn kts aadaki gibi olacaktr:
Derleme ve altrma:
MS DOS (Turbo C)

Linux

C:\TC> tcc 20prg05.c


C:\TC> 20prg05

$ gcc 20prg05.c -o 20prg05


$ ./20prg05

kt:
IKTI
kare(2)
topl(a,b)
carp(a,b)
hipo(a,b)

=
=
=
=

4.000000
7.000000
12.000000
5.000000

Makrolar C'de ok sk kullanlr. rnein, tek boyutlu bir dizinin boyutu renilmek
istendiinde aadaki makro kullanlabilir:
#define BOYUT sizeof(DIZI)/sizof(DIZI[0])
...
int a[10],n;
...
n = BOYUT(a);

ilemiyle c deikeninine (a dizisinin boyutu) 10 deeri atanr.


te ilgin bir makro daha. Daha nce anlatlan swap fonksiyonu pointer kullanmadan
aadaki makro ile yazalbilir:
#define SWAP(a,b) {g=(a);(a)=(b);(b)=g;}
...
int a=4,b=9,g; /* g geici bir deiken */
...
printf("%d %d\n",a,b);
/* 4 9 */
SWAP(a,b)
/* deitir */
printf("%d %d\n",a,b);
/* 9 4 */
...
#undef

ile tanmlanan bir isim, orjinal tanmlamalar kaldrmakszn farkl deerler iin
tekrar tanmlanamaz. Eer #define ile tanmlanan bir ifade tekrar tanmlanmak istenirse, ya
program iinden #define ile tanmlanan ifade kaldrlp yerine yenisi yazlr ya da #undef
nilemcisi ile nceki tanmlama iptal edildikten sonra #define ile yenisi tanmlanr.
rnein:
#define

#define x 1299 /* ilk tanmlama */


.
.
.
#undef x
/* ilk tanmlamay iptal et */
#define x 1453 /* yeni tanmlama */
#if, #elif, #else ve #endif

Bu nilemciler makro dzeyinde kontrol deyimleridir. Genel kullanm biimi:


#if (ifade1)
tanmlama blogu1
#elif (ifade2)
tanmlama blogu2
...
#else (ifaden)
tanmlama blogun
#endif

eklindedir. Burada:

#if makrosu if deyimine


#elif makrosu else if deyimine
#else makrosu else deyimine

#endif

makrosu if deyiminin sonuna

karlk gelmektedir. Bu makrolar, donanma veya iletim sistemine uygun olarak deiik
makrolarn tanmlanmasna izin verir. rnein:
Program 20.6: Kontrol nilemcilerinin kullanm
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:

/* 20prg06.c: Kontrol nilemcilerinin kullanm */


#include <stdio.h>
#if (sizeof(int)==2)
#define MAKINA "16 bitlik isletim sistemi...\n"
#else
#define MAKINA "32 bitlik isletim sistemi...\n"
#endif
main()
{
printf(MAKINA);
}

Derleme ve altrma:
MS DOS (Turbo C)

Linux

C:\TC> tcc 20prg06.c


C:\TC> 20prg06

$ gcc 20prg06.c -o 20prg06


$ ./20prg06

kt:
MSDOS (Turbo C)

Linux

16 bitlik isletim sistemi...

32 bitlik isletim sistemi...

#ifdef ve #ifndef

nilemcisi, bir ismin tanmlanm olup olmadn, #ifndef nilemcisi bir ismin
tanmlnmam olup olmadn sorugular[4]. rnein:
#ifdef

#ifndef SIFRE
#define SIFRE "ab1234"
#endif

Program 20.7: Tanmlanm ise DATA portuna 123 yazar


1:
2:
3:
4:
5:
6:
7:

/* 20prg07.c: Tanmlanm ise DATA portuna 123 yazar */


#include <stdio.h>
#include <dos.h>
#define DATA 0x0378

8:
9:
10:
11:
12:
13:
14:
15:
16:

main()
{
#ifdef DATA
outport(DATA,123);
printf("Veri DATA portuna yazildi\n");
#else
printf("DATA portu tanmlanmamis!\n");
#endif
}

Derleme ve altrma:
MS DOS (Turbo C)

Linux

C:\TC> tcc 20prg07.c


C:\TC> 20prg07

- - - -

kt:
IKTI
Veri DATA portuna yazildi
#pragma

Bu nilemci deyimi bir komut beliticisi ile birliktikte kullanlr. Genel kullanm biimi:
#pragma komut_belirticisi

eklindedir. Bu deyim, ald argmana bal olarak derleyiciden derleyiciye deiebilen


ilevlere sahiptir. Ayrca, her derleyici #pragma deyimine sahip deildir. #pragma deyiminin
ayrntl kullanm iin altnz derleyicinin bavuru kitabna bakmalsnz. Burada sadece
8086 sistemlerde alabilen #pragma inline komutu anlatlacaktr[2], [4].
derleyiciye program iinde sembolik makina dili (Assembler) kodlarnn
bulunduunu bildirir. Bu kodlar asm anahtar szcyle yaplr. rnein:
#pragma inline

Program 20.8: C kodu iine gmlm bir asm kodu


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:

/* 20prg08.c: C kodu iine gmlm bir asm kodu */


#include <stdio.h>
#pragma inline
void pos(int satir,int sutun)
{
asm mov ah,2
asm mov bh,0
asm mov dh,satir
asm mov dl,sutun
asm int 10h

14:
15:
16:
17:
18:
19:
20:
21:
22:

}
void main(void)
{
pos(20,10);
getchar();
pos(0,0);
getchar();
}

Program 20.8, imleci ekrann istenilen (x,y) koordinatna tamak iin kullanlabilir. 9-13.
satrlardaki ifadeleri tek bir asm blou altnda toplamak mmkndr:
asm{
mov
mov
mov
mov
int
}

ah,2
bh,0
dh,satir
dl,sutun
10h

#error

nilemci bu deyimle karlanca yanndaki mesaj ekrana yazar ve derleme ilemine son
verir. Mesela, yazm olduunuz program 32 bitlik bir iletim sistemi (UNIX veya Linux gibi)
iin tasarlanmsa ve program 16 bitlik iletim sisteminde (MSDOS gibi) derlenecekse
kullancya buna dair bir uyar mesaj vermek uygun olur[2-4]. rnein:
#if (sizeof(int)==2)
#error Bu program 16 bitlik iletim sisteminde derlenemez !...
#endif

Eer DOS altnda alyorsanz nilemci derleme ilemine:


Bu program 16 bitlik iletim sisteminde derlenemez !...

mesaj ile son verir. Mesajn trnak iinde yazlmadna dikkat ediniz.

nceden Tanmlanm Sembolik Sabitler


Baz sembolik sabitler derleyici tarafndan nceden tanmlanmtr. Bu ksmda, baz standart
sembolik sabitler incelenektir[2-4].
Tablo 20.1: nceden tanml baz sembolik sabitler
Sabit ismi
__LINE__
__FILE__
__DATE__
__TIME__
__STDC__

Aklama
nilemci bu sabit yerine kaynak koddaki o anda bulunan satr
numarasn yerletirir.
Kaynak dosyann ismin tutar.
nilemci bu sabit yerine derlemenin yapld zaman tarihi (ay gn
yl formatnda) yazar.
nilemci bu sabit yerine derlemenin yapld zaman zaman
(sa:dak:sn gn yl formatnda) yazar.
C dilinde kullanlan kimi anahtar szckler standart deildir. Derleyici
eer yalnzca standart C'nin anahtar szcklerini destekliyorsa bu sabit

tanml varsaylr.
Pi saysn turar (M_PI=3.14159265358979323846). Ayrca bkz:

M_PI

math.h

e saysn turar (M_E=2.7182818284590452354). Ayrca bkz: math.h


Aadaki rnekleri inceleyiniz:
M_E

Program 20.9: C dilindeki baz tanml sabitler


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:

/* 20prg10.c: Sembolik sabitler */


#include <stdio.h>
main()
{
printf("Satir No
printf("Dosya adi
printf("Tarih
printf("Saat
}

:
:
:
:

%d\n",__LINE__);
%s\n",__FILE__);
%s\n",__DATE__);
%s\n",__TIME__);

Derleme ve altrma:
MS DOS (Turbo C)

Linux

C:\TC> tcc 20prg09.c


C:\TC> 20prg09

$ gcc 20prg09.c -o 20prg09


$ ./20prg09

kt:
IKTI
Satir No
Dos ya adi
Tarih
Saat

:
:
:
:

7
20prg10.c
Jul 11 2004
17:52:30

Program 20.10: C dilindeki baz tanml sabitler


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:

/* 20prg10.c: C dilindeki baz tanml sabitler */


#include <stdio.h>
#include <math.h> /* pi ve e sayilari icin !*/
#ifdef __STDC__
#define MESAJ "Bu derleyici ANSI C "
#else
#define MESAJ "Bu derleyici ANCI C degil "
#endif
main()
{
puts(MESAJ);

15:
16:
17:

printf("Pi sayisi = %f\n",M_PI);


printf("e sayisi = %f\n",M_E);
}

Derleme ve altrma:
MS DOS (Turbo C)

Linux

C:\TC> tcc 20prg10.c


C:\TC> 20prg10

$ gcc 20prg10.c -o 20prg10


$ ./20prg10

kt:
MS DOS (Turbo C)

Linux

Bu derleyici ANCI C degil


Pi sayisi = 3.141593
e sayisi = 2.718282

Bu derleyici ANSI C
Pi sayisi = 3.141593
e sayisi = 2.718282

Kocaali niversitesi

Makale
Kategori :

C & C++

Tarih :

13/10/2005

Gnderen : KADIR IMAMOGLU Okunma Says : 176

C ile Programlama
1. Giri
2. lk C Program Merhaba Dnya
3. Deikenler ve Sabitler
4. Karar Yaplar.
5. Dngler
6. aretiler (Pointer)
7. Diziler
8. Karakter Dizileri (Dizgeler)
9. Fonksiyonlar
10. Yaplar
11. Metin ve veri dosyalar

1. Giri
C nedir ve nasl ortaya kmtr
C programlama dili 1970'li yllarn balarnda Bell Laboratuvarlarnda Dennis Ritchie tarafndan gelitirildi. C
st dzey ve yapsal bir programlama dilidir. Ve son derece esnektir. Bundan dolay kod yazarken ok
dikkatli olmak gerekir.

C ilk bata sistem yazlmlar gelitirmek iin kullanlm fakat gnmzdeki birok deiik program C de

yazlmtr. Unix iletim sisteminin gelitirilmesinde C programlama dili kullanlmtr. Baz programlama
dillerinin ortaya k tarihleri aadaki gibidir.

Fortran 1954 IBM


COBOL 1959 Bu dille yazlm epey ticari program vardr.
BCPL 1967 Martin Richards
B 1970 Ken Thompson Bell Laboratuvar
Pascal 1971 Niklaus Wirth (Akademik kullanmlar iin)
C 1972 Dennis Ritchie Bell Laboratuvar
C++ 1980 Bjarne Stroustrup AT & T

19831989 yllar arasnda ANSI C' nin standart tanm yapld ve 1990 da yaymland. (ANSI / ISO
9899:1990)

C'de Program Gelitirme Ortamlar


C' de program yazabilmek iin basit anlamda bir derleyici ve editor yeter. Kodlar ASCII metin dosyas
formatnda yazlr. Yazlan kodlar derlenir ve altrlabilir dosya oluur. Gnmzde C programlama dili ile
ilgili birok gelitirme ortam bulunmaktadr. Bunlardan balcalar aadaki gibidir.

1. Turbo C : Editr ve derleyici i iedir. Borland firmas tarafndan gelitirildi. MS DOS ve Windows (NT,
95, 98, ME, 2000, XP, 2003) iletim sistemlerinde almaktadr.

2. UNIX / Linux Editrleri : Burada herhangi bir editrde (vi, pico, emacs vb) kod yazlr. Emacs editrnde
C komutlar ve ifadeleri renkli olarak gzkr. Menlerden komut satrnda yaplan ilemler yazlabilir.
Aadaki ilk satrda Linux ortamnda GNU C derleyicisi olan gcc (http://gcc.gnu.org) ile program derlenir
ve ikinci satrda derlenen program altrlr.

gcc merhaba.c -o merhaba


./merhaba

3. Borland C Builder : Borland firmas tarafndan gelitirilmektedir. Hazr bileen ve nesnelerin olduu bir
gelitirme ortamdr. MS Windows iletim sistemlerinde almaktadr.

4. Kylix : Borland firmas tarafndan gelitirilmekte ve Linux iletim sistemlerinde almaktadr. Delphi ve C
Builder benzeri bir gelitirme ortamdr.

5. MS Visual C++ : Microsoft firmas tarafndan gelitirildi. MS Visual Stuido 6.0 paketi ile beraber
gelmektedir. Windows iletim sistemlerinde almaktadr.

6. Dev C++ : Bloodshed tarafndan gelitirilmektedir. Windows iletim sistemlerinde almaktadr.


http://www.bloodshed.net/download.html adresinden cretsiz olarak indirilebilir.

2. lk C Program Merhaba Dnya


lk C Program
ncelikle kullandnz editr (Emacs, notepad, vi vb) yada gelitirme ortamn (Kylix, C Builder, Visual
C++ vb) amanz gerekmektedir. Daha sonra aadaki kodu aynen yaznz.

#include<stdio.h>
int main()
{
printf("Merhaba Dnya ");
return 0;
}

Program yazdktan sonra "merhaba.c" ismi ile kayt ediniz. Ve komut satrna geiniz. Windows ortamnda
Borland C Builder kullanyorsanz ve gerekli ayarlar yapld ise aadaki komutu giriniz.

C:>bcc32 hello.c

Linux kullanclar aadaki komutu girmelidir.

$gcc merhaba.c o merhaba

Buradaki o parametresi derlenip oluan dosyaya ad vermek iin kullanlr. Eer bu parametre kullanlmaz
ise kt dosyas "a.out" ismi ile oluturulur.

Bu komutlar C programnz derler. Eer program yazarken herhangi bir hata yaptysanz derleyici size
hatann olutuu satr syleyecektir. Bu hatay dzeltip altrdnzda ve baka bir hata yoksa program
sorunsuz olarak derlenir. Windows ortamnda komut satrna "merhaba.exe" yazarak, Linux ortamnda
"./merhaba" yazarak derlenen program altrabilirsiniz. Eer program altrlrsa ekranda "Merhaba
Dnya" yazs grnr.

imdi yukardaki program satr satr aklyalm.

#include <stdio.h> :
Bu satr programa "stdio.h" isimli ktphane dosyasn ekler ve C programlama dilinde belli komutlar
kullanabilmemiz iin bize gerekir. stdio Standard Input/Output' un ksaltlmdr. Klavyeden bilgi okuma
yada ekrana yazdrma gibi komutlar ierir. #include ile kullanlabilecek baz ktphaneler string.h, conio.h
ve time.h eklindedir. Kendimizde istersek ktphane dosyas oluturabiliriz.

int main() :
Bu satr programn balad yerdir. int ifadesi geri dn deeri olarak bilinir. Eer program sorunsuz
alrsa geri dn deeri 0 olur. "(" ve ")" parantezleri ierisine program dardan parametre ile alaca
zaman gerekli tanmlamalar yaplabilir.

{}:
Bu parantezlerin ierisine grupladmz komutlar yazarz. Burada "{" ve "}" ifadeleri arasnda kalan
komutlarn main fonksiyonuna ait olduunu anlarz. Bu parantezler C de komutlar ve ifadeleri gruplamak
iin ok sk kullanlr.

printf("Merhaba Dnya "); :


printf komutu ekrana yaz yazdrmak iin kullanlr. Ekrana yazlmak istenen veri parantezler arasndaki ift
trnak iaretleri arasna konulur. ifadesi yeni satr karakteri diye geer sanki Enter tuuna basm gibi alt
satra geersiniz. Her komuttan sonra noktal virgl konulmas zorunludur. gibi yazlarn biimlenmesinde
kullanlan baz ifadeler aadadr.

a Ses sinyal
Backspace
Tab
Yenisatr
v Vertical tab
Yeni sayfa temiz ekran
Carriage return

return 0; :
letim sistemine 0 deerini programn sorunsuz altn sylemek iin dndrmemiz gerekmektedir. 0
deerini geri dndrmek iin main fonksiyonun nnde int ifadesini kullandk. int ifadesi integer kelimesinin
ksaltlmdr. Bu ifade komut olduu iin sonunda noktal virgl vardr.

eriye Doru Yazma


Yukardaki rnekte de grdnz gibi printf ve return komutlar sol taraftan ieriye doru yazld. Bu
ekilde kullanmn sebebi kodun daha anlalr olmas iindir. Kodlarn ie doru yazlmasn ilk bata ok
zaman alan gereksiz bir i olarak grebilirsiniz ama karmak programlarda bunlarn ok nemli olduunu
anlayacak ve ihtiya duyacaksnz.

Yorum Satrlar

Yorum satrlar programn ne i yapt hakknda bilgi verir. Yorum satrlar derleyici tarafndan dikkate
alnmaz sadece kodu inceleyen kii tarafndan kullanlr. Programn en st ksmna programn ne i yaptn
anlatan aklama satrlarn koymalsnz. nk ileride tekrar program incelemek istediinizde program
anlamanz daha kolay olacaktr. Program kodlar ierisinde ok karmak kod paracklarn da yorum
satrlar ile aklaynz. Yorum satrlarnn nasl kullanlaca ile ilgili rnek aadaki gibidir. Burada
programn banda her programda olmas gereken yazan kiinin ad, yazma tarihi, ve aklama gibi alanlar
bulunur.

/* Yazar: Adnz
Tarih: gg/aa/yyyy
Aklama:
Ekrana "Merhaba Dnya" yazsn yazar. */
#include<stdio.h>
int main()
{
printf("Merhaba Dnya "); //ekrana "Merhaba Dnya" yazar
return 0;
}

3. Deikenler ve Sabitler
C programlama dilinde deikenler isimleri ve atanm deerleri olan hafza konumlardr. Deikenleri
sonradan kullanmak amac ile bellee veri yklemek iin kullanrz. Say ve karakter tipinde olmak zere 2
tip deiken vardr.
Saysal Deienler

Saysal deikenler tam say (integer) yada gerel say (float) deerleri ierebilirler. Tam say deerlerinde
virgll deerler yoktur. Gerel saylarda virgll deerler olabilir.
Karakter Deikenler

Bu deikenler alfabedeki harfler yada ASCII tablosundaki karakterleri barndrr. 0-9 arasndaki
rakamlarda karakter olabilir. Karakterler tek trnak iaretleri arasna konulur. Trnak iaretleri arasndaki bir
say ile trnak iaretleri arasnda olmayan bir say ayn deildir.
Sabitler

Deikenler ve sabitler arasndaki fark udur: deikenlerin deerleri deiebilirken sabitlerin deerleri
deimez. Pi says yada bir elektronun ykn saklamada sabitler kullanldr. Sabitler kullanlarak
yanllkla yaplabilecek deer deiiklii nlenir.
Deikenleri Tanmlama

Deikenleri tanmlarken nce deikenin tipini daha sonrada deienin adn yazarz. Aadaki tabloda
deiken tipleri ve alabildikleri deerlerin aralklar grlmektedir.

Ad Tipi Byte Bit Aralk


int Saysal Tam Say 2 16 -32 768 - 32 767
short Saysal Tam Say 2 16 -32 768 - 32 767
unsigned short int Saysal Tam Say 2 16 0 65 535
long Saysal Tam Say 4 32 -2 147 483 648 to 2 147 483 647
float Saysal Gerel Say 4 32 1.2 X 10-38 to 3.4 X 1038
double Saysal Gerel Say 8 64 2.2 X 10-308 to 1.8 X 10308
char Karakter 1 8 Btn ASCII karakterleri

Deiken isimleri harf, say yada alt izgi karakterlerinden oluur. Ve rakam ile balamaz. Sadece Trke
alfabede bulunan , , , , , , , , , , ve harfleri deiken adlandrmada kullanlamaz.
Deikenleri 32 karakterden ksa tutmak kodlarn okunurluu ve derleyici uyumluluu asndan nemlidir.
Aada belirtilen C anahtar kelimeleri deiken ad olarak kullanlamaz.

auto breakcasecharconstcontinue default dodoubleelseenumextern floatfor gotoifintlong registerreturnshort


signedsizeofstatic structswitchtypedeftypeid unionunsigned usingvoidvolatilewhile

Sizeof fonksiyonu ile deikenlerin kapsad alan anlalabilir. Deikenler kullanlmadan nce en st
ksmda tanmlanr. imdi a isminde bir saysal ve b isminde bir karakter deikeni tanmlayalm.

int main()
{
int a;
int b;
return 0;
}

Ayn zamanda aadaki gibi birden fazla deikeni ayn satrda tanmlayabilirsiniz.

int main()
{
int a, b, c;
return 0;
}
Sabit Tanmlama

C programlama dilinde 3 deiik biimde sabit tanmlayabiliriz. Bun tanmlamalar const, #define ve enum
kullanlarak yaplr. Const biiminde sabit tanmlamak iin deikenin nne const ifadesini koymak ve bir
deer atamak gerekir.

int main()
{
const float pi = 3.14;
return 0;

Sabit tanmlamada kullanlan #define direktifi ise aadaki gibi kullanlabilir.

#define pi 3.1415
#define id_no 12345

enum direktifini sabitler kmesi tanmlamak istediimizde kullanrz. C de enum tipleri saydr. Birok
#define kullanarak sabit tanmlama yerine tek bir enum ile kolay bir ekilde tanmlama yaplabilir.

enum gunler {Pazartesi=1,Sali,Carsamba,Persembe,Cuma,Cumartesi,Pazar};

ifadesinde Sal 2, aramba 3 vb eklinde deerlerini otomatik olarak alr.

enum RENK {KIRMIZI, MAVI, YESIL};

eklindeki tanmlamada ise KIRMIZI 0, MAVI 1 ve YESIL 2 deerlerini alr.


aretli ve aretsiz Deikenler

aretli ve iaretsiz deikenler arasndaki fark, iaretli (signed) deikenler negatif yada pozitif olabilirler
fakat iaretsiz (unsigned) deikenler sadece pozitif olurlar. aretsiz deikenleri kullanarak en yksek
pozitif arala ularsnz. aretsiz deiken tanmlamak iin deiken tanmnn nne "unsigned", iaretli
deiken tanmlamak iin "signed" kelimesi eklenir. aretli deiken tanmlamada deikenin nne
"signed" yazma zorunlu deildir. Normal biimde deikeni tanmladnzda otomatik olarak o deiken
iaretli olur.

int main()
{
unsigned short int a;
signed int b;
return 0;
}

Yukarda tanmladmz a iaretsiz deieni 0 65535 aralnda deerler alabilir.


Hesaplamalarda Deikenleri Kullanma

Bir deikene deer atamak iin eittir iareti kullanlr.

int main()
{
int a;
char b;
a = 3;
b = 'H';
return 0;
}

Hesaplamalarda kullanlabilecek operatrler aadaki gibidir.

Operatr lem
+ Ekleme
- karma
* arpma
/ Blme
% Modl (Kalan Ksm)
int main(){ int a,b; a = 5;

b = a + 3;

a = a - 3;

return 0;}

Hesaplama yapmak iin deikenlere ihtiya duyarz. Deikenler, normal saylar yada karakterler ile bir
arada kullanlabilir.
Deikenleri okuma ve ekrana yazdrma

C Programlama dilinde giri k ilemleri gerekte komutlar ile deil stdio.h ktphane dosyasnda
bulunan fonksiyonlar ile gerekletirilir. Basit giri/k deikenleri ounlukla tek karakter okuyan yada
yazan fonksiyonlardr. Aada giri deyimlerine bir rnek verilmitir.

char c;
...
c=getchar();

char c;
...
/* Enter tuuna baslncaya kadar tm karakterleri bekler hepsini yanslar ancak sadece ilk karakteri okur
*/

c=getc();
c=getchar();

Aada k deyimi ile ilgili rnek vardr.

char c;

c=putchar();
rnek :
Aadaki program klavyeden girilen harfleri ekrana szerek yazmaktadr. yleki klavyeden girilen
harflerden a harfini ekrana yazmamaktadr ve bu ilemi enter tuuna baslncaya kadar devam etmektedir.

#include <stdio.h>

main(){
char c;
while((c=getchar())!=' ')
if (c!='a') putchar(c);
printf(" ");
}

Bazen tek bir karakter deilde enter tuuna baslncaya kadar yada satr sonu iaretini buluncaya kadar
tm yazlanlarn okunmasn isteyebiliriz. Bunun iin gets komutunu kullanrz. Ekrana yaz yazdrmak iin
puts komutu kullanlabilir.

gets(ad);//Bir karakter dizesini (satr) klavyeden okur


puts(ad);//Bir karakter dizesini (satr) ekrana yazar

rnek :
Aada klavyeden girilen bir karakter dizesinin tersi bulunarak ekrana yazdrlmaktadr.

#include <stdio.h>
#include <string.h>

main(){
char ifade[100];
int k,uzunluk;
puts("Ifadenizi Giriniz ");
gets(ifade);
uzunluk=strlen(ifade);
for(k=uzunluk-1;k>=0;k--)
putchar(ifade[k]);
putchar(' ');
}

Bir deiken klavyeden scanf komutu ile okutulur, printf komutu ile ekrana yazdrlr.

#include<stdio.h>
int main()
{

int a;
scanf("%d",&a);
a = a * 2;
printf("Cevap %d",a);
return 0;

Buradaki %d ifadesi tamsay (integer) deerleri okuma yada yazdrma amac ile kullanlr. %d gibi dier
ifadeler aada gsterilmitir.

%d or %i int
%c char
%f float
%lf double
%s string

4. Karar Yaplar
If deyimi
imdiye kadar pe pee komutlar ile nasl program yaplacan karar almay kullanmadan grdk. If deyimi
koullar test etmek amac ile kullanlr ve program akn deitirebilir. Aada if deyimi iin basit bir
rnek vardr.

#include<stdio.h>
int main()
{
int notu;
char gec;
scanf("%d",&notu);
if (notu > 40)
gec = 'e';
return 0;
}

Yukardaki rnekte kullanc ald notu girer ve kontrol deyimi ile notunun 40'tan byk olup olmadna
bakar. Eer notu 40'tan byk ise if deyimi alr. imdi de notun 40'tan kk olduu duruma da
bakld program yazalm.

#include<stdio.h>
int main()
{
int notu;
char gec;
scanf("%d",&notu);
if (notu > 40)
gec = 'e';

else
gec = 'h';
return 0;

Eer if deyiminde birden fazla komut altrmak istiyorsak { ve } parantezlerini kullanmamz


gerekmektedir. Bu parantezler komutlar gruplamada kullanlr.

#include<stdio.h>
int main()
{
int notu;
char gec;
scanf("%d",&notu);
if (notu > 40)
{
gec = 'e';
printf("Gectiniz");
}
else
{
gec = 'h';
printf("Kaldiniz");
}
return 0;
}

if deyiminde VE (&&) ile VEYA (||) ileleri kullanlabilir. Bu ifadelerin kullanld rnek aadaki gibidir.

#include<stdio.h>
int main()
{
int a,b;
scanf("%d",&a);
scanf("%d",&b);
if (a > 0 && b > 0)
printf("Her iki sayda pozitiftir. ");
if (a == 0 || b == 0)
printf("Saylardan en az bir tanesi 0 dr. ");
if (!(a > 0) && !(b > 0))
printf("Her iki sayda negatiftir. ");
return 0;
}
Switch Deyimi

Switch deyimi if deyimi gibidir fakat switch deyiminde ayn anda birden fazla koul ve buradaki koullarn
komutlar iin bir ifade vardr. If deyiminden daha hzl alr. Switch deyiminde nce kontrol edilecek
deiken seilir ve sonra her koul iin komutlar yazlr. Eer hi bir koul salanmaz ise "default " ifadesini
kullanabilirsiniz. Eer birden fazla komut kullanrsanz, bu komutlar { } parantezleri ierisine koymay
unutmaynz.

#include<stdio.h>
int main()
{
char meyve;
printf("Aadakilerden hangisi sizing favori meyvenizdir: ");
printf("a) Elmalar ");
printf("b) Muzlar ");
printf("c) Kirazlar ");
scanf("%c",&meyve);
switch (meyve)
{
case 'a':
printf("Siz elmalar seviyorsunuz ");
break;
case 'b':
printf("Siz muzu seviyorsunuz ");
break;
case 'c':
printf("Siz kirazlar seviyorsunuz ");
break;
default:
printf("Geersiz bir seim yaptnz ");
}
return 0;
}
Mantksal fadeler

Sonucu doru yada yanl deer reten ifadelere mantksal ifade denir. Ancan C dili asndan doru yada
yanl diye bir kavram bulunmaz. Onun yerine 0 ve 0'dan farkl deerler sz konusudur. Bu bakmdan 0
deeri yanl olarak, dier deerler doru olarak alglanmaldr. C programlama dilinde kullanlan mantksal
operatrler aadaki gibidir.

== Eittir
!= Eit deildir
> Byktr
>= Byk eittir
< Kktr
<= Kk eittir
&& Ve
|| Yada
! Deil

5. Dngler
Bazen bireyi birok kez yapmak isteyeceksiniz. rnein ekranda her satrn bana bir karakter yazdrmak
isteyebilirsiniz. Normalde bu ii bir sr printf komutu ile yapmak zorunda kalrz ama dng kullanrsak
tek printf komutu ile yapm oluruz. eit dng tipi vardr. Bunlar for dngs, while dngs ve do
while dngsdr.
For dngs

For dngs size bir saydan dier sayya kadar her seferinde tanml miktar kadar artarak dner. For
dngs aadaki yapy kullanr.

for (balang says;biti koul;art deikeni)


komut;

Eer birden fazla komut kullanmak isterseniz parantezler arasna girebilirsiniz. Aadaki rnekte for
dngs ile ekrana 24 kez 'H' karakteri yazlr.

#include<stdio.h>
int main()
{
int i;
for (i = 1;i == 24;i++)
printf("H ");
return 0;
}

Buradaki i++ ifadesi i = i + 1 ifadesi ile ayndr. Burada ayrca ++i de kullanabilirdiniz. i++ ile ++i
arasndaki fark birinde artrma sonra dierinde nce yaplr.
While dngs

While dngs for dngsnden farkldr. Bu dngy dngnn ka kez dnecei belli olmadnda
kullanrz. While dngsnnde dng'ye girmeden nce dng deikenine balang deeri verilir ve bu
deer dng ierisinde deitirilir.

#include<stdio.h>
int main()
{
int i,times;
scanf("%d",&times);
i = 0;
while (i <= times)
{
i++;
printf("%d ",i);
}
return 0;
}

Do While Dngs
Do while dngs ayn while dngsne gibidir. Burada koul kontrol dngnn sonundadr.

#include<stdio.h>
int main()
{

int i,times;
scanf("%d",&times);
i = 0;
do
{
i++;
printf("%d ",i);
}
while (i <= times);
return 0;

Break ve Continue
Dng almasn sonlandrmak istediimiz zaman break komutunu kullanrz. Bu komutu kullandmz
yerde dngnn kalan komutlar iletilmeden hemen dng darsna klr.

#include<stdio.h>
int main()
{
int i;
while (i < 10)
{
i++;
if (i == 5)
break;
}
return 0;
}

continue komutunda dngnn geri kalan komutlar iletilmeden dngnn bir sonraki adm iin dng
bana gidilir.

#include<stdio.h>
int main()
{
int i;
while (i < 10)
{
i++;
continue;
printf("Merhaba ");
}
return 0;
}

6. aretiler (Pointer)
aretiler hafza adreslerini tutan deikenlerdir. Hafza adresini saklad iin iaretinin deeri hafza

adresinin gsterdii yere baklr.

aretiler tipli yada tipsiz olabilirler. Tipli iareti tamsay gibi belirli deiken tipine iaret eder. Tipsiz
iareti herhangi bir veri tipini iaret edebilir. areti tanmlayabilmek iin deiken adndan nce *
karakterinin konulmas gerekir. Burada iaretinin nasl tanmland ile ilgili rnek bulunmaktadr.

int main()
{
int *p;
void *up;
return 0;
}

Bir tamsay deikeninin adresi tamsay tipinde bir iaretiye & karakterini kullanarak atanabilir.

int main()
{
int i;
int *p;
i = 5;
p = &i;
return 0;
}

aret edilen bir tamsay deikeninin deerine iaretinin geri referans (dereferencing) yaplmas ile
eriilebilir. * karakteri geri referans iin kullanlmtr.

int main()
{
int i,j;
int *p;
i = 5;
p = &i;
j = *p; //j = i
*p = 7; //i = 7
return 0;
}

Bu ifade j = i ilemini yapar.

7. Diziler
imdiye kadar 5 tane deiken tanmlamak istediimizde aadaki gibi bir ifade kullanyorduk.

int i1,i2,i3,i4,i5;

Eer 100 tane deiken tanmlamak istenirse bu ilem epey zaman alacaktr. Dizi kullanrsak tek bir
deiken ad ile istediimiz kadar deiken tanmlayabiliriz. Diziler deikenler gibi tanmlanr, sadece
deiken adndan sonra keli parantez konulur ve bu parantezin iersine ka tane deiken tanmlanmak
istenirse yazlr.

int a[5];

Dizinin bir elemannn deerine ulamak iin deiken ad ve deiken adndan sonra keli parantez
ierisinde ulalmak istenen elemann numaras yazlr. Dizilerin sra numaras 0'dan balar. rnein 3
elemanl bir dizi aadaki gibi tanmlanr ve kullanlr.

int a[4];
a[0] = 12;
a[1] = 23;
a[2] = 34;
printf("%d",a[0]);
Dizileri dnglerde kullanma

Dizilerden en ok dnglerde kullanlrken yararlanlr. nk dizilerde elemanlar birbirlerini izler. Bir dizi
tanmlandnda ilk deer 0 olmaz. Bunun iin diziyi sfrlamak yani balang deerlerini atama ilemini
yapmamz gerekir.

int a[10];
for (i = 0;i < 10;i++)
a[i] = 0;
ok boyutlu diziler

imdiye kadar kullandmz diziler tek boyutlu idi.

Tek boyutlu dizi 2-boyutlu dizi


01
12
23
012
0123
1456
2789

yada daha byk boyutlu dizileri kullanabilirsiniz. Aada iki boyutlu dizinin nasl tanmland ve nasl

kullanld gsterilmektedir. Burada dizimiz iki boyutlu olduu iin i ie 2 tane for dngs kullanlmtr.

int a[3][3],i,j;
for (i = 0;i < 3;i++)
for (j = 0;j < 3;j++)
a[i][j] = 0;
Dizi Sralama

Dizileri sralamak iin birok algoritma vardr. Bunlardan bazlar Bubble Sort, Quick Sort ve Sequential Sort
dr. Aadaki program 100 elemanl bir dizinin elemanlarn ekrandan okuyacak, azalan srada sraladktan
sonra tekrar ekrana yazacaktr.

#include<stdio.h>

int temp, dsay, k, l, dizi[100];

main(){
printf("Girilecek eleman sayisini Veriniz? ");
scanf("%d",&dsay);
for(k=0;k<dsay;k++){
printf("%d. sayiyi giriniz",k);
scanf("%d",&dizi[k]);
}

for(k=0;k<dsay-1;k++)
for(l=k+1;l<dsay;l++)
if (dizi[k]<dizi[l]){
temp=dizi[k];
dizi[k]=dizi[l];
dizi[l]=temp;
}
for(k=0;k<dsay;k++)
printf("%d",dizi[k]);
}
Dizi'de Eleman Arama

Bir grup eleman ierisinde bir takm eyler aramak zorunda kalacamz durumlar olacaktr. Bu durumlarda
aadakine benzer algoritmalar kullanabiliriz. Bu programda 100 elemanl dizinin dolu olduu
varsaylmtr.

#include <stdio.h>

int deger, k, dizi[100];

main(){
printf("Aranacak Deer? ");
scanf("%d", &deger);
for (k=0;k<100;k++)
if (dizi[k]=deger){
printf("e dizi ierisinde %d sradadr. ", k);
exit;
}

printf("Aranan e Bulunamad ");


}

8. Karakter Dizileri (Dizgeler)


Dizge (string) karakterlerden oluan bir dizidir. Dizgeler en son karakterinden sonra 0 yada null deerini
alarak karakter dizisinin nerede bittiini anlarlar. Null karakteri karakter dizisine dahil deildir. Dizgeleri
kullanmann iki yntem vardr. Birinci yntem karakter dizisi, ikinci yntem dizge iaretisi (string pointer)
eklindedir. Bir dizge normal bir dizi gibi tanmlanr.

char ca[10];

Burada dizinin her elemanna bir deer atamak ve son karaktere 0 girmek gerekmektedir. Dizgeleri ekrana
yazarken "%s" ifadesini kullanabilirsiniz.

char ca[10];
ca[0] = 'M';
ca[1] = 'e';
ca[2] = 'r';
ca[3] = 'h';
ca[4] = 'a';
ca[5] = 'b';
ca[6] = 'a';
ca[7] = 0;
printf("%s",ca);

Dizge iaretileri karakter iaretisi gibi tanmlanr.

char *sp;

Bir karakter iaretisine bir deer atadnz zaman o otomatik olarak karakter dizilerindeki gibi 0 deerini
koyar.

char *sp;
sp = "Merhaba";
printf("%s",sp);

scanf komutunu kullanarak bir dizgeyi bir karakter dizisi olarak okutabilir, dizge iaretisi olarak
okutamayz. Eer bir dizge iaretisi olarak okutmak isterseniz onun karakter dizisine iaret etmesini
salamalsnz.

char ca[10],*sp;
scanf("%s",ca);
sp = ca;
scanf("%s",sp);
Dizge (String) fonksiyonlar

String.h ktphane dosyas dizgilerle alan baz yararl fonsiyonlara sahiptir. ok sk kullanacanz baz
fonksiyonlar aadaki gibidir.

strcpy(hedef, kaynak) :
C programlama dilinde dizge1 = dizge2 eklinde bir ifade kullanamazsnz. Bir dizgeyi baka bir dizgeye
atamak iin strcpy komutunu kullanmanz gerekmektedir. strcpy komutu kaynak dizgeyi hedef dizgeye
kopyalar.

s1 = "abc";
s2 = "xyz";
strcpy(s1,s2); // s1 = "xyz"

strcat(hedef, kaynak) :
Kaynak ile hedef dizgeleri birletirir bunlar hedef dizgenin ierisine koyar.

s1 = "abc";
s2 = "xyz";
strcat(s1,s2); // s1 = "abcxyz"

strcmp(birinci, ikinci) :
Birinci ve ikinci dizgeleri karlatrr. Eer birinci dizge daha byk ise 0 dan byk bir say geri dner.
Eer birinci dizgi ikincisinden daha kk ise 0 dan kk bir say geri dner. Eer her iki dizge birbirlerine
eit ise 0 deer geri dner.

s1 = "abc";
s2 = "abc";
i = strcmp(s1,s2); // i = 0

strlen(string) :
Dizgedeki karakter saysn geri dndrr.

s = "abcde";
i = strlen(s); // i = 5

9. Fonksiyonlar
Fonksiyonlar alt programlardr. lk yazdmz programda bir fonksiyon olan main fonksiyonunu kullandk.
Her zaman bir fonksiyonu arld yerden nce tanmlamanz gerekmektedir. main fonksiyonu bizim
yazacamz fonksiyonlar araca iin programn en alt ksmna koyduk.

Bir fonksiyon tanmlanrken sras ile tip, fonksiyon ad ve parantezler iersinde gerekirse parametreler
yazlr. Fonskiyonlar geri deer dndrebilir. Bu deer karakter yada tamsay tipinde olabilir. Eer
fonksiyonun geri deer dndrmesini istemiyorsanz tip olarak "void" ifadesini kullanrsnz.

#include<stdio.h>
void Merhaba()
{
printf("Merhaba ");
}
int main()
{
Merhaba();
return 0;
}
Parametreler

Parametereler fonksiyonlara hesaplama yapmak iin gnderilen deerlerdir. rnein yukardaki programda
kullandmz "Merhaba " ifadesi printf fonksiyonuna gnderilen bir parametredir.

Parametreleri fonksiyon adndan sonraki parantezin ierisinde fonksiyona gnderilen deerleri almak iin
tanmlamak gerekmektedir. Aada iki sayy toplayan ve sonucu geri dndren fonksiyon bulunmaktadr.

#include<stdio.h>
int Topla(int a,int b)
{

return a + b;

int main()
{
int cevap;
cevap = Topla(5,7);
return 0;
}

sterseniz deikenin adresini fonksiyona gnderebilirsiniz bylece kopyalama yaplmam olur. Bu i iin
iaretilere ihtiya duyarz.

#include<stdio.h>
int Topla(int *a,int *b)
{
return *a + *b;
}
int main()
{
int cevap;
int sayi1 = 5;
int sayi2 = 7;
cevap = Topla(&sayi1,&sayi2);
printf("%d ",cevap);
return 0;
}
Global ve yerel deikenler

Yerel deikenler bir fonksiyon ierisinde tanmlanr ve sadece o fonksiyon ierisinde kullanlabilir. Eer
btn fonksiyonlarda kullanlabilecek bir deiken tanmlamak istiyorsanz global deiken tanmlamanz
gerekecektir.

#include<stdio.h>
// Global deikenler
int a;
int b;
int Topla()
{
return a + b;
}
int main()
{
int cevap; // Yerel deiken
a = 5;
b = 7;
cevap = Topla;
printf("%d ",cevap);
return 0;
}
Komut satr parametreleri

Bazen komut satrndan programa parametre gemek gerekebilir. rnein;

$ benimprogram -A

Komut satrnda girilen parametrelere eriebilmek iin main fonksiyonundaki parantezler ierisinde
deiken tanmlar yapmak gerekmektedir. Birinci parametre programa gnderilen parametre saysdr.
Programn ad da bir parametre olarak gider ve 0'nc deerden ulalabilir.

#include<stdio.h>

int main(int argc,char *argv[])


{
int i;
printf("Toplam: %d ",argc);
if (argc > 0)
{
printf("Parametreler: ");
for (i = 0;i < argc;i++)
printf("%s ",argv[i]);
}
return 0;
}

10. Yaplar
Ayn tipte gruplanm birok deikeni dizilerde ayn isim altnda tanmlamay grdk. Yaplarda ayn diziler
gibidir fakat ayn ad altnda deiik veri tipindeki deikenleri barndrabilirler. rnein karakter tipinde isim
ve tamsay tipinde bir ya deikenlerini kisi yaps altnda oluturabilirsiniz. Bu kisi yaps C programlama
dilinde aadaki gibidir.

struct kisi
{
char *isim;
int yas;
};

Yukarda sadece tipin tanmlamas var. imdi bu tipte bir deiken tanmlamamz gerekiyor. Aada p adl
deikeni kisi tipinde nasl tanmladmz grmekteyiz.

#include<stdio.h>
struct kisi
{
char *isim;
int yas;

};
int main()
{
struct kisi p;
return 0;
}

Bu yapdaki dizge yada tamsay deerine ulaabilmek iin yap adndan sonra nokta koyup deiken adn
yazmamz yeterlidir.

#include<stdio.h>
struct kisi
{
char *isim;
int yas;
};
int main()
{
struct kisi p;
p.isim = "Halil Mutlu";
p.yas = 29;
printf("%s",p.isim);
printf("%d",p.yas);
return 0;
}
Tip tanmlamalar

Tip tanm ile belirlediimiz bir ad deikene verebilirsiniz. Aada intptr isminde tamsay tipinde bir
iaretinin nasl tanmlandn gryoruz.
#include<stdio.h>
typedef int *intptr;
int main()
{
intptr ip;
return 0;
}
Yaplar iin tip tanmlamalar

Yap deikeni olutururken struct kelimesini kullanmak istemiyorsanz yap iin tip tanm oluturabilirsiniz.
Yapnn tip tanmnn ad genellikle byk harflerle verilir.
#include<stdio.h>
typedef struct kisi
{
char *isim;
int yas;
} KISI;

int main()
{
KISI p;

p.isim = "Halil Mutlu";


p.yas = 29;
printf("%s",p.isim);
printf("%d",p.yas);
return 0;

}
aretilede Yaplar

aretilerde yaplar kullandmz zaman nokta (.) yerine -> ifadesini kullanmamz gerekmektedir.

#include<stdio.h>
typedef struct kisi
{
char *isim;
int yas;
} KISI;
int main()
{
KISI p;
KISI *pptr;
pptr = &p;
pptr->isim = "Halil Mutlu ";
pptr->yas = 29;
printf("%s",pptr->isim);
printf("%d",pptr->yas);
return 0;
}
Union' lar

Union ifadeleri yaplar gibidir sadece hafzada daha az yer kaplarlar. Eer 8 byte'lk bir double ve 4 byte' lk
bir integer tipinde bir yap oluturursanz toplam boyut 8 byte olacaktr. nk onlar birbirlerinin
stndedirler.Eer double tipindeki deikenin deerini deitirirseniz integer tipindeki deikeninde deeri
deiir. Ayn ekilde integer tipindeki deikenin deerini deitirirseniz double tipindeki deikeninde
deeri deiir.

#include<stdio.h>
typedef union sayi
{
double d;
int i;
} SAYI;
int main()
{
SAYI n;
n.d = 3.14;
n.i = 5;
return 0;
}

11. Metin ve veri dosyalar

Dosyalar verilerinizi harddisk gibi ykleme birimlerinde sonra kullanmak amac ile saklar. Metin ve veri
dosyalar olmak zere iki tipte dosyalar vardr.
Metin Dosyalar

Metin dosyalar karakter dizilerini dosyaya koymak iin kullanlr. Metin dosyas oluturmak iin bir dosya
iaretisi tanmlamak gerekmektedir.

#include<stdio.h>
int main()
{
FILE *f;
return 0;
}

Sonra fopen fonksiyonunu kullanarak dosyay amalsnz. fopen fonksiyonu dosya ad ve ama modu olmak
zere 2 adet parametre alr. fopen fonksiyonu geri dosya iaretisi dndrr.

#include<stdio.h>
int main()
{
FILE *f;
f = fopen("test.txt","w");
return 0;
}

Yukardaki rnekte test.txt isminde bir dosya oluturuluyor. "w" dosyann yazma iin aldn, dosya yoksa
oluturulacan belirtir. Dier dosya ama modlar aadaki gibidir.

r Okuma iin a
r+ Okuma ve yazma iin a
w Yazma iin a ve eer dosya yok ise olutur. Eer dosya var ise bo brak.
w+ Okuma ve yazma iin a ve eer dosya yok ise olutur. Eer dosya var ise bo brak.
a Dosyann sonuna ekleme yapmak iin a, dosya yok ise olutur
a+ Okuma ve dosyaya ekleme yapmak iin a, dosya yok ise olutur.

Bir karakter dizisini dosyaya yazma iin fprintf komutu kullanlr. fprintf komutu printf gibidir. Burada
sadece dosya iaretisini ilk parametre olarak tanmlamak gerekir.

#include<stdio.h>
int main()
{
FILE *f;
f = fopen("test.txt","w");

fprintf(f,"Merhaba");
return 0;

Dosyaya yazma ilemini bitirdiiniz zaman dosyanz kapatmalsnz. Eer dosyannz kapatmaz iseniz baz
veriler dosyaya yazlamayabilir. Dosyalar kapatmak iin fclose komutu kullanlr.
#include<stdio.h>
int main()
{
FILE *f;
f = fopen("test.txt","w");
fprintf(f,"Merhaba");
fclose(f);
return 0;
}

fgets komutu dosyadan bilgi okurken kullanlr. Dosyadan okunan karakterleri yklemek iin tampon
(buffer) eklinde ncelikle bir karakter dizisi tanmlamalsnz. fgets' in 3 parametresi tampon deikeni,
tamponun boyutu ve dosya iaretisidir.
#include<stdio.h>
int main()
{
FILE *f;
char buf[100];
f = fopen("test.txt","r");
fgets(buf,sizeof(buf),f);
fclose(f);
printf("%s ",buf);
return 0;
}
Veri Dosyalar

Bir veri dosyas tamsay gibi verileri yklemek iin kullanlr. Veri dosyasn atnz zaman fopen' nn dosya
ama moduna b parametresini eklemeniz gerekmektedir.

#include<stdio.h>
int main()
{
FILE *f;
f = fopen("test.dat","wb");
fclose(f);
return 0;
}
fwrite dosyaya veri yazmak iin kullanlr. fwrite'n birinci parametresi dosyaya yazmak istediiniz
deikenin iaretisidir. kinci parametre deikenin boyutu, ncs yazlacak deikenin says ve
sonuncusuda yazlacak olan dosyann iaretisidir.

#include<stdio.h>
int main()
{
FILE *f;
int buf;

f = fopen("test.dat","wb");
buf = 100;
fwrite(&buf,sizeof(buf),1,f);
fclose(f);
return 0;

fread dosyadan veri okumak iin kullanlr, fwrite komutu gibidir burada veri deikene yazmak yerine
deikene okutulur.

#include<stdio.h>
int main()
{
FILE *f;
int buf;
f = fopen("test.dat","rb");
fread(&buf,sizeof(buf),1,f);
printf("%d ",buf);
fclose(f);
return 0;
}
Yaplarda veri dosyalarnn kullanm

Yaplar dier veri tiplerinde olduu gibi veri dosyalarna yazabilir yada okuyabilirsiniz
#include<stdio.h>
struct
{
char name[100];
int age;
} p;
int main()
{
FILE *f;
strcpy(p.name,"John");
p.age = 25;
f = fopen("test.dat","wb");
fwrite(&p,1,sizeof(p),f);
fclose(f);
return 0;
}

You might also like