OTRO ejercicio URGENTE!

Por cada empleado de una empresa se leen tres datos que representan el nombre, sueldo básico y antigüedad de dicho empleado. Se debe emitir un listado que co0ntenga el nombre y sueldo a cobrar de todos los empleados. El sueldo se calcula adicionando al básico el 50% si la antigüedad supera los 10 años. El lote de datos finaliza con un nombre de empleado NN.
El ejercicio se puede hacer utilizando solamente arrays, procedimientos y/o funciones, además de los ya conocidos bucles while, for, repeat until, etc.

1 Respuesta

Respuesta
1
Otra vez.
empleado = record
nombre:string;
sueldo:real;
antiguedad:byte;
end;
arreglo : array of empleado
procedure GetData (var lista:arreglo);
begin
repeat
writeln('nombre');
readln (lista[lenght(lista)].nombre)
if lista[lenght(lista)].nombre <> NN
then
writeln('salario');
readln (lista[lenght(lista)].salario);
writeln('antiguedad');
readln (lista[lenght(lista)].antiguedad);
//aquí incrementa lenght del arreglo
until lista[lenght(lista)].nombre = NN
end;
// Aquí ya tienes los datos en la var lista
Ahora queda
procedure Reporte(lista:arreglo);
var
i:integer;
begin
for i:=1 to lenght(lista) do
begin
write (lista.nombre);
write(' ');
if lista.antiguedad > 10
then
writeln(3/2*lista.salario)
else
writeln(lista.salario);
end;
Bueno, lo de 3\2 es una cuenta matemática, puedes verificarla.
Espero que con esto quedes satisfecho(a)
¿Se podrá hacer este ejercicio sin usar
registros?
No puedo usar registros, este es mi intento, ¿podrías corregirlo?
program ejercicio24;
uses crt;
const
max=20;
diez=10;
type
antiguedad=0..60;
vector1=array[1..max] of string[20];
vector2=array[1..max] of real;
vector3=array[1..max] of antiguedad;
var
nombre:vector1;
sueldo:vector2;
antig:vector3;
n:integer; nn:string[2];
procedure LeerDatosEmpleado(var nom:vector1;var sal:vector2; var ant:vector3; i:integer);
var j:integer;
begin
for j:=1 to i do
writeln ('escriba el nombre del empleado',j:3);
readln (nom[j]);
while nom[j]<> nn do
begin
writeln ('ingrese el salario correspondiente a: ', nom[j]);
readln (sal[j]);
writeln ('Ingrese antiguedad de:', nom[j] );
readln (ant[j]);
end;
end;
procedure VisualizarDatos(var nom:vector1;var sal:vector2;i:integer);
var j:integer;
begin
for j:=1 to i do
writeln ('empleado: ', nom[j] , 'sueldo basico: ', sal[j]:4:1);
end;
procedure Extra(var nom:vector1;var sal:vector2 ;var ant: vector3;i:integer);
var j:integer;
begin
for j:=1 to i do
begin
if ant[j]>diez then sal[j]:=sal[j]+(sal[j]/2);
writeln('el sueldo total de ',nom[j], ' es: ', sal[j]:3:1);
end;
end;
begin
clrscr;
writeln ('ingrese cantidad de empleados');
readln(n);
LeerDatosEmpleado(nombre,sueldo,antig,n);
VisualizarDatos(nombre,sueldo,n);
Extra(nombre,sueldo,antig,n);
readln;
end.
Como idea general el problema lo has desarrollado bien, la idea de los registros es precisamente llevar de 3 arreglos a 1; si no puedes utilizarlos entonces la solución será como la planteas, un arreglo para cada campo y entonces tener en cuenta acceder al mismo índice en cada arreglo. Muy bien. Ahora de tu solución me preocupa otra cosa: defines un arreglo donde la cantidad de elementos max=20 y me dices que tu realmente no sabes de que longitud es el arreglo hasta que en tiempo de ejecución el usuario lo determina con NN. Qué pasa si tecleo 21 empleados, un error por supuesto. Esto puedes corregirlo si en vez de utilizar arreglos estáticos utilizas otra estructura de datos que no tengas que saber el # max de elementos en tiempo de diseño, ¿cuál? La más sencilla son los arreglos dinámicos, sólo se diferencian en la declaración (omites la parte [1.. max]) y en que cada vez que entres un nuevo empleado debes incrementar la longitud. Con esta estructura no tendrás problemas y tu resultado será perfecto y sin errores.
Buena suerte.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas