• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ - konsolowy wykres słupkowy, przeskalowany bez względu na wartości

+1 głos
105 wizyt
pytanie zadane 6 grudnia 2018 w C i C++ przez tehqemists Nowicjusz (210 p.)

Witam serdecznie, przerabiam obecnie "Przewodnik dla początkujących" Alex'a Allain i zatrzymałem się właśnie na zadaniu 7 z rozdziału 5!

Polecenie brzmi: Napisz program udostępniający opcję sumowania wyników ankiety, w której mogą wystąpić trzy różne wartości. Dane wejściowe wprowadzane do programu to pytanie ankietowe oraz trzy możliwe odpowiedzi. Pierwszej odpowiedzi przypisana jest wartość 1, drugiej 2, a trzeciej 3. Odpowiedzi są sumowane do chwili, w której użytkownik wprowadzi 0 - wtedy program powinien pokazać wyniki ankiety. Postaraj się wygenerować wykres słupkowy, pokazujący wyniki przeskalowane w taki sposób, aby zmieściły się na ekranie bez względu na liczbę udzielonych odpowiedzi.

Kolorem zielonym oznaczyłem część wykonaną przezemnie, natomiast czerwonym cześć której wykonać nie potrafię. Wklejam kod poniżej!

#include <iostream>

using namespace std;

int main()
{

int answer;
int nr = 1;
int a = 0, b = 0, c = 0;

cout <<"Wezmiesz udzial w nieskonczonej ankiecie, odpowiadaj wpisujac cyfre 1,2 lub 3"<<endl<<"w zaleznosci od wybranej odpowiedzi. "<<endl;
cout <<"Cyfra 0, zakonczysz ankiete i wyswietlisz swoj wynik."<<endl;

while (answer != 0)
{

cout<< endl;
cout << "Pytanie "<<nr<< endl << endl;
nr++;
cin >> answer;

if (answer == 1)
{
    a++;
}
else if (answer == 2)
{
    b++;

}
else if (answer == 3)
{
    c++;
}

else if (answer !=0 && answer !=1 && answer !=2 && answer!=3 )
{
    cout<< "Brak poprawnej odpowiedzi, pytanie nie zostanie zaliczone"<< endl;
}




}
cout <<endl<<endl<<endl;

cout<< "Odpowiedziales "<<a<<" razy 1."<<" Otrzymujesz za to "<<a<<" pkt."<<endl;
cout<< "Odpowiedziales "<<b<<" razy 2."<<" Otrzymujesz za to "<<b*2<<" pkt."<<endl;
cout<< "Odpowiedziales "<<c<<" razy 3."<<" Otrzymujesz za to "<<c*3<<" pkt."<<endl;

cout<<endl<<"Razem masz "<<a+b*2+c*3<<" pkt.!"<<endl;















    return 0;
}

 

2 odpowiedzi

+2 głosów
odpowiedź 6 grudnia 2018 przez j23 Szeryf (93,860 p.)
edycja 6 grudnia 2018 przez j23
    auto print_n = [](std::ostream &os, size_t n) -> std::ostream&
    {
        while(n--) os << "█";
        return os;
    };
    
    double mul = 50. / nr;
    
    print_n(std::cout << "a ", a * mul) << '\n';
    print_n(std::cout << "b ", b * mul) << '\n';
    print_n(std::cout << "c ", c * mul) << '\n';

 

komentarz 6 grudnia 2018 przez tehqemists Nowicjusz (210 p.)
Dziękuję za kod, ale kompletnie nic nie rozumiem, mógłbyś wyjaśnić działanie?
komentarz 6 grudnia 2018 przez j23 Szeryf (93,860 p.)

print_n to lambda (choć może to być zwykła funkcja), która wypisuje n znaków █ do strumienia podanego w pierwszym parametrze.  Znaczenia mul chyba tłumaczyć nie trzeba. Przyjąłem, że maksymalna długość słupka to 50 znaków. To taka bezpieczna długość, bo z reguły szerokość konsoli/terminala jest ustawiona na 80 znaków. I tyle...

 

Jak Cię lambda przeraża, możesz użyć takie funkcji:

std::ostream& print_n(std::ostream &os, size_t n)
{
    while(n--) os << "█";
    return os;
};

 

komentarz 6 grudnia 2018 przez tehqemists Nowicjusz (210 p.)
Świetnie, dziękuję! Na pewno przybliżyłeś mi zrozumienie, jednak jeszcze funkcji nie tknałem. Zauwazyłem, że książka jest zbudowana tak, aby w niektórych zadaniach pojawiały się nie wytłumaczone aspekty, aby samemu pogłówkować. Dzięki raz jeszcze!
+2 głosów
odpowiedź 7 grudnia 2018 przez mokrowski Szeryf (99,900 p.)

Trochę prościej:

#include <iostream>
#include <string>

int main() {
    int a = 10;
    int b = 12;
    int c = 5;
    double scale = 50. / std::max({a, b, c});

    std::cout << "a: " << std::string(scale * a, '=') << '\n'
              << "b: " << std::string(scale * b, '=') << '\n'
              << "c: " << std::string(scale * c, '=') << '\n';
}

 

komentarz 7 grudnia 2018 przez tehqemists Nowicjusz (210 p.)
Dziękuję, sprawdzę to w najbliższym czasie. Szczerze nie wiedziałem jak zaimplementować tamte powyższe funkcje do kodu. Tutaj sprawa wydaje mi się prostsza.

Podobne pytania

0 głosów
0 odpowiedzi 122 wizyt
pytanie zadane 19 grudnia 2016 w C i C++ przez mzcmc Użytkownik (640 p.)
+3 głosów
3 odpowiedzi 210 wizyt
pytanie zadane 16 września 2016 w Nasze projekty przez obl Nałogowiec (45,900 p.)
0 głosów
0 odpowiedzi 112 wizyt
pytanie zadane 14 lipca 2017 w Nasze projekty przez obl Nałogowiec (45,900 p.)
Porady nie od parady
Nie wiesz jak poprawnie zredagować pytanie lub pragniesz poznać którąś z funkcji forum? Odwiedź podstronę Pomoc (FAQ) dostępną w menu pod ikoną apteczki.FAQ

61,385 zapytań

107,325 odpowiedzi

223,536 komentarzy

33,148 pasjonatów

Przeglądających: 91
Pasjonatów: 5 Gości: 86

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...