© Harry Broeders.
Deze opdracht bestaat uit de deelopdrachten 3a t/m 3c. Opdracht 3b en 3c moet je laten aftekenen door de docent. Over de andere deelopgave kunnen wel vragen worden gesteld.
In een bedrijf werken verschillende soorten werknemers:
Binnen de salarisadministratie van het bedrijf heeft elke werknemer een registratienummer.
De analist die de specificaties voor het salarisadministratie programma heeft opgesteld heeft bedacht dat er rekening mee moet worden gehouden dat er in de toekomst andere soorten werknemers moeten worden toegevoegd. Bijvoorbeeld stukwerkers die werken voor een vast stukprijs. Het programma moet dus zoveel mogelijk onafhankelijk van het concrete werknemer type gemaakt worden.
Hieronder volgt een voorbeeld van een functie die onafhankelijk van het werknemer type is:
void printMaandSalaris(const Werknemer& w) {cout<<"Werknemer: "<<w.geefNummer()<<" verdient: "<<setw(8)<<setprecision(2)<<fixed<<w.geefSalaris()<<" Euro."<<endl;}
Deze functie wordt vanuit de functie main als volgt aangeroepen
(werk1.cpp
):
int main() {FreeLancer f(1, 25.75); // werknemer 1 verdient 25.75 per uurVasteKracht v(2, 1873.53); // werknemer 2 verdient 1873.53 per maandf.werkUren(84); // werknemer 1 werkt (deze maand) 84 urencout<<"Maand 1:"<<endl;printMaandSalaris(f);printMaandSalaris(v);f.werkUren(13.5); // werknemer 1 werkt (deze maand) 13.5 urencout<<"Maand 2:"<<endl;printMaandSalaris(f);printMaandSalaris(v);cin.get();return 0;}
Denk er aan hoe
een
blaft! Bestudeer indien
nodig hoofdstuk 5 uit het dictaat. De relatie tussen de verschillende classes
is hiernaast gegeven.
Merk op dat de functie printMaandSalaris niet "weet" welk soort
Werknemer gebruikt wordt. Dit betekent dat deze polymorphic
functie voor alle huidige "soorten" werknemers te gebruiken is. De functie
is zelf ook voor toekomstige "soorten" werknemers bruikbaar. Dit maakt het
programma eenvoudig uitbreidbaar. Op dit moment is het nodig om het programma
uit te breiden met een nieuw "soort" werknemer. Deze stukwerker werkt voor
een vast stukprijs.
De main functie wordt nu als volgt uitgebreid
(werk2.cpp
):
int main() {FreeLancer f(1, 25.75); // werknemer 1 verdient 25.75 per uurVasteKracht v(2, 1873.53); // werknemer 2 verdient 1873.53 per maandStukWerker s(3, 1.05); // werknemer 3 verdient 1.05 per stukf.werkUren(84); // werknemer 1 werkt (deze maand) 84 urens.produceerStuks(1687); // werknemer 3 produceert (deze maand) 1687 stukscout<<"Maand 1:"<<endl;printMaandSalaris(f);printMaandSalaris(v);printMaandSalaris(s);f.werkUren(13.5); // werknemer 1 werkt (deze maand) 13.5 urens.produceerStuks(0); // werknemer 3 produceert (deze maand) 0 stukscout<<"Maand 2:"<<endl;printMaandSalaris(f);printMaandSalaris(v);printMaandSalaris(s);cin.get();return 0;}
Er is nog een "soort" werknemer waarmee we het programma kunnen uitbreiden. Een manager is een werknemer die andere werknemers leiding geeft. Het bedrijf dat we als voorbeeld nemen heeft als regel dat een manager nooit aan meer dan 10 werknemers direct leiding geeft. De meeste managers hebben zelf ook weer een manager boven zich. Het bedrijf dat we als voorbeeld nemen heeft een orginele manier bedacht om het salaris van een manager te bepalen. Het salaris van de manager is 2 maal zo hoog als het gemiddelde salaris van de mensen waaraan deze manager direct leiding geeft.
Het programma
moet natuurlijk ook het salaris van managers kunnen berekenen. De relatie
tussen manager en werknemer is als volgt:
De relatie tussen de classes Werknemer, VasteKracht
en Manager is hiernaast gegeven.
Het hoofdprogramma wordt nu (werk3.cpp
):
int main() {StukWerker s(1, 1.05); // werknemer 1 verdient 1.05 per stukFreeLancer f(2, 25.75); // werknemer 2 verdient 25.75 per uurVasteKracht v1(3, 1873.53);// werknemer 3 verdient 1873.53 per maandManager m1(4); // werknemer 4 is de manager van:m1.geeftLeidingAan(s); // - werknemer 1m1.geeftLeidingAan(f); // - werknemer 2m1.geeftLeidingAan(v1); // - werknemer 3VasteKracht v2(5, 2036.18);// werknemer 5 verdient 2036,18 per maandManager m2(6); // werknemer 6 is de manager van:m2.geeftLeidingAan(v2); // - werknemer 5m2.geeftLeidingAan(m1); // - werknemer 4s.produceerStuks(678); // werknemer 1 produceert 678 stuksf.werkUren(84); // werknemer 2 werkt 84 urenprintMaandSalaris(s);printMaandSalaris(f);printMaandSalaris(v1);printMaandSalaris(m1);printMaandSalaris(v2);printMaandSalaris(m2);cin.get();return 0;}