WilkZKlatki Temat założony przez niniejszego użytkownika |
[Rozdział 17] Kalkulator - problem z funkcją » 2015-08-13 12:19:55 Witam. W rozdziale 17 proszą mnie o stworzenie funkcji wczytajLiczbe() (u mnie nazwa zmieniona na wczytaj(), z powodu tego, że w Visual Studio wszystko traktuje mi jako jeden projekt i nie mogę mieć tych samych nazw funkcji :C ) Problem jest taki, że gdy wpiszę literkę zamiast liczby to to co występuje w if wykonuje się w nieskończoność. #include <iostream>
using namespace std;
int wczytaj() { int a; bool poprawnie; do { cin >> a; poprawnie = cin.good(); cin.clear(); cin.sync(); if( !poprawnie ) { cout << "Podales nieprawidlowa liczbe!" << endl; cout << "Podaj liczbe: "; } } while( !poprawnie ); return a; }
int main() { int wynik = 0; int wybor; int koniec = 1; int liczba; int a; int b; do { cout << "Wynik: " << wynik << endl; cout << "Wprowadz pierwsza liczbe: " << endl; liczba = wczytaj(); if( liczba != 0 ) { a = liczba; cout << "Wprowadz druga liczbe: " << endl; liczba = wczytaj(); if( liczba != 0 ) { b = liczba; cout << "WYbierz dzialanie:" << endl; cout << "[1] Dodawanie" << endl; cout << "[2] Odejmowanie" << endl; cout << "[3] Mnoazenie" << endl; cout << "[4] Dzielenie" << endl; cout << "[5] Rezygnuj" << endl; cin >> wybor; switch( wybor ) { case 1: wynik = a + b; break; case 2: wynik = a - b; break; case 3: wynik = a * b; break; case 4: wynik = a / b; break; case 5: koniec = 0; break; } } else { koniec = 0; } } else { koniec = 0; } } while( koniec != 0 ); return 0; } |
|
PawloRz |
Najpierw dodaj bibliotekę stdio.h » 2015-08-13 12:56:29 Miałem kiedyś ten sam problem. Musisz w tym if, w którym jest błąd dodaj fflush(stdin); Litera zostaje w stdin'ie i wiecznie wywołuje błąd. Jeśli błąd dalej będzie występował, próbuj przenosić funkcję fflush(stdin); Życzę powodzenia! |
|
carlosmay |
» 2015-08-13 13:18:51 wczytajLiczbe() (u mnie nazwa zmieniona na wczytaj(), z powodu tego, że w Visual Studio wszystko traktuje mi jako jeden projekt i nie mogę mieć tych samych nazw funkcji |
A jak przyjdzie przeciążać funkcje to co zrobisz? Jak używasz vs 15 to faktycznie ma problem z czyszczeniem strumienia. Sprawdzałem to na vs 13 i kod jest poprawny, na vs 15 pętla nieskończona. Nie wiem czy to błąd środowiska (ale chyb tak). |
|
PawloRz |
Nie wkurza Cię brak polskich liter? » 2015-08-13 13:25:39 Za cout użyj printf("", [kody-znaków]); Podam Ci zawartość pliku polishchar.h: #ifndef POLISHCHAR #define POLISHCHAR
#define S_S 920 #define U_S 919 #define S_L 904 #define U_L 925 #define U_A 932 #define S_A 933 #define S_E 937 #define U_E 936 #define S_X 939 #define U_X 909 #define U_Z 957 #define S_Z 958 #define S_N 996 #define U_N 995 #define U_C 911 #define S_C 902 #define S_O 930 #define U_O 736
#endif
Użyj, n.p. printf("Rozwi%czanie = %d\n", S_A, [wynik]); |
|
Monika90 |
» 2015-08-13 13:43:57 Musisz w tym if, w którym jest błąd dodaj fflush(stdin); |
fflush(stdin) ma niezdefiniowane zachowanie. |
|
WilkZKlatki Temat założony przez niniejszego użytkownika |
Odpowiadam » 2015-08-13 14:12:10 Miałem kiedyś ten sam problem. Musisz w tym if, w którym jest błąd dodaj fflush(stdin); Litera zostaje w stdin'ie i wiecznie wywołuje błąd. Jeśli błąd dalej będzie występował, próbuj przenosić funkcję fflush(stdin); Życzę powodzenia! |
say what? A jak przyjdzie przeciążać funkcje to co zrobisz? |
Nie wiem co to przeciążanie funkcji, może jakaś porada? Jak używasz vs 15 to faktycznie ma problem z czyszczeniem strumienia. Sprawdzałem to na vs 13 i kod jest poprawny, na vs 15 pętla nieskończona.
Nie wiem czy to błąd środowiska (ale chyb tak). |
Czyli wcześniejsza wersja VS albo jakieś inne, lub czekać aż pan Microsoft to naprawi. Użyj, n.p. printf("Rozwi%czanie = %d\n", S_A, [wynik]); |
Dzięki ale nie pytałem o polskie znaki :) fflush(stdin) ma niezdefiniowane zachowanie. |
Możliwe, a ja nawet nie wiem co to :) |
|
Monika90 |
» 2015-08-13 14:21:40 zatąp cin.sync(); przez cin.ignore(999999, '\n'); i powiedz czy to coś zmieniło. |
|
WilkZKlatki Temat założony przez niniejszego użytkownika |
Odpowiadam #2 » 2015-08-13 14:35:50 zatąp cin.sync(); przez cin.ignore(999999, '\n'); i powiedz czy to coś zmieniło. |
Tak zmieniło, bo działa :P Wyjaśnisz co robi ta linijka? |
|
« 1 » 2 |