#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;
}
0
4
OMG! Nie wiem od czego zacząć !
- Sformatuj kod,
- Napisz co ten program ma robić. Generalnie od tego trzeba zacząć.
- Nie polecam techniki odwrotnej - czyli piszemy kod, a potem ustalamy co robi.
0
Podpowiem, odpowiedz sobie na pytania:
- Co robi funkcja wczyytajLiczbe() ?
- Do czego służy zmienna liczba ?
- Dlaczego umieszczenie wczytajLiczbe() w "std::cout << "Dobrze,podales liczbe: "<<wczytajLiczbe()<<std::endl;" to nie jest dobry pomysł,
- 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 ¬number,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;
}