În Pascal vă rog:
Într-o firma sunt n angajați, numerotați de la 1 la n, fiecare angajat având un singur șef direct, cu excepția directorului, care nu are șef. Ierarhia firmei este dată printr-un vector de tip TATA. Fiecare angajat al firmei are un salariu dat printr-un număr natural. Angajații și șeful sunt recompensați astfel: câștigul fiecărui salariat este egal cu salariul său la care se adaugă media aritmetică a câștigurilor subordonaților săi direcți. Media aritmetică se rotunjește prin adaos la un număr întreg (de exemplu 5.33 se rotunjește la 6). Angajații care nu au subordonați direcți câștigă doar salariul.
Calculați care este câștigul directorului firmei.
Exemplu:
date.in
8 (numărul de angajați)
4 3 0 3 2 1 2 1 (vectorul TATA)
2 6 4 3 7 3 1 5 (salariul fiecărui angajat)
date.out
14
Răspunsuri la întrebare
Răspuns de
1
Ti-am lasat toate comentariile pe care le-am facut ca sa vad pasii programului. Poate o sa te ajute sa-l intelegi mai usor
program angajat;
type copii=array[1..50] of cardinal;
var tata:array[1..50] of cardinal;
salariu:array[1..50] of integer;
nr_angajati:integer;
fisierIntrare,fisierIesire:string;
tfIn,tfOut:Text;
//functie care determina directorul
function gaseste_director():cardinal;
var i:integer;
begin
for i:=1 to nr_angajati do
//sungurul angajat care nu are superior, tata 0
if tata[i]=0 then
begin
gaseste_director:=i;
break;
end;
end;
//procedura care determina nr copii si indicii lor
procedure suma_copii(x:cardinal;var nr_copii:integer;var indici_copii:copii);
var i:integer;
begin
for i:=1 to nr_angajati do
//daca vectorul tata indica faptul ca x este tata
if tata[i]=x then
begin
//mareste nr de copii ai lui x
nr_copii:=nr_copii+1;
//noteaza indicele copilului
indici_copii[nr_copii]:=i;
end;
end;
//functie care calculeaza salariul unui angajat
function calc_salariu(x:cardinal):integer;
var salariu_angajat,i,s:integer;
nr_copii:integer;
indici_copii:copii;
begin
//initial presupunem ca angajatul nu are subalterni(copii)
nr_copii:=0;
//suma initiala pe care o ia este 0
s:=0;
//determinam nr de copii si indicii acestora
suma_copii(x,nr_copii,indici_copii);
//writeln('Tata si copii:',x,' ',nr_copii);
//readln;
//daca respectivul angajat nu are copii/subalterni, castiga doar salariul
if nr_copii=0 then
salariu_angajat:=salariu[x]
else
begin
//treci prin toti angajatii pe care ii are
for i:=1 to nr_copii do
begin
//writeln('Copil ',indici_copii[i]);
//readln;
//calcuam suma salariilor copiilor/subalternilor
s:=s+calc_salariu(indici_copii[i]);
end;
//writeln('Suma copiilor:',s);
//salariul angajatului este media copiilor plus salariul sau
salariu_angajat:=salariu[x]+round(s/nr_copii);
//writeln('Suma copii:',s,' salariu calc: ',salariu_angajat);
end;
calc_salariu:=salariu_angajat;
end;
var j:integer;
director:cardinal;
begin
fisierIntrare:='date.in';
fisierIesire:='date.out';
AssignFile(tfIn,fisierIntrare);
reset(tfIn);
readln(tfIn,nr_angajati);
//citim superiorii si angajatii
for j:=1 to nr_angajati do
read(tfIn,tata[j]);
for j:=1 to nr_angajati do
read(tfIn,salariu[j]);
//gasesc directorul
director:=gaseste_director();
//writeln(director);
//writeln('Salariu director:',calc_salariu(director));
AssignFile(tfOut,fisierIesire);
rewrite(tfOut);
writeln(tfOut,calc_salariu(director));
close(tfOut);
end.
program angajat;
type copii=array[1..50] of cardinal;
var tata:array[1..50] of cardinal;
salariu:array[1..50] of integer;
nr_angajati:integer;
fisierIntrare,fisierIesire:string;
tfIn,tfOut:Text;
//functie care determina directorul
function gaseste_director():cardinal;
var i:integer;
begin
for i:=1 to nr_angajati do
//sungurul angajat care nu are superior, tata 0
if tata[i]=0 then
begin
gaseste_director:=i;
break;
end;
end;
//procedura care determina nr copii si indicii lor
procedure suma_copii(x:cardinal;var nr_copii:integer;var indici_copii:copii);
var i:integer;
begin
for i:=1 to nr_angajati do
//daca vectorul tata indica faptul ca x este tata
if tata[i]=x then
begin
//mareste nr de copii ai lui x
nr_copii:=nr_copii+1;
//noteaza indicele copilului
indici_copii[nr_copii]:=i;
end;
end;
//functie care calculeaza salariul unui angajat
function calc_salariu(x:cardinal):integer;
var salariu_angajat,i,s:integer;
nr_copii:integer;
indici_copii:copii;
begin
//initial presupunem ca angajatul nu are subalterni(copii)
nr_copii:=0;
//suma initiala pe care o ia este 0
s:=0;
//determinam nr de copii si indicii acestora
suma_copii(x,nr_copii,indici_copii);
//writeln('Tata si copii:',x,' ',nr_copii);
//readln;
//daca respectivul angajat nu are copii/subalterni, castiga doar salariul
if nr_copii=0 then
salariu_angajat:=salariu[x]
else
begin
//treci prin toti angajatii pe care ii are
for i:=1 to nr_copii do
begin
//writeln('Copil ',indici_copii[i]);
//readln;
//calcuam suma salariilor copiilor/subalternilor
s:=s+calc_salariu(indici_copii[i]);
end;
//writeln('Suma copiilor:',s);
//salariul angajatului este media copiilor plus salariul sau
salariu_angajat:=salariu[x]+round(s/nr_copii);
//writeln('Suma copii:',s,' salariu calc: ',salariu_angajat);
end;
calc_salariu:=salariu_angajat;
end;
var j:integer;
director:cardinal;
begin
fisierIntrare:='date.in';
fisierIesire:='date.out';
AssignFile(tfIn,fisierIntrare);
reset(tfIn);
readln(tfIn,nr_angajati);
//citim superiorii si angajatii
for j:=1 to nr_angajati do
read(tfIn,tata[j]);
for j:=1 to nr_angajati do
read(tfIn,salariu[j]);
//gasesc directorul
director:=gaseste_director();
//writeln(director);
//writeln('Salariu director:',calc_salariu(director));
AssignFile(tfOut,fisierIesire);
rewrite(tfOut);
writeln(tfOut,calc_salariu(director));
close(tfOut);
end.
eugenius:
Un MARE mulțumesc!
Alte întrebări interesante
Chimie,
8 ani în urmă
Engleza,
8 ani în urmă
Matematică,
8 ani în urmă
Matematică,
9 ani în urmă
Matematică,
9 ani în urmă
Matematică,
9 ani în urmă
Limba română,
9 ani în urmă