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

Wczytywanie oczekiwanego typu zmiennych.

Ostatnio zmodyfikowano 2013-06-12 12:45
Autor Wiadomość
obi2exe
Temat założony przez niniejszego użytkownika
Wczytywanie oczekiwanego typu zmiennych.
» 2013-06-10 13:48:32
Witam. Pisze prosty program C++, jako zadanie treningowe, z poradnika umieszczonego w tym serwisie.
1. Program losuje liczbę z przedziału od 1 do 1000.
2. Użytkownik zgaduje liczbę, która została wylosowana.
3. Jeżeli podana liczba jest za duża (za mała) gra wypisuje stosowny komunikat i powraca do kroku 2.
4. Jeżeli gracz trafi liczbę wylosowaną to progam kończy działanie, wypisując na ekran wylosowaną liczbę oraz liczbę 'strzałów', które oddał gracz.

Mój problem polega na tym, że program nie jest odpowiednio zabezpieczony przed użytkownikiem Yeti. Jeżeli podam liczbę z rozwinięciem dziesiętnym np, 12,5. program i tak losuje. Jestem zadowolony na ten moment w jaki sposób aplikacja działa, ale denerwuje mnie wczytywanie zmiennej, którą sam wybieram, ta musi być całkowita dodatnia. To mój kod:

C/C++
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
    int wybrana, wylosowana, naliczanie;
    naliczanie = 0;
    do
    { cin.clear();
        cin.sync();
        naliczanie++;
        cout << endl;
        cout << "Wybierz liczbe:";
        cin >> wybrana;
        if( cin.fail() )
        { cout << "Podaj liczbe z zakresu od 1 do 20...";
            cin.clear(); //czyszczenie strumienia wejściowego, bardzo ważne polecenie
            cin.sync(); }
        else
        { wylosowana = rand();
            cout << "Wylosowana liczba to:"
            << wylosowana;
            if( wybrana != wylosowana )
                 cout << endl << "Nie trafiles, sprobuj jeszcze raz..."; }
       
    } while( wybrana != wylosowana );
   
    cout << endl;
    cout << "Szczesliwy strzal..." << " Za" << " " << naliczanie << " " << "razem.";
}
P-85293
Berux
» 2013-06-10 14:10:26
Możesz tu użyć rzutowania. Poczytaj o tym :)

C/C++
double i;

cin >> i;

if( i !=( int ) i ) //tutaj sprawdzasz czy liczba zmiennoprzecinkowa jest równa wartości tej samej wartości, ale bez rozszerzenia dziesiętnego; rzutowanie (stary sposób)
{
    //....Jeśli liczba nie jest całkowitą liczbą
}


To samo możesz wykorzystać na innych typach.
P-85294
obi2exe
Temat założony przez niniejszego użytkownika
» 2013-06-10 15:00:39
Niestety takie ujęcie instrukcji nic nie zmienia, program dalej czyta również liczby niecałkowite.
Gdyby było można sformułować coś takiego w instrukcje:
Jeżeli liczba należy do całkowitych dodatnich wykonuj dalszą część.

 
P-85295
DejaVu
» 2013-06-10 17:25:32
Wydaje mi się, że powinieneś olać problem użytownika yeti w przypadku, gdy uda się wczytać choć fragment liczby. Program powinien się poprawnie zachować gdy wprowadzony tekst ewidentnie nie będzie liczbą tj. będzie się zaczynał np. od litery.
P-85301
MrPoxipol
» 2013-06-10 17:32:22
» Kurs C++ » Poziom 1Obsługa strumienia wejściowego lekcja
@obi2exe
Chyba o to chodziło(cin.good).
P-85304
obi2exe
Temat założony przez niniejszego użytkownika
» 2013-06-10 17:38:14
Program reaguje prawidłowo ,kiedy próbuję wczytać tekst. Niemniej aby wszystko działało tak jak to sobie wymyśliłem, program winien wyrzucić odpowiedni komunikat przy próbie wpisania liczby niecałkowitej, np 14.2,31.4 . Nieoczekiwane działanie ma miejsce, ponieważ aplikacja wczytuje to co jest do kropki, np. samo 14. Niestety dopiero zaczynam zabawę z kodem i zwyczajnie brakuje mi wiadomości jak sobie z tym poradzić.
P-85305
obi2exe
Temat założony przez niniejszego użytkownika
» 2013-06-10 17:43:55
Kombinacje z cin.good() też nie załatwiają sprawy... Program zachowuje się w ten sam sposób.
P-85306
Berux
» 2013-06-10 19:23:25
@2x up:

Typ zmiennej, której wartość pobierasz od użytkownika, to int. Jeśli użytkownik wprowadzi do programu wartość o innym typie, to program rzutuje tą wartość na wartość o typie (w twoim przypadku) int. To znaczy, że jeśli user wpisze wartośc "14.2", to program "obetnie" jego "końcówkę" i pozostanie wartość "14".

Pokombinuj trochę z rzutowaniem :). Możesz korzystać z przykładu, którego ci dałem.
P-85312
« 1 » 2 3
  Strona 1 z 3 Następna strona