Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

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
Autor Wiadomość
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:
C/C++
#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++;
        } //if
    } 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
P-99533
pekfos
» 2013-12-17 21:53:41
C/C++
if( czybylawylosowana( a, wylosowana(), zbior ) == false )
{
    zbior[ a ] = wylosowana();
Sprawdzasz liczbę i wstawiasz do tablicy inną.
P-99537
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:
C/C++
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?
C/C++
if( czybylawylosowana( a, wylosowana(), zbior ) == false )
{
    zbior[ a ] = wylosowana(); //<---- o to "wylosowana()" mi chodzi
z tego co ja widzę, to tylko dodałem zmienną. Gdybyś mógł mi to jeszcze wyjśnić to byłoby naprawdę ekstra
P-99540
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.
P-99564
« 1 »
  Strona 1 z 1