Professional Documents
Culture Documents
Notlar
www.eemdersnotlari.com
indekiler
indekiler................................................................................................................................... 2
nsz .......................................................................................................................................... 5
Yaralanlabilecek Dier Kaynaklar ........................................................................................ 5
Program Nedir ............................................................................................................................ 6
Programlama Dili Nedir? ........................................................................................................... 7
C Nasl Bir Programlama Dilidir? .............................................................................................. 8
C'de Program Yazma... ............................................................................................................... 9
nn niversitesi nternet Merkezinde Program Yazma...................................................... 9
Kendi Yerel Bilgisayarnzda program yazma ..................................................................... 10
Yazlm Program Kat zerinde altrma ...................................................................... 11
Genel Program Yaps .............................................................................................................. 12
Balarken .............................................................................................................................. 12
Deikenler ve Aritmetik ilemler ....................................................................................... 14
Deiken Tanmlama Kurallar ................................................................................................ 17
Sabitler ................................................................................................................................. 17
Deiken Trleri ................................................................................................................... 18
Deiken Adlandrma Kurallar ....................................................................................... 18
Alfa saysal Deikenler................................................................................................... 18
Saysal Deikenler .......................................................................................................... 19
Tanmlamalar ................................................................................................................... 19
Aritmetik fadeler ................................................................................................................. 20
Aritmetik Operatrler ........................................................................................................... 20
Mantksal ifadeler ................................................................................................................. 21
Karlatrma leleri ve Mantksal Operatrler ................................................................. 21
Karlatrma ileleri ....................................................................................................... 21
Mantksal Operatrler ...................................................................................................... 22
Tr Dnmleri .................................................................................................................. 23
Artrma ve Eksiltme operatrleri.......................................................................................... 24
Mantksal Bit operatrleri .................................................................................................... 25
Deer Atama ifadeleri .......................................................................................................... 25
Koullu fadeler .................................................................................................................... 25
Giri k lemleri ................................................................................................................. 26
Standart Ktphaneye Eriim............................................................................................... 26
Standart Giri, Standart k ve Hata k noktalar ......................................................... 26
Standart Giri k Fonksiyonlar ....................................................................................... 27
Biimlendirilmi klar ..................................................................................................... 29
Biimlendirilmi Giriler...................................................................................................... 30
Bellek Biim dnm fonksiyonlar ................................................................................... 31
Karakter dizesinin Okunup-Yazlmas ................................................................................. 32
nemli bir takm fonksiyonlar ............................................................................................. 32
Karakter Snama ve dntrme fonksiyonlar ................................................................ 32
ungetc ............................................................................................................................... 33
Program Ak ve Program Ak Denetimi .............................................................................. 34
Komutlar ve Bloklar ............................................................................................................. 34
If-Else komutu ...................................................................................................................... 34
Else if komutu ................................................................................................................... 36
8/13.02.2012 16:19:00
8/13.02.2012 16:19:00
8/13.02.2012 16:19:00
nsz
Bu ders notlarnn yazlmasnda Brian W Kernighan ve Dennis Ritchie isimli
yazarlarn The C Programming Language isimli kitabndan
faydalanlmtr. Bu kitab nn niversitesi Ktphanesinde bulabilmeniz
mmkndr. Bu ders notlar hem ierik olarak hem de takip ettii
mfredat olarak yukarda bahsi geen kitab rnek olarak almtr.
8/13.02.2012 16:19:00
Program Nedir?
Program, gnlk hayatta bir sorunu bilgisayar ile zmek ve rutin ilemleri
kolaylatrmak iin yazlan yazlmlardr. Bir program bilgisayar zerinde
alr ve insanlarn gnlk hayatlarn kolaylatrr.
Kiinin program yazmas iin ncelikle Genel Programlama Bilgisine sahip
olmas gerekir. Peinden bir Programlama Dili bilmek gereklidir. Burada
nemli olan programlama bilgisidir. Bu konuda kendinizi iyi
hissedebiliyorsanz herhangi bir programlama dili ile programlarnz
yazabilirsiniz. Dil tercihi yazlacak programa, soruna ve platforma uygun
olarak yaplabilir.
8/13.02.2012 16:19:00
8/13.02.2012 16:19:00
8/13.02.2012 16:19:00
8/13.02.2012 16:19:00
8/13.02.2012 16:19:00
10
8/13.02.2012 16:19:00
11
Balarken
Bir Programlama dilini renmenin en iyi ve en kolay yolu o dilde
programlar yazmaktr. Birok programlama dilinde genellikle kullanlan u
program yazalm. Ekrana Merhaba yazan bir programdan bahsediyoruz.
Bu birok programlama dilinde temel olarak ele alnan en basit konudur.
nemli olanlardan biri bu program yazabilmek, baarl bir ekilde
derleyebilmek, altrabilmek ve elde edilen sonular grebilmektir.
#include <stdio.h>
main(){
printf(Merhaba Dnya\n);
}
Bu program nasl derleyip altracanz kullandnz iletim sistemi ve
derleyiciye baldr. Bir nceki konuda bunun hakknda yeterli bilgi verdik.
Dier sistemlerde bu ilem farkllklar gsterebilecektir. Yukardaki
program yazarak derleyiniz ve altrmaya alnz.
Program hakknda yaplacak bir takm aklamalar unlar olabilir. Bir C
program boyutu ne olursa olsun bir ya da daha fazla fonksiyon denilen
bloktan oluur. Bu fonksiyonlarn her biri gerek ilemlerin yapld
yerlerdir. Bu rnekte main byle bir fonksiyondur. Normal olarak
fonksiyonlarnza istediiniz ad verme zgrlne sahipsiniz. Ancak main
zel bir isimdir. C programnz bu fonksiyonun balad yerden itibaren
icra edilmeye balanr. Bu ayn zamanda her programn bir main
fonksiyonunun olmas gerektii anlamna gelir. Genellikle bu fonksiyon
dier fonksiyonlar ararak, C komutlarn icra ederek veya hazr dier
fonksiyonlar ararak yapmas gereken ilemleri yapar.
Fonksiyonlar arasnda haberleme ve deerlerin transferi parametreargmanlar maharetiyle gerekleir. Fonksiyon adndaki parantezler
8/13.02.2012 16:19:00
12
8/13.02.2012 16:19:00
13
8/13.02.2012 16:19:00
14
8/13.02.2012 16:19:00
15
8/13.02.2012 16:19:00
16
Sabitler
Bir Program ierisinde kullanlan tm alfabetik ve saysal deerler sabit
olarak adlandrlr. Bu adan sabitler saysal ve alfabetik sabitler olarak
ikiye ayrlr.
SABTLER
SAYISAL SABTLER
TAM SAYILAR
KESRL SAYILAR
8
12.45
12
3.345e+03
12564 gibi
72.0 gibi
ALFASAYISAL SABTLER
"Ekonometri Blm"
"nn niversitesi"
"4.56" Gibi
8/13.02.2012 16:19:00
17
Deiken Trleri
C'de Temel olarak alfa saysal ve saysal deiken trleri bulunmaktadr.
Aslnda yukardakine benzer bir tablodan bahsetmek mmkn. Ancak
saysal deiken trleri sayca daha fazladr.
C'de Bir deiken Tanmlamak iin Genel olarak u biim kullanlr:
Tr_ad Deiken_ad1 [,Deiken_ad2[...]];
Burada Tr_ad ile verilen bilgi C Deiken trlerinden biridir. Deiken ad
ise sizce isimlendirilecek olan ihtiyacnza cevap verecek bir veya daha
fazla deikendir. Deikenler birden fazla olacak ise virgl ile
ayrlmaldrlar. Sonuna noktal virgl konulmas zorunludur.
8/13.02.2012 16:19:00
18
Saysal Deikenler
Tr Ad
int
Unsigned int
long int
Unsigned long int
Float
Double
long double
Tanm ve Aklama
Tamsay deiken tanmlama iin kullanlr.
aretsiz yani Pozitif Tamsay deiken tanmlama iin kullanlr.
Uzun Tamsay (Yani daha byk tam saylar) deiken tanmlama iin
kullanlr.
aretsiz uzun Tamsay deiken tanmlama iin kullanlr.
Kesirli deiken tanmlama iin kullanlr.
Kesirli ift duyarlkl deiken tanmlama iin kullanlr.
Kesirli ift duyarlkl uzun deiken tanmlama iin kullanlr.
Tanmlamalar
Kullanlmadan nce tm deikenler tanmlanmaldr. Hatta baz deiken
tanmlar sadece kullanldklar fonksiyon iinde yer verilebilir. Bir tanm bir
tr bilgisi ve yannda bu trden olacak deiken listelerinden oluur.
rnein:
int alt, ust, adim;
char c, ad[25];
Deikenler muhtelif tanm satrlar ierisinde datlm olabilirler. Yani
yukardaki tanm u ekilde yazlm olabilirdi:
int alt;
int ust;
int adim;
char c;
char ad[25];
Bu gsterim programnzn kaynak kodlarnda daha fazla yer igal
edecektir. Ancak her deikene aklama satrlar koymak vb.
dzeltmelerin kolay yaplmasn salamak amacyla uygun bir gsterim
olabilir.
8/13.02.2012 16:19:00
19
Aritmetik fadeler
Matematiksel ilemler yapabilen deimlerdir. ounlukla bir deer
aktarma ve deer ileme blmlerinden oluur. lenen deerler bir
aktarma deimi ile (ounlukla =) baka bir deikene aktarlr. Ancak
bazen bu bulunan deer dorudan ekrana yazdrlabilir veya baka bir
noktaya ynlendirilebilir.
rnein k=5*l+2 ifadesi bir deer aktarma deimidir ve bir aritmetik
ifadedir.
Ancak Tek bana l*25/100 ifadesi de bir aritmetik ifadedir. Bir aritmetik
ifade ierisinde saysal deikenler, saysal sabitler ve aritmetik
operatrler yer alr.
Aritmetik Operatrler
C dili aritmetik operatrler yn ile ok zengin bir dildir. lemleri
kolaylatran bir ok ifadeyle karlamak mmkndr. kili (Binary)
operatrler +,-, /, * ve % operatrleridir. Tekil (Unary) operatrler ise ve + olarak karmza kmaktadr. Tamsay blme yapldnda elde edilen
sonucu tamdr. Kesirler kesilip atlr. X % Y ilemi Xin Yye blmnden
kalan bulur. rnein artk yl 4e tam blnebilen, fakat 100e tam
blnemeyen ancak 400e tam blnebilen yllardr.
8/13.02.2012 16:19:00
20
Mantksal ifadeler
Sonucunda doru ya da yanl deer retilen ifadelere mantksal ifade
denir. Ancak C dili asndan zellikle doru ya da yanl diye bir kavram
bulunmaz. Onun yerine 0 ve 0'dan farkl deerler sz konusudur. Bu
bakmdan 0 deeri yanl olarak alglanmaldr. Dier deerler doru
olarak alglanmaldr.
Bu sebeple bir C Mantksal ifadesi aslnda herhangi bir saysal deer'dir ve
illa karlatrma operatrleri veya mantksal operatrlerle ifade edilmi
olmak zorunda deildir. C dilinin bu zelliini bir ok program parasn
incelediinizde grmeniz mmkndr.
if (1)
printf("Merhaba\n");
else
printf("Yanl\n");
ifadesinde ekrana her halkarda Merhaba yazlacaktr. nk 1 deeri
mantksal doru deerini de tamaktadr.
8/13.02.2012 16:19:00
rnek
21
>
<
>=
<=
==
!=
k>123
k<123
k>=123
k<=123
k==123
k!=123
Mantksal Operatrler
Mantksal Operatrler birden fazla mantksal ifadeyi biri birine balamak
iin kullanlabilecek mantksal deimlerdir. Bu deimler ve, veya, deil
ilemlerine karlk gelen ifadelerdir.
Op. Aklama
rnek
ve operatr. ki Mantksal ifadenin de doru olmasn gerektiren
operatrdr. Yani iki farkl mantksal ifade ayn anda doru deil
ise elde edilecek sonu yanl olmaktadr.
P
Q
P && Q
&&
(k>123) && (k<321)
1
1
1
1
0
0
0
1
0
0
0
0
veya Operatr ki Mantksal ifadeden sadece birinin doru
olmasn gerektiren operatrdr. Yani iki farkl mantksal ifadeden
en az biri doru ise elde edilecek sonu doru aksi halde sonu
yanl olmaktadr.
P
Q
P || Q
||
(k>123) || (k<321)
1
1
1
1
0
1
0
1
1
0
0
0
deil operatr. Bir mantksal ifadenin mantksal deilini elde
!
eden operatrdr. ! (k>=123) eklinde kullanlr ve k<123
! (k>=123)
ifadesine edeerdir.
8/13.02.2012 16:19:00
22
Tr Dnmleri
Eer bir ilemde ilenen deerlerin trleri farkl ise genel bir ortak tre
dntrlr ve yle ilem yaplrlar. Bu dnmde u kurallar uygulanr.
Genelde otomatik olarak yaplan tek dnm ilemi tamsay deerin
kesirli deere dntrlmesidir. rnein f + i ilemi srasnda i kesirli
sayya evrilir. Ancak bunun yan sra bir kesirli deiken/deer dizilerde
indis deeri olarak kullanlrsa otomatik dnm gereklemez.
ncelikli olarak; char ve int trleri rahatlkla biri biri iinde aritmetik
ifadelerde kullanlabilirler. Her char otomatik olarak bir int deerine
dntrlr. Bu bir takm karakter ilemlerinde inanlmaz kolaylklar
salar. Ayrca karakter dizilerini integer deere eviren atoi fonksiyonu
tanmlanmtr. Karakterler zerinde aritmetik ilem yapan bir rnek
byk harfi kk harfe evirmek ya da tersi ilemidir.
char ch;
if (ch>=a && ch<=z)
ch-=32;
ifadesi ch iindeki harfi kk harf ise byk harfe dntrr.
Altrma 2
8/13.02.2012 16:19:00
23
8/13.02.2012 16:19:00
24
Koullu fadeler
if (a>b)
z=a;
else
z=b;
ifadesi a veya b deerlerinden byk olann deerini bulan ifadedir. Bu
ilemin karl olarak u ekilde bir ifade ile yazmak mmkn olmaktadr.
z=(a>b) ? a : b;
bu ifadenin genel gsterimi u ekildedir:
(KOUL) ? ifade2 : ifade3
Bu gsterimde ncelikle KOUL mantksal ifadesi hesaplanr. Eer
mantksal olarak doru ise veya 0dan farkl bir deer hesaplanrsa ifade2
ile gsterilen ilemler; deilse de ifade3 ile gsterilen ilemler yaplr.
8/13.02.2012 16:19:00
25
Giri k lemleri
Giri k Komutlar bir Programlama dili iin olduka nemlidir. nk
oluan ktlarn kullanc veya programcya ulamas gerektii gibi
kullancnn da Programa veri vermesi gerekebilir. Ancak gerekte
giri/k imknlar C dilinin bir paras deillerdir. C Programlama dilinde
Giri k ilemleri gerekte komutlar ile deil stdio.h ktphanesinde
bulunan fonksiyonlar ile gerekletirilir. Bu blmde standart G/
ktphanesinde yer alan ve C programlarnda kullanlan fonksiyonlardan
bahsedeceiz. Fonksiyonlar G/ ilemlerini kolaylkla yapabilecek
tanmlara sahipler. Uygulamann ne kadar kritik olmasna bakmakszn tm
programclar bu rutinleri rahatlkla ve etkin bir ekilde kullanabilirler. Ve
son olarak bu fonksiyonlar tanabilir ekilde tasarlanmlardr. Yani
herhangi bir programc yazd C programn C derleyicisinin bulunduu
herhangi bir iletim sistemi platformuna tayabilir.
Bu blmde G/ ktphanesi iinde yer alan tm fonksiyonlar
anlatamayacaz. Bizim iin daha nemlisi youn kullanlan fonksiyonlarla
tanmak ve bir C programnn iletim sistemi evre ortamyla etkileimini
salayacak kurallardan bahsetmektir.
8/13.02.2012 16:19:00
26
8/13.02.2012 16:19:00
27
char c;
...
c=getchar();
Biiminde gsterilebilecek ekilde yazlan komutumuz standart giri
biriminden bir karakter okur. Yada
char c;
...
c=getc(stdin); eklinde kullanldn grebilirsiniz.
char c;
...
/* Tek karakter yazar */
putc(c,stdout);
putchar(c); eklinde yazlr ve c ile ifade edilen tek karakteri standart
k biriminden yazar.
rnek 1
Aadaki Program Klavyeden girilen harfleri ekrana szerek yazmaktadr.
yle ki klavyeden girilen harflerden a harfini ekrana yazmamaktadr ve
bu ilemi enter tuuna baslncaya kadar devam ettirmektedir.
#include <stdio.h>
main(){
char c;
while((c=getchar())!='\n')
if (c!='a') putchar(c);
printf("\n");
}
Bir ok program tek bir giri kaynandan okur ve tek bir k noktasna
bu bilgileri yazar. Bu amala da getchar, putchar veya printf gibi G/
fonksiyonlar kullanlr.
rnek 2
Aadaki rnek klavyeden girilen karakterleri kk harfe evirerek
ekrana yazan bir programdr.
#include <stdio.h>
main(){
int c;
while((c=getchar()) != EOF)
8/13.02.2012 16:19:00
28
Biimlendirilmi klar
stenilen deerlerin uygun ekilde ve uygun yerlerde grnebilmesi iin
Biimlendirilmi k Komutu kullanlabilir.
printf("Biim Tanmlar ve Sabit
ifadeler"[,Deiken1[,Deiken2...]])
eklinde kullanlan komut bu ama iin son derece uygundur. Bu
Fonksiyon Sabit ifadelerin ve deikenlerin belirlenmi biim tanmlarna
gre ekrana yazlmasn salar. Biim tanmlar ve Sabit ifade dediim
karakter dizisinde iki farkl trde bilgi bulunur. Bunlar normal karakterler
ile ifade edilen ifadeler ve c iin bir anlam tayan dnm ifadeleri. Bu
dnm ifadeleri istenilen bir deikenin parametre olarak yazlm ise
istenilen bir biimde ekrana yazlmasn salar.
printf("Merhaba %s u anda Hava %d scaklnda\n", ad, hava);
Bu deyim Merhaba Ahmet u anda Hava 23 scaklnda gibi bir
ifadeyi ekrana yazacaktr. Bu satrda yer alan ve % ile balayp bir
dntrme karakteri ile biten ifade dnm yapan biim tanmdr. %
iareti ile dntrme karakteri arasnda yer alan blmde u karakterler
bulunabilir:
Tanm
8/13.02.2012 16:19:00
29
yazar.
x
\t
TAB Karakteri
\\
\ Karakteri
\"
Biimlendirilmi Giriler
stenilen Deer ve ifadelerin bilgisayara girilmesini salar. Kullanm olarak
printf ile ayn artlar salar. Ve bilgisayara giri yn ile alr.
scanf("Biim Tanmlar"[,Deiken1[,Deiken2...]])
eklinde kullanlr. scanf standart giri biriminden karakterleri okur ve
verdiiniz biim tanmlarna gre okunan karakterleri yorumlar ve
deerleri ilgili deikenlere yerletirir. Ancak dikkat edilmelidir ki Deiken
olarak ifade edilen deikenlerin adresleri bu fonksiyona gnderilmelidir.
Burada deikenleri her biri biim tanmlar ile belirlenen tanmlara birebir
rtmek zorundadr. printf'de grlen tm biim tanmlayclar scanf iin
de geerlidir. Deikenler ise adresleri ile verilmelidir. Eer deiken basit
deiken ise bu adres deeri "&" operatr ile bulunmaldr. Eer deiken
karakter dizesi gibi bir deiken ise sadece deiken adn vermek yeterli
olacaktr.
8/13.02.2012 16:19:00
30
rnek 3
Bu Program klavyeden farkl zelliklere sahip deerler okuyup farkl
zellikler ile ekrana yazmaktadr.
#include <stdio.h>
#include <string.h>
main(){
char ifade[100];
int k,uzunluk;
float kesir;
char cevap;
printf("Ad, Scaklk, d1, kesir, cevap deerlerini
giriniz?\n");
scanf("%s %d %d %f %c", ifade, &k, &uzunluk, &kesir, &cevap));
/* Bu komut aralarnda boluk olmak zere bir dizi deeri
karlk deikenlere aktaracaktr.*/
printf("Sonu\n%s\n%d\n%d\n%f\n%c", ifade, &k, &uzunluk,
&kesir, &cevap));
}
Altrma 4
int k;
char ad[20];
scanf(....,&k,ad);
eklinde yazlm bir ifade de .... ile belirlenmi yere ne
konmaldr.
Altrma 5
Klavyeden girilecek iki tam say ve bir kesirli say iin yazlmas gerekecek
scanf fonksiyonunun parametreleri nelerdir?
8/13.02.2012 16:19:00
31
8/13.02.2012 16:19:00
32
ungetc
standart giri ortamndan veya herhangi bir dosyadan okunmu karakteri
geri o ortama yazan fonksiyondur.
ungetc(c, dosyaisaretcisi);
8/13.02.2012 16:19:00
33
Program Ak ve Program Ak
Denetimi
C Programlarnda Program satrlar dier programlama dillerinde olduu
gibi yukardan aaya icra edilirler. Her komut sonunda ; (noktal virgl)
karakteri bulunur. Blok yapl bir dildir ve bu balamda deikenler
tanmlandklar blok ierisinde etkilidirler. Birden fazla komutlar {...}
simgeleri arasnda ele alnarak ek bir komutmu gibi bloklanabilir. Belki
daha nce tantnz komutlar burada daha ayrntl bir ekilde
incelemeye alacaz.
Komutlar ve Bloklar
C Dilinde Noktal virgl komut sonlandrma belirtecidir.
x=0;
i++;
printf(.....);
yukardaki her bir ; komutun bittiini ve dier komuta geildiini
sembolize eder. Komutlar bloklamak iin {...} kme parantezleri
kullanlmaktadr. Bu parantezler arasnda yazlan komutlar ka tane olursa
olsun tek bir komutmu gibi alglanr. if, else, for, while gibi komutlarn
hemen peinden ; kullanlmaz. Ayrca bir blou bitiren } iaretinin
peinden de noktal virgl konulmaz. Bu da zmlemede istenilen
ksmlarn kapal bir kutu imi gibi gsterilmesini salar.
If-Else komutu
Karar vermeyi salayan Komut'tur. Temel Yaps
if (mantksal_ifade)
Komut-1;
else
Komut-2;
Bu yapda else ksm seimliktir. Yani kullanlmasa da olur. Komutun
almas u ekilde izah edilebilir:
8/13.02.2012 16:19:00
34
8/13.02.2012 16:19:00
35
Else if komutu
Temel yaps u ekildedir.
if (koul)
komut;
else if (koul)
komut;
else if (koul)
komut;
else
komut;
Bu ekilde oklu seim eklinde bir dizi if deimi arasndan bir tanesi
seilecektir. Koullar sra ile kontrol edilir, koullardan ilk doru olann
iliiindeki komut icra edilir. Bu doru koulun bulunup altrlmasndan
sonra tm bloun almasn bitirir. Her bir komut ile ifade edilen blm
tek bana bir komut olabilecei gibi kme parantezleri arasndaki bir ok
komut ta olabilir.
8/13.02.2012 16:19:00
36
8/13.02.2012 16:19:00
37
3654 / 1365
1365 / 924
924 / 441
441 / 42
42 / 21
Kalan
Kalan
Kalan
Kalan
Kalan
924
441
42
21
0
switch komutu
Switch Komutu birden fazla deerden seim yapmak iin kullanlabilecek
zel karar verme komutudur. ie fazla sayda if..else komutunu
kullanmay gerektiren durumlarda kullanlabilecek etkili bir karar verme
aracdr.
switch(ifade){
case sabit_deer1:
case sabit_deer2:
case sabit_deer3:
case sabit_deer4:
case sabit_deer5:
......
case sabit_deerN:
default: [Komut;]
}
[Komut1;]
[Komut2;]
[Komut3;]
[Komut4;]
[Komut5;]
[KomutN;]
rnek 6
Aadaki program bir ifade iindeki rakamlar, boluklar ve dier
karakterleri sayan bir programdr.
#include <stdio.h>
int c,i,nwhite,nother,ndigit[10];
main(){
nwhite = nother = 0;
for (i=0; i<10;i++)
ndigit[i]=0;
while ((c=getc(stdin)) != EOF )
switch ( c ){
case 0 :
case 1 :
case 2 :
8/13.02.2012 16:19:00
38
case
case
case
case
case
case
case
3
4
5
6
7
8
9
:
:
:
:
:
:
:
ndigit[c-0]++;
break
case :
case \n:
case \t :
nwhite++;
break;
default :
nother++;
break;
}
printf(digits = );
for (i=0;i<10;i++)
printf( %d,ndigit[i]);
printf(\nwhite space = %d, other =
%d\n,nwhite,nother);
}
Bu komut ifade ile belirtilen tamsay ifadeyi hesaplar. Yukardaki rnek bu
c karakteridir. Sonrasnda bu hesaplanan deer case ile belirtilmi olan
deerlerden birine eit mi diye kontrol eder. Eer eit olan bir case
ifadesine rastlarsa onun karsndaki ve dier altndaki komutlar icra eder.
Eer burada belli bir ksm komutlarn uygulanmas bir ksmnn
uygulanmamas isteniyorsa switch deiminden break komutuyla klr.
Eer bu case deerlerinden hibiri eldeki deere eit deilse default ile
gsterilen komut uygulanr.
Her case deiminin yannda bir komut bulunmak zorunda olmad gibi
birden fazla komutu {...} ifadeleri arasna yazmadan da kullanabilirsiniz.
Ancak bu durumda komutlarn uygulamasnn bitmesini istediiniz yere
break komutunu koymay unutmamanz gerekecek.
break komutu switch bloundan hemen kmanz salayan bir komuttur.
Her bir case etiket gibi davrand iin biri karsndaki ilem
gerekletirildikten sonra dierlerinden devam eder. Devam edilmemesini
salamak amacyla break veya return deimleri ile buradan klmas
gerekir. Daha sonra greceimiz zere break komutu while, for, do
dnglerinden de klmasn salar.
Bu case deimlerinden devam edip gidilmesi kargaaya yol aacak gibi
grnse de bazen olumlu sonular olabilir. yle ki birden fazla eylemi tek
8/13.02.2012 16:19:00
39
8/13.02.2012 16:19:00
40
int n;
main(){
printf(n deerini klavyeden giriniz);
scanf(%d,&n);
a=1;
b=1;
printf(%d\n%d\n,a,b);
c=a+b;
while(c<=n){
printf(%d\n,c);
a=b;
b=c;
c=a+b;
}
}
Altrma 11
Sfr 0 girilinceye kadar klavyeden girilen tm deerlerin ortalamasn
bulup ekrana yazan C programn gelitiriniz.
Altrma 12
t=0;
while(t<10){
printf(%d\n,t);
t++;
} eklindeki bir ifadeyi for komutu ile yazmaya alnz.
8/13.02.2012 16:19:00
41
ifade1;
while(ifade2){
komut1;
komut2;
ifade3;
}
Teknik olarak ifade olarak tanmlanm ifadelerden ifade1 ve ifade3
aritmetik ifadeleri anlatr. fade2 ise mantksal bir karlatrma ifadesidir.
Bu ifadeden her hangi biri yazlmadan pas geilebilir. Ancak bu
durumda bile noktal virgller yerlerinde kalmaldr.eer ifade1 ve ifade3
yazlmazsa ve hatta ifade2 for komutu iine yerletirilmezse ortaya kan
komut dorudur. yle ki
for(;;){
...
}
eklinde yazlan komut bir sonsuz dngy anlatr. Bu tr bir dngden
break veya return gibi bir komutla klaca kabul edilir.
Burada deiken ile belirtilen ilk ksm tek bir deer aktarma ifadesi yerine
virgllerle ayrlmak sureti ile birden fazla deer aktarma ifadesini
barndrabilir. Bu ksm bir ilk deer aktarma ifadesi olup dng
uygulanmaya balamadan nce icra edilir.
kinci ksmda kullanlan koul dngnn sonlanma kouludur. Bu koul
doru olduu srece dng yinelenir.
Son Ksmda kullanlan deer aktarma deimleri aralarnda virgl
bulunmak koulu ile birden fazla olabilir. Bu ksm ise dng iindeki
komutlarn her uygulanmasndan sonra icra edilen ilemlerdir. ounlukla
deer artran ifadelerdir.
for(x=0;x<10;x++){
printf("Sradaki Say %d\n",x);
}
rnei Sfrdan 9'a kadar saylar ekrana alt alta yazan bir program
paasdr.
Acaba nerede while nerede for komutlarn kullanmalym? Eer
deikenlere ilk deer atama ifadeleri yok ise ve dngnn ka defa
uygulanaca hakknda saysal net bir tanm sylenemiyorsa kullanc
davranlarna bal bir koul ile ifade edilebiliyorsa while komutu uygun
bir komuttur. Eer ilk deer atama ifadeleri var ve dngnn almas
konusunda saysal bir takm deerler ifade ediliyorsa for komutu daha
uygun bir komuttur. nk for komutu gerek ilk deer atamalarn
8/13.02.2012 16:19:00
42
gerekse de koulu ilk satr zerinde gsterdii iin daha kolay anlalr ve
derli toplu olarak karmzda duruyor. Bu da dng komutumuzun
merkezilemesini ve programn kontrolnn kolaylamasn salar.
rnek 8
Bu rnekte klavyeden girilen bir N deerinin faktryeli for komutu
kullanlarak hesaplanmtr.
#include<stdio.h>
int f,n,x;
main(){
printf(n deerini giriniz);
scanf(%d,&n);
for(f=1,x=1;x<=n;x++) f*=x;
printf(Faktryel=%d\n,f);
}
Bu rnekte aslnda faktryeli hesaplayan kesim sadece for komutunun
yazl olduu satrdr.
rnek 9
Klavyeden girilecek X deerinde N deerine kadar tm doal saylar
ekrana listeleyen C Programn gelitiriniz.
#include<stdio.h>
int x,n,k;
main(){
printf(X deerini giriniz);
scanf(%d,&x);
printf(N deerini giriniz);
scanf(%d,&n);
for(k=x;k<=n;k++) printf(%d\n,k);
}
Altrma 13
Altrma 6 rneini goto komutu kullanmadan while veya for ile yeniden
yaznz
Altrma 14
Altrma 7 rneini goto komutu kullanmadan while veya for ile yeniden
yaznz
Altrma 15
8/13.02.2012 16:19:00
43
F(x)=
x
x =1
2! 4! 6!
girilecek bir x deerine gre ilk 10 terim iin sonucu hesaplayp ekrana
yazacak C programn gelitiriniz. s alma ilemi iin math.h
ktphanesindeki pow fonksiyonunu kullannz.
Cos(x)= 1
8/13.02.2012 16:19:00
44
do
{
komut1;
komut2;
.......
}
while (koul);
ncelikli olarak komutlar icra edilir sonra koul snanr. Doru ise komutlar
tekrar uygulanr yani aslnda dng komutlar tekrar icra edilir. Eer ifade
yanl olmusa dng son bulur.
Tahmin edebileceiniz gibi do komutu for ve while komutuna gre olduka
az kullanlan bir komuttur. Ancak tabi ki baz durumlarda olduka etkili bir
dng komutudur.
rnek 10
Aadaki rnei inceleyelim. Bu rnekte kullanc klavyeden 0 ile 100
arasnda bir say girmeye zorlanyor. While ile yazlm olan koul inceleme
satrna dikkat ediniz. Eer x<0 veya x>100 ise dng iindeki komut
tekrar ediliyor. nk bu istemediimiz bir durum. Asl istenen kullancnn
geerli bir vize notu girebilmesidir.
#include <stdio.h>
int x;
main(){
do {
printf(0 ile 100 arasndaki vize notunu giriniz);
scanf(%d, &x);
}while(x<0 || x>100);
}
yukardaki do...while blou klavyeden girilecek deerin 0...100 aralnda
olmasn zorlar. Ve bu aralkta deilse tekrar deer girilmesini salar.
8/13.02.2012 16:19:00
45
8/13.02.2012 16:19:00
46
8/13.02.2012 16:19:00
47
#include Tanmlar
Programda kullanlacak harici ya da nceden tanmlanm fonksiyonlarn
bulunduu ktphanenin tanmland ifadelerdir.
Bu cins ktphane stdio.h, string.h, conio.h time.h vb. Ktphaneler olup
bu ktphanelerin herbiri bir ilem grubu belirleyen fonksiyonlarn bir
arada bulunduu dosyalardr.
Bu ktphaneler, nceden tanmlanm ktphaneler (Programlama dili
gelitiricileri tarafndan) olabilecei gibi, sizin oluturduunuz bir
ktphaneler de olabilir.
#define Tanmlar
Bir Program ierisinde kullanmak isteyebileceiniz sabit ifadeleri
tanmlamak iin kullanlan szcktr. Hemen ilk ksmda yer alr.
Dier blmler
Tm program ierisinde kullanlacak deikenler main bloundan nce
tanmlanmaldr. Bu ekilde tanmladnz deikenler Global olurlar ve
tm program ierisinde tanml hale gelirler.
Daha sonra fonksiyonlar tanmlanr. Bu fonksiyonlarn tanmlanmas bir
sonraki blmde ele alnmtr.
Ana Program blounu tanmlanmas ve kodlarnn yazlmas ile program
tamamlanm olur. aslnda main() diye adlandrlan bu blok normal bir
fonksiyon tanmnda olduu gibi tanmlanr. Ancak ad zeldir ve
8/13.02.2012 16:19:00
48
Temeller
Program birbirinden bamsz bir ksm fonksiyon tanmlarndan oluur.
Fonksiyonlar arasnda haberleme, parametreler ve fonksiyonlarn
dndrd deerler ile gerekleir. Bazen de bu deer transferi harici
deikenler ile gerekleir.
Fonksiyonlar kaynak kodda herhangi bir srada yazlabilir. Hatta kaynak
kod birden fazla dosyaya blnebilir. nemli olan fonksiyonlarn
blnmemesidir.
Return deimi fonksiyondan deer dndrmeyi salayan ve arld yere
deeri dndren deimdir. Return deimini herhangi bir ifade izleyebilir.
return (ifade);
aran fonksiyon dnen deeri dikkate almama hususunda serbesttir.
Fonksiyonda return yanna deer yazmak da zorunlu deildir bu durumda
aran fonksiyona deer dndrlmez.
Fonksiyon, arld noktaya deer ya da hizmet dndren program
paras olarak tanmlanabilir. Kullanm amac bir ilemin ok sk tekrar
edilmesinden dolay paketlenmesini salamak ve kullanm annda sadece
bu paketin adn kullanmaktr. Bu yntem ile ayn ii yapan bir program
paras ok defa yazlacana bir defa yazlp ok yerde kullanma
sunulmu olur.
Bu yntemle yapsal programlar gelitirebilirsiniz. C dili ile en pratik
program yazmann yolu fonksiyonlardan geer. zellikle ok youn ve
karmak programlarn yazlmasnda hem yazm kolaylatrmak hem de
anlalrl arttrmak iin fonksiyon kullanm son derece idealdir. Ayrca
sorunlar zmlerken fonksiyonel kavramlarla zmlemek sorunun kolay
zmlenebilmesine neden olacaktr.
Bir Fonksiyon tanm genel olarak aadaki yapya sahiptir.
[fonksiyonun tr] fonksiyonun_adi([P1[,P2..]])
[deiskentr P1;
degiskentr P2;
................]
{
8/13.02.2012 16:19:00
49
50
Altrma 23
Kendisine gnderilen bir tamsay dizisini sralayarak arana geri
dndren fonksiyonu C dili ile gelitiriniz.
Genel Deikenler
C Program bir grup harici nesneden oluur. Bunlar bazen deikenler
bazen de fonksiyonlardr. Bir fonksiyonun iinde tanmlanan deikenler
yerel deiken olarak adlandrlrlar. Baz durumlarda bunlara dahili
deiken de denebilir. Fonksiyonlarn dnda tanmlanan deikenler
Genel deikenler olup bazen de harici deiken olarak adlandrlrlar.
Genel deikenler tm fonksiyonlar tarafndan eriilebilir olduundan
fonksiyon parametrelerine ve deer dndrme mekanizmasna alternatif
olarak kullanlabilir. Bir fonksiyon genellikle genel olarak tanmlanm
herhangi bir deikene adn anmak suretiyle eriebilir.
Eer fonksiyonlar arasnda ortak kullanlacak deikenler ok ise uzun
parametre listeleri yerine genel deiken tanmlamalar daha etkili
olacaktr. Ancak bu da fonksiyonun portatifliini ve program yaps
konusunda dankl belirtecektir. Bu ekilde fonksiyonlar arasnda bir
ok veri ba bulunacaktr.
Genel deikenlerin kullanlmasnn temel nedenlerinden biri de deiken
deerlerinin sfrlanmasn salamaktr.
Genel olarak tanmlanm bir deiken tm dier fonksiyonlarda tanml
olaca gibi programn almasnn bittii ana kadarda bellekte tutulurlar.
Halbuki bir fonksiyonun iinde tanmlanm yerel deikeniniz ise
fonksiyona girdiinizde bellee alnr ve fonksiyondan kncaya kadar
8/13.02.2012 16:19:00
51
extern deikenler
Eer bir program birden fazla dosya zerinde tanmlanmsa ve baz
deikenler tm dosyalarda kullanlabilmek ve eriilebilmek istiyorlarsa bu
deikenler extern olarak tanmlanrlar. rnein main fonksiyonunun
olduu bir program blounda genel deikenler dzeyinde
int kalem; eklinde bir tanm yapm olsanz ve dier bir program
dosyasndan bu deikeni kullanmak isteseniz o dosyada u ekilde
tanmlamanz gerekecektir.
extern int kalem;
bu ekilde bu deikenin bu dosya iinde deil dier bir dosya iinde
tanmlanm olduunu ve bir iliki iinde olduunu grebilirsiniz.
static deikenler
static tanm extern gibi bir deikeninize zel bir sfat katan deimdir.
Static deikenler genel tanmlanabildikleri gibi yerel de tanmlanabilirler.
Yerel olarak tanmlanan bir static deiken sadece o fonksiyon iinde
kullanlabilir ve dier fonksiyonlarda tannmaz ancak dier yerel
deikenlerden farkl olarak deiken fonksiyon bitiminde bellekten
atlmaz. Hatta ierisindeki deer dahi statik olarak korunur. Fonksiyonun
sonraki tekrar arlmasnda iindeki deer kullanlr. Bu da u anlama
gelir: yerel static bir deiken zel ama kalc bellek sahalar oluturur.
Bu ekilde tanmlanmak istenen bir deiken iin nne static ifadesini
koyanz yeterli olacaktr.
static int k;
static char buf[128] gibi.
register deikenler
register tanm ile verilen bir deiken program tarafndan ska
kullanlacaktr anlamna gelir. Eer mmkn olursa bu deikenler
bilgisayarn yazmalarna (register) yerletirilir. Bu sayede bu programlar
hem hzl hem de daha kk olurlar. Register tanm ile yaplan bir
deiken tanmlama satr u ekildedir:
register int x;
8/13.02.2012 16:19:00
52
Blok Yaps
C Pascal, PL/I ve algolde olduu gibi i ie bloklarn tanmlanabildii
yapda bir dil deildir. C dilinde tm fonksiyonlar ayn dzeyde
tanmlanrlar ve i ie olamazlar. Ancak bu tarz bir tanm deikenler iin
sz konusudur. Yani deikenler i ie bloklarda tanmlanabilirler. Ve bu
bloklar kme parantezi ile belirlenir. Eer bir blok iinde tanmlanan bir
deiken var ise o deiken o bloun sonuna kadar geerlidir. Bir deiken
bir blok iinde tanmlanm ise ve bir st blokta da tanml ise alttaki bloa
girildiinde yeni tanm geerli olur dier tanm bu blok bitinceye kadar
bekletilir.
lk deer atama
Bu blm tanmladnz deikenlere nasl ilk deer atayabileceinizi veya
ilk deer atamazsanz nelerin varsaylacan anlatr.
extern ve static deikenler sizin tarafnzdan ayrca bir tanm yaplmad
ise 0 deeri ile otomatik olarak balarlar. Register ve dier deikenlerde
ilk deer atam ilemi yaplmad ise deikenin deeri rast gele bir deer
olur.
Basit deikenlere tanmlandklar anda ilk deer atamas yapabilirsiniz.
Register deikenler ve normal deikenlere ilk deer atanrken sabit olma
zorunluluu bulunmamaktadr. Tanml deerlerle olumu olan herhangi
bir ifade de deer atama iin kullanlabilir.
zyineleme (Recursion)
C fonksiyonlar zyineli olarak kullanlabilirler. Yani bir C fonksiyonu
kendini dorudan ya da dolayl olarak arabilir. En klasik rneklerinden
biri faktriyel hesaplama olarak gsterilebilir. nk faktryel tanm
gerei u ekilde anlatlabilmektedir
rnek 13
8/13.02.2012 16:19:00
53
C dili nilemcisi
C dili dilin zelliklerini geniletmek iin bir takm deimler kullanr. Bunlara
nilemci komutlar denir.
8/13.02.2012 16:19:00
54
8/13.02.2012 16:19:00
55
Diziler
Bazen basit deikenler bir takm sorunlarn zlmesi iin yeterli
olmazlar. rnein iki matrisin toplamn bulabilecek bir program basit
deikenler ile yazlamaz. Ya da bir dizi deer zerinde sralama
yapabilecek program, bir dizi say ierisinde istenilen deeri bulabilecek
program yine basit deikenler ile yazlamaz.
Bu tip programlar iin hatta bir ok benzeri program iin dizi veya matris
tanmlar yapabilmeniz gerekmektedir.
Dizi Nedir?
Ayn zellikte olan ve ayn amala kullanlan bir grup saynn bilgisayar
ortamnda tutulduu veri yapsdr.Kavramsal olarak bir dizi kutuyu
dnerek benzetim yapabilirsiniz.
Genel olarak yle tanmlanr.
degisken_tr ad[eleman says][ikinci_boyut]...;
Bu tanmda deikene bir ad ve tr belirlemesi yapmak gerekecektir.
Tanmlayacanz dizi tek boyutlu ise sadece eleman_says ile belirtilen
tanm yaplacak iki boyutlu bir matris isteniyor ise ikinci_boyut denilen
alan da tanmlamak gerekecektir.
Sonraki Blmde rneklerle bu daha geni anlatlacaktr.
8/13.02.2012 16:19:00
56
8/13.02.2012 16:19:00
57
Dizi sralama
Bir say dizisinin sralanmas salanabilir. Sralanacak saylar dizi zerinde
deil de baka bir deiken zerinde tutuluyor ise ilem karmaklaacak
hatta belki imkansz duruma dnecektir. Ancak bir dizi zerinde dizinin
ne kadar ok deerden olutuu nemli deildir ve sralama ayn sadelikte
yaplacaktr.
rnek 14
Max 100 elemanl bir dizinin elemanlarn ekrandan okuyacak, artan srada
sraladktan sonra tekrar ekrana yazacaktr.
#include <stdio.h>
int temp, dsay, k, l, dizi[100];
main(){
printf("Girilecek eleman saysn Veriniz?\n");
scanf("%d",&dsay);
for(k=0;k<dsay;k++){
printf("%d. sayy 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]);
}
Bu amala deiik sralama algoritmalar bulunabilir.
8/13.02.2012 16:19:00
58
8/13.02.2012 16:19:00
59
8/13.02.2012 16:19:00
60
8/13.02.2012 16:19:00
61
sonu 0, birincisi byk ise sonu pozitif, ikincisi byk ise sonu negatif
olarak dndrlr.
strcat(s1,s2): s1 ile belirtilen karakter dizesinin sonuna s2 ile belirtilen
karakter dizesini ekler. Sonu s1 ile belirtilen dize iinde saklanr.
rnek 18
Klavyeden enter tuuna baslncaya girilen bir ifadenin bir deikende
saklanmasn salayan bir program yaznz.
#include <stdio.h>
char cumle[1024],ch;
int s=0;
main(){
ch=getc(stdin);
while (ch!=\n){
cumle[s]=ch;
s++;
ch=getc(stdin);
}
cumle[s]=\0; // girilen ifadenin sonuna karakter dizesi
sonu iaretini yerletiriyoruz.
}
rnek 19
Klavyeden girilmi bir ifadenin uzunluunu strlen fonksiyonu kullanmadan
bulan program yaznz.
#include <stdio.h>
char cumle[1024];
int s=0;
main(){
gets(cumle);
while (cumle[s]!=\0)s++;
printf(Uzunluk:%d\n,s);
// girilen ifadenin sonuna kadar harfler saylr.karakter
dizesi sonu iaretini bulmaya alyoruz
}
rnek 20
Klavyeden istenilen uzunlukta veya enter tuuna baslncaya kadar
ifadelerin okunmasn salayan program yaznz.
#include <stdio.h>
#define SAY 15
8/13.02.2012 16:19:00
62
char kelime[SAY];
int l;
main(){
l=0;
while((kelime[l]=getc(stdin))!=\n && l<SAY)
l++;
if (l>=SAY) l=SAY-1;
kelime[l]=\0;
}
8/13.02.2012 16:19:00
63
Gstergeler-aretiler
areti herhangi bir deikenin adresini saklayan bir deikendir.
aretiler C programlama dilinde olduka ok kullanlrlar. Bunun nedeni
bazen ok karmak ilemleri kolay hale getirmelerindendir. Bazen de
baka yollarla ok zor yapacanz ilemleri daha kolay ifade etmenizi
saladndandr.
aretiler ve Adresler
Bir iareti bir deikenin adresini saklad iin bir deer dolayl yoldan
erimek mmkndr.xin bir tam say deiken olduunu kabul edelim. px
deikeni ise bu x deikenine iaret eden bir iareti deiken olsun. &
operatr bir nesnenin adresini bulmamz salar.
Px = &x;
lemi xin adresini px deikenine atar. Artk px x deerine bir iaretidir.
& operatr sadece deikenlere, dizilere ve veri yaplarna
uygulanabilirler. &(x+1) ve &3 eklindeki kullanmlar geersizdir. Register
niteleyicisi ile tanmlanm bir deikeninde adresini almak geersiz
ilemdir.
* operatr de yanndaki ifadenin bir iareti olduunu anlatr ve bu
adresin ifade ettii yerdeki deikeni anlatr. Eer ad y olan bir int
deiken olsun
y= *px;
ifadesi y deerine pxin gsterdii yerdeki deeri atar. Yani:
px = &x;
y = *px
ifadesi
y = x;
ifadesine denk bir ilem yapar.
Yukardaki ilemi yapabilmek iin tabii ki ilgili deiken tanmlarn da
aadaki gibi yapmak gerekecektir.
int x,y;
int *px;
8/13.02.2012 16:19:00
64
x ve y ile ilgili tanmlar daha nceden grdmz gibidir. *px tanm ise
yeni bir tanm olarak karmza kyor. Bu tanma gre *pxin bir tam say
olduunu anlatr. Her hangi bir ifadede px ile karlalrsa bunun bir int tr
olduunu anlatr. Bu da ounlukla derleyici dzeyinde hatalarn
giderilmesini salar.
aretiler aritmetik ifadeler ierisinde kullanlrlar. rnein px bir tam say
xe iareti ise xin kullanlabilecei tm ifadelerde *px kullanlabilir.
y = *px +1;
ifadesi ynin deerini xin bir fazla olarak ayarlar.
Printf(%d\n, *px);
Xin deerini ekrana yazacaktr.
d=sqrt((double) *px);
xin karekkn hesaplar. Burada xin deeri nce double tre evrilir
sonra sqrt fonksiyonuna iletilir.
y = *px +1
eklindeki ifadelerde * ve & dier aritmetik operatrlere gre nceliklidir.
Ve nce pxin gsterdii deer bulunur bunun zerine 1 eklenerek elde
edilen sonu yye aktarlr.
y = *(px+1)
ifadesi ncelikle px ile gsterilen deikenden sonraki deikeni bulur ve
bu deikenin ieriindeki deeri yye aktarr.
aretiler eitliklerin sol tarafnda da bulunabilirler. rnein
*px = 0;
ifadesinde xin deeri 0 olarak deitirilir.
*px += 1;
ifadesi xin deerini bir arttrr. (*px)++ ifadesi de ayn ilemi yapar. Bu
son ifade de parantezler zorunludur. Parantez kullanmadan ifade edilseydi
ncelikle pxin deeri ncelikli olarak 1 arttrlr. nk ++, *, & gibi tekil
operatrler sadan sola ncelikte hesaplanr.
Son olarak iaretiler de birer deiken olduundan dier deikenlerde
olduu gibi ilemlere girebiliyorlar. Bu durumda pyin bir baka inte
8/13.02.2012 16:19:00
65
8/13.02.2012 16:19:00
66
aretiler ve diziler
C programlama dilinde iaretiler ve diziler arasnda olduka gl bir iliki
vardr. yle ki bu ikisi neredeyse ayn eylermi gibi anlatlabilirler.
Herhangi bir dizi indisleme ilemi ile yaplabilen tm ilemler iaretiler ile
de yaplabilir. aretiler ile yazlm modeli dierine gre daha hzl
alabilecektir.
int a[10] tanm 20 elemanl bir dizi tanmlyordu. Yani ad ayn olan
birbirine benzer on eleman tanmlanm oluyordu. a[i] ifadesi de a
dizisinin i. Konumundaki eleman anlatyordu. Eer pa bir tamsayya
iareti ise ve int *pa olarak tanmlanm ise pa=&a[0] ifadesi dizinin
sfrnc elemanna iaret eder. Bu da pa a[0]n adresini ierir anlamna
gelir.
x = *pa ifadesi a[0]n iindeki deeri xin iine atar.
Eer pa bir dizinin belirli bir elemanna iaret ediyorsa pa+1 bir sonraki
elemanna iaret eder. Ve tanm gerei pa-i ise pann gsterdii
elemandan i tane ncekini gsterecektir. Bu nedenle pa a[0] elemanna
iaret ediyorsa *(pa+1) ifadesi a[1] elemanna iaret eder. pa+i
i.elemann adresini *(pa+i) ise i.elemann ieriini anlatr.
Bu tanmlarn tamam a dizisinin trne bal kalmakszn her zaman iin
dorudur. Bir iaretiye bir deerin eklenmesi ve benzeri tm iareti
aritmetikleri o dizinin iinde iaretinin trne bal olarak hesaplanr.
aretinin gsterdii tre gre bir sonraki saklama ifadesini ya da bir
nceki adresi bulur. Byle olunca pa+i eklindeki bir ifadede i deeri
deikenin boyutu ile arplr sonra pa deerine eklenerek yeni adres
deeri bulunur. Bu ekilde yeni hesaplanan adres deeri deiken trne
bal olmu olur.
ndisler ve iaretiler ilgili benzerlik olduka yakndr. Gerekte bir dizinin
herhangi bir eleman derleyici tarafndan iaretiye derleme srasnda
evrilir. Aslnda dizinin ad bu diziye bir iareti deeridir. Bu nedenle
pa=&a[0] eklinde yazdmz ifadeyi aslnda pa=a eklinde de
yazabilirdik.
8/13.02.2012 16:19:00
67
Adres Aritmetii
p bir iareti ise p++ ayn trdeki bir sonraki deere iaret eder. p+=i ise
pnin deerini i kadar arttrarak i sra sonraki deere iaret eder. Bu ve
buna benzer ilemler en basit iareti aritmetiini anlatr.
C dilinin iareti, dizi ve iareti aritmetii ile ilgili entegrasyonu ve
btnl dilin ok gl olmasn salamtr. imdi bellekten yer ayran
ve bu yeri geri serbest brakabilen program satrlarn inceleyeceiz.
Programda malloc(n) ve free(p) eklindeki fonksiyonlar kullanlmtr. Bu
fonksiyonlardan malloc(n) n bytelk bir alan ayrr ve bu alana bir iaret.i
deer dndrrken free(p) p ile iaret edilen alann bellekte serbest
braklmasn salar. Bu ilemlerin sra bakmndan ters olarak yaplmas
gerektii aktr. Yani bir bellek sahas nce malloc ile ayrlm olmaldr ki
free ile serbest braklabilsin. Bu ekilde zellikle istenilen zamanlarda
8/13.02.2012 16:19:00
68
69
i++;
}
Yukardaki dizi kullanm eklinde olan fonksiyon tanm idi. imdi de ayn
fonksiyonu iaretileri kullanarak yazmaya alalm.
strcpy(s,t)
char *s,*t
{
while((*s = *t)!=\0){
s++;
t++;
}
}
s ve t iareti deerleri fonksiyona deer olarak iletildiine gre fonksiyon
iinde bu deerler istenildii ekilde deitirilebilecektir. Hatta yukardaki
rnek pratikte daha ksa bile ifade edilebilecektir. yle ki:
strcpy(s,t)
char *s,*t
{
while((*s++ = *t++)!=\0);
}
Bu rnek s ve tyi while komutunun koul snama blmnde arttracaktr.
*t++ ifadesinde ise t arttrlmadan nceki t adresinde duran deeri
anlatmaktadr. Sonda yer alan ++ ilemi tnin gsterdii deere
ulamadan tyi deitirmez. Ayn ekilde s iinde ayn eyleri
syleyebiliriz.
Benzer algoritmalar kullanarak strcmp ve benzer dier string
fonksiyonlarn yeniden yazabilirsiniz.
Altrma 30
Klavyeden girilen bir kelimenin ka harften olutuunu bulan fonksiyonu C
programlama dili ile gelitiriniz. Bu fonksiyonun bir program ierisinde
nasl arlacan gsteriniz.
8/13.02.2012 16:19:00
70
8/13.02.2012 16:19:00
71
Metin Dosyalar
ncelikli olarak bu ekilde bir dosyann tantlmas gerekir bu amala da
FILE adnda bir tr ile tanmlanm bir deiken olmaldr.
72
Dosyadan okuma
getc c=getc(fp) eklinde kullanlr ve fp ile temsil edilen dosyadan 1
karakter okuyup c deikenine getirir.
fscanf fscanf(fp, "biim tanmlar", deikenler) eklinde
kullanlr. Bildiimiz scanf gibi almaktadr. Ancak klavyeden deil de
bilgileri fp ile temsil edilen dosyadan okumaktadr. Biim tanmlar ksm
normal scanf komutu ile ayndr.
Dosyaya yazma
putc putc(fp, c) eklinde kullanlr ve fp ile temsil edilen dosyaya c
deikenindeki 1 karakteri yazar.
fprintf fprintf(fp, "biim tanmlar", deikenler) eklinde
kullanlr. Bildiimiz printf gibi almaktadr. Ancak sonucu ekrana deil de
fp ile temsil edilen dosyaya yazmaktadr. Biim tanmlar ksm normal
printf komutu ile ayndr.
Dosya kapama
fclose dosyalarn program tarafndan ileri bitmi ise kapatlmalar
gerekir. Kapatma komutu iin fclose(fp); kullanlmaldr
Altrma 31
Klavyeden girilen deerlerden pozitif olanlarn p.dat, negatif olanlarn
n.dat isimli dosyaya yazan ve sfr girildiinde ilemi sonlandran program
C dili yaznz.
Altrma 32
Kendisine gnderilen iki dosya ismine gre birinden dierine kopyalama
yapp toplam kopyalanan karakter saysn aran programa dndren
fonksiyonu yaznz.
Altrma 33
8/13.02.2012 16:19:00
73
Bir dosyadan okunan 3X3lk bir matrisi ekrana matris biiminde yazan C
Programn gelitiriniz.
Altrma 34
Bir dosyadan okunacak saylarn iinden en byk ve en kklerini bulup
ekrana yazacak C programn gelitiriniz.
Dosyadan okuma
read read(dosya_no,okunanlar,okunacak_byte); eklinde kullanlr. Bu
fonksiyon ile dorudan eriimli dosyadan okuma yazma kafasnn
bulunduu noktadan itibaren okunacak_byte kadar karakter okunarak
okunanlar dizisine yerletirir. Sonu olarak bu fonksiyon okuduu karakter
saysn dndrr.
8/13.02.2012 16:19:00
74
Dosyaya yazma
Yazma ilemi iin write komutu kullanlmaktadr. Bu Komut
write(dosya_no, yazlacaklar, yazlacak_byte); biiminde kullanlr.
Bu tanmda dosya_no bilgilerin yazlaca dosyay temsil eder. Yazlacaklar
ierisinde yazlacak bilgilerin bulunduu diziyi ifade eder. yazlacak_byte
ise dosyaya ka byte bilgi yazlacan belirtir. Bu fonksiyon yazlanlarn
toplam ka byte olduunu geri dndrr. Eer -1 deeri dnm ise
yazmada bir sorun ile karlalm demektir.
8/13.02.2012 16:19:00
75
Temel Tanmlar
Bir tarih bilgisini ele alalm. Tarih birka blmden oluan bir bilgidir. Bu
blmler gn, ay, yl, haftann gn, ayn ad gibi deerlerden oluur. Bu
deerlerin tm tek bir veri yaps iinde u ekilde anlatlabilir.
struct date {
int day;
int month;
int year;
int yearday;
char mon_name[4];
};
struct kelimesi bir veri yaps tanmnn yapldn belirtir. Bu tanm kme
parantezleri iinde bu veri yapsnn detaylarnn anlatld bir tanmdr. Bu
sz dizimde kme parantezinden sonra noktal virglden nce bu veri
yaps cinsinden tanmlarnz yapmak zere deiken trlerinizi
anlatabilirsiniz.
Bir veri yaps tanm iinde bahsi geen her bir deiken o veri yapsnn
eleman veya yesidir. Bir veri yaps iinde geen bir elemana verdiiniz
bir ismi c programnn iinde bir baka deikene verebilirsiniz. Bunlar
bulunduklar ve hkmettikleri yerler itibari ile biri birlerine kartrlmazlar.
struct {...} x,y,z; eklindeki bir tanm grsellik olarak int x,y,z ile
ayndr. nk her ikisi de x,y,z adnda deiik trlerde de olsa
deikenler tanmlar ve bu deikenler uygun miktarda yer ayrr.
Deiken ad kullanlmakszn yaplan bir veri yaps tanm bellekte yer
ayrlmasna neden olmaz. Byle bir tanm sadece deikenin genel
grn ve ekli hakknda bir ablon bilgisi sunar. Eer veri yaps
tanmnda bir isimlendirme yaplm ise bu isimler ile programn dier
blmlerinde deikenler tanmlanabilir. rnein biraz nce tanmladmz
8/13.02.2012 16:19:00
76
8/13.02.2012 16:19:00
77
Altrma 35
Bir dairenin parametrelerinin struct deimi ile ifade edilmesi gerekirse
nasl tanmlanmas gerektiini gsteriniz.
78
TypeDef
Cde varolan deiken trlerine yenilerini eklemek iin kullanlan bir
komuttur. rnein:
typedef int LENGTH;
kullanm int adl trn aynndan LENGTH ismiyle oluturur. Bu smi
kullanarak yeni deikenler tanmlayabilir tr dnmlerinden
faydalanabilirsiniz.
LENGTH len,maxlen;
8/13.02.2012 16:19:00
79
Benzer eilde
typedef char *STRING;
eklindeki bir tanm karakter iaretisinin yeniden tanmlanmasn ve
adnn STRING olmasn salar.
STRING p,lineptr[LINES]; eklindeki kullanmlar p isminde bir karaktere
iareti tanmlar.
Dikkat edilirse typedef szc ile tanmlanan yeni tr deiken
tanmlanan konumda bulunur. Ve kullanm olarak static veya extern
ifadelerinde olduu gibi grlr. Genellikle oluturulan yeni trleri var
olanlarndan ayrt etmek iin byk harf kullanrz.
Daha karmak bir rnek olarak nceden verdiimiz renci rneini
burada kullanalm.
typedef struct ogrenci {
char adsoy[25];
char adres[40];
unsigned short vize, final, butunleme;
struct date dtarihi;
struct date kaytarihi;
} OGRENCI;
yazmnda ad OGRENCI olan yeni bir tr tanmlanmtr.
Aslnda typedef komutu yeni bir tr yaratmaz. Sadece bir ksm tanmlara
bir yenisini ekler. Gerekte de define gibi alr ve programn derlenmesi
srasnda typedef ile oluturulmu tanmlar ilgili yerlerde deitirerek elde
ettii yeni kaynak kodunu derler.
8/13.02.2012 16:19:00
80
Hazr Fonksiyonlar
Diyagnostik ile ilgili fonksiyonlar
void assert(int ifade);
Bu fonksiyon sorunlar ile ilgili nedenlerin renilmesini salayacak satrlar
program iine yerletirir. fade hesaplanr ve eer yanl deer dnerse
assert fonksiyonu ar ile ilgili olarak dosya ad, hatal satrn numaras
ifadenin kendisini standart hata ktsna yazlr. Karlaacanz hata
mesaj ekilde bir ey olacaktr:
Assertion failed: ifade, file dosya_ad, line satr_no
Bu mesajdan sonra assert fonksiyonu abort fonksiyonunu arr. Eer
derleyici bildirimlerinden #define NDEBUG var ise assert fonksiyonu
ilevini yerine getirmez.
Karakter Fonksiyonlar
Bu blmdeki fonksiyonlar kedilerine parametre olarak gnderilen c
deerinin fonksiyon ad ile doru ifade edilebiliyorsa sfrdan farkl bir
deer aksi halde sfr deerini dndrrler.
int isalnum(int c)
c karakterinin rakam veya harf olmas durumunda 0 den farkl deilse sfr
dndren fonksiyondur.
int isalpha(int c)
c karakterinin harf olup olmadn kontrol eder ve harf ise bir dndrr.
int iscntrl(int c)
c karakterinin kontrol karakteri olup olmadn kontrol eder.
int isdigit(int c)
c karakterinin rakam olup olmadn kontrol eder
int islower(int c)
c karakterinin kk harf olup olmadnn kontrol eder.
8/13.02.2012 16:19:00
81
int isspace(int c)
c karakterinin boluk olup olmadn kontrol eder. Bu boluk karakteri ,
\f, \n, \r, \t ve \v karakterlerinden biridir.
int isupper(int c)
c karakterinin byk harf olup olmadn kontrol eder.
int tolower(int c)
Kendisine gnderilen c karakterinin byk harf olmas durumunda kk
harfe eviren ve dndren byk harf olmamas durumunda olduu gibi
dndren fonksiyondur.
int toupper(int c)
Kendisine gnderilen c karakterinin kk harf olmas durumunda byk
harfe eviren ve dndren kk harf olmamas durumunda olduu gibi
dndren fonksiyondur.
Matematik Fonksiyonlar
Bu fonksiyonlar kullanabilmek iin math.h ktphanesini programnza
include deimi ile dahil etmeniz gerekecektir.
double acos(double x)
x deerinin Arc Cosinsn hesaplar. X deeri 1 ile 1 arasnda olmaldr
ve dnen deer 0 ile 3.14 olur.
double asin(double x)
x deerinin Arc Sinsn hesaplar. X deeri 1 ile 1 arasnda olmaldr ve
dnen deer 0 ile 3.14 olur.
double atan(double x)
x deerinin Arc Tanjantn hesaplar.
double cos(double x)
x deerinin Cosinsn hesaplar. X deeri radyan cinsinden bir a deeri
olmaldr.
8/13.02.2012 16:19:00
82
double sin(double x)
x deerinin sinsn hesaplar. X deeri radyan cinsinden bir a deeri
olmaldr.
double tan(double x)
x deerinin tanjantn hesaplar. X deeri radyan cinsinden bir a deeri
olmaldr.
double log(double x)
x deerinin tabi logaritmasn hesaplar. X deeri pozitif bir say olmaldr.
double log10(double x)
x deerinin 10 tabanna gre logaritmasn hesaplar. X deeri pozitif bir
say olmaldr.
double sqrt(double x)
x deerinin karekkn hesaplar. X deeri pozitif bir say olmaldr.
double log(double x)
x deerinin tabi logaritmasn hesaplar. X deeri pozitif bir say olmaldr.
double ceil(double x)
xden kk olmayan en kk tam sayy bulan fonksiyondur. Yani x
deerini yukar yuvarlayan fonksiyondur.
double floor(double x)
xden byk olmayan en byk tam sayy bulan fonksiyondur. Yani x
deerini aa yuvarlayan fonksiyondur.
double fabs(double x)
x deerinin mutlak deerini hesaplar.
8/13.02.2012 16:19:00
83
int rand(void)
0 ile RAND_MAX aralnda rasgele bir say retir.
8/13.02.2012 16:19:00
84
int abs(int j)
j ile gsterine deerin mutlak deerini dndrr.
85
tm {
tm_sec;
tm_min;
tm_hour;
tm_mday;
tm_mon;
tm_year;
tm_wday;
tm_yday;
tm_isdst
8/13.02.2012 16:19:00
86
8/13.02.2012 16:19:00
87
8/13.02.2012 16:19:00
88
Derleyici Bildirimleri
Bu blmde yer alan konular byk programlar yazabilmek iin #include
ifadesinin nasl kullanlacan; makro ve sembolik sabitler tanmlamak iin
#define ifadesinin nasl kullanlacan ve Koullu derlemenin ne demek
olduunu anlatacaktr. Bu konular C n derleyicisinin ne olduunu
anlamanz salayacaktr. n derleme ilemi C derleyicisi programnz
derlemeye balamadan nce gerekleen ilemdir. Bu admda u ilemler
yaplr.
#include bildirimi
Bu bildirim ile belirtilen dosyann bir kopyasn bildirimin bulunduu yere
kopyaladmz syleyebiliriz. Bu bildirim aada grld gibi iki farkl
ekilde kullanlabilir.
#include<dosyaad>
#include dosyaad
Bu iki kullanm arasndaki fark derleyicinin dosyay arayaca yeri
belirtmekten kaynaklanr. Trnak arasna yazlm bir dosya derleyici
tarafndan dosyann bulunduu klasrn iinde aranr. Bu tarz genellikle
programcnn kendi yazd dosyalar kaynak koda yerletirmek istedii
zaman kullanlr. Dier gsterimde eklenecek dosya sistemin standart
include klasrnn iinde aranr. Bu genellikle iletim sisteminden ve
derleyiciden bamsz noktalar iaret eder. ounlukla da Derleyiciye ait
ktphane balk dosyalarn programnza eklemenizi salar.
Bu bildirim genellikle programnzda kullandnz ktphanelere ait balk
dosyalarnn programnza dahil edilmesini salar. Bir balk dosyasnn
iinde ise ounlukla o konu ile ilgili sembolik sabitlerin, fonksiyon prototip
tanmlarnn, veri yaplarnn, union ve enum tr tanmlarn bulunduu
bilinir.
#define bildirimi
Bu bildirim programnzda sembolik bir sabit oluturmanz salar. Genel
kullanm u ekildedir:
8/13.02.2012 16:19:00
89
8/13.02.2012 16:19:00
90
#if...#endif bildirimi
#if ve #endif deimleri derleyicinin ve n derleyicinin derleme srecini
kontrol edecektir. Tm #if deimleri bir sabit tamsay hesaplar. Genel
grn u ekildedir:
#if !defined(NULL)
#define NULL 0
#endif
Bu tmce NULL diye bir sabitin tanml olup olmadna bakar ve tanml
deil ise NULL sabitini 0 olarak tanmlar. Aksi halde NULL zaten tanmldr.
Her #if bir #endif ile bitmek zorundadr. #ifdef ve #ifndef eklinde iki
ksa bildirim daha tanmldr ve bunlar #if define(SABIT) ve #if
!define(SABIT) eklindeki tanmlarn ksa biimleridir. Bunun haricinde
#elif ve #else eklinde koulun olumsuz durumlarn deerlendirmek
zere iki bildirim daha tanmldr.
Program gelitirme srecinde bazen programclar baz blmlerin
derlenmesini istemeyebilirler. Bu durumda n derleme bildirimlerinde u
ekilde faydalanlabilir.
#if 0
derlenmesini istemediiniz kod blmleri
#endif
Bu ekildeki bir blmn derlenmesini salamak amacyla 0 yerine 1
konulabilir.
Bu ekildeki koullu derleme ilemleri ounlukla hata ayklama
maksadyla kullanlr. Aslnda bu tr bir ilem iin debugger ad verilen
yazlmlar vardr ama bunlar anlayp kullanabilmek her zaman kolay
olmayabilir. Onun yerine programclar zaman zaman printf komutunu
istedikleri yerlerde kullanarak kendileri iin yeterli olacak bir takm
deerlerin yazlmasn salayabilirler.
#if DEBUG
printf(Deer:%d\n, x);
#endif
eklindeki bir blmde eer DEBUG adnda sembolik sabit tanmlanmsa
printf satr derlenip koda katlacaktr. Aksi halde bu satr
derlenmeyecektir. Bu programn datm srmn elde ettiimizde
DEBUG sembolik sabitini tanmlayan satrlar kaldrlarak derlenmelidir. Bu
da elde edilen kodda printf satrnn olmamasn salayacaktr.
8/13.02.2012 16:19:00
91
8/13.02.2012 16:19:00
92
Parametre Tanmlama
C dilini destekleyen bir ok ortamlarda komut satrndaki parametre veya
argmanlarn programa aktarlmasn ve deerlendirilmesini salayan
yaplar mevcuttur. main fonksiyonu ilk altrld zaman iki parametre ile
kendisine deer aktarlr. Bunlardan ilki (genellikle argc olarak adlandrlr)
komut satrndaki parametrelerin says verir. kinci parametre ise (argv
olarak adlandrlr) bir karakter dizesine iareti deeridir. Bu karakter
dizesinin her bir eleman parametre olarak verilen ifadeleri saklayan
deerledir. Bu karakter dizesi ve iaretiler zerinde oynamak iaretilerle
ilgili derste grdmz ilemleri yapabilmenizi gerektirir.
Bu zelliin nasl kullanldn gsterebilecek en basit program echo olarak
adlandrlabilir. Bu program kendisine parametre olarak gnderilen
ifadeleri ekrana yazan bir program olsun. u ekilde kullanldnda;
Echo merhaba dnya
kt merhaba dnya biiminde olacaktr.
Allagelmi olarak argv[0] programn altrlmasn salayan
altrlabilir komut dosyasnn adn bildirir. Bu artlar altnda argc en az 1
deerine sahiptir. Yukardaki rnekte argc 3 olmaldr. argv[0] echo;
argv[1] merhaba; argv[2] ise dnya deerlerine sahip olur. Birinci gerek
parametre argv[1] olarak elde edilirken son parametre ise argv[argc-1]
eklinde elde edilir. Bu durumda argc 1 ise program gerek bir parametre
ile altrlmamtr. Yukardaki echo programnn u ekilde yazldn
dnebiliriz.
rnek 25
main(argc, argv)
int argc;
char *argv[];
{
int i;
for (i=1; i<argc; i++)
printf(%s,%c,argv[i],(i<argc-1) ? : \n)
}
argv bir iareti olduu iin bu program yazmak iin farkl algoritmalar
dnlerek yazlabilir. areti aritmetii ve mant ile ilgili olarak
gelitirilecek bu programlardan biri u ekilde olabilir:
main(argc, argv)
int argc;
char argv[];
8/13.02.2012 16:19:00
93
{
while (--argc>0)
printf(%s%c,*++argv,(argc>1) ? : \n);
}
argv bir karakter dizisine iareti olduu iin ++argv bu dizi iinde sradaki
dier eleman gsterir. areti deerinin her artmnda argc bir
azaltlaca iin argc>0 olduu srece geerli bir dizi elemanna bu tanm
salanm olacaktr.
Altrma 37
Klavyeden islem 8 X 3 eklinde belirtilen bir drt ilemi yapabilen sonucu
ekrana yazan ve eksik parametre girildiinde kullancy ekran vastasyla
uyaran bir C program gelitiriniz.
Altrma 38
Dosya ad klavyeden parametre olarak girilen bir dosyay ekrana listeleyen
program C Programlama dili ile gelitiriniz.
8/13.02.2012 16:19:00
94