İsthambul1453 | lessons | csharp

  • Konuyu açan Konuyu açan isthambul1453
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 0
  • Gösterim Gösterim 102

isthambul1453

Yasaklanmış Üye
Cezalı
Mesaj
357
Çözümler
3
Beğeni
249
Puan
764
Ticaret Puanı
0
"Bu yazıda, yazılım dünyasına ilk adımı atarken en temel kavramları örneklerle öğreneceğiz."

Yazılımcı nedir?

Yazılımcının her şeyi bilmediği, ama bilmediğini öğrenebilen kişi olduğu, ihtiyacı olan her şeyi bilmese, bilemese bile dakikasında bulup öğrenebilen ve hemen kullanıp uygulayan kişi olduğudur.

Algoritma nedir?

Günlük hayatta algoritma, bir işi yapmak için uygulanabilecek yöntemlerin tama mıdır?

Sizi yazılım sektöründe ayrıcalıklı kılacak şey, kod bilginiz değil, algoritma yeteneğinizdir. Çünkü hiçbir sorunun tek bir çözümü yoktur. Bir çözümü vardır, bir de daha iyi çözümü vardır.

Küçük bir örnek: 1'den 100'e kadar olan sayıların toplamını bulalım.

  • Kod bilgisiyle çözüm: döngü kullanarak sayıları tek tek toplamak. Bu yöntem doğrudur ama bilgisayarı yorar. Çünkü döngü 100 defa döner, 100 işlem yapar.
  • Algoritma yeteneğiyle çözüm: matematikteki toplam formülünü kullanmak: n * (n+1) / 2
    Bu formülle 100 * 101 / 2 işlemini yapar, sonuca tek adımda ulaşırsınız.
    İşte algoritma budur: Aynı işi, daha az adımda, daha verimli yapmak.

    C#:
    Genişlet Daralt Kopyala
    using System;
    using System.Diagnostics;
    
    class AlgoritmaKarsilastirma
    {
    static void Main(string[] args)
    {
    Console.WriteLine("1'den N'e kadar olan sayıların toplamı - Algoritma Karşılaştırması\n");
    
    Console.Write("N değerini giriniz (örnek: 100 veya 100000000): ");
    long n = long.Parse(Console.ReadLine());
    
    // ---------- YORAN YÖNTEM (Döngü) ----------
    Stopwatch sw1 = Stopwatch.StartNew();
    long toplamDongu = 0;
    for (long i = 1; i <= n; i++)
    {
    toplamDongu += i;
    }
    sw1.Stop();
    
    // ---------- YORMAYAN YÖNTEM (Formül) ----------
    Stopwatch sw2 = Stopwatch.StartNew();
    long toplamFormul = n * (n + 1) / 2;
    sw2.Stop();
    
    // Sonuçları göster.
    Console.WriteLine("\n--- SONUÇLAR ---");
    Console.WriteLine($"Döngü ile toplam: {toplamDongu} | Süre: {sw1.ElapsedMilliseconds} ms");
    Console.WriteLine($"Formül ile toplam: {toplamFormul} | Süre: {sw2.ElapsedMilliseconds} ms");
    
    // Doğrulama.
    if (toplamDongu == toplamFormul)
    Console.WriteLine("\n✅ İki yöntem de aynı doğru sonucu verdi.");
    else.
    Console.WriteLine("\n❌ Hata: Sonuçlar uyuşmuyor!");
    
    // Ek açıklama.
    Console.WriteLine("\n📌 Algoritma Yeteneği: Formül, sadece 1 işlem yaparak sonuca ulaşır.");
    Console.WriteLine(" Döngü ise N tane işlem yapar. N büyüdükçe fark devleşir.");
    }
    }

    Öncesi (Yoran - Döngü):
    • "sayıları topla" deyince aklına for (int i=1; i<=100; i++) toplam+=i; gelir.
    • Küçük N'de fark anlaşılmaz, büyük N'de (örneğin 1 milyar) bilgisayar donar gibi olur.
      Sonrası (Yormayan - Formül):
    • Matematiksel formülü hatırlayan kişi n*(n+1)/2 yazar.
    • N ne kadar büyük olursa olsun sabit sürede çalışır.
    Bu karşılaştırmayı görsel ve sayısal olarak sunmak çok etkilidir. Stopwatch ile milisaniye farkını göstermek. N=100000000 (yüz milyon) girildiğinde döngü saniyeler sürer, formül ise anında cevap verir. Biri gelip böyle yazarsa sizin kalenize gol atmış olacaktır. Bu, "gol atma" metaforunun canlı kanlı kanıtıdır.

    N DeğeriDöngü Süresi (ms)Formül Süresi (ms)Kazanan
    1000.002 ms0.001 msBeraber
    1.000.0004 ms0.001 msFormül
    100.000.000380 ms0.002 msFormül açık ara
    Şimdi başka bir örnek: Üçgen alanı. Bildiğimiz formül: Alan = (b * h) / 2
    Peki bu formülü bilmeyen biri nasıl hesap yapardı? Kendi içinizde yanıtları bulmaya çalışın ve açıklamaya çalışınız...
    Üçgeni sonsuz küçük dikdörtgenlere bölüp alanları toplayın, integral mantığı, evet ama bilgisayar için çok yavaştır.
    Aşağıdaki kodu konsol uygulaması olarak çalıştırınız. B ve h büyüdükçe aradaki uçurumu net göreceksiniz.

    Kod:
    Genişlet Daralt Kopyala
    using System;
    using System.Diagnostics;
    
    class UcgenAlaniKarsilastirma
    {
    static void Main(string[] args)
    {
    Console.WriteLine("=== ÜÇGEN ALANI: Döngü (Yoran) vs Formül (Yormayan) ===\n");
    
    Console.Write("Taban kenarını girin (b): ");
    double b = double.Parse(Console.ReadLine());
    Console.Write("Yüksekliği girin (h): ");
    double h = double.Parse(Console.ReadLine());
    
    // ---------- YORAN YÖNTEM (Riemann toplamı - çok yavaş) ----------
    Console.WriteLine("\n[1] YORAN ALGORİTMA (Döngü ile alan yaklaşımı) çalışıyor...");
    Stopwatch swYoran = Stopwatch.StartNew();
    
    double alanYaklasik = 0;
    double adim = 0.000001; // çok küçük adım, hassas ama yavaş.
    for (double x = 0; x < b; x += adim)
    {
    // Üçgenin o x noktasındaki yüksekliği (doğru denklemi: h(x) = (h/b) * x)
    double yukseklikAnlik = (h / b) * x;
    alanYaklasik += yukseklikAnlik * adim;
    }
    swYoran.Stop();
    
    // ---------- YORMAYAN YÖNTEM (Gerçek formül) ----------
    Console.WriteLine("\n[2] YORMAYAN ALGORİTMA (Formül) çalışıyor...");
    Stopwatch swYormayan = Stopwatch.StartNew();
    double alanFormul = (b * h) / 2;
    swYormayan.Stop();
    
    // ---------- SONUÇLAR ----------
    Console.WriteLine("\n--- SONUÇLAR ---");
    Console.WriteLine($"Döngü ile yaklaşık alan : {alanYaklasik:F6} | Süre: {swYoran.ElapsedMilliseconds} ms");
    Console.WriteLine($"Formül ile alan : {alanFormul:F6} | Süre: {swYormayan.ElapsedMilliseconds} ms");
    
    // Doğruluk kontrolü.
    double fark = Math.Abs(alanYaklasik - alanFormul);
    if (fark < 0.001)
    Console.WriteLine("\n✅ İki yöntem de (yaklaşık olarak) aynı sonucu verdi.");
    else.
    Console.WriteLine($"\n⚠️ Dikkat: Yaklaşık sonuç {fark:F6} kadar hatalı olabilir (adım boyutundan kaynaklı).");
    
    // Açıklama.
    Console.WriteLine("\n📌 Algoritma Yeteneği:");
    Console.WriteLine(" - Döngü yöntemi milyonlarca işlem yapar, yavaş ve kaynak tüketir.");
    Console.WriteLine(" - Formül ise sadece 1 çarpma ve 1 bölme işlemiyle sonucu verir, süper hızlıdır.");
    Console.WriteLine(" - Aradaki fark büyük sayılarda (milyonlarca kez alan hesaplamanız gerektiğinde) devleşir.");
    }
    }

    Ek olarak, mesela omlet yapmak için örnek olarak bir algoritma nasıl olmalıdır?
    • Girdileri hazırla: 2 yumurta, tuz, karabiber, yağ, tavayı al.​
    • Yumurtaları kır bir kaba.​
    • Tuz ve karabiber ekle.​
    • Çırp (homojen olana kadar).​
    • Tavayı ısıt (orta ateş).​
    • Yağı ekle (tavanın her yerine yay).​
    • Çırpılmış yumurtayı dök tavaya.​
    • Pişir (kenarlar tutana kadar, spatula ile karıştırarak).​
    • Ocaktan al.​
    • Servis et.​
    • Peki bunun yazılımdaki karşılığı nedir?


    Bu adımlar, bir fonksiyon veya metot olarak düşünülebilir. Her adım bir kod satırı veya alt fonksiyon çağrısıdır. Algoritma, girdi (yumurta, tuz, vs.) Alır, çıktı (omlet) üretir. Aynı mantık, yazılımda bir işlem dizisini tanımlar.

    Algoritma sadece kod değildir. Sabah kahvaltıda bile algoritma uygularsınız. Yazılımdaki algoritma da aynı mantıkla çalışır: adımları doğru sırayla koymazsanız omlet yanar veya program çöker.

    Faydalanabileceğiniz kaynaklar;



 
Geri
Üst