/* Autor: Mateusz Słodkowicz Grupa: D3 Numer Indeksu: 167675 Uwagi: Kod źródłowy powinien być zapisany z kodowaniem UTF-8 */ #include #include #include #include #include #include struct STUDENT { std::string imie_nazwisko; int oceny[6]; double srednia; std::string ocena_koncowa; }; void czysc(); void menu(std::vector &studenci); void wypisz_wszystkich(std::vector &studenci); void wypisz_najlepszych(std::vector &studenci); void wypisz_wyszukanych(std::vector &studenci, std::string szukany); double srednia_wszystkich(std::vector &studenci); double najwyzsza_wartosc(std::vector &studenci); int powyzej_sredniej(std::vector &studenci); STUDENT tworz_studenta(); std::vector wczytaj_dane(std::string sciezka); void zapisz_dane(std::vector &studenci, std::string sciezka); void modyfikuj(std::vector &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 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::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 &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::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 &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::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::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::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 &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 wczytaj_dane(std::string sciezka) { std::vector 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 &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 &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 &studenci) { double max = 0; for (auto s : studenci) { if(s.srednia>max) max = s.srednia; } return max; } void wypisz_wszystkich(std::vector &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 &studenci, std::string szukany) { czysc(); std::vector 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::max(), '\n'); std::cout << "Wybór: "; } if(wybor=='1') zapisz_dane(znalezieni, "wyszukani.txt"); } } void wypisz_najlepszych(std::vector &studenci) { czysc(); if (studenci.size() == 0) { std::cout << "Brak studentów!\n"; return; } std::vector 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::max(), '\n'); std::cout << "Wybór: "; } if (wybor == '1') zapisz_dane(najlepsi, "najlepsi.txt"); }