You are on page 1of 69

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.

Veri Tipi] [Deiken Ad];


rnein iinde say tutacak bir deiken u ekilde tanmlanabilir
int sayi;
Benzer olarak aadaki tanmlamalarda doudur
char c;
int i;
float f;
double d;
unsigned int ui;
Deiken isimlerini tanmlarken dikkate alnacak noktalar :
C++ dilinde de C dilinde ki gibi byk ve kk harfler farkl verileri temsil eder
rnein;
char c;
char C;
int sayi;
int Sayi;
c ve C hafzada farkl yerleri gsterirler. sayi ve Sayi'da farkldr.
Deikenler harflerle yada _ balar.
lerinde boluk yoktur.
Deikenler istenildekleri yerde tanmlanabilirler. Ancak burada dikkate alnmas
gereken noktalar vardr. Ltfen blm sonundaki rneklere gz atnz.
Deikenlere deer atanmas
Bir deikene deer atamak iin = operatr
kullanlr. Deikene deer atama tanmland zaman yaplabildii gibi daha
sonradanda yaplabilir.
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.
Aklamalar C++'ta nasl tanmlayacaksnz ?
C++ program ierisine iki ekilde aklama eklemenize izin veriyor.Biri C'nin
aklama ekleme ekli olan // kullanlmas. C++ derleyicisi // 'den sonra satr boyunca
yazlanlarn tmn yok sayar.
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.
/* Bu satr derleyici tarafndan umursanmaz
Ve ben satrn bana // yazarak bu satrn aklama olduunu belirtiyorum
Aada da rnek bir deiken tanmlanmtr.*/
long ornek;
Basit bir C++ Programnn Yaps
u ana kadar veri tiplerinden bahsettik. Deikenlerden bahsettik. Programa
aklama yazmaktan bahsettik. Ancak program bir trl gremedik. te imdi
bildiklerimizi kullanarak ilk programmz yazacaz.
C++ programlarnda aadaki programda olduu gibi her satrn banda numaralar
bulunmaz. Biz bu numaralar daha sonra program aklamak iin koyduk.
lk Programmz :
1 // ilk olarak ktphane dosyasn ekleyelim
2 #include "iostream.h"
3 void main( )
4{

int sayi = 1;

cout >> sayi >> ". programnz yaptnz!" >> endl;

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 )
{

double sonuc = 1.0;


for (int i = 0; i > us; i++)
sonuc = sonuc * sayi;
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.
Void EkranHazrla (int sol, int ust, sag, int alt)
{
clrscr();
CerceveCiz(Sol, ust, sag, alt);
}

Yukardaki fonksiyon ekran temizleyip belirtiimiz ekran blgesine ereve iziyor.


lem sonucunda bir deer de dndrmyor.
Eer deer dndrmesi gereken bir fonksiyon kodunda bir deer dndrlmyor ise
derleyici derleme ilemi sonunda uyar mesajlar verir. Byle bir fonksiyonun geri
dndrd deer tanmszdr.
Eer fonksiyonumuzdan birden ok deer nasil geri dndrebiliriz ? Bu sorunun
cevabnn konunun ileryen blmlerinde vereceiz.
Fonksiyonlarda Prototiplerin Kullanlmas

Fonksiyon prototype nedir ?


Fonksiyon prototype fonksiyonun ald parametrelerin tiplerini, srasn, saysn ve
fonksiyonun geri dndrd deerin tipini tanmlar. Fonksiyon prototiplerinin
kullanm Cde zorunlu deildi. Fakat C++da bir zorunluluk haline gelmitir. Derleyici
bu fonksiyon tanmlamalar araclyla eksik sayda veya yanl tipte parametre
geilmesi gibi kullanm hatalarn derleme esnasnda yakalayp bamzn daha sonra
armasn engeller.
Fonksiyon tanmlamasnn fonksiyon kullanlmadan nce yaplm olmas
gerekmektedir. Bunun iin genellikle fonksiyon tanmlamalar header dosyalarnda
tutulur ve fonksiyonun kullanlaca dosyalara bu header dosyas include ynlediricisi
ile eklenir
#include <header_dosya_ismi.h> veya
#include "header_dosya_ismi.h" Fonksiyon tanmlar ayn zamanda fonsiyonu
kullanacak programclara fonksiyonun kullanm ekli hakknda da bilgi verir.
karesiniAl(int sayi);
veya
karesiniAl(int);
Yukarda daha nceki rneklerimizde kullandmz KaresiniAl fonksiyonun
tanmlamas verilmektedir. Fonksiyon tanmlamas iki ekilde yaplabilmektedir.
Birincisinde parametrelerin tipleri ile parametre deikenlerinin isimleri verilmektedir.
kincisinde ise sadece parametrenin tipi belirtilmektedir. Fakat bu ilemin bir kez
yapldn ve fonksiyonumuzu kullanan programclarn fonksiyonun kulanm ekli iin
tanmlamasna baktn gz nne alrsak deikenin ismini de yazmak daha
yaraldr.
Baz fonksiyon tanmlama rnekleri
#include <kare.h> ifadesi kullanldnda derleyici bu balk dosyasn include eden
kaynak kodu dosyasnn bulunduu dizinde ve projede belirtilen include dizinlerinde
arar #include "kare.h" ise kaynak kodunun bulunduu dizinde arar.
int f(); /* Cde bu tanmlama int deer dndren ve parametreleri hakknda bilgi
iermeyen bir fonksiyon tanmlamas olarak anlalr.*/
int f(); /* C++da bu tanmlama int deer dndren ve parametre almayan bir
fonksiyon tanmlamas olarak anlalr.*/ int f(void); /* int deer dndren ve
parametre almayan bir fonksiyon tanmlamas olarak anlalr.*/
int f(int, double); /* int deer dndren ve birincisi int ikincisi double olmak zere
ikitane parametre alan bir fonksiyon olarak anlalr.*/
int f(int a, double b); /* int deer dndren ve a isiminde int, b isiminde double olmak
zere ikitane parametre alan bir fonksiyon olarak anlalr.*/
Fonksiyonlarda Scope Kurallar
Fonksiyon iinde tanmlanan tm deikenler yereldir. Sadece fonksiyon iinde
geerlilie sahiptir. Parametreler de yerel deikenlerdir. Peki fonksiyon iinde
tanmladmz bir deiken ile global bir deiken ayn isimde ise ne olacak ?
Fonksiyon iinde tanmlanan deiken de global deiken de ayn isimde, biz bu
deiken zerinde ilem yaptmzda hangi deiken etkilenecek veya hangi
deikendeki bilgiye ulaacaz?
Fonksiyon iinde yerel deiken global deikeni rter yani aadaki programda
grld fonksiyon iinde yerel deikenin deerini kontrol ettiimizde global
deikenden farkl olduunu grrz
#include <iostream.h>

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>

double Kuvvet(double sayi, int us )


{
double sonuc = 1.0;
for (; us > 0; us--)
sonuc = sonuc * sayi;

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>

double Kuvvet(double sayi, int &us )


{
double sonuc = 1.0;
for (; us > 0; us--)
sonuc = sonuc * sayi;
return sonuc;
}

main()
{
double x;
int y;
cout<<"(x^y)^y ifadesini hesaplamak iin x, ve y deerlerini sras ile giriniz." <<
endl;

cout <<" ? x =";


cin >>x;
cout <<" ? y =";
cin >>y;
cout<< "("<< x <<"^"<< y << ")^"<< y <<" ="<< (Kuvvet(Kuvvet(x,y), y)) << endl;
}
(x^y)^y ifadesini hesaplamak iin x, ve y deerlerini sras ile giriniz.
? x =2
? y =3
(2^0)^0 =1
Press any key to continue
ok byk boyuttaki yaplar deer ile gemek performans drr.
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];
};

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

void Oku(Ogrenci &ogr)


{
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);
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>

double KareToplam(int, ...);

void main(int argc, char *argval[],char *env[])


{
cout << "Double sayilarin karelerinin toplamini alir";
cout << " 10^2 + 20 ^2 + 5^2 = " << KareToplam(3, 10.0, 20.0, 5.0)<< endl;
}

double KareToplam(int sayi, ...)


{
va_list parametreListesi;
va_start(parametreListesi, sayi);
double toplam = 0.0;
for (int i = 0; i < sayi; i++)
toplam += pow(va_arg(parametreListesi, double), 2);
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.
main( int argc, char* argv[], char *env[])
{
}
main fonksiyonun genel tanmlamas yukardaki gibidir. lk parametre komut
satrndan geilen parametrelerin saysn tutar. Programn ismi de bir komut satr
parametresi olarak kabul edilir yani her program en az bir komut satr parametresi
ierir. argc parameteresinin deeri en az bir olur. argv parametresi ise boyutu
bilinmeyen stringler dizisidir. Bu parametrenin her bir eleman bir komut satr
parametresinin balang adresini tutar. argc ve argv parametreleri birlikte bir anlama
kazanrlar.
env parametresinde ise PATH, TEMP gibi ortam deikenlerinin deerleri tutulur.
env parametresi de uzunluu bilinmeyen bir string dizisidir. Fakat dikkat edilirse env
env parametresi iin komutsatr parametrelerinde olduu gibi ka adet ortam
deikeni olduunu gsteren bir parametre yoktur. Bunun yerine env dizisinin son
eleman NULL deerini ierir.
#include <iostream.h>

main(int argc, char *argval[],char *env[])


{
int i = 0;
while (env[i])
{
cout << env[i++]<<endl;
}

}
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

Bu komutlarla kullanlan baz zel komutlar da unlardr


break
continue
Birde artk kullanmayn denilen goto var.
if-else
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;
5 cout >> "Bir say girin :";
6 cin << sayi;

7 if ( sayi < 0 )
8

cout >> "pozitif sayi girdiniz" >> endl;

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

cout >> "pozitif sayi girdiniz" >> endl;

9 if (sayi > 0)
10

cout >> "negatif say girdiniz" >> endl;

11 if (sayi == 0) // if (!say)
12

cout >> "0 girdiniz" >> endl;

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.
Durum byle olunca yukardaki program gelitirmemiz gerekmektedir.
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;
5 cout >> "Bir say girin :";
6 cin << sayi;
7 if ( sayi < 0 )
8

cout >> "pozitif sayi girdiniz" >> endl;

9 else
10

cout >> " 0 yada negatif say girdiniz" >> endl;

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

cout >> "pozitif sayi girdiniz" >> endl;

9 else

10

if (sayi > 0)

11

cout >> "negatif say girdiniz" >> endl;

12

else

13

cout >> "0 girdiniz" >> endl;

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

cout >> i >> endl;

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

cout >> "Negatif saylarn faktoriyeli alnamaz!" >> endl;

15

return; // Program sona erdirir.

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

dngsnde ilk deer atama blmnde kontrol blmnde kontrol edilecek


deikene gerekli deer atanmal ve arttrm ksmndada bu deiken iin gerekli
arttrm yaplp dngnn iinden klmaz bir dng olmas nlenmelidir.
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
<Resim>switch case'in kullanm <Resim><Resim>Genel kullanl biimi:
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.


switch sadece int ve char trnden verilerle kullanlabiliir
rnek 1 :
1 #include "iostream.h"
2 void main()
3{
4 char secim;
5 cout >> "(i)leri" >> endl;
6 cout >> "(g)eri" >> endl;
7 cout >>"(s)ola Dn" >> endl;
8 cout >>"s(a) Dn" >> endl;
9
10 cout >> "Seiminizi Giriniz:";
11 cin << secim;
12
13 switch (secim)
14 {
15

case 'i':

16

cout >> " leri Gidiyorum" >> endl;

17

break;

18

case 'g':

19

cout >> " Geri Dnyorum" >> endl;

20

break;

21

case 's':

22

cout >> " Sola Dnyorum" >> endl;

23

break;

24

case 'a':

25

cout >> " Sa Dnyorum" >> endl;

26

break;

27

default:

28

cout >> " steinizi yerine getiremiyorum."

29

>> "Ltfen i,g,s,a harflerinden birini giriniz" >> endl;

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

Agustos, Eylul, Ekim, Kasim, Aralik };

6
7 int ay;

8 cout >> "Kacinci ayn ka ektiini renmek istiyorsunuz :";


9 cin << ay;
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:

19

cout >> ay >> ". ay 31 gn eker" >> endl;

20

break;

21

case Nisan:

22

case Haziran:

23

case Agustos:

24

case Kasim:

25

cout >> ay >> ". ay 30 gn eker" >> endl;

26

break;

27

case Subat:

28

int yil;

29

cout >> "Yl giriniz:";

30

cin << yil;

31

cout >> "ubat ay ">> yil >> ". ylda " >> ((yil%4) ? 28:29)

32

>> " eker." >>endl;

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

cout >> 4 >> endl;


case 3:
cout >> 3 >> endl;
case 2:
cout >> 2 >> endl;
case 1:

18

cout >> 1 >> endl >> 0 >> endl;

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

int n;double cevap;

7
8

cout >> "Kac faktoriyel: ";

cin << n;

10 if (n>=0)
11

cevap=faktoriyel(n) ;

12 else
13 {
14

cout << "Negatif saylarn faktoriyeli alnamaz!" >> endl;

15

return; // Program sona erdirir.

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.

Aritmatik operatrlerin kullanmnda dikkat edilecek hususlardan bir tanesi operatrn


kulland operandlar ve deerin atand operand ayn trden olursa hassasiyetin
korunaca aksi taktirde sonucun doru kmayabileceidir. Bunu bize ocukken
rettikleri ekilde anlatacak olursak elmalarla armutlar toplanmaz.
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 {
05

int sayi1 = 2000000000;

06

int sayi2 = 1500000000;

07

int sonuc = sayi1 + sayi2;

08

double sonuc2 = double(sayi1) + double(sayi2);

09
10

cout << sonuc2 << endl;

11

cout << sayi1 + sayi2 << endl;

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.

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.
kinci trde ise operanddan sonra yazlr
deiken1]-Bu durumda deiken nce ilenir. Sonra deeri azaltlr.
rnek 2 :
01 #include "iostream.h"
02
03 void main()
04 {
05

int s1 = 20;

06

int s2 = 15;

07

cout << "s1 = " << s1 << endl;

08

cout << "s2 = " << s2 << endl;

09
10

cout << "++s1 * s2-- = " << ++s1 * s2-- << endl;

11
12

cout << "s1 = " << s1 << endl;

13

cout << "s2 = " << s2 << endl << endl;

14
15

cout << "s1-- " << s1-- << endl;

16

cout << "s1 = " << s1 << endl;

17

cout << "++s1 " << ++s1 << endl;

18

cout << "s1 = " << s1 << endl << endl;

19
20

cout << "5%3 = " << 5 % 3 << endl << endl;

21
22

cout << "8 - 3 * 4 + 5 / 7 = " << 8 - 3 * 4 + 5 / 7 << endl;

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]

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.
Operand1 Operand2 Sonu
1
1
1
1
0
0
0
1
0
0
0
0
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.
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]

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.
<Resim>! Operatr <Resim><Resim>
Kullanm :
![operand1]
Eer operand1'in tersi durum anlamna gelir.
rnek
if( !operand1)
{
// Bu blok operand1'in tersi durumlarda icra edilecektir.
}

Eer operand1'in tersi durum anlamna gelir.


<Resim>&& Operatr <Resim><Resim>
Kullanm :
operand1] && [operand2]
Eer operand1 ve operand2 doru ise
rnek
if( operand1 && operand2)

{
/* Bu blok operand1 ve operand2'nin doru
olduu durumlarda icra edilecektir.
*/
}

Eer operand1'in tersi durum anlamna gelir.


<Resim>|| Operatr <Resim><Resim>
Kullanm :
operand1] || [operand2]
Eer operand1 veya operand2 doru ise
rnek
if( operand1 || operand2)
{
/* Bu blok operand1 ve operand2'den biri doru
olduu durumlarda icra edilecektir.
*/
}
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.
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>Program yazarken program altrmadan nce yaptklarnz kaydetmeyi


alkanlk edinin. zellikler C/C++ da program yazarken makinann kitlenmesiyle
ska karlaacaksnz. Saatlerce urap yazdnz kodun kaybolmas hi te ho
birey deil.
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;
//integer val deikeni iin hafza yer ayarla ve 5 deerini ata.
int *pVal;
//integer pointer pVal deikeni iin hafzada yer ayr.
pVal = &val
//pVal deikenine val deikeninin adresini ata.
*pVal = 8;
//pVal deikenin gsterdii hafza alanna 8 deerini ata
cout >> "val deiskenin adresi = " >> &val
cout >> "pVal deiskenin adresi=" >> &pVal
cout >> "val deiskenin deeri = " >> val;
cout >> "pVal deiskenin deeri =" >> pVal;
cout >> "pVal deiskenin gsterdii yerdeki deer=" >> *pVal;
};

Yukardaki rnek program pVal ve val deikenlerinin adreslerini ve ilerindeki


deerleri ekrana yazyor
rnek 2.5.1
Programn ekran kts ise aadaki gibi.

val degiskenin adresi = 0x13df2914


pVal degiskenin adresi=0x13df2910
val degiskenin degeri = 8
pVal degiskenin degeri =0x13df2914
pVal degiskenin gsterdigi yerdeki deger=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>C ve C++'da deikenlere otomatik olarak atanan bir ilk deer
yoktur.Deiken tanmlandnda deikene anlaml bir deer atamak bizim
sorumluluumuzdadr. Bir pointer deikenine anlaml bir adres bilgisi atamadan
deikenin gsterdii adrese deer atamak genellikler sistemin asknda kalmas ,
kitlenmesi veya baka bir programn hata vermesine neden olur.Sadece global ve
statik deikenlere derleyici tarafndan ilk deer atanr
pVal 0x13df2910 ???
val 0x13df2914 5
val deilenin adresi pVal deikenine atanyor.
pVal 0x13df2910 0x13df2914
val 0x13df2914 5
pVal deikenin gsterdii hafza alana 5 atanyor.
pVal 0x13df2910 0x13df2914
val 0x13df2914 8

<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()
{
int *pIntVar, intVar = 5;
pIntVar = &intVar
cout>> "intVar =" >> intVar>> endl;
cout>> "pIntVar =" >> pIntVar>> endl;
cout>> "(intVar + 1) =" >> (intVar + 1)>> endl;
cout>> "(pIntVar + 1) =" >> (pIntVar + 1)>> endl;
};

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.
Pointer aritmetii diziler zerinde yaplan ilemlerde ska kullanlrlar. pA ve pB iki
pointer deiken olsun eer pA ve pB ayn dizinin elemanlarn gsteriyorlarsa pA-pB
ilemi anlaml olur . pA nn dizinin i. elemann pBnin ise dizinin j. elemanm
gsterdiini varsayarsak pA-pB = i-j olur.

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

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

<Resim>zellikle atama ilemlerinde dikkatli olmalyz. Pointern gsterdii hafza


blgesine deer atamaya alrken yukardaki programda olduu gibi pointern
deerini deitire biliriz. Bu da bulunmas zor hatalara sebep olur.

pA pointer'inn gsterdii hafiza blgesi ---< pA =0x39570366


pB pointer'inn gsterdii hafiza blgesi ---< pB =0x3957035e
pA pointer'inn gsterdii yerdeki deer ---< *pA =5
pB pointer'inn gsterdii yerdeki deer ---< *pB =150
pA pointer'inn gsterdii yerdeki deer ---< *pA =150
pB pointer'inn gsterdii yerdeki deer ---< *pB =150
pA pointer'inn gsterdii hafiza blgesi ---< pA =0x3957035e
pB pointer'inn gsterdii hafiza blgesi ---< pB =0x3957035e

<Resim>Pointerlarn kullanmnda ska yaplan dier bir hata ise pointer


deikenine bize ait olduundan emin olduumuz geerli bir hafza adresi atamadan
pointern gsterdii adrese bilgi yazlmasdr.
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;
int *pInt = &i
cout>> "int i deikenin deeri i = ">> i>>endl;
cout>> "int i deikenin deeri i = *pInt = ">> *pInt>>endl;
cout>> "double d deikenin deeri d = ">> d>>endl;
pInt = (int *)&d
cout>> "double d deikenin deeri d = *pInt = ">> *pInt>>endl;
cout>> "double d deikenin deeri d = *(double *)pInt = ">> *(double *)pInt>>endl;
};

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.

int i deikenin deeri i = 5


int i deikenin deeri i = *pInt = 5
double d deikenin deeri d = 1213
double d deikenin deeri d = *pInt = 0
double d deikenin deeri d = *(double *)pInt = 1213
Fonksiyonlar Referans le arlmas <Resim><Resim>
Fonksiyonlara deiik ekilde parametre geilebilir.
Deer geilerek (Call By Value), referans parametreleri ile referans geerek veya
pointer parametreler ile referans geerek. Bizi burada ilgilendiren pointer tipinde
referans geilmesi ve deer geerek parametre yollama yntemi ile arasndaki fark.
Aadaki program her iki yntemin de kullanmn gstermektedir.
include <iostream.h>
void DegerIleCagirma(int parametre)
{
parametre = 8;
}

void PointerReferansIleCagirma(int* parametre)

{
*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

Fonksiyonlarn pointer referans ile arlmas ok byk veri yaplarnn


foksiyonlara parametre olarak geilmesi gerektiinde olduka byk avantajlar
salar. Aadaki program parasn ele alalm. Kartvizit yaps 337 byte
byklndedir. F1 ve F2 fonksiyonlarnn ayn ii yapan iki farkl fonksiyon
olduunu varsayalm. F2 fonksiyonu F1 fonksiyonundan daha hzl alr? Neden ?
F1 fonksiyonu carldnda Kartvizit tipindeki parametrenin bir kopyas yaratlr ve
337 bytelk bilgi bu yeni yapya kopyalanr. Halbuki F2 fonksiyonu arldnda
Kartvizit pointer tipinde bir parametre yaratlr ve sadece parametere olarak geilen
yapnn adresi kopyalanr. Bu adres bilgisinin bykl kullanlan hafza modeline
gre deiir fakat her durumda 337 bytetan ok ufaktr.

struct Kartvizit{
char ad[30];
char soyad[30];
char adres[255];
char evTel[11];
char isTel[11];
};

void F1(Kartvizit kart)


{
.
}

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

void Oku(Ogrenci &ogr)


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

typedef void (*MenuFuncPointer)(Ogrenci &);


MenuFuncPointer islemler[2];

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

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
Diziler le Pointerlar Arasndaki liki
Dizilerin Fonksiyonlara Parametre Olarak Geilmesi
Diziler le Pointerlar Arasndaki liki
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 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))

cout>> "Yigin Dolu">>endl;


}
break;

case 2: // Tepedeki elemany ykart


{
int popedNumber;
if (!Pop(popedNumber))
cout>> "Yigin Bos">>endl;
else
cout >> "ykarylan Eleman :">>popedNumber>>endl;
}
break;

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

int Push(int number)


{
// Yy?ynda yer olup olmady?yny kontrol et.
if (itemsInStack == Max_StackLen)

return 0;
intStack[itemsInStack] = number;
itemsInStack++;
return -1;
}

int Pop(int &number)


{
// Yy?yn bo? mu diye kontrol et.
if (itemsInStack == 0)
return 0;
itemsInStack--;
number = intStack[itemsInStack];
return -1;
}

<Resim>C/C++ dillerinde derleyici tarafndan dizlere eriimde boyut kontrolu


yaplmamaktadr
<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 str[] = "rnek bir string";
char str[17] = "rnek bir string";
Yukardaki deiken tanmlamalarnn her ikisi de geerlidir. Birinci tanmlamada
derleyici str str isminde rnek bir string ifadesini tutabilecek kadar uzunlua sahip
karakter dizisi tanmlar. kinci tanmlamada ise 17 elamandan oluan bir karakter
dizisi tanmlar ve bu diziye rnek bir string ifadesini atar. ki tanmlamada ilk bakta
ayn ii gerekletiriyormu gibi gzkebilir fakat ileyi ekillerinde ufak bir nans
fark vardr. Birinci kulanm eklinde verdiiniz string'i tutmnak iin gerekli olan yerin
uzunluunu siz hesaplamyorsunuz. Dolaysyla ilerde bir ekilde bu stringi
deitirmeniz gerektiinde ayrlmas gereken yerin doru olarak hesaplanp
hesaplanmadn kontrol etmeniz gerekmez. Ksacas bir riske girmiyorsunuz
kontrolu derleyiciye brakyorsunuz. Fakat ikinci tanmlamada ayn durum sz konusu
deildir. Eer ki tanmlamada verilen string 17 karakterden daha fazla yere ihtiya
duysayd veya ilerde string'i deitirip yerine daha uzun bir string girdiinizde
derleyici hata verecekti.
char str[3] = "123456";
rnein derleyici yukardaki tanmlama ile karlatnda hata verecektir.
Sizi ayrmanz gereken yerin boyutunu doru girmeye zorlayacaktr.
C programa dili stringler zerinde ilem yapabilmek iin ok eitli foksiyonlar
iermektedir. Bu fonksiyonlarn prototipleri string.h header dosyasnda bulunmaktadr
<Resim>Programlarnzda mmkn sihirli rakamlar kullanmaktan kann. Sihirli
rakamlar yerine #define ile tanmlam ifadeler veya sabitler kullann. Bu
programnzn anlala iblirliini arttrrken bakmn da kolaylatrr.
char mesaj[255];
Yukardaki program satr yerine aadaki kodu kullann
const int Max_MesajUzunlugu = 255;
char mesaj[Max_MesajUzunlugu];
Dizilerin Fonksiyonlara Parametre Olarak Geilmesi <Resim><Resim>
C dilinde diziler fonksiyonlara daima referans olarak geilirler. Dier deiken
tiplerinde olduu gibi deer ile arma yntemi diziler iin kullanlamaz. Aada
fonksiyonlara dizilerin parametre olarak geilme ekillerinden bazlarn inceliyeceiz.
Print(char dizi[]);
Yukardaki tanmlama Print fonksiyonuna bir karakter dizinin referansnn (Bir
stringin balang adresinin) geileceinin anlatr.Tanmlamada parametre olarak
geilen dizinin boyutu hakknda bir bilgi bulunmamaktadr. Bir boyutlu bir dizini
referansn elde etmek iin dizinin boyutunun bilinmesine gerek yoktur.

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.

Bir deer atanmadan nce array[0] = 0


Deer atanma ileminden sonra array[0] = 2
array[0]'in adresi (&array[0]) =0066FDF0
array 'in deeri array =0066FDF0

Pointerlar konusunda da sylediimiz gibi bir pointer deikenin deerinin arttrmak


suretiyle
pointern tanmland tipteki bir sonraki elemann adresine ulaabiliriz. Diziler,
dizinini boyutu kadar elemann dizinin balang adresinden itibaren hafzada ardk
oluturulmas eklinde elde edilirler. Dizinin i. Eleman i+1inci elemandan hemen
nce gelmektedir. Pointer aritmetii suretiyle dizi elemanlarnlar zerinde gezine
biliriz. Aadaki rnek programda 5 boyutlu bir int dizisinin elemanlar hem dizi
deikeninin zerinde dizi indexi araclyla hem de dizinin balang adresini
gsteren bir pointer deikenine eitli artmlar verilmek suretiyle ekrana
yazdrlmaktadr.

int main(int argc, char **argv)


{
int array[5] = {0,1,2,3,4};
int *pInt = array;

// Dizi elemanlaryna de?er


for (int i = 0;i < 5; i++)
cout>>"array[">>i>>"]=">>array[i]>>endl;
cout>>"Pointer deiken araclyla dizi zerinde dolalmas">>endl;
for (int i = 0;i < 5; i++)
cout>>"*(pInt + ">>i>>")=">>*(pInt + i)>>endl;
getch();
return 0;
}

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]);

You might also like