443 lines
12 KiB
C++
Raw Permalink Normal View History

2025-11-06 11:57:42 +01:00
/*
Autor: Mateusz Słodkowicz
Grupa: D3
Numer Indeksu: 167675
Uwagi: Kod źródłowy powinien być zapisany z kodowaniem UTF-8
*/
#include <fstream>
#include <limits>
#include <string>
#include <vector>
#include <iostream>
#include <iomanip>
struct STUDENT
{
std::string imie_nazwisko;
int oceny[6];
double srednia;
std::string ocena_koncowa;
};
void czysc();
void menu(std::vector<STUDENT> &studenci);
void wypisz_wszystkich(std::vector<STUDENT> &studenci);
void wypisz_najlepszych(std::vector<STUDENT> &studenci);
void wypisz_wyszukanych(std::vector<STUDENT> &studenci, std::string szukany);
double srednia_wszystkich(std::vector<STUDENT> &studenci);
double najwyzsza_wartosc(std::vector<STUDENT> &studenci);
int powyzej_sredniej(std::vector<STUDENT> &studenci);
STUDENT tworz_studenta();
std::vector<STUDENT> wczytaj_dane(std::string sciezka);
void zapisz_dane(std::vector<STUDENT> &studenci, std::string sciezka);
void modyfikuj(std::vector<STUDENT> &studenci);
int main()
{
#ifdef _WIN32
system("chcp 65001"); // Zmiana kodowaniu wiersza poleceń na windowsie dla obsługi polskich znaków
#endif
std::cout << std::setprecision(3);
czysc();
std::vector<STUDENT> studenci;
bool wyjdz = false;
std::string tekst = "";
while(!wyjdz)
{
menu(studenci);
std::cout << "Wybór: ";
char wybor = 0;
while (!(std::cin >> wybor) || wybor < '0' || wybor > '9')
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "Wybór: ";
}
switch (wybor)
{
case '0':
wyjdz = true;
break;
case '1':
wypisz_wszystkich(studenci);
break;
case '2':
czysc();
studenci = wczytaj_dane("dane.txt");
break;
case '3':
czysc();
zapisz_dane(studenci, "dane.txt");
break;
case '4':
czysc();
std::cout << "Średnia: " << srednia_wszystkich(studenci);
break;
case '5':
czysc();
std::cout << "Średnia: " << srednia_wszystkich(studenci) << "\nIlośc studentów powyżej średniej: " << powyzej_sredniej(studenci);
break;
case '6':
czysc();
wypisz_najlepszych(studenci);
break;
case '7':
czysc();
tekst = "";
std::cout << "Podaj szukany fragment: ";
std::cin >> tekst;
wypisz_wyszukanych(studenci, tekst);
break;
case '8':
czysc();
studenci.push_back(tworz_studenta());
break;
case '9':
czysc();
modyfikuj(studenci);
break;
}
}
return 0;
}
void czysc()
{
#ifdef _WIN32
system("cls");
#else
system("clear");
#endif
}
void menu(std::vector<STUDENT> &studenci)
{
std::cout << "\n\nAktualna ilość studentów: " << studenci.size() << "\n"
<< "1. Wypisz studentów\n"
<< "2. Wczytaj studentów z pliku dane.txt\n"
<< "3. Zapisz studentów do pliku dane.txt\n"
<< "4. Wypisz średnią wszystkich studentów\n"
<< "5. Wypisz ilość studentów powyżej średniej\n"
<< "6. Wypisz studentów z najwyższą średnią\n"
<< "7. Wyszukaj i wypisz dane studentów których imię/nazwisko zawiera szukany tekst\n"
<< "8. Dodaj studenta\n"
<< "9. Modyfikuj lub usuń studenta\n"
<< "0. Wyjdź\n";
}
double licz_srednia(STUDENT &student)
{
double srednia = 0;
for (int i = 0; i < 6; ++i)
{
srednia += student.oceny[i];
}
srednia = srednia / 6.0;
return srednia;
}
std::string ocena(STUDENT &student)
{
if (student.srednia >= 91)
return "bardzo dobry";
if (student.srednia >= 81)
return "dobry plus";
if (student.srednia >= 71)
return "dobry";
if (student.srednia >= 61)
return "dostateczny plus";
if (student.srednia >= 51)
return "dostateczny";
return "niedostateczny";
}
STUDENT tworz_studenta()
{
STUDENT s;
std::string tmp_txt;
std::cout << "Podaj imię: ";
std::cin >> tmp_txt;
s.imie_nazwisko = tmp_txt;
tmp_txt = "";
std::cout << "Podaj nazwisko: ";
std::cin >> tmp_txt;
s.imie_nazwisko += " ";
s.imie_nazwisko += tmp_txt;
int tmp = -1;
for(int i = 0;i<6;++i)
{
std::cout << "Podaj ocenę " << i+1 <<": ";
while (!(std::cin >> tmp) || (tmp <50 && tmp !=0 ) || tmp > 100)
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "Błąd, ocena musi być 50 <= ocena <= 100 lub równa 0\n";
std::cout << "Podaj ocenę " << i+1 <<": ";
}
s.oceny[i] = tmp;
}
s.srednia = licz_srednia(s);
s.ocena_koncowa = ocena(s);
return s;
}
void modyfikuj(std::vector<STUDENT> &studenci)
{
czysc();
wypisz_wszystkich(studenci);
std::cout << "\nCo chcesz zrobić?\n1.Modyfikuj\n2.Usuń\n3.Anuluj\nWybór: ";
char wybor = 0;
while (!(std::cin >> wybor) || wybor < '1' || wybor > '3')
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "Wybór: ";
}
int id = -1;
switch (wybor)
{
case '1':
std::cout << "\nPodaj id: ";
while (!(std::cin >> id))
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "\nPodaj id: ";
}
if (id < 0 || id >= studenci.size())
{
std::cout << "Błędne id!\n";
return;
}
else
studenci[id] = tworz_studenta();
break;
case '2':
std::cout << "\nPodaj id: ";
while (!(std::cin >> id))
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "\nPodaj id: ";
}
if(id<0 || id>=studenci.size())
{
std::cout << "Błędne id!\n";
return;
}
else
studenci.erase(studenci.begin()+id);
break;
case '3':
return;
}
}
void zapisz_dane(std::vector<STUDENT> &studenci, std::string sciezka)
{
std::ofstream plik(sciezka);
if (!plik.is_open())
{
std::cout << "Nie można otworzyć pliku: " << sciezka << std::endl;
return;
}
for (auto &s : studenci)
{
plik << s.imie_nazwisko << std::endl;
for (int i = 0; i < 6; ++i)
{
plik << s.oceny[i] << " ";
}
plik << "\n";
}
plik.close();
}
std::vector<STUDENT> wczytaj_dane(std::string sciezka)
{
std::vector<STUDENT> studenci;
std::ifstream plik(sciezka);
if (!plik.is_open())
{
std::cout << "Nie można otworzyć pliku: " << sciezka << std::endl;
return studenci;
}
std::string line;
while (std::getline(plik, line))
{
if (!line.empty())
{
STUDENT s;
s.imie_nazwisko = line;
for (int i = 0; i < 6; ++i)
{
plik >> s.oceny[i];
}
plik.ignore();
s.srednia = licz_srednia(s);
s.ocena_koncowa = ocena(s);
studenci.push_back(s);
}
}
plik.close();
return studenci;
}
double srednia_wszystkich(std::vector<STUDENT> &studenci)
{
if (studenci.empty())
return 0;
double suma = 0;
for (auto &student : studenci)
{
suma += student.srednia;
}
return suma / studenci.size();
}
int powyzej_sredniej(std::vector<STUDENT> &studenci)
{
int ret = 0;
double srednia = srednia_wszystkich(studenci);
for(auto &s :studenci)
{
if(s.srednia > srednia) ++ret;
}
return ret;
}
double najwyzsza_wartosc(std::vector<STUDENT> &studenci)
{
double max = 0;
for (auto s : studenci)
{
if(s.srednia>max) max = s.srednia;
}
return max;
}
void wypisz_wszystkich(std::vector<STUDENT> &studenci)
{
czysc();
if(studenci.size() == 0)
{
std::cout << "Brak studentów!\n";
return;
}
std::cout << "Lista studentów:\n";
printf("%2s | %31s | %30s | %10s | %19s\n","ID","Imię i nazwisko","Oceny","Średnia","Ocena Końcowa");
printf("---+--------------------------------+--------------------------------+-----------+-------------------\n");
for (int j = 0; j < studenci.size(); ++j)
{
std::string oceny = "";
STUDENT &s = studenci[j];
for (int i = 0; i < 6; ++i)
{
oceny += std::to_string(s.oceny[i]);
oceny += ((i == 5) ? " " : ", ");
}
printf("%2i | %30s | %30s | %9.2f | %18s\n",j,s.imie_nazwisko.c_str(),oceny.c_str(),s.srednia,s.ocena_koncowa.c_str());
}
}
void wypisz_wyszukanych(std::vector<STUDENT> &studenci, std::string szukany)
{
czysc();
std::vector<STUDENT> znalezieni;
if (studenci.size() == 0)
{
std::cout << "Brak studentów!\n";
return;
}
std::cout << "Lista studentów zawierających \"" << szukany << "\":\n";
bool znaleziono = false;
printf("%-31s | %30s | %10s | %19s\n","Imię i nazwisko","Oceny","Średnia","Ocena Końcowa");
printf("-------------------------------+--------------------------------+-----------+-------------------\n");
for (auto &s : studenci)
{
if (s.imie_nazwisko.find(szukany) != std::string::npos)
{
znalezieni.push_back(s);
znaleziono = true;
std::string oceny = "";
for (int i = 0; i < 6; ++i)
{
oceny += std::to_string(s.oceny[i]);
oceny += ((i == 5) ? " " : ", ");
}
printf("%-30s | %30s | %9.2f | %18s\n", s.imie_nazwisko.c_str(), oceny.c_str(), s.srednia,
s.ocena_koncowa.c_str());
}
}
if(!znaleziono) std::cout << "Nie znaleziono\n";
else
{
std::cout << "\nZapisać do pliku \"wyszukani.txt\"?\n1.Tak\n2.Nie\n";
std::cout << "Wybór: ";
char wybor = 0;
while (!(std::cin >> wybor) || wybor < '1' || wybor > '2')
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "Wybór: ";
}
if(wybor=='1') zapisz_dane(znalezieni, "wyszukani.txt");
}
}
void wypisz_najlepszych(std::vector<STUDENT> &studenci)
{
czysc();
if (studenci.size() == 0)
{
std::cout << "Brak studentów!\n";
return;
}
std::vector<STUDENT> najlepsi;
double max = najwyzsza_wartosc(studenci);
std::cout << "Studenci o najwyższej średniej " << max << ":\n";
printf("%-31s | %30s | %10s | %19s\n", "Imię i nazwisko", "Oceny", "Średnia", "Ocena Końcowa");
printf("-------------------------------+--------------------------------+-----------+-------------------\n");
for (auto &s : studenci)
{
if (s.srednia == max)
{
std::string oceny = "";
for (int i = 0; i < 6; ++i)
{
oceny += std::to_string(s.oceny[i]);
oceny += ((i == 5) ? " " : ", ");
}
printf("%-30s | %30s | %9.2f | %18s\n", s.imie_nazwisko.c_str(), oceny.c_str(), s.srednia,
s.ocena_koncowa.c_str());
najlepsi.push_back(s);
};
}
std::cout << "\nZapisać do pliku \"najlepsi.txt\"?\n1.Tak\n2.Nie\n";
std::cout << "Wybór: ";
char wybor = 0;
while (!(std::cin >> wybor) || wybor < '1' || wybor > '2')
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "Wybór: ";
}
if (wybor == '1')
zapisz_dane(najlepsi, "najlepsi.txt");
}