Öğrendiklerini birleştiriyorsun: menülü, hataya dayanıklı bir konsol hesap makinesi; Ohm yasası, seri/paralel direnç ve not ortalaması içinde.
Hedef
Kursun son dersinde parçaları birleştiriyoruz. Küçük ama gerçek bir araç yazacağız: menüden seçilen işleme göre hesap yapan, hatalı girdide çökmeyen bir Mühendis Hesap Makinesi. Kullanacağımız konular: döngü, switch ifadesi, metotlar, TryParse, List<T>, LINQ ve hata yönetimi.
Programda dört seçenek olacak: (1) Ohm yasası ile akım hesabı, (2) iki direncin seri ve paralel eşdeğeri, (3) not ortalaması, (0) çıkış.
Adım 1: Güvenli sayı okuma
Her yerde aynı TryParse döngüsünü yazmak yerine tek bir yardımcı metot yazalım. Kullanıcı geçerli sayı girene kadar sormaya devam eder:
static double SayiOku(string soru)
{
while (true)
{
Console.Write(soru);
if (double.TryParse(Console.ReadLine(), out double deger))
return deger;
Console.WriteLine(" Geçersiz sayı, tekrar dene.");
}
}
Adım 2: Hesap metotları
Hesapları kullanıcı arayüzünden ayrı tutmak iyi bir alışkanlıktır: metotlar yalnızca hesap yapar, yazdırmayı çağıran taraf halleder.
static double OhmAkim(double gerilim, double direnc)
{
if (direnc <= 0)
throw new ArgumentException("Direnç sıfırdan büyük olmalı.");
return gerilim / direnc;
}
static double Seri(double r1, double r2) => r1 + r2;
static double Paralel(double r1, double r2)
{
if (r1 + r2 == 0)
throw new ArgumentException("İki direnç birden sıfır olamaz.");
return r1 * r2 / (r1 + r2);
}
Paralel eşdeğer: iki direnç için R = R1 × R2 / (R1 + R2). Örneğin 100 ve 220 ohm için 22000 / 320 = 68,75 ohm.
Adım 3: Tüm program
İşte birleştirilmiş hali. Tek bir Program.cs dosyasına yapıştırıp dotnet run ile çalıştırabilirsin:
bool devam = true;
while (devam)
{
Console.WriteLine();
Console.WriteLine("=== MÜHENDİS HESAP MAKİNESİ ===");
Console.WriteLine("1) Ohm yasası (akım)");
Console.WriteLine("2) Seri ve paralel direnç");
Console.WriteLine("3) Not ortalaması");
Console.WriteLine("0) Çıkış");
Console.Write("Seçimin: ");
string? secim = Console.ReadLine();
try
{
switch (secim)
{
case "1":
double v = SayiOku("Gerilim (V): ");
double r = SayiOku("Direnç (ohm): ");
double i = OhmAkim(v, r);
Console.WriteLine($"Akım: {i:F4} A, güç: {v * i:F3} W");
break;
case "2":
double r1 = SayiOku("1. direnç (ohm): ");
double r2 = SayiOku("2. direnç (ohm): ");
Console.WriteLine($"Seri: {Seri(r1, r2):F2} ohm");
Console.WriteLine($"Paralel: {Paralel(r1, r2):F2} ohm");
break;
case "3":
NotOrtalamasi();
break;
case "0":
devam = false;
Console.WriteLine("Görüşürüz!");
break;
default:
Console.WriteLine("Lütfen menüdeki bir sayıyı seç.");
break;
}
}
catch (ArgumentException ex)
{
Console.WriteLine($"Hesaplanamadı: {ex.Message}");
}
}
static void NotOrtalamasi()
{
var notlar = new List<double>();
Console.WriteLine("Notları tek tek gir (bitirmek için boş bırakıp Enter):");
while (true)
{
Console.Write($" {notlar.Count + 1}. not: ");
string? giris = Console.ReadLine();
if (string.IsNullOrWhiteSpace(giris)) break;
if (double.TryParse(giris, out double not) && not >= 0 && not <= 100)
notlar.Add(not);
else
Console.WriteLine(" 0-100 arasında bir sayı girmelisin.");
}
if (!notlar.Any())
{
Console.WriteLine("Hiç not girilmedi.");
return;
}
Console.WriteLine($"Ortalama: {notlar.Average():F2}");
Console.WriteLine($"En yüksek: {notlar.Max()} En düşük: {notlar.Min()}");
Console.WriteLine($"Geçen not sayısı (>= 60): {notlar.Count(n => n >= 60)}");
}
static double SayiOku(string soru)
{
while (true)
{
Console.Write(soru);
if (double.TryParse(Console.ReadLine(), out double deger))
return deger;
Console.WriteLine(" Geçersiz sayı, tekrar dene.");
}
}
static double OhmAkim(double gerilim, double direnc)
{
if (direnc <= 0)
throw new ArgumentException("Direnç sıfırdan büyük olmalı.");
return gerilim / direnc;
}
static double Seri(double r1, double r2) => r1 + r2;
static double Paralel(double r1, double r2)
{
if (r1 + r2 == 0)
throw new ArgumentException("İki direnç birden sıfır olamaz.");
return r1 * r2 / (r1 + r2);
}
Örnek bir çalıştırma (Türkçe ayarlı makinede ondalık için virgül kullanılır):
=== MÜHENDİS HESAP MAKİNESİ ===
1) Ohm yasası (akım)
2) Seri ve paralel direnç
3) Not ortalaması
0) Çıkış
Seçimin: 2
1. direnç (ohm): 100
2. direnç (ohm): 220
Seri: 320,00 ohm
Paralel: 68,75 ohm
Neler öğrendik? Programı küçük metotlara böldük; girdiyi tek yerde doğruladık; hataları fırlatıp tek bir noktada yakaladık; menü döngüsünü bool bayrağıyla yönettik. Gerçek yazılımlar böyle büyür.
Kendin dene
- Yeni işlem ekle: 4) Gerilim bölücü (
Vçıkış = Vgiriş × R2 / (R1 + R2)). - Tekrar hesaplama kolaylığı: Son hesaplanan sonucu bir
List<string>geçmişine kaydet ve "5) Geçmiş" seçeneğiyle listele. - Sınıfa taşı: Hesap metotlarını
static class Hesaplariçine al, kullanıcı arayüzünden ayır. - Dosyaya yaz: Geçmişi çıkışta
File.WriteAllLinesile bir metin dosyasına kaydet.
Bu kursu bitirdin; artık C# ile gerçek araçlar yazabilecek temele sahipsin. Sıradaki durak: dosya işlemleri, async/await, WinForms ile pencereli uygulamalar ve ASP.NET ile web.
// Mini sınav
Bir seçeneğe tıkla; doğru mu yanlış mı, anında ve nedeniyle birlikte göreceksin.
Bitirdiğinde işaretle: ilerlemen kaydolur, +20 XP kazanırsın.
// Final sınavı ve sertifika
Derslerden rastgele 20 soru, 30 dakika, geçme notu %70. Geçersen adına doğrulanabilir (QR kodlu) bir başarı sertifikası düzenlenir.
Final sınavına girİpucu: ← → tuşlarıyla dersler arasında gezinebilirsin.