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

[C++] Zawieszanie się prostego programu.

Ostatnio zmodyfikowano 2014-07-15 23:23
Autor Wiadomość
Ithindir
Temat założony przez niniejszego użytkownika
[C++] Zawieszanie się prostego programu.
» 2014-07-15 16:08:32
Witajcie,
Tydzień temu zacząłem uczyć się C++ (wybaczcie więc toporność niektórych rozwiązań) i przechodzę właśnie okres niepohamowanej, szczęśliwej, chaotycznej i bezcelowej twórczości. Z większością problemów, które napotykam jakoś daję sobie radę sam, teraz jednak natrafiłem na mur.
Oglądając filmik (http://www.youtube.com/watch?v=ZWib5olGbQ0&list=UUoxcjq-8xIDTYp3uz647V5A) przedstawiający rozwiązywanie niebanalnego problemu matematycznego, nad którym potężne umysły głowiły się przez wieki, w przypływie neofickiej fantazji postanowiłem sprawdzić, czy będę potrafił zrobić program sprawdzający statystycznie prawdziwość matematycznego rozwiązania problemu przedstawionego w filmie.

Program ma więc za zadanie:
- wygenerować x (int proby) losowych szeregów liczb od 1 do n.
- na każdym z szeregów pominąć y (int proc) pierwszych wyników z szeregu
- wybrać najbliższy kolejny wynik, który (jeżeli to możliwe) będzie wyższy niż jakikolwiek z tych pominiętych
- zebrać statystyki z ilości wybranych w ten sposób wartości minimalnych, maksymalnych oraz średnią

Wszystko w programie działa dobrze, ale tylko na małych liczbach (tak przynajmniej wynika z moich testów), po wprowadzeniu większych zmiennych np. przy x=100, n=100 program zawiesza się; przy x=10, n=1000 pokazuje error i zamyka się.
Nie wydaje mi się, by przeliczenia były na tyle skomplikowane by procesor nie dawał sobie z tym rady, przecież to mikroskopijne wyliczenia!
Czy macie jakiś pomysł co może być nie tak w moim kodzie?


C/C++
#include <iostream>
#include <time.h>
#include <windows.h>

using namespace std;

int n, proby, proc, _max = 0, _min = 0;
float srednia = 0;

int main()
{
    srand( time( NULL ) );
   
    cout << endl;
    cout << "Dla ilu obiektow sprawdzic teze: ";
    cin >> n;
    cout << endl;
    cout << "Podaj ile razy sprawdzac: ";
    cin >> proby;
    cout << endl;
    cout << "Ile procent pierwszych wynikow pominac: ";
    cin >> proc;
    cout << endl;
    int toy[ n ];
   
    for( int y = 0; y < proby; y++ )
    {
        int i = 0, x;
        while( i < n )
        {
            int ii = 0;
            x = rand() % n + 1;
            while( ii <= i )
            {
                if( x != toy[ ii ] ) ii++;
                else x = rand() % n + 1, ii = 0;
               
            }
            toy[ i ] = x;
            i++;
        }
        //for(int iii=0;iii<=n-1;iii++)
        //{
        //    cout<<iii<<"  "<<toy[iii]<<endl;
        //}
       
        proc = n * proc / 100;
        if( proc < 1 ) proc = 1;
        //cout<<endl<<proc<<endl<<endl;
       
        int j = 0, k = proc;
        while(( j < k ) and( proc + 1 < n ) )
        {
            if( toy[ proc ] < toy[ j ] ) proc++, j = 0;
            else j++;
           
        }
        //cout<<toy[proc]<<endl;
        if( toy[ proc ] == 1 ) _min++;
       
        if( toy[ proc ] == n ) _max++;
       
        srednia += toy[ proc ];
    }
   
    cout << "Najnizsza wartosc wybrano " << _min << " razy" << endl;
    cout << "Najwyzsza wartosc wybrano " << _max << " razy" << endl;
    cout << "Sredni wybor to " << srednia / proby << endl;
    return 0;
}


W większości miejsc używam liczba całkowitych - nie zależy mi na dokładności, raczej na ćwiczeniu.
P-113822
Monika90
» 2014-07-15 18:13:14
C/C++
int i = 0, x;
while( i < n )
{
    int ii = 0;
    x = rand() % n + 1;
    while( ii <= i )
    {
        if( x != toy[ ii ] ) ii++;
        else x = rand() % n + 1, ii = 0;
       
    }
    toy[ i ] = x;
    i++;
}
czy ten fragment ma wypełnić tablicę losowymi liczbami z przedziału [1, n] bez powtórzeń? Jeżeli tak, to napisz go jeszcze raz, bo jest zupełnie bez sensu i program zawiesza się w pętli while (ii <= i) { }, jej warunek to raczej powinien być ii < i

A tak przy okazji, w standardowym C++ rozmiar tablicy musi być stałą o wartości znanej już podczas kompilacji.
P-113827
skorek88
» 2014-07-15 20:38:49
Problem jest spowodowany przeliczaniem zmiennej proc w petli:

proc = n * proc /100;

Jezeli n > 100 to twoj proc moze przekroczyc n po paru iteracjach i potem toy[proc] wykracza poza limit tablicy.
P-113845
Ithindir
Temat założony przez niniejszego użytkownika
» 2014-07-15 23:23:18
"Jeżeli tak, to napisz go jeszcze raz, bo jest zupełnie bez sensu i program zawiesza się w pętli while"
Ale.. ale.. ten fragment działa poprawnie! : ) (ta pętla jest tylko pomocnicza, cała pętla z warunkiem (i<n) ma wypełniać tablice i łatwo sprawdzić że wypełnia ją bez powtórzeń)


"Problem jest spowodowany przeliczaniem zmiennej proc w petli: proc = n * proc /100; Jezeli n > 100 to twoj proc moze przekroczyc n po paru iteracjach i potem toy[proc] wykracza poza limit tablicy."
Dzięki, muszę się temu przyjrzeć i przemyśleć, mam nadzieję że poprawienie tego fragmentu rozwiąże problem.
P-113851
« 1 »
  Strona 1 z 1