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

Nieznany błąd przy wymuszaniu liczby

Ostatnio zmodyfikowano 2014-05-08 18:44
Autor Wiadomość
dziubeQ
Temat założony przez niniejszego użytkownika
Nieznany błąd przy wymuszaniu liczby
» 2014-05-07 20:49:53
Napisałem kod, który miał wczytywać liczbę z danego przedziału, wczytywał ją jako string (żeby nie wariowało, po wpisaniu znaku) wydawało się, że działał dobrze, jednak teraz coś się zepsuło, pierwszy błąd zauważyłem przy wpisaniu liczby 33 (wybór miał być od 1 do 10) wtedy program wyłączył się, wprowadzałem zmiany w kodzie i teraz wygląda tak:

C/C++
string opcja;
cin >> opcja;

do {
    if( opcja == "1" ) {
        //funkcja
    }
    else
    if( opcja == "2" ) {
        //funkcja
    }
    else
    {
        cout << "zly przedział";
        cin >> opcja;
    } }
while( !( opcja >= "1" && opcja <= "9" ) );

}

w jaki sposób mogę wymusić wpisanie liczby 1-10 bez błędów przy wpisywaniu liczb z innego przedziału, lub znaków?
P-109444
Raptiler
» 2014-05-07 20:59:39
Był już podobny temat, przejrzyj forum
http://cpp0x.pl/forum/temat/?id=15526

Możesz wczytywać liczbę jako int, poprostu później sprawdzasz czy to nie znak poprzez metodę cin.good()
P-109447
libed
» 2014-05-07 21:20:26
C/C++
int range;
bool invalid;
do {
    invalid = false;
    std::cout << "Enter a number: ";
    std::cin >> range;
    if( !std::cin ||( range < 1 || range > 10 ) ) {
        std::cout << "Invalid input\n";
        std::cin.clear();
        std::cin.sync();
        invalid = true;
    }
} while( invalid );

std::cout << "Choosed option: " << range << "\n";
P-109450
dziubeQ
Temat założony przez niniejszego użytkownika
» 2014-05-07 23:01:46
moja funkcja wygląda teraz tak:
C/C++
void sprawdzanie( int p, int k ) {
   
   
    cout << "\nWYB" << char( 0xe0 ) << "R: ";
   
    cin >> l;
    do {
        if( cin.good() ) {
            if( l >= p && l <= k )
                 break;
            else {
                cout << "\nPodaj liczb\251 z w\210a" << char( 0x98 ) << "ciwego przedzia\210u!\nWYB" << char( 0xe0 ) << "R: ";
                cin >> l;
            }
           
           
        }
        else {
            cout << "\nPodaj liczb\251!\nWYB" << char( 0xe0 ) << "R: ";
            cin.clear();
            cin.sync();
            cin >> l; }
    }
    while( cin.fail() ||( !( l >= p && l <= k ) ) );
   
   
   
}

p - początek przedziału, k - koniec przedziału, dzięki l przepisuję do konkretnej zmiennej wartość w innej funkcji.

Występuje tylko błąd kiedy wpiszę liczbę a potem znak, wtedy jeśli pierwsza z liczb należy do danego przedziału wyświetla mi funkcję która powinna robić ta pierwsza liczba, oraz informację, że następny znak nie jest liczbą. Jakieś wskazówki?
P-109464
pekfos
» 2014-05-08 10:36:52
Czyść strumień niezależnie od tego, czy wystąpił błąd.
P-109479
maly
» 2014-05-08 10:55:57
Nie na temat ale...
char( 0x98 )
 =>
"\230"

char( 0xe0 )
 =>
"\340"
P-109481
dziubeQ
Temat założony przez niniejszego użytkownika
» 2014-05-08 18:44:17
z tym czyszczeniem mi jakoś nie szło do końca, zmieniłem trochę pod siebie bo potrzebuję tylko liczb jednocyfrowych i działa git
C/C++
#include <iostream>
#include <stdlib.h>

using namespace std;

void sprawdzanie( string pocz, string kon ) {
    int p, k, z;
    string x;
    p = atoi( pocz.c_str() );
    k = atoi( kon.c_str() );
    cout << "podaj liczbe: ";
   
    do {
       
        getline( cin, x );
        if( x.size() != 1 )
             cout << "podaj wlasciwa liczbe!\n";
       
        else {
            z = atoi( x.c_str() );
            if( z >= p && z <= k )
                 cout << "najs!\n";
            else
                 cout << "podaj wlasciwa liczbe!\n";
           
        }
       
    } while( !( z >= p && z <= k ) );
   
}
int main()
{
   
   
    sprawdzanie( "3", "6" );
   
    return 0;
}
P-109509
« 1 »
  Strona 1 z 1