none
C# CONSOLE HİSTOGRAM RRS feed

  • Soru

  • Arkadaşlar c#'ta yeniyim.Bir sorum olcaktı sadece mantığını anlasam yeterli kod yazmada bir sıkıntım yok.Yardımcı olursanız çok sevinirim.
    1. Bilgisayar programlama hocası 1. vize sonuçlarının dağılımlarını histogram şeklinde 10 adet aralıkta görmek istiyor.

    İstenen aralıklar:

    [1-10],  [11-20], [21-30], [31-40], [41-50], [51-60], [61-70], [71-80], [81-90], [91-100]

    Girilen N adet nota göre aşağıdaki örnekte olduğu gibi histogram çizdiren C# programını YAZINIZ

    7 |                      **       |

    6 |                      **       |

    5 |                **    ** **    |

    4 |             ** **    ** **    |

    3 |             ** **    ** **    |

    2 |    ** ** ** ** ** ** ** ** ** |

    1 | ** ** ** ** ** ** ** ** ** ** |

    --+-------------------------------+

        10 20 30 40 50 60 70 80 90 100

     BÖYLE BİR ŞEKİL NASIL ÇİZDİREBİLİRİM???


    19 Nisan 2016 Salı 08:21

Yanıtlar

  • kodu da paylaşayım, bunu yapmamın amacı insanları oop kullanmaya, model kullanmaya teşvik etmek aslında

    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                var notlar = new[] { 25, 55, 67, 32, 66, 35, 65, 42, 76, 33, 18, 100, 65, 65, 65, 80, 91, 75, 12, 80, 82, 75, 76, 98, 55, 62, 65, 35, 63, 37, 67, 72, 45, 48, 52, 67 };
    
                Console.WriteLine();
                Console.WriteLine();
    
    
                var liste = Aralık.Aralıklar().Select(p => new Gurup() { Aralık = p, Adet = notlar.Count(x => x >= p.Düşük && x <= p.Yüksek) }).ToList();
                var maxAdet = liste.Max(p => p.Adet);
                for (int i = 0; i < maxAdet; i++)
                {
                    var satır = "";
                    liste.ForEach(p => satır += p.Adet >= maxAdet-i ? "## " : "   ");
                    Console.WriteLine("{0,3}|{1}|", maxAdet-i, satır);
                }
                Console.WriteLine("---+------------------------------+");
                Console.Write("    ");
                liste.ForEach(p => Console.Write("{0,-3}", p.Aralık.Yüksek));
                Console.WriteLine();
                Console.WriteLine();
            }
    
    
    
            class Gurup
            {
                public Aralık Aralık { get; set; }
                public int Adet { get; set; }
            }
    
    
            class Aralık
            {
                public int Sıra { get; set; }
                public int Düşük { get; set; }
                public int Yüksek { get; set; }
    
                public static List<Aralık> Aralıklar()
                {
                    return Enumerable.Range(0, 10).Select(p => new Aralık() { Sıra = p, Düşük = (p * 10) + 1, Yüksek = (p + 1) * 10 }).ToList();
                }
    
                public override string ToString()
                {
                    return $"{Düşük} - {Yüksek}";
                }
            }
        }
    }


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    19 Nisan 2016 Salı 11:23
    Moderatör

Tüm Yanıtlar

  • Consol uygulaması yapabilirsiniz.

    Console.Write ile "*" karakterini bastırabilirsiniz. 

    Form uygulaması yaparsanız da sadece Font'u TrueType bir fonta değil de fixed(Courier, Lucida Console vb.) bir font seçerek aynı görünümü elde edebilirsiniz. 


    http://pgnchess.com
    http://dergikapaklari.com

    19 Nisan 2016 Salı 08:31
  • Zaten console uygulaması olması gerekiyor.Console.Write ile yazdırabileceğimi biliyorum.Sadece kaç tane not girileceği belli olmadığı için for döngüsümü kullanmam gerekiyor aşağıdan yukarı yazdırabilmem için?
    19 Nisan 2016 Salı 08:34
  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace test3
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Lütfen notları ',' ile ayırarak girin:");
                string[] sayilar=Console.ReadLine().Split(',');
                int sayi = 0;
                int[] dizi=new int[10];
                if (sayilar.Count() == 0)
                {
                    Console.WriteLine("Herhangi bir değer girişi yapılmamış.");
                    return;
                }
                foreach (var a in sayilar)
                {
                    int.TryParse(a, out sayi);
                    dizi[sayi / 10] += 1;
                }
    
                for (int i = 10; i > 0; i--)
                {
                    Console.Write(string.Format("{0:00}|", i));
                    for (int j = 0; j <10; j++)
                    {
                        if (dizi[j] >= i) Console.Write("-**-");
                        else Console.Write("----");
                    };
                    Console.WriteLine();
                };
                Console.Write("   ");
                for (int i = 0; i < 10; i++)
                {
                    Console.Write(string.Format(" {0:00} ",i*10));
                };
                Console.ReadKey();
    
            }
        }
    }
    


    http://pgnchess.com
    http://dergikapaklari.com

    19 Nisan 2016 Salı 09:27
  • bu mu lazım?


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    19 Nisan 2016 Salı 10:37
    Moderatör
  • Bence oncelikle hedefinizi degistirin. Histogram olmasi icin, dagilim sutunlarinin dikey olmasi sart degil, dikey olursa hesaplamaniz karmasiklacak. Yatay sutunlar dusunurseniz suna benzer:

    100|==================
    090|===============
    080|===================================================
    070|===========================
    060|==============================
    050|=================================
    040|=================================
    030|================================================
    020|==================
    010|===========================
     +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
       | 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15|16|17|

    Not: Ornegi tabii ki elle cizmedim :) Dogrudan tum kodu hemen vermeli miyim bilemedim. Yaptigim su idi:

    1. Random ve Enumerable classlariini kullanarak, 100 adet 10-100 arasinda rastgele secilmis "not" olan bir liste hazirladim.
    2. 100'den geriye 10'ar 10'ar sayarak, her satira once "not"u, bir "|" isaretini ve o notun sayisi * 3 tane = koydum.
    3. Yukaridakini yaparken, bir degiskene maximum sayiyi sakladim (son 2 satir icin).
    4. Uc tane bosluk, "+" ve arkasindan maximum sayi kadar "--+" yazdim (yeni baslayanlar icin karmasik olabilecegi icin, tek satirlik Linq expression yerine, for dongusu kullanarak).
    5. En son satirda da, yine uc bosluk ve "|", ardindan maximum sayiya kadar dongude, not sayisi + "|" yazdirdim.

    Sadece mantigini anlamak istedigin icin de en azindan simdilik kod vermiyorum :) Deneyip yapamazsan, takildigin yerleri veririm.

    Not: Ornek baskisi monospaced font ile goruntulenmediginden cirkin gorunuyor. Console monospaced font kullaniyor normalde ve soyle gorunuyor:

    19 Nisan 2016 Salı 10:50
    Yanıtlayıcı
  • Ya gormedim gene seninkini :) Cok daha guzel tabii ki.
    19 Nisan 2016 Salı 11:01
    Yanıtlayıcı
  • kodu da paylaşayım, bunu yapmamın amacı insanları oop kullanmaya, model kullanmaya teşvik etmek aslında

    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                var notlar = new[] { 25, 55, 67, 32, 66, 35, 65, 42, 76, 33, 18, 100, 65, 65, 65, 80, 91, 75, 12, 80, 82, 75, 76, 98, 55, 62, 65, 35, 63, 37, 67, 72, 45, 48, 52, 67 };
    
                Console.WriteLine();
                Console.WriteLine();
    
    
                var liste = Aralık.Aralıklar().Select(p => new Gurup() { Aralık = p, Adet = notlar.Count(x => x >= p.Düşük && x <= p.Yüksek) }).ToList();
                var maxAdet = liste.Max(p => p.Adet);
                for (int i = 0; i < maxAdet; i++)
                {
                    var satır = "";
                    liste.ForEach(p => satır += p.Adet >= maxAdet-i ? "## " : "   ");
                    Console.WriteLine("{0,3}|{1}|", maxAdet-i, satır);
                }
                Console.WriteLine("---+------------------------------+");
                Console.Write("    ");
                liste.ForEach(p => Console.Write("{0,-3}", p.Aralık.Yüksek));
                Console.WriteLine();
                Console.WriteLine();
            }
    
    
    
            class Gurup
            {
                public Aralık Aralık { get; set; }
                public int Adet { get; set; }
            }
    
    
            class Aralık
            {
                public int Sıra { get; set; }
                public int Düşük { get; set; }
                public int Yüksek { get; set; }
    
                public static List<Aralık> Aralıklar()
                {
                    return Enumerable.Range(0, 10).Select(p => new Aralık() { Sıra = p, Düşük = (p * 10) + 1, Yüksek = (p + 1) * 10 }).ToList();
                }
    
                public override string ToString()
                {
                    return $"{Düşük} - {Yüksek}";
                }
            }
        }
    }


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    19 Nisan 2016 Salı 11:23
    Moderatör
  • Çook teşekkür ederim çok sağolun gerçekten :)
    20 Nisan 2016 Çarşamba 10:08
  • evet tam olarak bu
    20 Nisan 2016 Çarşamba 11:25
  • yanlız 65 alanlar kopya çekmişler :)

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    20 Nisan 2016 Çarşamba 11:37
    Moderatör