Rozdział 21 - pytanie
Ostatnio zmodyfikowano 2015-08-09 00:41
Witicar Temat założony przez niniejszego użytkownika |
Rozdział 21 - pytanie » 2015-08-08 22:34:26 W trakcie rozdziału 21 podjąłem się napisania samemu programu do losowania liczb pseudolosowych bez powtórzeń. Moje pytanie brzmi -"Czy opisana na kodzie niemozliwosc uzycia inkrementacji k (k++) zwiazania jest z jakims np wielokrotnym przypisaniem oraz jezeli tak to czy da sie odseparowac zmienne od siebie gdybym sie uparł napisania (przed i++ lub po nim) k++." #include <iostream> #include <cstdlib> #include <ctime> using namespace std; void losuj( int tablica[], int ile, int start, int stop ) { int i = 1, k = 1; tablica[ 0 ] = rand() %( stop - start + 1 ) + start; do { tablica[ i ] = rand() %( stop - start + 1 ) + start; do { if( tablica[ i ] != tablica[ i - k ] ) --k; else { tablica[ i ] = rand() %( stop - start + 1 ) + start; k = i; } } while( k != 0 ); i++; } while( i < ile ); } void wypisz( int tablica[], int ile ) { int i = 0; do { cout << tablica[ i ] << endl; i++; } while( i < ile ); } int main() { srand(( unsigned int ) time( NULL ) ); int losowanie[ 5 ]; losuj( losowanie, 5, 1, 10 ); wypisz( losowanie, 5 ); system( "pause" ); return 0;
Chyba już wiem czemu przy zapisie k++ miałem cały czas k=1 w zewnętrznej pętli, ponieważ moja wewnetrzna petla dozyla do k=0. Teraz tylko nie wiem dlaczego samo i++ powoduje zmiane k do stanu k=i. Być może też ma to związek z podwójną pętlą i warunkiem w else, ale prosiłbym o wyjaśnienie :). |
|
bombatom69 |
» 2015-08-09 00:04:05 1. k ma na starcie ma wartość niezależną od ilości wylosowanych liczb. 2. nie sprawdzasz komórek [i-k] tylko po prostu k. k powinno być na starcie i-1
|
|
Witicar Temat założony przez niniejszego użytkownika |
» 2015-08-09 00:41:36 Wiem, że ten program wygląda dziwnie, ale działa poprawnie (sprawdzane wielokrotnie), mniej wiecej z takim zamierzeniem 1.Poniewaz tablica jest pusta to losuje pierwszy jej element czyli tablica[0] 2.Losuje drugi element i porownuje z pierwszym ( dla i=1 i k=1) czyli tablica[1] z tablica[1-1=0]) 3. Jeśli nie sa rowne to zmniejsza k, w pierwszym przypadku do zera co konczy petle, w przeciwnym wraca do pozycji startowej k=i=1. 4. Wykonuje sie dopoki k nie obnizy sie do 0 a co za tym idzie w if nie napotka nigdzie rownosci wartosci tablic. 5 Powtarza wykonywane czynnosci dla k=i=2, k=i=3 itd. 6. Konczy program gdy i > ile czyli u mnie w tym wypadku ilosci losowanych liczb ( rozmiar tablicy dopasowalem by sie rownal tej ilosci za pomoca argumentow)
Ale juz chyba odkrylem czemu samo i++ dziala, gdy dojdzie do przypadku while k=0, spowoduje to w kolejnym obiegu petli zmiane i o jeden, ale dalej k=0, wtedy wykona else, gdyż przy if porownam identyczne tablice (zawsze tablica[i.]==tablica[i-k] dla k=0), w else dokona nowego losowania tablicy[i.] (czyli wykona ja przed petla wewnetrzna i powtornie w niej) i przyrowna i=k co za tym idzie takze zwiekszy k o k=k+1. Hmm, musze troche zmodyfikowac ten program, ale dziekuje za checi, temat chyba do zamkniecia :). |
|
« 1 » |