Răspuns :
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.
Vă mulțumim pentru vizita pe site-ul nostru dedicat Informatică. Sperăm că informațiile disponibile v-au fost utile și inspiraționale. Dacă aveți întrebări sau aveți nevoie de suport suplimentar, suntem aici pentru a vă ajuta. Ne face plăcere să vă revedem și vă invităm să adăugați site-ul nostru la favorite pentru acces rapid!