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

Wczytanie znaku, wymuszając by był cyfrą.

Ostatnio zmodyfikowano 2016-12-15 15:15
Autor Wiadomość
qloda
Temat założony przez niniejszego użytkownika
Wczytanie znaku, wymuszając by był cyfrą.
» 2016-12-15 13:15:29
Cześć,
Próbuje napisać program, który wczytuje znak będący symbolem końca ciągu, wymuszając, by był on cyfrą.
Oto kod mojego programu:
C/C++
#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    int znak;
   
   
    do
    {
        cout << "Podaj znak: ";
        cin >> znak;
       
        if( znak <= 0 && znak > 10 )
             cout << znak;
        else
             cout << "Wprowadz cyfre.";
       
    }
    while( znak != 10 && znak <= 0 );
   
    cout << "Wprowadziles: " << znak << endl;
   
    return 0;
}

Jak wpiszę "1" to program uwzględnia również instrukcję zawartą w "else". Co źle zrobiłem?
Z góry dzięki za pomoc.
P-154968
mateczek
» 2016-12-15 13:21:05
C/C++
if( znak <= 0 && znak > 10 )
//mniejsze od zera i większe od 10 taka liczba nie istnieje
P-154969
qloda
Temat założony przez niniejszego użytkownika
» 2016-12-15 13:27:48
Rzeczywiście. Już poprawiłem, lecz po zmianie nadal program uwzględnia instrukcję zapisaną w "else". I pojawił się drugi błąd, a mianowicie po wpisaniu np. litery "a" program nie pozwala mi wpisać ponownie znaku.
P-154970
mateczek
» 2016-12-15 13:43:31
//o coś takiego chodziło ??
C/C++
#include <iostream>
#include<limits>

using namespace std;

int main()
{
    int znak;
   
    while( !( cin >> znak ) ||( znak < 0 ) ||( znak > 10 ) ) { //powtórz wczytywanie jeśli: wczytanie się niepowiedzie, lub znak mniejszy od zera, lub znak większy od 10
        cout << "bledny znak powtorz";
        cin.clear();
        cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
    }
   
    cout << "Wprowadziles: " << znak << endl;
   
    return 0;
}
P-154971
qloda
Temat założony przez niniejszego użytkownika
» 2016-12-15 13:50:54
Tak dzięki. Możesz mi tylko powiedzieć poco jest ta instrukcja?

C/C++
cin.ignore( numeric_limits < streamsize >::max()
P-154972
mateczek
» 2016-12-15 14:02:50
C/C++
cin.ignore( numeric_limits < streamsize >::max()

zmienną "znak" masz zadeklarowaną jako typ "int". To sprawi że gdy z klawiatury wpiszesz powiedzmy "10" to są 2 znaki a i tak wczytanie liczby się  się powiedzie. Natomiast gdy wpiszesz literkę powiedzmy  "a" to nie nastąpi automatyczna konwersja na typ int i strumień ustawi się w błąd. W takim wypadku wymagane jest wyczyszczenie flagi błędu (metoda clear), oraz opróżnienie strumienia z błędnych danych(metoda ignore).

// co innego taki kod
C/C++
#include <iostream>
using namespace std;

int main()
{
    char znak;
   
    do {
        cout << "podaj znak" << endl;
        cin >> znak; //raczej nie ma opcji aby wczytanie znaku się nie powiodło
    } while(( znak < '0' ) ||( znak > '9' ) );
   
    cout << "Wprowadziles: " << znak << endl;
   
    int liczba = znak; // ale znak to nie to samo co liczba
    cout << liczba << endl;
    return 0;
}
znaki na liczby konwertowane są zgodnie z tablicą ASCII i tak znakowi
char -> int
'0'  -> 48
'1'  -> 49

więc trzeba wiedzieć że znak= '0' to nie to samo co liczba =0;
P-154973
carlosmay
» 2016-12-15 15:15:19
Próbuje napisać program, który wczytuje znak będący symbolem końca ciągu, wymuszając, by był on cyfrą.
Możesz bardziej rozwinąć tą myśl?
P-154980
« 1 »
  Strona 1 z 1