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

Lekcja 21, Losowanie bez powtórzeń, praca domowa

Ostatnio zmodyfikowano 2014-07-18 20:28
Autor Wiadomość
robertn2
Temat założony przez niniejszego użytkownika
Lekcja 21, Losowanie bez powtórzeń, praca domowa
» 2014-07-18 15:38:50
1. Napisz program, który wczyta 3 liczby podane przez użytkownika do tablicy, a następnie wylosuje 2 z nich bez powtórzeń. Wynik wypisz na ekran. Postaraj się napisać ten program w oparciu o funkcje.

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

bool czyByla( int proba, int liczba[], int licznik )
{
    if( licznik = 0 )
         return 0;
   
    licznik = 0;
    do
    {
        if( proba == liczba[ licznik ] )
             return 1;
       
        licznik++;
    } while( licznik < 2 );
   
    return 0;
}

int main()
{
    srand( time( NULL ) );
    int liczba[ 3 ];
    std::cin >> liczba[ 0 ];
    std::cin >> liczba[ 1 ];
    std::cin >> liczba[ 2 ];
    int licznik = 0;
    int proba = 0;
    do
    {
        proba = liczba[ rand() % 3 ];
        if( czyByla( proba, liczba, licznik ) == 0 )
        {
            std::cout << proba << std::endl;
            licznik++;
        }
    } while( licznik < 2 );
   
    return 0;
}

Nie wiem dlaczego, ale gdy podam na wejsciu liczby a, b i c, to na wyjściu otrzymuję zawsze c, c.
P-113954
robertn2
Temat założony przez niniejszego użytkownika
» 2014-07-18 15:53:19
Zauważyłem 2 błedy i teraz losuje, ale z powtórzeniami :(
Już nie wiem co zrobić.
C/C++
#include<iostream>
#include<cstdlib>
#include<ctime>

bool czyByla( int proba, int liczba[], int licznik )
{
    if( licznik == 0 )
         return 0;
   
    licznik = 0;
    do
    {
        if( proba == liczba[ licznik ] )
             return 1;
       
        licznik++;
    } while( licznik < 1 );
   
    return 0;
}

int main()
{
    srand( time( NULL ) );
    int liczba[ 3 ];
    std::cin >> liczba[ 0 ];
    std::cin >> liczba[ 1 ];
    std::cin >> liczba[ 2 ];
    int licznik = 0;
    int proba = 0;
    int wynik;
    do
    {
        proba = liczba[ rand() % 3 ];
        if( czyByla( proba, liczba, licznik ) == 0 )
        {
            std::cout << proba << std::endl;
            licznik++;
        }
    } while( licznik < 2 );
   
    return 0;
}
P-113955
unkn9wn
» 2014-07-18 16:10:24
nie całkiem.

* Podaję 3 liczby:
5 8 5

i za którymś to razem dostaję w odpowiedzi:

8
8

w zadaniu było, że program wylosuje dwie z nich bez powtórzeń.

* Po podaniu trzech takich samych liczb:
8 8 8

program wypisuje jedną z nich i zawiesza się

* zmiennej wynik w ogóle nie używasz


P-113958
robertn2
Temat założony przez niniejszego użytkownika
» 2014-07-18 16:18:57
Tak, zmienna wynik jest nie potrzebna, ale nadal nie mogę zauważyć gdzieś błędu, który powoduje, że raz na ileś razy losuje z powtórzeniami.
P-113962
unkn9wn
» 2014-07-18 16:55:19
błąd jest w funkcji sprawdzającej

C/C++
if( licznik = 0 )
     return 0;

licznik = 0;
do
{
    if( proba == liczba[ licznik ] )
         return 1;
   
    licznik++;
} while( licznik < 1 );


jeżeli wpisujesz np.:
5 8 5

i wylosuje tobie najpierw 8,
wypisze ją, gdyż licznik jest 0

za drugim losowaniem wybierze znów 8,
przechodzisz do funkcji,
licznik ma teraz wartość 1, więc kontynuujesz,
licznikowi przypisujesz wartość 0,
po czym w pętli w if'ie sprawdzasz czy 8 równa się liczba[0] czyli 5,
nie równa się, więc
zwiększasz wartość licznik o 1 ( licznik teraz ma wartość 1 )
w związku że licznik nie jest mniejszy od 1 ( licznik < 1 nie jest prawdą) kończy się pętla,
a cała funkcja zwraca wartość 0,

powróciwszy z funkcji, wypisujesz liczbę 8 po raz drugi



Wystarczy po kolei sobie wszystko przelecieć, sprawdzając co krok po kroku twój kod robi

ps.: wpisując 3 takie same liczby, np.:
8 8 8

C/C++
do
{
    proba = liczba[ rand() % 3 ];
    if( czyByla( proba, liczba, licznik ) == 0 )
    {
        std::cout << proba << std::endl;
        licznik++;
    }
} while( licznik < 2 );

licznik nigdy nie osiągnie wartości 2, przez co pętla się nie kończy
P-113964
robertn2
Temat założony przez niniejszego użytkownika
» 2014-07-18 20:28:30
Dzięki za pomoc!
Jakby ktoś miał taki sam problem to podaję gotowy kod:
C/C++
#include<iostream>
#include<cstdlib>
#include<ctime>

bool czyByla( int proba[], int liczba[], int licznik )
{
    if( licznik == 0 )
         return 0;
   
    int a = 0;
    do
    {
        if( proba[ licznik ] == proba[ a ] )
             return 1;
       
        a++;
    } while( a < licznik );
   
    return 0;
}

int main()
{
    srand( time( NULL ) );
    int liczba[ 3 ];
    bool test = 0;
    do
    {
        std::cin >> liczba[ 0 ];
        std::cin >> liczba[ 1 ];
        std::cin >> liczba[ 2 ];
        if( liczba[ 0 ] == liczba[ 1 ] == liczba[ 2 ] )
        {
            std::cout << "Podaj przynajmniej dwie rozne liczby!" << std::endl;
            test = 1;
        }
        else
             test = 0;
       
    } while( test == 1 );
   
    int licznik = 0;
    int proba[ 2 ];
    do
    {
        proba[ licznik ] = liczba[ rand() % 3 ];
        if( czyByla( proba, liczba, licznik ) == 0 )
        {
            std::cout << proba[ licznik ] << std::endl;
            licznik++;
        }
    } while( licznik < 2 );
   
    return 0;
}
P-113983
« 1 »
  Strona 1 z 1