Problem z zadaniem "Baza danych" C++

0

Witam mam bardzo pilny problem, otóż mam do dokończenia projekt bazy danych w C++. Jednak zaciąłem się w pewnym miejscu i brakuje mi pomysłów.
Jeśli ktoś byłby w stanie mi pomóc, będę bardzo wdzięczny. Program ma czytać dane i zapisywać do pliku, ma być możliwa edycja, usuwanie, sortowanie, przeglądanie, nadpisywanie i inne rzeczy które są w kodzie. Postanowiłem zrobić to za pomocą vektorów, jednak jest jakiś problem. Wklejam swój kod:

#include <iostream>
#include <string>
#include <cstdio>
#include <fstream>
#include <windows.h>
#include <sstream>
#include <vector>
#include <cstdio>
#include <conio.h>

using namespace std;


class zawodnik
{
public:
string imie;
string nazwisko;
int wiek;
int zawwaga;
int wzrost;
string klub;

string getimie();
string getnazwisko();
int getwiek();
int getzawwaga();
int getwzrost();
string getklub();
};

class bazazawodnicy:public zawodnik
{
    public:
int ilosc;
int ilosc_szuk; //zmienna tymczasowa - uzywana do przechowywania informacji o ilosci znalezionych zawodnikow
vector<zawodnik> zawodnicy;
vector<zawodnik> zawodnicy_szuk; // zmienna tymczasowa - uzywana do przechowywania posortowanych/wyszukanych zawodnikow
int getilosc();
int getilosc_szuk();
void usunelement(int nr);
void wyszukajwiek(int liczba);
void wyszukajnazw(string nazwisko);

void usunelementy(int nrstart, int nrkoniec);
void dodajelement(string aimie, string anazwisko, int awiek, int azawwaga, int awzrost, string aklub);
void zapisz_zawodnicy(string nazwabazy);
void getinfo(int index);
void drukujwszystko();
void sortujnazw();
void sortujwiek();
void wyczyscwszystko();
void otworz_plik_zawodnicy(string nazwabazy);


};


string int_na_string(int wartosc) //funkcja string zamieniajaca int na string(potrzebne przy wpisywaniu wartosci int do tablicy stringow zeby uniknac dziwnych znaczkow
{
ostringstream ss;
ss << wartosc;
string str = ss.str();
return str;
}

    void bazazawodnicy::zapisz_zawodnicy(string nazwabazy)
    {
    string sciezka = nazwabazy + ".txt";
    ofstream zapis(sciezka.c_str());
    for(int i=0; i<ilosc; i++)
    {

zapis<<zawodnicy[i].getimie();
zapis<<"#";
zapis<<zawodnicy[i].getnazwisko();
zapis<<"#";
zapis<<zawodnicy[i].getwiek();
zapis<<"#";
zapis<<zawodnicy[i].getzawwaga();
zapis<<"#";
zapis<<zawodnicy[i].getwzrost();
zapis<<"#";
zapis<<zawodnicy[i].getklub();
zapis<<endl;
}
zapis.close();

}


string zawodnik::getimie()
{
return imie;
}

string zawodnik::getnazwisko()
{
return nazwisko;
}

int zawodnik::getwiek()
{
return wiek;
}

int zawodnik::getzawwaga()
{
return zawwaga;
}

int zawodnik::getwzrost()
{
return wzrost;
}

string zawodnik::getklub()
{
return klub;
}

/*
vector<zawodnik> bazazawodnicy::getinfo(int index)
{
return zawodnicy[index];
}
*/

            void bazazawodnicy::drukujwszystko()
            {
            for(int i=0; i<=ilosc; i++)
            {
            cout<<"Zawodnik nr."<<i<<endl;
            cout<<"Imie: "<<zawodnicy[i].getimie()<<endl;
            cout<<"Nazwisko: "<<zawodnicy[i].getnazwisko()<<endl;
            cout<<"Wiek: "<<zawodnicy[i].getwiek()<<endl;
            cout<<"Waga: "<<zawodnicy[i].getzawwaga()<<endl;
            cout<<"Wzrost: "<<zawodnicy[i].getwzrost()<<endl;
            cout<<"Klub: "<<zawodnicy[i].getklub()<<endl<<endl;
            }
            }

    void bazazawodnicy::sortujnazw()
    {
    zawodnicy_szuk = zawodnicy;
    //sort(zawodnicy_szuk.begin(), zawodnicy_szuk.end(), [](const zawodnik& lhs, const zawodnik& rhs){ return lhs.nazwisko < rhs.nazwisko; });
    }

void bazazawodnicy::sortujwiek()
{
zawodnicy_szuk = zawodnicy;
//zawodnicy_szuk.sort(objs.begin(), objs.end(), [](const zawodnik& lhs, const zawodnik& rhs){ return lhs.wiek < rhs.wiek; });
}



int bazazawodnicy::getilosc()
{
return ilosc;
}

int bazazawodnicy::getilosc_szuk()
{
return ilosc_szuk;
}

void bazazawodnicy::wyczyscwszystko()
{

zawodnicy.clear();
ilosc = 0;

}
void bazazawodnicy::wyszukajwiek(int liczba)
{

for(int i=0; i<=ilosc; i++)
{
if(zawodnicy[i].wiek == liczba)
{

zawodnicy_szuk[ilosc_szuk] = zawodnicy[i];
ilosc_szuk++;

}
}

}


void bazazawodnicy::usunelement(int nr)
{
zawodnicy.erase(zawodnicy.begin() + nr);
}

void bazazawodnicy::usunelementy(int nrstart, int nrkoniec)
{
zawodnicy.erase(zawodnicy.begin() + nrstart, zawodnicy.begin() + nrkoniec);
}

void bazazawodnicy::dodajelement(string aimie, string anazwisko, int awiek, int azawwaga, int awzrost, string aklub)
{
zawodnik zaw;
zaw.imie = aimie;
zaw.nazwisko = anazwisko;
zaw.wiek = awiek;
zaw.zawwaga = azawwaga;
zaw.wzrost = awzrost;
zaw.klub = aklub;
zawodnicy[ilosc] = zaw;
ilosc++;
}



void bazazawodnicy::otworz_plik_zawodnicy(string nazwabazy)
{
int il=-1, nazw=0; //il - ilosc elementow / nazw - index aktualnie przyjmowanej danej(np. [0] - nazwa_)
ifstream plik;
string sciezka = nazwabazy + ".txt";
plik.open(sciezka.c_str()); //otwieranie pliku z baza

string linia = ""; //zmienna do ktorej zapisywane beda kolejne linie dokumentu pliku
do
{
il++;
nazw=0;
getline(plik,linia);
istringstream ilinia(linia);
string dana; //zmienna do ktorej zapisywane beda kolejne dane z linii(elementu) oddzielone znakiem #


getline(ilinia, dana, '#');
zawodnicy[ilosc].imie = dana;
getline(ilinia, dana, '#');
zawodnicy[ilosc].nazwisko = dana;
getline(ilinia, dana, '#');
zawodnicy[ilosc].wiek = atoi(dana.c_str());
getline(ilinia, dana, '#');
zawodnicy[ilosc].zawwaga = atoi(dana.c_str());
getline(ilinia, dana, '#');
zawodnicy[ilosc].wzrost = atoi(dana.c_str());
getline(ilinia, dana, '#');
zawodnicy[ilosc].klub = dana;




}while(!plik.eof());
ilosc=il;
}




void wyswietl()
{
int nr=0;

}


int main()
{

bazazawodnicy baza;
int menu;

string nazwa;
string imie;
string nazwisko;
int wiek;
int zawwaga;
int wzrost;
string klub;
string imietrenera;
int ilosc=0;
int nr=0;

do{


system("cls");





cout << "1 - Wprowadz dane" << endl;
cout << "2 - Wyswietl/Edytuj dane" << endl;
cout << "3 - Zapisz aktualny stan bazy" << endl;
cout << "4 - Nadpisz stara baze" << endl;
cout << "5 - Wyszukaj..." << endl;
cout << "6 - Wyjdz" << endl;

cout<<endl<<"Wybierz opcje: ";

cin>>menu;
if (menu == 6)
{
break;
}
switch(menu)
{

case 1:

cout<<"Imie: "; // uzytkownik podaje IMIE
cin>>imie;
cout<<"Nazwisko: "; // uzytkownik podaje Nazwisko
cin>>nazwisko;
cout<<"Wiek: ";
cin >> wiek;
while(std::cin.fail()) { //jezeli dana nie jest liczba
cout <<"Wprowadz LICZBE: ";
cin.clear();
cin.ignore(256,'\n');
cin >> wiek;
}

cout<<"Waga(kg): "; // uzytkownik podaje wage
cin >> zawwaga;
while(std::cin.fail()) {
cout <<"Wprowadz LICZBE: ";
cin.clear();
cin.ignore(256,'\n');
cin >> zawwaga;
}

cout<<"Wzrost(cm): ";
cin >> wzrost;
while(std::cin.fail()) {
cout <<"Wprowadz LICZBE: ";
cin.clear();
cin.ignore(256,'\n');
cin >> wzrost;
}

cout<<"Nazwa klubu: "; // uzytkownik podaje IMIE
cin>>klub;
cout<<"Imie Trenera: "; // uzytkownik podaje Nazwisko
cin>>imietrenera;

//wpisywanie otrzymanych danych do tablicy

baza.dodajelement(imie,nazwisko,wiek,zawwaga,wzrost,klub);

ilosc++; //powiekszanie o 1 zmiennej okreslajacej aktualna ilosc elementow
cout<<"Nowy zawodnik zostal dodany do bazy!";
system("pause");


break;

case 2:

int menuu;

do
{
system("cls");
cout<<"Element nr."<<nr+1<<":"<<endl;
/*
cout<<"Imie: "<<zawodnicy[nr][0]<<endl;
cout<<"Nazwisko: "<<zawodnicy[nr][1]<<endl;
cout<<"Wiek: "<<zawodnicy[nr][2]<<endl;
cout<<"Waga: "<<zawodnicy[nr][3]<<endl;
cout<<"Wzrost: "<<zawodnicy[nr][4]<<endl;
cout<<"Nazwa klubu: "<<zawodnicy[nr][5]<<endl;
cout<<endl<<"1 - Nastepny"<<endl;
cout<<"2 - Poprzedni"<<endl;
cout<<"3 - Usun"<<endl;
cout<<"4 - Powrot"<<endl;
*/
baza.drukujwszystko();
cout<<"Wybierz opcje: ";
cin>>menuu;
switch(menuu)
{
case 1:
if(nr<ilosc)nr++; //jezeli nr jest mniejszy od ilosc elementow wyswietl nastepny element(nr++)
break;
case 2:
if(nr>0) nr--; //jezeli nr jest wiekszy od 0 wyswietl poprzedni element(nr--)
break;
case 3:
baza.usunelement(nr);
break;
case 4:
baza.usunelement(nr);
}
}while(menuu!=4);

break;

case 3:
baza.zapisz_zawodnicy(nazwa);
break;

case 4:
baza.wyczyscwszystko();

baza.dodajelement(imie,nazwisko,wiek,zawwaga,wzrost,klub);

break;

case 5:
//wyszukaj();
break;

// case 6:
// break;
}
}while(menu!=6);


return 0;
}

0

Jaki to dokładnie problem?

0

Podczas uruchomienia i chęci dodania nowego zawodnika do bazy wywala cały program

0
vampirr napisał(a):

Podczas uruchomienia i chęci dodania nowego zawodnika do bazy wywala cały program

Z czego to widzę, to nie wrzucasz nowego elementu do vectora z zawodnikami. Wrzuć pusty element push_backiem, następnie odwołuj się do elementu o indeksie [zawodnicy.size()-1]. BTW. Ja tego typu program zrobiłbym w ten sposób: https://4programmers.net/Forum/Off-Topic/Oceny_i_recenzje/289753-kod_programu_na_zaliczenie?p=1361268#id1361268 Nie jest idealny, ale działa jak trzeba. No i są wypowiedzi innych, które opisują co trzeba poprawić.

0
amb00 napisał(a):
vampirr napisał(a):

Podczas uruchomienia i chęci dodania nowego zawodnika do bazy wywala cały program

Z czego to widzę, to nie wrzucasz nowego elementu do vectora z zawodnikami. Wrzuć pusty element push_backiem, następnie odwołuj się do elementu o indeksie [zawodnicy.size()-1]. BTW. Ja tego typu program zrobiłbym w ten sposób: https://4programmers.net/Forum/Off-Topic/Oceny_i_recenzje/289753-kod_programu_na_zaliczenie?p=1361268#id1361268 Nie jest idealny, ale działa jak trzeba. No i są wypowiedzi innych, które opisują co trzeba poprawić.

Dalej nie rozumiem, czy mógłbyś pomóc mi edytować ten program żeby działał jak należy?

1

@vampirr: Ja bym to zrobił tak:

void bazazawodnicy::dodajelement(string aimie, string anazwisko, int awiek, int azawwaga, int awzrost, string aklub)
{
zawodnicy.push_back(zawodnik());
zawodnicy[zawodnicy.size()-1].imie = aimie;
zawodnicy[zawodnicy.size()-1].nazwisko = anazwisko;
zawodnicy[zawodnicy.size()-1].wiek = awiek;
zawodnicy[zawodnicy.size()-1].zawwaga = azawwaga;
zawodnicy[zawodnicy.size()-1].wzrost = awzrost;
zawodnicy[zawodnicy.size()-1].klub = aklub;
}

Wywal zmienną ilość, ponieważ masz metodę size() od sprawdzenia ilości elementów w vectorze. Moje rozwiązanie jest brzydkie, ale aby je poprawić, trzeba by było zrobić odpowiedni konstruktor w klasie zawodnik. Od razu mówię, że nie testowałem tego, ale na pewno push_back jest potrzebny jak chcesz dodać nowy element.

0
amb00 napisał(a):

@vampirr: Ja bym to zrobił tak:

void bazazawodnicy::dodajelement(string aimie, string anazwisko, int awiek, int azawwaga, int awzrost, string aklub)
{
zawodnicy.push_back(zawodnik());
zawodnicy[zawodnicy.size()-1].imie = aimie;
zawodnicy[zawodnicy.size()-1].nazwisko = anazwisko;
zawodnicy[zawodnicy.size()-1].wiek = awiek;
zawodnicy[zawodnicy.size()-1].zawwaga = azawwaga;
zawodnicy[zawodnicy.size()-1].wzrost = awzrost;
zawodnicy[zawodnicy.size()-1].klub = aklub;
}

Wywal zmienną ilość, ponieważ masz metodę size() od sprawdzenia ilości elementów w vectorze. Moje rozwiązanie jest brzydkie, ale aby je poprawić, trzeba by było zrobić odpowiedni konstruktor w klasie zawodnik. Od razu mówię, że nie testowałem tego, ale na pewno push_back jest potrzebny jak chcesz dodać nowy element.

Pomożesz mi z resztą mojego programu? Bo teraz mi nie wywala programu ale za to nie działa reszta, pogubiłem sie już totalnie a jestem raczej trochę zielony a muszę mieć to szybko zrobione. Odwdzięczę się jakoś na pewno ;)

0
vampirr napisał(a):
amb00 napisał(a):

@vampirr: Ja bym to zrobił tak:

void bazazawodnicy::dodajelement(string aimie, string anazwisko, int awiek, int azawwaga, int awzrost, string aklub)
{
zawodnicy.push_back(zawodnik());
zawodnicy[zawodnicy.size()-1].imie = aimie;
zawodnicy[zawodnicy.size()-1].nazwisko = anazwisko;
zawodnicy[zawodnicy.size()-1].wiek = awiek;
zawodnicy[zawodnicy.size()-1].zawwaga = azawwaga;
zawodnicy[zawodnicy.size()-1].wzrost = awzrost;
zawodnicy[zawodnicy.size()-1].klub = aklub;
}

Wywal zmienną ilość, ponieważ masz metodę size() od sprawdzenia ilości elementów w vectorze. Moje rozwiązanie jest brzydkie, ale aby je poprawić, trzeba by było zrobić odpowiedni konstruktor w klasie zawodnik. Od razu mówię, że nie testowałem tego, ale na pewno push_back jest potrzebny jak chcesz dodać nowy element.

Pomożesz mi z resztą mojego programu? Bo teraz mi nie wywala programu ale za to nie działa reszta, pogubiłem sie już totalnie a jestem raczej trochę zielony a muszę mieć to szybko zrobione. Odwdzięczę się jakoś na pewno ;)

Dla mnie to trochę czarna magia, mógłbyś mi bardziej pomoc?

1

Propozycje:

  • Usuń zbędne metody z klasy zawodnik. Wszystkie składowe masz publiczne, więc akcesory nie są Ci potrzbne
  • Dodaj do klasy zawodnik funkcje serializującą/deserializująca oraz wyświetlającą.
  • Usuń dziedziczenie w klasie bazazawodnikow, bo nie ma najmniejszego sensu. W tym momencie baza ma imię, nazwisko, wiek...
  • zamiast kopiować cały wektor z zawodnikami podczas sortowania, utwórz wektor indeksów i sortuj wyłącznie indeksy
  • Niech funkcja dodająca zawodnika do bazy przyjmuje instancję klasy zawodnik a nie listę jej składowych zmiennych
  • Nazewnictwo jak dla mnie trochę nie halo. Skoro klasa nazywa się bazazawodnikow to jej metody powinny być nazwane prosto dodaj, usun, zapisz, etc. Po co nazywać to dodajelement czy zapisz_zawodnicy. Skoro działasz na obiekcie klasy bazazawodnikow to wiadomo, że metoda dodaj dodaje zawodnika a nie marchewki czy czereśnie ;)

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