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

R. 21 Zadanie domowe, czy poprawnie podszedłem do zadania, losowanie "rand"

Ostatnio zmodyfikowano 2019-02-22 22:04
Autor Wiadomość
Matheyas
Temat założony przez niniejszego użytkownika
R. 21 Zadanie domowe, czy poprawnie podszedłem do zadania, losowanie "rand"
» 2019-02-22 20:09:40
Hej!
Oszczędzając czas:
Pytania:
1) Czy zadanie z rozdziału 21. "Losowanie liczb bez powtórzeń" wykonałem poprawnie? (liczby wylosowane z tablicy się nie powtarzają, lecz powtarzają się liczby ogólnie wylosowane.)
2) Z tego co wyczytałem z kursu, to rand losuje z przedziału liczb. od-do. Więc jak ustalić żeby losował z konkretnych liczb?
3) Popełniłem błędy pod względem merytorycznym? Jak wam się czyta ów kod? Co mogę poprawić, aby pisać "czytelniej".

kod:
C/C++
#include "pch.h"
#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>

using std::endl;
using std::cin;
using std::cout;
int losuj()
{
    return( rand() % 10000 ) + 1;
}
bool czyByla( int iLiczba, int iWylosowana[], int iKolejka )
{
    int i = 0;
    do
    {
        if( iWylosowana[ i ] == iLiczba )
        {
           
            return true;
        }
        i++;
    } while( i < iKolejka );
   
    return false;
}
bool sprawdz( int iLiczba, int iPodana[], int ile )
{
    int i = 0;
    do
    {
       
        if( iLiczba == iPodana[ i ] )
        {
           
            return false;
        }
        i++;
    } while( i < ile );
   
    return true;
}
void losowanie( int iPodane[], int iIleLiczb, int iIleLiczbWylosowac )
{
    int wylosowana[ 10000 ];
    int i = 0;
    int kolejka = 0;
    int nr = 0;
    do
    {
       
        int liczba = losuj();
       
        nr++;
        if( sprawdz( liczba, iPodane, iIleLiczb ) == false )
        {
           
            if( czyByla( liczba, wylosowana, kolejka ) == false )
            {
                wylosowana[ kolejka ] = liczba;
                kolejka++;
            }
           
            nr++;
            i++;
        }
       
    } while( kolejka < iIleLiczbWylosowac );
   
    cout << "Wylosowane liczby to: ";
    int h = 0;
    do
    {
        cout << wylosowana[ h ] << " ";
        h++;
    } while( h < iIleLiczbWylosowac );
   
}

int main()
{
    int podaneLiczby[ 10000 ];
    int ileLiczb;
    int ileLiczbWylosowac;
    int i = 0;
    srand( time( NULL ) );
    cout << "Podaj ile liczb do wczytania ";
    cin >> ileLiczb;
    cout << "Ile liczb wylosowac ";
    cin >> ileLiczbWylosowac;
    cout << "Podaj liczby od 1 do 10000 ";
    do
    {
        cin >> podaneLiczby[ i ];
        i++;
    } while( i < ileLiczb );
   
    losowanie( podaneLiczby, ileLiczb, ileLiczbWylosowac );
   
    return 0;
}



P-174055
pekfos
» 2019-02-22 20:17:24
Czy zadanie z rozdziału 21. "Losowanie liczb bez powtórzeń" wykonałem poprawnie?
Nie. Poprawne rozwiązanie nie powinno narzucać ograniczeń na wprowadzane przez użytkownika liczby.

Z tego co wyczytałem z kursu, to rand losuje z przedziału liczb. od-do. Więc jak ustalić żeby losował z konkretnych liczb?
Musisz znaleźć jakiś sposób, by przetłumaczyć liczbę z jednego zakresu na inny, niekoniecznie ciągły.
P-174056
Matheyas
Temat założony przez niniejszego użytkownika
» 2019-02-22 21:35:51
Wielkie dzięki!
Teraz mi to zajęło niecałą godzinkę (Kod powyżej zajął mi około 10h)
Teraz musi być ok.
C/C++
#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>



using std::endl;
using std::cin;
using std::cout;
int los()
{
    return( rand() % 10 );
}


bool sprawdz( int iLosuj, int iWylosowana[], int iIle )
{
    int i = 0;
    do
    {
       
        if( iLosuj == iWylosowana[ i ] )
        {
            return false;
        }
        i++;
    } while( i < iIle );
   
    return true;
}
int main()
{
    srand( time( NULL ) );
    int a[ 10 ];
    int i = 0;
    int x = 0;
    do
    {
        cin >> a[ i ];
        i++;
    } while( i < 10 );
   
    int wylosowana[ 10 ];
    int ile = 0;
    do
    {
        int losuj = los();
        if( sprawdz( losuj, wylosowana, ile ) == true )
        {
           
            cout << a[ losuj ] << "  ";
            ile++;
        }
        wylosowana[ x ] = losuj;
        x++;
    } while( ile < 8 );
   
    return 0;
}
 
P-174057
pekfos
» 2019-02-22 21:49:38
Potencjalnie przekraczasz zakres tablicy wylosowana.
P-174058
Matheyas
Temat założony przez niniejszego użytkownika
» 2019-02-22 22:00:06
Więc wystarczy, że zwiększę wartość tablicy? Gdy tak zrobiłem, to żaden komunikat mi się nie wyświetla. W kursie jeszcze nie miałem o dowolnej wielkości zmiennej w tablicy, określonej przez użytkownika.
P-174060
pekfos
» 2019-02-22 22:04:13
Nie wystarczy.
P-174061
« 1 »
  Strona 1 z 1