Probem z usuwaniem rekordu

0

Witam. problem taki. tworze kilka rekordów (studentów), i chce któryś z tych rekordów sobie usunąć. Gdy wybieram, który chce usunąć rekord po id (liczbie), to wywala błąd (wystąpił problem z aplikacją).

pomóżcie, co źle mam w funkcji usuwającej ?

robione w Dev C++ 4.9.9.2

#include <iostream>
#include <string> 
#include <fstream> /// podstawowe biblioteki
using namespace std;

 class Student ///klasa student
{
         public: ///publiczne
         int id; ///zmienna
         public: ///publiczne
         string Imie; ///zmienna
         string Nazwisko; ///zmienna
         int Wiek; ///zmienna
         string Klasa; ///zmienna
};

void dodaj_do_bazy(char *in,Student *s,int n) /// dodawanie studenta do bazy danych 
{ 
         ofstream plik; 
         plik.open(in); ///otwieranie pliku

         for(int i=0;i<n;++i) 
         { 
                 s[i].id = i+1; 
                 plik<<s[i].id<<endl; 
                 cout<<"Podaj imie :\n"; 
                 cin>>s[i].Imie; 
                 plik<<s[i].Imie<<endl; 
                 cout<<"Podaj nazwisko :\n"; 
                 cin>>s[i].Nazwisko; 
                 plik<<s[i].Nazwisko<<endl; 
                 cout<<"Podaj wiek studenta :\n"; 
                 cin>>s[i].Wiek; 
                 plik<<s[i].Wiek<<endl; 
                 cout<<"Podaj klase do jakiej chodzi student :\n"; 
                 cin>>s[i].Klasa; 
                 plik<<s[i].Klasa<<endl; 
                 
                 plik<<"\n\n"; 
         } 
         plik.close(); ///zamykanie pliku
} 


///funkcja liczaca rozmiar tablicy struktur (wyciaga z pliku juz zapisanych studentow) 
///do ktorej wpisujemy dane o studentach 
int rozmiar(char *in) 
{ 
         string Nazwisko , Imie, Klasa; 
         int Wiek , id; 
         
         ifstream plik; 
         plik.open(in); ///otwieranie pliku
         int rozm = 0; 
         
         while(!plik.eof()) 
         { 
                 plik>>id; 
                 plik>>Imie; 
                 plik>>Nazwisko; 
                 plik>>Wiek; 
                 plik>>Klasa; 
                 
                 rozm += 1; 
         } 
         
         plik.close(); ///zamykanie pliku
         return rozm; 
} 

void zpliku(char *in,Student *s,int n) ///funkcja wyciagajaca z pliku studentow do tablicy struktur
{ 
         ifstream plik; 
         plik.open(in); ///otwieranie pliku
         
         for(int i=0;i<n;++i) 
         { 
                 plik>>s[i].id; 
                 plik>>s[i].Imie; 
                 plik>>s[i].Nazwisko; 
                 plik>>s[i].Wiek; 
                 plik>>s[i].Klasa; 
         } 
} 


void wypisz(Student *s,int n) /// funkja wypisujaca wszystkich studentow na ekran
{ 
         for(int i=0;i<n;++i) 
         { 
                 cout<<""<<s[i].id<<endl; 
                 cout<<"Imie :         "<<s[i].Imie<<endl; 
                 cout<<"Nazwisko :     "<<s[i].Nazwisko<<endl; 
                 cout<<"Wiek :         "<<s[i].Wiek<<endl; 
                 cout<<"Klasa :        "<<s[i].Klasa<<endl; 
                 cout<<"-  -  -  -  -  -  -  -  -  -  -  -  -\n"; 
         } 
} 
 

void usun(Student *s,int n,int ktory) /// funkcja usuwajaca studenta z bazy
{ 
         int tmp; 
         for(int i=0;i<n;++i) 
         { 
                 if(i+1 == ktory) 
                 { 
                         tmp = i; 
                 } 
         } 
         
         for(int i=tmp;i<n;++i) 
         { 
                 //s[i] = s[i+1]; 
                 
                 s[i].Imie = s[i+1].Imie; 
                 s[i].Nazwisko = s[i+1].Nazwisko; 
                 s[i].Wiek   = s[i+1].Wiek; 
                 s[i].Klasa  = s[i+1].Klasa; 
         } 
}

int main(int argc,char **argv) 
{ 


         
         int znak;        
         
         ///przykladowa nazwa bazy danych
         argv[1] = "baza.txt"; 
         
         do 
         {///głowna strona po otwarciu progrmu 
         cout<<"**************************************  \n";
         cout<<"* 1. Utworz baze danych (plik)       *  \n";  
         cout<<"* 2. Dodaj studenta                  *  \n"; 
         cout<<"* 3. Przegladaj zapisanych studentow *  \n";  
         cout<<"* 4. Usun studenta z bazy            *  \n";
         cout<<"* 0. Koniec programu                 *  \n";
         cout<<"**************************************  \n";
         cout<<"Co chcesz wybrac ? \n";
         cin>>znak;
         
         
         switch(znak) 
         { 
                 case 1: 
                 { 
                         int n; 
                         cout<<"Ile studentow zapisac w bazie ?\n"; 
                         cin>>n;    
                         Student *s = new Student [n]; 
                         dodaj_do_bazy(argv[1],s,n); 
                         delete [] s; 
                         break; 
                 } 
                 case 2: 
                 { 
                 
                         int ile; 
                         cout<<"Ile studentow chcesz dopisac do bazy ?\n"; 
                         cin>>ile;        
                                         
                         int roz = rozmiar(argv[1])+ile-1; 
                         int rozm = rozmiar(argv[1])-1; 
                         
                                         
                         Student *s = new Student [roz]; 
                         zpliku(argv[1],s,rozm); 
                         
                         for(int i=rozm;i<roz;++i) 
                         { 
                                 s[i].id = i+1; 
                                 cout<<"Podaj imie :\n"; 
                                 cin>>s[i].Imie; 
                                 cout<<"Podaj nazwisko :\n"; 
                                 cin>>s[i].Nazwisko; 
                                 cout<<"Podaj wiek studenta :\n"; 
                                 cin>>s[i].Wiek; 
                                 cout<<"Podaj klase do jakiej chodzi student :\n"; 
                                 cin>>s[i].Klasa; 
                         } 
                 
                         ofstream plik; 
                         plik.open(argv[1]); 
                         for(int i=0;i<roz;++i) 
                         { 
                                 plik<<s[i].id<<endl; 
                                 plik<<s[i].Imie<<endl; 
                                 plik<<s[i].Nazwisko<<endl; 
                                 plik<<s[i].Wiek<<endl; 
                                 plik<<s[i].Klasa<<endl; 
                                 plik<<"\n\n"; 
                         } 
                         plik.close(); 
                         delete [] s; 
                         break; 
                 } 
                 case 3: 
                 { 
                         cout<<"Studenci w bazie :\n\n"; 
                                                 
                         int n = rozmiar(argv[1])-1; 
                         Student *s = new Student [n]; 
                         zpliku(argv[1],s,n); 
                         wypisz(s,n); 
                         
                         delete [] s; 
                         break; 
                 } 
         
                 case 4: 
                 { 
                 
                         int n = rozmiar(argv[1])-1; 
                         Student *s = new Student [n]; 
                         zpliku(argv[1],s,n); 
                 
                         int ktory; 
                         cout<<"Ktorego studenta usunac z bazy ?\n"; 
                         cin>>ktory; 
                         usun(s,n,ktory); 
                         
                         ofstream plik; 
                         plik.open(argv[1]); 
                         for(int i=0;i<n-1;++i) 
                         { 
                                 plik<<s[i].id<<endl; 
                                 plik<<s[i].Imie<<endl; 
                                 plik<<s[i].Nazwisko<<endl; 
                                 plik<<s[i].Wiek<<endl; 
                                 plik<<s[i].Klasa<<endl; 
                                 plik<<"\n\n"; 
                         } 
                         plik.close(); ///zamykanie pliku
                         
                         delete [] s; 
                         break; 
                 } 
                 
                 case 0: 
                 { 
                         cout<<"Dziekuje! ;"; 
                 
                         //break; ///powrót
                 } 
         } 
         }while(znak != 0); 
         
         
         return 0; 
}
0

Ukradli ci debuger jak rozumiem?

for(int i=tmp;i<n;++i)
{ 
    s[i].Imie = s[i+1].Imie; 
}
  • warunek pętli mówi że i<n, czyli maksymalnie i=n-1
  • kod w pętli mówi s[i+1] czyli maksymalnie s[n], a ta tablica nie ma takiego rozmiaru, w efekcie wychodzisz poza zakres i aplikacja się kładzie

Poza tym rozumiem że wg ciebie łatwiej przesunać wszystkie rekordy w bazie o jeden w tył, niż zamienić ostatni element z usuwanym?

  • znajdujesz element usuwany
  • przepisujesz dane z ostatniego elementu do tego usuwanego (czyli efektywnie go usuwasz)
  • skaracasz tablicę o ostatni element
  • voila ;]

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