C# Döngüler (for, foreach, while, do-while)
C#’ta for, foreach, while ve do-while döngülerinin nasıl kullanıldığını öğrenin. Tekrar eden işlemleri yönetmek için pratik örnekler keşfedin.
C# dilinde döngüler, belirli bir koşul doğru olduğu sürece aynı kod bloğunu tekrar tekrar çalıştırmamızı sağlar. Programcıya zamandan tasarruf sağlar ve tekrar eden işlemleri kolayca yapabilmemizi mümkün kılar. C#’ta en çok kullanılan döngüler: for, foreach, while ve do-while döngüleridir.
for Döngüsü
for döngüsü, genellikle tekrar sayısının bilindiği durumlarda kullanılır. Sayaç değişkeni ile kontrol edilir.
İleri Sayım: i sayacı her seferinde 1 artacak. 5 olmadan döngü bitecek.
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Adım: " + i);
}
// Çıktı:
Adım: 0
Adım: 1
Adım: 2
Adım: 3
Adım: 4
Geriye Doğru Sayım: i sayacı her seferinde 1 eksilecek. 0 olmadan döngü bitecek.
for (int i = 5; i > 0; i--)
{
Console.WriteLine("Geri Sayım: " + i);
}
// Çıktı:
Geri Sayım: 5
Geri Sayım: 4
Geri Sayım: 3
Geri Sayım: 2
Geri Sayım: 1
5’er 5’er Artış i sayacı her seferinde 5 artacak. 25 olduğunda döngü bitecek.
for (int i = 0; i <= 25; i += 5)
{
Console.WriteLine("Sayı: " + i);
}
// Çıktı:
Sayı: 0
Sayı: 5
Sayı: 10
Sayı: 15
Sayı: 20
Sayı: 25
İç İçe for Döngüsü: İç içe i ve j sayaçları ile her biri 3'e kadar sayarken ekrana çarpımlarını yazan programın çıktısı şöyle olacaktır.
for (int i = 1; i <= 3; i++)
{
for (int j = 1; j <= 3; j++)
{
Console.Write($"{i * j}\t");
}
Console.WriteLine();
}
// Çıktı:
1 2 3
2 4 6
3 6 9
break ve continue
Döngülerde bazen akışı kontrol etmek için break ve continue anahtar kelimeleri kullanılır.
break: Döngüyü tamamen sonlandırır.
for (int i = 1; i <= 5; i++)
{
if (i == 3)
break; // i değeri 3 olduğunda döngü sona erer
Console.WriteLine("i: " + i);
}
// Çıktı:
i: 1
i: 2
continue: Sadece o adımdaki işlemi atlar, döngünün geri kalanı devam eder.
for (int i = 1; i <= 5; i++)
{
if (i == 3)
continue; // i değeri 3 olduğunda bu adımı atlar
Console.WriteLine("i: " + i);
}
// Çıktı:
i: 1
i: 2
i: 4
i: 5
foreach Döngüsü
foreach döngüsü, koleksiyonlar (dizi, liste vb.) üzerinde gezinmek için kullanılır. Eleman sayısını bilmeye gerek yoktur.
string[] meyveler = { "Elma", "Armut", "Muz" };
foreach (string meyve in meyveler)
{
Console.WriteLine(meyve);
}
Bu örnekte meyveler dizisindeki her eleman sırayla ekrana yazdırılır.
while Döngüsü
while döngüsü, koşul doğru olduğu sürece tekrar eder. Kaç kez çalışacağı önceden bilinmeyebilir.
Basit Sayaç: sayi değişkeni 1’den başlayıp 3’e kadar ekrana yazdırılır.
int sayi = 1;
while (sayi <= 3)
{
Console.WriteLine("Sayı: " + sayi);
sayi++;
}
// Çıktı:
Sayı: 1
Sayı: 2
Sayı: 3
String Karakterlerini Yazdırma: Bu örnekte while döngüsü ile bir metnin karakterleri tek tek yazdırılır.
Eğer boşluk karakteri gelirse continue ile atlanır. Nokta (.) karakteri geldiğinde ise break ile döngü sona erer.
string metin = "Bugün hava güzel. Dışarı çıkalım.";
int index = 0;
while (index < metin.Length)
{
char c = metin[index];
if (c == ' ')
{
index++;
continue; // boşlukları atla
}
if (c == '.')
break; // nokta geldiğinde döngüyü bitir
Console.WriteLine(c);
index++;
}
// Çıktı:
B
u
g
ü
n
h
a
v
a
g
ü
z
e
l
Sonsuz while(true) Örneği: Sonsuz döngülerde break ile çıkış yapılabilir.
Bu örnekte kullanıcı doğru şifreyi girene kadar tekrar sorulur.
while (true)
{
Console.Write("Şifreyi giriniz: ");
string sifre = Console.ReadLine();
if (sifre == "1234")
{
Console.WriteLine("Giriş başarılı!");
break; // doğru şifre girildi, döngüden çık
}
Console.WriteLine("Hatalı şifre, tekrar deneyin.");
}
// Örnek Çalışma:
Şifreyi giriniz: 1111
Hatalı şifre, tekrar deneyin.
Şifreyi giriniz: 2222
Hatalı şifre, tekrar deneyin.
Şifreyi giriniz: 1234
Giriş başarılı!
do-while Döngüsü
do-while döngüsü, en az bir kez çalışır ve daha sonra koşulu kontrol eder. Yani koşul yanlış olsa bile döngü en az bir kere çalışır.
Basit Örnek: Koşul baştan sağlanmasa bile döngü bir kez çalışacaktır.
int x = 5;
do
{
Console.WriteLine("x değeri: " + x);
x++;
} while (x < 5);
// Çıktı:
x değeri: 5
Tam Bölenleri Bulma: Kullanıcıdan alınan bir sayının tam bölenleri do-while döngüsü ile bulunur.
Console.Write("Bir sayı giriniz: ");
int sayi = int.Parse(Console.ReadLine());
if (sayi <= 0)
{
Console.WriteLine("0'dan büyük bir sayı giriniz.");
}
else
{
int bolen = sayi;
Console.WriteLine($"{sayi} sayısının tam bölenleri:");
do
{
if (sayi % bolen == 0)
{
Console.WriteLine(bolen);
}
bolen--;
} while (bolen >= 1);
}
// Örnek Çalışma:
Bir sayı giriniz: 12
12 sayısının tam bölenleri:
12
6
4
3
2
Özet
- for → Sayaç kontrollü tekrarlar için uygundur.
- foreach → Koleksiyon veya diziler üzerinde gezinmek için kullanılır.
- while → Koşul sağlandıkça tekrar eder.
- do-while → En az bir kez çalışır, sonra koşulu kontrol eder.
- break → Döngüyü bitirir.
- continue → Döngünün mevcut adımını atlar.
Uygulama: Ok Tuşlarıyla Menü ve Ürün Yönetimi
Bu örnekte sonsuz döngü ile çalışan, ok tuşları (↑/↓) ve Enter ile seçim yapılan basit bir menü yazıyoruz.
5 adet ürün için isim ve fiyat bilgilerinin tutulduğu diziler kullanılır.
Menüler: Ürünleri Yazdır, Ürün Güncelle, Ürün Sil, Kapat.
using System;
using System.Globalization;
class Program
{
static void Main()
{
string[] urunAdlari = { "Kalem", "Defter", "Silgi", "Çanta", "Cetvel" };
decimal[] urunFiyatlari = { 12.5m, 45m, 7.9m, 350m, 22.75m };
string[] menu = { "Ürünleri Yazdır", "Ürün Güncelle", "Ürün Sil", "Kapat" };
int secili = 0;
while (true) // Sonsuz döngü
{
Console.Clear();
Console.WriteLine("=== Ürün Yönetimi ===\n");
// Menü çizimi
for (int i = 0; i < menu.Length; i++)
{
if (i == secili)
{
Console.ForegroundColor = ConsoleColor.Black;
Console.BackgroundColor = ConsoleColor.Cyan;
Console.WriteLine($"> {menu[i]}");
Console.ResetColor();
}
else
{
Console.WriteLine($" {menu[i]}");
}
}
Console.WriteLine("\nOk tuşları ile gez, Enter ile seç, Esc ile çık.");
var key = Console.ReadKey(true);
if (key.Key == ConsoleKey.UpArrow)
secili = (secili - 1 + menu.Length) % menu.Length;
else if (key.Key == ConsoleKey.DownArrow)
secili = (secili + 1) % menu.Length;
else if (key.Key == ConsoleKey.Escape)
break;
else if (key.Key == ConsoleKey.Enter)
{
if (secili == 0) // Ürünleri Yazdır
{
Console.Clear();
Console.WriteLine("=== Ürün Listesi ===\n");
for (int i = 0; i < urunAdlari.Length; i++)
{
string ad = string.IsNullOrWhiteSpace(urunAdlari[i]) ? "(silinmiş)" : urunAdlari[i];
Console.WriteLine($"{i + 1}. {ad,-15} | {urunFiyatlari[i],8:0.00} TL");
}
Console.WriteLine("\nDevam için bir tuşa basın...");
Console.ReadKey(true);
}
else if (secili == 1) // Ürün Güncelle
{
int index = 0;
while (true)
{
Console.Clear();
Console.WriteLine("=== Güncellenecek Ürün Seçin ===\n");
for (int i = 0; i < urunAdlari.Length; i++)
{
string ad = string.IsNullOrWhiteSpace(urunAdlari[i]) ? "(silinmiş)" : urunAdlari[i];
if (i == index)
{
Console.ForegroundColor = ConsoleColor.Black;
Console.BackgroundColor = ConsoleColor.Yellow;
Console.WriteLine($"> {i + 1}. {ad,-15} | {urunFiyatlari[i],8:0.00} TL");
Console.ResetColor();
}
else
{
Console.WriteLine($" {i + 1}. {ad,-15} | {urunFiyatlari[i],8:0.00} TL");
}
}
Console.WriteLine("\nOk tuşları ile gez, Enter ile seç, Esc ile geri dön.");
var k = Console.ReadKey(true);
if (k.Key == ConsoleKey.UpArrow) index = (index - 1 + urunAdlari.Length) % urunAdlari.Length;
else if (k.Key == ConsoleKey.DownArrow) index = (index + 1) % urunAdlari.Length;
else if (k.Key == ConsoleKey.Escape) break;
else if (k.Key == ConsoleKey.Enter)
{
Console.Clear();
Console.WriteLine("=== Ürün Güncelle ===\n");
Console.WriteLine($"Seçili: {urunAdlari[index]} | Eski fiyat: {urunFiyatlari[index]:0.00} TL\n");
Console.Write("Yeni isim (boş bırakılırsa değişmez): ");
string yeniAd = Console.ReadLine();
if (!string.IsNullOrWhiteSpace(yeniAd))
urunAdlari[index] = yeniAd.Trim();
Console.Write("Yeni fiyat (boş bırakılırsa değişmez): ");
string fiyatStr = Console.ReadLine();
if (decimal.TryParse(fiyatStr, NumberStyles.Any, CultureInfo.InvariantCulture, out decimal yeniFiyat))
urunFiyatlari[index] = Math.Max(0, yeniFiyat);
Console.WriteLine("\nGüncelleme tamamlandı. Devam için tuşa bas...");
Console.ReadKey(true);
break;
}
}
}
else if (secili == 2) // Ürün Sil
{
int index = 0;
while (true)
{
Console.Clear();
Console.WriteLine("=== Silinecek Ürün Seçin ===\n");
for (int i = 0; i < urunAdlari.Length; i++)
{
string ad = string.IsNullOrWhiteSpace(urunAdlari[i]) ? "(silinmiş)" : urunAdlari[i];
if (i == index)
{
Console.ForegroundColor = ConsoleColor.Black;
Console.BackgroundColor = ConsoleColor.Red;
Console.WriteLine($"> {i + 1}. {ad,-15} | {urunFiyatlari[i],8:0.00} TL");
Console.ResetColor();
}
else
{
Console.WriteLine($" {i + 1}. {ad,-15} | {urunFiyatlari[i],8:0.00} TL");
}
}
Console.WriteLine("\nOk tuşları ile gez, Enter ile seç, Esc ile geri dön.");
var k = Console.ReadKey(true);
if (k.Key == ConsoleKey.UpArrow) index = (index - 1 + urunAdlari.Length) % urunAdlari.Length;
else if (k.Key == ConsoleKey.DownArrow) index = (index + 1) % urunAdlari.Length;
else if (k.Key == ConsoleKey.Escape) break;
else if (k.Key == ConsoleKey.Enter)
{
urunAdlari[index] = string.Empty;
urunFiyatlari[index] = 0m;
Console.WriteLine("\nÜrün silindi. Devam için tuşa bas...");
Console.ReadKey(true);
break;
}
}
}
else if (secili == 3) // Kapat
{
return;
}
}
}
}
}
Notlar:
- Ok tuşlarıyla gezinme için
Console.ReadKey(true)veConsoleKeykullanılır. - Menüler sonsuz döngü içinde tekrar çizilir;
EscveyaKapatile çıkılır. - Silinen ürün
(silinmiş)etiketiyle ve0 TLfiyatla gösterilir. - Fiyat girişinde sayısal çevrim için
decimal.TryParsekullanıldı.