You are on page 1of 27

TEMEL BILGILER

C++ bilindii gibi programlama dnyasnda en ok ilgi gren C dilinden tremitir. C++'i klasik C dilinden farkl yapan yani; Nesne Ynelimli Programlamay da ( Objece Oriented Programming) C'nin szdizimi kurallariyla birlikte desteklemesidir. Normalde C ile sadece yapisal programlama yaparken C++ dili ile hem yapisal hem de nesne ynelimli programlar yazabilirisiniz. C++ diline baslarken nce dilin C'den gelen ve temel olan zelliklerini grenmek gerekir. rnegin, degisken tanimlama, atama ve diger basit aritmektik islemler, kontrol yapilari ve dngler gibi. Teknolojinin ulastigi son noktadaki programlama dillerinden olan C ve C++, bir ok yeni ve gl zellikleri ierir. Derslerimiz devam ettike bunlarin teker teker iine girecegiz. C dilinin zelliklerinin %80 i C++'da da mevcuttur (bu karsilastirma sahsi grsmdr). Zaten C++, C'nin st gurubudur. Bunu syle siralayabiliriz. C, C++ ve C# dir. C dilinin avantajlari, az komut kmesinden olusmasi ve bu komutlarin diger yksek seviyeli dillere nazaran daha hizli alismasidir. Ayrica C deki ktphaneler sayesinde fonksiyon tanimlamaniza gerek kalmadan islemlerinizi yapmak mmkn olacaktir. Bu konuda ok detaya inmeden, programlamaya gemek istiyorum. nk, programlamaya basladigimizda her rnekten sonra o an kullandigimiz programin iinde geen fonksiyon, hata, degisken, belirleyiciler, kisitlamalar, notasyonlar v.s gibi bilgilerden ara ara bahsedecegim. Yalniz ok nemli olan bir konuya burada deginmek istiyorum. C nin avantajlarini programlamayla birlikte grmek gzel ama C nin dezavantajlarini programlamadan nce bilmeliyiz ki bunlardan sakinalim. ncelikle Tanimlayicilardan bahsetmek istiyorum. Her derleyici ve assmbley iin degiskenleri, sabitleri, etiketleri ve fonksiyon adlarini tanimlama kurallari vardir. Bu notasyonlara, tanimlayici denir. C++ da tm tanimlayicilar a, . . . , z - A, . . . , Z harfleri ile ya da alt izgi "_" ile baslar. Bundan sonra rakam, harf, ya da alt izgi kullanilabilir. ANCI C uyumlu derleyiciler 31 karaktere kadar tanimlayici kabul ederler fakat tanimlayicinin ilk sekiz karakterini kullanmayi kendimize aliskanlik etmeliyiz. Dikkat etmemiz gereken zelliklerden biri de kullandigimiz ifadelerdeki byk kk harflerdir. C ve C++ byk ve kk harf duyarliligina sahiptir. Kullandigimiz ifadeleri birbirinden farkl ve ayni ifade olarak kullaniyorsak programimiz hata verecektir. Bunu bir rnekle anlatayim: Program program PROGRAM Bu sekilde tanimlarsak hepsi birbirinden farkl ifadeler olarak C++ da okunacaktir. Biz Sunu aliskanlik edinmeliyiz; tanimlayicilarimizin bas harfi byk olacak. Byk ve kk harf kombinasyonlarinin kullanilmasi ile nceden yapilan tanimlamalar bazen isi zorlastirabilir. Eger bu degiskenlerden birini kullanmak isterseniz, bu zamana kadar nasil tanimladiginizi bilmeniz gerekir. rnegin printf()`in PRINTF() olarak agrilmasi durumunda " bilinmeyen tanimlayici " (Unknown identifier) hata mesaji vererek sizi uyarir. Buna benzer olarak %f ve %F kullanimi hata verdirecektir. Programlamay yaparken bunlara dikkat etmemiz gerekecek. nk bir degiskeni veya tanimlayiciyi basta nasil kullandiysaniz , drt sayfa kod yazdiktan sonrada ayni sekliyle kullanmak zorundasinizdir. Iste burada en byk handikap yasanacaktir. nk C/C++ derleyicileri her zaman hatanin nerde oldugunu gstermez. Bunu programci kendisi satir satir takip ederek bulacaktir. Bundan dolayi bu sylediklerime bastan dikkat etmemiz gerekiyor.

ILK RNEK
Ilk programimiz! // ilk1.cpp // Ekrana "Bu benim ilk programim" yazdiriyoruz #include <iostream.h> int main() { cout << "Bu benim ilk programim"; return 0; }
Simdi Yazdigimiz programi inceleyelim: "//" isaretini aiklama satirlarinda kullaniyoruz. C++ derleyicisi bu notasyonla baslayan satiri okumaz. Bununla birlikte daha uzun cmlelerimiz olursa bunlari da " /* */ " notasyonunun iinde yazicagiz. Bu zellik de C den bize kalma. Demistik zaten C `nin tm zelliklerini C++ ierir. Fakat biz genelde " // " yi kullanacagiz. #include : Bu bizim C++ da bulunan ktphane dosyamizi agirmaya yariyor. Ben size syle tarif edeyim. iostream.h ktphanesindeki hazir olan " cout " fonksiyonunu agiriyor. Yani buda bizim fazla kod yazmamiza engel oluyor. .h ile biten dosyalar ktphane dosyalaridir. Bunu suna da benzetebiliriz. Farz edelim ki elimizde bir alet antasi var iinden tornavidayi agirdigimizda vida sikacagizdir. Bu da ona benziyor. C++ da ki hazir ktphanelerde bir ok hazir fonksiyonlar vardir. Ilerde Bu hazir fonksiyonlar isimizi grmemeye baslayinca kendi ktphanemizi yapmaya baslayacagiz. Tabi bu seviyeye geldigimizde olayi hemen hemen kavramis olacagiz, tabi neden olmasin yle degil mi?

Daha sonraki satir her C++ programinda mutlaka bulunmasi gereken bir satirdir. Her C++ programinda main() fonksiyonu olmak zorundadir; bu fonksiyonumuzun nnde ise o fonksiyonun dnderdigi degiskenin veri tipi olmalidir. Tabi ki C++ fonksiyonlar ve onlarin dnderdikleri degerler konusunu da ileride isleyecegiz. Bir sonraki satirda ise; C++ fonksiyonlar ve kod bloklari " { } " parantezleri arasinda bulunmalidir. main de bir fonksiyon ise onun iindeki kodlar dogal olarak { } parantezleri arasindadir. Program derlenip alistirildiginda ise ( Turbo C++ 3.1 kullaniyorsaniz ctrl+f9 kisa yoluyla programi alistirabilirsiniz (Run) ) karsimiza "Bu benim ilk programim" yazisi ikacaktir. Iste bu yaziyi ekrana veren komut da iostream.h ktphanesindeki cout fonksiyonudur. nemli bir nokta ise C++ dilinde her satir ifadenin sonuna " ; " koymak zorundayiz. Bundan farkli olarak #include satirlarinin ve bir ka farkli satirin arkasina " ; " gelmez. Bunlari ileride grecegiz. Return 0 : programimizin (ayni zamanda main fonksiyonumuzun) ikis noktasidir. Eger return ile 0 degeri dnderirsek programimizin gvenle iktigini isletim sistemine bildirmis oluruz. Bu sayede gvenle programimizin alistigini grecegiz. Simdi size bir rnek daha verecegim bununla da ayni iktiyi elde edecegiz. Arasindaki farklari eminim basit olarak sizlerde greceksinizdir.

// ilk2.cpp // Ekrana "Bu benim ilk programim" yazdiriyoruz #include <stdio.h> main() { printf("Selam bu benim ilk programim.\n"); return 0; }
Evet simdi burada ok fark varmis gibi gzkyor aslinda ama yle degil. Sadece ktphanemiz stdio.h oldu ve ekrana yazdir fonksiyonumuzda printf oldu. Bu zellik C den kalma. Bunlar diger program ile ayni islevi gryor. Buradaki fark " \n " notasyonu. Bu notasyon bir sonraki satira gemek iin kullanilir.

DEGISKENLER
Simdi bize yine ok lazim olacak bir zellik de degisken tanimlamak ve atama yapmaktir. Bunu bir rnek zerinde anlatmak istiyorum. rnegimiz;

// degisken.cpp // Burda degisken tanimlamayi grecegiz. // Ayni zamanda verilen bir sayiyi kendisi ile carpma 2.2=4 gibi #include <iostream.h> #include <stdio.h> // ktphane dosyamiz main() { int i; // Degisken tanimlama cout << "Bir sayi giriniz: "; cin >> i; i=i*i; cout << "sonuc: " << i ; return 0; }
Burada bundan nce yaptigimiz programlardan farkli olarak int i kullandik, yani degisken tanimladik. Degisken Nasil Tanimlanir? Degiskenleri tanimlamak iin asagidaki sema kullanilir. [Veri Tipi] [Degisken Adi];

rnegin int sayi; Simdi degisken.cpp rnegindeki int i; kismini anlamissinizdir. Burada degiskenlere deginmek istiyorum. Biz yukarda Iinde sayi tutan bir degiskeni tanimladik. Benzer olarak asagidaki tanimlamalar da vardir. char c; int i; float f; double d; unsigned int ui; Burada [Veri Tipi] [Degisken Adi]; bu kaliba gre tanimlama yaptigimiz iin nce Veri Tiplerini inceleyelim.

VERI TIPLERI
1) Int tip. Integer = Tamsayi Tamsayilari ierir. Bellekte 2 Byte tutar. DOS'ta ve Win3.1'de 16 bit uzunlugunda ama Windows9x, WinNT, Win200 ve WinXP 32 bit uzunlugundadir. Deger araliklari Short ve long iin degisir. rnek: 5, -20, 1 gibi. 2) Sort tip. Tam sayilari ierir. 16 bit uzunlugundadir. signed: -32768 ile +32767 arasinda deger alir, unsigned: 0 ile 65535 arasinda deger alir. 3) Long tip. Tam sayilar ierir. 32 bit uzunlugundadir. signed: -2147483648 ile +2177483647 arasinda deger alir, unsigned: 0 ile 65535 arasinda deger alir. 4) Gerel Tipler (Float, Double, Long double Gerel sayilari ierirler. float : Bellekte 4 Byte yer tutar. 3.4E-38 ile 3.4E+38 araliginda deger alir. Hassasiyet 7-8 basamaktir. double : Bellekte 8 Byte ter tutar. 1.7E-308 ile 1.7E308 araliginda deger alir. Hassasiyet 15-16 basamaktir. long double : doublenin tipinin daha genisidir.1.2E-4932 ile 1.2E-4932 araliginda deger alir. Hassasiyet 19-20 basamak. 5) Char Tip Char : Karakter Alfanumerik karakterleri ierir. Ve ya 8 bit uzunlugunda tamsayi. signed: -128 ile 127 arasinda deger alir, unsigned: 0 ile 255 arasinda deger alir. rnegin: ' 0,1,2,3,4,5,6,7,... ' , ' *,-,+,... ' , 'a,b,c,....,A,B,C,D,,,,, ' 6) Bool tip.

true(dogru) = 1 veya false(yanlis) = 0 degerini alir. Eski derleyiciler bu tr desteklemeyebilir. Yeni ANSI C++ standardinda eklenmistir. Bu soyut matematik grdyseniz. "p V q" ya benzer :) ( matematikiyiz, konusturalim azicik). Deger araligi ise ya 1 dir (dogru) yada 0 dir (yanlis). 7) Enum tip. enum siralanmis degerleri tutar. Short int ile ayni degeri tasir. Basta Fazla Detaya inip sizi bunaltmak istemiyorum. nk C++ dili baslarda karmasik gelen bir dildir. Bu da zaten kendisini yksek seviyeli bir dil yapiyor :). Ben size Bu dilin temel zelliklerini anlatarak basit programlar yapmayi gsterecegim. Bu temel bilgileri aldiktan sonra programlamaya geebiliriz. Derleyici Olarak ben Turbo C++ 3.1 i tavsiye ederim. Su an bununla baslar iseniz isiniz daha kolay olacaktir (bence). Ilerde Borland a geecegiz. Degisken tanimlama konusunda bir konuya daha deginmek istiyorum. Degiskenlere deger atama ve ayni anda bir ok degisken tanimlamamiz C++ da mmkndr. char c = 'c'; int i = 5; Daha sonradan deger atama: char c; int i; c = 'c '; i = 5; Bir de ayni anda bir ok degisken tanimlayalim. rnegin: int x , y , z; x = y = z = 5; x,y,z' nin degeri 5 oldu Bir sonraki derste ise degiskenlerle birlikte bir de Operatrleri ele alacagiz.

OPERATR ve OPERANT NEDIR?


Bunu bir rnek zerinde anlatmak istiyorum. rnegin; x + y ''de x ve y operand + ise operatrdr. Bu bir aritmetiksel operatrdr. Matematikte islemler operatrler ve operandlar ile anlatilir. Operatrleri ncelikle trlerine gre ayiralim: 1) Aritmetiksel operatrler + , - , * , / , % , ++ , -2) Karsilastirma operatrleri < , > , <=, >= , ==, != 3) Esitleme operatrleri = , += , -=, *= , /= , %= , <=, >>=, &=, != , ^= 4) Mantiksal Operatrler ! , || , && 5) Bit bazinda islem yapan operatrler & , ! , ^ , ~ ,

Aritmetiksel (Matematiksel) Operatrler:


Matematiksel ifadeleri gnlk hayattaki biimde bilgisayarda yazamadigimiz iin belli kurallara uymamiz gerekir. Bu kisim nemli oldugu iin biraz genis yer verecegim. Kullandigimiz matematiksel islemler ve anlamlari syledir:

C++ islemi: Toplama ikarma arpma Blme Modulus(mod) Bir arttirma Bir azaltma

Aritmetik operatr: + * / % ++ --

Bu operatrle verilen iki veya daha fazla operand toplanabilir. Yazilis sekli Asagidaki gibidir. degisken1 + degisken2 Eger bu iki degiskeni Sonu gibi baska bir degiskene atarsak esitleme operatryle asagidaki gibi yapariz. Sonu = degisken1 + degisken2 Buna bir rnek verelim.

// toplama.cpp //Vize ve final notlarinindan geme notunu hesaplama #include <iostream.h> #include <math.h> main() { int vize, final, ort; vize = 10; final = 80; ort = vize * 0.4 + final * 0.6; cout<< "Geme notunuz: " << ort; }
Burada arpma operatrn de kullandik sanirim, artik digerlerinin de ne oldugunu kavramis oldunuz. Bir rnekte isi ucuza getirdim :). Fakat bir artma ve bir azalmaya rnek verelim. Bu bana ok lazim olmustu. Burada dikkat etmemiz gereken olay " ++ " operatrn degiskenin nne yazmaniz gerektigidir. Bu sayede degisken bir arttirilarak isleme konur. Arkasina konursa degisken islenir, sonra bir arttirilir. " -- " operatrnde ise ayni sekilde de bir azaltma yapilir.

// carpim.cpp // x i bir arttirip y yi bir azaltip arptik. #include <iostream.h> main() { int x = int y = cout << cout << 5; 10; "x = " <<x << endl; "y = " << y << endl;

cout <<"++x * --y = " << ++x * --y ; }

Iste bir fark daha yakaladik bunu da hemen rnek zerinde anlatalim. Sanirim buraya kadar geldigimiz yerlerde int i , arpma islemini, bir arttirip azaltmayi grdk, ama diyeceksiniz ki " endl " ne oluyor? Hemen aiklayayim; Satir sonunu belirterek yeni satira gememizi saglar, bir nevi " \n " Escape operatr gibi bir isleve sahiptir.

Karsilastirma Operatrleri:
Operatr > < >= <= == != C++ rnegi x>y x<y x >= y x <= y x ==y x != y Anlami x, y'den byktr x, y'den kktr x, y'den byktr veya y'ye esittir x, y'den kktr veya y`ye esittir x, y'ye esittir x, y'ye esit degildir

Bunlarin teker teker ne oldugunu sylemeye gerek yok. Ifadeler gayet basittir. Burada dikkat etmemiz gereken nemli bir sey var: " >=, <=, ==,

!=" notasyonlarini kullanirken iki notasyon arasinda bosluk birakmamaliyiz. Buna dikkat edelim!

Esitleme ( Atama) Operatrleri:


Bunlarida liste halinda verelim. Operatr = += -= *= /= %= <<= >>= &= != ^= C++ rnegi x=y x += y x -= y x *= y x /= y x %= y x <<= y x >>= y x &= y x != y x ^= y Anlami x`in degeri y'ninkine atanir x`e x+y'nin degeri atanir. x`e x-y`nin degeri atanir. x`e x*y'nin degeri atanir. x`e x/y`nin degeri atanir x`e x%y'nin degeri atanir. x`e x<<y'nin degeri atanir. x`e x>>y'nin degeri atanir. x`e x&y'nin degeri atanir. x`e x!y'nin degeri atanir. x`e x^y'nin degeri atanir.

IF KOMUTU
if komutu anlasilmasi ve yazilimi en basit olanidir. if komutu, bir grup komutun kosullu olarak yrtlmesi amaciyla kullanilir. Buna bir rnek verecek olursak; dsnn ki bir sinav yapiliyor ve 50 ve zeri alanlar geecek. Bunun iin if i kullanirsak not 50 ye esit veya bykse (byk esit) geer not olacak.

//not.cpp // 50 ve 50 den yukarsi geiyor. #include <iostream.h> main() { int not; cout << "Notu yaziniz:"; cin >> not; if ( not >= 50 ) cout << "Getiniz!";

}
Sanirim bu rnekte ne dedigimi anlamis olacaksiniz.

if ( not >= 50 )

cout << "Getiniz!"; if (ifade) { Komut; Komut; ... }


Burda grldg gibi if (ifade) ve sonraki komutlarda { } blogunun iine yazilir. Simdi if`e bir de su aidan yaklasalim. if in kelime anlami "eger" dir. Mantik sudur: eger belirtilen parametre dogruysa, if komutu, if ten sonra gelen bloktaki fonksiyonlari gereklestirir. Dogru degilse, if den sonraki blogu yok sayar. Burada bir detaya daha inmek istiyorum. Ne demistik, mantik islemlerinde olay ya dogrudur (1) ya da yanlistir (0). Simdi yukaridaki if in genel kullanim sekline tekrar bakalim. Bunu, eger parametre dogru ise kullanabiliriz. Bir de bunun tersini dsnelim. Bit bazinda islemlerde sanirim ( ! ) bunu grmstk. Her bir biti ters evirir.

if {

(!ifade) komut (yanlis (0)); Komut (yanlis (0));

.... }
Derdimi anlamis oldugunuzu mit ediyorum :). Ama bence buranin stnde biraz daha duralim. nk bunu anlarsak digerlerinde zorlanmayiz. Son yaptigimizda ifadeyi tersine evirdik.

//pozitif.cpp // Bunada aiklama yaptirmayin:) ( yapamadimda) #include <iostream.h> main() { int x; cout << "Bir sayi girin:" ; cin>> x; if ( x > 0 ) cout << "Pozitif" ; }
Aynisinin negatif ini de siz yapin. Simdi bir de i ie if rnegine bakalim:

//gecti.cpp // Buna aiklama yapmiycam! #include <iostream.h> main() { int not; cout << "Notunuzu giriniz:"; cin >> not; if ( not> 50) cout << "Getiniz!" ; if (not < 50) cout << "Kaldiniz!" ; if ( not==50) cout << "zar zor getin :)"; }
Anlamis oldugunuzu umut ederek if komutunu burada bitiriyorum

IF -ELSE KOMUTU

if-else komutu iki islemden hangisinin uygulanacagina karar verir. Else kismi seimlidir, gerekmiyorsa kullanilmayabilir. Yazilim kurali ile syledir;

if ( ifade) komut1; else komut2;


daha genel sekliyle

if ( ifade ) { komut1; komut2; ... } else { komut1; komut2; ... }


Veya lojik olarak baktigimizda sanirim daha iyi anlayacaksiniz

if (ifade) blok_dogru (1); else blok_yanlis (0);


Sanirim artik aiklama yapmama gerek kalmayacak. Simdi rneklerle bunu pekistirmeye alisalim.

//tekcift.cpp //sayi tekmi iftmi onu grcegiz #include <iostream.h> main() { int sayi; cout<< "Bir sayi giriniz:"; cin >> sayi; if (sayi %2==1 ) cout <<"tek"; else cout << "ift" ; }
Bir rnek daha verelim:

//ifelse.cpp #include <iostream.h> main() { int not; cout<< "Notu giriniz:"; cin >> not; if (not >= 50) cout << "Geti!"; else cout << "Kaldi!";

}
if kismindan anlatmaya baslayacagim. Eger notumuz 50 ye esit veya 50 den byk ise geiyoruz aksi halde kaliyoruz. Bir de bir if-else in altinda bir tane daha if-else kullanalim.

//sinav.cpp // alt alta if-else #include <iostream.h> main() { int not; cout<< "Not`u giriniz:"; cin >> not; if (not >= 50) cout << "Getiniz!"; else { cout <<"Btten alinan not:"; cin >>not; if( not>=60 ) cout << "Getiniz!"; else cout <<"Kaldiniz!"; } }
Burada da sunu inceledik: diyelim ki sinava girdik ve notumuzu grendik, notu giriyoruz 50 nin altindaysa kaliyoruz. ve btnleme sinavina giriyoruz. Btte de geer not en az 60. Sanirim bu basit rneklerle olayi iyice kavramisizdir. if-else i de burada bitiriyoruz.

?: KOMUTU
Bu komut, yalnizca C++ a zgdr. Kendine zg bir yazilimi ve mantiksal kullanimi vardir. if-else komutunun kisaltilmisidir. Fakat, tm if-else komutlari yerine kullanilmaz. Yalnizca karsilastirma sonrasi, tek komut kullanilan uygulamalar iin geerlidir. Bu sylediklerimizi rnek stnde gsterelim:

//tekcift.cpp //tekcift.cpp yi bu sefer ?: ile yapiyoruz #include <iostream.h> main() { int sayi; cout<< "Bir sayi giriniz:"; cin >> sayi; cout << (sayi %2==1 ? "tek" : "ift") ; }
Kullanis biimi: cout << (sayi %2==1 ? "tek" : "ift") ; ok basit ama dikkat edelim. Her zaman kullanmiyoruz.

SWITCH-CASE KOMUTU
Switch Case deyimi islev bakimindan if deyimine ok benzemektedir. ok sayida if islem bloklari kullandigimizda programin okunurlugu azalacak ve programi izlemek zorlasacaktir. Programimizin bir degerini bir ok degerle karsilastirmak gerektiginde switch komutunu kullanacagiz. Switch seenegi ile degiskenin durumuna gre bir ok durum iersinden bir tanesi gereklestirilir. Istersek de if deyimi ile switch case'' yi birlikte kullanabiliriz. Switch in yaptigi is kisaca, ifadenin degerini sirayla sabitlerle karsilastirarak ve her satiri islemektir.

switch( Kontrol Degiskeni ) { case Sabit1 : komut1; case Sabit2 : komut2; . . . default : Komutson; }

Buna en basit rnegimizi verelim


//switch.cpp // switch-case yi greniyoruz. #include <iostream.h> main() { int i; cout<< " 1 ile 4 arasi sir sayi giriniz:"; cin>>i; switch(i) { case case case case 1 2 3 4 :cout<<"1 :cout<<"2 :cout<<"3 :cout<<"4 Girdiniz"; Girdiniz"; Girdiniz"; Girdiniz"; break; break; break; break;

default:cout<<"1 ile 4 ten farkli"; } }


Burada grdgmz gibi i degiskenine bagli olarak program isliyor. Case''lerinin aldigi degere gre kendinden sonra gelen komutlari isliyorlar. Burada daha nce grmedigimiz break komutunu grdk. Buna ilerde daha detayli olarak deginecegim. Fakat biraz bahsetmek istiyorum. Programimizda degiskene 1 degerini verdigimizi farz edelim. Case 1 adli satiri geip ondan sonraki komut dizisini isleme soktuk. Bu islemin tamamlanmasi iin break komutu kullaniliyor. Yazilimda break komutu goto gibi islev grr ve derleyiciye switch komutundan ikmasi iin talimat verir. Sorunu ortadan kaldirmak iin her durum iin break deyimi eklemeliyiz (tavsiye). Ne demistik; bir ok karsilastirma oldugunda switch''e ihtiya duyuyoruz. Karsilastirmalarin hi biri olmadigi anda da ortaya default tan sonraki satirin islenmesi kaliyor. Sanirim bu rnekte basit olarak anlamis olacagiz. Daha karmasik bir rnek verecek olursak:

//ucgen.cpp // Program girecegimiz llere gre genin Alan, Ykseklik ve Tabanini bulur // switch-case rnegimiz. #include <iostream.h> int main() { char secenek; float alan, yukseklik, taban; cout << "Program girecegimiz llere gre gen''in Alan, Ykseklik ve Tabanini bulur!\n" << endl

<< " A ---> Alan << " h ---> Ykseklik << " t ---> Taban << endl << endl; cout<< "Seeneginiz? ---> A, cin>> secenek; switch(secenek) { case ''a'':

: Bulmak iin ykseklik ve tabani girecegiz:" << endl : Bulmak iin alan ve tabani girecegiz:" << endl : Bulmak iin alan ve yksekligi girecegiz:" << endl h, t :";

case ''A'': { cout<< endl <<endl <<"Ykseklik: "; cin>> yukseklik; cout<<endl << "Taban: "; cin >> taban; alan = 0.5 * taban * yukseklik; cout<<endl << endl << "Alani: " << alan << endl; break; } case ''h'': case ''H'': { cout<< endl << endl <<"Alani: "; cin>> alan; cout<<endl << "Tanabi: "; cin >> taban; yukseklik = 2.0 * alan / taban; cout << endl << endl << "Ykselik: " << yukseklik << endl; break; } case ''t'': case ''T'': { cout << endl <<endl <<"Alani: "; cin >> alan; cout << endl << "Yksekligi: "; cin >> yukseklik; taban = 2.0 * yukseklik / alan; cout << endl << endl <<"Tabani: " << taban << endl; break; } } return 0;

}
Gayet basit bir rnek degiskenleri tanimladik. Caseleri koyduk ve caselerden sonra gelecek komut satirlarini yerlestirdik. Bu program grndg gibi zor degildir.

WHILE DNGS
Ilerinde anlatimi ve anlasilmasi en kolay olan dngdr. While dngs, dng sayisinin belli olmadigi zamanlarda kullanilir.

while ( kosul ) Komut;


While dngs, iinde bulunan ifade dogru oldugu srece altindaki komut veya komut blogu yrtlr. Eger yanlis ise kontrol bir sonraki komut veya komut bloguna geer.

While dngs daha genel sekliyle:


while ( ifade ) { komut; komut; komut; . . . }
Burada bir seye dikkat etmenizi istiyorum. oklu komutlar kullandigimizda " { } "parantezleri gereklidir.

// while1.cpp // while dngsn kullandik // girdigimiz sayidan 100 e kadar olan sayilari topladik #include <iostream.h> main() { int x, y; y= 0; cout<< " Bir Sayi Giriniz ( Sayi 100 den kk olucak ) : "; cin>>x; while (x< 101) { y =y+x; x =x+1;

} cout<< } "Toplam= "<< y;

Burada nce x ve y yi tanimladik. y=0 degerini verdik. Sonra klavyeden girilen degerin x oldugunu yazdik. while (x< 101) iste burada ifademiz x< 101. Simdi bu kosul saglanincaya kadar dngmz devam edecek. While'' den sonraki bloga getigimizde ise. y` ye x i ekliyoruz ve x in degerini her seferinde 1 arttiriyoruz. Sanirim bu basit rnekte dngnn basit yapisini ve mantigini anlamis oldunuz.

Dngnn verilen ifade veya kosula gre saglanmasi dnglerin en nemli konusudur. Eger bir dngden ikilmazsa o dng sonsuza gider. Buna da "sonsuz dng" denir. Dngler konusunda en ok rastlayacagimiz hata da budur.Simdi buna bir rnek verelim. Fakat, simdiden uyariyorum, sonsuz dng yapildiginda bilgisayariniz kilitlenebilir. Onun iin buna simdiden hazir olun. Zaten bir sefer denedigimizde ne demek istedigimi anlayacaksinizdir.

//sonsuz.cpp //while dngs ile sonsuz bir dng yaptik #include <iostream.h> main() { int x=1; while(x) cout<< }
Burada neden sonsuz bir dng oldu? Evet iste x ifadesini kosula baglamadik. Sayet while(x<10) demis olsaydik. 1,2,3,4,5,6,7,8,9 a kadar x sayisi siralanacakti.

"x= "<<

x++<<

endl;

//klavye.cpp //while dngs ile klavyeden girilen sayi #include <iostream.h> main() { int x, y = 0; while (y< 20) { cin>>x; y = y+x; } cout<< "Toplam= "<< }

y ;

Bu programda da klavyeden girilen sayilarin toplami 20'' den byk olunca program Toplam olarak sylyor. Sanirim basit While yapisini anladiniz. Simdi birazda karmasik programciklar yapalim:). 1. rnek: Girilen alti not''un ortalamasini aliyor.

//ortalama.cpp // while dngs ile girilen notlarin ortalamasini aldik.

#include <iostream.h> int main() { int toplam, sayac, not, ortalama;

toplam = 0; sayac = 1; while ( sayac <= 6 ) { cout << "Notu giriniz: "; cin >>not; toplam = toplam + not; sayac = sayac + 1; } ortalama = toplam / 6; cout << "Sinif ortalamasi = " << return 0; }
Bu rnegimizde yine toplam, sayac, not, ortalama gibi degiskenleri tanimladik. ( toplam =0 ; ve sayac = 1; ) de degiskenlere ilk degerlerini atadik. While dngsnn iinde sayac degiskenimizi alti defa islemesini syledik. Sonra alttaki toplam ve sayac blmlerinde ise toplam a not'' u ekliyoruz, her seferinde de sayac degerini bir arttiriyoruz ve sayac degeri 6'' ya gelince while dngmz duruyor. Program sonra toplami alip altiya bler bu sayede ortalamayi alir, sonrada iktisini gereklestirir. 2. rnek:

ortalama <<

endl;

//faktoriyel.cpp // while ile faktoriyel hesaplama #include <iostream.h> int main() { int sayi; long int faktoriyel=1; cout << "Bir sayi giriniz: "; cin >> sayi; cout << sayi << " `in Faktriyeli: "; while (sayi > 1) faktoriyel *= sayi--; cout << faktoriyel << return 0; }
Burda while (sayi>1) seklinde kosulumuzu belirttik. Bir altinda ise faktoriyel *= sayi--; evet burda da daha nce grdgmz gibi esitleme operatr olan ( *= ) i kullandik. Yani faktoriyel''e faktoriyel*sayi-- nin degeri atanir. Matematigini dsnrseniz; 7 sayisinin faktriyeli 7 *= 7-- gibi. yani 7 ye devamli 7-- oda 6 demektir. 6 ile carpimi eklenir, bu 6-- ile devam eder. En basit anlatimi bu:) Sonrada tm while dngs bittikten sonrada faktoriyel'' in sonucu ikti olarak ekrana gelir. Bu rnekte negatif sayilarin faktriyelini de 1''e esit tutuyor. Dikkat ediniz. Negatif sayilarin faktriyeli alinmaz sartini koymadik. Sayet siz koymak isterseniz bir if else blogu yerlestirmelisiniz if(sayi>=0) faktoriyel al yoksa faktoriyel alma gibi. 3. rnek:

endl;

// maas.cpp // while if-else ile bir maas vergi uygulamasi

#include <iostream.h> int main( ) { unsigned long maas, net, vergi = 0.0;

// maas net vergi bunlari tanimladik

cout<< "Ltfen maasinizi giriniz: "; // maasi giriyoruz cin>> maas; // maasi programa aliyoruz while( maas >= 0.0 ) { if( maas <= 250000000 ) vergi = 0.0; else if( maas < 500000000 ) vergi = maas * 0.10; else vergi = maas * 0.20; // maasin koslunu yaziyorus dngye // maas 250 milyondan az ise // vergi yok:) // maas 500 den az ise // vergi %10 // 500 den fazla ise // vergi %20

net = maas - vergi; // net maasimiz vergi dsnce ikar cout<< "denmesi Gereken vergi " << vergi << endl; // vergi ekranda cout<< "Net maasiniz: " << net << endl; // geriye kalan maasimiz

cout<< "Ltfen maasinizi giriniz: "; // bir dahaki ayki yeni maasimiz cin>> maas; // maasi program aliyor } return 1; }
Bu rnekte sanirim fazla aiklama yok. Sizden istedigim, kisinin maasini girdikten sonra onlarin alacagi toplam maas ve demeleri gereken toplam vergiyi bulmaniz. Bunu yaparsaniz buraya kadar olanlardan bir seyler anlamisizdir.

DO - WHILE DNGS:
Bu dng while dngsnn biraz degistirilmis halidir. Do-while dngsnde karsilastirma islemi, dngnn sonunda gereklesir. Bunun sonucu olarak dngnn iine en az bir defa girilmis olur. Yapisi asagidaki gibidir.

do cmle while ( kosul );


do'' nun altindaki cmle kismindaki komut satirlari birden fazla olursa diger dnglerde oldugu gibi " { } " iine aliyoruz. Bunu kullanmamiz kodlari okuma da ve ayirma da daha ok isimize yarayacaktir.

do { cmle cmle cmle ...

} while ( kosul );
Simdi yukarida demek istedigimizi standart kod satiri zerinde anlatalim. Kodlari yazdigimizda, komut sirasi do''ya geldigi zaman, do'' dan sonraki komutun dngnn basi oldugunu belirtiyor. Digerlerinden farkli ( for, While ) olarak dngye giris yapiyor, yani hibir kontrol yapmadan en az bir defa dngnn iine girmis oluyoruz. While''e geldiginde ise kosulu kontrol ediyor, eger dogru ise dngnn basindaki komuta giderek yeniden komutlari isliyor. Eger kosul kontrol yanlis ise while''den bir sonra ki komutu veya komutlari isleyip dngden ikiyor. Simdi bu sylediklerimizi rnek zerinde gsterelim.

//do.cpp // number echoer //do-while dngsn kullandik #include <iostream.h> int main () { unsigned long x; do { cout<< "Bir sayi giriniz ( Durdurmak iin 0 ) : "; cin>> x; cout<< "Girdiginiz sayi: " << x << "\n"; } while (x != 0); return 0; }
rnegimizde de grldg gibi nce do dan sonraki komutlar isleniyor. Sayet 0 girersek while islemeye basliyor. Do-while dngs C++ da ok fazla kullanilmaz bunun yerine biz for'' u kullanacagiz nk for dngs ok daha gldr.

FOR DNGS
For dngsnn alismasi, dngnn kontrol degiskenine baslangi degerinin atanmasi ile baslar. Asagida verecegimiz ilk deger atama cmlesinden kastimizda budur. Yani bu kisimda baslangi tanimlari yapilir. For dngsnn baslangi adimidir. Bu kisimda yapilan bir degisken tanimindaki degiskenin mr, for dngsnn sonunda biter. Sonra dng kosul kismina gelinir ve bu test edilir. Sayet degeri !0, dogru (1) oldugunda dng iindeki komutlar uygulanir. Arttirma ise for dngs isleminin sonunda meydana gelir. for iindeki tm deyimler meydana geldikten sonra uygulanir. Genel yapisi:

for ( ilk deger atamalar, kosul, arttirma) cmle


Bunu daha da genellersek, digerlerinde de oldugu gibi cmleler birden fazla oldugunda komut blogu arasina alinacaktir.

for ( ilk deger atamalar, kosul, arttirma) { cmle1 cmle2 cmle3 ... }
Bu sylediklerimizi bir rnek zerinde izah edelim.

//for.cpp // for dngsyle bir rnek.

#include <iostream.h>

int main () { for (int n=10; n> 0; n--) { cout << n << " -> "; } cout<< "Bitti!"; return 0; }
Ben sadece for (int n=10; n>0; n--) bu kismi anlatacagim, diger kisimlar apaik gzkyor zaten. For diyip () imizi atik. Sonra iine ilk basamagimiz olan degisken tanimlamamizi yaptik. Int n=10; Bu bizim yukarida bahsettigimiz ilk deger atamalar kismi. Daha sonra kosulumuzu yazdik. n>0; bunu test ettik ve !0 yani dogru (1) ikti. Sonrada n-- yi yazdik. Genel tanimda yazdigimiz arttirma kismi. Aslinda buna yenileme komutlari desek daha dogru olur. Biz bu rnekte rnegin azaltma yaptik. Neyse umarim bu for rnegini anlamissinizdir. C++ da yapacagimiz ogu rnekte for u kullanacagiz. C++ ''nin en gl yanlarindan biriside for dngsdr. For dngsnn basinda yani ilk deger atama kisminda birden ok degisken tanimlayip deger atiyorsak bunlari virgl ( , ) ile bir birinden ayirmaliyiz. Ilk deger atamadan kosul blmne getigimizde ve kosul blmnden arttirma ya geerken noktali virgl ( ; ) kullanmaliyiz. Tabi kullandigimiz bu kisim seimlidir istersek bos birakabiliriz. Fakat, noktali virgller ( ; ) konulmasi zorunludur. 1.rnegimiz:

//factoriyel_for.cpp //for dngsyle faktriyel hesap.

#include <iostream.h> int main() { int fac, sayi; cout<<"Sayiyi giriniz: "; cin>>sayi; fac=1; for (int j=1; j<=sayi; j++) { fac=fac*j; } cout<<"Sonuc: \a"<< fac; return 0; }
Bu rnegimiz olduka basit. Bildigimiz matematiksel faktriyel islemini C++ kodlari olarak yazdik. (\a yi kullandim bip! demesi iin:) ). 2.rnegimiz:

//carpim_for.cpp // i ie for dngsyle arpim tablosu

#include <iostream.h>

main() { cout<<"arpim Tablosu! \n"<<endl; int x,y; for (x=1; x<=10; x++) { for (y =1; y<=10; y++) cout<<" "<<x*y; cout<<"\n"; } }
Grldg gibi ilk for dngsnde, birinci bilesen olan x i nce 1 e esitledik sonra birer arttirarak 10'' a kadar gtrdk. Sonraki for da da aynisini y iin yaptik ve bu iki bileseni arparak ekrana yazdirdik. Son derece basit bir rnek. 3.rnegimiz:

//asal_for.cpp // for , if ve while ile asal sayi bulma #include <iostream.h> int main() { int sayi; cout << "Bir sayi girinizr: "; cin >> sayi; for (int sayac=1; sayac< sayi; sayac++) { int asal, test; test = sayac; asal = 1; while (test--> 2) if ((sayac % test) == 0) asal = 0; if (asal == 1) cout<< sayac << " bir asal sayidir!\n"; } return 0; }
Bu rnegimizde ikinci rnegimize benziyor. Iinde for, while ve if de var. While ve if'' in iindeki matematiksel ifadeleri biliyorsak rnek gayet basit gelicektir. Burada birakmak istiyorum. Bir sonraki ders grsmek zere.

BREAK ve EXIT FONKSIYONLARI


BREAK
Break komutunu, swtich komutundan ikmak iin nceki derslerimizde grmstk. Komutun kendine zg bir kullanimi daha vardir. Break komutu bir dngnn iinde alistirilirsa o an o dng biter. Bir goto gibi islem grdgn de syleyebiliriz. Break kullaninca program dngy bitirir ve dngnn sonundaki satirdan alismaya devam eder. Bir rnek verelim.

//break.cpp //break komutunu kullandik.

#include <iostream.h> main() { for (int x = 1; x <= 10; x++) { if (x == 7) { break; } cout<< x << " "; } }
Iste rnegimizde grdgnz gibi. X 7''ye esit olunca break; dngy bitiriyor ve dngden sonraki satiri alistirmaya basliyor.

EXIT
Hayati hata durumlarini ele almak iin exit() fonksiyonundan yararlanilir. Bu hatalar main() fonksiyonunu return ile normal olarak sonlandirilmadan nce olusabilir. Exit() fonksiyonu, durum degerini bir tam sayi parametre olarak dndrr. Exit() ile zel bir degerin gnderilmesi bazi islemler yapmasi iin kullanilabilir. rnegin program komut satirinda kullaniliyorsa ve durum degeri bazi hatalari gsteriyorsa, isletim sistemi bunlari mesaj olarak yazabilir. Exit() fonksiyonu programi sonlandirmanin yaninda, tm bekleyen yazma islemlerini tamamlar ve aik tm dosyalari kapatir. Exit() fonksiyonunu kullanirken kullanmamiz gerek ktphaneler ise process.h ve stdlib.h tir.

Fonksiyonlar
Bundan sonraki blmlerdeki kullanacagimiz derleyici Borland Turbo C++ 4.5 tir. Fazla zorlanmayacaginizi umut ediyorum. Kolay anladiginiz yerlere ltfen dikkat ediniz. Hata yapma olasiliginiz daha da ok artmaktadir. Yapacaginiz hatalar programin kmesine, belki de sistemin zarar grmesine sebep olabilir. Ltfen vermis oldugum uyarilara ve tavsiyelere uymaya alisin. Sizin de tavsiyeniz olursa bana bildiriniz:). Haydi kolay gelsin...

1. Fonksiyonlara Giris:
Fonksiyonlarin programlama hayatina girmesi ile daha byk boyutta sistemlerin tasarimi mmkn hale gelmistir. Fonksiyonlar ile alakali derslerimizde, fonksiyonlarin tanimlanmasi ve kullanimi hakkinda bilgi edineceksiniz. Fonksiyonlar konusu size her ne kadar ilk bakista "Fonksiyon" adi altinda bir konu gibi gelse de, aslinda bir alt programdir. Hatta programimizin iine, kodlamamizin daha kolay ve gelistirilebilir hale gelmesini saglayan programciklar da diyebiliriz. Daha nce baska bir programlama dili grdyseniz (yksek seviyeli diller), bu konuda fazla zorlanmayacaksinizdir. Diger yksek seviyeli dillerdeki fonksiyon kullanimina ok benzemektedir. Hi bilmediginizi farz ederek konuya giris yapalim. Fonksiyon Nedir? rnegin, y=F(x) fonksiyonu; Bu matematiksel fonksiyon parametre olarak aldinan deger zerinde bir islem gereklestirip, bir sonu degerini dndrr. Mesela F(x)=x^3+5 seklinde bir fonksiyonumuz olsun, x=2 iin F(x)=13 olur. Burada x fonksiyonun parametresi, 13 ise fonksiyonun geri dndrdg degerdir. Simdi de bu matematiksel ifadeyi kodlarimizla yorumlayalim.

Int x; x=F(2,5)
//buradan da " int f(2,5) " gibi grebiliriz... Dikkat edersek ikinci satirda, daha nce islemedigimiz bir kod var. Int x, F(2,5) degerine esitlenmistir. Simdi bir fonksiyonun nasil yazildiginin kalibini ikartabiliriz.

<Dndrdg deger> <Fonksiyonun adi> ( <parametre listesi> ) {

<ifadeler> }
Buradaki parantezlere ve kme isaretlerine dikkat ediniz. Simdi yukarda yazdigimiz kalibi biraz aalim. <Dndrdg deger> : Fonksiyon her hangi bir tipte deger dndrebilir. Bu bilesen fonksiyonun dndrecegi degerin tipini ifade eder. (rnegin, int, dounle, float v.s v.s ) <Fonksiyonun adi> : Yapmak istedigimiz islemin adidir. rnegin bir asal sayi fonksiyonu yazacagiz. Burada yazacagimiz fonksiyonun adini belirtiyoruz. Benim size tavsiyem AsalSayi veya asal_sayi seklinde kullanmanizdir. Okunabilirlik aisindan size avantaj saglayacaktir. <parametre listesi> : Fonksiyonun kullanacaga parametrelerin tipleri ile siralanir. rnegin, FonksiyonAdi(int x, double y) gibi. <ifadeler> : Fonksiyonun kullanacagi tanimlamalar ve kodlardan olusan kisimdir. Nasil biz main() { kodlar } seklinde kullaniyorsak. Bunu da ona benzetebiliriz. Ama main() i bunlarla karistirmayiniz. Simdi bu fonksiyon kalibina uygun bir kod yazalim. rnegin, Faktoriyel bulma islemini ele alalim. Biz bir sayinin Faktryelini nasil bulurduk? n!=n(n-1)(n-2)...1 Yani, 1 den n e kadar olan sayilarin arpimidir.

long Faktoriyel(int n) { return n*Faktoriyel(n-1); }


Evet, burada fonksiyonumuzu tanimladik. Sanirim yukaridaki blokla karsilastirinca, ne kadar kolay oldugunu sizde grmssnzdr. Simdi bu Faktoriyel fonksiyonumuzu nasil bir programda kullanacagiz? Hemen devamini yazayim.

long Faktoriyel(int n) { return n*Faktoriyel(n-1); } void main() { cout<<"5! (Bes Faktoriyel)= }


hesaplayip bize syledi.

"<<Faktoriyel(5);

Iste grdgnz gibi ne kadar basit degil mi? J Fonksiyonumuzu tanimladik. Sonra programimizda n`e 5 degerini verdik. Faktoriyel fonksiyonu

Biraz da yaygin yapilan hatalardan ve dikkat etmemiz gereken noktalardan bahsedelim. Kodlama yaparken fonksiyon adini belirttigim sekilde yazarsaniz 30-40 sayfalik kodlarda hata bulmaniz ve de fonksiyonlarin yerini belirlemeniz aisindan byk kolaylik olucaktir. Yukarida verdigimiz x=F(2,5) fonksiyonununu gz nnde tutalim. Grldg gibi F(2,5) degeri x e atanmistir. Hi bir zaman Fonksiyonun aldigi deger sola yazilmaz. Ayrica bir Fonksiyon agrisi, baska bir fonksiyonun agrisi olabilir. rnegin, x=F(a,F(a,5) gibi. Burada F Fonksiyonun iki parametresi vardir a ve F(a,5) dir. Bu durumda ncelikle parametreler hesaplananacagi iin F(a,5) in degeri ile a nin degeri F te parametreler olarak kullanilir.

Dizilere Giris
Diziler, "indisleri olan degiskenler" olarak adlandirilirlar. Diger bir deyisle, birden fazla tek dze veri tipi ieren degiskenlerdir. Diziler birbirine bitisik bellek gzleri kullanilarak olusturulurlar. Bunu biraz daha aarsak: farz edelim ki elimizde tane kutu var, birinde yesil kalemler, birinde kirmizi kalemler ve birinde de mavi kalemler olsun. Bu kutucuklari 1,2,3 diye adlandirdigimizi dsnelim. Biz diziler ile numarasini bildigimiz kutucugun iindeki malzemeyi alabilecegiz. Daha dogrusu numarasini vermis oldugumuz kutunun iindeki bilgiyi bilgisayar okuyacaktir. Not: For dngs dizi elemanlarina ulasmak iin en ok kullanilan yntemdir. Dizilerin indislerden olustugunu sylemistik. Diger yksek seviyeli dillerle karsilastirildiginda arasindaki fark ilk elemanin indisi daima sifir (0) olmasidir.

for(int i=0; i<boyut; i++)


Burada dikkat etmek istedigimiz "int i=0" kismidir. Grldg gibi indisin ilk aldigi degeri sifir (0)`dan baslatiyoruz. Bu kismi unutmayiniz. Genellikle yapilan en byk hatalardan biridir.

Bir dizi tanimlayicisi -adi-, dizinin ilk elemaninin adresini tanimlayan adrestir. Bunu syle izah edelim; elimizde bir dizi var ve ilk elemani karakter ise biz "char DiziAdi[boyut]" seklinde tanimlariz. Tam sayi ise "int DiziAdi[boyut]" seklinde olur. Dikkat edilmesi gereken diger bir konu da: dizi adi hibir zaman (=) isaretinin solunda bulunmaz. Bu yukarida sylediklerimi anlamamis olabilirsiniz. Onun iin alt kismi okuyup bir daha tekrar etmenizi tavsiye ederim.

Dizilerin Tanimlanmasi ve Deger Atama


Int a[10];
Seklinde bir diziyi tanimlayabiliriz. Bunu daha genel bir kaliba dkersek. <tip> <dizi adi> [<boyut>]; halini alir. Birde boyutlarinin arttirilmis halini verelim. <tip> <dizi adi> [<boyut1>][<boyut2>][<boyut3>]....[<boyutn>]; n boyutlu dizi:). <tip>: Yukarida sylemis oldugumuz "int DiziAdi[boyut]" olayidir. <dizi adi>: Kurallara uygun herhangi bir isim olabilir. Genellikle dizilerinizin amacina uygun isimler kullaniniz. [<boyut>]: Dizinin ka eleman ierdigini gsterir. 5 elemanli ise [5] seklinde yazariz. Basta " int a[10]; " almistik. Simdi bunu degisik bir formda yazalim

const int boyut=10; Int a[boyut];


nce boyut adinda bir sabiti tanimladik ve deger atadik sonrada bunu dizi iine agirdik.

Dizilere Deger atama:


Bu yntemleri madde madde verelim, 1. Duragan ve global (erisilen) dizilerde yaratildiklari anda ierik otomatik olarak belirlenebilir. Programin taniminda erisilen tm degiskenler, otomatik olarak sifir yapilir. 2. Duyuru sirasinda sabit degerler belirtilerek belirlenebilir. 3. Programin alismasi sirasinda indisler kullanilarak her elemana tek tek veri kopyalanabilir. 1. maddenin rnegi

#include <iostream.h> const int boyut=5; int GlobalDizi[boyut]; main() { //"satatic" yerel degiskende tanimlanmasina ragmen tm program boyunca //geerlidir. Ancak sadece tanimlandigi fonksiyon tarafindan erisilebilir. static int DuraganDizi[boyut]; for(int i=0; i<boyut;i++) cout<<GlobalDizi[i]; return 0; }
Programin iktisinada greceginiz gibi, dizi aratilirken indislere ait eleman bloklari temizlenmis ve sifir degerlerini almistir.

Burada bir konuya daha dikkat ekmek istiyorum. ok yaptigimiz hatalardan biri olarak da, dizi duyurusunu yaparken belirttigimiz degerden fazla sayida deger girmemizdir.

int DiziAdi[5]={1,8,9,5,4,6};Grms oldugunuz gibi bes tane dedik ama alti tane yazdik. !!! hata !!!. Bu tr hatalar iin elimizde
kullanabilecegimiz bir kalip var.

char DiskOkunmuyor[ ] = "Disk okunmuyor"; char DosyaYok[ ]= "Dosya Yok";


Bunu yaptigimizda derleyici, tm degerleri ierebilecek en byk diziyi olusturur.

Dizi Boylarinin Dinamik Hesaplanmasi "sizeof()"


sizeof() fonksiyonu, nesne iin bellekte gerekli olan byte`larin sayisini belirtir. Sizeof() fonksiyonu dizilerde kullanilabilir. #include <iostream.h> void main() { int a[5]; float b[10]; cout<<"dizinin boyutu: "<<sizeof(a)<<''\n''; cout<<"dizinin boyutu: "<<sizeof(b); }
Evet burda da grms oldugumuz gibi dizinin bellekte kaplayacagi byte`lari hesapladi. Birde bu konuyla beraber "&" operatrnn bir dizi bile olsa degiskene nasil uygulandigini grebiliriz.

#include <iostream.h> void main() { int a[10]; cout<<"sizeof(int) is"<<sizeof(int)<<endl; for(int c=0; c<10; c++) cout<<"&a["<<c<<"]="<<&a[c]<<endl; }
Programi derledikten sonra "sizeof(int) is 2 ya da sizeof(int) is 4" diyecektir. Bu degisiklik int in mikroislemcilere bagli olarak 2 veya 4 byte olabilmesinden kaynaklanmaktadir.

Diziler ve Szckler (strings)


C++ da szckler iin farkli bir tip yoktur. Szckler ile ilgili islemler diziler yardimi ile kolaylikla yapilabilir. Dikkat edilmesi gereken bir kural vardir. Szcklerin (strings) son elemanlari "\0" degerini alir (null terminator). Burdan da anlayacagimiz gibi son karakter bos dizgiyi belirtiyorsa stringtir. Suna da dikkat edilmelidir ki string sabitlerinin sonuna "\0" koymamiza gerek yoktur. Derleyici bunu otomatik olarak yapacaktir.

Char sozcuk[7]="Deneme"; Char sozcuk[7]=''D'', ''e'', ''n'', ''e'', ''m'', ''e'', ''\0''};
Bu dizilerin ierikleri tamamen aynidir. Hazir sz gelmisken suna da deginelim. ''\n'', ''\t'', ''\0'' v.s, bunlar birer karakter olarak okunur. Ben nceleri iki diye okurdum:)

#include <stdlib.h> #include <iostream> #include <string> using namespace std; int main() {

string Cevap = ""; cout << "Hazirmisin?"; cin >> Cevap; if( ( Cevap == "evet" ) || ( Cevap == "Evet" )) { cout << "Ee Tamam... ne gec ti eline?:) " << endl; } else { cout << "Zorlamaya devam et!" << endl; } cout << "Hazirmisin? " << endl; cin >> Cevap; if( ( Cevap[0] == ''e'' ) || ( Cevap[0] == ''E'' ) ) { cout << "Ee Tamam... ne geti eline?:)" <<endl; } else { cout << "Zorlamaya devam et!" << endl; } system("pause"); return 0; }
Bu, sanirim bu konudaki en zor rnegimiz. Simdi rnek zerinde biraz konuyu konusmaya devam edelim. Zaten diger if, else bloklarindan ve cout, cin gibi komutlardan bahsetmeyecegim. string Cevap = ""; bir sabitimizle isleme basladik. if( ( Cevap[0] == ''e'' ) ||

( Cevap[0] == ''E'' ) ) burasi sanirim tanidik geldi:) Evet simdi burda Cevap[1] i agirmis olsaydik ''v'' veya ''V'' degerlerini alicaktik.
Tabi burada index degerinin yani dizideki ilk degerin 0 ile basladigini bir daha grdk. Simdi bu rnekle alakali olarak da Diziler ve Fonksiyonlar konusuna geelim....

Karakter Katarlari Fonksiyonlari ve Karakter Dizileri


Iste buraya biraz dikkat, kafaniz gerekten karisabilir. Daha dogrusu hangisi hangisiydi diye ugrasir durursunuz:)

strlen()
Bu fonksiyon bir karakter dizisinin uzunlugunu verir ve "string.h" kitapliginda tanimlidir. Strlen() fonksiyonu, szckler (strings) blmnde bahsettigimiz string ifadeleri okumak iin kullanilir. Fakat sondaki "nul terminator" diger sekliyle ''\0'' degerini okumaz. rnegimizde de oldugu gibi "Deneme" ve ''d'' ''e'' ''n'' ''e'' ''m'' ''e'' szckler kisminda ki biz buna 7 karakter demistik, "null" ile birliktedir ama strlen() bunu bize 6 diye okuyacaktir.

int boy = strlen(h); for (int i = 0; i<=boy; i++) y[i] = h[i] ;

strcpy()
Bu fonksiyonda szck kopyalamaya yarar ve "string.h" kitapligindadir.

#include <iostream.h> #include <string.h> #define OTUZ 30 void main(void) { char Dosya1[OTUZ]="C:\\belgelerim\\deneme.txt",

Dosya2[OTUZ];

strcpy(Dosya2, Dosya1); cout<<Dosya2<<endl; cout<<"\n ikinci dosyayi gir: "; cin>>Dosya1; strcpy(Dosya2, Dosya1); cout<<"\n"<<Dosya2<<"\n"; }

strcat()
strcat() fonksiyonu iki karakter katarini bir birine ekler.

strcmp()
Iki szcgn (iki karakter katarinin) ayni olup olmadigini kontrol etmek iin kullanilir. Bu fonksiyon byk/kk harf duyarli degildir.

atoi()
Bazen sayilari karakter dizisi olarak okumamiz gerekebilir. Ancak esas, bu sayilarin sayi degerlerine gereksinmemiz vardir. Atoi fonksiyon, bir karakter dizisini alir ve onu sayiya evirir. rnegin; "123456" dizisini alir 123456 sayisina dndrr.

strstr()
Bunu bir rnekle anlatayim: "C++ dersleri" gibi bir szcgmz var, strstr() fonksiyonu ile bu szck iinde "d" harfinin varligini sorgulayabiliriz.

Isaretilere Giris
Isaretiler (Pointers) ve bundan nce grms oldugumuz diziler (Arrays) ilerde yapacagimiz uygulamalarda kullanimina kesin ihtiya duyacagimiz basliklardir. Bunlar bize dinamik bellek kullanimini saglarlar. Dinamik bellek kullanimindan bahsedecek olursak, bellegimizin kutucuklardan olustugunu hayal edin. 100 kutucuklu bir bellegimiz var. Bu kutucuklarin her birinin bir adresi vardir ve biz de bu adresler yolu ile kutucuklara erisiriz. Iste isaretiler bu erisimi sagliyor. Bu konuya alisirken, anlamanin gayet kolay oldugunu greceksiniz. Fakat ben sizi uyarayim, en kolay konular en ok hata yapilanlardir. Isaretilerde yapilan hatalar programin hatta sistemin kmesine sebep olabilir, ayni zamanda yapilan hatalari kolay kolay bulamayabilirsiniz. Byk projelerde bu sizi bayagi sikintiya sokacaktir. Onun iin isaretiler konusunda, kullanim teknigi hakkinda size sik sik tavsiyelerde bulunacagim. Isaretilerin Tanimlanmasi ve Deger Atanmasi Bir isareti tipi, hangi tipe isaret ettigini belirten ve birer adres degeri ieren verilere sahiptir. Bir isareti degisken bildirimi, aik olarak hangi tip veriyi kullanacagini bildirerek baslar. Derleyicimizde * isareti ile isareti degiskeni tanimladigimizi anlar. <tip> *<isareti adi>; Seklinde yazilir. rnegin, int *IsaretciAdi; Simdi de ayni satirda birden fazla isareti tanimlayalim.

Int *is1, *is2, *is3;


Seklinde tanimlayabiliriz. Benim size tavsiye ettigim budur. Fakat farkli bir yol olarak da (Int *) is1, is2, is3; seklinde de yazilabiliriz. Burda dikkat etmemiz gereken olay ise, int tipinde isaretileri tanimlarken herhangi bir degiskende tanimlarsak (int *) seklinde tek satirda yapmamiz hatalidir.

(Int *) is1, is2, is3, x=4; //hata int *is1, *is2, *is3, x=4; //dogru
Sanirim ne demek istedigimi anladiniz:). Daha nce grms oldugumuz "&" adres operatrn hatirlayalim, kendisisinden sonra gelen ifadenin adresini gsterir.

Int x; Int *is1=&x;


x i tanimladik, sonra is1 isaretimize x in adresini atadik. Kisaca is1 in gsterdigi adresteki deger diye biliriz:)

#include <iostream.h> #include <string.h> int main(void) { char *is1="deneme"; int index; for(index=(strlen(is1)-1); index>=0; index--) cout<<is1[index]<<endl; cout<<"\n"<<is1; return 0; } Programin iktisi --------e m e n e d deneme ---------

Isaretiler ve Diziler
C++ da Isaretiler ve diziler arasinda ok yakin bir iliski vardir. Bir dizinin ismi, dizideki ilk elemanin adresini ieren sabit bir degiskendi. Bundan diziler blmnde bahsetmistik. Simdi isaretiler ile dizileri iliskilendirirsek, dizilerin adlarinin birer isaretiden olustugunu grms olacagiz.

*(a+i) a[i]
Bu sayede bu iki ifadenin ayni oldugunu sylemis oluruz. Bir de ok boyutlu dizilere uyarlarsak,

*(*(a+i)+j) a[i][j]
seklini alir.

Int a[100]; Int *is1=&a[100];


rnegimiz;

//isareti ve diziler #include <iostream.h> void KareAl(int *sayi) { *sayi *= *sayi; } void KareAlDizi(int *is1) {

for (int i=0; i<10; i++) is1[i] *= is1[i]; } int main() { int x = 50; int intis1[10]; KareAl(&x); cout<<"x = "<<x<<endl; KareAlDizi(intis1); cout<<intis1; return 0; }

5. Isaretiler ve Fonksiyonlar
Isaretiler ve diziler blmnde grms oldugumuz rnektede oldugu gibi. Biz fonksiyonun adresine onun adi ile ulasiriz.

Kareal(x);
gibi. Simdi bir fonksiyonu isaret eden bir isaretiyi ele alalim.

Int KareAl( );
fonksiyonumuz olsun.

Int (*KareAl)( );
Bu da Fonksiyonu isaret eden bir isaretimiz oldu. Biz genellikle isaret edilen fonksiyonlari menlerde ve siralamalarda kullaniriz. Asagida bir siralama rnegi verilmistir.

//is_ve_fonk.cpp //isaretiler ve fonksiyonlar #include <stdlib.h> #include <iostream> using namespace std; void YatayYaz(char*); void DikeyYaz(char*); void ismiYaz(char*, void (*Yaz)(char*)); int main() { char isim[] = "Deneme"; ismiYaz(isim,DikeyYaz); ismiYaz(isim,YatayYaz); system("pause"); return 0; } void YatayYaz(char *isim) { if(!isim) return; cout << isim; } void DikeyYaz(char *isim) { if(!isim)

return; int i = 0; while(isim[i] != NULL) { cout << isim[i++]; cout << endl; } } void ismiYaz(char *isim, void (*Yaz)(char*)) { Yaz(isim); cout << endl; }

http://www11.brinkster.com/secici/download.asp