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

Losowanie liczb bez powtórzeń - crash programu.

Ostatnio zmodyfikowano 2014-07-17 13:57
Autor Wiadomość
twoxu
Temat założony przez niniejszego użytkownika
» 2014-07-17 01:05:09
Dzięki Moorfox, użyłem Twojego kodu i teraz wyświetlają się na ekranie "wylosowane" liczby, a w nawiasie dlatego, gdyż pojawił się kolejny problem. Niby wszystko dobrze, lecz funkcja WylosujLiczbe chyba się nie sprawuje, gdyż wszystkie liczby drukowane na ekran nie są takie jak mają być.

Wynik pracy programu:

Prosze podac 10 liczb. Program wylosuje z nich 8 bez powtorzen.
1
2
3
4
5
6
7
8
9
0
Oto Wylosowane Liczby:
1 z nich to jest:1969392853
2 z nich to jest:4
3 z nich to jest:-2
4 z nich to jest:1969295714
5 z nich to jest:1969642436
6 z nich to jest:4273296
7 z nich to jest:2686760
8 z nich to jest:4273398

Process returned 0 (0x0)   execution time : 6.734 s
Press any key to continue.
A to teraźniejszy kod programu:
C/C++
#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;
void wydrukuj( int IleWydrukowac, int Wylosowane[] )
{
    cout << IleWydrukowac + 1 << " z nich to jest:" << Wylosowane[ IleWydrukowac ] << endl;
}
bool czyBylaWylosowana( int iLiczba, int tab[], int wylosowanych )
{
    if( wylosowanych >= 0 )
    {
        return false;
    }
    int i = 0;
    do
    {
        if( tab[ i ] == iLiczba )
             return true;
       
        i++;
    } while( i < wylosowanych );
   
    return false;
}
int wylosujLiczbe()
{
    int los =( rand() % 8 ) + 0;
    return los;
}
int main()
{
    srand( time( NULL ) );
    int LiczbyUzytkownika[ 10 ];
    int wylosowane[ 8 ];
    int wylosowanych = 0;
    int ilePodac = 0;
    int IleWydrukowac = 0;
    cout << "Prosze podac 10 liczb. Program wylosuje z nich 8 bez powtorzen." << endl;
    do
    {
        cin >> LiczbyUzytkownika[ ilePodac ];
        ilePodac++;
    } while( ilePodac <= 9 );
   
    do
    {
        int Liczba = wylosujLiczbe();
        if( czyBylaWylosowana( Liczba, wylosowane, wylosowanych ) == false )
        {
            wylosowanych++;
            wylosowane[ wylosowanych ] = Liczba;
        }
    } while( wylosowanych > 8 );
   
    cout << "Oto Wylosowane Liczby: " << endl;
    do {
        wydrukuj( IleWydrukowac, wylosowane );
        IleWydrukowac++;
    } while( IleWydrukowac < 8 );
   
    return 0;
}

P-113904
Moorfox
» 2014-07-17 01:12:56
Napisałem też wcześniej
while( wylosowanych > 8 );
czego nie poprawiłeś
wylosowanych = 0 czyli while( wylosowanych > 8) <=> while ( 0 > 8 ) <=> while (false)
Zostaną wypisane wartości które domyślnie były przypisane komórkom pamięci
Zmień na:
while( wylosowanych < 8 );

Że nie wywala ci warninga o naruszeniu pamięci...

EDIT: nie w nawiasie a w cudzysłowiu (mówie o twoim poście)
P-113907
twoxu
Temat założony przez niniejszego użytkownika
» 2014-07-17 01:24:01
Dzięki! Poprawię mój program nad ranem! A i wiem, że nie nawias tylko cudzysłów, pomyliłem się, mam nadzieję że mnie nie uważasz za totalnego idiotę :)
P-113909
Moorfox
» 2014-07-17 02:16:50
A pro po jak już poprawisz program to zajmij się jeszcze
1.Formatowaniem kodu
2.Zamianą pętli do while na for będzie mniej zmiennych po za pętlą
3.Żeby było jak najlepiej wizualnie

Kiedy zrobisz powyższe kroki usuń wszystko i zacznij jeszcze raz wymyślając lepszy algorytm teraz losujesz 8 z 10 liczb
Myśląc jak programista algorytm działa tak losujesz liczbe i sprawdzasz czy ona jest już wylosowana jeśli tak ponawiasz
Powiedzmy, że masz 99 z 100 liczb
To wyobraż sobie, że wylosowałeś już 98 liczb i brakuje ci jeszcze jednej i wtedy jest 98% szansy, że kolejna liczba którą wylosowałeś była już wylosowana i 2%, że będzie to ta oczekiwana, która to zakończy powiedzmy, że losujemy 9999 z 10000, takie losowanie może trwać baaaaaaaaaaaaaaaaaaaaaaaaaaaaardzo długo, złożoność obliczeniowa więc  jest ogromna i nie da się jej zapewne ustalić. Mało sprawny algorytm n - liczba liczb w puli k - ile do wylosowania założenie k<n
jeżeli k jest prawie równe n zwiększa się baaaaaaaaaaaaaaaaaaaaaardzo złożoność obliczeniowa i jest tym większa im większe jest k i n.

Wymyśl lepszy algorytm, można na przykład inaczej, czyli wylosować te liczby które mają być usunięte np

tab[] - tablica 10 liczb
for(i=0;i<n-k;i++){
wylosuj a
usun tab[a]
'wyrownaj' elementy tablicy
}
return tab
P-113910
pekfos
» 2014-07-17 11:18:24
Wymyśl lepszy algorytm
Zadanie nie polega na osiągnięciu celu najlepszym algorytmem. Póki co, niech pisze 'na pałę', jak oczekuje od niego kurs. Najpierw niech zrozumie co w ogóle pisze, a potem dopiero myśli, czy jego rozwiązania są optymalne. Inaczej nic z tego nie będzie.
P-113913
twoxu
Temat założony przez niniejszego użytkownika
» 2014-07-17 13:57:05
Pętla for jest dopiero na następnej lekcji, napiszę nie na pałę gdy się jej nauczę.
Dzięki za pomoc :)
EDIT:
Zrobiłem jeszcze 3 małe bugfixy w postaci przenoszenia pewnych linijiek kodu w inne miejsce, aby wykonywały się w dobrej kolejności, i program wreszcie działa! Oto wynik:

Prosze podac 10 liczb. Program wylosuje z nich 8 bez powtorzen.
12
23
34
45
56
67
78
89
90
01
Oto Wylosowane Liczby:
1 z nich to jest: 23
2 z nich to jest: 67
3 z nich to jest: 78
4 z nich to jest: 34
5 z nich to jest: 45
6 z nich to jest: 56
7 z nich to jest: 89
8 z nich to jest: 12

Process returned 0 (0x0)   execution time : 14.859 s
Press any key to continue.

A tutaj kod programu, dla tych co mają taki problem jak ja miałem:
C/C++
#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;
void wydrukuj( int IleWydrukowac, int Wylosowane[], int LiczbyUzytkownika[] )
{
    cout << IleWydrukowac + 1 << " z nich to jest: " << LiczbyUzytkownika[ Wylosowane[ IleWydrukowac ] ] << endl;
}
bool czyBylaWylosowana( int iLiczba, int tab[], int wylosowanych )
{
    if( wylosowanych == 0 )
    {
        return false;
    }
    int i = 0;
    do
    {
        if( tab[ i ] == iLiczba )
             return true;
       
        i++;
    } while( i < wylosowanych );
   
    return false;
}
int wylosujLiczbe()
{
    int los =( rand() % 8 ) + 0;
    return los;
}
int main()
{
    srand( time( NULL ) );
    cin.clear();
    cin.sync();
    int LiczbyUzytkownika[ 10 ];
    int wylosowane[ 8 ];
    int wylosowanych = 0;
    int ilePodac = 0;
    int IleWydrukowac = 0;
    cout << "Prosze podac 10 liczb. Program wylosuje z nich 8 bez powtorzen." << endl;
    do
    {
        cin.clear();
        cin.sync();
        cin >> LiczbyUzytkownika[ ilePodac ];
        ilePodac++;
    } while( ilePodac <= 9 );
   
    do
    {
        int Liczba = wylosujLiczbe();
        if( czyBylaWylosowana( Liczba, wylosowane, wylosowanych ) == false )
        {
            wylosowane[ wylosowanych ] = Liczba;
            wylosowanych++;
        }
    } while( wylosowanych < 8 );
   
    cout << "Oto Wylosowane Liczby: " << endl;
    do {
        wydrukuj( IleWydrukowac, wylosowane, LiczbyUzytkownika );
        IleWydrukowac++;
    } while( IleWydrukowac < 8 );
   
    return 0;
}
WIELKIE DZIĘKI!
P-113919
1 « 2 »
Poprzednia strona Strona 2 z 2