Prosta baza danych. Nie mogę znaleźć błędu. Pomocy!

0

Witam, zrobiłem bazę danych pracowników. Gdy chce wczyta np. 3 pracowników to program i tak wyświetla mi tylko pierwszego. Jak to naprawić by pokazywali się wszyscy? Proszę o pomoc. Kod wstawiam tutaj, jak także w załączniku.

#include <iostream>
#include <iomanip>

using namespace std;

const int dlugosc = 20;
int ile;

struct pracownicy
{
    string imie;
    string nazwisko;
    int pesel;
    int wynagrodzenie;
    int suma;
    int srednia;
};

int suma_pensji(pracownicy tab[])
{
    int suma = 0;

    for (int i = 0; i <= 12; i++)
    {
        suma = suma + tab[i].wynagrodzenie;
    }
    return suma;
}

float srednia_wynagrodzenie(pracownicy tab[]) /*Dlaczego nie mam zmiennoprzecinkowych?*/
{
    float srednia;
    srednia = suma_pensji(tab) / 12;
    return srednia;
}


void wpisz(pracownicy tab[], int ile)
{
    cout << "Podaj ilu chcesz wpisac pracownikow: ";

    cin >> ile;
    cout << endl;
    for (int i = 0; i < ile; i++)
    {
        cout << "Podaj Imie: " << endl;
        cin >> tab[i].imie;
        cout << "Podaj Nazwisko : " << endl;
        cin >> tab[i].nazwisko;
        cout << "Podaj pesel (12 liczb): " << endl;
        cin >> tab[i].pesel;


        for (int j = 1; j <= 12; j++)
        {
            cout << "Podaj wynagrodzenie w miesiacu " << j << " : " << endl;
            cin >> tab[j].wynagrodzenie;
        }

        cout << "Suma wynosi: " << suma_pensji(tab) << endl;
        cout << "Srednie wynagrodzenie wynosi: " << srednia_wynagrodzenie(tab) << endl;


        /*
        cout<<"Podaj wynagrodzenie w Styczen: "<<endl;
        cin>>tab[i].wynagrodzenie;
        cout<<"Podaj wynagrodzenie w Luty: "<<endl;
        cin>>tab[i].wynagrodzenie;
        cout<<"Podaj wynagrodzenie w Marzec: "<<endl;
        cin>>tab[i].wynagrodzenie;
        */
    }
}


void wywal(pracownicy tab[], int ile)
{
    cout << "Imie"
         << "     |     "
         << "Nazwisko"
         << "     |      "
         << "Pesel"
         << "     |     "
         << "Roczne wynagrodzenie"
         << "      |      "
         << "Srednie wynagrodzenie" << endl;
    for (int i = 0; i <= ile; i++)
    {
        cout << tab[i].imie << setw(5) << "|" << tab[i].nazwisko << "   |   " << tab[i].pesel
             << "   |   " << suma_pensji(tab) << "    |    " << srednia_wynagrodzenie(tab) << endl;
    }
}


int main()
{
    pracownicy tab[dlugosc];

    wpisz(tab, ile);
    wywal(tab, ile);
    /*cout<<"Suma wynosi: "<<suma_pensji(tab);*/


    return 0;
}
1

Nie często piszę w C, ale muszę przyznać, że zgłupiałam czytając ten kod. Wpisujesz pracowników tutaj:

 for(int i=0; i<ile; i++)
    {
        cout<<"Podaj Imie: "<<endl;
        cin>>tab[i].imie;
//...

a za chwilę w tej pętli robisz drugą pętle, która od 1 wstawia dane do tej samej tabeli?


 for(int i=0; i<ile; i++)
    {
//...
for(int j=1; j<=12; j++)
        {
            cout<<"Podaj wynagrodzenie w miesiacu "<<j<<" : "<<endl;
            cin>>tab[j].wynagrodzenie;
        }
}

Struktura pokazuje, że wynagrodzenie pracownika jest int-em, a Ty robisz jakąś pętle iterującą 12 razy i chcesz gdzieś wstawiać wynagrodzenia (za każdy miesiąc w zamierzeniu?).

W każdym razie wstawiasz jednego pracownika więc
tab[0]= Pracownik(...)
tab[1].wynagrodzenie, czyli null.wynagrodzenie bo w tab[1] nic jeszcze nie ma.

Jak chcesz mieć możliwość wpisywania do danych pracownika wynagrodzenia za każdy miesiąc, musisz mieć tablicę na wynagrodzenia, nie int.

1

http://melpon.org/wandbox/permlink/bVuLZA6MgZphIsSm

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <numeric>

template<typename T>
using db_table = std::vector<T>;

class employee {
	std::string name_, surname_;
	int salary_;
public:
    employee() = default;
    
	employee(std::string const &name, std::string const &surname, int salary):
		name_(name), 
        surname_(surname), 
        salary_(salary)
    {}
    
    auto &name() const {
        return name_;
    }
    
    auto &surname() const {
        return surname_;
    }
    
    auto salary() const {
        return salary_;
    }
    
    std::string fullname() const {
        return name_ + " " + surname_;
    }
    
    friend std::istream &operator>>(std::istream &in, employee &e) {
        return in >> e.name_ >> e.surname_ >> e.salary_;
    }
};



using employees = db_table<employee>;

namespace logic {
    double employees_average_salary(employees const &es) {
		if(es.size() == 0) { 
            return 0; 
        }
		
		return std::accumulate(es.begin(), es.end(), 0., [](auto sum, auto &&employee) {
			return sum + employee.salary();
		}) / es.size();
	}
}

namespace view {
    void employee(employee const &e) {
        std::cout << "Fullname: " << e.fullname() << "\n"
                  << "salary:   " << e.salary() << "\n";
    }
    
    void average_salary(double av) {
        std::cout << "average salary: " << av << "\n";
    }
}

int main() {
    using namespace std;
    
	employees employees_table;
    employees_table.emplace_back("Dude", "Predefined", 1200);
    
    employee e;
    while(cin >> e) {
        employees_table.push_back(e);
    }
    
    for(auto &&employee_row: employees_table) {
        view::employee(employee_row);
    }
    
    view::average_salary(logic::employees_average_salary(employees_table));
    
	return 0;
}

input:

Adam Peftek 1400
Jacek Soplica 1900
Tadeusz Soplica 1100
Protazy Brzechalski 700

output:

Fullname: Dude Predefined
salary:   1200
Fullname: Adam Peftek
salary:   1400
Fullname: Jacek Soplica
salary:   1900
Fullname: Tadeusz Soplica
salary:   1100
Fullname: Protazy Brzechalski
salary:   700
average salary: 1260

1 użytkowników online, w tym zalogowanych: 0, gości: 1