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

VPS Starter Arubacloud
0 głosów
281 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 209 wizyt
0 głosów
1 odpowiedź 123 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 450 wizyt
pytanie zadane 29 grudnia 2020 w C i C++ przez Sabax Nowicjusz (160 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...