lekcja 21 losowanie bez powtórzeń
Ostatnio zmodyfikowano 2014-03-12 20:43
poprawka Temat założony przez niniejszego użytkownika |
» 2014-03-09 22:10:37 #include <iostream> #include <ctime> #include <cstdlib> using namespace std; int wypiszLiczby( int t[] ) { int a; bool sukces; int i = 0; for( i; i != 3; i++ ) { cout << "Podaj liczbe: "; cin.clear(); cin.sync(); cin >> a; sukces = cin.good(); t[ i ] = a; } } int zapiszDoTablicy( int t[], int iRozmiar ) { int i = 0; do { cout << "Podane przez Ciebie liczby i zapisane do tablicy to: " << t[ i ] << endl; i++; } while( i < iRozmiar ); } int dodaj( int t[] ) { int suma = 0; int i = 0; do { suma = t[ i ] + suma; i++; } while( i != 3 ); cout << "Wynik dodawania liczb to: " << suma << endl; }
int sprawdzCzyWylosowana( int t[] ) { int i = t[ rand() % 3 ]; int j = i; while( j == i ) j = t[ rand() % 3 ]; cout << "Wylosowane liczby do nowej tablicy to: " << i << endl; cout << "Wylosowane liczby do nowej tablicy to: " << j << endl; }
int main() { srand( time( NULL ) ); int tablica[ 3 ]; wypiszLiczby( tablica ); zapiszDoTablicy( tablica, 3 ); sprawdzCzyWylosowana( tablica ); dodaj( tablica ); return main(); }
Działa. Ale nie jestem zadowolony z tego kodu. Niby wszystko działa dobrze i wszystko zrobione w funkcjach. Czyli tak jak w zadaniu 1 z Pracy domowej, ale nie jest tak jak chciałem. LEON nie musiałem dawać drugiej tablicy do maina, bo była ona bezużyteczna w funkcji losująco sprawdzajacej bez powtórzeń... Wystarczyło tylko wysłać już uzupełniona tablice do funkcji losująco sprawdzajacej i działa ok. Co do funkcji losująco-sprawdzajacej: int sprawdzCzyWylosowana( int t[] ) { int i = t[ rand() % 3 ]; int j = i; while( j == i ) j = t[ rand() % 3 ]; cout << "Wylosowane liczby do nowej tablicy to: " << i << endl; cout << "Wylosowane liczby do nowej tablicy to: " << j << endl; }
To jest ona dobra tylko do dwóch liczb. Dlatego nie jestem zadowolony. Taką funkcję szczerze miałem na początku kiedy siadłem do tego zadania i z niej zrezygnowałem. Teraz jesli chciałbym ją wykorzystać do "n" liczb to dużo roboty i musiałbym się sporo nagłowić żeby taki sposób zastosować. Dlatego tyle pytan z mojej strony jak dobrze podejść do takiej funkcji... Sposobu nadal nie znam. |
|
poprawka Temat założony przez niniejszego użytkownika |
» 2014-03-10 22:06:28 int sprawdzCzyWylosowana( int t[] ) { int nt[ 2 ]; int licznik = 0; int i; do { if( licznik < 1 ) { i = t[ rand() % 3 ]; nt[ licznik ] = i; } i = t[ rand() % 3 ]; if( licznik >= 1 && nt[ licznik ] == licznik ) { i = t[ rand() % 3 ]; } else if( nt[ licznik ] != licznik ) nt[ licznik ] = i; licznik++; } while( nt[ licznik ] != 2 ); for( licznik = 0; licznik != 2; licznik++ ) cout << "Wylosowane liczby do nowej tablicy to: " << nt[ licznik ] << endl; }
próbuję rozwiązać teraz drugie zadanie z większą ilością liczb w tablicy. Napisałem taką funkcję, która może być zastosowana nie tylko do dwóch liczb (lecz próby są przeprowadzane na takiej liczbie). Oczywiście jeszcze w tej funkcji jest coś nie tak... Ponieważ losują się dwie liczby do nowej tablicy ale moje instrukcje sterujące są najprawdopodobniej z błędem gdyż występują powtórzenia. Jak zwykle będę wdzięczny za jakieś wskazówki... dzięki. Cały kod programu do ewentualnego przetestowania. #include <iostream> #include <ctime> #include <cstdlib> using namespace std; int wypiszLiczby( int t[] ) { int a; bool sukces; int i = 0; for( i; i != 3; i++ ) { cout << "Podaj liczbe: "; cin.clear(); cin.sync(); cin >> a; sukces = cin.good(); t[ i ] = a; } } int zapiszDoTablicy( int t[], int iRozmiar ) { int i = 0; do { cout << "Podane przez Ciebie liczby i zapisane do tablicy to: " << t[ i ] << endl; i++; } while( i < iRozmiar ); } int dodaj( int t[] ) { int suma = 0; int i = 0; do { suma = t[ i ] + suma; i++; } while( i != 3 ); cout << "Wynik dodawania liczb to: " << suma << endl; }
int sprawdzCzyWylosowana( int t[] ) { int nt[ 2 ]; int licznik = 0; int i; do { if( licznik < 1 ) { i = t[ rand() % 3 ]; nt[ licznik ] = i; } i = t[ rand() % 3 ]; if( licznik >= 1 && nt[ licznik ] == licznik ) { i = t[ rand() % 3 ]; } else if( nt[ licznik ] != licznik ) nt[ licznik ] = i; licznik++; } while( nt[ licznik ] != 2 ); for( licznik = 0; licznik != 2; licznik++ ) cout << "Wylosowane liczby do nowej tablicy to: " << nt[ licznik ] << endl; }
int main() { srand( time( NULL ) ); int tablica[ 3 ]; wypiszLiczby( tablica ); zapiszDoTablicy( tablica, 3 ); sprawdzCzyWylosowana( tablica ); dodaj( tablica ); return main(); }
|
|
pixon |
Problem » 2014-03-11 22:45:46 Również mam problem. Dopiero zaczynam moją przygodę z C++ i w ten sposób napisałem program losujący bez powtórzeń 2 liczby z trzech podanych:
#include <iostream> #include <cstdlib> #include <ctime>
using namespace std; int losEngine(int a, int b, int c) { srand( time( NULL)); int wynik = (rand() % 3) + 1; switch (wynik) { case 1: return a; case 2: return b; case 3: return c; } }
int main() { int q; int w; int e; cout << "podaj 3 liczby: " << endl; cin >> q; cin >> w; cin >> e; int k[2]; int p = 0; int m = 0; do { if(p = 2) { m = 1; p = 1; } k[m] = losEngine(q,w,e); t++; p++;
} while (p != 2 && k[0] != k[1]);
cout << k[0] << ", " << k[1];
return 0; }
I problem pojawia się, gdyż (nie mam pojęcia dlaczego) drugą liczbę losuje poprawnie, a pierwszą zawsze jest 2686672. Proszę o pomoc i wytłumaczenie dlaczego tak się dzieje.
|
|
poprawka Temat założony przez niniejszego użytkownika |
» 2014-03-11 23:28:40 int losujtablice( int t[], int nt[] ) { int i; int tlicznik = 0; int licznik = 0; do { i = t[ rand() % 10 ]; do { while( nt[ licznik ] == i ) { i = t[ rand() % 10 ]; licznik = - 1; } licznik++; } while( licznik != 8 ); nt[ tlicznik ] = i; tlicznik++; } while( tlicznik != 8 ); for( licznik = 0; licznik != 8; licznik++ ) cout << nt[ licznik ] << endl; }
W końcu sobie poradziłem... Niestety nie sam, a z małą pomocą. Dobrze myślałem tworząc moje instrukcje i pętle. Lecz nie wiedziałem że trzeba użyć dwóch LICZNIKÓW do tablicy ;/ Wiadomo było że z jednej tablicy losujemy i zapisujemy do nowej. Lecz nie wpadłem na pomysł, z utowrzenim dwóch liczników i jedne wykorzystać do powtarzających się liczb a drugi do zapisywania tych różnych od siebie... DLACZEGO DRUGI LICZNIK jest ? I dlaczego sa na nim zapisywane liczby ? przecież wywołuje tablice z innym licznikiem... (jak wywołam z tym 'tlicznik' to źle działa... Proszę o pomoc. Jeśli ktoś ma sekundę i może mi napisać czy wszystkie komentarze do ww. funkcji dobrze opisałem i co za tym idzie czy DOBRZE ROZUMIEM. Możecie mi również wyjaśnić dlaczego Albo potwierdzić lub zaprzeczyć. Kiedy wylosowana liczba jest porównywana z liczbami w tablicy, następnie kiedy jest taka sama jak te w tablicy to zapis licznik= -1 oznacza kasowanie jej ? I kolejna pętla robi to samo porównuje a potem kasuje aż do skutku ? Dla osób które chcą przetestować działanie. Cały program: #include <iostream> #include <ctime> #include <cstdlib> using namespace std; int wypiszLiczby( int t[] ) { int a; bool sukces; int i = 0; for( i; i != 10; i++ ) { cout << "Podaj liczbe: "; cin.clear(); cin.sync(); cin >> a; sukces = cin.good(); t[ i ] = a; } } int zapiszDoTablicy( int t[], int iRozmiar ) { int i = 0; do { cout << "Podane przez Ciebie liczby i zapisane do tablicy to: " << t[ i ] << endl; i++; } while( i < iRozmiar ); } int dodaj( int t[] ) { int suma = 0; int i = 0; do { suma = t[ i ] + suma; i++; } while( i != 10 ); cout << "Wynik dodawania liczb to: " << suma << endl; }
int losujtablice( int t[], int nt[] ) { int i; int tlicznik = 0; int licznik = 0; do { i = t[ rand() % 10 ]; do { while( nt[ licznik ] == i ) { i = t[ rand() % 10 ]; licznik = - 1; } licznik++; } while( licznik != 8 ); nt[ tlicznik ] = i; tlicznik++; } while( tlicznik != 8 ); licznik = 0; for( licznik; licznik != 8; licznik++ ) cout << nt[ licznik ] << endl; } int main() { srand( time( NULL ) ); int tablica[ 10 ]; int nt[ 8 ]; wypiszLiczby( tablica ); zapiszDoTablicy( tablica, 10 ); losujtablice( tablica, nt ); dodaj( tablica ); return main(); }
[/code][/code] |
|
poprawka Temat założony przez niniejszego użytkownika |
» 2014-03-12 20:43:10
Leon możesz mi pomóc ? :) Jeśli tylko masz chwile i możesz odpowiedzieć na moje pytania. dzięki
|
|
1 « 2 » |