Dlaczego po wczytaniu 1 liczby, można wczytać kolejną i jak to naprawić?

0
#include <iostream>
int wczytajLiczbe()
{
int a;
	std::cin>>a;
  return a;
  
}

int main()



{
do{


    std::cout << "Podaj liczbe wieksza od 0: "<<std::endl;
    int liczba=0;
	liczba = wczytajLiczbe();

    std::cout << "Dobrze,podales liczbe: "<<wczytajLiczbe()<<std::endl;

	
}
while( wczytajLiczbe()<=0);

   return 0; 
}
4

OMG! Nie wiem od czego zacząć !

  1. Sformatuj kod,
  2. Napisz co ten program ma robić. Generalnie od tego trzeba zacząć.
  3. Nie polecam techniki odwrotnej - czyli piszemy kod, a potem ustalamy co robi.
0

Podpowiem, odpowiedz sobie na pytania:

  1. Co robi funkcja wczyytajLiczbe() ?
  2. Do czego służy zmienna liczba ?
  3. Dlaczego umieszczenie wczytajLiczbe() w "std::cout << "Dobrze,podales liczbe: "<<wczytajLiczbe()<<std::endl;" to nie jest dobry pomysł,
  4. Dlaczego umieszczenie wczytajLiczbe() w "while( wczytajLiczbe()<=0)" to nie jest dobry pomysł,
2
int liczba=0;
liczba = wczytajLiczbe();

Przypisałaś wczytaną liczbę do zmiennej liczba, ale nigdzie z niej nie korzystasz. Zamiast tego, wielokrotnie wywołujesz funkcję wczytajLiczbe() i w pozostałych przypadkach gubisz jej wartość bo nie przypisujesz jej do żadnej zmiennej.

1

To samo ale z sensem:

#include <iostream>
using namespace std;

unsigned wczytajLiczbe() { unsigned a; cin>>a; return a; }

int main()
{
  for(unsigned liczba;(cout<<"Podaj liczbe wieksza od 0: ")&&(liczba=wczytajLiczbe());) cout<<"Dobrze,podales liczbe: "<<liczba<<endl;
  return 0; 
}
1
#include <iostream>
#include <limits>   //std::numeric_limits

using namespace std;

int checked_number();
void clear_input();

int main()
{
    int value{0};
    do
    {
        cout<< "Podaj wartosc numeryczna wieksza od 0: ";
        value = checked_number();
        if(value>0)cout<<"Dobrze, podales cyfe/liczbe: "<<value<<"\n";

    }
    while(value <= 0);
    return 0;
}

void clear_input()
{
    //czyscimy strumien wejsciowy std::cin
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
}
int checked_number()
{
    int x{0};
    cin>>x;
    if(cin.fail())
    {
        clear_input();
        cout<<"wartosc nie jest cyfra/liczba"<<"\n";
    }
    else if (x <= 0){
        clear_input();
        cout<<"wartosc musi byc wieksza od 0"<<"\n";
    }
    return x;
}

1

Skoro już chcesz to robić przez funkcję to warto zrobić to uniwersalnie:

#include <iostream>
using namespace std;

typedef bool is_good_number(int);
int input_int(const char *prompt,const char *notnumber,const char *badnumber,is_good_number *isgood)
{
    int value{};
    for(bool ok=false;!ok;)
    {
        cout<<prompt<<": ";
        if(!(cin>>value))
        {
            cin.clear();            
            cout<<notnumber<<endl;
        }
        else if(!isgood(value)) cout<<badnumber<<endl;
        else ok=true;
        while((cin)&&(cin.get()!='\n')) {} // zwykły ignore po 4G znaków przepuści cię dalej, włamywałem się parę razy przez ten błąd
    }
    return value;
}

int main()
{
    int value=input_int
    (
        "Podaj wartosc numeryczna wieksza od 0",
        "Wprowadzony ciąg znaków nie jest liczba",
        "Wprowadzona wartość nie spełnia kriterium",
        [](int value) { return value>0; }
    );
    cout<<"Dobrze, podana wartosc: "<<value<<endl;
    return 0;
}

Aby było jeszcze bardziej uniwersalnie to warto zrobić template na typ wprowadzanej wartości, oraz wskaźnik na funkcję zamienić na function<bool(int)>.

EDIT:

#include <iostream>
#include <iomanip>
#include <functional>
#include <string_view>
using namespace std;

void ignorestdin() { while((cin)&&(cin.get()!='\n')) {} }

template <typename T> T input(const string &prompt,const string &notnumber,const string &badnumber,function<bool(T)> isgood)
{
    T value;
    for(bool ok=false;(!ok)&&(cout<<prompt<<": ");ignorestdin())
    {
        if(!(cin>>value))
        {
            cin.clear();            
            cout<<notnumber<<endl;
        }
        else if(!isgood(value)) cout<<badnumber<<endl;
        else ok=true;        
    }
    return value;
}

int main()
{
    int ivalue=input<int>
    (
        "Podaj wartosc calkowita wieksza od 0",
        "Wprowadzony ciag znakow nie jest liczba",
        "Wprowadzona wartosc nie spelnia kriterium",
        [](int value) { return value>0; }
    );
    cout<<"Dobrze, podana wartosc: "<<ivalue<<endl;
    unsigned short usvalue=input<unsigned short>
    (
        "Podaj wartosc krotka nieparzysta bez znaku ",
        "Wprowadzony ciag znakow nie jest liczba",
        "Wprowadzona wartosc nie spelnia kriterium",
        [](unsigned short value) { return value&1; }
    );
    cout<<"Dobrze, podana wartosc: "<<usvalue<<endl;
    double dvalue=input<double>
    (
        "Podaj wartosc rzeczywista w granicach -1..1",
        "Wprowadzony ciag znakow nie jest liczba",
        "Wprowadzona wartosc nie spelnia kriterium",
        [](double value) { return (-1<value)&&(value<1); }
    );
    cout<<"Dobrze, podana wartosc: "<<setprecision(5)<<dvalue<<endl;
    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1