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

Błąd w działaniu programu

42 Warsaw Coding Academy
0 głosów
232 wizyt
pytanie zadane 21 stycznia 2018 w C i C++ przez Artur313 Użytkownik (790 p.)

witam mam problem z programem głównie chyba źle przekazuje zmienne ale nie wiem jak to poprawić 

program miał wczytywać pytania z pliku porównywać z odpowiedziami i przyznawać punkty 

 

to jest kod

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <ctime>
#include <string>
#include <sstream>
#include <windows.h>
using namespace std;


int wylosuj_numer_pytania (int &losowa)
{
    srand(time(NULL));


    int *liczba= new int[20];
    for (int i=0;i<20;i++)
    {
        liczba[i]=rand()%20+1;
        for(int j=0;j<i;j++)
        {
         if(liczba[i]==liczba[j])
         {
             i--;break;
         }
        }
    }

    for(int i=0;i<20;i++)
    {
        losowa=liczba[i];
    }

}

string wczytaj_pytanie(int losowa,string *odp)
{
for(int i=0;i<20;i++)
{
int L;
L=losowa;

string numer;
stringstream strumien;
strumien<<L;
strumien >>numer;
string  napis ="Baza_Pytan/pytanie"+numer+".txt";

    ifstream plik;
    plik.open(napis.c_str());
    if(plik)
    {
        string linia;
        while(getline(plik,linia))
        {
            cout<<linia<<endl;
        }
        cout<<endl;

        cout<<"podaj odpowiedz: ";
        cin>>*odp;


    }
    else
    {
        cout <<"wystapil blad nie mozna otworzyc pliku";
    }
    plik.close();

    cout <<endl<<endl;

}
}

int sprawdz( int losowa,string &odp,int *pkt=0)
{
int nr=losowa;
string odpowiedz;

string numer;
stringstream strumien;
strumien<<nr;
strumien >>numer;

string  nazwa ="odpowiedzi/odp"+numer+".txt";

    ifstream plik;
    plik.open(nazwa.c_str());
    if(plik)
    {
        string linia;
        while(getline(plik,linia))
        {
            if(linia==odpowiedz)
            {
                *pkt++;
            }
        }






    }
    else
    {
        cout <<"wystapil blad nie mozna otworzyc pliku";
    }
    plik.close();

}
void podsumowanie(int &pkt)
{

    int twoje_punkty =pkt;

    cout <<"zdobyles   "<<twoje_punkty;

}


void start()

{
    int chose; // zmienna odpowiadaj¹ca za wybór opcji programu
    cout <<"__________________________________________________________"<<endl
     <<"witaj w tescie znajomosci lektur z jezyka polskiego : "<<endl
     <<"wybierz opcje :"<<endl
     <<"__________________________________________________________"<<endl
    <<"1. Rozpocznij test "<<endl
    <<"2. dodaj pytanie  "<<endl
    <<"3. usun pytanie"<<endl
    <<"4. Zobacz Ranking "<<endl
    <<"0. Zakoncz program "<<endl
    <<"__________________________________________________________"<<endl
    <<": ";
    cin>>chose;

        switch(chose)
        {
            case 1:
            {
                cout<<"za chwile rozpocznie sie test";
                Sleep(500);
                cout <<endl;
                string odp;
                int punkty;
                int losowa;

                 wylosuj_numer_pytania(losowa);
                 wczytaj_pytanie(losowa,&odp);

                sprawdz(losowa,odp,&punkty);

                podsumowanie(punkty);

            }

        }
}
int main()
{

start();

return 0;
}

pytania się miały nie powtarzać a się powtarzają funkcja losowania bez powtórzeń napisana jest dobrze w przekazywaniu gdzieś robię błąd ale nie widzę gdzie a przy wpisaniu 20-tej odpowiedzi program się zawiesza już nie mam pomysłów jak to naprawić   

2 odpowiedzi

0 głosów
odpowiedź 22 stycznia 2018 przez j23 Mędrzec (195,240 p.)
  • linia 16: taka konstrukcja powoduje wyciek pamięci - za każdym wywołaniem przydzielasz nową pamięć i jej nie zwalniasz. Oczywiście z racji tego, że za każdym razem jest nowa tablica, nie ma mowy o wykryciu powtórzeń.Tak bym to zrobił:
    int wylosuj_numer_pytania (bool reset = false)
    {
    	static std::unordered_set<int> nums;
    	
    	srand(time(NULL));
    
    	if(reset) nums.clear();
    
    	auto v = nums.insert(rand() % 20 + 1);
    
    	while(v.second == false) { v = nums.insert(rand() % 20 + 1); }
    
    	return *v.first; 
    }

     

  • linia 29: WTF?! Po co to?
  • linia 34: funkcja nic nie zwraca, a powinna.

 

 

0 głosów
odpowiedź 22 stycznia 2018 przez syzmon9 Początkujący (250 p.)
Zerknij sobie na to (od 12:15): https://youtu.be/h2Taf16gQDI?t=735

Podobne pytania

0 głosów
2 odpowiedzi 273 wizyt
+1 głos
1 odpowiedź 388 wizyt
pytanie zadane 25 września 2021 w Python przez m.mate.m Nowicjusz (130 p.)
0 głosów
1 odpowiedź 344 wizyt
pytanie zadane 9 stycznia 2020 w PHP przez franz Gaduła (4,940 p.)

93,382 zapytań

142,381 odpowiedzi

322,539 komentarzy

62,738 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
...