C++ Kursu 3
Retro bilgisayarGeçen sayıda gördüğümüz while döngüsüne çok benzeyen bir yapı ile karşı karşıyayız.
do
Komut1;
Komut2;
Komut 3;
) while ( kosul );
Bu döngü de tıpkı while döngüsünde olduğu gibi koşul doğru olduğu müddetçe verilen kod bloğunu çalıştıracaktır. While döngüsünden tek farkı ise kod bloğunun en az bir kere çalışacak olması. Bunun sebebi, while döngüsünde koşul kontrolü en başta yapılırken, do-while döngüsünde kontrolün sonda yapılıyor olması.
For Döngüsü
Anlatım sırası olarak önce while ve do-while yapılarını anlatmamızın sebebi onların if ile olan benzerlikleri idi. Aslında en sık kullanılan döngü tipi belki de for döngüsüdür. Gelin bir göz atalım. i=0; i<5; i++
for( int iİ — Ü; t*ti)
1
Komut1;
Komut2;
Komut 3;
)
Burada for satırı önemli. Bu satırda parantez içinde kalan bölüm döngünün nasıl çalışacağını tanımlıyor. Bu bölüm kendi içinde aslında üç parçaya bölünmüştür. Bu üç parçayı iki adet noktalı virgül (;) ayırıyor.
1. i=0: başlangıç bölümü. Burada i adında bir döngü sayacı tanımlanmış. 2. döngüye devam koşulu.
3. döngü. Burada döngü sayacı 1 artırılmış. ++ operatörü böyle kullanılarak, tamsayı cinsinden bir değişkenin değerini bir artırabilir. Burada ++i yazmak yerine i = i + 1 da yazabilirdik, aynı şey olurdu.
Döngüler konusunda hatırlamamız gereken son şey her üç döngü yapısından da break komutu ile çıkabileceğimiz.
if bloklarına alternatif:
Switch - case
Eğer bir değişkeni alıp bu değişkenin değerine göre çok sayıda kod bloğundan birini çalıştırmak istiyorsak (örneğin menü komutu işleme vs. gibi senaryolarda), bunu geçen bölümde gördüğümüz gibi if-else if blokları ile yapabiliyoruz. Ancak bunu yapmanın (belki) biraz daha kolay bir yolu da switch case yapısını kullanmaktır.
switch( degisken
(
case 1:
komut1;
komut2;
break;
case 2:
komut 3;
break;
case 3:
komut4;
break;
default:
komut 6;
break;
Burada değişkenin değeri 1 ise komut1 ve komut2 çağırılır. Değer 3 ise komut4 ve komut5 çağırılır. Eğer değer 1, 2 veya 3'ten farklı bir değer ise de komut6 çağırılır. Burada dikkat edeceğiniz bir diğer şey break komutları. Eğer break komutları konulmazsa program akışı bir alttaki case bloğundaki komutlardan çalışmaya devam eder. Bu da genellikle istenmeyen bir durumdur. Eğer bu istenen bir durum ise bile genelde kodu okumayı ve anlamayı zorlaştıracağı için tavsiye etmiyorum.
Döngü Örneği
Döngüleri kullanarak bir örneğe bakalım:
#include <iostream>
int main()
// kac sinav oldugunu al
<< “Kac sinav oldu? ";
int kacSinav;
>> kaeSinav;
// dongu ile notlari al ve topla
int toplam - O;
forlint is0O; i<kacSinav; hi)
(
int not;
stdı:cout << “sinav notu:
sStdi;cin >> not;
toplam - toplam * not;
)
// sonucu hesapla ve goster
int ortalama toplam / kacSinav;
std::cout << “Yapilan ” << kacSinav
<< “ sinavin ortalamasi: ” << ortalama
<< std::endi;
)
Şu ana kadar öğrendiklerimizi kullanarak nispeten faydalı küçük programcıklar yazabilmeye başladık.
Bu program bir öğrencinin sınavlardan aldığı notların ortalamasını hesaplayan bir program. Bunun için ilk başta kullanıcıdan kaç sınavın ortalamasını almak istediği bilgisini alıyor ve kacSinav isimli değişkene saklıyor. Ardından kacSinav kere dönen bir döngü içinde kullanıcıdan sınav notlarını almaya başlıyor. Her notu aldığında toplam adlı değişkene o notu ekliyor. Bu sayede toplam değişkeninde o zamana kadar girilen sınav notlarının toplamı “birikiyor”. Döngü ile kacSinav kadar sınav notu alınıp toplam değişkeninde biriktirildikten sonra programın son bölümüne geliyoruz. Burada toplam değer kacSinav sayısına bölünerek ortalama hesaplanıyor ve bu sonuç kullanıcıya gösteriliyor.
0'dan başladığını unutmayın (o yüzden (4) yerine (3) kullandık)
Şimdi bir önceki örnek programımızı dizileri kullanarak daha da geliştirmeye çalışalım. Programımız tek öğrencinin sınav notları yerine bir sınıftaki bütün öğrencilerin notlarını işlesin. Ama dizi kullanımını daha kolay gösterebilmek için sınav sayısını ve öğrenci sayısını şimdilik sabitleyelim. 10 öğrenci ve 3 sınav olsun.
#include <iostream>
int main()
(
// dongu ile notlari al
Diziler
LER İnt sinavNotlarill10d01(3I1; forlint os5Ü; o<lÜ; **o) Şimdiye kadar değişkenleri hep tek tek tanımladık ve kullandık. for(int i-0; i<3;
Bazen aynı tipten olan ve birbiriyle anlamsal olarak da bağlantılı değişken grupları tanımlarız. Örneğin bir sınıftaki öğrencilerin matematik yazılısından aldığı notlar, veya bir futbol oyununda bir takımdaki oyuncuların attığı goller gibi. Bu durumlarda “dizi” kullanabiliriz. Diziler şöyle tanımlanır:
int
Bu şekilde takımdaki 11 oyuncunun gol sayısını saklamak için 11 adet tamsayı tipinde değişken oluşturabiliriz. Bu değişkenlerin herbirine tek tek ulaşmak için “indeksleme” kullanılır. İndeksleme [ ] operatörü ile yapılır. Örneğin:
attigiGoller|(0)|
attigiGoller|(3)|
goller[0] = 2; goller[3] = 3; diyerek ilk oyuncunun 2 gol attığını, 4. oyuncunun ise 3 gol attığını söyleyebiliriz. Dikkat etmeniz gereken nokta indekslemenin 0'dan başladığıdır. Yani yukarıdaki örnekte indeks değeri 0 ile 10 arasında olabilir. 11 ve yukarısı olamaz. Eğer 11 veya yukarısında bir değer kullanırsanız, programınızda öngörülemez hatalar olur (donma, programdan çıkma vs.).
Aynı şekilde dizi elemanlarından okurken de indeksleme kullan-
std::cout << “Altinci oyuncunun gol sayisi”
<< << std::endi;
Dizileri istersek birden fazla boyutlu da yapabiliriz. Örneğin:
Int sinavNotlari(101(31;
Gibi bir dizi kullanarak 10 öğrencilik bir sınıfta 3 sınavın sonuçlarını saklayabileceğimiz toplam otuz değişkeni tanımlayabiliriz.
1
Std::cout “sinav notu: ";
>> sinavNotlarilollil;
)
)
// sonuclari hesapla ve goster
int sinifToplam - O;
forlint os0;
(
// bir ogrencinin notlarini topla
int ogrenciToplam O;
forl(int iş0; iİ<3;
1
ogrenciToplam *- sinavNotlarilollil;
)
// ogrencinin ortalamasini goster
int ogrenciOrtalama ogrenciToplam / 3;
std::cout<<”ogrenci "<< o
<<” ortalamasi: ” << ogrenciOrtalama
// sinif ortalamasi icin biriktir
sinifToplam *t- ogrenciOrtalama;
)
// sinif ortalamasini goster
int sinifOrtalama sinifToplam / 10
std::cout << “Sinif ortalamasi: ” << sinifOrtalama
<2
Yukarıda programımızı geliştirip bir sınıftaki bütün öğrencilerin sınavlardaki notlarını alıp her bir öğrenci için ortalama hesaplayan ve bununla da kalmayıp sonra bütün sınıfın not ortalamasını hesaplayan bir hale getiriyoruz.
Ayrıca programda
sinifToplam *- ogrenciOrtalama;
gibi komutlar var. Bunlar da aslında sık rastlanan komutlardır.
Bu sayede örneğin dördüncü öğrencinin 2. Sınavdan aldığı notu Bu komut girmek için sinifToplam sinifToplam * ogrenciOrtalama; sinavNotlari(31(11| - 80; ile aynıdır. Bu işlemler çok sık kullanıldığı için *—, -— gibi operagibi bir satır yazabiliriz. Yine indekslemenin her iki boyutta da törler geliştirilmiştir. Bu operatörler soldaki argümanı sağdaki argüman ile istenen işleme sokup sonucu tekrar soldaki argümana atarlar.
Böylece daha önce tek öğrencinin notlarını alıp ortalamasını hesaplayan programımızı, dizileri kullanarak n öğrencinin m sınavda aldığı notlardan ortalamalarını hesaplayan ve bunları raporlayan bir hale getirdik.
Bir sonraki bölümde işaretçiler, bellek yönetimi ve fonksiyonlardan bahsedeceğiz.