DavidYi Temat założony przez niniejszego użytkownika |
Sprawdzanie poprawności wprowadzonych danych » 2016-08-18 23:08:22 Witam. Na wstępie powiem, że jestem tu nowy, regulamin czytałem, aczkolwiek jeśli coś zrobię nie tak, proszę mnie poprawić :) Tytułem wstępu uczę się programować, robiąc kalkulator. Zatrzymałem się przy sprawdzaniu poprawności wprowadzonych danych. Szukałem długo w internecie, kombinowałem na różne sposoby, ale żaden mi nie wychodzi. Głównie chodzi o tą część: #include <iostream> #include <limits> using namespace std; int main() { long double wynik = 0; long double liczba, liczba1; char znak; do { if( wynik == 0 ) { cout << "Podaj liczbe: "; cin >> liczba; if( cin.fail() ) { cout << "Nieprawidlowa liczba\n"; cin.sync(); cin.clear(); cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); continue; } cout << "Podaj znak: "; cin >> znak; if( cin.fail() ) { cout << "Nieprawidlowy znak\n"; cin.sync(); cin.clear(); cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); continue; } } } while( true ); }
Przy podawaniu liczby oraz znaku, jeśli wpiszę za dużo cyfr, liter lub znaków jednocześnie, pojawia się sekwencja cout-ów z całego programu. Jedyne co się nie pojawia to "Nieprawidłowy znak". Również gdy przy cout<<"Podaj znak" podam cyfry, program pomija cin>>liczba i przechodzi do cin>>znak, a chciałbym, żeby powracało na początek pętli i wszystko działało od nowa. |
|
carlosmay |
» 2016-08-19 09:11:09 if( cin.fail() ) { cout << "Nieprawidlowa liczba\n"; cin.sync(); cin.clear(); cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); continue; } cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
Wczytywanie znaku char jest trochę trudniejsze ponieważ liczby to też znaki, więc musisz sprawdzić jaki znak jest wczytany. |
|
cppnewbie |
» 2016-08-20 12:29:40 Możesz zapętlić to wszystko w pętli for(;;), while(true). Możesz także skorzystać z funkcji "switch" i jako jeden case przypisać "exit(0)".
|
|
carlosmay |
» 2016-08-20 14:38:41 Możesz także skorzystać z funkcji "switch" i jako jeden case przypisać "exit(0)". |
Możesz trochę rozwinąć pomysł? |
|
cppnewbie |
» 2016-08-20 22:59:14 sam sie ucze wiec troche moich komentarzy
#include <iostream> #include <stdio.h>//potrzebne do dzialania exit #include <stdlib.h>//do dzialania cls #include <conio.h>//biblioteka dzieki ktorej przy wyborze z menu nie musimy klikac enter using namespace std;
float x,y; char wybor; //zmienna dzieki ktorej wczytujemy bezposrednio z klawiatury int main() { for(;;) { cout << "Podaj liczbe a: " << endl; cin >>x; cout <<"Podaj liczbe b: "<<endl; cin>>y;
cout <<"MENU GLOWNE"<< endl; cout <<endl; cout <<"1. Dodawanie"<<endl; cout <<"2. Odejmowanie"<<endl; cout <<"3. Mnozenie"<< endl; cout <<"4. Dzielenie"<<endl; cout <<"5. Koniec programu"<<endl; cout<<endl; wybor=getch(); switch(wybor) //wybor miedzy funkcjami przydatny w tworzeniu menu { // zmienna switch moze byc tylko char albo int. Wymagana jest wartosc calkowita case '1': { cout << "Suma liczb to: "<<x+y<<endl; } break;
case '2': //wartosc zapisana w apostrofie dlatego ze wybieramy bezposrednio z klawaitury { cout << "Roznica liczb to: "<<x-y<<endl; } break;
case '3': { cout << "Iloczyn liczb to: "<<x*y<<endl; } break;
case '4': { if (y==0) cout<<"nie dziel przez zero"; else cout << "Iloraz liczb to: "<<x/y<<endl; } break; case '5': { exit(0); // sluzy do zamkniecia programu } break;
default: cout<< "nie ma takiej opcji w menu"<<endl; } cout<<endl; getchar();getchar(); //kliknac enter dwa razy na koncu system("cls"); //czyszczenie ekranu } return 0; }
|
|
DavidYi Temat założony przez niniejszego użytkownika |
» 2016-08-21 14:26:14 Poradziłem sobie z problemem dzięki carlosmay :) Usunąłem cin.cyns();, powtórzyłem cin.ignore(); po skończeniu instrukcji if(cin.fail()), do tego wyzerowałem wszystkie wartości, a po wpisaniu znaku dałem sprawdzanie, czy znak jest prawidłowy, mimo iż dalej też było to zrobione. Ogółem ten wycinek wygląda teraz tak: #include <iostream> #include <limits> using namespace std; int main() { long double wynik = 0; long double liczba, liczba1; char znak; do { if( wynik == 0 ) { cout << "Podaj liczbe: "; cin >> liczba; if( cin.fail() ) { cout << "Nieprawidlowa liczba\n"; cin.clear(); cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); liczba = 0; liczba1 = 0; wynik = 0; continue; } cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); cout << "Podaj znak: "; cin >> znak; if( cin.fail() ) { cout << "Nieprawidlowy znak\n"; cin.clear(); cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); liczba = 0; liczba1 = 0; wynik = 0; continue; } else if( znak != 'C' && znak != 'c' && znak != '=' && znak != '+' && znak != '-' && znak != '*' && znak != 'x' && znak != ':' && znak != '/' ) { cin.clear(); cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); liczba = 0; liczba1 = 0; wynik = 0; cout << "Nieprawidlowy znak\n"; continue; } cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); } while( true ) }
Jeśli są tu jakieś nieptorzebne rzeczy, śmieci, czy czegoś jest za dużo to chętnie się o tym dowiem :) Tak czy inaczej uporałem się z problemem i błędy się dobrze czyszczą i wszystko działa poprawnie i jak należy :) cppnewbie- kalkulator z menu nie wchodzi w gre, bo ja robie go bez menu :) Dla ciekawskich wygląda to tak: #include <iostream> #include <limits> using namespace std; int main() { long double wynik = 0; long double liczba, liczba1; char znak; do { if( wynik == 0 ) { cout << "Podaj liczbe: "; cin >> liczba; if( cin.fail() ) { cout << "Nieprawidlowa liczba\n"; cin.clear(); cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); liczba = 0; liczba1 = 0; wynik = 0; continue; } cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); cout << "Podaj znak: "; cin >> znak; if( cin.fail() ) { cout << "Nieprawidlowy znak\n"; cin.clear(); cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); liczba = 0; liczba1 = 0; wynik = 0; continue; } else if( znak != 'C' && znak != 'c' && znak != '=' && znak != '+' && znak != '-' && znak != '*' && znak != 'x' && znak != ':' && znak != '/' ) { cin.clear(); cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); liczba = 0; liczba1 = 0; wynik = 0; cout << "Nieprawidlowy znak\n"; continue; } else if( znak == 'C' || znak == 'c' ) { wynik = 0; cout << "Reset liczby\n\n"; continue; } else if( znak == '=' ) { wynik = liczba; cout << wynik << "\n"; continue; } cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); cout << "Podaj liczbe: "; cin >> liczba1; if( cin.fail() ) { cout << "Nieprawidlowa liczba\n"; cin.clear(); cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); liczba = 0; liczba1 = 0; wynik = 0; continue; } else if( liczba1 == 0 ) { cout << "Nieprawidlowa liczba\n"; liczba = 0; liczba1 = 0; wynik = 0; continue; } else if( znak == '*' || znak == 'x' ) { wynik = liczba1 * liczba; cout << "Wynik: " << wynik << "\n\n"; } else if( znak == '+' ) { wynik = liczba + liczba1; cout << "Wynik: " << wynik << "\n\n"; } else if( znak == '-' ) { wynik = liczba - liczba1; cout << "Wynik: " << wynik << "\n\n"; } else if( znak == '/' || znak == ':' ) { wynik = liczba / liczba1; cout << "Wynik: " << wynik << "\n\n"; } else { cout << "\nNieprawidlowy znak\n"; wynik = 0; liczba = 0; liczba1 = 0; cin.clear(); cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); continue; } cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); } else if( wynik != 0 ) { cout << "Podaj znak: "; cin >> znak; if( cin.fail() ) { cout << "Nieprawidlowy znak\n"; cin.clear(); cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); liczba = 0; liczba1 = 0; wynik = 0; continue; } else if( znak != 'C' && znak != 'c' && znak != '=' && znak != '+' && znak != '-' && znak != '*' && znak != 'x' && znak != ':' && znak != '/' ) { cin.clear(); cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); liczba = 0; liczba1 = 0; wynik = 0; cout << "Nieprawidlowy znak\n"; continue; } else if( znak == 'C' || znak == 'c' ) { wynik = 0; cout << "Reset liczby\n\n"; continue; } else if( znak == '=' ) { wynik = wynik; cout << wynik << "\n"; continue; } cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); cout << "Podaj liczbe: "; cin >> liczba; if( cin.fail() ) { cout << "Nieprawidlowa liczba\n"; cin.clear(); cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); liczba = 0; liczba1 = 0; wynik = 0; continue; } else if( liczba1 == 0 ) { cout << "Nieprawidłowa liczba\n"; liczba = 0; liczba1 = 0; wynik = 0; continue; } else if( znak == '*' || znak == 'x' ) { wynik = wynik * liczba; cout << "Wynik: " << wynik << "\n\n"; } else if( znak == '+' ) { wynik = liczba + wynik; cout << "Wynik: " << wynik << "\n\n"; } else if( znak == '-' ) { wynik = wynik - liczba; cout << "Wynik: " << wynik << "\n\n"; } else if( znak == '/' || znak == ':' ) { wynik = wynik / liczba; cout << "Wynik: " << wynik << "\n\n"; } else { cout << "\nNieprawidlowy znak\n"; wynik = 0; liczba = 0; liczba1 = 0; znak = 0; cin.clear(); cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); } cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); } } while( true ); } |
|
« 1 » |