Witamy na forum PC Format Zapraszamy do REJESTRACJI


Użytkownicy przeglądający ten wątek: 1 gości

[C# Problem] Rysowanie histogramu poziomego.

#1
[C# Problem] Rysowanie histogramu poziomego.
Witam. 
Muszę napisać program, który będzie rysować poziomy histogram z gwiazdek rozkład wartości w podanym przez użytkownika ciągu liczb z przedziału 1 – 5. Użytkownik sam wpisuje długość ciągu, a potem jego wartości. Generalnie na końcu powinno wyjść coś podobnego jak poniżej:

{5, 1, 5, 4, 1, 5, 5, 4, 1, 2}
1 *** 
2 *

4 ** 
5 ****


Jak na razie mój kod wygląda tak:
Kod:
static void Main(string[] args)

        {
            Console.WriteLine("Podaj długość ciągu.");

            int dlugoscCiagu;

            dlugoscCiagu = int.Parse(Console.ReadLine());

            int[] ciag = new int[dlugoscCiagu];

            for (int i = 0; i < dlugoscCiagu; i++)
            {
                Console.WriteLine("Podaj {0} liczbę ciągu w przedziale 1-5: ", i);
                ciag[i] = int.Parse(Console.ReadLine());
            }

            Console.WriteLine("\n\n\nZawartość ciągu to: ");
            foreach (int x in ciag)
                Console.Write(x + ", ");

            foreach (int wartosc in ciag)
            {
                int i;
                if ( i == 1)
                {
                    Console.Write("{0} *",i);
                }
                else if (i == 2)
                {
                    Console.Write("\n");
                    Console.WriteLine("*");
                }
                else if (i == 3)
                {
                    Console.Write("\n");
                    Console.WriteLine("*");
                }
                else if (i == 4)
                {
                    Console.Write("\n");
                    Console.WriteLine("*");
                }

                else if (i == 5)
                {
                    Console.Write("\n");
                    Console.WriteLine("*");
                }
            }


        }




    }
}

Podejrzewam, że użycie if else to nie był dobry pomysł (ewentualnie został źle wykorzystany...)
Dlatego gdyby ktoś mógłby naprowadzić na dobrą drogę, to byłabym wdzięczna. Wesoły
 System operacyjny: windows_seven Przeglądarka: chrome
#2
RE: [C# Problem] Rysowanie histogramu poziomego.
Generalnie skoro używasz już FOREACH to nie ma sensu sprawdzanie w którym miejscu jesteś poprzez IF wiec to można całe wywalić. Nie do końca wiem czy o to Ci chodzi ale pokombinuj coś w tym stylu 
Kod:
           int i = 0;
           foreach (var item in ciag)
           {
               Console.Write($"{++i}: {new string('*',item)} \n");
           }

BTW Jeśli chcesz można to zrobić w JEDNEJ LINIJCE KODU  :D 
Kod:
Console.Write(ciag.Aggregate(string.Empty, (current, item) => current + $"{++i}: {new string('*', item)} \n"));

Ale polecam jednak poćwiczyć najpierw z tym pierwszym wariantemOczko Pisz jak by co.
 System operacyjny: windows_seven Przeglądarka: chrome
#3
RE: [C# Problem] Rysowanie histogramu poziomego.
Ou... chyba, że tak. Rozumiem. 'w' Trochę nie o to chodziło, bo wyszło coś takiego:
[Obrazek: RB60Jmi.png]

A miało być tak, że zlicza poszczególne liczby i na podstawie np. ilości 5-tek czy 1-nek podanych przez użytkownika, tyle rysuje gwiazdek.
W jednej linijce kodu? Wow. :o Ale to już bardziej skomplikowane jak na taką osobę jak ja, która dopiero co zaczęła programować. :D
Mógłbyś mi napisać jaką funkcję pełni "$" w Twoim kodzie? I item i ":"? Z góry dziękuję. Wesoły
 System operacyjny: windows_seven Przeglądarka: chrome
#4
RE: [C# Problem] Rysowanie histogramu poziomego.
Masz rację myślałem trochę o czym innym :D sorki Wesoły

Już tłumacze. W swoim kodzie używasz takiej konstrukcji : 
Kod:
("Podaj {0} liczbę ciągu w przedziale 1-5: ", i)

W najnowszej wersji języka można to zastąpić zapisem :
Kod:
($"Podaj {i} liczbę ciągu w przedziale 1-5: ")

Jest to trochę bardziej czytelne. 
Teraz jak działa pętla foreach. Pętla ta iteruje po każdym elemencie w tablicy aż do początku do jej końca tak więc ów item w danej chwili przedstawia obecny item coś jak ciąg[i] w pętli for.
Teraz rozwiązanie problemu. Na początku musisz określić jaki jest ostatni wyraz Twojego histogramu. Potrzebujemy wiec funkcji max ( dzięki temu nie musimy się ograniczać tylko do 5 ). Następnie musimy stworzyć wykres od 1 do wartości maksymalnej. Tu przyda się zwykła pętla for. W pętli musimy określić ile gwiazdek ma narysować ( ile np 1 jest podanych ) i tyle ich tam narysować Wesoły 
Kod :  
Kod:
           int max = ciag.Max();
           for (int i = 1; i <= max; i++)
           {
               string noumbersOfStars = String.Empty;
               foreach (var item in ciag)
               {
                   if (item == i)
                   {
                       noumbersOfStars += "*";
                   }
               }
               Console.Write($"{i}: {noumbersOfStars}\n");
           }

Kod tym razem powinien  działać. Jeżeli chcesz aby kod rysował diagram tylko do 5 w miejsca max w pętli for wstaw poprostu 5. Oczywiście można to zrobić w ładniejszy sposób. Możemy wykorzystać funkcje count oraz konstruktor stringa aby uzyskać bardziej przejrzysty kod :
Kod:
       
           for (int i = 1; i <= ciag.Max(); i++)
           {
               Console.Write($"{i}: {new string('*', ciag.Count(item => item == i))} \n");
           }

Oczywiście można się tym bawić dalej ale myślę ze jak na Twoje potrzeby 1 wersja jest ok. Myślę że teraz zrozumiałem to dobrze ale w razie co pisz śmiało.

Oczywiście kod dodajesz zamiast Twojej petli foreach
 System operacyjny: windows_seven Przeglądarka: chrome
#5
RE: [C# Problem] Rysowanie histogramu poziomego.
W porządku. ^^
Aaa... chyba, że tak. Dzięki. c:

I tak. O to chodziło. Teraz już wszystko działa jak należy. Dziękuję jeszcze raz za pomoc. Wesoły Wesoły
 System operacyjny: windows_seven Przeglądarka: chrome
Programy: Polecane / Nowe / Inne




Podobne wątki ([C# Problem] Rysowanie histogramu poziomego.)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  Rysowanie figur w języku c golem 1 6693 19.01.2016, 09:47
Ostatni post: Szachista
  [C++] Rysowanie za pomocą znaków Halep 2 5709 05.11.2014, 21:50
Ostatni post: Halep
myBB [JAVA] Rysowanie w JPanel Faayzol 0 2740 14.11.2013, 16:09
Ostatni post: Faayzol

Skocz do:


Wybrane wątki ([C# Problem] Rysowanie histogramu poziomego.)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  Książki do nauki C# olek23 14 7500 17.10.2019 13:06
Ostatni post: Ajgor
  Wyświetlanie informacji z bazy danych na stronie www PitPlay 1 2444 16.09.2019 11:18
Ostatni post: Ajgor
  Błąd przy uruchamianiu programu w Java z wiersza poleceń Physicist 3 1879 30.08.2019 14:16
Ostatni post: Physicist
  Python z wiersza poleceń Physicist 15 9622 21.08.2019 20:14
Ostatni post: Physicist
  Transfer plików via FTP Visual Basic FireBytes 3 4924 15.08.2019 07:41
Ostatni post: Szachista
  Menu wysuwane z boku patryk67 1 3268 07.08.2019 12:43
Ostatni post: aht
  Visual Basic Excel l.całkowitą przedstawić w postaci szesnastkowej fugaz 4 4832 18.06.2019 21:36
Ostatni post: fugaz
  Nauka do Olimpiady Informatycznej? piotr0905 1 4803 08.06.2019 16:50
Ostatni post: wlisik
Ściana Prosta gra w Builder C++ Kiranek1 1 4742 31.05.2019 15:20
Ostatni post: Szachista
  Menu (Nie widoczne długie opisy) wanhelsing 5 6506 28.04.2019 19:31
Ostatni post: koneton
  Skrypt usuwający pliki sylwiaa1 2 2860 28.04.2019 15:20
Ostatni post: sylwiaa1
  Środowisko do assemblera Physicist 4 6149 21.04.2019 14:04
Ostatni post: Ajgor
  VBA excel dmjs 6 6487 17.04.2019 10:20
Ostatni post: ptrick
  C++ - sens pogłębiania nauki gbr 5 6940 25.03.2019 12:53
Ostatni post: koneton
  Klasa wewnętrzna w C++ Physicist 4 6681 23.03.2019 18:28
Ostatni post: Physicist