Informatică, întrebare adresată de eugenius, 9 ani în urmă

Î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 blindseeker90
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.

eugenius: Un MARE mulțumesc!
Alte întrebări interesante