C# Akış kontrol mekanizmaları

C# Akış kontrol mekanizmaları, Arkadaşlar yeni bir yazıdan tekrar merhabalar. Hatırlarsanız bir önceki dersimizde Operatörler başlıklı dersimizi işlemiştik. İşte bu operatörlerden özellikle karşılaştırma operatörler ve mantıksal operatörler ile yazılımımıza yön verebiliriz.

Nasıl yani yön verebiliriz ? Şöyle ki; Günlük hayatta bazı durumlarda farklı kararlar vermemiz gerekebilir. Örneğin, hava yağmurlu ise (Koşul) şemsiyeyi al (Eylem). İşte yazılımda da bu gibi koşul/şart ve bu koşula/şarta göre gerekli eylemlerin yapılmasının gerektiği durumlarda dersimizin konusu olan kontrol mekanizmaları devreye giriyor. Neyse işin hikaye kısmına çok girmeden yavaş yavaş sadede gelelim ve biraz kod yazmaya başlayalım.

AKIŞ KONTROL MEKANİZMALARI
Bir program çoğu zaman çeşitli koşullara göre farklı komutlar çalıştırmamız gerekir. Benzer şekilde çoğu komutun da yalnızca bir kez çalıştırılması bizim için yeterli gelmez, belli koşulları sağladığı sürece sürekli çalıştırılmasını istediğimiz komutlar olabilir. İşte bu gibi durumlar için C#’ta akış kontrol mekanizmaları vardır.

If – Else If – Else Blokları
if else deyimi sayesinde belli bir koşul sağlandığında söz konusu komutlar çalıştırılır, o belli koşullar sağlanmadığında çalıştırılmaz ya da başka komutlar çalıştırılır. Kullanılışı şu şekildedir:

if blokları

if blokları

if(koşul)
 	komut1;//Tek satır kodlarda  {} gerek yoktur.
 else
 	komut2;//Tek satır kodlarda  {} gerek yoktur.

veya

 if(koşul)
 {
 	komutlar1;
	komutlar;
	komutlar3;
 }
 else
 {
 	Komutlar4;
 }

Yukarıdaki örneklerde eğer koşul sağlanırsa 1. komutlar, sağlanmazsa 2. komutlar çalıştırılır. if veya else’in altında birden fazla komut varsa bu komutları parantez içine almak gerekir. if veya else‘in altında tek komut varsa bu komutları parantez içine almak gerekmez.

static void Main()
{
int a=5, b=7;
if(a<b) //if yapısının sonunda “;” OLMAZ
   Console.Write("a b'den küçük");
else
   Console.Write("a b'den küçük değil");
}

Bu örnekte a ve b adında ve int tipinde 2 adet değişken tanımlanmış. Ve bu değişkene başlangıç değeri olara 5 ve 7 değerleri verilmiş. Koşula göre iki bloktan birine dallanma gerçekleşir.

static void Main()
{
int a=5, b=7;
if(a<b)
  {
   Console.WriteLine("a b'den küçük");
   Console.Write(a);
   }
 else
   {
    Console.WriteLine("a b'den küçük değil");
    Console.Write(b);
    }
}

Bu örnekte if blokları içerisinde birden fazla satır işletilmiştir.

HATIRLATMA
if else yapılarında else kısmının bulunması zorunlu değildir. Bu durumda sadece koşul sağlandığında bir şeyler yapılacak, koşul sağlanmadığında bir şeyler yapılmayacaktır.

int a=5, b=7;
if(a<b)
   Console.WriteLine("a b'den küçük");

if bloklarının diğer kullanım şekli ile else if formatındadır. Bu formattan birçok koşula göre program dallanma gerçekleştirir.

Console.Write("Cinsiyet girin (e, k)");
Char cins;
cins=Convert.ToChar(Console.ReadLine());
if(cins=='e')
  Console.Write("Erkeksiniz");
else if(cins=='k')
  Console.Write("Kızsınız");
else
  Console.Write("Lütfen doğru giriniz");

Bu program kullanıcıdan cinsiyetini girmesi istemekte, eğer kullanıcının girdiği harf “e” ise ekrana “Erkeksiniz” yazmakta, eğer girdiği harf “e” değilse ise bu sefer kullanıcının girdiği harfi “k” mı değil mi diye incelemekte, eğer “k” girmişse ekrana “Kızsınız” yazmakta, bunların dışında bir harf girdiğinde de ekrana “Lütfen doğru giriniz! ” yazmaktadır. Bu şekilde bu bloklar daha da uzatılabilir. Yani else if satırının bir tane olması zorunlu değildir. Ancak tabii ki else satırının yalnızca bir tane olması gerekir.

ÖNEMLİ
C# iç içe if else kullanılmasına izin verir. Yani iç içe birçok koşul eklenebilir. Bu koşullar dıştan içe doğru belirlenen şart sağlandığı sürece işler.

iç içe if blokları

iç içe if blokları

if(koşul1)
{
 	if(koşul2)
 		komut1;
	else
 	{
			if(koşul3)
			komut2;	
		komut3;
 		komut4;
 	}
 }
 else
 	komut5;

Switch Case Bloğu

switch case blokları

switch case blokları

Switch deyimi bazı if else deyimlerinin yaptığı işi daha az kodla yapar. Genellikle bazı karmaşık if else bloklarını kurmaktansa switch’i kullanmak programın anlaşılırlığını artırır. Ancak tabii ki basit if else bloklarında bu komutun kullanılması gereksizdir.
Switch case if’e benzer şekilde bir değişkenin almış olduğu değere uygun kodları icra eder. Burada değişken switch deyiminde parentez içerisine yazılır, değişkenin almış olduğu değer case ile belirtilen koşullarla karşılaştırılır. Koşul sağlandığında koşulun ait olduğu case bloğu çalışacaktır. Diğer case blokları çalıştırılmaz.
Her bir case deyimi break; ile sonlandırılmalıdır. Eğer case ile belirtilen koşulların hiç biri sağlanmaz ise default ile belirtilen komutlar çalışacaktır. Her bir koşuldan sonra ve default deyiminden sonra iki nokta üstüste (:) işareti kullanıldığına dikkat ediniz.

switch(ifade)
 {
 	case sabit1:
 		komut1;
 		break;
 	case sabit2:
 		komut2;
 		break;
 	default:
 		komut3;
		break;
 }

SIK YAPILAN HATALAR
– if bloklarının sonunda “;” kullanılması. if ();
– if bloğunun sonunu belirleyen küme parantezlerinden sonra “;” kullanmak {};
– Çok satırlı if kullanımında { } parantezlerinin kullanılmaması durumunda sadece bir satır işletilir.
– Else bloğundan sonra “;” kullanılması. (Else;)
– if bloğunda karşılaştırma operatörü olarak “==” yerin “=” kullanmak.
– Else if bloğunu bitişik yazman. Elseif()
– Break komutu unutulursa koşula bakılmaksızın diğer case bloğu işletilir.
– Switch (Koşul); ifadesinin sonuna “;” koyulması.
– Case satırının sonuna “;” koyulmaması.
– Case etiketinin birleşik yazılması. CaseDeger;

ÖRNEK – 1 (Karşılaştırma Operatörler)

Senaryo: Girilen iki sayıdan büyük olanı bulup ekrana yazan C# uygulamasını yazınız.(C# Akış kontrol mekanizmaları Karşılaştırma operatörleri kullanınız.)

ÖRNEK – 2(Karşılaştırma Operatörler)

Senaryo: Kullanıcıdan alınan 2 sayıya yine kullanıcıdan alınacak değere göre dört işlem uygulayan C# programını yazınız. (Toplama için 1, Çıkartma için 2, Çarpma için 3, Bölme için 4 girilecek. Bu değerler dışındaki girişler için hatalı giriş yaptınız şeklinde uyarı verecek.)(C# Akış kontrol mekanizmaları Karşılaştırma operatörleri kullanınız.)

ÖRNEK – 3(Karşılaştırma Operatörler)

Senaryo: Bir mağaza müşterilerine yaptıkları alışveriş tutarına göre indirim yapmaktadır.
200 TL ye kadar olan alışverişler için %10
200-400 TL arası olan alışverişler için %15
400 TL den fazla olan alışverişler için %20 Buna göre bir kişinin ödeyeceği net miktarı hesaplayan C# programın kodunu yazınız.(C# Akış kontrol mekanizmaları Karşılaştırma operatörleri kullanınız.)

ÖRNEK – 4(Karşılaştırma Operatörleri)

Senaryo: Girilen rakama göre haftanın gününü veren C# uygulamasını yazınız. (1 için pazartesi, 2 için Salı,v.s. Ekran çıktısı şu şekilde olacak. “Haftanın 3. Günü Çarşambadır.”)(C# Akış kontrol mekanizmaları Karşılaştırma operatörleri kullanınız.)

ÖRNEK – 5(Karşılaştırma Operatörleri)

Senaryo: Klavyeden kullanıcıya su sıcaklığı girdirerek, sıcaklık 0’dan büyükse sıvı, değilse katı yazdıran programı oluşturun.  (C# Akış kontrol mekanizmaları Karşılaştırma operatörleri kullanınız.)

ÖRNEK – 6 (Mantıksal Operatörler)

Senaryo: Bir otoparkın ücret tarifesi şöyledir:
0 – 3 saat: 4 TL
3 – 7 saat: 3 TL
7 – 12 saat: 2 TL
12 ve üzeri: 1 TL’dir.
Buna göre girilen saate göre otoparka ödenecek ücreti hesaplayıp ekrana yazan programı oluşturunuz.

ÖRNEK – 7 (Mantıksal Operatörler)

Senaryo: Kullanıcıya Almanca ya da İngilizce ve ofis programları bilip bilmediğini soran, daha sonra C# programlamayı bilip bilmediğini sorup, Almanca ya da İngilizceden birini biliyorsa ve C# programlama biliyorsa “İşe başlayabilirsiniz”, değilse “Kurs almalısınız” mesajı veren programı oluşturunuz. (C# Akış kontrol mekanizmaları mantıksal operatörler kullanınız.)

ÖRNEK – 8 (İç İçe if li ifadeler)

Senaryo: İlk olarak ekranda
1-Kare
2-Dikdörtgen gibi iki seçenek görünür. Kullanıcı hangi seçeneği seçerse seçilen seçeneğe göre
1-Alan
2-Çevre seçenekleri ekrana gelir. Hangi seçimi yaparsa onunla ilgili bilgi alma ekranı gelir ve sonuç görüntülenir. (C# Akış kontrol mekanizmaları iç içe if blokları kullanınız.)

ÖRNEK – 9 (Switch -Case)

Senaryo: Girilen rakama göre haftanın gününü veren C# uygulamasını yazınız. (C# Akış kontrol mekanizmaları switch case kullanınız.)

ÖRNEK – 10 (Switch -Case)

Senaryo: Klavyeden girilen bir karakterin sesli bir harf mi yoksa sessiz bir harf mi olduğunu tespit ekrana yazan programı yazınız. (C# Akış kontrol mekanizmaları switch case kullanınız.)

C# Akış kontrol mekanizmaları için artık birazda ödev zamanı!

Aşağıdaki örnekleri çözmeye başlayarak kendinizi biraz test edebilirsiniz. Lütfen cevaplar kısmına bakmadan önce elinizden gelen çabayı gösterdiğinizden emin olunuz 🙂

ÖDEV – 1
Senaryo: Girilen bir rakamın çift mi yoksa tek mi olduğunu bulup ekrana yazan C# programını yazın.
ÖDEV – 2
Senaryo: Girilen bir rakamın çift mi yoksa tek mi olduğunu bulup ekrana yazan C# programını yazın.
ÖDEV – 3
Senaryo: Kullanıcıdan alınan üç sayıdan en büyüğünü bulan programın C# kodunu yazınız.
ÖDEV – 4
Senaryo: Kullanıcıdan alınan 1 ila 12 arasındaki bir sayıya göre o ayın kaç çektiğini (28-30-31) veren C# kodunu yazınız.

Son olarak “Günay Karlı hocanın – C’ de Problem Çözme Mantığı” adlı kitaptan bir proje ile dersimizi sonlandıralım.

PROJE
Senaryo: Sabah 06:00 ile gece 24:00 saatleri arasında açık tutulan bir otoparkta, işletmeci, araba sahiplerinden otoparkta kalış süresine göre ücret almaktadır. Tarife şu şekildedir. İlk saat için sabit 10TL ücret alınmaktadır. Bir saati aşan süreler için aşağıdaki tablolar kullanılmaktadır. Ayrıca ekstra ücret talep ederken yeni saat dilimi içerisinde 10dk süre aşılmış ise bu ekstra bir saat anlamına gelmektedir. Eğer 10dk lık süre aşılmamış ise bu sür için ücret talep edilmemektedir.
Ekstra Saat Miktarı Her Ekstra Saat İçin
1 – 5 8
6 – 12 6
13 – 15 4
15 – 17 2
Giriş saati girin : 10 Çıkış saati girin : 18
Giriş dakikası girin: 12 Çıkış dakikası girin: 24
Ödenecek toplam tutar:115

ÖRNEK – 1 ÇÖZÜMÜ

int sayi1, sayi2;
Console.Write("Birinci sayıyı girin."); 
sayi1 = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("İkinci sayıyı girin.");
sayi2 = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("İkinci sayıyı girin.");
if(sayi1>sayi2)
   Console.WriteLine("1. sayı olan {0} daha büyük.",sayi1);
else
   Console.WriteLine("2. sayı olan {0} daha büyük.", sayi2);

//Çalışma hatasını bulun?
Console.ReadKey();

ÖRNEK – 2 ÇÖZÜMÜ

int sayi1, sayi2, sonuc;
byte islem; //Neden byte tanımladık ?
Console.Write("Birinci sayıyı girin."); //Write ve WriteLine farkına dikkat edin.
sayi1 = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("İkinci sayıyı girin.");
sayi2 = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("İkinci sayıyı girin.");
Console.WriteLine("Yapılacak olan işlemi seçin.");
islem = Convert.ToByte(Console.ReadLine());
if (islem == 1)
{
  sonuc = sayi1 + sayi2;
  Console.WriteLine("İşlem sonucu={0}.",sonuc);
  //"{0}" kullanımına dikkat;
}
else if (islem == 2)
{
  sonuc = sayi1 - sayi2;
  Console.WriteLine("İşlem sonucu={0}.", sonuc);
  //"{0}" kullanımına dikkat;
}
else if (islem == 3)
{
  sonuc = sayi1 * sayi2;
  Console.WriteLine("İşlem sonucu={0}.", sonuc);
}
else if (islem == 4)
{
  sonuc = sayi1 / sayi2;
  Console.WriteLine("İşlem sonucu={0}.", sonuc);
}
else
{
  Console.WriteLine("Hatalı değer girdiniz. ");
}
//Kod kısaltma nerelerde yapılabilir?

ÖRNEK – 3 ÇÖZÜMÜ

int alisverisTutari,indirimliAlisveriTutari;
byte indirimOrani=0; //Neden 0 tanımladık ?
Console.Write("Alışveriş tutarını girin.");
alisverisTutari = Convert.ToInt32(Console.ReadLine());
if(alisverisTutari<=200)
  indirimOrani = 10;
else if(alisverisTutari<=400) indirimOrani = 15; else if(alisverisTutari>400)
  indirimOrani = 20;

indirimliAlisveriTutari = alisverisTutari - alisverisTutari * indirimOrani / 100;
Console.Write("Alışveriş tutarınız={0} ve indirim oranınız= {1}, indirimli alışveriş tutarınız={2}",alisverisTutari,indirimOrani,indirimliAlisveriTutari); 
//{} kullanımına dikkat
Console.ReadLine();

ÖRNEK – 4 ÇÖZÜMÜ

byte gunSirasi; //Neden 0 tanımladık ?
string gunAdi="";
Console.Write("Haftanın gününü girin.");
gunSirasi= Convert.ToByte(Console.ReadLine());
if (gunSirasi == 1)
   gunAdi = "Pazartesi";
else if (gunSirasi == 2)
   gunAdi = "Salı";
else if (gunSirasi == 3)
   gunAdi = "Çarişamba";
else if (gunSirasi == 4)
   gunAdi = "Perşembe";
else if (gunSirasi == 5)
   gunAdi = "Cuma";
else if (gunSirasi == 6)
   gunAdi = "Cumatesi";
else if (gunSirasi == 7)
   gunAdi = "Pazar";
// Else bloğu kullanılmalı mı ? 
// Kullanılacaksa nasıl bir kullanım olmalı?
Console.Write("Haftanın " + gunSirasi + ". günü " + gunAdi + "dir.");
//1-7 dışında bir rakam girilirse çıktı ne olur?
Console.ReadKey();

ÖRNEK – 5 ÇÖZÜMÜ

int suSicakligi;
Console.Write("Su sıcaklığını girin.");
suSicakligi = Convert.ToInt32(Console.ReadLine());
if (suSicakligi<0)
   Console.WriteLine("Su katı halde.");
else
   Console.WriteLine("Su sıvı halde.");

ÖRNEK – 6 ÇÖZÜMÜ

int parkSaati=0;int ucret=0;
Console.Write("Park süresini girin.");
parkSaati = Convert.ToInt32(Console.ReadLine());
if (parkSaati < 3) ucret = parkSaati * 4; else if(parkSaati>3 && parkSaati<7) ucret = parkSaati * 3; else if (parkSaati >= 7 && parkSaati < 12) ucret = parkSaati * 2; else if (parkSaati>=12)
   ucret = parkSaati * 1;

Console.Write("Ödenecek Toplam Park Ücreti = {0}.",ucret);

ÖRNEK – 7 ÇÖZÜMÜ

string yb_dil; char bilgisayar; 
Console.Write("Bu Dillerden Hangisini Biliyorsunuz?(Almanca/İngilizce):");
yb_dil = Console.ReadLine();
Console.Write("C# Biliyor Musunuz?E/H)");
bilgisayar = Convert.ToChar(Console.ReadLine());
if ((yb_dil=="Almanca" || yb_dil=="İngilizce")&&(bilgisayar=='E'))
   Console.WriteLine("İşe Başlayabilirsiniz");
else
   Console.WriteLine("Kurs Almalısınız");

ÖRNEK – 8 ÇÖZÜMÜ

string kareDikdortgen = "", alanCevre = "";
int a, b, cevre, alan;
Console.WriteLine("1- Kare");
Console.WriteLine("2- Diktörtgen");
Console.Write("Seçiminiz (1-2) : ");
kareDikdortgen = Console.ReadLine();
if (kareDikdortgen == "1")
{
  Console.WriteLine("1- Alan");
  Console.WriteLine("2- Çevre");
  Console.Write("Seçiminiz (1-2) : ");
  alanCevre = Console.ReadLine();
  if (alanCevre == "1")
    {
       Console.Write("Kenarı giriniz = ");
       a = int.Parse(Console.ReadLine());
       alan = a * a;
       Console.WriteLine("Alan = {0}", alan);
    }
  if (alanCevre == "2")
    {
       Console.Write("Kenarı giriniz = ");
       a = int.Parse(Console.ReadLine());
       cevre = 4 * a;
       Console.WriteLine("Çevre={0}", cevre);
    }
}
if (kareDikdortgen == "2")
{
  Console.WriteLine("1- Alan");
  Console.WriteLine("2- Çevre");
  Console.Write("Seçiminiz (1-2) : ");
  alanCevre = Console.ReadLine();
  if (alanCevre == "1")
    {
      Console.Write("Uzun kenarı giriniz = ");
      a = int.Parse(Console.ReadLine());
      Console.Write("Kısa kenarı giriniz = ");
      b = int.Parse(Console.ReadLine());
      alan = a * b;
      Console.WriteLine("Alan = {0}", alan);
    }
  if (alanCevre == "2")
    {
      Console.Write("Uzun kenarı giriniz = ");
      a = int.Parse(Console.ReadLine());
      Console.Write("Kısa kenarı giriniz = ");
      b = int.Parse(Console.ReadLine());
      cevre = 2 * (a + b);
      Console.WriteLine("Çevre = {0}", cevre);
    }
}

ÖRNEK – 9 ÇÖZÜMÜ

int sayi;
Console.Write("1-7 arasında sayı giriniz: ");
sayi = Convert.ToInt16(Console.ReadLine());
switch (sayi)
{
  case 1: Console.Write("Pazartesi"); break;
  case 2: Console.Write("Salı"); break;  
  case 3: Console.Write("Çarşamba"); break; 
  case 4: Console.Write("Perşembe"); break;
  case 5: Console.Write("Cuma"); break; 
  case 6: Console.Write("Cumartesi"); break; 
  case 7: Console.Write("Pazar"); break; 
  default: Console.Write("Hata Giriş");Break;
}

ÖRNEK – 10 ÇÖZÜMÜ

char harf;
Console.Write("Bir karakter giriniz : ");
harf= Convert.ToChar(Console.ReadLine());
switch (harf)
{
case 'a': 
case 'e': 
     	case 'u': 
      	case 'ü': 
      	case 'ı': 
      	case 'i': 
      	case 'o': 
      	case 'ö': 
default: Console.WriteLine("\nGirilen karakter sessiz bir harf");
break;
}

PROJE ÇÖZÜMÜ

int girisSaati, girisDakikasi;
int cikisSaati, cikisDakikasi;
int gecenSaat, gecenDakika;
int saatBasiPara=0;
int toplamSure = 0;
int toplamUcret = 0;
int sabitUcret=10;
Console.Write("Giris saatini girin    :  ");
girisSaati = Convert.ToInt32(Console.ReadLine());
Console.Write("Giris dakikasını girin :  ");
girisDakikasi = Convert.ToInt32(Console.ReadLine());
            
Console.Write("Çıkış saatini girin    :  ");
cikisSaati = Convert.ToInt32(Console.ReadLine());
Console.Write("Çıkış dakikası girin   :  ");
cikisDakikasi = Convert.ToInt32(Console.ReadLine());

if (cikisDakikasi < girisDakikasi) { cikisDakikasi += 60; cikisSaati--; } gecenSaat = cikisSaati - girisSaati; gecenDakika = cikisDakikasi - girisDakikasi; if (gecenDakika > 10)
   gecenSaat++;

if (gecenSaat == 0)
    toplamSure = 1;
else
    toplamSure = gecenSaat;

if(toplamSure > 0)
{
    if(toplamSure<=5)
        saatBasiPara=8;
    else if(toplamSure<=8)
        saatBasiPara=6;
    else if(toplamSure<=15)
        saatBasiPara=4;
    else
        saatBasiPara=2;
}

toplamUcret = toplamSure * saatBasiPara + sabitUcret;

Console.WriteLine(toplamUcret);
Console.ReadKey();

Evet böylece örnekler ve proje çözümü ile birlikte Akış kontrol mekanizmaları dersinin de sonuna gelmiş bulunuyoruz. Umarım faydalı bir ders olmuştur.
Dilerseniz bir önceki dersimiz olan Operatörler konusunu tekrar edebilirsiniz.
Bir sonraki dersimiz olan Döngüler konusunda görüşmek üzere…