[Rozdział 21] Zadanie domowe.
Ostatnio zmodyfikowano 2017-05-17 03:48
DieG Temat założony przez niniejszego użytkownika |
[Rozdział 21] Zadanie domowe. » 2017-05-16 19:23:51 Witam. Na celowniku funkcja wylosujNZmiennych(). Ot, wczoraj jeszcze działała - dzisiaj już nie. Dzisiejsze zmiany w kodzie skomentowane, żeby program je ignorował. Moje starcie z tą funkcją trwa już od dobrych 3 dni. :D Już sam nie wiem gdzie szukać błędu. #include <iostream> #include <cstdlib> #include <ctime>
using namespace std;
bool input( bool sprLiczba ) { if( sprLiczba == true ) return true; cout << endl << "Wprowadzona wartosc nie jest liczba!" << endl; return false; }
void wylosujNZmiennych( int T_in[], int T_out[], int sT_in, int sT_out ) { int ile; int random_in; int i; int duplikat; int maxprob; maxprob =( 4 * sT_in ); ile = 0; do { random_in =( rand() % sT_in ); if( ile == 0 ) { T_out[ ile ] = T_in[ random_in ]; ile++; } if( ile > 0 ) { i = 0; do { duplikat = 0; if( T_out[ i ] != T_in[ random_in ] ) { i++; } else { duplikat++; if( duplikat >=( maxprob ) ) { i++; } } } while( i < sT_out ); if( duplikat <( maxprob ) ) { T_out[ ile ] = T_in[ random_in ]; } ile++; } } while( ile < sT_out ); }
int main() { srand( time( 0 ) ); int wprowadzone[ 3 ]; int wybrane[ 2 ]; int sWprowadzone = 3; int sWybrane = 2; int liczba; int numerLiczby = 0; bool sprLiczba; cout << "Podaj 3 liczby:" << endl; do { cin >> liczba; sprLiczba = cin.good(); cin.clear(); cin.sync(); if( input( sprLiczba ) == true ) { wprowadzone[ numerLiczby ] = liczba; numerLiczby++; } } while( numerLiczby < sWprowadzone ); wylosujNZmiennych( wprowadzone, wybrane, sWprowadzone, sWybrane ); cout << "Wypisuje " << sWybrane << " liczb (pomijam duplikaty)." << endl; int wypisano; wypisano = 0; return 0; }
|
|
karambaHZP |
» 2017-05-16 19:57:38 bool input( bool sprLiczba ) { if( sprLiczba == true ) return true; cout << endl << "Wprowadzona wartosc nie jest liczba!" << endl; return false; } |
O co w tym chodzi? Jedyne co robi ta funkcja, to wypisanie komunikatu lub nie. Nazwa sugeruje inne przeznaczenie, a jej faktyczne przeznaczenie jest mocno naciągane. Nazywaj zmienne i funkcje tak aby nie trzeba było pisać do nich legendy. Opisz dokładnie, czym ma się zajmować funkcja wylosujNZmiennych , bo wydaje mi się, że masz tam napchane za dużo logiki. Wskazówka: zastanów się jakie czynności (zadania) potrzebne są do osiągnięcia celu. 1. Potrzebna jest tablica na wprowadzone liczby. 2. Druga tablica na wylosowane liczby bądź indeksy. 3. Funkcja losująca liczbę z zadanego przedziału. 4. Funkcja sprawdzająca, czy aktualnie wylosowana liczba jest już w tablicy wylosowanych liczb. 5. Funkcja wypisująca zawartość tablicy. 6. Funkcja pobierająca od użytkownika liczbę i zwracająca tą wartość (jeśli poprawna). 7. W main pozostawiamy tylko prostą logikę. |
|
DieG Temat założony przez niniejszego użytkownika |
» 2017-05-16 22:18:15 No cóż, przekombinowałem. Nauczka na przyszłość. Zasiadłem do tego po raz kolejny i udało się. #include <iostream> #include <cstdlib> #include <ctime>
using namespace std;
int wylosuj() { return rand() % 3; }
bool sprawdzCzyByla( int t[], int liczba, int rozmiar ) { int i; int powtorka; i = 0; powtorka = 0; do { if( liczba == t[ i ] ) { powtorka++; } i++; } while( i < rozmiar ); if( powtorka > 0 ) { return true; } return false; }
int liczba; bool spr; int ile;
int wprowadzone[ 3 ]; int rozmiar_wprowadzone = 3;
int wypisane[ 2 ]; int rozmiar_wypisane = 2;
int los;
int main() { srand( time( 0 ) ); cout << "Wprowadz 3 liczby." << endl; ile = 0; do { cin >> liczba; spr = cin.good(); cin.clear(); cin.sync(); if( spr && !sprawdzCzyByla( wprowadzone, liczba, rozmiar_wprowadzone ) ) { wprowadzone[ ile ] = liczba; ile++; } else cout << "Wprowadzona wartosc nie jest liczba lub wprowadziles druga taka sama liczbe!" << endl << "Sprobuj jeszcze raz." << endl; } while( ile < 3 ); cout << "Wprowadzono nastepujace liczby:" << endl; ile = 0; do { cout << wprowadzone[ ile ] << endl << endl; ile++; } while( ile < 3 ); ile = 0; do { los = wprowadzone[ wylosuj() ]; if( ile == 0 ) { wypisane[ ile ] = los; ile++; } if( ile > 0 ) { if( sprawdzCzyByla( wypisane, los, rozmiar_wypisane ) == false ) { wypisane[ ile ] = los; ile++; } } } while( ile < 2 ); cout << "Wypisuje 2 z 3 podanych liczb." << endl; ile = 0; do { cout << wypisane[ ile ] << endl; ile++; } while( ile < 2 ); return 0; }
|
|
Rashmistrz |
» 2017-05-17 03:48:25 Gdzie był ten szczególny błąd? |
|
« 1 » |