Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Rozdz. 1 lekcja 9 - Prosze o pomoc w zadaniu

Ostatnio zmodyfikowano 2019-10-03 14:38
Autor Wiadomość
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 :)

C/C++
#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;
}
P-172314
YooSy
» 2018-09-14 17:47:15
Nowy problem, nowy watek. Regulamin.

Można.
Przed każdym wprowadzeniem danych (poza pierwszym) oczyść bufor strumienia.
P-172315
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ą:

C/C++
#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;
}
P-172317
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ę.
C/C++
#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.
P-172318
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.
P-172319
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 ;)
P-172320
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?
P-172321
jankowalski25
» 2018-09-15 08:25:07
Tak. » Kurs C++ » Poziom 1Obsługa strumienia wyjściowego lekcjaZnaki specjalne. To samo dotyczy strumienia wejściowego.
P-172322
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona