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

Losowanie bez powtórzeń (zadanie z 21 rozdziału).

Ostatnio zmodyfikowano 2015-02-02 12:27
Autor Wiadomość
Lucas535
Temat założony przez niniejszego użytkownika
Losowanie bez powtórzeń (zadanie z 21 rozdziału).
» 2015-02-01 19:18:04
Wiem, że jest pełno takich tematów, ale ja napisałem ten program po swojemu. Program ma wczytać 10 liczb i wylosować 8 z nich bez powtórzeń, a jednak powtórzenia są.

C/C++
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
bool porownywanie( int los[], int losnr, int lib[], int nr )
{
    do
    {
        if( los[ losnr ] == lib[ nr ] )
        {
            return true;
        }
        nr++;
    } while( nr < 10 );
   
    return false;
}
bool powtorka( int los[], int losnr )
{
    if( losnr <= 0 )
    {
        return true;
    }
    int i = 0;
    if( losnr > 0 )
    {
        do
        {
            if( los[ losnr ] == los[ i ] )
            {
                return false;
            }
            i++;
        } while( i < losnr );
       
    }
    return true;
}
int main()
{
    srand( time( NULL ) );
    int liczba[ 10 ];
    int ilosc = 0;
    do
    {
        cout << "Podaj liczbe: ";
        cin >> liczba[ ilosc ];
        ilosc++;
    } while( ilosc < 10 );
   
    int wylosowana[ 8 ];
    int wylosowane = 0;
    ilosc = 0;
    do
    {
        do
        {
            wylosowana[ wylosowane ] = rand();
            porownywanie( wylosowana, wylosowane, liczba, ilosc );
            if( porownywanie( wylosowana, wylosowane, liczba, ilosc ) == true )
            {
                ( powtorka( wylosowana, wylosowane ) );
                if( powtorka( wylosowana, wylosowane ) == true );
               
                {
                    wylosowane++;
                }
            }
        } while( porownywanie( wylosowana, wylosowane, liczba, ilosc ) == false );
       
    } while( wylosowane < 8 );
   
    wylosowane = 0;
    do
    {
        cout << "Wylosowano liczbe: " << wylosowana[ wylosowane ] << endl;
        wylosowane++;
    } while( wylosowane < 8 );
   
    cout << "Koniec." << endl;
   
    return 0;
}
P-125847
darko202
» 2015-02-02 11:33:05
1. dziwny jest ten Twój kod
* powtarzanie tego samego wywołania wielokrotnie np. porownywanie
C/C++
do {
    ...
    porownywanie( wylosowana, wylosowane, liczba, ilosc );
    cout << " " << licznik++ << "\n"; //dodaj kod
   
    if( porownywanie( wylosowana, wylosowane, liczba, ilosc ) == true )
        ( powtorka( wylosowana, wylosowane ) );
   
    cout << " " << licznik2++ << "\n"; //dodaj kod
    if( powtorka( wylosowana, wylosowane ) == true );
   
    .....
    while( porownywanie( wylosowana, wylosowane, liczba, ilosc ) == false );
   
błędem jest to, że nie jest to niczym uzasadnione powtarzanie.

robisz raz i zapamiętujesz wynik, który później wykorzystujesz


2.
dodaj sobie licznik w miejscach które zaznaczyłem Ci wyżej
i zobacz ile razy wykonują się Twoje funkcje we wskazanych pętlach
niezależnie od p1.
to również jest błędem - nie dążysz do uzyskanie wynik w najkrótszym czasie

3.
masz pomyłkę w  powtorka( wylosowana, wylosowane )
bo ewidentnie po wylosowaniu tej samej liczby funkcja nie zauważa tego faktu i zmienia wylosowane++ stąd opisywany problem.




P-125859
Lucas535
Temat założony przez niniejszego użytkownika
» 2015-02-02 12:27:54
Już wiem o co chodziło, dałem średnik po if i dlatego nie działało, usunąłem średnik i jest wsio haraszo :)
P-125861
« 1 »
  Strona 1 z 1