/* */

24 de agosto de 2007

Problema 3.4

.
Enunciado
En una empresa están liquidando los sueldos de sus empleados. Para ello cuentan con una planilla con la siguiente información de cada empleado:

  • nombre
  • sueldo básico
  • antigüedad
  • cantidad de hijos
El sueldo se liquida según la siguiente tabla:

Plus por Asignaciones Familiares:
. si el empleado tiene 3 hijos o más entonces recibe un plus del 20% de su sueldo básico.

Plus por Antigüedad:
. Los empleados percibirán un plus del 10% del sueldo básico si tienen una antigüedad entre 2 y 3 años. El 20% si su antugüedad es de entre 4 y 5 años y el 30% si la antigüedad es superior a 6 años.

Se pide desarrollar un programa que imprima:
a - El nombre de cada empleado y el sueldo neto a cobrar.
b - Al finalizar la carga de datos indique el monto total que debe abonar la empresa en concepto de sueldos.


Análisis
Toda la complejidad del problema está dada en calcular los plus por asignacion familiar y por antigüedad. Es decir: podemos encapsular esta complejidad en las siguientes dos funciones: obtAsignacionFamiliar y obtAsignacionAntiguedad. La primera estará en función del sueldo básico y de la cantidad de hijos, la segunda estará en función del sueldo básico y de la antigüedad.

Veamos entonces el programa principal.


Vemos lo simple que resulta el programa principal teniendo resuelto el problema de calcular cada una de las asignaciones extras. El programa se limita a leer los datos de cada empleado (iterando mientras no llegue nom="zzz") y por cada empleado calcular el plus por asignación familiar y el plus por asignación de antigüedad. Luego acumulamos los sueldos netos (sb+plusFam+plusAnt) para mostrar la suma al final del proceso y mostramos, por cada empleado, su nombre y su sueldo neto.

Veamos ahora la función obtAsignaciónFamiliar.


Para desarrollar la función solo tenemos que preguntar si la cantidad de hijos del empleado es mayor o igual al mínimo necesario para que le corresponda percibir la asignación. Este mínimo es (según el enunciado): 3.

Y Ahora la función obtAsignacionAntiguedad.



Para resolver esta función preguntamos por los diferentes rangos en los que puede estar la antigüedad del empleado y asignamos el valor que corresponda a plus. Luego retornamos el sueldo básico por el plus. La variable plus se inicializa en cero por lo que si la antigüedad del empleado no corresponden a ninguno de los rangos previstos al multiplicar basico*plus resultará cero. En esta caso la función retornará cero.

untSueldos.pas
   1:
2:unit untSueldos;
3:
4:interface
5:
6: const
7: // en esta seccion definimos las constantes
8: // para evitar "harcodear" todos los valores
9: // arbitrarios que aparecen en el problema
10:
11: // cantidad minima de hijos necesaria para que
12: // el empleado perciba la asignacion familiar
13: MIN_HIJOS = 3;
14:
15: // plus por asignacion familiar
16: PLUS_FAMILIAR = 0.20;
17:
18: // rangos de antiguedad necesaria para que
19: // el empleado pueda percibir el plus por
20: // segun su antiguedad
21: ANTIG1 = 2;
22: ANTIG2 = 4;
23: ANTIG3 = 5;
24:
25: // plus por antiguedad
26: PLUS1 = 0.10;
27: PLUS2 = 0.20;
28: PLUS3 = 0.30;
29:
30: // retorna el plus en funcion de la cantidad de
31: // hijos y del sueldo basico
32: function obtAsignacionFamiliar(
33: basico: real
34: ;cantHijos: integer):real;
35:
36: // retorna el plus en funcion de la antiguedad y
37: // del sueldo basico
38: function obtAsignacionAntiguedad(
39: basico: real
40: ;antig: integer):real;
41:
42:
43:
44:implementation
45:
46:function obtAsignacionFamiliar(
47: basico: real
48: ;cantHijos: integer):real;
49:var plus: real;
50:begin
51: // si la cantidad de hijos supera al minimo
52: // necesario para obtener el plus
53: if( cantHijos>=MIN_HIJOS ) then begin
54: plus:=PLUS_FAMILIAR;
55: end else begin
56: plus:=0;
57: end;
58: obtAsignacionFamiliar:=basico*plus;
59:end;
60:
61:function obtAsignacionAntiguedad(
62: basico: real
63: ;antig: integer):real;
64:var plus: real;
65:begin
66: plus:=0;
67:
68: if( (antig>=ANTIG1) AND (antig<ANTIG2) ) then begin
69: plus:=PLUS1;
70: end;
71: if( (antig>=ANTIG2) AND (antig<ANTIG3) ) then begin
72: plus:=PLUS1;
73: end;
74: if( antig>=ANTIG3 ) then begin
75: plus:=PLUS3;
76: end;
77:
78: obtAsignacionAntiguedad:=basico*plus
79:end;
80:
81:end.
82:

sueldos.pas
   1:
2:uses untSueldos;
3:
4:var nom:string[20]; sb:real; ant,ch: integer;
5: plusFam,plusAnt,neto,suma: real;
6:begin
7: // inicializo el acumulador en el que
8: // voy a acumular los sueldos netos
9: suma:=0;
10:
11: // leo los datos del primer empleado
12: write('Ingrese (nom,sb,ant,ch): ');
13: readln(nom,sb,ant,ch);
14:
15: while( nom<>'zzz' ) do begin
16:
17: // obtengo el plus familiar
18: plusFam:=obtAsignacionFamiliar(sb,ch);
19:
20: // obtengo el plus por antiguedad
21: plusAnt:=obtAsignacionAntiguedad(sb,ant);
22:
23: // calculo el sueldo neto
24: neto:=sb+plusFam+plusAnt;
25:
26: writeln(nom,', ',neto);
27:
28: // acumulo el sueldo neto
29: suma:=suma+neto;
30:
31: // leo los datos del proximo empleado
32: write('Ingrese (nom,sb,ant,ch): ');
33: readln(nom,sb,ant,ch);
34: end;
35:
36: // muestro el total a pagar (acumulado)
37: writeln('Total Sueldos:', suma);
38:end.
39:









.

No hay comentarios: