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

Zadanie Domowe lekcja 17

Ostatnio zmodyfikowano 2016-10-31 14:18
Autor Wiadomość
ratillada
Temat założony przez niniejszego użytkownika
Zadanie Domowe lekcja 17
» 2016-10-25 16:21:54
Witam! Nie udaje mi się zabezpieczyć zmiennej przed wprowadzeniem niepoprawnej liczby (Mam na myśli znaku : a,b,c, . , / itd. )
Nie mam pojęcia co robię źle, że program nie chce działać poprawnie. Proszę o pomoc
Z góry dziękuje! :)


Oto mój kod



#include <iostream>
using namespace std;
int wczytajLiczbe()
{
   int liczba;
   bool prawda = cin.good();
   do
   {
       cin >> liczba;
       cout << "Udalo sie? " << prawda << endl;
       if(prawda == 0)
       {
           cout << "Wprowadz poprawna liczbe" << endl;
       }

   }while(prawda != 1);
   return liczba;
}

int main()
{

    std::cout << "Podaj liczbe: ";
    int liczba = wczytajLiczbe();

    std::cout << "Podales liczbe: " << liczba << std::endl;
    return 0;
}
P-152911
karambaHZP
» 2016-10-25 18:40:10
Nie udaje mi się zabezpieczyć zmiennej przed wprowadzeniem niepoprawnej liczby (Mam na myśli znaku : a,b,c, . , / itd. )
1. Ustawiasz zmienną prawda przed jakimkolwiek wczytywaniem.
Zrób to po wczytaniu danych.

2. Do czyszczenia strumienia należy użyć std::cin.clear() oraz std::cin.ignore().
P-152913
BluePotato
» 2016-10-25 20:15:39
Też sobie ostatnio wróciłem do programowania i w sumie szło nieźle aż do funkcji. Podobny błąd u mnie.

C/C++
#include <iostream>
int wczytajLiczbe()
{
    int liczba;
    bool prawda;
    prawda = std::cin.good();
    do
    {
        std::cin >> liczba;
        prawda;
        std::cin.clear();
        std::cin.ignore();
        if( prawda = !1 )
        {
            std::cout << "Wprowadz poprawna liczbe ";
        }
    } while( prawda = !1 );
   
    return liczba;
}

int main()
{
    std::cout << "Podaj liczbe: ";
    int liczba = wczytajLiczbe();
    std::cout << "Podales liczbe: " << liczba << std::endl;
    return 0;
}

Nie za bardzo rozumiem co masz na myśli, @karambaHZP
P-152916
carlosmay
» 2016-10-25 21:33:02
C/C++
int wczytajLiczbe()
{
    int liczba;
    bool prawda;
    prawda = std::cin.good(); // sprawdzenie strumienia
    do
    {
        std::cin >> liczba; // a dopiero tutaj wczytywanie
        prawda; // to nie wiem co robi?
        std::cin.clear(); // to powinno wyć w ifie
        std::cin.ignore(); // to też, poza tym jest niekompletne i pobierze tylko jeden zalegający znak
        if( prawda = !1 ) // tutaj masz przypisanie zamiast porównania, warunek zawsze false
        {
            std::cout << "Wprowadz poprawna liczbe ";
        }
    } while( prawda = !1 ); // to samo co w ifie
   
    return liczba;
}

Nie za bardzo rozumiem co masz na myśli
Patrząc na kody, to raczej ma na myśli kolejność wykonywania operacji.

edit: powinno być tak.
1. próba wczytania danych
2. sprawdzenie stanu strumienia i zapisanie go w zmiennej
bool
.
3. użycie zmiennej
bool
 w warunku, lub bezpośrednie użycie metody cin.good() w warunku.
4. jeśli wczytanie się nie powiodło, oczyść strumień i ponów próbę wczytywania.
P-152920
BluePotato
» 2016-10-26 00:37:32
Aaaa, no tak... spacja przypadkowa naciśnięta przed negacją. Dziwne, że tego nie zauważyłem.
P-152927
carlosmay
» 2016-10-26 09:08:16
spacja przypadkowa naciśnięta przed negacją.
Coś tu ściemniasz. W tym przypadku wyjdzie nieznajomość operatora
!=
.
P-152935
BluePotato
» 2016-10-26 19:13:27
Tak, bo to jednak nie spacja.
Błąd [ cpp [ /cpp
Wkleje kod na czysto

#include <iostream>
int wczytajLiczbe()
{
int liczba;
do
{
std::cin >> liczba;
std::cin.good();
if(std::cin.good()!=1)
{
std::cout << "Wprowadz poprawna liczbe ";
}
}while (std::cin.good()!=1);
return liczba;
}

int main()
{
    std::cout << "Podaj liczbe: ";
    int liczba = wczytajLiczbe();
    std::cout << "Podales liczbe: " << liczba << std::endl;
    return 0;
}

Nie wiem co zrobić żeby pomimo nie spełnienia warunku while przestawało wykonywać czynność z if i zataczało pętle (powtarzało cały kod od początku)
P-152957
carlosmay
» 2016-10-26 21:41:27
@BluePotato zerknij:
C/C++
#include <iostream>
#include <numeric>

int getNum()
{
    int num { };
    do {
        if( std::cin.fail() ) {
            std::cin.clear();
            std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
        }
        if( !( std::cin >> num ) ) {
            std::cerr << "blad wprowadzania danych, sprobuj ponownie\n";
        }
    } while( std::cin.fail() );
   
    return num;
}

int main()
{
    std::cout << "Podaj liczbe calkowita\n";
    int number = getNum();
    std::cout << "Podales " << number << '\n';
}
P-152965
« 1 » 2
  Strona 1 z 2 Następna strona