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

Problem z zadaniem domowym z rozdziału o zmiennych tekstowych.

Ostatnio zmodyfikowano 2015-06-17 17:59
Autor Wiadomość
Yaoo
Temat założony przez niniejszego użytkownika
Problem z zadaniem domowym z rozdziału o zmiennych tekstowych.
» 2015-06-11 21:50:50
C/C++
#include <iostream>
#include <string>
using namespace std;

void wczytajOsobe( string imie, string nazwisko, int wiek )
{
    cout << "Podaj imie: ";
    do
    {
        cin.sync();
        cin.clear();
        cin >> imie;
        cin.fail();
    } while( cin.fail() );
   
    cout << "Podaj nazwisko: ";
    do
    {
        cin.sync();
        cin.clear();
        cin >> nazwisko;
        cin.fail();
    } while( cin.fail() );
   
    cout << "Podaj wiek: ";
    do
    {
        cin.sync();
        cin.clear();
        cin >> wiek;
        cin.fail();
    } while( cin.fail() );
   
}

void wypiszOsobe( string imie, string nazwisko, int wiek )
{
    cout << "Twoje imie to: " << imie << "." << endl;
    cout << "Twoje nazwisko to: " << nazwisko << "." << endl;
    cout << "Twoj wiek to: " << 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;
}

Problem się pojawia, gdy próbuję wpisać złe dane (np. jako imię podaję liczbę). Pętla wówczas nie działa i złe dane zostają przyjęte. Potem jednak, gdy przychodzi do wypisania zmiennych na ekran, pojawia się puste miejsce, taka spacja.
Proszę o pomoc :/
P-133472
Monika90
» 2015-06-11 22:29:55
Problem się pojawia, gdy próbuję wpisać złe dane (np. jako imię podaję liczbę). Pętla wówczas nie działa i złe dane zostają przyjęte
Bo imie to string, do stringa można wczytać dowolny ciąg znaków, więc liczbę, czyli ciąg cyfr, też.

Potem jednak, gdy przychodzi do wypisania zmiennych na ekran, pojawia się puste miejsce, taka spacja.
Parametry funkcji wczytajOsobe powinny być referencjami.
P-133474
Yaoo
Temat założony przez niniejszego użytkownika
» 2015-06-11 23:11:32
Podaj imie: Jan
Podaj nazwisko: Kowalski
Podaj wiek: 30
Podaj imie: Jan2
Podaj nazwisko: Kowalski2
Podaj wiek: 31
Twoje imie to: Kowalski.
Twoje nazwisko to: .
Twoj wiek to: 30.
Twoje imie to: Kowalski2.
Twoje nazwisko to: .
Twoj wiek to: 31.

Process returned 0 (0x0)   execution time : 19.484 s
Press any key to continue.

Nie rozumiem tego, co tu jest źle, że mi się pojawia taki log jak powyżej?

Kod źródłowy to:
C/C++
#include <iostream>
#include <string>
using namespace std;

void wczytajOsobe( string & imie, string & nazwisko, int & wiek )
{
    cout << "Podaj imie: ";
    cin >> imie;
    cout << "Podaj nazwisko: ";
    cin >> imie;
    cout << "Podaj wiek: ";
    do
    {
        cin.clear();
        cin >> wiek;
    } while( cin.fail() );
   
}

void wypiszOsobe( string & imie, string & nazwisko, int & wiek )
{
    cout << "Twoje imie to: " << imie << "." << endl;
    cout << "Twoje nazwisko to: " << nazwisko << "." << endl;
    cout << "Twoj wiek to: " << 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;
}



P-133476
BadBullPL
» 2015-06-12 05:36:31
Dwa razy wczytujesz do struminia zminną imie
P-133480
Szymon2727
» 2015-06-13 20:59:42
C/C++
bool czyDobrze;
do
{
    std::cout << "Podaj wiek";
    std::cin >> wiek;
    czyDobrze = std::cin.good();
    std::cin.clear();
    std::cin.sync();
} while( czyDobrze == false );



Pętla powinna działać i na wyrazach. Sam miałem taki problem, a tutaj wystarczy odpowiednio dać metody clear i sync, a jako warunek nie używać bezpośrednio std::cin.fail/good tylko przypisać jakiejś zmiennej tą wartość i wykonać porównanie na niej.
P-133530
JMII89
» 2015-06-14 22:55:04
Poco przypisywać ? Przecież to działa normalnie :
C/C++
do
{
    std::cout << "Podaj wiek : ";
    std::cin.clear();
    std::cin.sync();
    std::cin >> wiek;
} while( !std::cin.good() );

P-133585
Yaoo
Temat założony przez niniejszego użytkownika
» 2015-06-17 17:59:24
Dzięki za pomoc, problem rozwiązany! :)
P-133696
« 1 »
  Strona 1 z 1