maciaas87 Temat założony przez niniejszego użytkownika |
[Lekcja 21] Zadanie nr 1 » 2015-11-06 23:29:03 Witam, Mój kod poniżej. Problem polega na tym, że co któreś losowanie losuję mi liczbę, która nie została wpisana przez użytkownika do tablicy. Liczba wygląda jak jakieś śmieci z pamięci (np. liczba -83399.. na VisualStudio... albo liczba 2752912 na Code::Blocks). Poza tym mam problem z zabezpieczeniem programu przed wpisaniem litery. Za każdą literę jest podstawiana liczba "0" (nie było to wymagane w zadaniu, ale strasznie mnie irytuje to że nie mogę dojść do rozwiązania problemu.) P.S. Proszę nie zwracać uwagi, że wprowadzenie danych nie jest przy użyciu funkcji. Zostanie to poprawione po wyeliminowaniu w/w błędów. #include <iostream> #include <cstdlib> #include <ctime>
using namespace std;
int wylosuj( int tab[] )
{ int losowana = rand() % 3; return tab[ losowana ]; }
bool prawdy( int wylosuj, int tab2[], int ile ) { if( ile <= 0 ) return 0; int i = 0; do { if( tab2[ i ] == wylosuj ) return true; i++; } while( i < ile ); return false; }
int main()
{ srand( time( NULL ) ); int tab[ 3 ]; int tab2[ 2 ]; int wylosowanych = 0; cout << " Podaj 3 liczby: " << endl; int i = 0; do { cin >> tab[ i ]; cin.clear(); cin.sync(); i++; } while( i < 3 ); if( cin.good() && tab[ 0 ] != tab[ 1 ] && tab[ 0 ] != tab[ 2 ] && tab[ 1 ] != tab[ 2 ] ) { std::cout << "Podales nastepujace liczby: "; i = 0; do { std::cout << tab[ i ] << ", "; i++; } while( i < 3 ); do { int liczba = wylosuj( tab ); if( prawdy( liczba, tab2, wylosowanych ) == false ) tab2[ wylosowanych ] = liczba; wylosowanych++; } while( wylosowanych < 2 ); cout << endl; cout << "Wylosowane liczby to: " << endl; i = 0; do { cout << tab2[ i ] << endl; i++; } while( i < 2 ); } else { cout << "Wprowadziles kilka razy ta sama liczbe. Urucham program jeszcze raz."; } return 0; }
|
|
carlosmay |
» 2015-11-07 00:05:58 do
{ int liczba = wylosuj( tab ); if( prawdy( liczba, tab2, wylosowanych ) == false ) tab2[ wylosowanych ] = liczba; wylosowanych++; } while( wylosowanych < 2 );
w tej pętli jest problem. Inkrementujesz nawet gdy liczba nie jest zapisana do tablicy. |
|
maciaas87 Temat założony przez niniejszego użytkownika |
» 2015-11-07 00:29:47 do
{ int liczba = wylosuj( tab ); if( prawdy( liczba, tab2, wylosowanych ) == false ) { tab2[ wylosowanych ] = liczba; wylosowanych++; } } while( wylosowanych < 2 );
Dziękuje bardzo za pomoc - teraz nie ma problemu ze śmieciowymi liczbami... :) Został jednak problem związany z blokadą charów... niestety ten moj "if" z cin.good() nie za bardzo chce działać i dalej działa mimo wpisania litery. Po prostu każdej literze przypisuje liczbę 0. |
|
carlosmay |
» 2015-11-07 00:39:04 int liczba; if( cin >> liczba )
else { cin.clear(); cin.ignore( 999999, '\n' ); }
do tego czyszczenie strumienia |
|
maciaas87 Temat założony przez niniejszego użytkownika |
» 2015-11-07 00:56:46 do { cin >> tab[ i ]; if( cin.fail() ) { cout << "Error - podales litere zamiast liczby" << endl; cin.clear(); cin.sync(); return false; } i++; } while( i < 3 );
Dopisalem cos takiego... nie wiem czy do konca madrze, ale to dziala - wylacza program. Nie rozumiem jednak wczesniejszego komentarza z przypisaniem liczby do czegos... moze dlatego ze juz pozna godzina - czy moglbys podac przyklad ? :) |
|
carlosmay |
» 2015-11-07 01:13:11 Przykład: int tab[ 3 ]; int liczba; if( cin >> liczba ) tab[ 0 ] = liczba; else { cin.clear(); cin.ignore( 999999, '\n' ); }
Taka drobna funkcja do wczytywania podstawowych typów jak int, double czy char razem z przykładem użycia. Jak masz ochotę to możesz to rozkminić. #include <iostream> #include <cstdlib> #include <limits> #include <conio.h> using namespace std;
template < typename T > T GetData( const char * message, const char * errmesg ) { bool ctrlErr = true; T data = 0; do { while(( cout << message ) &&( cin >> data ) && ctrlErr ) { ctrlErr = false; cin.clear(); if( cin.get() != '\n' ) { cout << errmesg; cin.ignore( numeric_limits < streamsize >::max(), '\n' ); ctrlErr = true; continue; } break; } if( !cin ) { ctrlErr = true; cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); } } while( ctrlErr ); return data; }
int main() { const char msg[] = { "Write data: " }; const char errMsg[] = { "Error data. Once again: " }; int n; double d; char ch; n = GetData < int >( msg, errMsg ); cout << n << endl << endl; d = GetData < double >( msg, errMsg ); cout << d << endl << endl; ch = GetData < char >( msg, errMsg ); cout << ch << endl; _getch(); return 0; }
jak widać jedna funkcja obsługuje różne typy zmiennych, ale muszą być określone w tym przypadku (konkretyzacja). |
|
maciaas87 Temat założony przez niniejszego użytkownika |
» 2015-11-07 01:16:20 dzięki za post - ide analizować :) |
|
« 1 » |