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: