komornik11 Temat założony przez niniejszego użytkownika |
» 2018-09-14 16:29:25 Dzięki za pomoc, ogarnąłem temat. Mam jeszcze szybkie pytanie do zadania z lekcji 14. Wszystko fajnie śmiga, jedynie chciałbym się dowiedzieć czy istnieje jakiś sposób zabezpieczenia programu przed wprowadzeniem przez użytkownika np. liczby nienaturalnej, albo po prostu ciągu znaków dłuższego niż jeden. W przypadku kiedy użytkownik wpisze np: "2.8" w menu, program bierze samą dwójkę i wybiera opcje odejmowania, da się na mój obecny stan wiedzy to jakoś pokonac? Pozdrooo :) #include <iostream> #include <limits>
int main() { using namespace std; int wybor; long pierwsza; long druga; cout << "Oto prawie kalkulator :P" << endl; cout << "wprowadz poszczegolna liczbe, by wybrac dzialanie" << endl << endl; cout << "\t [1] dodawanie" << endl; cout << "\t [2] odejmowanie" << endl; cout << "\t [3] mnozenie" << endl; cout << "\t [4] dzielenie" << endl; cin >> wybor; cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); if( wybor == 1 || wybor == 2 || wybor == 3 || wybor == 4 ) { switch( wybor ) { case 1: cout << "wprowadz pierwsza liczbe:"; cin >> pierwsza; cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << "wprowadz druga liczbe: "; cin >> druga; cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << pierwsza << "+" << druga << "=" << pierwsza + druga << endl; break; case 2: cout << "wprowadz pierwsza liczbe:"; cin >> pierwsza; cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << "wprowadz druga liczbe: "; cin >> druga; cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << pierwsza << "-" << druga << "=" << pierwsza - druga << endl; break; case 3: cout << "wprowadz pierwsza liczbe:"; cin >> pierwsza; cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << "wprowadz druga liczbe: "; cin >> druga; cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << pierwsza << "*" << druga << "=" << pierwsza * druga << endl; break; case 4: cout << "wprowadz pierwsza liczbe:"; cin >> pierwsza; cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << "wprowadz druga liczbe: "; cin >> druga; cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << pierwsza << "/" << druga << "=" << pierwsza / druga << endl; break; } } else cout << "Wprowadz poprawna wartosc! (1,2,3,4)" << endl; cout << "Koniec"; return 0; }
|
|
YooSy |
» 2018-09-14 17:47:15 Nowy problem, nowy watek. Regulamin.
Można. Przed każdym wprowadzeniem danych (poza pierwszym) oczyść bufor strumienia. |
|
komornik11 Temat założony przez niniejszego użytkownika |
» 2018-09-14 18:13:43 Okej, działa, jednak nie do końca rozumiem dlaczego :P EDIT: Jednak nie bardzo działa, pierwszą liczbę nienaturalną ignoruje i czeka na ponowne podanie liczby do strumienia, po czym przy podaniu nastepnej zczytuje pierwszy znak. Kod wygląda tak na chwilę obecną: #include <iostream> #include <limits>
int main() { using namespace std; int wybor; long pierwsza; long druga; cout << "Oto prawie kalkulator :P" << endl; cout << "wprowadz poszczegolna liczbe, by wybrac dzialanie" << endl << endl; cout << "\t [1] dodawanie" << endl; cout << "\t [2] odejmowanie" << endl; cout << "\t [3] mnozenie" << endl; cout << "\t [4] dzielenie" << endl; cin >> wybor; cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); if( wybor == 1 || wybor == 2 || wybor == 3 || wybor == 4 ) { switch( wybor ) { case 1: cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << "wprowadz pierwsza liczbe:"; cin >> pierwsza; cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << "wprowadz druga liczbe: "; cin >> druga; cout << pierwsza << "+" << druga << "=" << pierwsza + druga << endl; break; case 2: cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << "wprowadz pierwsza liczbe:"; cin >> pierwsza; cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << "wprowadz druga liczbe: "; cin >> druga; cout << pierwsza << "-" << druga << "=" << pierwsza - druga << endl; break; case 3: cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << "wprowadz pierwsza liczbe:"; cin >> pierwsza; cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << "wprowadz druga liczbe: "; cin >> druga; cout << pierwsza << "*" << druga << "=" << pierwsza * druga << endl; break; case 4: cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << "wprowadz pierwsza liczbe:"; cin >> pierwsza; cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << "wprowadz druga liczbe: "; cin >> druga; cout << pierwsza << "/" << druga << "=" << pierwsza / druga << endl; break; } } else cout << "Wprowadz poprawna wartosc! (1,2,3,4)" << endl; cout << "Koniec"; return 0; }
|
|
pekfos |
» 2018-09-14 18:44:25 Wczytywanie przez >> zostawia pierwszy niewłaściwy znak w strumieniu, więc możesz go odczytać i zobaczyć co to było. Wszystko inne niż '\n' oznacza że podano coś więcej niż odczytaną liczbę. #include <iostream>
int main() { int liczba; char term; std::cin >> liczba; std::cin.get( term ); if( std::cin.fail() ) std::cout << "Blad odczytu\n"; else if( term != '\n' ) std::cout << "Dodatkowy znak '" << term << "'\n"; else std::cout << "Liczba: " << liczba; } Jeden problem = jeden temat. |
|
komornik11 Temat założony przez niniejszego użytkownika |
» 2018-09-14 20:14:54 Czyli rozumiem, że mój problem trochę wybiega na przód, bo jeszcze nie miałem okazji spotkać w kursie funkcji get :P Jak interpretować \n?
Co do zasady "jeden temat = jeden problem", oczywiście się na przyszłość zastosuje. |
|
pekfos |
» 2018-09-14 21:34:52 Czyli rozumiem, że mój problem trochę wybiega na przód, bo jeszcze nie miałem okazji spotkać w kursie funkcji get :P |
Gdzieś dalej jest opisane więcej o kontroli wczytywanych danych, ale to chyba dopiero przy wczytywaniu z plików. get() wczytuje po prostu znak. >> ma taki zwyczaj, że pomija białe znaki na początku, więc tak nie odczytasz znaku nowej linii ( \n). A przynajmniej nie zrobisz tego bez użycia czegoś, co już definitywnie nie jest opisane w kursie ;) |
|
komornik11 Temat założony przez niniejszego użytkownika |
» 2018-09-15 02:24:17 Czyli \n, to po prostu gdy uzytkownik zatwierdza enterem - znak nowej linii? |
|
jankowalski25 |
» 2018-09-15 08:25:07 |
|
1 « 2 » 3 |