bojo240 Temat założony przez niniejszego użytkownika |
zakończenie wczytywania napisów następuje po wprowadzeniu łańcucha "pustego". » 2015-12-13 23:15:42 Witam. Jak wyżej, w jaki sposób to wymóc? Teoretycznie cin.get by pasowało, ale jako że pracuje na zmiennych typu int, a nie char, jest z tym trochę problem... |
|
carlosmay |
» 2015-12-13 23:27:46 Do zmiennej liczbowej ( nie łańcuchowej ) musisz wprowadzić wartość. W takiej zmiennej zawsze jest jakaś wartość (nawet śmieciowa, ale wartość).
Wyjściem jest wczytywanie liczb do 'stringa' i konwersja na 'int'. Wczytanie pustego = koniec działań.
|
|
bojo240 Temat założony przez niniejszego użytkownika |
» 2015-12-13 23:54:19 hmm. może przytoczę dokładnie kod: int n = 0, a = 2, b, i = 40, dzien[ i ], miesiac[ i ], rok[ i ], czas[ i ]; string strdzien[ i ], strmiesiac[ i ], strrok[ i ]; for( n = 0, i = 0; i < 40; i++, n++ ) { cout << "[" << i << "]" << "Wprowadz nr dnia miesiaca:"; cin >> dzien[ i ]; b = cin.fail(); if( b != 0 || dzien[ i ] < 1 || dzien[ i ] > 31 ) do { cin.clear(); cin.sync(); cout << "Wprowadzono zle dane! Wprowadz poprawnie dzien miesiaca:"; cin >> dzien[ i ]; b = cin.fail(); } while( b != 0 || dzien[ i ] < 1 || dzien[ i ] > 31 );
jak mam nadzieję widać, chciałbym również zabezpieczyć przed możliwością wprowadzania czegokolwiek co nie jest int oraz w tym wypadku z przedzialu 0-31, a jak wiadomo znaki puste integerami nie sa i tu mam troche problem; wczytujac stringa nie zadziała mi cin.fail, a wymaga się, aby daty zaprzestały być wczytywane przy wprowadzeniu znaku pustego... |
|
carlosmay |
» 2015-12-14 00:00:55 chciałbym również zabezpieczyć przed możliwością wprowadzania czegokolwiek co nie jest int |
Napisz funkcję, która będzie zwracać tylko prawidłowe dane (jakie oczekujesz). |
|
bojo240 Temat założony przez niniejszego użytkownika |
» 2015-12-14 00:08:46 Mógłbyś doprecyzować? W sensie upchnąć sprawdzanie cin.fail z całą otoczką w funkcję? Co miałoby mi to dać? Tzn, nie widze w tym rozwiązania dla tego całego znaku pustego, czyli spacji, ew entera. |
|
bojo240 Temat założony przez niniejszego użytkownika |
» 2015-12-14 00:20:02 hmm. Najwyraźniej nie znalem poprawnego użycia cin.fail, jak widać działa to nawet po konwersji. Jednakże, teraz naszedł mnie nowy problem; for( n = 0, i = 0; i < 40; i++, n++ ) { cout << "[" << i << "]" << "Wprowadz nr dnia miesiaca:"; cin >> sdzien[ i ]; if( sdzien[ i ] == "" ) break; ...
Jak string czyta spacje lub enter? :D |
|
carlosmay |
» 2015-12-14 00:27:27 Jak sdzien to zmienna 'string' to "" string pusty po użyciu entera, a " " spacja. Zawsze możesz porównać 'sdzien' z kodem ASCII danego znaku. |
|
bojo240 Temat założony przez niniejszego użytkownika |
» 2015-12-14 00:55:22 W tym problem, że przynajmniej w moim kompilatorze nie za bardzo, jeżeli chcesz to prosze cały kod: #include <iostream> #include <sstream> #include <string> #include <cstring> #include <cstdio> using namespace std; int main() { int n = 0, a = 2, b, i = 40, dzien[ i ], miesiac[ i ], rok[ i ], czas[ i ]; string sdzien[ i ]; for( n = 0, i = 0; i < 40; i++, n++ ) { cout << "[" << i << "]" << "Wprowadz nr dnia miesiaca:"; cin >> sdzien[ i ]; if( sdzien[ 0 ] == "" ) break; istringstream iss( sdzien[ i ] ); iss >> dzien[ i ]; b = cin.fail(); if( b != 0 || dzien[ i ] < 1 || dzien[ i ] > 31 ) do { cin.clear(); cin.sync(); cout << "Wprowadzono zle dane! Wprowadz poprawnie dzien miesiaca:"; cin >> dzien[ i ]; b = cin.fail(); } while( b != 0 || dzien[ i ] < 1 || dzien[ i ] > 31 ); cout << "[" << i << "]" << "Wprowadz nr miesiaca:"; cin >> miesiac[ i ]; b = cin.fail(); if( b != 0 || miesiac[ i ] < 1 || miesiac[ i ] > 13 ) do { cin.clear(); cin.sync(); cout << "Wprowadzono zle dane! Wprowadz poprawnie miesiac:"; cin >> miesiac[ i ]; b = cin.fail(); } while( b != 0 || miesiac[ i ] < 1 || miesiac[ i ] > 13 ); cout << "[" << i << "]" << "Wprowadz nr roku:"; cin >> rok[ i ]; b = cin.fail(); if( b != 0 || rok[ i ] < 1 ) do { cin.clear(); cin.sync(); cout << "Wprowadzono zle dane! Wprowadz poprawnie rok:"; cin >> rok[ i ]; b = cin.fail(); } while( b != 0 || rok[ i ] < 1 ); czas[ i ] =( dzien[ i ] ) +( 30 * miesiac[ i ] ) +( 365 * rok[ i ] ); } stop: for( i = 0; i < n; i++ ) for( int j = 0; j < n - 1 - i; j++ ) if( czas[ j ] > czas[ j + 1 ] ) { swap( czas[ j ], czas[ j + 1 ] ); swap( dzien[ j ], dzien[ j + 1 ] ); swap( miesiac[ j ], miesiac[ j + 1 ] ); swap( rok[ j ], rok[ j + 1 ] ); }; for( i = 0; i < n; i++ ) cout << dzien[ i ] << "-" << miesiac[ i ] << "-" << rok[ i ] << endl; return 0; }
Przynajmniej u mnie przy użyciu "" lub " " break nie działa, a przy użyciu '13' lub '32' wywala pierdylion błędów w build logu.. :C |
|
« 1 » 2 3 |