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

[Kurs C++] Poziom 3, Lekcja 26

Ostatnio zmodyfikowano 2017-02-03 21:35
Autor Wiadomość
kicuch
Temat założony przez niniejszego użytkownika
[Kurs C++] Poziom 3, Lekcja 26
» 2016-12-14 12:23:22
Czesc,
Czy mógłbym prosić o pomoc, co jest nie tak z programem?
Znaczy, wpisuje dane i za każdym razem ucina mi pierwsza litere lub cyfre :(

C/C++
#include <iostream>
#include<string>
using namespace std;

void sprawdz( int & wiek )
{
    do
    {
        cin.clear();
        cin.ignore();
        cin >> wiek;
    }
    while( cin.fail() == 1 );
   
}

void wczytajOsobe( string & iimie, string & nnazwisko, int & wwiek )
{
    cout << "Podaj imie: " << endl;
    //cin.clear();
    //cin.ignore();
    //getline (cin, iimie);
    cin >> iimie;
    cout << "Podaj nazwisko: " << endl;
    //cin.clear();
    //cin.ignore();
    //getline (cin, nnazwisko);
    cin >> nnazwisko;
    cout << "Podaj wiek: " << endl;
    sprawdz( wwiek );
}
void wypiszOsobe( string imie_w, string nazwisko_w, int wiek_w )
{
    cout << "--------------------------------------------" << endl;
    cout << "Imie: " << imie_w << endl;
    cout << "Nazwisko: " << nazwisko_w << endl;
    cout << "Wiek: " << wiek_w << endl;
    cout << "--------------------------------------------" << endl;
   
}
int main()
{
    std::string imie[ 2 ];
    std::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-154901
carlosmay
» 2016-12-14 13:19:59
cin.ignore();
Tak działa ta funkcja.

std::istream::ignore
P-154902
kicuch
Temat założony przez niniejszego użytkownika
» 2016-12-14 13:33:28
Ok ;)

Jeśli usunę linie z cin.ignore();, to przy uruchomieniu programu i wpisywaniu danych, pominie wpisywanie imienia przy drugiej osobie. Czemu tak się dzieje?
P-154903
carlosmay
» 2016-12-14 16:17:55
C/C++
#include <iostream>
#include<string>
#include <limits>
using namespace std;

void wczytajOsobe( string & iimie, string & nnazwisko, int & wwiek )
{
    cout << "Podaj imie: " << endl;
    getline( cin, iimie );
    cout << "Podaj nazwisko: " << endl;
    getline( cin, nnazwisko );
    cout << "Podaj wiek: " << endl;
    while( !( cin >> wwiek ) ) {
        cin.clear();
        cin.ignore( numeric_limits < streamsize >::max(), '\n' );
    }
    cin.ignore( numeric_limits < streamsize >::max(), '\n' );
}
void wypiszOsobe( string imie_w, string nazwisko_w, int wiek_w )
{
    cout << "--------------------------------------------" << endl;
    cout << "Imie: " << imie_w << endl;
    cout << "Nazwisko: " << nazwisko_w << endl;
    cout << "Wiek: " << wiek_w << endl;
    cout << "--------------------------------------------" << endl;
   
}
int main()
{
    std::string imie[ 2 ];
    std::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;
}
Funkcja
sprawdz
 tak naprawdę pobierała dane od użytkownika,
więc jej nazwa była niewłaściwa. Poza tym funkcje pobierające dane z reguły
zwracają tą wartość.

Metoda
ignore()
 była wywoływana w niewłaściwym miejscu.
Warto zapamiętać: operator
>>
 wczytując dane pozostawia znak nowej linii
'\n'
w buforze strumienia, na który reaguje funkcja
std::getline();
 i kończy działanie z pustym stringiem.
Trzeba o tym pamiętać mieszając wczytywanie operatorem
>>
 i funkcją
std::getline();
.
P-154910
bobby.hl
» 2017-02-01 22:46:16
czy w mojej funkcji
bool ok
 mogę zastąpić
cin
 funkcją
getline
?
Z góry dzięki za odpowiedź!
poniżej kod

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

using namespace std;

bool ok( int & liczba )
{
    do
    {
        cin.clear();
        cin.sync();
        cin >> liczba;
        if( liczba == 0 )
             cout << "Podaj poprawna wartosc!" << endl;
       
    } while( liczba == 0 );
   
    return cin.good();
}

void wczytajOsobe( string & Imie, string & Nazwisko, int & Wiek )
{
    cout << "Podaj imie" << endl;
    cin.sync();
    getline( cin, Imie );
    cout << "Podaj naziwsko" << endl;
    getline( cin, Nazwisko );
    cout << "Podaj wiek" << endl;
    ok( Wiek );
}


void wypiszOsobe( string Imie, string Nazwisko, int Wiek )
{
    cout << "Imie: " << Imie << endl;
    cout << "Naziwksko: " << Nazwisko << endl;
    cout << "Wiek osoby: " << 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-157215
karambaHZP
» 2017-02-02 00:18:53
czy w mojej funkcji
bool ok
 mogę zastąpić
cin
 funkcją
getline
?
Możesz.
Pytanie tylko w jakim celu chcesz utrudniać sobie życie?

P-157216
bobby.hl
» 2017-02-02 20:18:17
utrudniać nie chcę, ale chciałbym wiedzieć jak można to zrobić bo zwykłe zastąpienie
C/C++
cin.clear();
cin.sync();
cin >> liczba;

funkcją
getline( cin, liczba );
 niestety nie działa. Karamba jak wywołać getline żeby zastąpiło to co mam?
P-157246
carlosmay
» 2017-02-02 20:46:59
Wczytaj do stringa (do tego służy getline) i później konwertuj na.żądany typ liczbowy. Nie wiem czy jest sens takiej pracy.
Napisz co chcesz osiągnąć i dlaczego chcesz takiej zmiany.
P-157249
« 1 » 2
  Strona 1 z 2 Następna strona