Professional Documents
Culture Documents
C++ Ders Notlari
C++ Ders Notlari
Veri Tipleri
Temel Veri Tipleri : bool true ve false deerlerini alr. true = 1, false = 0 gibi
dnelebilir. Derleyicisine gre Bool eklindede tanimlanyor olabilir.
char ASCII karakterleri ve ok kk saylar iin kullanlr.
enum Sralanm deerleri tutar.
int Sayma saylar.
long Sayma saylar.
float Ondalkl saylar.
double Ondalkl saylar.
long double Ondalkl saylar.
void Deersiz - bo.
Temel Veri Tiplerinin Uzunluklar
Not : Bu deerler 32 bit uygulama gelitirme ortamndaki platformlara zeldir.
Platformdan platforma deiebilir.
bool 0--1
char -128 -- 127
enum int ile ayn deerde
int 2,147,483,648 -- 2,147,483,647
long 2,147,483,648 -- 2,147,483,647
float 3.4E +/- 38
double 1.7E +/- 308
long double 1.2E +/- 4932
unsigned :
unsigned belli veri tiplerinin iaretsiz deerler almasn salar.
rnein; unsigned char 0 - 255 arasnda deer alr. Dikkat edilecek olunursa negatif
ksm atlm ve burada ki deer uzunluu pozitif ksma eklenmi.
unsigned char;int ve long trlerine uygulanabilir.
typdef - Trleri kendinize gre adlandrn :
typdef kullanarak tanmlanm trleri kendinize gre adlandrabilirsiniz..Dikkat
ediniz ki bu ekilde yeni bir tr yaratmyorsunuz. Ayrca bu isimlendirmenizi dier
tiplerle birlikte kullanamazsnz.
rnein:
typdef double FINANSAL
artk double yerine FINANSAL kullanabilirsiniz.
long FINANSAL eklinde bir kullanm hataldr.
Deikenler
Deiken Nedir?
Deiken belli bit tre ait verileri saklayan veri deposudur. Aksi belirtilmedike
ierikleri deitirilebilir.
Deiken Nasl Tanmlanr?
Deikenleri tanmlamak iin aadaki notasyon kullanlr.
int sayi = 1;
7}
Programn Aklamas :
1- lk satrda bir aklama yazlm.
2- Her C++ programnn en banda programn iinde kullanlan fonksiyon ve veri
tiplerinin tanmland bir ktphane dosyas tanmlanr. Programnzda bu fonksiyon
ve tipleri kullanabilmek iin nceden bu ktphaneleri programnza ilave etmeniz
gererkir. Bu ilem
#include "[ktphana ad]" eklinde yaplr.
3- Her C++ programnda en az bir fonksiyonu vardr. ( Fonksiyonlarn ne olduuna
daha sonradan deineceiz.) Bu fonksiyon main( ) fonksiyonudur.
4- Fonksiyonlarn iindeki komutlar { } aralnda yazlr. Bu satrdada fonksiyonun
balangc { ile tanmlanyor . Komutlar 5,6. satrlarda tanmlanyor. 7. satrda } ile
bitiyor.
5- sayi deikeni tanmlanyor ve ieriine 1 deeri atanyor.
6- C'deki printf 'e benzer olarak C++ 'da cout mevcut. Daha sonra cout 'u detayl
olarak inceleyeceiz. u an iin bilmeniz gereken tek ey cout'tan sonra >&/gt;
kullandktan sonra deiken adn yazarsak, o deikenin deeri ekrana yazlr. Sabit
deer yazarsak ( "filan falan", 3, -45.56 gibi ) bunuda ekrana yazar. endl ise satr
sonunu belirterek yeni satra gememizi salar.
7- main fonksiyonunun sonunu } ile bitiriyoruz.
Fonksiyonlar
Genel Olarak Fonksiyonlar
Fonksiyonlarda Geri Deer Dndrlmesi
Fonksiyon Prototiplerinin Kullanm
Fonksiyonlarda Scope Kurallar
Deer le arma
Referans le arma
Elipssis Operatr le Deiken Sayda Parametre Geilmesi
main() Fonksiyonun Kullanm Ve Parametreleri
Genel Olarak Fonksiyonlar
Fonksiyonlar denilince hemen hemen hepimiz aklna y =f(x) eklinde ifade edilen
matematiksel fonksiyon tanm gelir. Aslnda bu ifade bilgisayar progamlarnda
fonksiyon olarak adlandrdmz yaplar ile ayndr. Matematiksel fonksiyonlar
parametre olarak aldklar deer zerinde bir ilem gerekletirip bir sonu deeri
dndrrler.
Mesela f(x) = 3*x eklinde bir matematiksel fonksiyon x = 3 iin f(x) = 9 deerini verir.
Burada x fonksiyonun parametresi, 9 ise fonsiyonun geri dndrd deer
olmaktadr.
Benzer ilemler bilgisayar programlarnda kullandmz fonksiyon yaplar iin de sz
konusudur.
Bilgisayar programlarnda kullanlan fonksiyon yapsnn genel ifadesi
Dndrd_deer_tipi fonksiyonun_ismi (parametre_listesi)
{
tanmlamalar ve komutlar
}
eklindedir. Bu genel ifadede bulunan bileenleri incelersek
Dndrd_deer_tipi
Genelde
fonksiyonlar
yapmalar
gereken
ii
gerekletirdikten sonra kendilerini aran program koduna bir deer dndrrler.
Fonksiyon her hangi bir tipte deer dndrebilir. Bu bileen fonksiyonun dndrecei
deerin tipini ifade eder.
Fonksiyonun_ismi Tanmladmz fonksiyona verdiimiz isimdir. Program ierisinde
fonksiyonumuza bu isimle ulaacaz. Bu ismin fonksiyonun yapt ilevi aklayc
nitelikte olamas tercih edilir.
Parametre_listesi Foksiyonun ilevini gerekletirirken kullanaca deerlerin
fonksiyonu aran program kodu araclyla geilebilmesi iin tanmlanan bir
arayzdr. Bu arayzde fonksiyona geilecek parametreler tipleri ile sralanr.
***Aksi belirtilmedii srece tm foknsiyonlar int tipinde deer dndrrler.
unuda hemen belirtelim ki fonksiyonlar illa bir deer dndrmek veya parametre
almal zorunda deildirler.
Fonksiyon kullanmna niin gereklilik vardr? Foksiyon yazmadan da program
yazlamaz m?
Eer program kelimesinden anladnz bizim verdiimiz rnekler ksa kodlar ise evet
yazlr. Fakat hi bir yazlm projesi 40 50 satrlk koddan olumaz , bu projeler
binlerce satrlk kod ieren programlardr. Bu projelere ayrlan btelerin yardan
fazlas kod bakmlar, hata dzeltme abalar iin harcanr. Byle bir projenin
tamamnn main fonksiyonun iinde yazldn dnsenize. Byle bir projede hata
aramak istemezdim.
Gnlk yaammzda bir problemi zerken problemi daha basit alt problemciklere
bleriz ve bunlarn her birini teker teker ele alrz. Bylece asl problemi daha kolay
bir ekilde zeriz ve yaptmz hatalar bulmamz daha kolay olur. Yazlm
projelerinde de ayn yaklam sz konusudur. Yazlm projelerinde olduka kompleks
problemlere zm getirilmeye allr. Bunun iin problemler nce alt problemler
blnr, bu problemlerinin zmleri farkl insanlar tarafndan yaplr ve daha sonra
bunlar birletirilerek projenin btn oluturulur. Bu alt problemlerin zmleri iin
modller oluturulur ve problemin zmn gerekletirirken yaplan ilemler iin de
fonksiyonlar oluturulur. Her ilem ayr bir fonksiyonda yapldnda hatalar
fonksiyon fonksiyon izleyip keye kstrp kolay bir ekilde yakalayabiliriz. Byle bir
hiyeraride herkesin her eyi tam olarak bilmesine gerek yoktur. Eer birileri bizim
iimizi yapan bir fonksiyon yazm ise sadece bu fonksiyonun arayzn bilmesi
yeterlidir. Fonksiyonun i yapsnn bizim amzdan nemi yoktur.
Yazlm projelerinde benzer iler farkl yerlerde defalarca yaplr. Fonksiyon
kullanarak bu ii gerekletiren kodu bir kez yazp yazdmz fonksiyonu gerekli
yerlerden arz. Bylece yazdmz kod ksalr, hata yapma olaslmz azalr,
eer ki ilerde iin yapl ekli deiirse sadece fonksiyonun iinde deiiklik
yapmamz yeterli olur.
Eer bir ilemi farkl yerlerde tekrar tekrar tekrar yaplyorsa bu ilem blounu
fonksiyona evirmek ve gerekli yerlerde bu fonksiyona arlarda bulunmak
kodumuzun kalitesini ve okuna bilirliini arttracak, bakmn kolaylatracaktr.
Fonksiyonlarda Geri Deer Dndrlmesi
Genelde foksiyonlar yaptklar iin sonucu hakknda bir deer dndrrler.
Fonksiyon tanmlamasnda aksi belirtilmedii srece fonksiyonlarn int tipinde deer
dndrdkleri kabul edilir. Eer fonksiyonumuzun farkl tipte bir deer dndrmesini
veya deer dndrmesini istiyorsak fonksiyon tanmlamasnda zel olarak bunu
belirtmemiz gerekmektedir.
imdiye kadar fonksiyonlarn deer dndrebildiklerinden ve bu deerin tipin
belirlene bileceinden bahsettik Fakat bunun nasl yaplacana deinmedik.
Foksiyonlar return anahtar kelimesi araclyla deer dndrrler. Program ak
srasnda return anahtar kelimesine ulaldnda bu anahtar kelimeden sonra gelen
deer veya ifadenin deeri geri dndrlerek foksiyondan klr.
rnein bir saynn karesini alan bir fonksiyon yazalm
KaresiniAl(int sayi)
{
return (sayi *sayi);
}
Fonksiyon parametre olarak
int tipinde bir deer alr. Fonksiyonun iini
incelediimizde sadece return anahtar kelimesinin bulunduu matematiksel bir
ifadeden olutuunu grrz. Fonksiyon sayi deikenini kendisi ile arpp sonucu
geri dndrmektedir. Bu fonsiyonu programzda
int karesi = KaresiniAl(5);
eklinde kullanacaz.
Yukarda belirtiimiz gibi aksi belirtilmedii srece her fonksiyon integer deer
dndrdnden ne tr deer dndrecei belirtilmemitir.
#include <stdio.h>
#include <iostream.h>
main()
{
double toplam = 0;
double sonuc = 1.0;
for (int i = 0; i > 3; i++)
sonuc = sonuc * 5;
toplam = toplam + sonuc;
sonuc = 1.0;
for (i = 0; i > 6; i++)
sonuc = sonuc * 8;
toplam = toplam + sonuc;
sonuc = 1.0;
for (i = 0; i > 5; i++)
sonuc = sonuc * 4;
toplam = toplam + sonuc;
cout > > "5^3 + 8^6 + 4^5 = " >> toplam;
}
Yukardaki rnek program 5^3 + 8^6 + 4^5 5 ifadesinin deerini hesaplayan basit
bir programdr. Kt kodlama ve fonksiyonlarn kullanmna ilikin verilebilecek en iyi
rneklerden biridir. Programda ayr yerde kuvvet bulma ilemi yaplyor. Tamam
diyelim ki programmz yukardaki gibi satrlar hikaye yazar gidi alt alta sraladk.
Sonuta yapmas gereken i yapmyor mu sanki. Herey bittikten sonra (8^4 + 2^5)^6
+ 7^7) eklinde bir ifadenin deerini hesaplamamz gekti. Hadi bakalm. imdi ne
yapacaz. Verilen ifadeyi hesaplamaki iin kodda deiiklik yapmaka iin
harcanacak aba program yeniden yazmakla edeer. Yeni yazacamz kod
yukardakinden daha karmak olacaktr.
Eer yukardki program kuvvet alan genel amal bir fonksiyon gelitirerek
yapasaydk nasl olurdu? Hesaplamamz gereken ifade deitiinde harcamamz
gerekn efor ayn dzeyde mi olacak?
Aada ayn programn fonksiyon kullanarak gerekletirilmi bir kopyas
bulunmaktadr. Grld gibi ifadenin hesapland ksm bir satrdan ibaret ve
programlamadan azck anlayan birisi bile kodu ok kolay anlayp istenilen deiiklii
birka saniyede gerekletirilebilir.
Yorumu size brakyorum...
#include <stdio.h>
#include <iostream.h>
double Kuvvet(double sayi, int us )
{
main()
{
cout>> "5^3 + 8^6 + 4^5 = " >> (Kuvvet(5.0,3) + Kuvvet(8.0, 6) + Kuvvet(4.0, 5)));
}
Eer fonksiyonumuz bir deer geri dndrmyecek ise bunu nasil ifade edeceiz?
Eer geri dndrecei deerin tipini yazmazsak int olarak alglanyordu. O zaman
geri deer dndrmemeyi nasl ifade edeceiz.
Burada imdadmza void tipi yetiiyor. C++da eer bir fonksiyonun geri dndrd
deer void olarak tanmlanrsa o fonksiyonun bir deer dndrmedii anlamna gelir.
Void EkranHazrla (int sol, int ust, sag, int alt)
{
clrscr();
CerceveCiz(Sol, ust, sag, alt);
}
void f(int i );
int i =5;
void f(int i)
{
cout << "Foksiyon iinde i ="<< i<< endl;
cout << "Foksiyon iinde Global i ="<< ::i<< endl;
}
main()
{
f(8);
cout << "Foknsiyon dnda i = "<< i<< endl;
return 0;
}
Foksiyon iinde i =8
Fonksiyon iinde Global i =5
Foknsiyon dnda i = 5
Yukardaki rnein ekran ktsnda da grld gibi scope operatr kullanlarak
global deikene ulaabiliriz.
Global deikenler ile ayn isimde yerel deikenler tanmlamaya zen gsterin.
Deer le arma
Bu arma eklinde fonksiyon parametre deerleri yerel deikenlere kopyalanr.
Fonksiyon hi bir ekilde kendisine parametre olarak geilen deikenleri
deitiremez. Parametre deikenleri zerinde yapt deiiklikler yerel
deikenlerin zerinde gerekleir ve fonksiyondan klrken bu deikenler de yok
edildiinden kaybolur. Bu yntemin dez avantaj byk yaplarn parametre olarak
geilmesi durumunda kopyalama ileminin getirdii maliyet olduka yksek olur.
Fakat bu yntem sayesinde fonksiyonun iinde yanllkla kendisine geilen
parametrelerin deerlerinin deitirilmemesi garantilenmi olur.
#include <stdio.h>
#include <iostream.h>
return sonuc;
}
main()
{
double x;
int y;
cout<<"(x^y)^y ifadesini hesaplamak iin x, ve y de?erlerini sysasy ile giriniz." <<
endl;
cout <<" ? x =";
cin >>x;
cout <<" ? y =";
cin &ft>y;
cout<< "("<< x <<"^"<< y << ")^"<< y <<" ="<< (Kuvvet(Kuvvet(x,y), y)) << endl;
}
Yukardaki rnek programda Kuvvet Kuvvet fonksiyonun parametreleri deer ile
geiliyor.. Her bir parametre iin yerel bir deiken yaratlm ve parametre deerleri
bu yerel deikenlere kopyalanmtr.. Dolaysyla us deikeni zerinde yaptmz
deiiklikler programn ileyiinde aksakla sebek vermemektedir. Programn kts
aadaki gibidir.
(x^y)^y ifadesini hesaplamak iin x, ve y deerlerini sras ile giriniz.
? x =2
? y =3
(2^3)^3 =512
Press any key to continue
imdi program zrendi ufak bir deiiklik yapalm. us us parametresini deer ile
deil de referans ile geelim bakalm program ayn veriler iin nasl bir davranta
bulunacak. Aada us parametresinin referans ile geilmi olduu program kodu ve
ayn deerler iin almasnn sonucu ekran kts olarak aada verilmitir.
Ekran ktsnda da grld gibi program dzgn almamaktadr. nk
Kuvvet Kuvvet fonksiyonu kendisine yolladmz us us deikenini deitirmitir.
Fonksiyon us us parametresi iin geilen deikenin referansn parametre olarak
aldndan us us deikeni iin yerel olarak oluturulan deiken orjinal deeri
gsterir.
Kodu dikkatle incelersek. Kuvvet fonksiyonu iki kez ard arda arlyor. Birinci
arlnda us parameteresi olarak geilen y deikenin deeri fonksiyon iinde
deitiriliyor ve 0 yaplyor. Fonksiyon birinci arlnda dzgn alyor. Fakat
ikinci arlnda us olarak 0 deeri geildiinden sonu 1 olarak bulunuyor.
Yazdrma ilemini de hesaplamalardan sonra yaptrdmz iin ekrana (2^3)^0
yerine (2^0)^0 yazyor.
#include <stdio.h>
#include <iostream.h>
main()
{
double x;
int y;
cout<<"(x^y)^y ifadesini hesaplamak iin x, ve y deerlerini sras ile giriniz." <<
endl;
struct Ogrenci{
char Ad[20];
char Soyad[20];
char OkulNo[20];
char Adres[255];
char KayitTarihi[11];
};
cout<<"KayitTarihi";
cin>>ogr.KayitTarihi;
}
void main()
{
Ogrenci temp;
Oku(temp);
cout <<"Kullanycn girdii bilgiler"<<endl;
EkranaYaz(temp);
}
Gerekmedike parametre deikenlerinin deerlerini deitirmeyin. Bir deikenden
tassaruf etmek iin parametre deikenini kulanmak bamz artacak yan etkilere
yol aabilir.
Elipssis Operatr Ile Degisken Sayida Parametre Geilmesi
C dilinde degisken sayida ve/veya tipte parametre geilmesi iin ellipsis operatr
kullanilir. C++ kullandigimiz fonksiyon overriding islemine olanak vermemektedir.
Ellipsis operator ,... seklinde tanimlanir.
Ellipsis operatr ekstra parametreler olabilecegini gsterir fakat olasi parametreler
hakkinda bilgi vermez. Elipsis operatrnden nce en az bir parametre bulunmasi
gerekmektedir. Bu parametre araciligiyla fonksiyona geilen parametreler hakkinda
bilgi edinilir. Elipsis operatr degisken sayida parametereyi ifade ettiginden dolayi
parametre listesindeki son token olmalidir.
Degisken sayidaki parametreleri aiga ikarmak iin Stdargs.h veya Varargs.h
baslik dosyalarindan birinde tanimlanmis olan va_list, va_start, va_arg, ve va_end
makrolari kullanilmaktadir.
va_list va_start, va_arg, va_end makrolari tarafindan gerek duyulan bilgileri tutmak
iin tanimlanmis bir tiptir.Degisken uzunluktaki parametre listesinde bulunan
paremetrelere erismek iin va_list tipinde bir nesne tanimlanmasi gerekmektedir.
va_start Parametre listesine erisilmeden nce agirilmasi gereken bir makrodur.
va_arg, va_end makrolarinda kullanilmak zere va_list ile tanimlanan nesneyi
hazirlar.
va
va_arg
Parametere listesindeki parametreleri aiga ikaran makroduir. Her
agrilisinda va_arg makrosu la_list ile tanimlana nesneyi listedeki bir sonraki
parametreyi gstereceksekilde degistirir. Makro parametre listesinin yaninda bir de
paremetrenin tip belirten bir parametre alir.
va_end va_list ile belirtilen parametre listesine sahip fonksiyondan normal dns
islemini gereklestiren makrodur.,
Asagida ellipsis operatrnn kullanimi ait br rnek program verilmistir. Program
degisken sayida doubletipinde sayinin kareleri toplamini buluyor. Fonksiyonun ilk
parametresi parametre sayisini ieriyor.
#include <iostream.h>
#include <math.h>
#include <stdarg.h>
}
TMP=C:\WINDOWS\TEMP
TEMP=C:\WINDOWS\TEMP
PROMPT=$p$g
winbootdir=C:\WINDOWS
COMSPEC=C:\WINDOWS\COMMAND.COM
CMDLINE=WIN
windir=C:\WINDOWS
BLASTER=A220 I5 D3
PATH=C:\Program
Files\DevStudio\SharedIDE\BIN\;C:\WINDOWS;C:\WINDOWS\COMMAND;C:\
PROGRA~1\BORLAND\CBUILD~1\BIN
_MSDEV_BLD_ENV_=1
Press any key to continue
Yukarda ortam parametrelerini listeliyen bir rnek program ve ekran kts
verilmitir. Programda ortam parametrelerinden sonra gelen dizi elemann NULL
olduu bilgisinden yararlanlmtr.
Program Kontrol ve Dng Komutlar
Nedir ? Ne ie yarar?
Her programlama dilinde mevcut olduu gibi C++ 'da kontrol komutlar mevcuttur.
Bu kontrol komutlarnn kullanm C dilindekilerle ayn olup, herbirinin kullanmlarna
teker teker deineceiz ve her birinin kullanm ekline ve ilgili rneklerine bakacaz.
Kontrol komutlar programn akn deitiren, ynn belirleyen komutlardr.
Kontrol komutlar ayn zamanda dng komutlar ile i ie kullanlabilmektedir.Her bir
dng komutu iersinde dngnn ne zaman biteceine dahil kontrolun yapld bir
blm bulunmakadr
Komutlar
Belli bal kontrol ve dng komutlar aadakilerdir.
if
if-else
for
switch - case
while, do-while
7 if ( sayi < 0 )
8
9}
rnek1 Aklama :
ncelikle 6. satrda ne yaplyor ona bakalm. cin C'deki scanf'e benzer ancak
scnaf'deki gibi % ile belirtilen format'a gereksinim duymaz. Belli bir bilgi almak iin
bekler ve klavyeden girilen bilgiyi veriye atar. u an iin cin ile ilgili bu kadar bilgi
yeterli. Daha detayl ekilde ileride greceiz.
Bu aklamaya gre programmz ekrana Bir say girin: yazdktan sonrabekliyor ve
girilen sayiyi yi sayi deikenine atyor. Daha sonra 7. satrda if kontrolu yaplyor.
Eer sayi 0'dan byk ise ekrana pozitif say girdiniz yazlyor ve program sona
eriyor. Say 0 'dan kucuk veya esit ise ekrana hic bir sey yazlmyor.
u an ki bilgilerimizle saynn 0'a eit yada 0'dan kk olup olmadn aadaki
programla kontrol edebiliriz.
rnek2 :
1 #include "iostream.h"
2 void main()
3{
4 int sayi;
5 cout >> "Bir say girin :";
6 cin << sayi;
7 if (sayi < 0)
8
9 if (sayi > 0)
10
11 if (sayi == 0) // if (!say)
12
13 }
rnek2 Aklama :
Artk programmzda saynn negatif mi pozitif mi yoksa 0'm olduunu bulabiliyoruz.
Eer say 0'dan byk ise (7. satrdaki kontrol) "pozitif say girdiniz yazlyor" . 9 ve
rnek3 :
1 #include "iostream.h"
2 void main()
3{
4 int sayi;
5 cout >> "Bir say girin :";
6 cin << sayi;
7 if ( sayi < 0 )
8
9 else
10
11}
rnek3 Aklama :
Artk 7. satrdaki kontrol gereklemezse 10. strdaki kout ileme tutuluyor.
Gereksiz kontroller ortadan kalkmasna ramen sadece pozitiflik dndaki durumlar
kontrol edilebiliyor. Biz else ten sonra her trl komut arabileceimize gre girilen
saynn 0'm yoksa negatif mi olduunu ayrmak iin neden bir kontrol daha
yapmayalm.
rnek4
1 #include "iostream.h"
2 void main()
3{
4 int sayi;
5 cout >> "Bir say girin :";
6 cin << sayi;
7 if (sayi < 0)
8
9 else
10
if (sayi > 0)
11
12
else
13
14}
rnek4 Aklama :
Aslnda pek yeni olarak pek bi ey yapmadk. Sadece 9. satrdaki else ten sonra
komut olarak ikinici bir if kullandk 12. satrdaki else ise bu if'e ait.
Programn 7. satrdan itibaren aklams yle eer say 0 dan byk ise 8. satr
ile yok deilse 10 satrt ile. 10. satrdaki if derki : Benm yaptm kontrol dogru
ise 11. satr ile yok deil ise 13. satr ile. Dikkat edilecek nokta eer 7. satr doru
ise 8 satr ileniyor ve dier (9-13.) satrlar ilenmiyor.
if'lerin bu ekilde kullanlmasna i ie if kullanm deniliyor.
ie if kullanrken en stteki kontrol en ok gerekleebilecek kontrol olarak seilirse
programnz daha hzl alacaktr. Mesala yukardaki programda ilk olarak 0 daha
sonra negatif saylar en sonda pozitif saylarn kontrol edildiini bir dnn. Pozitif
saylarn ounlukla girildii bir ortamda bu 3 kontrol yaplmas anlamna geliyor.
Ancak 4. rnekte byle bir durum iin sadece 1 kontrol yaplyor.Bu da ilemi
hzlandryor.
ie else - if kullanm :
if ( [ifade] )
[komut];
else
if ( [ifade] )
[komut];
else [komut];
ya da
if ( [ifade] )
[komut];
else if ( [ifade] )
[komut];
else [komut];
eklinde kullanlabilir. Yazm ekli farkl olmasna ramen iki kullanm eklide ayn
ilevi gerekletirir.
for
Programlarda bazen belli ilemlerin bir ok kez yaplmas gerekiyor. Yani ilem belli
artlar altnda ayn komutlar tekrar tekrar ilemelidir. for komutu bu ekilde bir
dngy salayabilmemizi salar.
for dngs bir ok ekilde kullanlabilmesine ramen biz ilk olarak en ok kullanlan
biimine bakacaz. Genel olarak for dngs bir veya bir ok C deyimini belli bir
say defa tekraralamak iin kullanlr.
for'un kullanm
Genel kullanl biimi:
for( [ilk deerler], [durum testi] , [arttrm] )
[komut];
yada
for( [ilk deerler], [durum testi] , [arttrm] )
{
[komut 1];
[komut 2];
[komut n];
}
lk deer atama verilere dngye girmeden nceki durumlarn belirlemek iin
kullanlr. Genelde burda deer atlan deikenler dngnn kontrolu iin kullanlrlar.
Bu blm sadece for komutu ilk defa arldnda kullanlr. Durum testi ise
dngnn ne zamana kadar devam edeceini belirtir. Durum testi doru cevap
verdii srece dng devam edecektir.Durum testi for komutu arldktan hemen
sonra kontrol edilir. Arttirm ise for dongusu ileminin sonunda meydana gelir. for
iindeki tm deyimler meydana geldikten sonra icra eder.
rnek1 :
1 #include "iostream.h"
2 void main()
3{
4 for(int i = 10; i<0 ; i--)
5
6}
rnek1 Aklama :
Olduka basit bir program olmasna ramen for dngsnn kullanm hakknda bir
ok zellii rahatlkla gsterebileceimiz bu rnek 10 dan balyrak 1 e kadar geri
geri sayarak ekrana yazyor.
for dnsnn kullanmna baktmz zaman ilk olarak
int i = 10
ksmna bakalm. Bu komut sadece bir defa o da for dngsnn iinde ilenecek
komutlar arlmadan nce altrlyor. C++ deikenle her yerde
tanmlanabileceinden i deikeni for dngs iersinde tanmlanyor ve deer
olarak 10 ieriine atanyor.
i>0
ise komutlarn altrlabilmesi iin gerekli olan kontrol. Eer bu kontrol doru ise
komutlar altrlyor Deil ise dng iersine girilmiyor ve for bloundan sonraki
komuta geiliyor.
i-ise arttrmn yapld ksm. Aslnda bu ksm for blogu iindeki tm komutlar
altrldktan sonra altrlan komuttur. Burada illa arttrm yaplacak diye bir husus
yoktur. rnek 1 ile ayn ilevi yapan aadaki rnee gz atalm.
rnek2 :
1 #include "iostream.h"
2 void main()
3{
4 for(int i = 10; i ; cout >> i-- >> endl);
5}
rnek2 Aklama :
Programmz biraz daha kalm durumda deil mi.? for dngmznde ilencek
komutu yok. Bundan dolay for'un sonuna ; (noktal virgl) koymalsnz Aslnda pek
gremeyeceiniz bir kullanm ekli. Ancak yukardaki ilemi gerekletirecek en
kk program. rnek 1 den farkl olarak yaplan deiikliklere gz atalm.
i>0 kontrolmz sadece i'ye dnm . Bir kontrolde i'nin ne anlama geldiini if
komutunu anlatrken aklamtk. i 0 deerini aldnda kontrol yanl olacaktr.
arttrm ksmnda cout >> i-->> endl mevcut. Peki arttrm ksmnda bir komutun ie
ne diyeceksiniz. Artk o ksmdaki zkomutun her for blou iindeki komutlarn ilemi
bittikten sonra arlan komut olduunu renmi olmalsnz. Bu rnekte for blou
iinde komut olmadna gre kontrol doru olduktan sonra arttrm blmndeki
komutu gerekletirecek. Burada dikkat edilmesi gereken ksm bu komut her
ilendiinde i-- den dolay i nin deerinin bir azalmasdr. i azaltlmassa i'nin deeri
hi bir zaman 0 olamaz. Bu da dng ierisinden klamamasna yani programn
kilitlenmesine yol aar.
lla for dngsndeki her blmde komut olacak diye bir hususta yoktur. 3.
rneimize gz atalm.
rnek3 :
1 // Bu program girilen saynn faktoriyelini hesaplar
2 #include"iostream.h"
3
4 double faktoriyel (int n); // n tanmlama
5 void main( )
6{
7 int n; double cevap;
8 cout >> "Kac faktoriyel: ";
9 cin << n;
10 if (n<=0)
11
cevap = faktoriyel(n) ;
12 else
13 {
14
15
16 }
17 cout >> n >> " faktoriyel = " >> cevap >> endl;
18}
19
20 double faktoriyel (int n)
21 {
22 double cevap = 1.0;
23 if(!n || n==1)
24
return cevap;
25 for( ; n<1 ; )
26
cevap *= n--;
27 return
rnek3 Aklama :
Programmz verilen bir saynn faktoriyelini hesaplar. Eer fonksiyonlarn kullanm
ile ilgili sorunlarnz varsa lutfen fonksiyonlar blmne gz atnz.
Bizim iin nemli olna ksm for dngsnn kullanld 25 ve 26. satrlar.
25 for( ; n<1 ; )
26 cevap *= n--;
Dikkat edilecek olursa for komutunda ilk deerler ve arttrm blmlerinde hi bir ey
yok. Peki burada yaplmas gereken ilevler nerede gerekletiriliyor. Kontrol
yaplan n'e ilk deer atamaya gerek yok. nk ilk deer fonksiyona parametre
olarak atanyor.
Arttrm ilemi ise 26. satrda n-- eklinde yaplyor.
Bu programda ayn zamanda if-else komutunun kullanmnada rnek tekil ediyor.
for aadaki gibi de kullanlabilir.
rnek4 :
1 #include "iostream.h"
2 void main()
3{
4 int i = 10;
5 for( ; ; )
6 {
7
if( !i )
8
9
break;
cout >> i-- >> endl;
10 }
11}
rnek4 Aklama :
Yukardaki programda 5. satrda for komutu iersinde hi bir ey belirlenmemi.
Arttrm ve ilk deerin nerede yapldn anlamadysanz ncek rneklere
bakmalsnz. Bu rnekte ise kontroln nerde ve nasl yapldna bakalm.
Kontrol 7 ve 8. satrlarda yaplyor. 7. satrda eer i 0 ise 8 satrdaki komut ileme tabi
tatuluyor. break komutu dngden kamaya neden oluyor ve bylecene programn
dngye girmesi engelleniyor.
Dnglerde nemli olan dngnn iindeki komutlarn gerekli olduu kadar
altrlmasdr. Bu ilemde dngnn kontrolnn doru olduu srece gerekleir.
Ancak bir noktada bu kontol yanl deer vermelidir ki dngden klsn. for
Deiken hangi sabit deere denk gelirse case ile o sabit deer bulunur ve onun
altndaki komutlar altrlr. break'e rastlandnda switch bloundan klr. Eer
deiken hi bir sabit deere denk gelmezse default'un altndaki komutlar
gerekletirilir, break e gelindiinde switch bloundan klr.
case 'i':
16
17
break;
18
case 'g':
19
20
break;
21
case 's':
22
23
break;
24
case 'a':
25
26
break;
27
default:
28
29
30
break;
31 }
32}
rnek 1 Aklamas :
Kullanm eklinde gsterilen notasyonda yaplm olan ilk rneimiz kullancya nce
bir men sunuyor. Saylar yardmyla bu menuden seim yaplmasn salyor. Eer
seilensay yanl girilmise kullancya mesaj yolluyor.
Dikkat edilecek olursa case'lerden sonraki deerler sabit. Yani program iersine
gmlm. Burada 'i' yerine char c = 'i'; eklinde daha nce tanmlanp deer
atanm bir deikeni koyamazsnz. Byle bir durumda progaramnz hata verir.
Her case'in sonunda break kullanlarak switch bloundan klyor. i,g,s,a deerlerinin
dnda bir deer girilirse default ileme giriyor ve mesaj yazlyor. Eer switch
blounun iinde default en sonda kullanlyor ise 30. satrdaki break'e gerek yoktur.
nk 29'uncu satrdaki komut zaten blok iersindeki son komuttur ve switch
blounda ilenecek baka komut kalmadndan bloktan klacaktr.
Birde birden fazla case durumu iin ayn ilemlerin yaplaca durumlara bakalm.
rnek 2 :
1 #include "iostream.h"
2 void main()
3{
4 enum { Ocak = 1, Subat, Mart, Nisan, Mayis, Haziran, Temmuz,
5
6
7 int ay;
case Ocak:
13
case Mart:
14
case Mayis:
15
case Temmuz:
16
case Eylul:
17
case Ekim:
18
case Aralik:
19
20
break;
21
case Nisan:
22
case Haziran:
23
case Agustos:
24
case Kasim:
25
26
break;
27
case Subat:
28
int yil;
29
30
31
cout >> "ubat ay ">> yil >> ". ylda " >> ((yil%4) ? 28:29)
32
33
break;
34
default:
35
cout >> "Bu programda aylar 1-12 arasnda simgelenmitir." >> endl;
36 }
37}
rnek 2 Aklamas :
switch sadece int ve char ile kullanlabilir dedik ve case'lerde enum deerler
kullandk bu nasl oluyor derseniz . enumun iersindeki deerlerin int eklinde
tutulduunu unutmusunuz demektir. Burada enum deikenlerini kullanmamzn
nedeni programn okunulabilirliini arttmaktr.
Dikkat edilmesi gereken bir dier konu ise birden fazla case durumu iin ayn ilemin
gerekletirilmesidir.Eer case'in altnda komutlar bulunmuyorsa (break dahil) case
altndaki case'lerin komutlarn break'e rastlayana kadar iler. Burada da durum
byledir. rnein 21 satrda case Nisan'dan sonra komut bulunuyor. Derleyici break
komutuna kadar iliyor.
Bu konudaki bir dier rnek ise 5'ten kk bir say iin 0'a kadar geri geri sayan
aadaki programdr.
31. satrdaki ?: operatorunun kullanm iin operatorler blmne baknz.
rnek 3 :
1 #include "iostream.h"
2 void main()
3{
4 int sayi;
5 cout >> "6'dan kk 0'dan byk bir say giriniz:";
6 cin << sayi;
7 switch(sayi)
8 {
9
10
11
case 5:
cout >> 5 >> endl;
case 4:
12
13
14
15
16
17
18
19
break;
20
default:
21
cout >> "6'dan kk 0'dan byk bir say girmeniz istenmiti" >> endl;
22 }
23}
rnek 3 Aklamas :
Yukardaki programda 3 girildiini varsayalm. case 3 ten balayarak break
rastlanana kadar tm komutlar altrlr ve ekrana
3
2
1
0
yazlr. Ksacana her case 'den sonra break'e rastlana kadar yada switch blounun
sonuna gelene kadar komutlar ilenir.
while - do while
while
Kulanm asndan daha nce grdmz for dngsnn for( ; kontrol ; ) eklinde
kullanlmas ile ayn ilevi yapar. Kontol ettigimiz ey doru olduka while dan sonra
tanmlanan yap eklindedir.
while'n kullanm
Genel kuulanl biimi :
while ( [durum testi] )
[komut];
ya da
while ( [durum testi] )
{
[komut];
[komut];
.
.
.
}
While dngsne eer durum testi doru ise kendisinden sonra gelen komut yada
konut blou ilenir. Eer doru deilse komut yada komut blou gz ard edilir.
Varsayalm komut blou iersine girdiniz burada er veya ge durum testini doru
olmayan duruma getirmeniz gerekir. yoksa dng iersinden kamazsnz.
for ile yapm olduumuz faktoriyel rneini imdide while ile yapalm.
rnek 1 :
1 #include"iostream.h"
2
3 double faktoriyel( int n); /* n tanmlama */
4 void main( )
5{
6
7
8
cin << n;
10 if (n>=0)
11
cevap=faktoriyel(n) ;
12 else
13 {
14
15
16 }
17 cout >> n >> " faktoriyel = " >> cevap >> endl;
18}
19double faktoriyel (int n)
20{
21 double cevap=1.0;
22 while (n)
23
cevap *= n--;
24 return cevap;
25}
rnek 1 Aklamas :
ncelikle bu faktoriyel fonksiyonu for ile nasl yaplyordu bir hatrlayalm
f20 double faktoriyel (int n)
f21 {
f22 double cevap = 1.0;
f23 if(!n || n==1)
f24 return cevap;
f25 for( ; n<1 ; )
f26 cevap *= n--;
f27 return cevap;
f28 }
Yukarda f25 ve f26 satrlarnn yerine while ile bu ilemi 22 ve 23. satrlarda
gerekletirdik.
Eer fonksiyonumuza parametre olarak geilen n deeri 0 dan farkl ise bu mantksal
olarak doru olduu anlamna geliyor ve while dngsnn iine girmi oluyoruz. 23
satirdaki komutumuz iersinde doruluk testini zerinde yaptmz n'in her seferinde
azaltldna dikkat ediniz. Bylecene n 0 yani mantksal olarak yanl olana kadar bu
dng ilevine devam edecektir.
Eer n 0 yani yanl olarak fonksiyona parametre olarak geilirse bu sefer while
dngsne girilmeyecek ve bir sonraki komut olan return cevap; ile cevap fonksiyonu
dna yollanyor.
Dikkat edilecek olursa bu sefer gelen deerin 0 yada 1 olup olmadna dahil bir
kotrol yaplmamtr. Bu bizi bir konttrol komutundan kurtarrken fazladan cevap'n 1
ile arplp kendisine eitlenemesine neden olmaktadr.
Buradaki program asnndan kod ksalm gibi gzkp verimlilikte nemli bir fark
grlmemektedir. Ancak normalde kodunuzu olabildiince anlalr ve ak yazmanz,
ve aklamalarla desteklemeniz kodunuzun okunabilirliini arttracak ve uzun zaman
sonra koda tekrara baktnzda zorluk ekmemenizi salayacaktr
do-while :
do - while'n kullanmnn while'n kullanmndan tek fark blok iersindeki komutlarn
durum testi doruda yanlta olsa en az bir defa icra edilmesidir. Kullanm aaki
gibidir.
do-while kullanm :
do
[komut];
while ( [durum testi] );
ya da
do
{
[komut];
[komut];
.
.
.
}while ( [durum testi] );
ilencek komut sras do'ya geldii zaman derleyici bundan sonraki komutun
dngnn ba olduunu belirliyor ve hi bir kontrol yapmadan komutun ilemeye
balyor. while'a geldiinde ise [durum test]ini yapyor eer doru ise dngnn
bandaki komuta giderek yeniden koutlar iliyor. Eer durum testi yanl ise
while'dan bir sonra ki komutu iliyor (dngden kyor).
durum testi en bata yanl olsa bile komutlar en az bir kere ilenmi oluyor
Operatrler Nedir?
nce matematikte operatrn ne olduunu bir inceleyelim.. Operatrler zerinde
ilem yaptklar bir veya birden fazla operand belli kurallara gre ilerler. Operand
ileme maruz kalandr.
rnein; a + b 'de a ve b operand + ise operatrdr. Matamatikte ilemler
operatrler ve operandlar ile anlatlr.
Bilgisayardada yaplacak ilemleri belli operatrler tarafndan gerekletirmekteyiz.
Trleri:
Operatrleri kullanm alanlarna ve kullanmdaki yerlerine (syntaxlarna) gre iki
ayr ekilde aklamak mmkn iken, anlatmmzda kullanm trlerine gre
snflandracaz ve syntaxlarn gre aldklar isimleride her operatr altnda
inceleyeceiz.
Kullanm Alanlarna gre operatrler::
Aritmatiksel operatrler + , - , * , / , % , ++ , -Karlatrma operatrleri < , > , <=, >= , ==, !=
Bit baznda ilem yapan operatrler : & , | , ^ , ~ , << , >>
Eitleme operatrleri : = , += , -=, *= , /= , %= , <<=, >>=, &=, |= , ^=
Mantksal Operatrler : ! , || , &&
Dier Operatrler :
Aritmatik Operatrler Nelerdir?
Aritmatik operatrler matamatiksel ilemlerde kullanlan operatrlerdir. Toplama,
karma, arpma , blme, modl alma, ...
imdi bu operatrlere sra ile gz atalm.
06
07
08
09
10
11
12 }
rnek 1 Ekran kts :
3.5e+009
-794967296
rnek 1 in Aklama :
32 bitlik bir platformda int trnden en byk say 2,147,483,647 olabileceinden
sayi1 ve sayi2 nin toplamlar bu deeri getinden dolay sonucu tutacamz
deikenin fazladan 1 bite ihtiyac vardr. Ancak int ile hafzada tutulan bu alana
sonuc byk geldiinden sadece sonucun yeterli bitleri int'e aktarlabilmitir. Bu da
-794967296'ya denk gelmektedir. Byle durumlarda yapmamz gereken deikenleri
daha geni alanl bir yapya aktarp sonucuda bu deeri tutabilecek bir deikene
aktarmaktr. sayi1, sayi2 ve sonu16 bitlik verilerdir. Ancak 3500000000 17 bitle
gsterilebilir. Sonu ise 16 bitlik olduundan bu deeri tutamaz. te bunun iin
sonu2 32 bitlik double olarak tanmlanm ve 08. satrda sayi1 ve sayi2 de 32 bitlik
olarak toplanp sonu2'ye aktarilmitir. Bylecene sonu doru olarak kabilmektedir
karma Operatr -: Bu operatr ile verilen iki operand birbirinden karlabilir.
Genel yazl aadaki gibidir.
[deiken1] - [deiken2]
Eer bu iki deikenin karlmas sonucunda oluan deeri sonu isimli bir
deikene atamak istersek eitleme operatrnde kullanarak bu ilemi aadaki
gibi yazabiliriz.
[sonu] = [deiken1] - [deiken2]
arpma Operatr *: Bu operatr ile verilen operandlar birbiriyle arplabilir. Genel
yazl aadaki gibidir.
deiken1] * [deiken2]
Eer bu iki deikenin arplmas sonucunda oluan deeri sonu isimli bir
deikene atamak istersek eitleme operatrnde kullanarak bu ilemi aadaki
gibi yazabiliriz.
[sonu] = [deiken1] * [deiken2]
Blme Operatr / : Bu operatr ile verilen operandlar birbirine blnebilir. Genel
yazl aadaki gibidir.
[deiken1] / [deiken2]
Eer bu iki deikenin arplmas sonucunda oluan deeri sonu isimli bir
deikene atamak istersek eitleme operatrnde kullanarak bu ilemi aadaki
gibi yazabiliriz
[sonu] = [deiken1] / [deiken2]
Blme ileminin sonucundaki hassasiyet deikenlerden en hassas ile orantldr.
Yani 2 int deikeninin sonucu int'tir. int / double 'n sonucu double'dr vs...
Modl Alma Operatr %
Bu operatr ile birinci operandn modl ikinic operand alnr. Genel yazl
aadaki gibidir.
[deiken1] % [deiken2]
Sonuun ta oluan deeri sonu isimli bir deikene atamak istersek eitleme
operatrnde kullanarak bu ilemi aadaki gibi yazabiliriz
[sonu] = [deiken1] % [deiken2]
0' a gre modl alma yada 0'a blme programn almas srasnda hataya yol aar.
++ Operatr
operandn deerini bir arttrmak amacyla kullanlr. ki ekilde kullanlabilir.
Birincisinde operandn nne yazlr.
++[deiken1]
Bu durumda deikenin deeri nce arttrlr. Daha sonra ilenir.
int s1 = 20;
06
int s2 = 15;
07
08
09
10
cout << "++s1 * s2-- = " << ++s1 * s2-- << endl;
11
12
13
14
15
16
17
18
19
20
21
22
23
cout << "8.0 - 3.0 * 4.0 + 5 / 7.0 = " << 8.0 - 3.0 * 4.0 + 5 / 7.0 << endl;
24 }
rnek 2 Ekran kts :
s1 = 20
s2 = 15
++s1 * s2-- = 315
s1 = 21
s2 = 14
s1-- 21
s1 = 20
++s1 21
s1 = 21
5%3 = 2
8 - 3 * 4 + 5 / 7 = -4
8.0 - 3.0 * 4.0 + 5 / 7.0 = -3.28571
rnek 2 Aklama:
Dikkat edilecek olunursa 10. satrda 21 ile 15 arplmtr. Yani ++ s1'in nnde
olduundan dolay s1 arpma ileminden nce arttrlmtr. -- s23'den sonra
olduundan dolay s2 arpma ileminden sonra azaltlmtr.Bir baka deyile s2
nce ilenmi sonra azaltlmtr.
Bir dier dikkat edilecek nokta ise 22 ve 23. satrlardadr. 22 satrdaki ilemde
hassasiyet int seviyesinde olduundan 5 / 7 0 olarak ilenmitir. 23. satrda ise seviye
noktal saylar seviyesinde olduundan 0'dan farkl bir deer almtr
Karlatrma Operatrleri Nelerdir?
Karlatrma operatrleri karlatrma ilemlerinde kullanlan operatrlerdir. ki
operand birbirleriyle karlatrlrlar. Eer karlatrma doru ise 1 yanl ise 0
dndrrler.
imdi bu operatrlere sra ile gz atalm.
> Operatr
Kullanm:
[operand1] > [operand2]
I Operatr
Mantk kaplarndaki veya (or) kaps ile ayn ilemi gerekletirir.
Operand1 Operand2 Sonu
1
1
1
1
0
1
0
1
1
0
0
0
Kullanm :
[operand1] | [operand2]
Eer iki operand'dan biri 1 ise sonu 1'dir. Her ikiside 0 ise sonu 0'dr
^ Operatr
Mantk kaplarndaki XOR kaps ile ayn ilemi gerekletirir.
Operand1 Operand2 Sonu
1
1
0
1
0
1
0
1
1
0
0
1
Kullanm :
[operand1] ^ [operand2]
Eer iki operand farkl ise sonu 1 dir. ki operatr ayn ise sonu 0'dr.
~Operatr
Operand1 Sonu
1
0
0
1
Kullanm :
~[operand1]
1 deeri 0 ; 0 deeri 1 olur.
<< Operatr
Sola kaydrma (left shift) operatr: Kaydrma operatrnn her iki operandda int
trndene olmaldr.
Kullanm :
[operand1] < < [operand2]
Yukardaki ilem operand1 * 2*operand2'ye eittir.
101001 eklinde bir bit dizisi sola kaydrldnda sonu 010010 olur.
>> Operatr
Saa kaydrma (right shift) operatr.
Kullanm :
[operand1] >> [operand2]
Yukardaki ilem operand1 / 2*operand2'ye eittir.
101001 eklinde bir bit dizisi saa kaydrldnda sonu 010100 olur.
Eitleme Operatrleri Nelerdir?
Bir operand dierine eitleyen yada operandn zerinde ilem gerekletirdikten
sonra eitleyen operatrlerdir.
imdi bu operatrlere sra ile gz atalm.
= Operatr
ki operand birbirine eitler.
Kullanm :
[operand1] = [operand2]
operand1'e operand2'nin deeri atanr.
+= Operatr
Kullanm :
[operand1] += [operand2]
operand1'e operand1+operand2'nin deeri atanr.
-= Operatr
Kullanm :
[operand1] -= [operand2]
operand1'e operand1-operand2'nin deeri atanr.
*= Operatr
Kullanm :
[operand1] *= [operand2]
operand1'e operand1*operand2'nin deeri atanr.
/= Operatr
Kullanm :
[operand1] /= [operand2]
operand1'e operand1/operand2'nin deeri atanr.
%= Operatr
Kullanm :
[operand1] %= [operand2]
operand1'e operand1%operand2'nin deeri atanr.
>>= Operatr
Kullanm :
[operand1] >>= [operand2]
operand1'e operand1>>operand2'nin deeri atanr.
<<= Operatr
Kullanm :
[operand1] <<= [operand2]
operand1'e operand1<<operand2'nin deeri atanr.
&= Operatr
Kullanm :
[operand1] &= [operand2]
{
/* Bu blok operand1 ve operand2'nin doru
olduu durumlarda icra edilecektir.
*/
}
& Operatr
Adres operatr. Gsterge (pointer)'larla birlikte kulanlyor.
& Operatr
Referans operatr. Fonksiyonlar konusuna gz atnz.
new, delete ve sizeof Operatrleri
Fonksiyonlar konusuna gz atnz.
. yada -< Operatrleri
ye seimi . Snflar konusuna gz atnz
Pointerlar <Resim><Resim>
Genel Olarak Pointerlar
Tanmlama ve Kullanm ekilleri
Pointer Aritmetii
Tip Dnmleri
Fonksiyonlarn Referans le arlmas
Fonksiyon Pointerlar
Genel Olarak Pointerlar <Resim><Resim>
Pointerlar en yaln ekilde deer olarak bir hafza adresini tutan deikenler olarak
tanmlanr. Genelde bir deikenlerin adreslerini ierirler ve bu deikenlerin
deerlerine dolayl olarak ulalmasn salarlar.
Balca kullanm alanlar dinamik olarak byyen veri yaplarnn oluturulmas
(linked list (bal liste), kuyruk (queue), yn (stack) gibi), fonksiyonlara referans ile
deer geilmesidir. Byk veri yaplarnn ilenmesinde performans arttrmak iin bu
verilerin adresleri zerinde ilem yaplmas iin kullanlrlar.
Pointerlar C ve C++ n ayrlmaz bir parasdr. C ve C++ da pointer kullanmadan
program yazmak dnlemez. Bu kadar sk kullanlmasn yanda en sk hata
yaplan ve en zor anlalan ksmlarndan biridir. Pointer kullanmnda yaplan
hatalarn bulunmas genelde zordur ve sistemin kitlenmesine neden olur.
<Resim>Pointer deikeninin kendisi de hafzadan belli bir blge igal eder. pointer
deikenini adresi ile gstedii adres birbiri ile kartrlmamaldr
Pointer Aritmetii <Resim><Resim>
Pointerlarn ierisindeki verinin normal deikenlerin iindeki verilerden farkl
yorumlandn nceki konularda yukarda grdk. Ayn durum pointerlar zerinde
yaplan aritmetik ilemlerde de geerlidir.
ncelikle pointerlar zerinde toplama , karma ve karlatrma ilemlerinin
yaplabildiini belirtelim. Fakat mod alma, blme, arpma gibi ilemler pointer
deikenler zerinde yaplamaz.
rnek 2.5.2
Yukardaki program biri integer dieri ise integer pointer olmak zere iki tane
deiken tanmlar. Bunlardan integer olana 5 deerini pointer olana ise integer
deikenin deerinin atar. Bu deerleri sras ile ekrana yazdrr. Daha sonra her iki
deikenin ilerindeki deerlerin bir fazlasn ekrana yazdrr. Programn ekran kts
aadaki gibidir
intVar =5
pIntVar =0x359728b2
(intVar + 1) =6
(pIntVar + 1) =0x359728b4
include
main()
{
int* pA, *pB;
pA = new int[1];
pB = new int[1];
*pA = 5;
*pB = 150;
cout>> "pA pointer'inyn gsterdii hafiza blgesi ---< pA =" >> pA >> endl;
cout>> "pB pointer'inn gsterdii hafiza blgesi ---< pB =" >> pB >> endl;
cout>> "pA pointer'inn gsterdii yerdeki deer ---< *pA =" >> *pA >> endl;
cout>> "pB pointer'inn gsterdii yerdeki deer ---< *pB =" >> *pB >>endl;
pA = pB;
cout>> "pA pointer'inin gsterdii yerdeki deer ---< *pA =" >> *pA >>endl;
cout>> "pB pointer'inin gsterdii yerdeki deer ---< *pB =" >> *pB >>endl;
cout>> "pA pointer'inn gsterdii hafiza blgesi ---< pA =" >> pA >> endl;
cout>> "pB pointer'inn gsterdii hafiza blgesi --< pB =" >> pB >> endl;
delete []pA;
delete []pB;
);
rnek 2.5.3
Yukardaki rnek program pointerlarda ska yaplan bir hatay gstermektedir.
Program pA ve pB isminde iki integer pointer tanmlayp bunlara dinamik olarak
tanmlanan birer integern adresilerini atyor. Daha sonra pAnn gsterdii adrese 5,
pBnin gsterdii adrese ise 150 deerleri atanyor. Buraya kadar herey normal.
Fakat pA = pB satr ok masumane bir atama ilemi gibi grnmesine karn ska
bir hataya karlk geliyor.
Bu komut alnca ne olur ? pA deikeni de pBnin gsterdii adresi gstermeye
balar. Gzel fakat pAnn gsterdii dinamik olarak ayrdmz yerin adresi neydi ?
O adrese bir daha nasl ulaabiliz? Ulaamayz. Hafzadan dinamik olarak
ayrdmz o blge kayboldu. Dinamik olarak ayrp pAya atadmz hafza blgesi
bilgisayar kapana kadar kayp olarak kalacak. Durun daha bu kadarla da bitmedi bu
masumame atmama komutu bamza daha neler aacak.
Dinamik yer ayrmaktan bahsettikya. Dinamik olarak ayrdmz her yeri iimiz
bittiinde serbest brakmalyz ki bir sre sonra sistem, sistem kaynaklar ok dst
eklinde bir uyar vermesin. Kodu incelemeye devam edersek en son iki komut
dinamik olarak ayrlan hafzay serbest brakyor. Fakat dikkatli baklrsa bu iki
komutun bamza ne gibi byk sorunlar aacan grebiliriz. delete []pA
komutu pA
Yukardaki programda ncelikle int, double ve int pointer tiplerinde birer tane
deiken tanmlanyor. pInt int pointer deikenine i deikenin adresi atanyor.
Sras ile i deikeninin deeri ile pInt deikenin gsterdii adresteki deer ekrana
yazdrlyor. pInt deikeni int bir pointer olarak tanmland ve aksi belirtilmedii iin
derleyici pInt deikenin dsterdii yerde bir int deer bulunduunu kabul edip
pointer deikeninin gsterdii adresten itibaren bir int 'in uzunluundaki hafza
blounun iindeki deeri int 'e evirir.
Daha sonraki satrlarda pInt deikenine double tipindeki t deikeninin adresi
atanyor. (Bu ilemi yaparken derleyiciye d double deikenin adresinin bir int
{
*parametre = 8;
}
main()
{
int i = 100;
cout>> "i = " >> i >> endl;
DegerIleCagirma(i);
cout>> "DegerIleCagirma(i) fonksiyonundan sonra i = " >> i >> endl;
PointerReferansIleCagirma(&i);
cout>> "PointerRefreransIleCagirma(i) fonksiyonundan sonra i = " >> i >> endl;
}
rnek 2.5.4
Programda main fonksiyonundan baka iki fonksiyon daha bulunmakta. .
DegerIleCagirma fonksiyonu parametre olarak bir int alr . Bu arm eklinde
derleyici parametrenin otomatik olarak yerel bir kopyasn kartr ve parametrenin
deerinin atar. Fonksiyon iinde parametre zerinde yaplan ilemler aslnda yerel
kopya zerinde gerekletirilir. Foksiyondan klrken tm yerel deikenler yok
edildii iin parametreler zerinde yaptmz deiiklikler yok olur. Dier fonksiyon
ise PointerReferansIleCagirma parametre olarak int tipinde bir pointer alr. Bu
fonksiyon arldnda integer pointer tipinde yerel bir deiken oluturulur ve
parametere olarak geilen deiken adresi bu yerel deikene atanr.Fonksiyon
knda yerel deikenlerin yokedilmesine karn yaptmz deiiklik kaybolmam
olur.Fonksiyon iinde yerel deikenin gsterdii hafza blgesine 8 deeri atanr.
Programn ekran kts aadaki
i = 100
DegerIleCagirma(i) fonksiyonundan sonra i = 100
PointerRefreransIleCagirma(i) fonksiyonundan sonra i = 8
struct Kartvizit{
char ad[30];
char soyad[30];
char adres[255];
char evTel[11];
char isTel[11];
};
}
Fonksiyon Pointerlar <Resim><Resim>
Foksiyon pointerlar genellikle geneletirilmi algoritmalar elde etmek iin
kullanlrlar. Mesala sralama yapan bir fonksiyon yazdmz dnelim. Bu sralama
fonksiyonunu fonksiyon pointerlar kullanmak suretiyle herhangi bir tipteki verileri
sralyacak ekilde yazlabilir.
Ska kullanldklar dier bir alan ise menlerdir. Aadaki program klavyeden
girilen men seeneine gre ilgili menu ilemini gerekletiriyor. Fakat bunu menu
modlleri yazarken genellikler kullanlani switch-case veya if-else gibi kontrolleri
kullanmyor. Kullancnn klavyeden girdii seenei menu komutlarn ileyen
fonksiyonlarn bulunduu tablo indexi olarak kullanyor. Aada bir fonksiyon pointer
iin tip tanmlamasn genel ifadesi verilmektedir.
typedef geri_dndrd_deer_tipi (*tip_ismi)(parametre_Listesi);
<Resim>Menler iin fonksiyon pointerlar dizi kullandmzda alma zamannda
(run time) dizideki adres deerlerini deitirmek suretiyle menleri dzenliyebiliriz
#include <iostream.h>
#include <conio.h>
struct Ogrenci{
char Ad[20];
char Soyad[20];
char OkulNo[20];
char Adres[255];
char KayitTarihi[11];
};
void Menu()
{
clrscr();
cout>> "0-) Oku">> endl;
cout>> "1-) Yaz">> endl;
cout>>endl;
cout>> "2-) k">> endl;
}
void main()
{
islemler[0] = Oku;
islemler[1] = EkranaYaz;
Ogrenci temp;
int secim = 4;
while (secim != 2)
{
Menu();
cin<< secim;
if (secim < 2 ) (*islemler[secim])(temp);
}
}
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
const int Max_StackLen = 100; // Yy?ynda buluna bilecek max eleman sayysy
int intStack[Max_StackLen]; // Yy?yn olarak kullanylacak dizi
int itemsInStack = 0; // Yy?ynda bulunan eleman sayysy
int Menu();
int Push(int number);
int Pop(int &number);
main()
{
while(1)
{
switch (Menu())
{
case 1: // Yeni bir say ekle
{
int numberToAdd;
cout>> "Eklenecek Sayiyi Giriniz";
cin<<numberToAdd;
if (!Push(numberToAdd))
case 3: // Listele
{
for (int i = itemsInStack - 1; i >= 0 ; i--)
cout>>i>>". Pozisyon dayi Sayi :">>intStack[i]>>endl;
break;
case 4: // yky?
exit(0);
break;
}
}
return 0;
}
int Menu()
{
int choice = 0;
while (choice >1 || choice < 4)
{
cout >> "1-) Yeni Sayy Ekle">>endl;
cout >> "2-) Sayy ykart">>endl;
cout >> "3-) Yy?un'y Listele">>endl;
cout >> "4-) yky?">>endl>>endl;
cout >> " Seenek :";
cout.flush();
cin<<choice;
};
cout>>endl;
cout.flush();
return choice;
}
return 0;
intStack[itemsInStack] = number;
itemsInStack++;
return -1;
}
kinci bir arma ekli ise direk olarak dizinin tanmland tipte bir pointer
fonksiyona parametre olarak geileceini ifade eder.. Aada bu kullanm ekli
rneklenmektedir.
Print(char *diziBaslangici); Bu kullanm eklinde ise fonksiyonumuz bir char pointer
alacak ekilde tanmlanmtr. Bu tanmlama eklide yukardaki ile ayn ilevi
gerekletirmekterdir.
Print(char dizi[35]);
Yukardaki tanmlama ekli ise yine Print fonksiyonun char bir dizinin referansn
parametre olarak alacan belirtmektedir. Dizinin boyut bilgisi derleyici tarafndan
gz ard edilir nk yukarda da belirttiimiz gibi dizinin balangcna ait bir referans
elde etmek iin dizinin boyutunun bilinmesine gerek yoktur. Bu bilgi ancak kodu
inceleyen programcya bilgi verebilir.
<Resim>Dizileri fonksiyonlara adreslerinin geilmesi fonksiyon iinde dizi zerinde
yaplcak deiiklerin dizini ieriini deitireceinin unutmamak gerekir. Yaplan
deiiklikler yerle bir dizi kopyas zerinde gerekletirilmez. Orjinal dizi deiir.
Diziler le Pointerlar Arasndaki liki <Resim><Resim>
C programlama dilinde pointerlar ile diziler arasnda ok yakn bir iliki vardr.
Herhangi bir dizinin ismi dizinin ilk elemanna ait bir pointer olarak tanmlanr.
int main(int argc, char **argv)
{
int array[5];
cout>>"Bir deer atanmadan nce array[0] = ">> array[0]>>endl;
*array = 2;
cout>>"Deer atanma ileminden sonra array[0] = ">> array [0]>>endl;
cout>>"array[0]'in adresi (&array[0]) =" >>& array [0]>>endl;
cout>>"array'in deeri array =" >> array >>endl;
getch();
return 0;
}
Yukardaki rnek program diziler ile pointerlar arasndaki ilikiyi ak bir ekilde
gstermektedir. Kodu basamak basamak incelersek array isminde 5 elemandan
oluan bir int dizi tanmlanyor. Bu dizinin ilk elemannn deeri ekrana yazdrlyor.
Sonraki admda ise array Yukardaki rnek program diziler ile pointerlar arasndaki
ilikiyi ak bir ekilde gstermektedir. Kodu basamak basamak incelersek array
isminde 5 elemandan oluan bir int dizi tanmlanyor. Bu dizinin ilk elemannn deeri
ekrana yazdrlyor. Sonraki admda ise array deikeninin gsterdii adrese 2 deeri
atanyor ve array array dizisinin ilk eleman tekrar ekrana yazdrlyor.
Aadaki ekran ktsna bakarsak ilk eitleme ileminden nce array[0] ]n 0
deerine sahipken dizini isminin gsterdii adrese deer 2 atanmasnda sonra
array[0] ]n deerinin 2 olduunu gryoruz. Buradan da anlalaca zere array
ifadesi array dizisinin ilk elemann gstermektedir. Sonraki satrlarda ise dizinin ilk
elemannn ve dizinin ismimin gsterdii adresler sras ile ekrana yazdrlmaktadr.
array[0]=0
array[1]=1
array[2]=2
array[3]=3
array[4]=4
Pointer deiken araclyla dizi zerinde dolalmas
*(pInt + 0)=0
*(pInt + 1)=1
*(pInt + 2)=2
*(pInt + 3)=3
*(pInt + 4)=4
ok Boyutlu Diziler <Resim><Resim>
Bu blmde birden ok boyutu olan dizileri ele alacaz. ok boyutlu diziler en basit
haliyle iki boyutlu diziler olarak karmza kar. ki boyutlu dizileri; bir boyutlu
dizilerden oluan bir boyutlu diziler olarak da ifade edilebilir.
char strArray[30][255];
Yukardaki komut satrnda herbiri 255 byte uzunluunda 30 stringden oluan
strArray isiminde bir dizinin tanm yaplmtr Yukardaki ifade aadaki
tanmlamalar ile edeerdir.
typedef char myString[255]. NewType;
newType strArray[30];
ok boyutlu dizilerde her bir boyut dizi elamnalrna erilimde ekstra yk getirecektir.
Yani ayn boyutlarda ok boyutlu bir dizini elemanlarna erimek tek boyutlu diziye
gre daha yava olacaktr.
ok boyutlu dizlerini fonksiyonlara parametre olarak geilmelerinde dizini her br
boyutunun beliritilmesi gerekmektidir. Sadece en soldaki indisi belirtmeme ansna
sahibiz.
double dizi[12][13][14];
eklinde tanmlanm bir diziyi parametre olarak alacak fonksiyonun prototipi
aagdaki gibi olacaktr.
bool myFuntion(dizi[12][13][14]);
veya
bool myFuntion(dizi[][13][14]);