PROGRAM EJ2013_3 ---------------------- TRABAJADOR ---------------------- TASK TYPE Trabajador; TASK BODY Trabajador IS VAR box: INTEGER; BEGIN LOOP box := elegirBox(); boxes[box].IngresarTrabajador(); producirChips(box); producirChips(box); boxes[box].EgresarTrabajador(); descansar(); END; END; ---------------------- BOX ---------------------- TASK TYPE Box IS ENTRY JefeConTrabajador(cambio: IN {SACO, AGREGO, NADA}); ENTRY JefeSinTrabajador(); ENTRY IngresarAuditor(); ENTRY EgresarAuditor(); ENTRY IngresarTrabajador(); ENTRY EgresarTrabajador(); END; TASK BODY Box IS VAR cantMaqDisp: INTEGER; cantMaq: INTEGER; cantAuditores: INTEGER; cantTrabajadores: INTEGER; BEGIN cantMaq := 2; cantMaqDisp := cantMaq; cantAuditores := 0; cantTrabajadores := 0; LOOP SELECT ACCEPT JefeConTrabajador(cambio: IN {SACO, AGREGO, NADA}) DO IF cambio == AGREGO THEN cantMaq := cantMaq + 1; cantMaqDisp := cantMaqDisp + 1; END; END; OR WHEN cantMaqDisp > 0 DO ACCEPT JefeSinTrabajador(); cantMaq := cantMaq - 1; cantMaqDisp := cantMaqDisp - 1; END; OR WHEN cantMaqDisp == cantMaq DO -- Equivalente a que no hayan trabajadores en el box ACCEPT IngresarAuditor(); cantAuditores := cantAuditores + 1; END; OR ACCEPT EgresarAuditor(); cantAuditores := cantAuditores - 1; OR ACCEPT EgresarTrabajador(); cantMaqDisp := cantMaqDisp + 1; cantTrabajadores := cantTrabajadores - 1; OR WHEN cantMaqDisp > 0 AND IngresarAuditor' COUNT <> 0 -- ¿Por qué en la solución no utiliza COUNT? Podría hacerlo en lugar de un contador de auditores que quieran ingresar, ¿no? AND cantAuditores == 0 AND JefeSinTrabajador' COUNT <> 0 DO ACCEPT IngresarTrabajador(); cantMaqDisp := cantMaqDisp - 1; cantTrabajadores := cantTrabajadores + 1; END; END; END; END; ---------------------- AUDITOR ---------------------- TASK TYPE Auditor; TASK BODY Auditor IS VAR box: INTEGER; aspecto: INTEGER; BEGIN LOOP box := elegirBox(); aspecto := elegirAspecto(); boxes[box].IngresarAuditor(); auditar(aspecto, box); boxes[box].EgresarAuditor(); END; END; ---------------------- JEFE ---------------------- TASK Jefe; TASK BODY Jefe IS VAR box: INTEGER; cambio: {SACO, AGREGO, NADA}; BEGIN LOOP determinarPoliticasDeProduccion(); box := elegirBox(); cambio := elegirCambio(box); IF cambio == SACO THEN boxes[box].JefeSinTrabajador() ELSE boxes[box].JefeConTrabajador(cambio) END; END; END; ---------------------- PROGRAMA PRINCIPAL ---------------------- VAR boxes: ARRAY[1..50] OF Box; auditores: ARRAY[1..2] OF Auditor; trabajadores: ARRAY[1..x] OF Trabajador; BEGIN END.