poprawka Temat założony przez niniejszego użytkownika |
lekcja 21 losowanie bez powtórzeń » 2014-03-06 21:55:48 Czy mógłby mi ktoś pomóc zrozumieć zadanie przykładowe z losowania bez powtórzeń ? Nie jest to praca domowa tylko gotowy kod z lekcji, którego niestety nie rozumiem do końca. Bez większych problemów tworze tablice i losuje liczby (ale z powtórzeniami) Mam problem ze zrozumieniem funkcji czyBylaWylosowana Proszę o pomoc poprzez dopisani komentarzy lub jak kto juz woli inaczej. Dzięki #include <iostream> #include <cstdlib> #include <ctime>
bool czyBylaWylosowana( int iLiczba, int tab[], int ile ) { if( ile <= 0 ) return false; int i = 0; do { if( tab[ i ] == iLiczba ) return true; i++; } while( i < ile ); return false; }
int wylosuj() { return( rand() % 10 ) + 1; }
int main() { srand( time( 0 ) ); int wylosowane[ 5 ]; int wylosowanych = 0; do { int liczba = wylosuj(); if( czyBylaWylosowana( liczba, wylosowane, wylosowanych ) == false ) / tego te ż nie; / { wylosowane[ wylosowanych ] = liczba; wylosowanych++; } } while( wylosowanych < 5 ); wylosowanych = 0; do { std::cout << wylosowane[ wylosowanych ] << std::endl; wylosowanych++; } while( wylosowanych < 5 ); return 0; }
|
|
leon_w |
» 2014-03-07 08:46:07 #include <iostream> #include <cstdlib> #include <ctime>
bool czyBylaWylosowana( int iLiczba, int tab[], int ile ) { if( ile <= 0 ) return false; int i = 0; do { if( tab[ i ] == iLiczba ) return true; i++; } while( i < ile ); return false; }
int wylosuj() { return( rand() % 10 ) + 1; }
int main() { srand( time( 0 ) ); int wylosowane[ 5 ]; int wylosowanych = 0; do { int liczba = wylosuj(); if( czyBylaWylosowana( liczba, wylosowane, wylosowanych ) == false ) wylosowane[ wylosowanych ] = liczba; wylosowanych++; } } while( wylosowanych < 5 );
wylosowanych = 0; do { std::cout << wylosowane[ wylosowanych ] << std::endl; wylosowanych++; } while( wylosowanych < 5 );
return 0; }
|
|
poprawka Temat założony przez niniejszego użytkownika |
Do zadanie 1 z lekcji 21 » 2014-03-08 11:43:28 Mam pewien problem, którego nie mogę zrozumieć. Opisałem problem w komentarzach... Czy może mi ktos wyjaśnić czemu tak sie dzieje ? #include <iostream> #include <cstdlib> #include <ctime> using namespace std;
void podajliczbe( int tablica[] ) { int i = 0; int a; int sukces; do { do { cout << "Podaj liczbe nr " << i + 1 << " "; cin.clear(); cin.sync(); cin >> a; sukces = cin.good(); } while( sukces != true ); { if( cin.good() == 1 ) tablica[ i ] = a; i++; } } while( i != 10 ); }
int losowanie( int tablica[] ) { return tablica[ rand() % 10 ]; }
int wypisz( int a, int licznik ) { do { cout << a << endl; licznik++; } while( licznik != 2 ); }
int main() { srand( time( 0 ) ); int tablica[ 10 ]; int licznik = 0; podajliczbe( tablica ); int a = losowanie( tablica ); wypisz( a, licznik ); }
[ / cpp ][ / i ] |
|
leon_w |
» 2014-03-08 13:08:34 Nie bardzo rozumiem, czego innego się spodziewasz. Pomyśl trochę logicznie. Wywołujesz funkcję wypisz(), z argumentami: 1.wylosowana liczba 2.licznik. Funkcja wypisz() ma pętlę, która wykonuje się dwa razy (jeżeli licznik = 0), ale ciąglę z tym samym pierwszym argumentem. Wiec choćby pętla wykonywała się i 100 razy, zawsze wypisze tą samą wartość, bo zmienna 'a' się nie zmienia. W drugim przypadku jest dobrze, ponieważ przy każdym obiegu funkcji przypisujesz do zmiennej 'a' to co zwróci funkcja losowanie(). Trochę logicznego myślenia, to nie boli. |
|
poprawka Temat założony przez niniejszego użytkownika |
» 2014-03-09 12:26:28 Dzięki Leon za cenne wskazówki. Kolejny dzień siedzę i powtórnie czytam lekcje z funkcjami i tablicami. Mam pewien problem jak widać w kodzie z stworzeniem funkcji ktora zapobiegnie powtarzaniu. Czy da się zrobić osobną funkcję na sprawdzanie czy została wylosowana liczba w nowej tablicy ? int losowanieDoNowajTablicy( int t[] ) Czy muszę napisać kod który zapobignie powtarzaniu sie w funkcji w której są wylosowane te dwie liczby do nowej tablicy czyli: int losowanieDoNowajTablicy( int t[] ) Nie chce gotowej odpowiedz bo to mija sie z celem. Lecz podpowiedz która naprowadzi mnie na prawidłowe myślenie i podejście do mojego problemu. Postanowiłem podejść do tego po przestudiowaniu od nowa i rozpisać sobie to w funkcjach: #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; } int losowanieDoNowajTablicy( int t[] ) { int nt[ 2 ]; int nt[ 2 ]; int i = 0; for( i; i != 2; i++ ) { nt[ i ] = t[ rand() % 3 ]; cout << "Wylosowane liczby do nowej tablicy to: " << nt[ i ] << endl; } }
}
int main() { srand( time( NULL ) ); int tablica[ 3 ]; wypiszLiczby( tablica ); zapiszDoTablicy( tablica, 3 ); losowanieDoNowajTablicy( tablica );
dodaj( tablica ); }
edycja/ Łatwo jest przepisać coś bezmyślnie i cieszyć się że program działa, lecz jak już się czegoś uczymy to najlepiej od początku do końca rozumieć co się pisze. Dzięki za waszą pomoc. Chodzi mi o to że w programie są funkcje na dwie tablice. Pierwsza tablica to ta z 3 liczbami, a druga to ta z dwoma wylosowanymi z tej pierwszej tablicy. Teraz chciałem aby te liczby losowane nie były powtarzane. I tutaj pytanie jest na początku posta. Najpierw trzeba napisać funkcję na zapobieganie powtarzaniu, a potem dodać ją do funkcji w której tworzona jest druga tablica i losowane do niej liczby ? |
|
leon_w |
» 2014-03-09 16:57:10 Jeszcze sporo błędów masz, co chyba widzisz, bo kod się nie kompiluje. Co do pytania to jakieś nie jasne ono dla mnie jest. Do funkcji sprawdzającej wysyłasz tylko wylosowaną liczbę i tablicę, gdzie ją zapiszesz. Nie wysyłasz do niej tablicy, gdzie masz zapisane liczby, wczytane z klawiatury. Raczej nie możesz tej tablicy utworzyć w funkcji sprawdzającej, ponieważ całej tablicy funkcja nie zwróci. |
|
poprawka Temat założony przez niniejszego użytkownika |
» 2014-03-09 19:51:01 #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; } int losowanieDoNowajTablicy( int t[] ) { int nt[ 2 ]; int i = 0; for( i; i != 2; i++ ) { nt[ i ] = t[ rand() % 3 ]; cout << "Wylosowane liczby do nowej tablicy to: " << nt[ i ] << endl; } }
int sprawdzCzyWylosowana() { int i = rand() % 3; int j = i; while( j == i ) j = rand() % 3; }
int main() { srand( time( NULL ) ); int tablica[ 3 ]; wypiszLiczby( tablica ); zapiszDoTablicy( tablica, 3 ); sprawdzCzyWylosowana(); losowanieDoNowajTablicy( tablica ); dodaj( tablica ); }
eh. Skopiowałem nie ten plik... Tutaj wszystko chodzi. Teraz kolejne godziny próbowałem coś napisać. Napisałem funkcję int sprawdzCzyWylosowana() próbowałem ją jakoś zastosować w funkcji int losowanieDoNowajTablicy( int t[] ) lecz z żadnym skutkiem ;/ Jeśli Leon albo ktoś może mnie naprowadzić jakoś na dobry tok pisania. Próbowałem też nie pisać funkcji int sprawdzCzyWylosowana() Tylko od razu w funkcji int losowanieDoNowajTablicy( int t[] ) próbowałem poprzez pętle do.. while, while, wymuszać ponowne losowania ale też z żadnym skutkiem. |
|
leon_w |
» 2014-03-09 21:15:16 ..... się nadrukowałem i wszystko znikło. Daj drugą tablicę w mainie, i obie wysyłaj do funkcji losująco-sprawdzającej. Jeżeli tylko dwie liczby losujesz, to banał. Losujesz pierwszą, zapisujesz, losujesz drugą i sprawdzasz czy jest różna od pierwszej. No jeżeli więcej liczb to trochę dłubania będzie, ale też się zrobi. |
|
« 1 » 2 |