Problema 2

Enunţ: Scrieţi un program care citește numărul de ore lucrate într-o săptămână și plata pe oră, calculează și afișează salariul săptămânal, ținând cont că orele suplimentare( peste 40/saptamână ) sunt plătite cu 150%.

1)

În cazul în care acest enunţ ar fi unul de la bacalaureat, unde validarea acestuia nu este necesară, rezolvarea ar fi următoarea:

C++ Pseudocod

#include <iostream> citeste nr, slh

- daca nr ≤ 40 atunci

using namespace std; | p<- nr*slh

| altfel

int main() | p<- 40*slh+(nr-40)*1.5*slh

{ |_

float slh,p;

unsigned int nr; scrie p

cout<<"slh=";cin>>slh;

cout<<"nr=";cin>>nr;

if(nr<=40)

p=nr*slh;

else

p=40*slh+(nr-40)*1.5*slh;

cout<<"Plata salariatului este "<<p<<" lei";

return 0;

}

2)

Pentru a complica puțin problema, am inclus și validarea enunțului:

Observație: Aceasta este soluția recomandată de rezolvare a enunțului inițial în condițiile în care acest enunț se dă la orice alt concurs/examen diferit de cel de bacalaureat.

#include <iostream>

using namespace std;

int main()

{

float slh,nr,p;

do

{

cout<<"Introduceti plata pe ora(numar pozitiv nenul): ";cin>>slh;

if(slh<=0)

cout<<"Ati gresit! Introduceti o valoare pozitiva!\n\n";

}while(slh<=0);

do

{

cout<<"Introduceti numarul de ore lucrate de catre salariat(numarul natural ):";cin>>nr;

if(nr<0 || nr!=(int)nr)

cout<<"Ati gresit! Introduceti un numar natural nenul!\n\n";

}while(nr<0 || nr!=(int)nr);

if(nr<=40)

p=nr*slh;

else

p=40*slh+(nr-40)*1.5*slh;

cout<<"Plata salariatului este "<<p<<" lei";

return 0;

}

3)

În continure ne punem problema în cazul în care există "n" angajați, fiecare cu un număr specific de ore lucrate.

#include <iostream>

using namespace std;

int main()

{

float m;

do{cout<<"Numarul de angajati este: ";cin>>m;

if(m<=0 || m!=(int)m)

cout<<"Va rugam introduceti un numar natural nenul!\n\n";

}while(m<=0 || m!=(int)m);

int n,i;

n=m;

float angajati[n],slh,ore[n];

do

{

cout<<"Introduceti plata pe ora(numar pozitiv nenul): ";cin>>slh;

if(slh<=0)

cout<<"Ati gresit! Introduceti o valoare pozitiva!\n\n";

}while(slh<=0);

for(i=0;i<n;i++)

{

do

{

cout<<"Introduceti numarul de ore lucrate de catre salariatul "<<i+1<<": ";cin>>ore[i];

if(ore[i]<0 || ore[i]!=(int)ore[i])

cout<<"Ati gresit! Introduceti un numar natural !\n\n";

}while(ore[i]<0 || ore[i]!=(int)ore[i]);

if(ore[i]<=40)

angajati[i]=ore[i]*slh;

else

angajati[i]=40*slh+(ore[i]-40)*1.5*slh;

}

cout<<"\n\n";

for(i=0;i<n;i++)

cout<<"Salariul angajatului "<<i+1<<" este "<<angajati[i]<<"\n";

return 0;

}

4)

Pentru a crea o rezolvare mai "elegantă" și mai elaborată, ne-am propus următoarele:

-tratarea specifică a cazului în care există un singur angajat

-tratarea specifică a cazului în care există mai mulți angajați - cazul în care fiecare angajat e plătit la fel pe ora lucrată

-cazul în care fiecare angajat e plătit diferit pe ora lucrată

#include <iostream>

using namespace std;

int main()

{

unsigned int opt=1,op=1;

cout<<"Exista mai mult de un angajat?\n";

cout<<"\n1 Da\n2 Nu\n\n0 Nu mai vreau sa calculez nimic!\n\n (1/2/0):";cin>>opt;

switch (opt)

{

case 1:

float m;

do{cout<<"Numarul de angajati este: ";cin>>m;

if(m<=1 || m!=(int)m)

cout<<"Va rugam introduceti un numar natural nenul mai mare ca 1 !\n\n";

}while(m<=1 || m!=(int)m);

int n,i;

n=(int)m;

cout<<"\n\nToti angajatii primesc aceeasi plata pe ora?\n";

cout<<"\n3 Da\n4 Nu\n\n (3/4):";cin>>op;

switch(op)

{

case 3:

{float angajati[n],slh,ore[n];

do

{

cout<<"Introduceti plata pe ora(numar pozitiv nenul): ";cin>>slh;

if(slh<=0)

cout<<"Ati gresit! Introduceti o valoare pozitiva!\n\n";

}while(slh<=0);

for(i=0;i<n;i++)

{

do

{

cout<<"Introduceti numarul de ore lucrate de catre salariatul "<<i+1<<": ";cin>>ore[i];

if(ore[i]<0 || ore[i]!=(int)ore[i])

cout<<"Ati gresit! Introduceti un numar natural !\n\n";

}while(ore[i]<0 || ore[i]!=(int)ore[i]);

if(ore[i]<=40)

angajati[i]=ore[i]*slh;

else

angajati[i]=40*slh+(ore[i]-40)*1.5*slh;

}

for(i=0;i<n;i++)

cout<<"Salariul angajatului "<<i+1<<" este "<<angajati[i]<<" lei\n";

break;}

case 4:

{float angajati4[n],slh4[n],ore4[n];

for(i=0;i<m;i++)

do

{

cout<<"Introduceti plata pe ora a salariatului "<<i+1<<": ";cin>>slh4[i];

if(slh4[i]<=0)

cout<<"Ati gresit! Introduceti o valoare pozitiva!\n\n";

}while(slh4[i]<=0);

for(i=0;i<n;i++)

{

do

{

cout<<"Introduceti numarul de ore lucrate de catre salariatul "<<i+1<<": ";cin>>ore4[i];

if(ore4[i]<0 || ore4[i]!=(int)ore4[i])

cout<<"Ati gresit! Introduceti un numar natural !\n\n";

}while(ore4[i]<0 || ore4[i]!=(int)ore4[i]);

if(ore4[i]<=40)

angajati4[i]=ore4[i]*slh4[i];

else

angajati4[i]=40*slh4[i]+(ore4[i]-40)*1.5*slh4[i];

}

for(i=0;i<n;i++)

cout<<"Salariul angajatului "<<i+1<<" este "<<angajati4[i]<<" lei\n";

break;}

}

break;

case 2:

float slh2,nr2,p2;

do

{

cout<<"Introduceti plata pe ora(numar pozitiv nenul): ";cin>>slh2;

if(slh2<=0)

cout<<"Ati gresit! Introduceti o valoare pozitiva!\n\n";

}while(slh2<=0);

do

{

cout<<"Introduceti numarul de ore lucrate de catre salariat(numarul natural nenul):";cin>>nr2;

if(nr2<0 || nr2!=(int)nr2)

cout<<"Ati gresit! Introduceti un numar natural !\n\n";

}while(nr2<0 || nr2!=(int)nr2);

if(nr2<=40)

p2=nr2*slh2;

else

p2=40*slh2+(nr2-40)*1.5*slh2;

cout<<"Salariul angajatului este "<<p2<<" lei";

break;

}

return 0;

}

5)

Presupunem că o companie ne trimite un fișier text. Pe prima linie a fișierului text se afla numărul de angajați. Pe a doua linie se afla numărul de ore lucrate de fiecare angajat, iar pe a treia linie plata pe oră a fiecărui angajat. Noi trebuie sa îi trimitem acelei companii un fișier text cu salariile fiecărui angajat.

#include <iostream>

#include <fstream>

using namespace std;

int main()

{

cout << "Hello world!" << endl;

ifstream f("salariati.txt");

ofstream g("salarii.txt");

int m,n;

f>>m;

n=m;

if(m<=0 || int(m)!=m)

cout<<"Numar de salariati invalid";

else

{

float salariati[n],ore[n],salar[n];

unsigned int i;

for(i=0;i<n;i++)

f>>ore[i];

for(i=0;i<n;i++)

f>>salar[i];

for(i=0;i<n;i++)

if((int)ore[i]!=ore[i] || ore[i]<0 || salar[i]<=0 )

salariati[i]=-1;

else

if(ore[i]<=40)

salariati[i]=ore[i]*salar[i];

else

if(ore[i]>40)

salariati[i]=40*salar[i]+(ore[i]-40)*1.5*salar[i];

for(i=0;i<n;i++)

if(salariati[i]==-1)

g<<"Greseala de sintaxa la salariatul "<<i+1<<" . Va rugam introduceti datele corect! "<<endl;

else

g<<salariati[i]<<endl;

}

f.close();

g.close();

return 0;

}

6)

Presupunem că o companie ne trimite un fișier text. Pe prima linie a fișierului text se afla numărul de angajați. Pe următoarele linii se află datele angajaților, fiecare angajat pe câte o linie a fișierului cu nume, prenume, salariul orar și numărul de ore lucrate. Scriem într-un alt fișier greșilele întâmpinate din fișierul primit împreună cu explicația greșelii. În alt fișier scriem pe câte o linie numele și prenumele angajatului urmat de salariul acestuia.

#include <iostream>

#include <fstream>

using namespace std;

int main()

{

cout << "Hello world!" << endl;

ifstream f("angajati.txt");

ofstream g("salarii.txt");

ofstream h("greseli.txt");

int m,n;

f>>m;

n=m;

if(m<=0 || int(m)!=m)

h<<"Numar de salariati invalid";

else

{

struct salariati{ char nume[15], prenume[20];

float sh, ore, salar;

}ang[n];

unsigned int i;

for(i=0;i<n;i++)

f>>ang[i].nume>>ang[i].prenume>>ang[i].sh>>ang[i].ore;

for(i=0;i<n;i++)

if((int)ang[i].ore!=ang[i].ore || ang[i].ore<0 )

ang[i].salar=-1;

else

if(ang[i].sh<=0)

ang[i].salar=-2;

else

if(ang[i].ore<=40)

ang[i].salar=ang[i].ore*ang[i].sh;

else

if(ang[i].ore>40)

ang[i].salar=40*ang[i].sh+(ang[i].ore-40)*1.5*ang[i].sh;

for(i=0;i<n;i++)

if(ang[i].salar==-1)

h<<"Numarul de ore este gresit pe linia "<<i+2<<" din fisierul angajati.txt. "<<ang[i].nume<<" "<<ang[i].prenume<<" . Va rugam introduceti numarul de ore corect! "<<endl;

else

if(ang[i].salar==-2)

h<<"Salariul orar este gresit pe linia "<<i+2<<" din fisierul angajati.txt. "<<ang[i].nume<<" "<<ang[i].prenume<<" . Va rugam introduceti salariul corect! "<<endl;

else

g<<ang[i].nume<<" "<<ang[i].prenume<<"\t\t "<<ang[i].salar<<" lei"<<endl;

}

f.close();

g.close();

h.close();

return 0;

}

Programele de mai sus le găsiți puse deja în CodeBlocks:

Programe CodeBlocks