• 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

Object Storage Arubacloud
+1 głos
950 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 Mędrzec (194,920 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 Mędrzec (194,920 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 Mędrzec (155,460 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 330 wizyt
pytanie zadane 19 grudnia 2016 w C i C++ przez mzcmc Użytkownik (620 p.)
+1 głos
3 odpowiedzi 509 wizyt
0 głosów
0 odpowiedzi 410 wizyt

92,545 zapytań

141,387 odpowiedzi

319,503 komentarzy

61,930 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...