Programlama Temelleri

3 - Kontrol Akışı - Programın Yönlendiricisi

Emre Can Yılmaz

Ondokuz Mayıs Üniversitesi

2024

Program Akışı

  • Programlar genellikle yukarıdan aşağıya doğru, satır satır çalışır.
  • Kontrol akışı ifadeleri, programın bu sırayı değiştirmesini sağlar.
  • Bu ifadelerle, belirli koşullara bağlı olarak farklı kod bloklarını çalıştırabiliriz veya belirli bir kod bloğunu tekrar tekrar çalıştırabiliriz.

if İfadesi: Karar Verme

  • if ifadesi, bir koşulu kontrol eder ve koşul doğruysa belirtilen kod bloğunu çalıştırır.

Sözdizimi:

if (koşul) {
  // Koşul doğruysa çalışacak kod bloğu
}

Örnek

#include <stdio.h>

int main() {
  int sayi = 10;

  if (sayi > 5) {
    printf("Sayı 5'ten büyüktür.\n");
  }

  return 0;
}

if-else İfadesi: İki Seçenek

  • if-else ifadesi, bir koşulu kontrol eder ve koşul doğruysa bir kod bloğunu, yanlışsa başka bir kod bloğunu çalıştırır.

Sözdizimi:

if (koşul) {
  // Koşul doğruysa çalışacak kod bloğu
} else {
  // Koşul yanlışsa çalışacak kod bloğu
}

Örnek 1

#include <stdio.h>

int main() {
  int sayi = 4;

  if (sayi > 5) {
    printf("Sayı 5'ten büyüktür.\n");
  } else {
    printf("Sayı 5'ten küçük veya eşittir.\n");
  }

  return 0;
}

Örnek 2

#include <stdio.h>

int main() {
  int yas;
  printf("Yaşınızı girin: ");
  scanf("%d", &yas);

  if (yas >= 18) {
    printf("Reşitsiniz.\n");
  } else {
    printf("Reşit değilsiniz.\n");
  }

  return 0;
}

Örnek 3

#include <stdio.h>

int main() {
  int ehliyet = 1; // 1: Ehliyet var, 0: Ehliyet yok

  if (ehliyet == 1) {
    printf("Araba sürebilirsiniz.\n");
  } else {
    printf("Araba süremezsiniz.\n");
  }

  return 0;
}

Ternary Operatörü: Koşullu İfadeleri Kısaltmak

  • Ternary operatörü (?:), if-else yapısının kısa bir alternatifidir ve tek bir satırda koşullu ifadeler yazmamızı sağlar.

Sözdizimi:

koşul ? ifade1 : ifade2
  • koşul: Değerlendirilmek üzere bir mantıksal ifade.
  • ifade1: koşul doğru ise değerlendirilecek ifade.
  • ifade2: koşul yanlış ise değerlendirilecek ifade.

Örnek: En Büyük Sayıyı Bulma

#include <stdio.h>

int main() {
  int sayi1 = 10;
  int sayi2 = 20;
  int enBuyuk = (sayi1 > sayi2) ? sayi1 : sayi2; // Ternary operatörü

  printf("En büyük sayı: %d\n", enBuyuk); // Çıktı: En büyük sayı: 20

  return 0;
}

Bu örnekte, sayi1 > sayi2 koşulu doğru ise enBuyuk değişkenine sayi1 değeri, yanlış ise sayi2 değeri atanır.

else if İfadesi: Çoklu Koşullar

  • Birden fazla koşulu kontrol etmek için else if ifadelerini kullanabiliriz.

Sözdizimi:

if (koşul1) {
  // Kod bloğu 1
} else if (koşul2) {
  // Kod bloğu 2
} else if (koşul3) {
  // Kod bloğu 3
} // ...
else {
  // Hiçbir koşul doğru değilse çalışacak kod bloğu
}

Örnek

#include <stdio.h>

int main() {
  int puan = 75;

  if (puan >= 90) {
    printf("Harf notunuz: AA\n");
  } else if (puan >= 80) {
    printf("Harf notunuz: BA\n");
  } else if (puan >= 70) {
    printf("Harf notunuz: BB\n");
  } else if (puan >= 60) {
    printf("Harf notunuz: CB\n");
  } else if (puan >= 50) {
    printf("Harf notunuz: CC\n");
  } else {
    printf("Harf notunuz: FF\n");
  }

  return 0;
}

İç İçe if İfadeleri

  • if ifadelerini iç içe kullanarak daha karmaşık koşullu durumları kontrol edebiliriz.

Örnek

#include <stdio.h>

int main() {
  int sayi1 = 10;
  int sayi2 = 5;

  if (sayi1 > sayi2) {
    printf("Sayı1, Sayı2'den büyüktür.\n");
    if (sayi1 % 2 == 0) {
      printf("Sayı1 aynı zamanda çifttir.\n");
    }
  }

  return 0;
}

Mantıksal Operatörler ile if İfadeleri

  • && (VE) ve || (VEYA) operatörlerini kullanarak birden fazla koşulu birleştirebiliriz.

Örnek 1

#include <stdio.h>

int main() {
  int yas = 25;
  int ehliyet = 1;

  if (yas >= 18 && ehliyet == 1) {
    printf("Araba kullanabilirsiniz.\n");
  }

  return 0;
}

Örnek 2

#include <stdio.h>

int main() {
  int not = 75;

  if (not >= 80 || not < 50) {
    printf("Notunuz dikkat çekici.\n");
  }

  return 0;
}

switch-case Yapısı: Çoklu Seçenekler

  • switch-case yapısı, bir değişkenin değerine bağlı olarak farklı kod bloklarını çalıştırır.
  • Her bir case etiketi, değişkenin olası bir değerini temsil eder.
  • break ifadesi, switch bloğundan çıkmak için kullanılır.
  • default etiketi, hiçbir case etiketi eşleşmediğinde çalışacak kod bloğunu belirtir.

switch-case Sözdizimi

switch (değişken) {
  case değer1:
    // Kod bloğu 1
    break;
  case değer2:
    // Kod bloğu 2
    break;
  // ...
  default:
    // Hiçbir case eşleşmediğinde çalışacak kod bloğu
}

switch-case Örneği 1: Haftanın Günleri

#include <stdio.h>

int main() {
  int gun = 3;

  switch (gun) {
    case 1:
      printf("Pazartesi\n");
      break;
    case 2:
      printf("Salı\n");
      break;
    case 3:
      printf("Çarşamba\n");
      break;
    case 4:
      printf("Perşembe\n");
      break;
    case 5:
      printf("Cuma\n");
      break;
    case 6:
      printf("Cumartesi\n");
      break;
    case 7:
      printf("Pazar\n");
      break;
    default:
      printf("Geçersiz gün!\n");
  }

  return 0;
}

switch-case Örneği 2: Harf Notları

#include <stdio.h>

int main() {
  char not = 'B';

  switch (not) {
    case 'A':
      printf("Mükemmel!\n");
      break;
    case 'B':
      printf("Çok İyi!\n");
      break;
    case 'C':
      printf("İyi!\n");
      break;
    // ... diğer notlar ...
    default:
      printf("Geçersiz not!\n");
  }

  return 0;
}

switch-case Örneği 3: Ayları Yazdırma

#include <stdio.h>

int main() {
  int ay;

  printf("Ay numarasını girin (1-12): ");
  scanf("%d", &ay);

  switch (ay) {
    case 1:
      printf("Ocak\n");
      break;
    case 2:
      printf("Şubat\n");
      break;
    // ... diğer aylar ...
    default:
      printf("Geçersiz ay!\n");
  }

  return 0;
}

switch-case Örneği 4: Hesap Makinesi

#include <stdio.h>

int main() {
  char operator;
  float sayi1, sayi2, sonuc;

  printf("İki sayı girin: ");
  scanf("%f %f", &sayi1, &sayi2);

  printf("Operatörü girin (+, -, *, /): ");
  scanf(" %c", &operator);

  switch (operator) {
    case '+':
      sonuc = sayi1 + sayi2;
      printf("Sonuç: %.2f\n", sonuc);
      break;
    case '-':
      sonuc = sayi1 - sayi2;
      printf("Sonuç: %.2f\n", sonuc);
      break;
    case '*':
      sonuc = sayi1 * sayi2;
      printf("Sonuç: %.2f\n", sonuc);
      break;
    case '/':
      if (sayi2 == 0) {
        printf("Sıfıra bölme hatası!\n");
      } else {
        sonuc = sayi1 / sayi2;
        printf("Sonuç: %.2f\n", sonuc);
      }
      break;
    default:
      printf("Geçersiz operatör!\n");
  }

  return 0;
}

switch-case’de break İfadesinin Önemi

  • break ifadesi, switch bloğundan çıkmak için kullanılır.
  • break ifadesi kullanılmazsa, program bir sonraki case bloğuna “düşer” ve o kod bloğunu da çalıştırır.

Örnek 1: break Kullanımı

#include <stdio.h>

int main() {
  int gun = 3;

  switch (gun) {
    case 1:
      printf("Pazartesi\n");
    case 2:
      printf("Salı\n");
    case 3:
      printf("Çarşamba\n");
      break;
    // ... diğer günler ...
    default:
      printf("Geçersiz gün!\n");
  }

  return 0;
}
// Çıktı:
// Çarşamba
  • gun değişkeninin değeri 3 olduğu için, program “Çarşamba” yazdırır ve break ifadesine ulaşarak switch bloğundan çıkar.

Örnek 2: break Kullanılmaması

#include <stdio.h>

int main() {
  int gun = 3;

  switch (gun) {
    case 1:
      printf("Pazartesi\n");
    case 2:
      printf("Salı\n");
    case 3:
      printf("Çarşamba\n");
    // ... diğer günler ...
    default:
      printf("Geçersiz gün!\n");
  }

  return 0;
}
// Çıktı:
// Çarşamba
// Perşembe
// Cuma
// Cumartesi
// Pazar
// Geçersiz gün!
  • gun değişkeninin değeri 3 olduğu için, program “Çarşamba” yazdırır, ancak break ifadesi olmadığı için bir sonraki case bloğuna “düşer” ve “Perşembe”, “Cuma”, “Cumartesi”, “Pazar” ve “Geçersiz gün!” mesajlarını da yazdırır.

Döngüler: Tekrarlayan İşlemler

  • Döngüler, belirli bir kod bloğunu tekrar tekrar çalıştırmamızı sağlar.
  • C dilinde üç temel döngü türü vardır: for, while ve do-while.

for Döngüsü

  • for döngüsü, belirli bir sayıda tekrar yapmak için kullanılır.

Sözdizimi:

for (başlangıç; koşul; artış) {
  // Döngü bloğu
}

Başlangıç, Koşul ve Artış:

  • Başlangıç: Döngü değişkenine ilk değer atanır.
  • Koşul: Döngünün devam edip etmeyeceğini belirleyen mantıksal ifade.
  • Artış: Her döngü sonunda döngü değişkeninin değeri artırılır veya azaltılır.

i++ ve i-- Operatörleri

  • i++ operatörü, i değişkeninin değerini her adımda 1 artırır.
  • i-- operatörü, i değişkeninin değerini her adımda 1 azaltır.

Örnek 1: Sayıları Yazdırma

#include <stdio.h>

int main() {
  for (int i = 1; i <= 5; i++) {
    printf("%d\n", i);
  }

  return 0;
}

Örnek 2: Geri Sayım

#include <stdio.h>

int main() {
  for (int i = 10; i > 0; i--) {
    printf("%d\n", i);
  }

  return 0;
}

Örnek 3: 1’den 10’a Kadar Olan Sayıların Toplamı

#include <stdio.h>

int main() {
  int toplam = 0;
  for (int i = 1; i <= 10; i++) {
    toplam += i;
  }
  printf("Toplam: %d\n", toplam);

  return 0;
}

Örnek 4: 1’den 10’a Kadar Olan Çift Sayıları Yazdırma

#include <stdio.h>

int main() {
  for (int i = 1; i <= 10; i++) {
    if (i % 2 == 0) { // i çift ise
      printf("%d\n", i);
    }
  }

  return 0;
}

İç İçe for Döngüleri

  • Döngüleri iç içe kullanarak daha karmaşık işlemler gerçekleştirebiliriz.

Örnek: Çarpım Tablosu

#include <stdio.h>

int main() {
  for (int i = 1; i <= 10; i++) {
    for (int j = 1; j <= 10; j++) {
      printf("%d x %d = %d\n", i, j, i*j);
    }
    printf("\n");
  }

  return 0;
}

while Döngüsü

  • while döngüsü, belirtilen koşul doğru olduğu sürece döngü bloğunu çalıştırır.

Sözdizimi:

while (koşul) {
  // Döngü bloğu
}

Örnek 1: 1’den 5’e Kadar Sayıları Yazdırma

#include <stdio.h>

int main() {
  int i = 1;
  while (i <= 5) {
    printf("%d\n", i);
    i++;
  }

  return 0;
}

Örnek 2: Çift Sayıları Yazdırma

#include <stdio.h>

int main() {
  int sayi = 1;

  while (sayi <= 10) {
    if (sayi % 2 == 0) { // sayi çift ise
      printf("%d\n", sayi);
    }
    sayi++;
  }

  return 0;
}

do-while Döngüsü

  • do-while döngüsü, döngü bloğunu en az bir kez çalıştırır, sonra koşulu kontrol eder.

Sözdizimi:

do {
  // Döngü bloğu
} while (koşul);

Örnek 1

#include <stdio.h>

int main() {
  int i = 1;
  do {
    printf("%d\n", i);
    i++;
  } while (i <= 5);

  return 0;
}

Örnek 2: Kullanıcıdan Sayı Girdisi Alma

#include <stdio.h>

int main() {
  int sayi;

  do {
    printf("Bir sayı girin (0 çıkmak için): ");
    scanf("%d", &sayi);
    printf("Girdiğiniz sayı: %d\n", sayi);
  } while (sayi != 0);

  return 0;
}

break İfadesi: Döngüyü Sonlandırmak

  • break ifadesi, bir döngüyü (for, while veya do-while) hemen sonlandırmak için kullanılır.
  • break ifadesine ulaşıldığında, döngü sona erer ve program akışı döngüden sonraki ifadeye geçer.

Örnek: Döngüyü 5’te Sonlandırma

#include <stdio.h>

int main() {
  for (int i = 1; i <= 10; i++) {
    if (i == 5) {
      break; // i değeri 5 olduğunda döngü sonlandırılır
    }
    printf("%d ", i);
  }
  printf("\n"); // Çıktı: 1 2 3 4
  return 0;
}

continue İfadesi: Döngünün Bir Sonraki Adımına Geçmek

  • continue ifadesi, döngünün mevcut iterasyonunu sonlandırır ve döngünün bir sonraki adımına geçer.
  • continue ifadesine ulaşıldığında, döngü bloğunun geri kalanı atlanır ve döngü koşulunun kontrolüne geri dönülür.

Örnek: Çift Sayıları Atlama

#include <stdio.h>

int main() {
  for (int i = 1; i <= 10; i++) {
    if (i % 2 == 0) {
      continue; // i değeri çift ise, bu iterasyon atlanır
    }
    printf("%d ", i);
  }
  printf("\n"); // Çıktı: 1 3 5 7 9
  return 0;
}

Quiz

  1. Aşağıdaki kodun çıktısı ne olur?
#include <stdio.h>

int main() {
  int x = 5;

  if (x > 10) {
    printf("A");
  } else {
    printf("B");
  }

  return 0;
}
  1. Aşağıdaki kodun çıktısı ne olur?
#include <stdio.h>

int main() {
  int i = 1;

  while (i <= 5) {
    printf("%d ", i);
    i += 2;
  }

  return 0;
}
  1. Aşağıdaki kodun çıktısı ne olur?
#include <stdio.h>

int main() {
  int sayi = 5;

  switch (sayi) {
    case 5:
      printf("Beş");
    case 10:
      printf("On");
      break;
    default:
      printf("Diğer");
  }

  return 0;
}
  1. Aşağıdaki kodun çıktısı ne olur?
#include <stdio.h>

int main() {
  for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= i; j++) {
      printf("*");
    }
    printf("\n");
  }

  return 0;
}
  1. Aşağıdaki kodun çıktısı ne olur?
#include <stdio.h>

int main() {
  int sayac = 0;

  while (sayac < 10) {
    if (sayac == 5) {
      break;
    }
    printf("%d ", sayac);
    sayac++;
  }

  return 0;
}
  1. Aşağıdaki kodun çıktısı ne olur?
#include <stdio.h>

int main() {
  for (int i = 1; i <= 10; i++) {
    if (i % 2 == 0) {
      continue;
    }
    printf("%d ", i);
  }

  return 0;
}

Çalışma Soruları

  1. [Kolay] Kullanıcıdan bir sayı girmesini isteyin ve bu sayının pozitif, negatif veya sıfır olduğunu ekrana yazdırın.

  2. [Kolay] Kullanıcıdan iki sayı girmesini isteyin ve bu sayılardan büyük olanını ekrana yazdırın.

  3. [Orta] Kullanıcıdan bir sayı girmesini isteyin ve bu sayının faktöriyelini hesaplayıp ekrana yazdırın. Faktöriyel hesaplamak için bir for döngüsü kullanın.

  4. [Kolay] Kullanıcıdan bir sayı girmesini isteyin. Girilen sayı 10’dan küçük ise “Küçük”, 10 ile 20 arasında ise “Orta”, 20’den büyük ise “Büyük” yazdırın.

Çalışma Soruları

  1. [Orta] 1’den 100’e kadar olan sayılardan 3’e ve 5’e tam bölünebilenleri ekrana yazdıran bir program yazın.

  2. [Kolay] Kullanıcıdan bir sayı girmesini isteyin ve 1’den girilen sayıya kadar olan sayıların toplamını hesaplayan bir program yazın. while döngüsünü kullanın.

  3. [Zor] Kullanıcıdan bir sayı girmesini isteyin ve bu sayının asal olup olmadığını kontrol eden bir program yazın. Asal sayı, sadece 1’e ve kendisine bölünebilen sayıdır. Programınız, girilen sayının asal olup olmadığını ekrana yazdırmalıdır. while döngüsünü kullanın. Kullanıcı 0 girdiğinde programı sonlandırsın.

  4. [Zor] Fibonacci serisinin ilk n terimini hesaplayan bir program yazın. Kullanıcıdan n değerini alın ve serinin ilk n terimini ekrana yazdırın. Fibonacci serisi, her sayının kendinden önceki iki sayının toplamı olduğu bir sayı dizisidir (örneğin: 0, 1, 1, 2, 3, 5, 8, 13, 21, …).

Çalışma Soruları

  1. [Zor] Aşağıdaki gibi bir menü oluşturun ve kullanıcının seçtiği işlemi gerçekleştiren bir program yazın. Kullanıcı 0’ı seçene kadar menü tekrar tekrar gösterilmelidir. do-while döngüsünü kullanın.
Menü:
1- Toplama
2- Çıkarma
3- Çarpma
4- Bölme
0- Çıkış

Seçiminiz:

Çalışma Soruları

  1. [Kolay] Kullanıcıdan bir sayı (n) girmesini isteyin ve 1’den n’ye kadar olan sayıların karelerini ekrana yazdıran bir program yazın. for döngüsünü kullanın.

Örnek:

Bir sayı girin: 5
1
4
9
16
25

Çalışma Soruları

  1. [Orta] Kullanıcıdan bir sayı (n) girmesini isteyin ve 2’den n’ye kadar (n dahil) olan tek sayıların toplamını hesaplayan bir program yazın. while döngüsünü kullanın.
  2. [Orta] Kullanıcıdan bir sayı (n) girmesini isteyin ve 1’den n’ye kadar olan sayıların karelerinin toplamını hesaplayan bir program yazın. for döngüsünü kullanın.
  3. [Orta] Üç kenar uzunluğu klavyeden girilen bir üçgenin türünü tespit ederek sonucu ekrana yazdıran kodu yazın. (Üçgen çeşitleri: ikizkenar, eşkenar, çeşitkenar)
  4. [Kolay] Bir derse ait üç farklı not değerini girerek ortalamasını hesaplayın. Ortalama 50’den büyükse “Geçti”, küçükse “Kaldı” yazdırın.
  5. [Orta] Klayveden girilen beş adet sayı için sayıların en büyüğünü, en küçüğünü, toplamını ve ortalamasını hesaplayın.

Çalışma Soruları

  1. [Kolay] Klavyeden sıfır değeri girilene kadar girilen sayıların toplamını hesaplayın.
  2. [Zor] Bölenlerinin toplamı kendisine eşit olan sayılara mükemmel sayılar denir. Kullanıcıdan bir sayı girmesini isteyin ve bu sayının mükemmel sayı olup olmadığını kontrol edin.

Özet

  • Kontrol Akışı: Programın çalıştırılma sırasını kontrol etmek için kullanılır.
  • if-else: Bir koşula göre farklı kod bloklarını çalıştırır.
  • else if: Birden fazla koşulu kontrol etmek için kullanılır.
  • İç içe if: Daha karmaşık koşulları kontrol etmek için kullanılır.
  • Ternary Operatörü: Koşullu ifadeler için kısa bir yol sağlar.
  • switch-case: Bir değişkenin değerine göre farklı kod bloklarını çalıştırır.
  • Döngüler: Belirli bir kod bloğunu tekrar tekrar çalıştırır.
  • break: Bir döngüyü sonlandırır.
  • continue: Döngünün bir sonraki adımına geçer.

Gelecek Hafta

  • Standart Kütüphane Fonksiyonları
  • <stdio.h>, <math.h>, <stdlib.h>, <time.h>