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

Usprawnienie kodu na poziomie podstawowym

Object Storage Arubacloud
0 głosów
245 wizyt
pytanie zadane 23 września 2018 w C i C++ przez Stairs Nowicjusz (200 p.)

Cześć dostałem na zadanie żeby zrobić program, który:

"Wyobraź sobie, że przychodzi do Ciebie gość. Musisz się go zapytać czy chce kawe czy herbatę oraz do tego ciastko albo nic. Musi wybrac jedną z dwóch rzeczy"

Oto mój kod. Jakbyście wykonali zadanie ? Dodam, że JESZCZE nie programuje, ale uczę się i robię kursy.

#include <iostream>

using namespace std;

string kawa,ciastko;

int main()
{
    cout<<"Czesc kolego!"<<endl;
    cout<<"Kawa, herbata ?"<<endl;
    cin>> kawa;
    if (kawa=="kawa")
    {
        cout<<"Masz kawe"<<endl;
    }
    else
    {
        cout<<"Masz herbate"<<endl;
    }
    cout<<"Ciastko do tego ?"<<endl;
    cout<<"tak czy nie?"<<endl;
    cin>>ciastko;
    if (ciastko=="tak")
    {
        cout<<"Masz ciastko";
    }
    else
    {
        cout<<"Nie to nie :)";
    }


    return 0;
}


 

3 odpowiedzi

+1 głos
odpowiedź 23 września 2018 przez PanRik Gaduła (4,510 p.)
edycja 23 września 2018 przez PanRik

A co się stanie jeśli na pytanie kawa czy herbata? "Gość" odpowie sok pomarańczowy albo jaszczurka :)?

Edit: Przypomniał mi się żart:
Do baru wchodzi Tester i zamawia:
1 piwo
999999999 piw
-1 piwo
Jaszczurkę

 

Edit2: Nie używaj zmiennych globalnych, Twoje std::string na spokojnie mogą być w ciele int main()

komentarz 23 września 2018 przez NIMuser Stary wyjadacz (11,030 p.)
Żartownisia można skasować, sprawdzając dane które są wprowadzane do programu.
1
komentarz 24 września 2018 przez Hiskiel Pasjonat (22,830 p.)
https://youtu.be/I0NGCKOeT1E

Nawet ostatnio prowadziłem krótką rozmowę, bo myślałem, że testowanie oprogramowania polega na deassemblacji itd. coś jak w reverse engineeringu,

A tu się okazuje, że siedzi sobie pani Krysia przed programem i wpisuje literki w polu na numer telefonu.
+1 głos
odpowiedź 24 września 2018 przez afferu Mądrala (5,220 p.)
#include <iostream>

//Parametry funkcji zostają przekazane przez wartość 
bool GetUserInput(std::string msg,std::string err_msg, std::string option_1, std::string option_2){
    //Wybierz
    std::cout << msg << "  options : [" << option_1 << ',' << option_2 << "]\n";

    //tzw nieskończony while, będzie powtarzać się
    while(true){
        //Zmienna lokalna na wejście użytkownika
        std::string user_input="";

        //Pobierz wejście od użytkownika
        std::cin >> user_input;

        //Pierwsza opcja
        //Podczas porównywania wykorzystywane jest przeciązenie operatora == dla std::string
        if(user_input == option_1){
            //Return wychodzi z funkcji i zwraca odp. wartość.
            return true;
        }//Lub jeśli druga opcja
        else if(user_input == option_2){
            return false;
        }//Wszystko inne
        else
        {
            //Wypisz wiadomość o błędzie
            std::cout << err_msg << '\n';
        }
    }
    //Nigdy nie zostanie osiągnięty
    return false;
}

int main()
{
    //Wypisujemy powitalną wiadomość
    std::cout << "Czesc kolego!\n";

    //Używamy tej samej wiadomości o błędzie w obu przypadkach, może zostać zadeklarowana jako stała.
    const std::string error_msg = "Podano zla wartosc, podaj ponownie!";

    //Sprawdzanie wejścia użytkownika wyrzucone do zewnętrznej funkcji
    bool coffee_tea = GetUserInput("Kawa czy herbata?", error_msg, "kawa", "herbata");

    //Używamy wartości zwróconej z funkcji do zainicjalizowania zmiennej lokalnej.
    bool cookie = GetUserInput("Czy chcesz jeszcze ciastko?", error_msg, "tak", "nie");

    //Operator ternarny sprawdza warunek (w tym przypadku jest to zmienna logiczna) i zwraca jedną z 2 wartości(muszą być tego samego typu).
    //W tym przypadku wynikiem operatora ternarnego jest stała w postaci cioągu znaków.
    //Warto zwrócić uwagę na nawiasy, wynikiem wyrażenia w nawiasach jest jeden z 2 stałych ciągów znaków
    std::cout << "Masz " << (coffee_tea ? "kawe" : "herbate") << (cookie ? " i ciastko" : " i to wszystko") << "!\n";

    //Wynik dla systemu operacyjnego. 0 oznacza brak błędów w wykonaniu.
    return 0;
}

Warto się zastanowić nad problemem. W obu przypadkach wybór ma tylko 2 opcje, do tego dochodzi sprawdzenie czy wejście użytkownika jest poprawne. 

komentarz 24 września 2018 przez Stairs Nowicjusz (200 p.)
Super wytłumaczyłeś i to wykonałeś, dzięki :))))
komentarz 24 września 2018 przez Stairs Nowicjusz (200 p.)
edycja 24 września 2018 przez Stairs

@afferu,  Mam jeszcze kilka pytań. Czemu wszystko pisałeś z std ?

std::string
std::cout 

itp.

Czemu w niektórych miejscach na końcach wierszy jest {

bool GetUserInput(std::string msg,std::string err_msg, std::string option_1, std::string option_2){

while(true){

itp.

Co oznacza '\n';

std::cout<<err_msg<<'\n';

 

komentarz 24 września 2018 przez afferu Mądrala (5,220 p.)
1. std::string oznacza, że odwołujesz sie do obiektu string w przestrzeni nazw(namespace) std czyli po prostu bibliotece standardowej. using namespace std; oznacza tyle, że używasz tej przestrzeni nazw w zasiągu gdzie znajduje sie to polecenie.

2. To gdzie stawiasz nawiasy zasięgów (scope) to sprawa stylu pisania.

3. '\n' to znak nowej linii tzw escape character, powoduje, oznacza przejście do nowej linii.
komentarz 24 września 2018 przez Stairs Nowicjusz (200 p.)
Stało by się coś gdybym napisał string zamiast std::string ?
–1 głos
odpowiedź 23 września 2018 przez NIMuser Stary wyjadacz (11,030 p.)
Nie rób czegoś takiego, jak:  kawa == "kawa" :)  [*] Załóż zmiennną "wybór" (choice) i używaj angielskich nazw:

np:

byte choice;

Wystarczy na 256 "wyborów" (napoi/drinków).

[*]  - zamiast zmiennej kawa, lepsza byłaby boolean kawa_czy_nie_kawa;   :D  <- ale tak też nie rób.

 

Możesz zrobić małe menu wyboru:

1) kawa

2) mleko

3) piwo

i zapytać o liczbę od 1 do 3.....Oczywiście warto sprawdzić poprawność wprowadzonych danych.
komentarz 23 września 2018 przez RafalS VIP (122,820 p.)

byte choice;

jeśli mówisz o https://en.cppreference.com/w/cpp/types/byte to nie zgadzam się, że to dobry pomysł. Jeśli zrobiłeś kalke z Javy i miałeś na myśli 8-bit signed integer to prędzej :P

1
komentarz 23 września 2018 przez Stairs Nowicjusz (200 p.)

@NIMuser, Super, że odpowiedziałeś. Jutro spróbuję zrobić to z tym menu, jest to świetny pomysł, a zarazem podejście z innej perspektywy. W komentarzu wkleję kod jak mi poszło ;p

komentarz 24 września 2018 przez NIMuser Stary wyjadacz (11,030 p.)

@RafalS, Masz rację, 100 lat nie używałem tego typu.

Podobne pytania

0 głosów
2 odpowiedzi 186 wizyt
pytanie zadane 1 maja 2015 w C i C++ przez Adrian1999 Nałogowiec (34,570 p.)
+2 głosów
2 odpowiedzi 364 wizyt
pytanie zadane 26 listopada 2020 w C i C++ przez Gutekv0 Nowicjusz (170 p.)
0 głosów
1 odpowiedź 437 wizyt
pytanie zadane 15 lipca 2016 w Java przez michalxi1410 Początkujący (480 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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!

...