• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Podczas kompilacji programu do losowania powyżej 100 zakłądów w konsoli wyświetla się zakończono z kodem -1073741819

0 głosów
308 wizyt
pytanie zadane 24 marca 2023 w C i C++ przez zoozol Nowicjusz (120 p.)

Cześć,

Zacząłem wdrążać się do programowania i postanowiłem trochę rozszerzyć program do losowania losowych liczb. Padło na pomysł zrobienia "ala" LOTTO, gdzie mogłem wybrać ilość zakładów chybił trafił. Program napisałem tak, aby na końcu wyświetlało mi liczbę trójek,czwórek,piątek oraz szóstek, które trafiłem na X losowań.

Gdy chcę zmienić liczbę losowań powyżej 100 w konsoli pojawia mi się błąd: błąd: (proces 19772) zakończono z kodem -1073741819

Poniżej kod programu, dzięki za każdą pomoc i wskazówkę.

// Losowanie bez powtorzen.cpp : Ten plik zawiera funkcję „main”. W nim rozpoczyna się i kończy wykonywanie programu.
//

#include <iostream>
#include <cstdlib>
#include <ctime>
#include<windows.h>

using namespace std;
//
int losowanie()
{
        // rand() % (MAX_NUM - MIN_NUM + 1) + MIN_NUM; // Losowanie liczby z zakresu
        return  rand() % (49 - 1 + 1) +1;   // Losowanie liczby z zakresu
}

int sprawdzenie(int wyniki[], int moje[])
{
    int licznik = 0;

    for (int i = 0; i < 6; i++)
    {
        for (int j = 0; j < 6; j++)
        {
            if ( moje[i] == wyniki[j]) licznik++;
        }
    }
    return licznik;
}

void sprawdzenie_tablicy(int wyniki[], int moje[][6], int wyniki_kilka_losowan[6][1], int liczba_losowan)
{
    int licznik = 0;
    for (int a = 0; a < liczba_losowan; a++)
    {
        for (int i = 0; i < 6; i++)
        {
            for (int j = 0; j < 6; j++)
            {
                if (moje[a][i] == wyniki[j]) licznik++;
            }
        }
        if (licznik == 3) wyniki_kilka_losowan[2][0] = wyniki_kilka_losowan[2][0] + 1;
        if (licznik == 4) wyniki_kilka_losowan[3][0] = wyniki_kilka_losowan[3][0] + 1;
        if (licznik == 5) wyniki_kilka_losowan[4][0] = wyniki_kilka_losowan[4][0] + 1;
        if (licznik == 6) wyniki_kilka_losowan[5][0] = wyniki_kilka_losowan[5][0] + 1;
        licznik = 0;
    }

}

void twoje_zaklady(int tab[][6],int liczba)
{
    int pom = 0, ile = 0;
    cout << "Generuje " << liczba << " kuponow na losowanie." << endl;
    // funckja na uzupelnienie tabilicy dwu wymiarowej
    for (int a=0; a < liczba; a++) // ilosc zakladow
    {
        for (int i = 0; i < 6; i++) // stala wartosc - 7 liczb
        {
        b:
            pom = losowanie();

            for (int j = 0; j < ile; j++)
            {
                //sprawdzenie czy dana liczba jest w tablicy
                if (pom == tab[a][j])
                {
                    goto b;
                }
            }
            //przypisanie unikatowej wartosci pom do tab[i]
            tab[a][i] = pom;
            ile++;

        }
    }

}


int main()
{
    srand(time(0));

    int pom = 0, ile = 0;
    const int liczba_kuponow = 10000;
    int wyniki[6];
    int wyniki_kilka_losowan[6][1] = { {0}, {0} ,{0} ,{0} ,{0} ,{0} };
    int moja[liczba_kuponow][6];

    // funckja na uzupelnienie tabilicy 
    for (int i = 0; i < 6; i++)
    {
        a:
        pom = losowanie();

        for (int j = 0; j < ile; j++)
        {
            //sprawdzenie czy dana liczba jest w tablicy
            if (pom == wyniki[j])
            {
                goto a;
            }
        }
        //przypisanie unikatowej wartosci pom do tab[i]
        wyniki[i] = pom;
        ile++;

    }


    //wyswietlenie tablicy 
    cout << "Losujemy 6 liczb z 49" << endl;

    cout << ".";
    Sleep(500);
    cout << ".";
    Sleep(500);
    cout << ".";
    Sleep(500);
    cout << endl << "Wylosowane liczby to: " << endl;

    for (int i = 0; i < 6; i++)
    {
        cout << wyniki[i] << " ";
    }

    cout <<endl << endl;
    twoje_zaklady(moja, liczba_kuponow);

   // wyswwietlenie wynikow moich kuponow
    
   //for(int i=0; i < liczba_kuponow;i++)
   //{
   //    for (int j = 0; j < 6; j++)
   //    {
   //        cout << moja[i][j] << " ";
   //    }
   //    cout << endl;
   //}

   sprawdzenie_tablicy(wyniki, moja, wyniki_kilka_losowan, liczba_kuponow);

   cout << endl << "****************************************" << endl;
   cout << "W swoich kuponach trafiles: ";
   for (int i = 0; i < 6; )
   {
       cout << wyniki_kilka_losowan[i][0] << " ";
       i++;
   }
   cout << endl << "****************************************" << endl;

   return 0;
}

 

komentarz 24 marca 2023 przez overcq Pasjonat (22,600 p.)

Jednym z błędów jest to, że nie zerujesz zmiennej ile zadeklarowanej w linii 54. — w pętli z linii 57.

komentarz 24 marca 2023 przez zoozol Nowicjusz (120 p.)
Dlaczego mam ją zerować w trakcie trwania funkcji ? Zmienna "ile" służy mi do sprawdzenia wszystkich powtórzeń i ewentualnym ponownym losowaniu nowej liczby do danego zakładu.
komentarz 24 marca 2023 przez overcq Pasjonat (22,600 p.)
edycja 24 marca 2023 przez overcq

Ta zmienna jest dla pojedynczego zakładu. Określa, ile liczb już zostało wylosowanych w danym zakładzie. A w linii 57. masz pętlę wyliczającą kolejne zakłady, czyli dla kolejnego zakładu już nie było nic wylosowane.

I tak w przeciwnym wypadku wychodzisz poza zakres tablicy.

Ok, chyba wiem, co to miało robić, ale wtedy powinno być w linii 67:

if (pom == reinterpret_cast<int *>(tab)[j])

 

komentarz 25 marca 2023 przez zoozol Nowicjusz (120 p.)
edycja 25 marca 2023 przez zoozol
Niestety dalej nie działa ;/

Chyba, że źle rozumiem zasadę działania " reinterpret_cast<int *> "

Jeżeli chodzi o kod to mogę wytłumaczyć dokładnie co miałem na myśli w danej funkcji. Tylko nie wiem gdzie masz jakieś wątpliwości. Też zastanawia mnie dlaczego dla argumentów 1-100 działa wszystko a powyżej już są problemy... Nie przekraczam żadnych wartości zakresu INT
komentarz 25 marca 2023 przez overcq Pasjonat (22,600 p.)

Ja jednak jestem przekonany, ze zmienna ile powinna być zerowana w pętli, a nawet nie jest ona konieczna ze względu na możliwość użycia zmiennej i.

W tabeli tab[][6] jest w każdym wierszu 6 liczb, ale… w trakcie losowania jest ich mniej, do czasu wylosowania wszystkich. Zmienna ile określa, ile zostało dotychczas wylosowanych z tych sześciu. Sprawdzasz tam, czy w tym jednym zakładzie (do 6 liczb w trakcie losowania) nie powtarza się żadna liczba, więc zmienna ile powinna być zerowana na początku pętli wyliczającej zakłady, ponieważ dla kolejnego zakładu nie wylosowano jeszcze żadnych liczb. Wytłumacz różnicę działania w tej właśnie pętli.

Nie sprawdzałem dla argumentów do 100, ponieważ od razu poprawiłem i działa dla oryginalnej liczby zakładów. Nie przekraczasz w tym kodzie zakresu int, lecz zakres tablicy, ponieważ odwołujesz się do tab[a][ile], gdzie ile będzie większe od 5, więc czyta z tablicy wartości z jeszcze nie wylosowanych zakładów aż przekroczy jej rozmiar, gdy w przybliżeniu ile > ( 10000 - a ) * 6 (jeśli dobrze obliczam).

Natomiast ogólnie można rozwiązać to losowanie trochę inaczej: zamiast ponawiać losowanie liczby w przypadku duplikatu, można losować z listy liczb, z której usuwa się już wylosowaną liczbę.

komentarz 25 marca 2023 przez zoozol Nowicjusz (120 p.)
Dzięki za odpowiedź, do kodu siądę wieczorem po pracy - przeanalizuje go i rozpiszę dokładnie działanie pętli. Spróbuje również napisać funkcję do losowania liczb z listy, chociaż nie wiem czy nie wykracza to jeszcze poza moje umięjetności.
komentarz 26 marca 2023 przez zoozol Nowicjusz (120 p.)

@overcq, 

#include <iostream>
#include <cstdlib>
#include <ctime>
#include<windows.h>

using namespace std;
//
int losowanie()
{
        // rand() % (MAX_NUM - MIN_NUM + 1) + MIN_NUM; // Losowanie liczby z zakresu
        return  rand() % (49 - 1 + 1) +1;   // Losowanie liczby z zakresu
}


void sprawdzenie_tablicy(int wyniki[], int moje[][6], int wyniki_kilka_losowan[6][1], int liczba_losowan)
{
    int licznik = 0;
    for (int a = 0; a < liczba_losowan; a++)
    {
        for (int i = 0; i < 6; i++)
        {
            for (int j = 0; j < 6; j++)
            {
                if (moje[a][i] == wyniki[j]) licznik++;
            }
        }
        if (licznik == 3) wyniki_kilka_losowan[2][0] = wyniki_kilka_losowan[2][0] + 1;
        if (licznik == 4) wyniki_kilka_losowan[3][0] = wyniki_kilka_losowan[3][0] + 1;
        if (licznik == 5) wyniki_kilka_losowan[4][0] = wyniki_kilka_losowan[4][0] + 1;
        if (licznik == 6) wyniki_kilka_losowan[5][0] = wyniki_kilka_losowan[5][0] + 1;
        licznik = 0;
    }

}

void twoje_zaklady(int tab[][6],int liczba)
{
    int pom = 0, ile = 0;
    cout << "Generuje " << liczba << " kuponow na losowanie." << endl;
    // funckja na uzupelnienie tabilicy dwu wymiarowej
    for (int a = 0; a < liczba; a++) // ilosc zakladow
    {
        for (int i = 0; i < 6; i++) // stala wartosc - 7 liczb
        {
        b:
            pom = losowanie();

            for (int j = 0; j < a; j++) // for (int j = 0; j < ile; j++)
            {
                //sprawdzenie czy dana liczba jest w tablicy
                if (pom == tab[a][j])
                {
                    goto b;
                }
            }
            //przypisanie unikatowej wartosci pom do tab[i]
            tab[a][i] = pom;
            //ile++;

        }
    }

}


int main()
{
    srand(time(0));

    int pom = 0, ile = 0;
    const int liczba_kuponow = 1000;
    int wyniki[6];
    int wyniki_kilka_losowan[6][1] = { {0}, {0} ,{0} ,{0} ,{0} ,{0} };
    int moja[liczba_kuponow][6];

    // funckja na uzupelnienie tabilicy 
    for (int i = 0; i < 6; i++)
    {
        a:
        pom = losowanie();

        for (int j = 0; j < ile; j++)
        {
            //sprawdzenie czy dana liczba jest w tablicy
            if (pom == wyniki[j])
            {
                goto a;
            }
        }
        //przypisanie unikatowej wartosci pom do tab[i]
        wyniki[i] = pom;
        ile++;

    }


    //wyswietlenie tablicy 
    cout << "Losujemy 6 liczb z 49" << endl;

    cout << ".";
    Sleep(500);
    cout << ".";
    Sleep(500);
    cout << ".";
    Sleep(500);
    cout << endl << "Wylosowane liczby to: " << endl;

    for (int i = 0; i < 6; i++)
    {
        cout << wyniki[i] << " ";
    }

    cout <<endl << endl;
    twoje_zaklady(moja, liczba_kuponow);

   sprawdzenie_tablicy(wyniki, moja, wyniki_kilka_losowan, liczba_kuponow);

   cout << endl << "****************************************" << endl;
   cout << "W swoich kuponach trafiles: ";
   for (int i = 0; i < 6; )
   {
       cout << wyniki_kilka_losowan[i][0] << " ";
       i++;
   }
   cout << endl << "****************************************" << endl;

   return 0;
}

Zmieniłem zmienną ile na zmienną a, faktycznie nie było potrzeby jej używania. Niestety dalej problem występuje przy większej liczbie kuponów, Próbuje zrozumieć w którym miejscu wartość tablicy jest przekraczana, jakbyś mógł mi to trochę jaśniej wytłumaczyć byłbym wdzięczny. Pozdrawiam i dziękuje

komentarz 26 marca 2023 przez overcq Pasjonat (22,600 p.)
W wierszu 51.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
3 odpowiedzi 1,596 wizyt
0 głosów
1 odpowiedź 356 wizyt
pytanie zadane 24 kwietnia 2022 w C i C++ przez Mati323 Nowicjusz (210 p.)
0 głosów
2 odpowiedzi 694 wizyt
pytanie zadane 18 sierpnia 2019 w C i C++ przez Mavimix Dyskutant (8,420 p.)

93,425 zapytań

142,421 odpowiedzi

322,646 komentarzy

62,785 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...