Problem w znalezieniu różnicy między programami (moim i podanym jako rozwiązanie) (Poziom 2 ; losowanie bez powtórzeń)
Ostatnio zmodyfikowano 2013-12-18 13:15
Nazgul Temat założony przez niniejszego użytkownika |
Problem w znalezieniu różnicy między programami (moim i podanym jako rozwiązanie) (Poziom 2 ; losowanie bez powtórzeń) » 2013-12-17 21:46:38 Witam! Łatwo się domyślić (skoro zadaję pytanie dotyczące podstaw C++ :D), że jestem jeszcze w tym zielony. otóż mam problem.. spróbowałem napisać program losujący 5 liczb z zakresu 1-10 tak, żeby wylosowane liczby się nie powtarzały. mój program: #include <iostream> #include <cstdlib> #include <ctime>
bool czybylawylosowana( int ilosczapisanych, int wylosowana, int zbiorzapisanych[] ) { if( ilosczapisanych <= 0 ) { return false; } int d = 0; do { if( wylosowana == zbiorzapisanych[ d ] ) { return true; } d++; } while( d < ilosczapisanych ); return false; }
int wylosowana() { return( rand() % 10 ) + 1; }
int main() { srand( time( 0 ) ); int a; a = 0; int zbior[ 5 ]; do { if( czybylawylosowana( a, wylosowana(), zbior ) == false ) { zbior[ a ] = wylosowana(); std::cout << zbior[ a ] << std::endl; a++; } } while( a < 5 ); return 0; }
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
program autora kursu:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#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; }
z tego co patrzyłem, to koncepcja na mój program jest prawie identyczna do pomysłu autora kursu. Tylko, że mój program nie działa, tzn. losuje liczby, ale z powtórzeniami. Mimo wielu godzin straconych na poszukiwaniach, nie mogę znaleźć przyczyny błędu. Gdyby ktoś mógłby mi pomóc, byłbym bardzo wdzięczny; D Pozdrawiam |
|
pekfos |
» 2013-12-17 21:53:41 if( czybylawylosowana( a, wylosowana(), zbior ) == false ) { zbior[ a ] = wylosowana();
Sprawdzasz liczbę i wstawiasz do tablicy inną. |
|
Nazgul Temat założony przez niniejszego użytkownika |
» 2013-12-17 22:22:57 Trzeba przyznać, że problem właśnie w tym tkwił. Wielkie Dzięki!!! zamieniłem tą część programu na: do { b = wylosowana(); if( czybylawylosowana( a, b, zbior ) == false ) { zbior[ a ] = b; teraz działa :D tylko nie rozumiem do końca dlaczego. Domyślam się, że wartości przypisane jako argumenty innej funkcji mogą być inaczej czytane.. "wylosowana()" zwracała inną wartość, niż przewidywałem? if( czybylawylosowana( a, wylosowana(), zbior ) == false ) { zbior[ a ] = wylosowana();
z tego co ja widzę, to tylko dodałem zmienną. Gdybyś mógł mi to jeszcze wyjśnić to byłoby naprawdę ekstra |
|
pekfos |
» 2013-12-18 13:15:32 wylosowana(), to nie zmienna, lecz funkcja - losuje wartość w każdym miejscu użycia. Gdyby było inaczej, jak najwidoczniej zakładałeś, to program by się zawiesił, bo za każdym razem była by losowana (a raczej nie losowana) ta sama liczba. Myśl logicznie - mniej zbędnych pytań zadasz. |
|
« 1 » |