C# – Algorithm Examples | 2

Detaylar

  • Kullanıcı tarafından belirlenen dersler ve haftalık saatlerine göre yine kullanıcı tarafından girilen öğrencinin ders notlarından ağırlıklı ortalamanın bulunması ve öğrencinin teşekkür, takdir belgesi alıp almadığının tespit edilmesi.

Kodumuz

  • Öncelikle Main metodunu açıklayalım. Main metodu burada 35. satırda başlıyor ve programımız çalışmaya başladığında ilk olarak çalışacak metoddur. Diğer motodlar, Main içerisinde çağrılır.
  • Koşul sağlandığı sürece (yani bu örnekte kullanıcının devam edip etmeme isteğine göre) bu işlemin yapılmasını istediğimiz için kodlarımızı do-while döngüsü içerisine yazıyoruz. while() parantezindeki kodun, koşulu sağlayıp sağlamamasına göre do içerisindeki kod tekrar çalışıp çalışmayabilir.
  • İsteyeceğimiz not ve ders saatleri de yine kullanıcıya bağlıdır. Kulanıcının gireceği değerlere göre değişiklik göstereceğinden öndelikle for döngüsü dışında kaç adet ders bilgilerinin girileceğini öğrenmek amacıyla ders sayısı kullanıcıdan alınır.
  • Alınan ders sayısı adedince yeni ders bilgileri girileceğinden ve biz bunu bilmediğimizden dolayı i değerli bir integer dizisi oluşturulur.
  • Burada i, her bir dersi temsil eder. Örneğin, 3 adet ders bilgisi girlecekse, dizi indexi 0 dan başladığı için i = 2 dir.
  • Oluşturulan bu dizi 2 boyutludur bunun sebebi ise her bir ders için yani her bir ders[i,] için, ilgili dersin dersin saat ve not bilgisi tutulur. ders[i,0] da, dersin saat bilgisi tutulurken, ders[i,1] de, dersin not bilgisi tutulmaktadır.
  • Girilen ders sayısında saat ve not bilgisi sırayla dizilere depolandıktan sonra buradaki not ve saat bilgisi ortHesapla isimli bizim yazdığımız fonksiyona gönderilir. (7. satırda)
  • ortHesapla fonsiyonunun parametresi int[,] dersler dir. Ayrıca değerler sonucunda bir ortalama hesaplayıp bunu döndüreceği için void değildir. double değer döndürür, return kullanılır.
  • ortHesapla içerisinde yine for döngüsü kullanılarak her i için (yani her ders için) olan saat ve not bilgileri toplanır. Sonuçta toplam bir saat değeri ve not değeri olmuş olur.
  • Buradaki for döngüsü dersler isimli integer dizinin ilk elamanının uzunluğu kadar yani i nin uzunluğu kadar döner.
  • Normalde uzunluğa erişmek için .Length kullanılırken dizilerin herhnagi bir elemanı sayısınca uzunluğa ulaşmak için .GetLength() kullanılır. GetLength parametre alır. Örneğin, burada dizi i (yani ders adedi) uzunluğunda dönmesi için int[i,] ders dizisini ilk elemanı olan i nin index i kullanılır. Bu da 0 dır. Bu nedenle bu programda .GetLength(0) şeklinde kullanılmıştır.
  • Not/saat return ile döndürülerek bir ortalama oluşturmuş olur.
  • Main içerisinde ortHesapla() fonksiyonu çağrılarak onun döndürdüğü değer ort değişkenine atanır.
  • Bir alt satırda ise bu ort değişkenini parametre olarak alan bir belgeYazdir() fonksiyonu çağrılmıştır.
  • belgeYazdir fonksiyonu (19. satırda) içerisinde Console.WriteLine() ile ekrana yazı yazdırır. Bu nedenle değer döndürmez, void dir. İçerisindeki if ve else ler ile, hesaplanan ortalam değerinin hangi belgeye eşdeğer olduğunu bulur ve bunu Main metodunda çağırıldığı zaman ekrana yazdırır.
  • Devam etmek istendiğinde aynı işlemler devam eder.

Kodun Çıktısı

Devam etmek istendiğinde bu şekilde devam ediyor.

Kaynak Kodu (Source Code)

using System;

namespace DenemeBirKi
{
    class Program
    {
        static double ortHesapla(int[,] dersler)
        {
            double toplamSaat=0, toplamNot=0;
            for(int i=0; i<dersler.GetLength(0); i++)
            {
                toplamSaat += dersler[i, 0];
                toplamNot += dersler[i, 0] * dersler[i, 1];
            }

            return toplamNot / toplamSaat;
        }

        static void belgeYazdir(double ort)
        {
            if(ort >= 85)
            {
                Console.WriteLine("{0} ortlamanız ile Taktir Belgesi aldınız.", ort);
            }
            else if(ort >= 75)
            {
                Console.WriteLine("{0} ortlamanız ile Teşekkür Belgesi aldınız.", ort);
            }
            else
            {
                Console.WriteLine("{0} ortlamanız belge almaya yetmedi.", ort);
            }

        }
        static void Main(string[] args)
        {
            int dersSayisi;
            char devam;
            double ort;

            do
            {
                Console.Write("Ders sayısı:");
                dersSayisi = Convert.ToInt32(Console.ReadLine());

                int[,] ders =  new int[dersSayisi, 2];

                for(int i = 0; i < dersSayisi; i++)
                {
                    Console.Write("{0}. dersin haftalık saati:", i + 1);
                    ders[i, 0] = Convert.ToInt32(Console.ReadLine());

                    Console.Write("{0}. dersin puanı:", i + 1);
                    ders[i, 1] = Convert.ToInt32(Console.ReadLine());
                }

                ort = ortHesapla(ders);
                belgeYazdir(ort);

                Console.Write("Devam etmek istiyor musunuz? (e/h)");
                devam = Convert.ToChar(Console.ReadLine());

            } while (devam == 'e' || devam == 'E');

        }
    }
}

Kaynaklar

  • Örneklerle Algoritma ve C# Programlama – Erhan Arı

C# – Algorithm Examples | 1

Bu yıl öğrendim ki algoritma = her şey. Bu mantığı iyice kavramak için pek çok algoritma örneği üzerinde çalışmak istiyorum. Bu yüzden böyle bir seriye başlamaya karar verdim. Umarım her şey planladığımdan da güzel olur ve geriye döndüğümde bu sayfaları, zihnimde ardından gelecekleri bilme hissiyle okurum.

Detaylar

  • Klavyeden girilen bir metnin karakterlerini sırasıyla büyüten program

Kodumuz

  • iç içe iki for kullanarak her bir aşamada o aşamanın sayısı olan harf büyük harfe çevrilecek. Örneğin Coldplay kelimesi için yapılan aşamalara bakalım.
  1. Öncelikle kullanıcıdan alınan kelimenin herhangi bir harfinin büyük olma olasılığı nedeniyle, her bir harfi .ToLower() ile küçük hale getirilir.
  2. Ardından ilk for içinde 0. indis için yani ilk satır için içindeki for döngüsüne girilir ve içerdeki döngünün 0. indisi yani ilk harfi, i==j olduğu için büyütülür.
  3. Söz konusu harf yani kelime[j] char olduğu için önce .ToString() ile string hale getirilir ardından .ToUpper() ile büyütülür.
  4. i si j ye eşit olmayan yani i != j kelimeler için direkt olarak stringe dönüştürme işlemi yapılarak yazdırılır.
  5. İçteki for döngüsünden çıktıktan sonra Console.WriteLine() yazmamızın sebebi yeni kelimeyi yazmak için bir alt satıra geçmesi.
  6. i=0 için dönen for döngüsü şimdi i=1 için dönecektir. ilk satırımıza 0 dersek ikinci satırımızın numarası 1 olacaktır ve 2. satırda da kelimenin 2. harfi büyütülmelidir. Burada if içinde i==j kontrolü yapmamızın sebebi daha açıklayıcı olmuştur.
  7. Dıştaki döngü kelimelerin sırasını, satırını temsil ederken içteki döngü kelimenin harflerinin sayısını temsil eder.

Kodun Çıktısı

Kodumuz *Bonus

  • Burada, bir önceki kodumuzda 30. satırda olan Console.WriteLine() silinmiştir. Üstteki kodumuzdan farklı olarak 18. ve 19. satırda kodlar eklenmiştir.
  • Bir önceki kodun çıktısı, her bir satırda sırayla bir harfin büyütülmesi şeklinde görünürken buradaki kod çalıştığında her defasında ekran temizlenerek metin tekrar ekrana yazdırılıyor. Metin harf harf ekrana yazdırılırken sırası gelen harf büyük harfe çevrilerek yazdırılıyor.
  • Her adımda kodun bekletilmesi gerekir. Aksi halde program derlenir derlenmez işlem bitirilir. Programın çalışıp çalışmadığını anlayamayız.
  • Programın çalışıp çalışmadığını görmek için burada programo 500ms bekletiyoruz. Bu işlemi Thread sınıfından Sleep() metoduyla yapıyoruz.
  • Thead sınıfını kullanabilmek için en üste (bkz. 2. satır) System.Threading kütüphanesi eklenmelidir.

Hatalar

  • İlk hatamız 21. ve 25. satırda Console sınıfından WriteLine() metodunu kullanmamız. Burada WriteLine her bir harfi tek bir satıra basıp alt satıra geçecektir. Kelimeyi bir bütün halindee görebilmemiz için Write() metodunu kullanmamız gereklidir.
  • İkinci hatamız if koşulu içerisinde kelime[j] yani bir char değerinin j yani bir int değerine eşit olup olmamasını kontrol etmeye çalışmamızdır. Burada her satırda o satırın index sayısına eşit olan harf büyütüleceği için i = j koşulunu yazmamız gerekir.
Hatalı ilk kodumuzun çıktısı.
  • Bir üstteki hatamızı düzeltip WriteLine() yerine Write() yazıyoruz fakat kodumuz hala istediğimiz çıktıyı vermeyecektir.
  • Her harfin yeni bir sayırda yazılmasını engellemiş olduk fakat bu seferde kelimenin harfi sayısınca, aynı kelime peş peşe tek bir satırda yazılacaktır.
  • Bunu düzeltmek için ilk for un içine, içteki for un dışına Console.WriteLine(); yazmamız gerekecektir. Bu sayede içteki for da bir kelime yazımı tamamlandığı zaman bir boşluk bırakarak yeni bir satıra geçilecektir. Döngünün ikinci aşamasına başlanacaktır.
  • Ayrıca üstteki if koşulu hatamız aynı şekilde devam ediyor. Her satırda o satırın index sayısına eşit olan harf büyütüleceği için if parantezleri içerisine i = j koşulunu yazmamız gerekir.
Hatalı ikinci kodumuzun çıktısı.

Kaynak Kodu (Source Code)

using System;

namespace DenemeBirKi
{
    class Program
    {
        static void Main(string[] args)
        {
            string kelime;

            Console.WriteLine("Bir sözcük giriniz.");

            kelime = Console.ReadLine().ToLower();

            for(int i = 0; i &lt; kelime.Length; i++)
            {
                for(int j = 0; j &lt; kelime.Length; j++)
                {
                    if(i==j)
                    {
                        Console.Write(kelime[j].ToString().ToUpper());
                    }
                    else
                    {
                        Console.Write(kelime[j].ToString());
                    }
                }

                Console.WriteLine();
            }

        }
    }
}

Kaynaklar

  • Örneklerle Algoritma ve C# Programlama – Erhan Arı

C# – Challenges | First Factorial

Challenge Türü: Easy

Detaylar

Kodumuz

Kodun Çıktısı

Hatalar

  • 10. satırda tanımladığımız result değişkeni for döngüsünün dışında tanımlanmalı (örn. 7. satırda) çünkü for döngüsünün amacı bu değeri her seferinde yeni elde ettiğimiz değeriyle değiştirerek i ile çarpmak. (Sistem, [result*i=result] 1*1=1 1*2=2 2*3=6 6*4=24 şeklinde işliyor)
  • Aynı zamanda bu tanımlanacak result değişkenine bir ilk değer ataması yapılmalı yoksa null değeri döndürür (bildiğim kadarıyla?) ve bu atanacak ilk değer 1 olmalı ki çarpım işlemi yapıldığında ilk olarak kendisini versin. Örneğin 0 değeri atanırsa bu result değişkeni sürekli 0 değeri olarak kalır çünkü 0 ile çarpılan her sayı yine 0 değerini verir.
  • 12. satırda kendi yaptığım bir hatayı koyuyorum. Hızlı bir şekilde yazarken i yerine 1 yazmıştım. Fakat for döngüsünün içerisinde i‘ yi tanımlamamızın sebebi onu döngüyü çevirmesi amacıyla kullanmak zaten. i yerine 1 yazdığımız zaman result değerini sürekli olarak 1 ile çarpmış ve hep aynı sonucu elde etmiş oluruz. Burada result değişkeninin değeri 1 olduğu için sonuç her zaman result*1=1 olur.
  • 15. satırda num değil de result değişkenini yazmalıyız çünkü biz FirstFactorial metodunda result değişkenini döndürüyoruz ve Main metoduna bu değişkeni yolluyoruz. num ise bizim parametremizdir. Yani Main metodundan aldığımız değişken.
  • 20. satırda, kullanıcıdan aldığımız değeri C# dilini kullanarak yazdığımız kodda ve Main metodundan aldığımız için string türünde alıyoruz ve bunu FirstFactorial metoduna yollarken, işlem yaptırmak için vs. integer türünde yolluyoruz. Bunun için de Convert.ToInt32 gibi bir dönüştürücü kullanmamız gerekir.

Wow – Code Worth Checking | Come Look Here

Coderbyte platformunda bu kodu yazarken faktöriyel kodlarını inceliyordum ve bir kullanıcının yazdığı şu koda denk geldim. Aslında inceleyince gayet basit bir mantıkla yazılmış ve daha kısa, pratik görünüyor. İncelemeye, öğrenmeye değer bir kod olduğunu düşünüyorum. Ufku genişletmek için farklı bir bakış açısı olur en azından.

C# – Challenges | First Reverse

Bugün “Challenges | … ” başlıklı bir seriye başlamayı düşünüyorum. Coderbyte isimli kodlama değerlendirme platformundaki meydan okumalar bu seride olacak. C# öğrendiğim için istenilen kodları C# dilinde yazacağım. Yeni diller öğrendikçe bu diller değişebilir. Bu serinin ilk uygulaması “First Reverse” isimli challenge. Bu cahllenge’ın temel mantığı dizi elemanlarını / ekrandan girilen değişkenleri ters sıra ile yazdırma. ASlında daha önceki yazımda olan bir kod fakat buna rağmen kodu yazaken zorluk çektim. Hala öğrenememişim…

Challenge Türü: Easy

Detaylar

Kodumuz

  • 9. satırda reverse değişkenine bir ilk atama yapmayı unuymamalıyız. ( Burada string a = String.Empty; , string a = Null; veya string a = “”; kullanabiliriz.
  • 11. satırda for föngüsünün içerisini mutlaka (int i = str.Length – 1; i >= 0; i–) şeklinde yazmalıyız. (int i = str.Length; i > 0; i–) veya (int i = 0; i <= str.Length -1; i++) şeklinde yazmamız yanlış olur.
  • 13. satırda a değikenine i yi ekleyip devam etmek değil de i nin dizi içerisinde ifade ettiği değişkenin değerini ekleyip atamayı unutmamalıyız. (yani a += i; yazmamalıyız.) Ayrıca a = str[i]; gibi bir hata da yapmamalıyız.

Kodun Çıktısı

Hatalar

  • 11. satırda döngüyü döndürmeye sağlayacak olan int i değişkenine 0 değerini verip artırarak ilerlemek istiyor olabiliriz fakat bunu yaparken int i değişkeni ile string reverse değişkenlerini kıyaslayamayız. Türleri eşit olmalı. for (int i = 0; i <= str.Length -1; i++) veya for ( int i = str.Length -1; i >= 0; i–) yazabiliriz.
  • 11. satırda veya mutlaka for ( int i = str.Length -1; i >= 0; i–) şeklinde yazmalıyız. for (int i = 0; i <= str.Length -1; i++) şeklinde yazdığımızda kodun çıktısı yukarıdaki gibi olur. İçindeki harfleri ters çevirip yeni bir dizi oluşturmasını istediğimiz diziyi ters çevirmez. Ayrıca for (int i = 0; i < str.Length; i++) şeklinde de yazmamalıyız. Bu şekilde de hata veriyor (idk why?).
  • 13. satırda for döngüsünün içinde i‘ nin değerini direkt olarak reverse isimi string değişkene ekleyemeyiz çünkü burada i değişkeni bizim değişkenimizin değerini etkilemek / değiştirmek için kullanılmıyor. i değişkeninin kullanılma amacı reverse isimli string değişkenini bir diziye dönüştürüp bu dizinin her bir elemanının sırasını temsil etmektir. bu sayede i. eleman şudur i+1. eleman şudur gibi dizinin elemanlarını tersten yazdırmamız mümkün olacaktır.

C# – Elemanları ekrandan alınan diziyi tersten yazdırma

Bu kodun tüm kısımlarına hakim değilim fakat zamanla öğreneceğimi düşünüyorum. Buraya dönüp kodu tekrar inceleyebilmek ve unutmamak için koyuyorum.

Kodumuz

Kodun Çıktısı

Hatalar

5, 11, 21 ve 23. satırdaki hataların doğru yazımları yorum satırında belirtilmiştir.