Professional Documents
Culture Documents
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 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:
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
MS DOS (Turbo C)
Linux (GCC)
NOT
Turbo C Editr ortamnda derlenirken CTRL + F9 ksayol tularn kullanabilirsiniz.
ilk.c
nin kts:
IKTI
Merhaba Dnya!
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
Yazlmda kullanlacak olan her fonksiyon iin ilgili balk dosyas programn bana
ileve edilmedlidir.
Her C program main() fonksiyonunu iermelidir.
Program iinde kullanlacak olan deikenler ve sabitler mutlaka tanmlanmaldr.
Satrn sonuna ; iareti konmaldr.
Her bloun ve fonksiyonun balangc ve bitii srasyla { ve } sembolleridir.
C dilinde yazlan kodlarda kk-byk harf ayrm vardr (case sensitive).
rnein A ile a derleyici tarafndan farkl deerlendirilir.
Aklama operatr /* */ sembolleridir.
Her alt yapya girerken birka boluk veya TAB tuunu kullann. Bu okunabilirlii
arrtracaktr. rnein:
for(i=0;i<10;i++)
{
for(j=0;j<i;j+=2)
{
do{
k = i+j;
}while(k!=0);
}
}
=
=
=
=
=
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
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:
"\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)
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
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while
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
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
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
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;
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
x in baslangic degeri */
y nin baslangic degeri */
Linux (GCC)
IKTI
x = 1 ve y = 3, olarak veriliyor.
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?
Aklama
ve
veya
zel veya
deil
saa kaydrma
sola kaydrma
rnek
Sonucu
8 (00001000)
10 | 25 (00001010 | 00011001)
27 (00011011)
10 ^ 25 (00001010 ^ 00011001)
19 (00010011)
~10 (00001010)
245 (11110101)
1 (00000001)
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:
void main()
{
kr = c & 0x7f; /* kr = c & 127 */
printf("%d sayisinin ASCII karsiligi %c\n",c,kr);
}
Linux (GCC)
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
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!..");
ksmdan olumaktadr:
Anlam
Ses retir(alert)
imleci bir sola kaydr(backspace)
Sayfa atla. Bir sonraki sayfann bana ge(formfeed)
\n
\r
\t
\v
\"
\'
\\
%%
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
parametreler herhangi
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)
IKTI
3 tamsayi
: 2 10 50
3 tamsayi [TAB] : 2
10
50
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)
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
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
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux (GCC)
IKTI
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:
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
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
/* 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)
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.
double pow(double x,
double y);
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
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
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux (GCC)
IKTI
30 derecenin sinusu
: 0.500000
30 derecenin kosinusu : 0.866025
30 derecenin tanjanti : 0.577350
Aklama
rnek
long atol(const
char *s);
double atof(const
char *s);
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
/* 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)
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
Aklama
rnek
isalpha(c)
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
DERLEME ve ALITIRMA
Sonu
MS DOS (Turbo C)
Linux (GCC)
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].
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)
IKTI
x degeri: 3
y degeri: 8
x, y den kucuk
if
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
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
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)
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)
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;
...
}
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux (GCC)
IKTI
Lutfen bir karakter girin
a
a harfine bastiniz
b harfine bastiniz
a veya b ye basmadiniz
IKTI
Lutfen bir karakter girin
b
b harfine bastiniz
a veya b ye basmadiniz
IKTI
IKTI
Ltfen bir karakter girin
c
a veya b ye basmadiniz
Programda, klavyeden okunan tek bir karakter deikenin ieriine baklp uygun dallanmalar
yaptrlmtr. 11. satrda deiken getchar() fonksiyonu ile okutulmutur. Eer 'a' veya
'b' karakterlerinden biri girilirse, ekrana bu harflerin girildiine dair mesaj yazlacak, aksi
takdirde bu karakterin dnda bir karakterin giri olarak kullanld gsteren bir mesaj
yazlacaktr. rnein 'c' karakteri klavyeden girilmi ise a veya b ye basmadiniz gibi.
Fakat 'a' karakterleri girildiinde ekrana her durumda yazdrlmaktadr. Bunun sebebi,
case 'a': durumunda srasyla 16, 18 ve 20. satrlarn ileme konmasdr. Bunu engellemek
iin 16. satrdan sonra programn baka bir yere ynlendirilmesi gerekir. Bu ynlendirme, 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:
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux (GCC)
IKTI
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:
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux (GCC)
IKTI
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;
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)
IKTI
x : -5
y : 8
z = -40
/* 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)
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, 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)
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);
/* koul */
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)
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:
Linux (GCC)
IKTI
Faktoriyeli hesaplanacak sayi girin : 4
4! = 24
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
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)
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)
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");
}
...
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);
...
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)
IKTI
Faktoriyeli
2! = 2
Faktoriyeli
3! = 6
Faktoriyeli
5! = 120
Faktoriyeli
9! = 362880
Faktoriyeli
0! = 1
Faktoriyeli
continue
Deyimi
Bir dng ierisinde continue deyimi ile karlalrsa, ondan sonra gelen deyimler atlanr ve
dng bir sonraki evrime girer. rnein:
...
for(x=-50;i<=50;x++)
{
if(x<0) continue;
/* x<0 ise alttaki satr atla */
printf("%d %f",x,sqrt(x));
}
...
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.
/* 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)
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:
/* klasik biim */
/* modern biim */
/* modern biim */
veya
veya
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);
eklinde de yazlabilir.
Buraya kadar anlatlanlar Program 8.1 zeride zetlenmitir.
Program 8.1: topla fonksiyonunun ana programda kullanlmas
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux (GCC)
IKTI
Iki sayi girin : 5 12
5 ve 12 nin toplami 17 dir.
Geri Dn Deerleri
return
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
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:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux (GCC)
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:
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);
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux (GCC)
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
bankamatik(int para)
{
...
}
/* 8 satr, 35 stn */
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)
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
2147483647
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()
{
...
}
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.
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:
+=
+=
+=
+=
+=
+=
+=
+=
+=
+=
+=
+=
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)
IKTI
01 08 2003 yilinin
213. gunudur
%d\n",eb);
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux (GCC)
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
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]:
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];
=
=
=
=
=
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
*/
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];
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
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:
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
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
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
IKTI
IKTI
Once :
Sonra:
100
900
-250
700
400
689
125
550
550
450
900
400
689
347
450
125
347
100
700
-250
/* 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
IKTI
IKTI
Once :
Sonra:
100
900
-250
700
400
689
125
550
550
450
900
400
689
347
450
125
347
100
700
-250
yada
char s[7] = "deneme";
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
IKTI
IKTI
Birseyler yazin : ahmet
Dizinin uzunlugu : 5
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
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 */
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:
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux
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:
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
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
IKTI
IKTI
Matrisin kendi formunu girin:
3 2 5
2 3 6
5 4 3
Matrisin determinanti = -32.000000
1:
2:
3:
4:
5:
*/
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
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
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.
/* 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
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
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.
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:
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: }
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;
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 */
/* 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]
char *isim[5]
};
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);
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);
/* 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
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
!
Aadaki program kalvyeden girilen bir stringin iindeki 'm' karakterlerinin saysn blup
ekrana yazar. nceleyiniz.
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
IKTI
IKTI
Bir string girin: marmara
'm' karakteri sayisi = 2
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:
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux
IKTI
IKTI
1.
2.
3.
4.
5.
6.
7.
Pazartesi
Sali
Carsamba
Persembe
Cuma
Cumartesi
Pazar
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);
/* 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
IKTI
IKTI
Sifre
sifre
Sifre
sifre
Sifre
sifre
: admin
yanlis
: root
yanlis
: elma%xj4
dogru
/* strcpy kullanarak
kopyalama */
for(i=0;str1[i];i++)
str3[i] = str1[i];
str3[i] = '\0';
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux
IKTI
IKTI
str1 : Deneme
str2 : Deneme
str3 : Deneme
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
IKTI
IKTI
Adiniz ? : Mert
Selam Mert
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux
IKTI
IKTI
Bir seyler yazin : deneme stringi
Dizinin uzunlugu
strlen kullanarak = 14
strlen kullanmadan = 14
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux
IKTI
IKTI
Bir string girin: Gaziantep Universitesi
Uzunlugu (struzn) : 22
Uzunlugu (strlen) : 22
: %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> 11prg10
$ ./11prg10
IKTI
IKTI
Bir string girin: C ile programlama
String
Tersi
: C ile programlama
: amalmargorp eli C
C Programlama
Dili'ne Giri
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
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;
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};
/* bolum = 2 anlamnda */
/* gun
= 4 anlamnda */
/* renk = 0 anlamnda */
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux (GCC)
IKTI
renk = 1
/* 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? */
/* n, tek mi? */
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux (GCC)
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
/*
/*
/*
/*
/*
1
2
3
4
5
*/
*/
*/
*/
*/
void main(void)
{
bolum = donanim;
printf("bolum : %d\n",bolum);
bolum +=2;
/* bolum=motor */
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux (GCC)
IKTI
bolum : 2
Yeni bolum : 4
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 */
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux (GCC)
IKTI
378h portuna 96 yazildi.
NOT
ile sabit bildirimi yaplrken struct ile deiken bildirimi yaplr.
enum
char ad[10];
long no;
short sinif;
};
eklinde olmaldr. ogr1 deikeni ile tanmlanan 1. rencinin numarasna bir deer atama
ilemi:
ogr1.no = 2012597;
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux (GCC)
IKTI
Ogrenci Nosu
Ogrenci Adi
: 948589
: Ahmet
Ogrenci Sinifi: 2
*** Girilen bilgiler ***
No
: 948589
Adi
: Ahmet
Sinifi: 2
/* 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.gun = 1;
n.ay = 8;
n.yil = 2003;
goster(n);
}
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux (GCC)
IKTI
Tarih: 01-08-2003
/* 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;
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux (GCC)
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
/* 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)
IKTI
Tarih: 01-08-2003
eklinde kullanlrsa programda daha sonra int tipinde bir deiken tanmlarken u biimde
kullanlmasna izin verilir.
tamsayi x,y;
Yukardaki bildirim yapldnda, deikenler iin bellekte bir yer ayrlmaz. Deiken
bildirimi:
union paylas bir,iki;
DERLEME ve ALITIRMA
MS DOS (Turbo C)
Linux (GCC)
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].
...
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 olabilir.
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
/* 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)
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.
Linux
$ 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)
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)
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");
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)
- - -
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 ...
C Programlama
Dili'ne Giri
Ders 17: letim Sistemi Ynetimi
system() Fonksiyonu
main() Fonksiyonuna Paremetre
rnekler
system()
Fonksiyonu
Aktarm
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");
}
NOT
Program 17.2 sadece bir kez altrlmal. Aksi halde autoexec.bat dosyasna
defalarca doskey /insert ifadesi eklenir.
main()
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 */
.
}
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
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:
/* 1. parametre: sayi1 */
/* 2. parametrenin ilk karakteri: operator
/* 3. parametre: sayi2 */
= atoi(argvek[3]);
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 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 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].
Aklama
Derleme ve altrma:
MS DOS (Turbo C)
C:\TC> tcc 18prg01.c
C:\TC> 18prg01
kt:
IKTI
Linux
- - -
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
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: }
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
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:
/* 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
- - -
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
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
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
- - -
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
*/
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:
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.
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.
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();
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 */
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();
}
Program kts
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
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
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
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
- - - -
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
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
- - - -
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:
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:
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:
Linux
kt:
IKTI
HIZ = 0.165344 m/s
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));
Linux
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);
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
eklindedir. Burada:
#endif
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:
Derleme ve altrma:
MS DOS (Turbo C)
Linux
kt:
MSDOS (Turbo C)
Linux
#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
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
- - - -
kt:
IKTI
Veri DATA portuna yazildi
#pragma
Bu nilemci deyimi bir komut beliticisi ile birliktikte kullanlr. Genel kullanm biimi:
#pragma komut_belirticisi
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
mesaj ile son verir. Mesajn trnak iinde yazlmadna dikkat ediniz.
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
:
:
:
:
%d\n",__LINE__);
%s\n",__FILE__);
%s\n",__DATE__);
%s\n",__TIME__);
Derleme ve altrma:
MS DOS (Turbo C)
Linux
kt:
IKTI
Satir No
Dos ya adi
Tarih
Saat
:
:
:
:
7
20prg10.c
Jul 11 2004
17:52:30
15:
16:
17:
Derleme ve altrma:
MS DOS (Turbo C)
Linux
kt:
MS DOS (Turbo C)
Linux
Bu derleyici ANSI C
Pi sayisi = 3.141593
e sayisi = 2.718282
Kocaali niversitesi
Makale
Kategori :
C & C++
Tarih :
13/10/2005
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.
19831989 yllar arasnda ANSI C' nin standart tanm yapld ve 1990 da yaymland. (ANSI / ISO
9899:1990)
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.
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.
#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
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.
#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.
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.
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.
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.
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;
#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.
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;
}
int main()
{
int a;
char b;
a = 3;
b = 'H';
return 0;
}
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();
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.
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",¬u);
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",¬u);
if (notu > 40)
gec = 'e';
else
gec = 'h';
return 0;
#include<stdio.h>
int main()
{
int notu;
char gec;
scanf("%d",¬u);
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.
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",×);
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",×);
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
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;
}
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
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>
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>
main(){
printf("Aranacak Deer? ");
scanf("%d", °er);
for (k=0;k<100;k++)
if (dizi[k]=deger){
printf("e dizi ierisinde %d sradadr. ", k);
exit;
}
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);
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
$ 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>
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;
}
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;
}
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;
}