Witam wszystkich!
Zacząłem jakiś czas temu robić kurs C++ Pana Mirosława, obecnie zrobiłem 6 odcinek.
https://www.youtube.com/watch?v=ib7LXBNfZ7g
Chodzi mi dokładnie o moment w którym mowa o pętli która będzie pozwalała podać jeszcze raz poprawne wartości(jeśli użytkownik poda złe). W filmiku 17;08. W kodzie z odcinka program kończy się po wpisaniu błędnych danych.
Postanowiłem zmierzyć się z tym problemem, lecz opornie mi to szło, jednak przeszukując internet natrafiłem na takie rozwiązanie...
Przerobiłem kod odcinka w taki sposób:
cout << "Podaj numer miesiaca: ";
while(!(cin >> nr_miesiaca))
{
cout << "Blad! Podaj poprawny numer miesiaca: ";
cin.clear();
cin.ignore(9999, '\n' );
}
Teraz działa to tak, że po wpisaniu np liczby, program prosi jeszcze raz o podanie właściwych danych, aż do skutku( tak właśnie chciałem).
TO jest kod z odcinka:
#include <iostream>
#include <cstdlib>
using namespace std;
int nr_miesiaca;
int main()
{
//cout << "Podaj numer miesiaca: ";
//if (!(cin >> nr_miesiaca))
//{
// cerr<<"To nie jest liczba!";
// exit(0);
//}
switch(nr_miesiaca)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
cout<<"Ten miesiac ma 31 dni!";
break;
case 4:
case 6:
case 9:
case 11:
cout<<"Ten miesiac ma 30 dni!";
break;
case 2:
{
int rok;
cout<<"Podaj rok: ";
cin >> rok;
if (((rok%4 == 0) && (rok%100 != 0)) || (rok%400 == 0))
cout<<"Ten miesiac ma 29 dni!";
else cout<<"Ten miesiac ma 28 dni!";
}
break;
default: cout<<"Niepoprawny numer miesiaca!";
}
return 0;
}
Zamienilem te wykomentowane linie, na ten kod który wkleiłem wyżej. Dla pewności zamieszcze całośc, poniżej POPRAWNY KOD(dzialajacy jak chcialem):
#include <iostream>
#include <cstdlib>
using namespace std;
int nr_miesiaca;
int main()
{
cout << "Podaj numer miesiaca: ";
while(!(cin >> nr_miesiaca))
{
cout << "Blad! Podaj poprawny numer miesiaca: ";
cin.clear();
cin.ignore(9999, '\n' );
}
switch(nr_miesiaca)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
cout << "Ten miesiac ma 31 dni!";
break;
case 4:
case 6:
case 9:
case 11:
cout << "Ten miesiac ma 30 dni!";
break;
case 2:
{
int rok;
cout << "Podaj rok: ";
if(!(cin >> rok))
{
cerr << "To nie jest liczba!";
exit(0);
}
if(((rok % 4 == 0) && (rok % 100 != 0)) || (rok % 400 == 0))
cout << "Ten miesiac na 29 dni!";
else
cout << "Ten miesiac ma 28 dni!";
}
break;
default: cout << "Niepoprawny numer miesiaca" << endl;
}
return 0;
}
Czy jest to poprawny sposób? Dodam, że jestem początkujący i z c++ narazie wiem tyle ile z odcinków Pana Mirosława, a tam nie było narazie pojęcia cin.ignore. Czytałem w internecie lecz nie mogę tego zrozumieć. Może mi to ktoś łopatologicznie wyjaśnić? Czy jest to dobry sposób? Na jakiej zasadzie działa to całe cin.clear i cin.ignore ?? Proszę o pomoc, mam nadzieje, że napisałem w miarę jasno. Pozdrawiam