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

Pominięcie funkcji void przy drugim i każdym kolejnym zapętleniu kodu.

Object Storage Arubacloud
0 głosów
291 wizyt
pytanie zadane 13 listopada 2016 w C i C++ przez Oskaras Nowicjusz (150 p.)

Hej, jestem totalnie początkującym, chciałem napisać prosty lecz paradoksalnie rozbudowany w miarę możliwości kalkulator. Budowa w miarę prosta, funkcja void dla podania liczb do zmiennych, kolejna funkcja void do całej części z obliczeniami na tych liczbach, i funkcja main zawierająca początek i koniec programu, i która tylko się do void'ów odnosi. I tu coś nie działa. Pod koniec kodu mam pytanie, "czy chcesz spróbować ponownie", "NIE"- wyłącza, "TAK"- powinno wracać do funkcji void liczby ().
Za pierwszym przelotem programu wszystko działa jak należy, ale przy każdym ponownym "spróbowaniu ponownie" funkcja void liczby() działa dobrze, ale potem program pomija funkcję void odpowiedzialną za obliczenia i od razu po podaniu liczb pyta "czy chcesz spróbować ponownie".
To zmieniona wersja, wcześniej nie używałem void'ów, ale wszystko było w main(), wtedy musiałem używać dwóch goto, przez co postanowiłem to zmienić. Na jednym main() i goto działało, teraz po rozdzieleniu nie. Zastanawia mnie czemu za pierwszym przelotem działa, a potem pomija odniesienie do void obliczenie().frown
Będę bardzo wdzięczny kiedy ktoś pomoże mi zrozumieć na czym polega problem, co jest nie tak?
Problem jest właśnie taki jak w tym fragmencie. Widać odniesienia do void'ów. Ale po restarcie TAK i wykonaniu funkcji "liczby", pomija funkcję "obliczenia"...
Pełny kod około 180 linijek: http://wklej.org/id/2946625/



    liczby();

    obliczenie();

    do
    {
    Sleep (900);
    cout << "Czy chcesz zaczac ponownie? (Tak/Nie)" << endl;
    cin >> y;
    Sleep (150);


    if ((y=="NIE")||(y=="nie")||(y=="Nie"))
    {
        Sleep (150);
        system ("cls");
        exit(0);
    }
    else if ((y=="TAK")||(y=="tak")||(y=="Tak"))
    {
        Sleep (250);
        system ("cls");

		liczby();
    }
    else
    {
        system ("cls");
        cout << "Nie ma takiej odpowiedzi!";
        Sleep (900);
        system ("cls");
    }
    }
    while (y!="Tak"||"tak"||"TAK"||"Nie"||"NIE"||"nie");

1 odpowiedź

+2 głosów
odpowiedź 13 listopada 2016 przez niezalogowany
wybrane 13 listopada 2016 przez Oskaras
 
Najlepsza

Zauważ, że funkcja obliczenie() wykona się zawsze tylko raz, bo jest poza główną pętlą programu. Jeżeli użytkownik będzie chciał liczyć dalej to sprawdzasz warunek, który wywołuje tylko funkcje liczby(). Proponuje cały program umieścić w nieskończonej pętli for(;;), a w niej warunki i funkcje.

if ((y=="NIE")||(y=="nie")||(y=="Nie"))

Zamiast takiej zgadywanki proponuje dać wybór pomiędzy T/N.

Usuń te sleepy sprawiają wyłącznie wrażenie, że program się zacina.

komentarz 13 listopada 2016 przez Konrad Nabożny Stary wyjadacz (13,460 p.)
Co do sleepów, jeżeli tak bardzo chcesz aby program sprawiał wrażenie "działania", zrób sobie void który wypisuje trzy kropki co np. 200ms. Jest to bez sensu, ale przynajmniej program jakoś "żyje".
komentarz 13 listopada 2016 przez MichuDev Pasjonat (20,300 p.)
Można również użyć T/F w wersji angielskiej ;)
2
komentarz 13 listopada 2016 przez niezalogowany
W przypadku wyboru raczej yes/no niż true/false.
komentarz 13 listopada 2016 przez MichuDev Pasjonat (20,300 p.)
@mk - pomyliłem się ;( Masz rację ;)
komentarz 13 listopada 2016 przez Oskaras Nowicjusz (150 p.)

Dzięki za wyjaśnienie problemu, dlaczego nie wraca do obliczenie().
Rozwiązałem to w trochę prostszy do zrozumienia dla takiego nowicjusza jak ja sposób.
Połączyłem liczby() i obliczenia() (oczywiście poprawiając wpisy i odniesienia), a to co wcześniej po błędzie pod koniec obliczenia() cofało na początek obliczenia() zrobiłem tak, że zamknąłem całe obliczenia() w pętli do...while.
Może nie jest to najlepszy sposób, ale łatwo mi to ogarnąć wink
Dzięki jeszcze raz! laugh

 

komentarz 13 listopada 2016 przez emce1996 Nowicjusz (170 p.)
proponuje się zapoznać z "switch" "case" twoje menu będzie 10 razy krótsze ;)

Podobne pytania

0 głosów
2 odpowiedzi 211 wizyt
0 głosów
1 odpowiedź 125 wizyt
pytanie zadane 26 września 2015 w C i C++ przez C☺ndzi Stary wyjadacz (12,100 p.)
0 głosów
3 odpowiedzi 459 wizyt
pytanie zadane 29 grudnia 2020 w C i C++ przez Sabax Nowicjusz (160 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

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

...