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.
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.
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.
int sayi;
char c;
int i;
float f;
double d;
unsigned int ui;
rnein;
char c;
char C;
int sayi;
int Sayi;
c ve C hafzada farkl yerleri gsterirler. sayi ve Sayi'da farkldr.
rnein;
Tanmlama srasnda deer atama:
char c = 'c';
int sayi = 100;
Daha sonradan deer atama:
char c;
int sayi;
c = 'c ';
sayi = 100;
Ayn anda birden fazla deiken tanmlanabilir, ve ayn anda birden fazla deikene
deer atanabilir;
int i , j , k;
i = j = k = 100;
i,j,k'nn deeri 100 oldu.
Programlara Aklama Eklenmesi
Aklama Nedir?
Deikenleri tanmlarken dikkat ettiyseniz her C++ komutu ; (noktal virgl) ile
bitiyor. Bu derleyiciye komut yazmnn bittiini belitmek iin kullanlyor.
Programlar uzadka ve karmaklatka programmza bir daha ki bakmzda
neyi neden yaptmz unutabiliriz. Yada yazlm olan program bizden baka
kiilerde kullanacak olabilir. Bundan dolay ne yaptmza dair aklamalar kodun
iine serpitirmeliyiz.
Yazdnz komutlar basit fonksiyonlar iersede detayl ekilde aklama
eklemenizi neririm. Bylecene aylar sonra kodunuza tekrar baktnzda ne
yaptnz kolayca hatrlayabilirsiniz. Bakas sizin kodunuza baktnda renmesi
ok hzlanacaktr.
rnein:
// Bu satr derleyici tarafndan umursanmaz
// Ve ben satrn bana // yazarak bu satrn aklama olduunu belirtiyorum
// Aada da rnek bir deiken tanmlanmtr.
long ornek;
C++'n C'den farkl olarak birden fazla satra aklama yazmay salayan bir yap
daha vardr. Bu yap /* ile balar */ ile biter. Yukardaki rnei bu yap ile aadaki
gibi tanmlayabiliriz.
lk Programmz :
2 #include "iostream.h"
3 void main( )
4{
5 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
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.
#include <stdio.h>
#include <iostream.h>
main()
double toplam = 0;
sonuc = sonuc * 5;
sonuc = sonuc * 8;
sonuc = 1.0;
sonuc = sonuc * 4;
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 sonuc = 1.0;
return sonuc;
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.
clrscr();
}
main()
{
f(8);
cout << "Foknsiyon dnda i = "<< i<< endl;
return 0;
}
Foksiyon iinde i =8
Fonksiyon iinde Global i =5
Foknsiyon dnda i = 5
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>
main()
double x;
int y;
cin >>x;
cin &ft>y;
cout<< "("<< x <<"^"<< y << ")^"<< y <<" ="<< (Kuvvet(Kuvvet(x,y), y)) << endl;
? x =2
? y =3
(2^3)^3 =512
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>
return sonuc;
main()
double x;
int y;
cin >>x;
cin >>y;
cout<< "("<< x <<"^"<< y << ")^"<< y <<" ="<< (Kuvvet(Kuvvet(x,y), y)) << endl;
? x =2
? y =3
(2^0)^0 =1
Fonksiyona deere ile paramete geildiinde parametre deeri yerel bir deikene
kopyalanr. Yaplan deiiklikler yerel deiken zerindedir. Fonksiyondan knca
kaybolur.
Referans le arma
Bu arma eklinde ise fonksiyona parametre olarak geilen deerler yerine bu
deerleri ieren deikenlerin referanslar (veya adresleri) geilir. Bylece fonksiyon
iinden parametre deikenleri araclyla dardaki deikenlerin deerlerini de
deitirebiliriz. Fonksiyonlarn parametrelerinin referans ile geilmesi suretiyle
performans arttrlabilir. Dikkati kullanlmaz ise fonksiyon ierisinde parametre
deikenlerinin deerleri deimemesi gerektii halde yanllkla deitirilebilir.
Referans ile armak iyidir, deer ile armak ktdr diye bir genelleme yapmak
mmkn deildir. Her iki tekniinde art ve eksileri vardir.
#include <stdio.h>
#include <iostream.h>
struct Ogrenci{
char Ad[20];
char Soyad[20];
char OkulNo[20];
char Adres[255];
char KayitTarihi[11];
};
cout<<"Ad:"<<ogr.Ad<<endl;
cout<<"Soyad:"<<ogr.Soyad<<endl;
cout<<"OkulNo:"<<ogr.OkulNo<<endl;
cout<<"Adres:"<<ogr.Adres<<endl;
cout<<"KayitTarihi"<<ogr.KayitTarihi<<endl;
cout<<"Ad:";
cin>>ogr.Ad;
cout<<"Soyad:";
cin>>ogr.Soyad;
cout<<"OkulNo:";
cin>>ogr.OkulNo;
cout<<"Adres:";
cin>>ogr.Adres;
cout<<"KayitTarihi";
cin>>ogr.KayitTarihi;
void main()
Ogrenci temp;
Oku(temp);
EkranaYaz(temp);
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>
cout << " 10^2 + 20 ^2 + 5^2 = " << KareToplam(3, 10.0, 20.0, 5.0)<< endl;
va_list parametreListesi;
va_start(parametreListesi, sayi);
va_end(parametreListesi);
return toplam;
}
main() Foksiyonun Parametreleri ve Kullanm
Main fonksiyonu program almaya baladnda altrlan fonksiyondur. Bu
fonksiyon parametre alr. Bu parametrelerin kullanlmas zorunlu deildir.
imdi bu sras ile bu parametrelerin kullanm anlamlarna amalarna deinelim.
Bir ok program, komut satr parametrelerini aktif bir ekilde kullanr. Mesala
sktrma programlar sktrlacak dosyalarn isimleri, sktrma ileminden sonra
oluturulacak dosya isimi, sktrma ekli gibi bilgileri komut satr parametreleri
arclyla kullancdan alrlar. Main fonksiyonun ilk iki parametresi komutsatr
parametrelerinin ilenmesi iin kullanlr. nc parametre ise ortam deikenlerinin
(environment variables) deerlerini ierir.
#include <iostream.h>
int i = 0;
while (env[i])
}
}
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
Komutlar
Belli bal kontrol ve dng komutlar aadakilerdir.
if
if-else
for
switch - case
while, do-while
Bu komutlarla kullanlan baz zel komutlar da unlardr
break
continue
if komutu parametre olarak ald deer doru ise kendisinden sonra gelen
fonksiyonu yada fonksiyonlar gerekletirir. Eer birden fazla fonksiyonunu if'in ald
parametreye gre kullanlmasn istiyorsanz bu komutlar blok iersine almalsnz.
Blok iine alma { }arasna alma anlamna gelmektedir.
if kelimesinin Trke karl eer anlamna gelmektedir. Mant Eer belirtilen
parametre doruysa if'ten sonraki bloktaki fonksiyonlar gerekletir. Doru deilse if
ten sonraki blou atla (yok say).
Doruluk
Peki alnan parametrenin doru olup olmamas ne demek. Lojik'te 1 ve 0 'lardan
bahsedilir. Kontrollerde eer bir ey doru ise o 1 dir. Bir ey yanl ise o yanltr.
Saylarda 0 yal belirtir. 0 dndaki tm saylar ise yanltr. Mantk ilemlerine
gre yaplan ilemlerin sonularda ya 1 yada 0'dr. Mantk ilemlerini operatrler
konusunda dahaayrntl inceleyeceiz.
if'in kullanm :
if ( [ifade] ) [komut]; ]; Bu kullanm ekli kontrolden sonra sadece bir adet komut
altrmak iindir. Eer bir ok komut altrmak istiyorsanz aadaki gibi bir kod
blou amalsnz
if ( [ifade] )
{
[komut];
[komut];
...
}
Dikkat edilecek nokta if komutundan sonra ; (noktal virgl) konulmamaktadr.
rnek1 :
1 #include "iostream.h"
2 void main()
3{
4 int sayi;
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.
rnek2 :
1 #include "iostream.h"
2 void main()
3{
4 int sayi;
7 if (sayi < 0)
9 if (sayi > 0)
11 if (sayi == 0) // if (!say)
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
11. satrlardaki kontroller yaplmasna ramen doru olmadklar in 10 veya 12
satrdaki komutlar ilenmiyor.
Ancak burda dikkat edilecek nokta programn 8. satr iledikten sonra ( 7. satrdaki
kontrol doru iseilenebilir ) dier (9-12.) satrlara ihtiya duymayacadr. Program
eer negatif say girilirse bu sefer 11. satrdaki kontrolle bou bouna girmektedir.
Sadece 0 girildii zaman tm kontrolerin gereklemesi bizim bouna ilem
yapmadmz anlamna gelmektedir.
Dnn bir defa size bir say syleyin denildiinde kanz 0 yada negatif say
syleyecektir.
if-else'nin kullanm :
if ( [ifade] )
[komut];
else [komut];
ya da
if ( [ifade] )
[komut 1];
[komut 2];
[komut n];
else
[komut 1];
[komut 2];
[komut n];
}
rnek3 :
1 #include "iostream.h"
2 void main()
3{
4 int sayi;
7 if ( sayi < 0 )
9 else
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;
7 if (sayi < 0)
9 else
10 if (sayi > 0)
12 else
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.
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{
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{
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
5 void main( )
6{
9 cin << n;
10 if (n<=0)
11 cevap = faktoriyel(n) ;
12 else
13 {
16 }
17 cout >> n >> " faktoriyel = " >> cevap >> endl;
18}
19
21 {
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.
rnek4 :
1 #include "iostream.h"
2 void main()
3{
4 int i = 10;
5 for( ; ; )
6 {
7 if( !i )
8 break;
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.
switch case
Programlarnzda bazen bir deikenin deeri sabit belli deerlere eit ise belli
ilemler yapmak istersiniz. switch seenei ile deikenin durumuna gre bir ok
durum iersinden bir tanesi gerekletirilir
switch ( [deiken] )
case [sabit_deer1]:
[komutlar];
break;
case [sabit_deer2]:
[komutlar];
break;
default:
[komutlar];
break;
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.
default kullanm istee baldr. stenmezse kullanlmayabilir.
rnek 1 :
1 #include "iostream.h"
2 void main()
3{
4 char secim;
12
13 switch (secim)
14 {
15 case 'i':
17 break;
18 case 'g':
20 break;
21 case 's':
24 case 'a':
26 break;
27 default:
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{
7 int ay;
8 cout >> "Kacinci ayn ka ektiini renmek istiyorsunuz :";
10 switch(ay)
11 {
12 case Ocak:
13 case Mart:
14 case Mayis:
15 case Temmuz:
16 case Eylul:
17 case Ekim:
18 case Aralik:
20 break;
21 case Nisan:
22 case Haziran:
23 case Agustos:
24 case Kasim:
26 break;
27 case Subat:
28 int yil;
31 cout >> "ubat ay ">> yil >> ". ylda " >> ((yil%4) ? 28:29)
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.
rnek 3 :
1 #include "iostream.h"
2 void main()
3{
4 int sayi;
7 switch(sayi)
8 {
9 case 5:
11 case 4:
12 cout >> 4 >> endl;
13 case 3:
15 case 2:
17 case 1:
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"
4 void main( )
5{
9 cin << n;
10 if (n>=0)
11 cevap=faktoriyel(n) ;
12 else
13 {
16 }
17 cout >> n >> " faktoriyel = " >> cevap >> endl;
18}
20{
21 double cevap=1.0;
22 while (n)
23 cevap *= n--;
24 return cevap;
25}
rnek 1 Aklamas :
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.
Toplama Operatr +
Bu operatr ile verilen iki veya daha fazla operand toplanabilir.Genel yazl
aadaki gibidir
deiken1] + [deiken2]
Eer bu iki deikenin toplam sonucunda oluan deeri sonu isimli bir deikene
atamak istersek eitleme operatrnde kullanarak bu ilemi aadaki gibi
yazabiliriz.
[sonu] = [deiken1] + [deiken2]
Sonu'u tutacak olan deiken deiken1 ve deiken2 deikenlerinin deerlerini
tutabilecek byklkte olmaldr. Bu konu ile ilgili rneimizi aada grebilirsiniz. Bu
rnein 32 bitlik bir platform iin yazldna dikkat ediniz. Veri tiplerinin maksimum ve
minumum deerlerini grmek iin buraya basnz.
rnek 1:
01 #include "iostream.h"
02
03 void main()
04 {
09
12 }
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
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.
kinci trde ise operanddan sonra yazlr
deiken1]++
Bu durumda deiken nce ilenir. Sonra deeri arttrlr.
-- Operatr
operandn deerini bir azaltmak amacyla kullanlr. ki ekilde kullanlabilir.
Birincisinde operandn nne yazlr.
-[deiken1]
Bu durumda deikenin deeri nce azaltlr. Daha sonra ilenir.
rnek 2 :
01 #include "iostream.h"
02
03 void main()
04 {
05 int s1 = 20;
06 int s2 = 15;
09
10 cout << "++s1 * s2-- = " << ++s1 * s2-- << endl;
11
14
19
21
23 cout << "8.0 - 3.0 * 4.0 + 5 / 7.0 = " << 8.0 - 3.0 * 4.0 + 5 / 7.0 << endl;
24 }
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
> Operatr
Kullanm:
[operand1] > [operand2]
Eer operand1 operand2'den kk ise 1 dndrr. Aksi taktirde 0 dndrr.
< Operatr
Kullanm:
[operand1] < [operand2]
Eer operand1 operand2'den byk ise 1 dndrr. Aksi taktirde 0 dndrr.
>= Operatr
Kullanm
[operand1] >= [operand2]
Eer operand1 operand2'den kk yada eit ise 1 dndrr. Aksi taktirde 0
dndrr.
<= Operatr
Kullanm
[operand1] <= [operand2]
Eer operand1 operand2'den byk yada eit ise 1 dndrr. Aksi taktirde 0
dndrr.
== Operatr
Kullanm
[operand1] == [operand2]
Eer operand1 operand2'den eit ise 1 dndrr. Aksi taktirde 0 dndrr.
!= Operatr
Kullanm
[operand1] != [operand2]
Eer operand1 operand2'den eit deil ise 1 dndrr. Aksi taktirde 0 dndrr.
Bit Baznda lem Yapan Operatrler Nelerdir?
Bu operatrler bit baznda ilemler gerekletirir. Bir bit'in deeri ya 0 yada 1'dir.
imdi bu operatrlere sra ile gz atalm.
& Operatr
Mantk kaplarndaki ve (and) kaps ile ayn ilemi gerekletirir.
Kullanm :
[operand1] & [operand2]
Eer iki operand'da 1 ise sonu 1'dir. Dier durumlar iin sonu 0'dr
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.
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]
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.
Mantksal Operatrler <Resim><Resim>
Nelerdir?
Bu operatrler mantksal durumlarda durumlar birletirmeye yarar.
imdi bu operatrlere sra ile gz atalm.
![operand1]
rnek
if( !operand1)
Kullanm :
rnek
*/
Kullanm :
operand1] || [operand2]
rnek
*/
}
Dier Operatrler <Resim><Resim>
Nelerdir?
u ana kadar grdmz operatrler C dilinde de bulunan operatrlerdi. imdi ise
dierlerinden farkl tarzdaki ve C++ ile gelen operatrlere gz atacaz. Bunlardan
C++'a ait olan operatrler C++ konularnn iine girdike daha detayl olarakta
anlatlacaktr. Bundan dolay u anda bu operatrlerin isimlerini verip geeceiz
:: Operatr
Scope Resolution operatr. Fonksiyonlar konusuna gz atnz.
* Operatr
Ynlendirme operatr. Gsterge (pointer)'larla birlikte kulanlyor.
& Operatr
Adres operatr. Gsterge (pointer)'larla birlikte kulanlyor.
& Operatr
Referans operatr. Fonksiyonlar konusuna gz atnz.
Pointer Operatrleri
Pointerlardan bahsedilince hemen aklmza *, & operatrleri gelir.
& operatr kendisinden sonra gelen ifadenin adresini bulur yani ".. nin adresi" olarak
ifade edebiliriz.
rnein &val ifadesi valin adresi anlamna gelir.
* operatr ise kendisinden sonra gelen pointerin gsterdii deeri refreans eder.
Yani .. nin gsterdii adresteki deer olarak ifade edilebilr. rnein *pVal ifadesi
pValin gsterdii adresteki deer olarak ifade edilebilir.
Tanmlama ve Kullanm ekilleri <Resim><Resim>
u ana kadar pointerlardan ve pointerlar ile birlikte anlan *, & operatrlerinden
ksaca bahsettik imdi artk C++da bahsettiimiz bu kavramlarn nasl
kullanldklarndan bahsedeceiz. Basit bir rnek ile ie balyalm.
#include <iostream.h>
main()
int val = 5;
int *pVal;
pVal = &val
*pVal = 8;
};
Ekran ktsndan da grld zere pVal deikeni hafzada ayr bir yer ayrlm
durumda ve bu ayrlan yere program ierisinde val deikenin adresi atanyor. val
deikeni ile direkt olarak hi bir ilem yaplmamasna ramen val deikenini dolayl
olarak gsteren pVal deikenini gsterdii adrese 8 deeri atandnda val
deikenin ierii de deiti.
Hafzann durumunu grafik olarak gsterirsek
Balangta aagdaki gibidir. pVal deikenin gsterdii adresteki bilgi hakknda bir
fikrimiz yok.
<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.
Aritmetik ilem operatrlerinin pointerlar zerindeki etkileri normal deikenlerin
zerindekinden farkldr. rnek olarak aadaki kodu inceliyelim.
#include <iostream.h>
main()
pIntVar = &intVar
};
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
intVar ve (intVar + 1) ifadelerinin deerleri kyaslanrsa (intVar + 1) ifadesinin
deerinin intVar ifadesinden bir fazla olduu grlr. Buraya kadar herey normal
fakat pIntVar ve (pIntVar + 1) ifadelerini kyaslarsak (pIntVar + 1) ifadesinin pIntVar
deikenin deerinden iki fazla olduunu grrz. Peki bunun nedeni nedir? Niden
bir, , veya drt deil de iki ?
Pointer deiknelerinin tanmn yaparken pointerlarn bir deikenin adresini
tutuunu sylemitik. Integer bir pointer hafzadaki bir integern bulunduu adresi
tutar. Bu adres bilgisini bir arttrmak bir sonraki integern bulunduu adrese gitmek
demektir. Bizim oluturduumuz proje 16 bitlik program retiyor dolaysyla integern
bykl 2 byte olarak kabul ediliyor. Yani bir sonraki integern bulunduu adrese
ulamak iin pointer deikenimizin ierdii deer iki arttrlyor. Ayn durum (- )
operatr iin de geerlidir. (-) operatrnde ise bir nceki integern adresine
konumlanlmaya allacaktr dolaysyla iki azaltlacaktr.
Olay genelletirirsek herhangi bir tipte tanmlanm bir pointern deerini belli bir m
deeri kadar arttrmak deikenin deerinde (pointerin tanml olduu tipin uzunluu)
* m kadar bir artma sebep olur.
include
main()
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
Fakat pA = pB satr ok masumane bir atama ilemi gibi grnmesine karn ska
bir hataya karlk geliyor.
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
deikeninin gsterdii hafza blgesini serbest brakmaya alyor. Burada sorun
yok gerekten de bu blgeyi program banda dinamik olarak ayrdk. Fakat pB
pointer da ayn adresi gsteriyordu o da ayn blgeyi serbest brakmaya alacak.
Ama zaten oras serbest brakld. O blge artk bize ait deil ki bu durumda ne
olacak. ? Kim bilir ? Byk bir ihtimalle makinamz kitlenecektir.
Buradan karacamz sonu pointer deikenleri kullanrken dikkatli olmamz
gerektiidir
Bir fonksiyon iinde kullanlan yerel deikenler otomatik olarak yaratlr. Bu ekilde
tanmlanan deikenlere derleyici tarafndan bir ilk deere verilmez, bu deiken
pointer tipindeyse gsterdii adresin ne olaca nceden kestirilemez. Bu deer
iletim sisiteminin bulunduu blgelerden birinin adresi olabilecei gibi o an iin
kullanlmayan bir hafza blgesinin adresi de olabilir. Dolaysyla ilk deer atanmam
pointer (global ve statik deikenlere derleyici tarafndan ilk deer atanr)
deikenlerinin gsterdii hafza blgesine deere atama ileminin davran
belirsizdir. Hi bir sorun kmayayabilecei gibi makinann kitlenmesine de sebep
olabilir. Kimbilir?
Tip Dnmleri <Resim><Resim>
Pointerlar nceki konularda da ifade edildii gibi bir hafza adresinin deerini
tutarlar. Pointerlarn tanmlandklar tip gsterdikleri yerde bulunan veri tipi ile
dorudan alakaldr. Aadaki rnek program pointerlarn tipleri ile gsterdikleri
veriler arasndaki ilikiyi net bir ekilde ortaya koymaktadr.
#include <iostream.h>
main()
int i= 5;
double d = 1213;
};
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
deikenin adresi olduunu bildirerek hata vermesinin engelliyoruz. Artk mesuliyeti
tamamen zerimize alm durumdayz.)
Ekrana sras ile d deikenin, pInt deikenini gsterdii adresteki deeri ve pInt
deikenin gsterdii adresteki double deikenin deerleri sras ile yazdrlyor.
Aadaki ekran ktsnda da grld gibi pInt deikenin d deikenin adresini
gstermesine ramen derleyiciyi uyarmadmz iin derleyici pInt in gsterdii
adresten itibaren bir int boyutu kadarlk alandaki deeri int 'e evirir. d deikenin
ierdii deerin hafzadaki gsteriminde bizim deerlendirdiimiz ksmnda 0 deeri
bulunuyormu. pInt deikeni d deikenin adresigi gsteriyor dolaysyla gsterdii
adresteki deerin deikenin iindeki deer ile ayn olmal gibi bir yorum yaplabilir
Pointer aritmetii konusunda da belirttiimiz gibi derleyici pointerlar zerinde ilem
yaparken deikenin tip bilgisinden yararlanyor. Yukarda int int tipindeki bir pointer'a
double tipinde bir deikenin adresini atarken yaptmz gibi derleyici tekrar kandrp
sen int tipinde bir pointersn fakat gsterdiin adres bir double 'n adresi ona gre
davran diye biliriz. Aadaki ekran ktsnda da grld gibi pInt deikenini
double pointer' a cast edip ekrana yazdrdmzda doru deeri yazyor.
include <iostream.h>
parametre = 8;
*parametre = 8;
main()
int i = 100;
DegerIleCagirma(i);
PointerReferansIleCagirma(&i);
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
struct Kartvizit{
char ad[30];
char soyad[30];
char adres[255];
char evTel[11];
char isTel[11];
};
}
void F2(Kartvizit *kart)
}
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);
#include <iostream.h>
#include <conio.h>
struct Ogrenci{
char Ad[20];
char Soyad[20];
char OkulNo[20];
char Adres[255];
char KayitTarihi[11];
};
void EkranaYaz(Ogrenci &ogr)
cout>>"Ad:">>ogr.Ad>>endl;
cout>>"Soyad:">>ogr.Soyad>>endl;
cout>>"OkulNo:">>ogr.OkulNo>>endl;
cout>>"Adres:">>ogr.Adres>>endl;
cout>>"KayitTarihi">>ogr.KayitTarihi>>endl;
cout>>"Ad:";
cin<<ogr.Ad;
cout>>"Soyad:";
cin<<ogr.Soyad;
cout>>"OkulNo:";
cin<<ogr.OkulNo;
cout>>"Adres:";
cin<<ogr.Adres;
cout>>"KayitTarihi";
cin<<ogr.KayitTarihi;
MenuFuncPointer islemler[2];
void Menu()
clrscr();
cout>>endl;
void main()
islemler[0] = Oku;
islemler[1] = EkranaYaz;
Ogrenci temp;
int secim = 4;
while (secim != 2)
Menu();
cin<< secim;
}
Yukardaki rnek programda geriye deer dndrmeyen ve Ogrenci yaps
referans tipinde parametre alan fonksiyonlar iin MenuFuncPointer isminde bir
fonksiyon pointer tipi tanmlanyor. Bu tipte fonksiyon pointerlar ieren iki elemanl dir
dizi tanmlanyor. Dizinin elemanlarna srasyla Oku ve EkranaYaz fonksiyonlarn
adesleri atanyor. Klavyeden kullancnn girdii seeneklere gre ilglir komutu iliyor.
Diziler <Resim><Resim>
Genel Olarak Diziler
ok Boyutlu Dizler
Genel Olarak Dizler <Resim><Resim>
Diziler ayn isim ile eriilen deikenler kmesi olarak adlandrlabilir. Dizinin her
elemanna index bilgisi ile ulalr. Genel olarak bir dizi tanmlamas aadaki gibidir.
Tip dizi_ismi[boyut1][boyut2].[boyutN] Tip Kullanc tanml veya standart C++ veri
tiplerinden bir.
dizi_ismi C++ deiken tanmlama kurallarna uygun olan herhangi bir deiken ismi
boyut Dizinin ka eleman ierecei
Cdeki dizi kavram dier dillerdekinden biraz farkldr. rnein basic de
Dim I as integer
Input("Bir sayi giriniz") ,I
Dim d(I) as integer eklinde bir program kodu gayet doaldr. Yukardaki
programda d dizisinin boyutu dardan girilir. Dizinin boyutu alma zamannda
belirlenir. Ayn kodu Cde standart dizi tanmlamalarn kullanarak yapamazsnz. Cde
tanmlanan tm dizilerin boyutlarnn derlenmesi esnasnda bilinmesi gerekmektedir.
Derleyici diziler iin statik olarak hafzadan yer ayrr. C de boyutu nceden
bilinmeyen diziler tanmlamak mmkn deil mi? sorusu gndeme gelebilir.
Mmkndr. Byle diziler tanmlanabilir fakat basic kodu rneindeki gibi deil. Bu tip
diziler iin gerekli yer dinamik olarak program almas esnasnda oluturulur. Bu
ynteme daha sonra deyineceiz.
Dizi tanmlarnda belirtilen boyut dizinin ka elemanl olacan ifade eder. Baz
dillerdeki gibi son elemann indisini belirtmez. Aada 5 elemanl bir int dizi
tanmlamas verilmitir. Geerli olan son dizi eleman iArray[4] 'tr. iArray[5] ifadesi
dizinin ardndaki ilk hafza elemann gsterir. int iArray[5]; Cde dizilerin boyut
kontrol yoktur. Dizinin ilk elemannda nceki veya son elemanndan sonraki bir
hafza biriminin referans edimesi BASICde olduu gibi yorumlanma veya derlenme
esnasnda kontrol edilmez. Bu kontrol programcya braklmtr.
Aada rnek programda ilk giren ilk kar mantyla alan yn veri yaps dizi
kullanarak gerekletirilmitir.
#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 Menu();
main()
while(1)
switch (Menu())
int numberToAdd;
cin<<numberToAdd;
if (!Push(numberToAdd))
cout>> "Yigin Dolu">>endl;
break;
int popedNumber;
if (!Pop(popedNumber))
else
break;
case 3: // Listele
break;
case 4: // yky?
exit(0);
break;
}
return 0;
int Menu()
int choice = 0;
cout.flush();
cin<<choice;
};
cout>>endl;
cout.flush();
return choice;
if (itemsInStack == Max_StackLen)
return 0;
intStack[itemsInStack] = number;
itemsInStack++;
return -1;
if (itemsInStack == 0)
return 0;
itemsInStack--;
number = intStack[itemsInStack];
return -1;
<Resim>Peki ilk giren ilk kar mantyla alan Kuyruk veri yapsn diziler
araclyla nasl gerekletirebiliriz? zmlerinizi bekliyoruz.Cevaplarnz
cpp@programlama.com adresine yollayabilirsiniz.
Diziler le Stringler Arasndaki liki <Resim><Resim>
C/C++da stringler son elemanlar null terninator ( \0 )) olan belirli uzunluktaki
karakter dizileri olarak tanmlanr. Tanmdan da anlalaca zere Stringler ile bir
boyutlu diziler arasnda ok sk bir ba vardr. C dilinde stringler iin bir veri tipi
tanmlanmamasna karn string sabitleri iin bir veri tipi vardr. Bir string sabiti ift
trnak arasnda verilmi karakterler listesidir.
"rnek bir string "
String sabitlerinin sonuna null terminator eklenmesine gerek yoktur. C derleyicisi
bizim yerimize otomatik olarak bu ii yapar.
char mesaj[255];
int array[5];
*array = 2;
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.
cout>>"array[">>i>>"]=">>array[i]>>endl;
getch();
return 0;
array[0]=0
array[1]=1
array[2]=2
array[3]=3
array[4]=4
*(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.
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]);