Losowanie bez powtórzeń liczb podanych przez użytkownika – poprawność zadania

0

Czy to zadanie wykonane jest poprawnie: ( Cel programu w tytule tematu )

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

bool CzyWylosowana( int liczba, int tab[], int ile )
{
    if( liczba <= 0 )
        return false;

    int licznik = 0;
    do
    {
        if( tab[ licznik ] == liczba )
            return true;

            licznik ++;
    } while( licznik < ile );

    return false;
}

int wczytaj()
{
    int liczba;
    cin >> liczba;
    return liczba;
}

int losowanie( int liczby[ 3 ] )
{
    int wylosowana = ( rand() % 3 ) + 0;

    return liczby[ wylosowana ];
}

bool czyPodana( int Podana, int tab[], int ile )
{
    if( ile <= 0 )
        return false;

    int licznik;
    do
    {
        if( tab[ licznik ] == Podana)
            return true;

        licznik ++;
    } while( licznik < ile );

}

int main()
{
   srand( time( NULL ) );
   int liczby[ 3 ];
   int wylosowane[ 2 ];
   int licznik;
   int podana;
   int wartosc;
   cout << "Podaj 3 rozne liczby" << endl;

   do
   {
       podana = wczytaj();
       if( czyPodana( podana, liczby, licznik ) == false )
       {
           liczby[ licznik ] = podana;
           licznik ++;
       }
   } while( licznik < 3);

   licznik = 0;
   do
   {
       wartosc = losowanie( liczby );
       if( CzyWylosowana( wartosc, liczby, licznik) == false )
       {
           wylosowane[ licznik ] = wartosc;
           licznik ++;
       }
   } while( licznik < 2 );

    cout << "Wylosowane liczby to: ";
   licznik = 0;
   do
   {
      cout << wylosowane[ licznik ] << ", ";
      licznik ++;
   } while( licznik < 2 );

   return 0;
}
1

Jeśli kod działa prawidłowo i faktycznie losuje liczby bez powtórzeń, to tak – jest prawidłowy.

Tyle że tego kodu jest za dużo. Jednym z łatwiejszych sposobów jest wrzucenie wszystkich liczb do wektora, następnie jego przemieszanie i wybranie n pierwszych elementów. Jest to łatwe w zrozumieniu i którkie w implementacji. Spróbuj.

0

Problem w tym, że program nie działa. Zamyka się zaraz po podaniu pierwszej liczby przez użytkownika. Chciałem, więc się dowiedzieć czy napisałem wszystko poprawnie innymi słowy - czy to moja wina.

Jeśli chodzi o podany link - na pewno sprawdzę.

1

Zmienna licznik nie jest zainicjalizowana, a przekazujesz ją w parametrze funkcji czyPodana i używasz jej do odczytu (w pierwszym warunku). Zresztą żadna zmienna w funkcji main nie posiada zdefiniowanej wartości wstępnej.

0

Ok już poprawiłem:
Jedyny problem jest taki, że losuje nie bez powtórzeń

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

bool CzyWylosowana( int liczba, int tab[], int ile )
{
    if( liczba <= 0 )
        return false;

    int licznik = 0;
    do
    {
        if( tab[ licznik ] == liczba )
            return true;

            licznik ++;
    } while( licznik < ile );

    return false;
}

int wczytaj()
{
    int liczba;
    cin >> liczba;
    return liczba;
}

int losowanie( int liczby[ 3 ] )
{
    int wylosowana = ( rand() % 3 ) + 0;

    return liczby[ wylosowana ];
}

bool czyPodana( int Podana, int tab[], int ile )
{
    if( ile <= 0 )
        return false;

    int licznik =0;
    do
    {
        if( tab[ licznik ] == Podana)
            return true;

        licznik ++;
    } while( licznik < ile );

    return false;
}

int main()
{
   srand( time( NULL ) );
   int liczby[ 3 ];
   int wylosowane[ 2 ];
   int licznik = 0;
   int podana = 0;
   int wartosc = 0;
   cout << "Podaj 3 rozne liczby" << endl;

   do
   {
       podana = wczytaj();
       if( czyPodana( podana, liczby, licznik ) == false )
       {
           liczby[ licznik ] = podana;
           licznik ++;
       }
   } while( licznik < 3);

   licznik = 0;
   do
   {
       wartosc = losowanie( liczby );
       if( CzyWylosowana( wartosc, liczby, licznik) == false )
       {
           wylosowane[ licznik ] = wartosc;
           licznik ++;
       }
   } while( licznik < 2 );

    cout << "Wylosowane liczby to: ";
   licznik = 0;
   do
   {
      cout << wylosowane[ licznik ] << ", ";
      licznik ++;
   } while( licznik < 2 );

   return 0;
}

Po wprowadzeniu liczb 4, 7, 90 - wylosowane liczby 4, 4
Po wprowadzeniu liczb 9, 80, 65 - wylosowane liczby: 80, 65

0

nie powinno być if( CzyWylosowana( wartosc, wylosowane, licznik) == false )?

0

@user2322 Zastosuj się do rady @furious programming, to jest najłatwiejszy sposób naprawdę

0

Wystarczy wylosować dwa indeksy i wyświetlić spod nich liczby.

1 użytkowników online, w tym zalogowanych: 0, gości: 1