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

[Lekcja 20] Liczby z tablicy nie są losowane bez powtórzeń

Ostatnio zmodyfikowano 2014-12-16 12:03
Autor Wiadomość
legionista
Temat założony przez niniejszego użytkownika
[Lekcja 20] Liczby z tablicy nie są losowane bez powtórzeń
» 2014-12-14 21:59:45
Staram się zrobić zadanie domowe z lekcji 20. Program działa ale liczby nie są losowane z tablicy  bez powtórzeń. Sumie to powtarza mi jedna z liczb w tablicy . Proszę o pomoc, gdzie może znajdować sie błąd.
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

bool czybylawlosowana( int index, int tab[], int ile )
{
    if( ile <= 0 )
         return false;
   
    int i = 0;
   
    do
    {
        if( tab[ i ] == tab[ index ] )
             return true;
       
        i++;
       
    } while( i < ile );
   
    return false;
}
int wylosuj() // zwraca element tablicy i losowy
{
    return( rand() % 3 ) + 0;
}
int main()
{
    srand( time( NULL ) );
    int tablica[ 3 ];
    int i = 0;
   
    std::cout << "Podaj pierwsza liczbe " << std::endl;
    std::cin >> tablica[ 0 ];
    std::cout << "Podaj druga liczbe " << std::endl;
    std::cin >> tablica[ 1 ];
    std::cout << "Podaj trzecia liczbe " << std::endl;
    std::cin >> tablica[ 2 ];
   
   
    int index = wylosuj();
    int wylosowanych = 0;
    int wylosowane[ 2 ];
    do
    {
       
       
        if( czybylawlosowana( index, tablica, wylosowanych ) == false )
        {
            wylosowane[ wylosowanych ] = tablica[ index ];
            wylosowanych++;
        }
    } while( wylosowanych < 2 );
   
    wylosowanych = 0;
    do
    {
        std::cout << "Wylosowane " << wylosowane[ wylosowanych ] << std::endl;
        wylosowanych++;
    } while( wylosowanych < 2 );
   
    return 0;
}
 
P-122873
darko202
» 2014-12-14 22:25:24
pierwsze wejście

int wylosowanych = 0;
if( czybylawlosowana( index, tablica, wylosowanych ) == false )
ile =0 w
bool czybylawlosowana( int index, int tab[], int ile )
if( ile <= 0 )
         return false;


następne
wylosowanych++
i znów ile = 1,2
bool czybylawlosowana( int index, int tab[], int ile )

    do
    {
        if( tab[ i ] == tab[ index ] )
             return true;
       
        i++;
       
    } while( i < ile );

szuka aż i<ile czyli nie przeszukuje całej Tablicy

a i jeszcze to
w main masz
int index = wylosuj();
porównujesz z jedną wartością
 if( tab[ i ] == tab[ index ] )
+ to co wcześniej
musisz sprawdzić co właściwie tam robisz







P-122877
legionista
Temat założony przez niniejszego użytkownika
» 2014-12-14 23:08:57
Nie za bardzo rozumie błędu w pierwszym wejściu .
int index = wylosuj();
Umieściłem w petli do while.
P-122880
darko202
» 2014-12-15 07:43:48
C/C++
int index = wylosuj(); // tu losujesz raz x 0, 1 lub 2
int wylosowanych = 0;
int wylosowane[ 2 ];
do
{
   
    //teraz będzie if(czybylawlosowana( x, tablica, 0 lub 1 ) == false )
   
    if( czybylawlosowana( index, tablica, wylosowanych ) == false )
   
    {
        wylosowane[ wylosowanych ] = tablica[ index ];
        wylosowanych++;
    }
} while( wylosowanych < 2 );

wylosowanych = 0;
do
{
    std::cout << "Wylosowane " << wylosowane[ wylosowanych ] << std::endl;
    // tu wyświetlasz tablicę wylosowane 
   
    wylosowanych++;
} while( wylosowanych < 2 );


1.

2.
wyświetlasz tablicę wylosowane 
P-122884
darko202
» 2014-12-15 07:52:14
odnośnie Twojego pytania
C/C++
...
int main()
{
    ...
    int index = wylosuj(); // tu losowanie jakiegoś x = 0,1 lub 2
    int wylosowanych = 0;
    int wylosowane[ 2 ];
    do
    {
        if( czybylawlosowana( x, tablica, { 0 lub 1 } ) == false ) {...}
    } while( wylosowanych < 2 );
   
    wylosowanych = 0;
    do
    {
        std::cout << "Wylosowane " << wylosowane[ wylosowanych ] << std::endl;
        // tu chyba powinieneś wyświetlać tablica[ wylosowanych ]
        wylosowanych++;
    } while( wylosowanych < 2 );
   
    return 0;
}

1.losowanie jakiego ś x = 0, 1 lub 2 wi ę cej si ę to nie zmienia
2.chyba powiniene ś wy ś wietla ć tablica[ wylosowanych ]
P-122885
legionista
Temat założony przez niniejszego użytkownika
» 2014-12-15 21:31:40
Ok poradziłem sobie z poprzednim zadaniem,  mam jednak problem z drugim
2. Zmodyfikuj program z pierwszego zadania tak, aby użytkownik musiał podać 10 liczb, a 8 z nich będzie losowanych bez powtórzeń. Sprawdź czy wyniki są poprawne.

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>


bool funkcja( int tab[], int tabl[], int j, int liczba )
{
    if( j == 0 )
         return false;
   
    int k = 0;
   
    do
    {
        if( tab[ k ] == tabl[ liczba ] )
             return true;
       
        k++;
    } while( k < j );
   
    return false;
}
int wylosuj() // zwraca element tablicy i losowy
{
    return( rand() % 10 ) + 0;
}
int main()

{
    srand( time( NULL ) );
    int i = 0;
    int tablica[ 10 ];
    int random[ 8 ];
    int j = 0;
    do
    {
        std::cout << "podaj liczbe " << i + 1 << " " << std::endl;
        std::cin >> tablica[ i ];
        i++;
    } while( i < 10 );
   
    do {
        int liczba = wylosuj();
        if( funkcja( random, tablica, j, liczba ) == false );
       
        {
            random[ j ] = tablica[ liczba ];
            j++;
            std::cout << "nr idexu " << liczba << std::endl;
            std::cout << random[ j ] << std::endl;
        }
    } while( j < 8 );
   
    return 0;
}
 Program nie działa prawidlowo jak tablice random[j] zwraca przypadkowe wartosci
P-122913
darko202
» 2014-12-16 12:03:00
jaką masz wartość wejściową j w linii

 if( funkcja( random, tablica, j, liczba ) == false );
w funkcji sprawdzasz
    if( j == 0 ) return false;

to ma związek z Twoim pytaniem

P-122936
« 1 »
  Strona 1 z 1