- #include <iostream>
- #include <fstream>
- using namespace std;
- const unsigned int MAX_TEXT_LEN = 20; //maksymalna liczba znakow w polach tekstowych
- struct pracownik {
- int id;
- char imie[MAX_TEXT_LEN+1];
- char nazwisko[MAX_TEXT_LEN+1];
- float* zarobki;
- int liczba_miesiecy;
- };
- void wyswietl_pracownika(pracownik prac) {
- cout << "ID: " << prac.id << endl;
- cout << "Imie: " << prac.imie << endl;
- cout << "Nazwisko: " << prac.nazwisko << endl;
- cout << "Zarobki w ostatnich " << prac.liczba_miesiecy << " miesiacach:" << endl;
- for (int i=0; i<prac.liczba_miesiecy; i++) {
- cout << i+1 << ": " << prac.zarobki[i] << endl;
- }
- cout << endl;
- }
- void wyswietl_wszystko(pracownik* tab, unsigned int liczba_prac) {
- for(int i=0; i<liczba_prac; i++) {
- wyswietl_pracownika(tab[i]);
- }
- }
- float oblicz_srednia(pracownik prac) {
- if(prac.liczba_miesiecy <= 0) {
- return 0.0;
- }
- float sr = 0;
- for(int i=0; i<prac.liczba_miesiecy; i++) {
- sr += prac.zarobki[i];
- }
- sr = sr / prac.liczba_miesiecy;
- return sr;
- }
- void dodaj_element(fstream& plik, pracownik* tab, unsigned int rozmiar_tab, int ind) {
- plik >> tab[ind].id;
- plik >> tab[ind].imie;
- plik >> tab[ind].nazwisko;
- plik >> tab[ind].liczba_miesiecy;
- tab[ind].zarobki = new float[tab[ind].liczba_miesiecy];
- for(int i=0; i < tab[ind].liczba_miesiecy; i++) {
- plik >> tab[ind].zarobki[i];
- }
- }
- void zapisz_do_pliku(pracownik* tab, int count, float prog) {
- ofstream plik_output("output.txt");
- if(!plik_output) {
- cout << "Plik nie zostal otwartyn";
- return;
- }
- float srednia;
- int liczba_do_wpisania = 0;
- for(int i=0; i<count; i++) {
- srednia = oblicz_srednia(tab[i]);
- if(srednia >= prog) {
- liczba_do_wpisania++;
- }
- }
- plik_output << liczba_do_wpisania << endl;
- for(int i=0; i<count; i++) {
- srednia = oblicz_srednia(tab[i]);
- if(srednia >= prog) {
- plik_output << tab[i].id << endl;
- plik_output << tab[i].imie << endl;
- plik_output << tab[i].nazwisko << endl;
- plik_output << tab[i].liczba_miesiecy << endl;
- for(int j=0; j<tab[i].liczba_miesiecy; j++) {
- plik_output << tab[i].zarobki[j] << endl;
- }
- }
- }
- plik_output.close();
- }
- int main() {
- int N;
- fstream plik_input("input.txt", ios::in); //otwarcie pliku o nazwie "input.txt"
- if(!plik_input) { //sprawdzenie, czy plik zosta� otwarty
- cout << "Plik nie zostal otwartyn";
- return -1;
- }
- unsigned int licznik = 0; //licznik elementow aktualnie przechowywanych w tablicy
- pracownik *tablica; //tablica struktur (wska�nik) - nasza baza
- /*Wczytaj dane z pliku*/
- plik_input >> N;
- /*Zaalokuj dynamicznie pamiec dla tablicy (na podstawie pierwszej liczby odczytanej z plik_input)*/
- tablica = new pracownik[N];
- for(int i=0; i < N; i++) {
- dodaj_element(plik_input, tablica, N, i);
- }
- plik_input.close();
- /* MENU */
- int opt;
- float prog;
- do {
- cout << "Wybierz opcje:" << endl;
- cout << "1: Wypisz na ekran dane odczytane z pliku" << endl;
- cout << "2: Zapisz do pliku pracownikow o sredniej zarobkow powyzej progu" << endl;
- cout << "0: Wyjdz z programu" << endl << endl;
- cout << "Podaj swoj wybor: ";
- cin >> opt;
- /* Wykonaj odpowiednia akcje w zaleznosci od wyboru uzytkownika */
- switch(opt) {
- case 1: //wypisz na ekran dane odczytane z pliku
- wyswietl_wszystko(tablica, N);
- break;
- case 2: //opcja 2
- cout << "Podaj prog sredniej zarobkow: " << endl;
- cin >> prog;
- zapisz_do_pliku(tablica, N, prog);
- break;
- case 0: // koniec dzialania programu - warunek petli spowoduje wyjscie z niej
- break;
- default:
- cout << "Niepoprawna opcja!" << endl << endl;
- break;
- }
- } while (opt != 0);
- /*Zwolnij dynamicznie zaalokowana pamiec!*/
- for(int i=0; i<N; i++) {
- delete[] tablica[i].zarobki;
- }
- delete[] tablica;
- return 0;
- }