PDA

Ver la Versión Completa : [Duda] Problemas de lógica en el código


dariodr
8 de agosto de 2022, 11:44
Hola, pido ayuda a ustedes. Tengo este codigo de empleados de una empresa, todo esta bien lo que no logro es mostrar el sueldo menor.
Salu2.
NOTA: Codigo en OpenCobol

IDENTIFICATION DIVISION.
PROGRAM-ID. empresa.

DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
01 EMPRESA.
03 EMPLEADOS OCCURS 100 TIMES.
05 NOMBRE PIC A(15).
05 SUELDO PIC 9(6).
05 CATEGORIA PIC 9.
77 WS-I PIC 999 VALUE 1.
77 MAS-DATOS PIC A.
77 WS-J PIC 999.
77 NOMBRE1 PIC A(15).
77 NOMBRE2 PIC A(15).

* Contadores para la categorias
01 WS-A PIC 999 VALUE 0.
01 WS-B PIC 999 VALUE 0.
01 WS-C PIC 999 VALUE 0.
01 WS-D PIC 999 VALUE 0.
*Variables auxiliares
01 MAS-2000 PIC 999.
01 CAT1-MAS-1000 PIC 999.
01 MAYOR PIC 9(6).
01 MENOR PIC 9(6).

PROCEDURE DIVISION.
MAIN-PROCEDURE.
PERFORM INGRESO-DATOS.
PERFORM EMPLEADOS-CATEGORIA.
PERFORM MAS-DE-2000.
PERFORM CATEGORIA-1-MAS-1000.
PERFORM SUELDO-MAYOR.
PERFORM SUELDO-MENOR.
STOP RUN.

INGRESO-DATOS.
PERFORM UNTIL MAS-DATOS = 'N'
DISPLAY "Nombre del empleado: " NO ADVANCING
ACCEPT NOMBRE(WS-I)
DISPLAY "Sueldo del empleado: " NO ADVANCING
ACCEPT SUELDO(WS-I)
DISPLAY "Categoria (1-4): " NO ADVANCING
ACCEPT CATEGORIA(WS-I)
ADD 1 TO WS-I
DISPLAY " "
DISPLAY "Agregar otro empleado [S/N]: " NO ADVANCING
ACCEPT MAS-DATOS
END-PERFORM.
*
EMPLEADOS-CATEGORIA.
PERFORM VARYING WS-J FROM 1 BY 1 UNTIL WS-J > WS-I
EVALUATE CATEGORIA(WS-J)
WHEN 1 ADD 1 TO WS-A
WHEN 2 ADD 1 TO WS-B
WHEN 3 ADD 1 TO WS-C
WHEN 4 ADD 1 TO WS-D
END-EVALUATE
END-PERFORM.
DISPLAY " ".
DISPLAY "Empleados en categoria 1: " WS-A.
DISPLAY "Empleados en categoria 2: " WS-B.
DISPLAY "Empleados en categoria 3: " WS-C.
DISPLAY "Empleados en categoria 4: " WS-D.
*
MAS-DE-2000.
PERFORM VARYING WS-J FROM 1 BY 1 UNTIL WS-J > WS-I
IF SUELDO(WS-J) > 2000
ADD 1 TO MAS-2000
END-IF
END-PERFORM.
DISPLAY " ".
DISPLAY "Empleados que cobran mas de 2000: " MAS-2000.

* EMPLEADOS DE LA CATEGORIA 1 CON SUELDO MAYOR A $1000
CATEGORIA-1-MAS-1000.
PERFORM VARYING WS-J FROM 1 BY 1 UNTIL WS-J > WS-I
IF CATEGORIA(WS-J) = 1 AND SUELDO(WS-J) > 1000
ADD 1 TO CAT1-MAS-1000
END-IF
END-PERFORM.
DISPLAY " ".
DISPLAY "Categoria 1 que cobran mas de 1000: " CAT1-MAS-1000.

* CALCULO DEL SUELDO MAYOR
SUELDO-MAYOR.
MOVE 0 TO MAYOR.
PERFORM VARYING WS-J FROM 1 BY 1 UNTIL WS-J > WS-I
IF SUELDO(WS-J) > MAYOR
MOVE SUELDO(WS-J) TO MAYOR
MOVE NOMBRE(WS-J) TO NOMBRE1
END-IF
END-PERFORM.
DISPLAY " ".
DISPLAY "El empleado con mayor sueldo es: " NOMBRE1.
DISPLAY "Y su sueldo es: " MAYOR.

* Calculo del sueldo menor
SUELDO-MENOR.
MOVE SUELDO(1) TO MENOR.
PERFORM VARYING WS-J FROM 2 BY 1 UNTIL WS-J > WS-I
IF SUELDO(WS-J) < MENOR
MOVE SUELDO(WS-J) TO MENOR
MOVE NOMBRE(WS-J) TO NOMBRE2
END-IF
END-PERFORM.
DISPLAY "El empleado con menor sueldo es: " NOMBRE2.
DISPLAY "El sueldo minimo es : " MENOR.

Kuk
8 de agosto de 2022, 12:50
@dariodr, yo creo que debes haces 2 cosas:

Dar más detalles acerca de lo que no te sale. Lo de "no logco sacar saldo menor" no dice nada y obliga a que la gente estudie en detalle tu programa
Pasar con el deburador (debugger)

JCantero
8 de agosto de 2022, 18:16
Echando un vistazo por encima, creo que debes cambiar en todos los bucles

... UNTIL WS-J > WS-I


por


..... UNTIL WS-J = WS-I


Ya que "WS-I" es el elemento del array no rellenado todavia.

Y por consiguiente no te funcionaria ningun bucle, si alguno te funciona es porque el elemento "WS-I" evaluado está a cero y blanco y no te varia el resultado, pero en el "sueldo minimo" te saldra "cero" del trabajador " ".