🚀 C# ile Programlamaya Giriş: Kodlamaya İlk Adımını At, Kendi Projelerini Geliştirmeye Başla!
00ANASAYFA 01YAZILAR 02EĞİTİM 03ELEKTRİK_ENERJİ 04OTOMOTİV_MÜHENDİSLİĞİ 05ARAÇLAR 06LAB 07SÖZLÜK 08ETİKETLER ♡OKUMA LİSTEM ⌕ARA
TRENG

Bonus Mini Proje: Mühendis Hesap Makinesi

Öğ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

  1. Yeni işlem ekle: 4) Gerilim bölücü (Vçıkış = Vgiriş × R2 / (R1 + R2)).
  2. Tekrar hesaplama kolaylığı: Son hesaplanan sonucu bir List<string> geçmişine kaydet ve "5) Geçmiş" seçeneğiyle listele.
  3. Sınıfa taşı: Hesap metotlarını static class Hesaplar içine al, kullanıcı arayüzünden ayır.
  4. Dosyaya yaz: Geçmişi çıkışta File.WriteAllLines ile 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.

1. Programdaki SayiOku metodu neden bir while (true) döngüsü kullanıyor?
2. Hesap metotlarını (OhmAkim gibi) ekrana yazdırma kodundan ayırmanın faydası nedir?
3. 100 ohm ile 220 ohm'un paralel eşdeğeri yaklaşık kaçtır?

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.