741
C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más / Re:Programa de Turbo Pascal
« en: 10 de Marzo 2020, 13:55 »
Hola.
No estoy muy seguro de que ordenar el array sea al mejor forma para encontrar "trabajadores menores" que ganen más que los "mayores".
A mí la solución que se me ocurre es usar bucles for anidados.
- El bucle principal recorre el array buscando trabajadores menores.
- Cuando encuentra a uno, podemos hacer una copia de él en una variable de tipoPersona(no es necesario hacer la copia pero así al leer el código se entiende mejor lo que hacemos)
- Hecha la copia, arranca el bucle anidado que hace su propio recorrido del array pero buscando trabajadores mayores.
- Cada vez que encuentra a uno, compara su salario anual con el del trabajador menor que hemos hecho una copia.
Si el trabajador menor tiene mayor salario anual que el trabajador mayor, entonces mostramos sus datos en pantalla e interrumpimos el bucle anidado con la sentencia break.
Interrumpimos porque ya no es necesario que siga buscando, ya hemos encontrado al menos un trabajador mayor que gana menos que el menor, así que interrumpimos el bucle anidado y entonces el bucle principal retoma su búsqueda de otros empleados menores y repetirá el proceso hasta que haya recorrido todo el array.
Te dejo un nuevo código con esta nueva opción añadida.
Además he cambiado el código de la opción para añadir un nuevo trabajador.
Como dije antes, ahí pusiste un bucle que no tenía mucho sentido porque cada vez que añadías un trabajador, se recorría todo el array recalculando los atributos de los trabajadores añadidos anteriormente.
He quitado el bucle y reordenado la estructura del do .... with y el if.
Creo que ahora queda más ordenado, pero comprueba tú mismo que todos los atributos se calculan correctamente según el salario, por si me he equivocado.
También he hecho otros cambios menores. He visto que usabas distintas variables/atributos para el salario mensual (sal_men y sal_mensual), el anual (sal_anu y sal_anual), vacaciones... según si el trabajador era de salario menor o salario mayor.
Esto es innecesario, el nombre de estos atributos pueden ser iguales en ambos casos.
Lo único que ha de ser diferente es como se calculan sus valores, pero los nombres no es necesario que cambien. De hecho, es mejor que sean iguales.
Otra cosa que he cambiado ha sido declarar la variable cesta como una constante, ya que según entiendo por el enunciado, su valor siempre va a ser el mismo.
Aquí el código, pregunta si algo no lo entiendes o dime si me equivocado en algo interpretando el enunciado.
No estoy muy seguro de que ordenar el array sea al mejor forma para encontrar "trabajadores menores" que ganen más que los "mayores".
A mí la solución que se me ocurre es usar bucles for anidados.
- El bucle principal recorre el array buscando trabajadores menores.
- Cuando encuentra a uno, podemos hacer una copia de él en una variable de tipoPersona(no es necesario hacer la copia pero así al leer el código se entiende mejor lo que hacemos)
- Hecha la copia, arranca el bucle anidado que hace su propio recorrido del array pero buscando trabajadores mayores.
- Cada vez que encuentra a uno, compara su salario anual con el del trabajador menor que hemos hecho una copia.
Si el trabajador menor tiene mayor salario anual que el trabajador mayor, entonces mostramos sus datos en pantalla e interrumpimos el bucle anidado con la sentencia break.
Interrumpimos porque ya no es necesario que siga buscando, ya hemos encontrado al menos un trabajador mayor que gana menos que el menor, así que interrumpimos el bucle anidado y entonces el bucle principal retoma su búsqueda de otros empleados menores y repetirá el proceso hasta que haya recorrido todo el array.
Te dejo un nuevo código con esta nueva opción añadida.
Además he cambiado el código de la opción para añadir un nuevo trabajador.
Como dije antes, ahí pusiste un bucle que no tenía mucho sentido porque cada vez que añadías un trabajador, se recorría todo el array recalculando los atributos de los trabajadores añadidos anteriormente.
He quitado el bucle y reordenado la estructura del do .... with y el if.
Creo que ahora queda más ordenado, pero comprueba tú mismo que todos los atributos se calculan correctamente según el salario, por si me he equivocado.
También he hecho otros cambios menores. He visto que usabas distintas variables/atributos para el salario mensual (sal_men y sal_mensual), el anual (sal_anu y sal_anual), vacaciones... según si el trabajador era de salario menor o salario mayor.
Esto es innecesario, el nombre de estos atributos pueden ser iguales en ambos casos.
Lo único que ha de ser diferente es como se calculan sus valores, pero los nombres no es necesario que cambien. De hecho, es mejor que sean iguales.
Otra cosa que he cambiado ha sido declarar la variable cesta como una constante, ya que según entiendo por el enunciado, su valor siempre va a ser el mismo.
Aquí el código, pregunta si algo no lo entiendes o dime si me equivocado en algo interpretando el enunciado.
Código: [Seleccionar]
program ACME;
type
tipoPersona = record
nombre: string;
salario: real;
sal_anual: real;
sal_mensual: real;
utilidades: real;
vacaciones: real;
bono: real;
cedula: string;
end;
const
capacidad = 1000;
cesta = 200;
var
tra: array[1..capacidad] of tipoPersona;
trabajadorMenor: tipoPersona;
cantidad: integer;
opcion: integer;
i, j: integer;
textoBuscar: string;
encontrado: boolean;
bono: real;
seBorro:boolean;
acumMedia :real;
contMedia: integer;
{Cuerpo del programa principal}
begin
cantidad := 0;
repeat
WriteLn('***BIENVENIDO A ACME***');
WriteLn;
WriteLn('1- Agregar Trabajador');
WriteLn('2- Todos los trabajadores');
WriteLn('3- Buscar a un trabajador');
WriteLn('4- Reporte 1');
WriteLn('5- Reporte 2');
WriteLn('6- Eliminar trabajador');
WriteLn('7- Promedio Nomina Mayor');
WriteLn('8- Promedio Nomina Menor');
WriteLn('9- Promedio General');
writeln('10- Trabajadores de Nomina Menor que ganan mas que algunos de Nomina Mayor');
WriteLn('0- Salir');
Write('Escoja una opcion: ');
ReadLn(opcion);
WriteLn;
case opcion of
1: { Agregar trabajador }
if (cantidad < capacidad) then
begin
inc(cantidad);
WriteLn('Introduciendo al trabajador ', cantidad);
Write('Introduzca Cedula del trabajador: ');
ReadLn(tra[cantidad].cedula);
Write('Introduzca el nombre del trabajador: ');
ReadLn(tra[cantidad].nombre);
Write('Introduzca Salario: ');
ReadLn(tra[cantidad].salario);
with tra[cantidad] do begin
if salario > 1500 then begin
utilidades := salario * 2;{2 meses de utilidades}
vacaciones := salario;{1 mes de bono vacacional}
bono := salario * 0.1;{10% productividad, se paga mensual}
sal_mensual := salario + bono;
sal_anual := sal_mensual * 12 + utilidades + vacaciones;
end
else begin {salario es <= a 1500}
utilidades := salario * 4;{4 meses de utilidades}
vacaciones := salario;{1 mes de bono vacacional}
sal_mensual := salario + cesta;{cesta ticket mensual}
sal_anual := sal_mensual * 12 + utilidades + vacaciones;
end;
end;
end;
2: begin {Todos los trabajadores}
if cantidad = 0 then
WriteLn('No hay datos')
else
for i := 1 to cantidad do
WriteLn(i,' ',tra[i].cedula,' ',tra[i].nombre,' ',tra[i].salario:4:2);
WriteLn;
end;
3: {Buscar a un trabajador}
begin
Write('Escriba cedula del trabajador ');
ReadLn( textoBuscar );
encontrado := false;
for i := 1 to cantidad do
if pos (textoBuscar, tra[i].cedula) > 0 then
begin
encontrado := true;
WriteLn( i,' - Cedula: ', tra[i].cedula,',Nombre: ', tra[i].nombre,', Salario: ', tra[i].salario:4:2);
end;
if not encontrado then
WriteLn('No se ha encontrado.');
WriteLn;
end;
4: {Reporte 1 }
for i := 1 to cantidad do
begin
if tra[i].salario > 1500 then
begin
writeln('Nombre del trabajador: ', tra[i].nombre);
WriteLn('Salario: ', tra[i].salario:4:2);
WriteLn('Bono: ', tra[i].bono:4:2);
WriteLn('Total: ', tra[i].sal_mensual:4:2);
end;
end;
5: { Reporte 2}
for i := 1 to cantidad do
begin
if tra[i].salario <= 1500 then
begin
writeln('Nombre del trabajador: ', tra[i].nombre);
WriteLn('Salario: ', tra[i].salario:4:2);
WriteLn('Cestaticket: ', cesta);
WriteLn('Total: ', tra[i].sal_mensual:4:2);
end;
end;
6: {Borra un trabajador}
begin
write('Nombre a buscar: ');
readln(textoBuscar);
seBorro := false;
for i := 1 to cantidad do begin
{ReadLn(tra[cantidad].nombre);}
if (textoBuscar = tra[i].nombre) then
begin
seBorro := true;
dec(cantidad);
with tra[i] do begin
nombre:='';
salario:=0;
sal_anual:=0.0;
sal_mensual:=0.0;
utilidades:=0;
vacaciones:=0;
bono:=0;
end;
end;
end;
end;
7: {Promedio Nomina Mayor}
begin
acumMedia:= 0;
contMedia:= 0;
for i := 1 to cantidad do
if tra[i].salario > 1500 then
begin
acumMedia := acumMedia + tra[i].salario;
inc(contMedia);
end;
if (contMedia = 0) then
writeln('No hay trabajadores con salario mayor de 1500')
else
writeln('Promedio Nomina Mayor es: ', acumMedia/contMedia:4:2);
end;
8: {Promedio Nomina Menor}
begin
acumMedia:= 0;
contMedia:= 0;
for i := 1 to cantidad do
if tra[i].salario <= 1500 then
begin
acumMedia := acumMedia + tra[i].salario;
inc(contMedia);
end;
if (contMedia = 0) then
writeln('No hay trabajadores con salario menor o igual a 1500')
else
writeln('Promedio Nomina Menor es: ', acumMedia/contMedia:4:2);
end;
9: {Promedio general}
begin
if (cantidad = 0) then
writeln('No hay trabajadores registrados')
else
begin
acumMedia:= 0;
contMedia:= 0;
for i := 1 to cantidad do
begin
acumMedia := acumMedia + tra[i].salario;
inc(contMedia);
end;
writeln('Promedio general es: ', acumMedia/contMedia:4:2);
end;
end;
10: {Trabajadores Menores que ganan mas que Mayores}
begin
writeln('Trabajadores Menores que ganan mas que Mayores:');
for i:= 1 to cantidad do {Bucle principal busca trabajadores menores}
if tra[i].salario <= 1500 then
begin
trabajadorMenor := tra[i];
for j:= 1 to cantidad do {Bucle anidado busca empleados mayores para comparar salario anual}
if (tra[j].salario > 1500) and (tra[j].sal_anual < trabajadorMenor.sal_anual) then
{trabajador menor gana mas que un trabajador mayor, mostramos sus datos}
begin
writeln();
writeln('Nombre:', trabajadorMenor.nombre);
writeln('Salario Anual:', trabajadorMenor.sal_anual:4:2);
break; {Cerramos bucle anidado, no es necesario seguir buscando para este trabajador Menor}
end;
end;
end;
0: { salir}
begin
WriteLn;
WriteLn('Saliendo...');
WriteLn;
end;
else
begin
WriteLn;
WriteLn('Opción incorrecta!');
WriteLn;
end;
end; { Fin de "case" }
until opcion = 0;
end.