Dzień dobry. Mam napisaną bazę danych lecz nie potrafię dodać opcji usuwania studenta na zasadzie: podaj indeks studenta, którego chcesz usunąć.
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <vector>
#include <algorithm>
#include <fstream>
#include <string>
#define N 100
#define OB 5
int n=0; //ilosc elementow w aktualnej tablicy
//proba
using namespace std;
struct student{
string imie;
string nazwisko;
string indeks;
string obecnosci;
string wydzial;
string kierunek;
float spr_01;
float spr_02;
};
//student tab[N];
vector <student> tab;
vector <student> tab2;
vector <student> tab3;//studenci niekwalifikowani
vector <student> tab4;//studenci kwalifikowani
vector <student> tab5;//stypendium
string pobierz_tekst(string pytanie){
string napis;
do{
cout<<pytanie;
cin>>napis;
}while(napis=="");
return napis;
}
string pobierz_indeks(string pytanie, vector <student> t){
string napis;
int ret; //czy indeks jest w bazie
do{
cout<<pytanie;
cin>>napis;
ret = 1;
for (int i=0;i<tab.size();i++)
if(t.indeks==napis)
{
ret=0;
cout<<"Podany indeks jest w bazie. Podaj jeszcze raz!!!"<<endl;
break;
}
}while(napis==""||ret==0);
return napis;
}
string pobierz_obecnosci(string pytanie)
{
string napis, tmp;
int ret;
do{
ret = 1;
napis = pobierz_tekst(pytanie);
if (napis.length()!=OB)
{
cout<<"Podaj poprawna ilosc obecnosci!!!"<<endl;
ret = 0;
continue;
}
for (int i=0;i<napis.length();i++)
{
tmp = napis.substr(i,1);
if (!(tmp=="+"||tmp=="-"))
{
cout<<"Zanleziono niepoprawny znak. Wpisz jeszcze raz!!!"<<endl;
ret = 0;
break;
}
}
}while (ret==0);
return napis;
}
float pobierz_punkty(string pytanie)
{
string napis;
float liczba = 0.0;
while(1){
cout<<pytanie;
cin>>napis;
if(napis.compare("0")==0) return 0.0;
liczba = atof(napis.c_str());
if (liczba==0) continue;
if (liczba<=12) return liczba;
}
return liczba;
}
student dodaj(void)
{
student st;
st.imie = pobierz_tekst("Imie: ");
st.nazwisko = pobierz_tekst("Nazwisko: ");
st.wydzial = pobierz_tekst("Wydzial: ");
st.kierunek = pobierz_tekst("Kierunek: ");
st.indeks = pobierz_indeks("Indeks: ", tab);
st.obecnosci = pobierz_obecnosci("Obecnosci: ");
st.spr_01 = pobierz_punkty("Punkty spr1: ");
st.spr_02 = pobierz_punkty("Punkty spr2: ");
return st;
}
void wyswietl(student st)
{
cout<<"Imie: "<<st.imie<<" Nazwisko: "<<st.nazwisko<<"Wydzial: "<<st.wydzial<<"Kierunek: "<<st.kierunek<<" Indeks: "<<st.indeks<<" Obecnosci: "<<st.obecnosci<<" Spr1: "<<st.spr_01<<" Spr2: "<<st.spr_02<<endl;
}
bool porownaj_nazwiska(student s1, student s2)
{
if (s1.nazwisko < s2.nazwisko) return true;
if (s1.nazwisko > s2.nazwisko) return false;
if (s1.imie < s2.imie) return true;
if (s1.imie > s2.imie) return false;
if (s1.indeks < s2.indeks) return true;
if (s1.indeks > s2.indeks) return false;
}
int wyszukaj(vector <student> t, string indeks, int &ret)
{
ret = 0;
for (int i=0;i<tab.size();i++)
if (t.indeks==indeks){
ret = 1;
return i;
}
return NULL;
}
vector <string> split(string linia, string sep)
{
vector <string> result;
string wyraz = "";
string znak;
linia = linia+sep;
for(int i=0;i<linia.length();i++)
{
znak = linia;
if(znak==sep)
{
result.push_back(wyraz);
wyraz = "";
continue;
}
wyraz = wyraz+znak;
}
return result;
}
vector <student> odczyt_pliku(string nazwa)
{
fstream plik;
vector <student> tab;
student st;
string linia, imie, nazwisko, indeks, obecnosci, spr1, spr2, tmp1, tmp2;
vector <string> v1,v2;
plik.open(nazwa.c_str(), ios::in);
if (plik.good()==true)
{
while (getline(plik, linia))
{
//oceny
v1 = split(linia,")");
linia = v1[0];
v1 = split(linia,"(");
if (v1.size()!=2)continue;
tmp1 = v1[0];//reszte linijki do ocen
tmp2 = v1[1];//oceny
v1 = split(tmp2,",");
if (v1.size()!=2) continue;
spr1 = v1[0];
spr2 = v1[1];
v1 = split(tmp1," ");
int dl=v1.size();
if (dl<4) continue;
obecnosci = v1[dl-2];
indeks = v1[dl-3];
nazwisko = v1[dl-4];
imie = "";
for (int i=0;i<dl-4;i++)
{
if (i==0) imie=v1;
else imie=imie+" "+v1;
}
st.imie=imie;
st.nazwisko=nazwisko;
st.indeks=indeks;
st.obecnosci=obecnosci;
st.spr_01 = atof(spr1.c_str());
st.spr_02 = atof(spr2.c_str());
tab.push_back(st);
}
plik.close();
}
else cout<<"Brak dostepu do pliku!!!"<<endl;
return tab;
}
void zapis_pliku(vector <student> tab, string nazwa)
{
fstream plik;
plik.open(nazwa.c_str(), ios::out);
if (plik.good()==true)
{
for (int i=0;i<tab.size();i++)
{
plik<<tab.imie<<" "<<tab.nazwisko<<" "<<tab.indeks<<" "<<tab.obecnosci<<" ("<<tab.spr_01<<", "<<tab.spr_02<<")"<<endl;
}
plik.close();
}
else cout<<"Brak dostepu do pliku!!!"<<endl;
}
float statystyka_obecnosci(student st, char symbol)
{
int suma = 0;
for (int i=0;i<st.obecnosci.length();i++)
{
if (st.obecnosci==symbol) suma+=1;
}
return (1.0*suma/st.obecnosci.length());
}
vector <student> niekwalifikowani_obecnosci(vector <student> t)
{
float nb;
vector <student> niekwalifikowani;
for (int i=0;i<t.size();i++)
{
nb = statystyka_obecnosci(t,'+');
if (nb<0.2) niekwalifikowani.push_back(t);
}
return niekwalifikowani;
}
vector <student> kwalifikowani_oceny(vector <student> t)
{
float suma;
vector <student> kwalifikowani;
for (int i=0;i<t.size();i++)
{
suma = t.spr_01+t.spr_02;
if (suma>12 && statystyka_obecnosci(t,'+')>=0.8)
kwalifikowani.push_back(t);
}
return kwalifikowani;
}
vector <student> stypendium_oceny(vector <student> t)
{
float suma;
vector <student> stypendium;
for (int i=0;i<t.size();i++)
{
suma = t.spr_01+t.spr_02;
if (suma>20&& statystyka_obecnosci(t,'+')>=0.8)
stypendium.push_back(t);
}
return stypendium;
}
void menu(void){
int klawisz, ind, ret = 0;
student st;
string indeks;
do{
system("cls");
cout<<"!!!!!MENU!!!!!"<<endl;
cout<<"*****************************"<<endl;
cout<<"Wybierz klawisz: "<<endl;
cout<<"1. Dodaj studenta: "<<endl;
cout<<"2. Wyswietl studenta: "<<endl;
cout<<"3. Wyszukaj studenta: "<<endl;
cout<<"4. Usun studenta: "<<endl;
cout<<"5. Studenci niekwalifikowani/absencja: "<<endl;
cout<<"6. Studenci, ktorzy zaliczyli: "<<endl;
cout<<"7. Studencji posiadajacy stypendium: "<<endl;
cout<<"9. Wyjscie: "<<endl;
cout<<"Wybrales: ";
cin>>klawisz;
switch(klawisz){
case 1: cout<<"Dodawanie studenta"<<endl;
st=dodaj();
tab.push_back(st);
cout<<"Dodano studenta do bazy. Nacisnij dowolny klawisz!!!"<<endl;
//dorobic zapis do pliku nowo wprowadzonego studenta
getch();
break;
case 2: tab2 = tab;
cout<<"Lista studentow"<<endl;
sort(tab2.begin(), tab2.end(), porownaj_nazwiska);
for (int i=0;i<tab2.size();i++) wyswietl(tab2);getch(); break;
case 3: cout<<"Wyszukanie studenta"<<endl;
cout<<"Podaj indeks do wyszukania studenta: ";
cin>>indeks;
ind = wyszukaj(tab,indeks, ret);
if (ret == 0) cout<<"Brak studenta o danym indeksie w bazie."<<endl;
else wyswietl(tab[ind]);
cout<<"Nacisnij dowolny klawisz!!!"<<endl;
getch();
break;
case 4: cout<<"Usun studenta"<<endl;
break;
case 5: cout<<"Studenci niekwalifikowani z powodu absencji."<<endl;
tab3 = niekwalifikowani_obecnosci(tab);
if (tab3.size()==0) cout<<"Wszyscy studenci kwalifikowani."<<endl;
else
for (int i=0;i<tab3.size();i++)
wyswietl(tab3);
cout<<"Wcisnij dowolny klawisz!!!"<<endl;
getch();
break;
case 6: cout<<"Studenci, ktorzy zaliczyli: "<<endl;
tab4 = kwalifikowani_oceny(tab);
if (tab4.size()==0) cout<<"Wszyscy studenci powtorka."<<endl;
else
for (int i=0;i<tab4.size();i++)
wyswietl(tab4);
cout<<"Wcisnij dowolny klawisz!!!"<<endl;
getch();
break;
case 7: cout<<"Studenci posiadajacy stypendium"<<endl;
tab5 = stypendium_oceny(tab);
if (tab5.size()==0) cout<<"Nikt nie posiada stypendium."<<endl;
else
for (int i=0;i<tab5.size();i++)
wyswietl(tab5);
getch();
break;
case 9: zapis_pliku(tab,"d2000z_n.txt");
break;
default: break;
}
}while (klawisz!=5);
}
int main()
{
tab = odczyt_pliku("d2000z.txt");
menu();
return 0;
}