operacje na macierzach

0

Mam taki program który ma za zadanie:

  • wyświetlać w losowej kolejności pytania pobrane z pliku
  • do każdego pytania są 4 warianty odpowiedzi: a, b ,c ,d
  • użytkownik podaje poprawne odpowiedzi
  • jego odpowiedzi są porównywane z wzorem poprawnych odp.
  • wyświetlany jest wynik jaki uzyskał
    w pliku pytania i odpowiedzi zapisywane są kolejno wierszami:
    pytanie1
    p a.warianta1
    n b.warianta1
    n c.warianta1
    p d.warianta1
    pytanie2
    .
    .
    literka "p" lub "n" na początku wiersza określa poprawność odpowiedzi(tą właściwą/ nie wskazaną przez użytkownika)

To mój kod, który przy ostatnim pytaniu wysypuję się błędem:
Debugger Expection Notification:
Project raised expception class _STL::out_of_range with message "Exception Object Address: 0xA44D94A". Process stopped.
__stl_throw_out_of_range("basic_string"); - na tą linię w klasie _string.c wskazuje kompilator

//---------------------------------------------------------------------------

#include <vcl.h>
#include <iostream>
#include <fstream>
#pragma hdrstop
#include <string>

using namespace std;

void losowanie();
void wczytywanie();
void wzor_poprawne();
void wypelnianie();
void odp_uzytk();
void spr_odp();

const int il_pyt=20;
const int il_odp=5;
string tab_pyt[il_pyt][il_odp];
int tab_kol[il_pyt];
bool tab_pop[il_pyt][il_odp-1];
bool tab_odp[il_pyt][il_odp-1];
string tab_odpo[il_pyt];
int wynik;

int main()
{
  losowanie();
  wczytywanie();
  wzor_poprawne();
  //for(int i=0; i<il_pyt; i++)
  //  tab_odpo[i]="abcd";
  wypelnianie();
  odp_uzytk();
  spr_odp();

  cout<<"Twoj wynik: "<<wynik;
  system("pause");
}
void wczytywanie(){
  ifstream plik;
  plik.open( "test.txt", ios::in );
  for (int i=0; i<il_pyt; i++){
    for (int j=0; j<il_odp; j++){
      getline(plik, tab_pyt[i][j]);
    }
  }
  plik.close();
}

void wypelnianie(){
  int a=0;
  char zmienna;
  do{
    for (int i=0; i<il_odp; i++){
      cout<<tab_pyt[tab_kol[a]][i]<<" "<<endl;
    }
    cout<<"Podaj poprawne odpowiedzi(w ciagu, w dowolnej kolejnosci): ";
    cin>>tab_odpo[tab_kol[a]];
    cout<<endl<<"1- nastepne"<<endl;
    do{
      cin>>zmienna;
      system( "cls" );
      if(zmienna=='1'){
        a++;
      }
      else
        cout<<"zly klawisz! 1- nastepne"<<endl;
    }while(zmienna!='1');
  //}while(a<il_pyt-15);
  }while(a<17);
}

void losowanie(){
  // losowanie liczb
  srand (time(NULL));
  for ( int i = 0 ; i < il_pyt; ){
    // wylosowanie liczby
    tab_kol[i] = rand() % il_pyt + 0 ;
    // sprawdzenie, czy się ona nie powtarza
    bool bPowtarzaSie = false ;
    for ( int j = 0 ; j < i; ++j){
      if (tab_kol[j] == tab_kol[i]){
        bPowtarzaSie = true ;
        break ;
      }
    }
    // jeżeli się nie powtarza, przechodzimy do następnej liczby
    if (!bPowtarzaSie) ++i;
  }
}

void wzor_poprawne(){
  for (int i=0; i<il_pyt; i++){
    for (int j=1; j<il_odp; j++){
      string temp(tab_pyt[i][j], 0 , 1);
        if(temp=="p")
          tab_pop[tab_kol[i]][j]= true;
        else
          tab_pop[tab_kol[i]][j]= false;
        tab_pyt[tab_kol[i]][j].replace(0, 2, "");
    }
  }
}

void odp_uzytk(){
  for(int i=0; i<il_pyt; i++){
    for(int j=0; j<il_odp-1; j++){
      //string temp(tab_odpo[i], j , 1);
      string temp= tab_odpo[i].substr(j, 1);
      if(temp=="a")
        tab_odp[tab_kol[i]][0]=true;
      else
        if(temp=="b")
          tab_odp[tab_kol[i]][1]=true;
        else
          if(temp=="c")
            tab_odp[tab_kol[i]][2]=true;
          else
            if(temp=="d")
              tab_odp[tab_kol[i]][3]=true;
    }
  }
}

void spr_odp(){
  int spr=0;
  for(int i=0; i<il_pyt; i++){
    if(spr==3)
      wynik++;
    spr=0;
    for(int j=0; j<il_odp-1; j++){
      if(tab_odp[i][j]==tab_pop[i][j])
        spr++;
    }
  }
}

//---------------------------------------------------------------------------

Byłbym wdzięczny za pomoc w rozwiązaniu problemu

0

Jak program się zatrzyma i pokazuje ci miejsce rzucenia wyjątku, to poszukaj okna "Call stack", które pokazuje w jaki sposób wykonanie doszło do tego miejsca kodu. Następnie pierwszą od góry pozycję wskazującą miejsce w TWOIM kodzie i przeanalizuj to miejsce (podejrzyj wartość zmiennych). Sam wyjątek zgłasza, że wyszedłeś poza zakres stringa (np czytasz znak o ujemnym indeksie lub indeksie większym bądź równym długości string-a).

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0