• 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.

Aruba Cloud - Virtual Private Server VPS
0 głosów
378 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,480 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 285 wizyt
0 głosów
1 odpowiedź 160 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 600 wizyt
pytanie zadane 29 grudnia 2020 w C i C++ przez Sabax Nowicjusz (160 p.)

93,324 zapytań

142,323 odpowiedzi

322,389 komentarzy

62,653 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...