Robinsoncruzoe Temat założony przez niniejszego użytkownika |
Rozdział 26 zadanie domowe. Prosze o pomoc utknalem. » 2018-04-04 21:46:16 Utknalem w miejscu opisanym komentarzem w kodzie i tak jak juz tam napisalem czuje ze przekabinowalem ale nic nie pomaga. #include <iostream> #include <string> #include <cstdlib>
using namespace std;
bool sprawdzanie( bool sprawdzana ) { if( sprawdzana = false ) return false; else return true; }
void wczytajOsobe( string & tabimie, string & tabnazwisko, int & tabwiek ) { bool pint, pi; do { cin.clear(); cin.sync(); cout << "Imie: " << endl; cin >> tabimie; cin.good(); pint = cin.good(); pi = sprawdzanie( pint ); } while( pi == false ); cout << "Nazwisko: " << endl; cin >> tabnazwisko; cout << "Wiek: " << endl; cin >> tabwiek; }
void wypiszOsobe( string & imie, string & nazwisko, int & wiek ) { cout << "Imie: " << imie << endl; cout << "Nazwisko: " << nazwisko << endl; cout << "Wiek: " << 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; }
|
|
YooSy |
» 2018-04-04 22:19:24 Najczęściej spotykane bugi - Zły operator. Korzystaj z std::cin.ignore() . Opis w Obsługa strumienia wejściowego. void wypiszOsobe( string & imie, string & nazwisko, int & wiek ) |
Tutaj nagłówek funkcji powinien wyglądać tak: void wypiszOsobe( const string & imie, const string & nazwisko, int wiek ) bo ta funkcja ma tylko odczytać dane, więc należy je zabezpieczyć przed nikczemnymi planami użyszkodników. Dodam jeszcze, że powiązane ze sobą dane warto trzymać w jednej spójnej strukturze, np. struct Person { std::string name; std::string surname; int age; }
|
|
Robinsoncruzoe Temat założony przez niniejszego użytkownika |
» 2018-04-05 13:55:42 Pozmienialem wskazane uwagi i troche przerobilem to jeszcze teraz działa dla wieku bo tam jest integer i cin.fail mi wylapuje blad jak wpisze litere ale to też tylko pod warunkiem że nie poprzedza jej cyfra np jezeli zamiast wieku wpisze 12de to zapisze mi ta 12 do wieku dla imienia i nazwiska nie dziala w ogole. Czemu tak sie dzieje? Jak to ugryzc? czy wpisanie liczb do zmiennej string powoduje że pojawia sie tam blad? Jezeli nie to jak zapobiec wpisywaniu liczb do zmiennej string? help #include <iostream> #include <string> #include <cstdlib> #include <limits> using namespace std;
void wczytajOsobe( string & tabimie, string & tabnazwisko, int & tabwiek ) { bool zmienna, zmien; char tekstowa; do { cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << "Podaj swoj wiek: "; cin >> tabwiek; zmienna = cin.fail(); } while( zmienna == true ); do { cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << "Podaj swoje nazwisko: "; cin >> tabnazwisko; zmienna = cin.fail(); } while( zmienna == true ); }
void wypiszOsobe( const string & imie, const string & nazwisko, int wiek ) { cout << "Imie: " << imie << endl; cout << "Nazwisko: " << nazwisko << endl; cout << "Wiek: " << 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; }
|
|
YooSy |
» 2018-04-05 15:22:36 while( !( cin >> tabweik ) ) { cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); } |
|
Robinsoncruzoe Temat założony przez niniejszego użytkownika |
» 2018-04-05 16:35:10 Nie rozumiem przykro mi Yosy. |
|
jankowalski25 |
» 2018-04-05 17:20:48 Wyrażenie cin >> cokolwiek zwraca wartość taką samą, jak wywołanie cin.fail() , którą można niejawnie potraktować jako bool . Tamta pętla po prostu próbuje do skutku wczytywać liczbę pomijając niepoprawne dane. Oczywiście zamiast tabweik powinno być tabwiek. |
|
Robinsoncruzoe Temat założony przez niniejszego użytkownika |
nadal nic » 2018-04-05 18:02:49 Nic to nie zmienia nie wiem czemu. Od poczatku najwiekszy problem mam z tym wylapywaniem bledow. Moze mi ktos wyjasnic czemu to nie dziala i co zrobic zeby dzialalo? :) |
|
jankowalski25 |
» 2018-04-05 18:26:27 Zadbaj o właściwą kolejność wykonywanych działań. Najpierw wczytuj dane, później sprawdzaj, czy się udało, a na końcu czyść stan strumienia i pomijaj błędne dane. A jeśli nadal masz z tym problemy, to spróbuj napisać bez pętli wczytywanie danych tak ze dwa, trzy, cztery razy. A jak to będzie działać, to zobacz, co się powtarza i zrób z tego odpowiednią pętlę. |
|
« 1 » 2 3 |