W ramach przećwiczenia paru z programowania napisałem implementację prostej relacyjnej bazy danych. Prosiłbym abyście napisali czy dałoby się to zrobić jakoś lepiej. Wiem, że pewnie użycie zmiennych globalnych i nazw po polsku pewnie dla niektórych będzie czymś kiepskim, choć wydaje mi się, że w tym przypadku było to nieco wygodniejsze rozwiązanie.
#include <iostream>
#include <fstream>
#include <vector>
#include <stdlib.h>
using namespace std;
struct Osoba
{
int IdOsoby;
string Nazwisko;
Osoba(){}
Osoba(int Id, string Naz):IdOsoby(Id), Nazwisko(Naz){}
};
struct Przedmiot
{
int IdPrzedmiotu;
string Nazwa;
Przedmiot(){}
Przedmiot(int Id, string Naz):IdPrzedmiotu(Id), Nazwa(Naz){}
};
struct Przydzial
{
int IdOsoby, IdPrzedmiotu, IdPrzydzialu;
Przydzial(){}
Przydzial(int Osoba, int Przedmiot, int Przydzial):IdOsoby(Osoba), IdPrzedmiotu(Przedmiot), IdPrzydzialu(Przydzial){}
};
fstream Osoby, Przedmioty, Przydzialy;
vector<Osoba>TOsoby;
vector<Przedmiot>TPrzedmioty;
vector<Przydzial>TPrzydzialy;
void OtworzOsoby()
{
Osoby.open("Osoby.txt", ios::in);
string Linia, Tmp;
while(getline(Osoby, Linia))
{
TOsoby.push_back(Osoba());
for(unsigned i=0;i<Linia.size();++i)
{
if(Linia[i] == ';')
{
TOsoby[TOsoby.size()-1].IdOsoby = atoi(Tmp.c_str());
Tmp.clear();
}
else Tmp+=Linia[i];
}
TOsoby[TOsoby.size()-1].Nazwisko = Tmp;
Tmp.clear();
}
Osoby.close();
}
void OtworzPrzedmioty()
{
Przedmioty.open("Przedmioty.txt", ios::in);
string Linia, Tmp;
while(getline(Przedmioty, Linia))
{
TPrzedmioty.push_back(Przedmiot());
for(unsigned i=0; i<Linia.size(); ++i)
{
if(Linia[i] == ';')
{
TPrzedmioty[TPrzedmioty.size()-1].IdPrzedmiotu = atoi(Tmp.c_str());
Tmp.clear();
}
else Tmp+=Linia[i];
}
TPrzedmioty[TPrzedmioty.size()-1].Nazwa = Tmp;
Tmp.clear();
}
Przedmioty.close();
}
void DodajOsobe()
{
int Id;
string Nazwisko;
cout<<"Podaj id: ";
cin>>Id;
cout<<"Podaj nazwisko: ";
cin>>Nazwisko;
TOsoby.push_back(Osoba(Id, Nazwisko));
}
void DodajPrzedmiot()
{
int Id;
string Nazwa;
cout<<"Podaj id: ";
cin>>Id;
cout<<"Podaj nazwe: ";
cin>>Nazwa;
TPrzedmioty.push_back(Przedmiot(Id, Nazwa));
}
void DodajPrzydzial()
{
int IdOsoby, IdPrzedmiotu, IdPrzydzialu;
cout<<"Podaj id osoby: ";
cin>>IdOsoby;
cout<<"Podaj id przedmiotu: ";
cin>>IdPrzedmiotu;
cout<<"Podaj id przydzialu: ";
cin>>IdPrzydzialu;
TPrzydzialy.push_back(Przydzial(IdOsoby, IdPrzedmiotu, IdPrzydzialu));
}
void OtworzPrzydzialy()
{
Przydzialy.open("Przydzialy.txt", ios::in);
string Linia, Tmp;
char nr = 0;
while(getline(Przydzialy, Linia))
{
TPrzydzialy.push_back(Przydzial());
for(unsigned i=0; i<Linia.size(); ++i)
{
if(Linia[i] == ';')
{
++nr;
switch(nr)
{
case 1:
TPrzydzialy[TPrzydzialy.size()-1].IdOsoby = atoi(Tmp.c_str());
break;
case 2:
TPrzydzialy[TPrzydzialy.size()-1].IdPrzedmiotu = atoi(Tmp.c_str());
break;
default:
cout<<"Blad.\n";
break;
}
Tmp.clear();
}
else Tmp+=Linia[i];
}
TPrzydzialy[TPrzydzialy.size()-1].IdPrzydzialu = atoi(Tmp.c_str());
Tmp.clear();
nr = 0;
}
Przydzialy.close();
}
void ZapiszOsoby()
{
Osoby.open("Osoby.txt", ios::out|ios::trunc);
for(const auto i:TOsoby)
Osoby<<i.IdOsoby<<";"<<i.Nazwisko<<"\n";
Osoby.close();
}
void ZapiszPrzydzialy()
{
Przydzialy.open("Przydzialy.txt", ios::out|ios::trunc);
for(const auto i:TPrzydzialy)
Przydzialy<<i.IdOsoby<<";"<<i.IdPrzedmiotu<<";"<<i.IdPrzydzialu<<"\n";
Przydzialy.close();
}
void ZapiszPrzedmioty()
{
Przedmioty.open("Przedmioty.txt", ios::out|ios::trunc);
for(const auto i:TPrzedmioty)
Przedmioty<<i.IdPrzedmiotu<<";"<<i.Nazwa<<"\n";
Przedmioty.close();
}
void UsunOsobe()
{
int nr = 0, j = 0;
cout<<"Podaj numer osoby do usuniecia: ";
cin>>nr;
for(auto i:TOsoby)
{
if(i.IdOsoby == nr)
{
TOsoby.erase(TOsoby.begin()+j);
cout<<"Usunieto.\n";
return;
}
++j;
}
cout<<"Nie znaleziono osoby o podanym id.\n";
}
void UsunPrzedmiot()
{
int nr = 0, j = 0;
cout<<"Podaj numer przedmiotu do usuniecia: ";
cin>>nr;
for(auto i:TPrzedmioty)
{
if(i.IdPrzedmiotu == nr)
{
TPrzedmioty.erase(TPrzedmioty.begin()+j);
cout<<"Usunieto.\n";
return;
}
++j;
}
cout<<"Nie znaleziono przedmiotu o podanym id.\n";
}
void UsunPrzydzial()
{
int nr = 0, j = 0;
cout<<"Podaj numer przydzialu do usuniecia: ";
cin>>nr;
for(auto i:TPrzydzialy)
{
if(i.IdPrzydzialu == nr)
{
TPrzydzialy.erase(TPrzydzialy.begin()+j);
cout<<"Usunieto.\n";
return;
}
++j;
}
cout<<"Nie znaleziono przydzialu o podanym id.\n";
}
void PokazOsobyZDanymPrzedmiotem()
{
bool Znaleziono = false;
int Id = 0;
cout<<"Podaj id przedmiotu: ";
cin>>Id;
for(auto i:TPrzedmioty)
{
if(i.IdPrzedmiotu == Id)
{
Znaleziono = true;
break;
}
}
if(!Znaleziono)
{
cout<<"Nie ma przedmiotu o podanym id.\n";
return;
}
for(auto i:TPrzydzialy)
{
if(Id == i.IdPrzedmiotu)
{
for(auto j:TOsoby)
{
if(j.IdOsoby == i.IdOsoby) cout<<j.Nazwisko<<"\n";
}
}
}
cout<<"\n";
}
void PokazPrzedmiotyDanejOsoby()
{
bool Znaleziono = false;
int Id = 0;
cout<<"Podaj id osoby: ";
cin>>Id;
for(auto i:TOsoby)
{
if(i.IdOsoby == Id)
{
Znaleziono = true;
break;
}
}
if(!Znaleziono)
{
cout<<"Nie ma osoby o podanym id.\n";
return;
}
for(auto i:TPrzydzialy)
{
if(Id == i.IdOsoby)
{
for(auto j:TPrzedmioty)
{
if(j.IdPrzedmiotu == i.IdPrzedmiotu) cout<<j.Nazwa<<"\n";
}
}
}
cout<<"\n";
}
void PokazOsoby()
{
for(const auto i:TOsoby)
cout<<"Id: "<<i.IdOsoby<<"\nNazwisko: "<<i.Nazwisko<<"\n";
cout<<"\n";
}
void PokazPrzydzialy()
{
for(const auto i:TPrzydzialy)
cout<<"Id osoby: "<<i.IdOsoby<<"\nId przedmiotu: "<<i.IdPrzedmiotu<<"\nId przydzialu: "<<i.IdPrzydzialu<<"\n";
cout<<"\n";
}
void PokazPrzedmioty()
{
for(const auto i:TPrzedmioty)
cout<<"Id: "<<i.IdPrzedmiotu<<"\nNazwa: "<<i.Nazwa<<"\n";
cout<<"\n";
}
void PokazMenu()
{
cout<<"0-Pokaz Osoby.\n1-Pokaz przedmioty.\n2-Pokaz Przydzialy.\n3-Usun osobe.\n4-Usun przedmiot.\n5-Usun przydzial.\n";
cout<<"6-Dodaj osobe.\n7-Dodaj przedmiot.\n8-Dodaj przydzial.\n9-Pokaz przedmioty danej osoby.\na-Pokaz osoby posiadajace dany przedmiot.";
cout<<"\nb-Pokaz menu.\nc-Wyjscie z zapisaniem danych.\nd-Wyjscie bez zapisania danych.\n";
}
void ZapiszZmiany()
{
ZapiszOsoby();
ZapiszPrzedmioty();
ZapiszPrzydzialy();
}
int main()
{
PokazMenu();
char opcja = 0, wybor = 0;
OtworzOsoby();
OtworzPrzedmioty();
OtworzPrzydzialy();
for(;;)
{
cout<<"Wybierz opcje: ";
cin>>opcja;
switch(opcja)
{
case '0':
PokazOsoby();
break;
case '1':
PokazPrzedmioty();
break;
case '2':
PokazPrzydzialy();
break;
case '3':
UsunOsobe();
break;
case '4':
UsunPrzedmiot();
break;
case '5':
UsunPrzydzial();
break;
case '6':
DodajOsobe();
break;
case '7':
DodajPrzedmiot();
break;
case '8':
DodajPrzydzial();
break;
case '9':
PokazPrzedmiotyDanejOsoby();
break;
case 'a':
PokazOsobyZDanymPrzedmiotem();
break;
case 'b':
PokazMenu();
break;
case 'c':
ZapiszZmiany();
return 0;
case 'd':
cout<<"Czy na pewno porzucic zmiany(t-tak)?";
cin>>wybor;
if(wybor == 't') return 0;
break;
default:
cout<<"Nie ma takiej opcji.\n";
break;
}
}
return 0;
}
OtworzOsoby
,OtworzPrzedmioty
iOtworzPrzedzialy
. Kod jest identyczny ;)