[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 » |