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

Lekcja 26 zadanie 2

Ostatnio zmodyfikowano 2018-09-30 16:41
Autor Wiadomość
wojcioo
Temat założony przez niniejszego użytkownika
Lekcja 26 zadanie 2
» 2018-09-29 22:24:04
Witam!

ponownie mam problem nad którym utknąłem bardzo proszę o pomoc co jest nie tak... bo sam chyba do tego nie dojdę.

Po kompilacji tego:

C/C++
#include <iostream>
#include<string>

using namespace std;

void wczytajOsobe( string & imie, string & nazwisko, int & wiek )
{
   
    cout << "Podaj imie: " << endl;
    cin >> imie;
    cout << "Podaj nazwisko: " << endl;
    cin >> nazwisko;
   
    cout << "Podaj wiek: " << endl;
    cin >> wiek;
    if( cin.fail() )
    {
        do
        {
            cin >> wiek;
            cout << "Blad! Podaj liczbe!";
            cin.clear();
            cin.ignore();
           
        } while( cin.fail() == true );
       
    }
   
   
}
wypiszOsobe( string & im, string & naz, int & wiek )
{
    cout << im << " " << naz << " " << wiek << endl;
}



int main()
{
    string imie[ 2 ];
    string nazwisko[ 2 ];
    int wiek[ 2 ];
    for( int i = 0; i < 2; i++ )
         wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
   
    for( int i = 0; i < 2; i++ )
         wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
   
    return 0;
   
}

i wpisaniu celowo błędnej wartości do zmiennej wiek[0] - tak jakby zapomina o problemie i "omija" również drugą szufladke w tablicy imie[1] i przeskakuje odrazu do podania drugiego nazwisko[1].
Tak to wygląda w kompilatorze:
http://wrzuc.se/i/5bafdb0f973ef




P-172506
wojcioo
Temat założony przez niniejszego użytkownika
» 2018-09-29 22:54:42
Dobra p znalazłem problem który jak zwykle okazał się być błachy... nie potrzebnie tam było miejsce na dwa razy zmienna wiek przez co program świrował i nie wiedział co przypisać do tablicy:)
Natomiast na zamiane cin na getline(); program znów zaczął świrować... i teraz już nic chyba nie wymyśle:
C/C++
void wczytajOsobe( string & imie, string & nazwisko, int & wiek )
{
   
    cout << "Podaj imie: " << endl;
    getline( cin, imie );
    cout << "Podaj nazwisko: " << endl;
    getline( cin, nazwisko );
    cout << "Podaj wiek: " << endl;
   
    do
    {
       
        cin.clear();
        cin.ignore();
       
        cin >> wiek;
       
    } while( cin.fail() == true );
   
   
   
   
}
Tak to wygląda w kompilatorze:

http://wrzuc.se/i/5bafe3d846906
P-172507
pekfos
» 2018-09-29 23:25:17
Najpierw wczytuj liczbę, potem czyść błąd jeśli jest, powtarzaj jeśli błąd był - bo już nie ma, wyczyściłeś stan strumienia. Pierwszy kod był bliżej poprawnego rozwiązania niż drugi.

Co do używania >> razem z getline(), musisz rozumieć różnice w ich działaniu. Możesz o tym poczytać tu » Kurs C++ / FAQstd::getline() mi nie działa! pytanie/odpowiedź.
P-172509
YooSy
» 2018-09-29 23:27:22
» Kurs C++ / FAQstd::getline() mi nie działa! pytanie/odpowiedź
P-172510
wojcioo
Temat założony przez niniejszego użytkownika
» 2018-09-30 00:04:42
YooSy dziękuję pomogło! I działa jak trzeba :)

Natomiast ciekaw jestem Pekfos jak to powinno wyglądać wg. Ciebie bo próbowałem w tej kolejności co pisałeś ii coś nie szło....
C/C++
do
{
    cin >> wiek;
    cin.clear();
    cin.ignore();
   
} while( cin.fail() == true );

cin.ignore( numeric_limits < streamsize >::max(), '\n' );
P-172511
YooSy
» 2018-09-30 00:09:35
std::cin.fail()
 warunku pętli zawsze będzie
== false
, bo wcześniej używasz
std::cin.clear()
.
Kolejność operacji jest bardzo ważna. Jeśli masz problem ze zrozumieniem kodu, rozpisz sobie go na kartce i przeanalizuj.
P-172512
wojcioo
Temat założony przez niniejszego użytkownika
» 2018-09-30 00:13:50
Dlatego działający kod (nie mówię że właściwy) wygląda u mnie tak:
  
C/C++
do
{
   
    cin.clear();
    cin.ignore();
    cin >> wiek;
    if( cin.fail() == true )
         cout << "Blad! Podaj wiek jeszcze raz:  " << endl;
   
} while( cin.fail() == true );

Tylko rozważam co Pefkos miał na myśli we wcześniejszym poście i jakoś nie mogę tego wykonać.
P-172513
YooSy
» 2018-09-30 00:20:28
Tutaj
std::cin.ignore()
 oczekuje na jakieś dane do usuniecia, gdy bufor strumienia jest pusty.

C/C++
int n;
while( !( std::cin >> n ) ) {
    std::cin.clear();
    std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
}

ew:
C/C++
do
{
    if( cin.fail() ) {
        cin.clear();
        cin.ignore();
        cout << "Blad! Podaj wiek jeszcze raz:  " << endl;
    }
    cin >> wiek;
} while( cin.fail() == true );
P-172514
« 1 » 2
  Strona 1 z 2 Następna strona