ADA examen 2014 marzo

ADA examen 2014 marzo

de Pedro Liber Antonio Carrasco Aguilar -
Número de respuestas: 0
http://www.fing.edu.uy/inco/cursos/sistoper/examenes/2014/Sol2014MAR.pdf
Esta solucion estaria bien? En negrita esta lo que se modifica respecto a la solucion planteada

Task Portero Is
  ENTRY llega_embarazada(out id: integer);
  ENTRY llega_adulto_mayor(out id: integer);
  ENTRY llega_adulto(out id: integer);
  ENTRY salir(id: integer);
//NO ESTA ACA ATENDER CLIENTE
  ENTRY indicar_ejecutivo[1..20](out ejecutivo: integer);
  ENTRY termine_ejec(nro_ejec: integer)
End Task;

Task Body Portero Is
  VAR libres, orden, ejec_libres: cola of Integer; //son los ejutivos libres
  i,n:Iinteger;
Begin
  for i = 1 to 5
    Ejecutivos[i].dame_id(i);
  endfor
  for i = 1 to 20
    libres.encolar(i); //numero que le dan a los clientes
  endfor;
  i = 1;//primer numero que se le da al clinte
  loop
    SELECT
      when cant < 20 AND llega_embarazada'count = 0 AND llega_adulto_mayor'count = 0 =>
    ACCEPT llega_adulto(out id: integer)
      id=i;
    End;
    i = libres.desencolar();
    orden.encolar(i);
    cant = cant + 1;
      OR when cant < 20 AND llega_embarazada'count = 0 =>
    ACCEPT llega_adulto_mayor(out id: integer)
      id=i;
    End;
    i = libres.desencolar();
    orden.encolar(i);
    cant = cant + 1;
      OR when cant < 20 =>
    ACCEPT llega_embarazada(out id: integer)
     id=i;
    End;
    i = libres.desencolar();
    orden.encolar(i);
    cant = cant + 1;
      OR ACCEPT salir(id: integer)
      i=id;
     End;
     libres.encolar(i);
     cant = cant - 1;
      OR when ejec_libres.NotEmpty() && orden.NotEmpty() => ACCEPT indicar_ejecutivo[orden.dequeue()](ejecutivo) // tal vez el orden.deque() se hagas mas veces de las que quiero si la guarda se cumple y luego primero el select toma un "salir" o la entrada de otro cliente?????
        ejecutivo = ejec_libres.dequeue();
        End;
      OR ACCEPT termine_ejec(nro_ejec: integer)
        n=nro_ej;
        End;
        ejec_libres.enqueue(n);
      ENDSELECT;
  endloop
End Task;

Task Type Cliente Is
End Task;

Task Body Cliente Is
  VAR id, ejecutivo: integer;
  planilla: Planilla;
  plan: Plan;
Begin
  if tipo_cliente() = Embarazada
    Portero.llega_embarazada(id);
  else if tipo_cliente() = AdultoMayor
    Portero.llega_adulto_mayor(id);
  else
    Portero.llega_adulto(id);
  endif;
  endif;
  planilla = rellenar_planilla();
  Portero.indicar_ejecutivo[id](ejecutivo);
  Ejecutivos[ejecutivo].elaborar_plan(planilla, plan);
  Portero.salir(id);
End Task;

Task Type Ejecutivo Is
  ENTRY dame_id(id: integer);
  ENTRY elaborar_plan(planilla: Planilla, out plan: Plan);
  End Task;
  Task Body Ejecutivo Is
  VAR mi_id: Integer;
// no esta atender
Begin
  ACCEPT dame_id(id: integer)
    mi_id = id;
  END;
  Loop
    SELECT
      ACCEPT elaborar_plan(planilla: Planilla, out plan: Plan)
    plan = elaborar_plan(planilla);
      END;
      Portero.termine_ejec(mi_id)
      ELSE

    ordenar_carpetas();
    ENDSELECT;
  EndLoop
EndTask;
 
VAR Ejecutivos: array (1..5) of Ejecutivo;