You are on page 1of 7

{****************************************************************************

LENGUAJE C/PASCAL
modelo examen
'Sistema de choferes'
*****************************************************************************}
Program Parcial;

uses
crt;

Const
Max_Leg = 100;
Max_Nom = 15;
FinNombre = '*';

Type
tRIndice = 0..Max_Leg;
tRNombre = 1..Max_Nom;
tRVNombre = 1..Max_Leg;
tDias = (Lunes,Martes,Miercoles,Jueves,Viernes,Sabado,Domingo);
tCTurno = Set of tDias;
tNombre = Array[tRNombre] of Char;
tVNombre = Array[tRVNombre] of tNombre;
tVTurno = Array[tRVNombre] of tCTurno;
tVHorario = Array[tDias] of Real;
tVAux = Array[tRVNombre] of tRVNombre;

Procedure CargarNombre(var v:tNombre);

var
i: tRNombre;
c: Char;

Begin
i:=1;
v[i]:=FinNombre;
Read(c);
While (c <> FinNombre) and (i <= Max_Nom) do
Begin
v[i]:=c;
Read(c);
inc(i);
end;
end;

Function DameDia (Dia:tDias):String;

Begin
Case dia of
Lunes : Damedia:= 'Lunes';
Martes : Damedia:= 'Martes';
Miercoles : Damedia:= 'Mircoles';
Jueves : Damedia:= 'Jueves';
Viernes : Damedia:= 'Viernes';
Sabado : Damedia:= 'Sabado';
Domingo : Damedia:= 'Domingo';
end;
end;
Procedure MostrarDias(c:tcTurno);

var
i:tDias;

Begin
For i:=Lunes to Domingo do if i in c then Write(' ',Damedia(i));
end;

Procedure CargarConjTurnos(Var Turno:tCTurno);

var
op:Integer;

Begin
Turno:=[];
Repeat
Writeln('1-Lunes');
Writeln('2-Martes');
Writeln('3-Miercoles');
Writeln('4-Jueves');
Writeln('5-Viernes');
Writeln('6-Sabado');
Writeln('7-Domingo');
Writeln('0-Salir');
Write('Ingrese la opcion deseada: ');
Readln(op);
Case op of
1:Turno:=Turno + [Lunes];
2:Turno:=Turno + [Martes];
3:Turno:=Turno + [Miercoles];
4:Turno:=Turno + [Jueves];
5:Turno:=Turno + [Viernes];
6:Turno:=Turno + [Sabado];
7:Turno:=Turno + [Domingo];
end;
until op = 0;
end;

Procedure CargarChoferes (var VNom:tVNombre;var VTur:tVTurno;var N:tRIndice);

var
i:tRIndice;

Begin
Write('Ingrese la Cantidad de Cheferes que tiene la empresa: ');
Readln(N);
For i:=1 to N do
Begin
Write('Ingrese el Nombre del Chofer de legajo Numero (termina con *) ',i,':
');
CargarNombre(VNom[i]);
Writeln('Ingrese los Turnos que realiza el chofer (Termina con 0): ');
CargarConjTurnos(VTur[i]);
end;
end;
Procedure CargarHorarios(var H:tVHorario);

Var
i:tDias;

Begin
For i:=Lunes to Domingo do
Begin
Write('Ingrese la horas laborales del ',Damedia(i),': ');
Readln(H[i]);
end;
end;

Function DameHorasdeTurnos(conj:tCTurno;v:tvHorario):Real;

var
i:tDias;
Aux:Real;

Begin
Aux:=0;
For i:=Lunes to Domingo do if i in conj then Aux:=Aux + v[i];
DameHorasdeTurnos:=Aux;
end;

Function RealtoHHMMSS(Num:Real):String;

var
Horas,Minutos,Segundos:String;
h,m,s:Integer;

Begin
h:=Trunc(Num);
Str(h,Horas);
m:=Trunc((Num-h) * 60);
Str(m,Minutos);
s:=Trunc((((Num-h)*60)-m)*60);
Str(s,Segundos);
RealtoHHMMSS:=Horas + ':' + Minutos + ':' + Segundos;
end;

Function LegMasTrabajador(Vt:tVTurno;Vh:tVHorario;N:tRIndice):tRIndice;

var
i:tRIndice;
MaxHoras:Real;
AuxHoras:Real;

Begin
MaxHoras:=0;
LegMasTrabajador:=0;
For i:=1 to N do
Begin
AuxHoras:=DameHorasdeTurnos(Vt[i],Vh);
if AuxHoras > MaxHoras then
Begin
MaxHoras:=AuxHoras;
LegMasTrabajador:=i;
end;
end;
end;

Procedure DiasSinAsig(Vt:tVTurno;var C:tCTurno;N:tRIndice);

var
i:tRIndice;

Begin
c:=[Lunes,Martes,Miercoles,Jueves,Viernes,Sabado,Domingo];
For i:=1 to N do c:=c - Vt[i];
end;

Procedure MostrarDiasSinAsig(Vt:tVTurno;N:tRIndice);

var
c:tCTurno;

Begin
DiasSinAsig(Vt,C,N);
Write('Los Dias SinAsignar son: ');
MostrarDias(C);
end;

Procedure CargarAux(var Aux:tVAux;var NAux:tRIndice;Vt:tVTurno;N:tRindice);

var
i,j:tRIndice;

Begin
NAux:=N;
j:=1;
For i:=1 to N do
Begin
if Vt[i] <> [] then
Begin
Aux[j]:=i;
inc(j);
end
else NAux:=NAux - 1;
end;
end;

Procedure Reindexar(var Vn:tVNombre;var Vt:tVTurno;var N:tRIndice);

Var
i:tRIndice;
Aux:TvAux;
NAux:tRIndice;

Begin
CargarAux(Aux,NAux,Vt,N);
For i:=1 to NAux do
Begin
Vn[i]:=Vn[Aux[i]];
Vt[i]:=Vt[Aux[i]];
end;
N:=NAux;
end;

Procedure MostrarNombre(Nombre:tNombre);

var
i:trIndice;

Begin
i:=1;
While (i<=Max_Nom) and (Nombre[i]<> FinNombre) do
Begin
Write(Nombre[i]);
inc(i);
end;
end;

Procedure MostrarRegistro(Leg:tRIndice;Nombre:tNombre;Turno:tcTurno;vh:tvHorario);

Begin
Write(Leg,': ');
MostrarNombre(Nombre);
Writeln;
Write('Trabaja los dias: ');
MostrarDias(Turno);
Writeln;
Write('Trabaja: ',RealtoHHMMSS(DameHorasdeTurnos(Turno,vh)),' Horas');
Writeln;
end;

Procedure MostrarEstructura(Vn:tVNombre;Vt:tVTurno;N:tRIndice;vh:tvHorario);

var
i:trIndice;

Begin
For i:=1 to N do
MostrarRegistro(i,Vn[i],Vt[i],vh);
end;

Procedure MostrarTrabajador(Vn:tVNombre;Vt:tVTurno;N:tRIndice;Vh:tVHorario);

var
i:tRindice;
Begin
i:=LegMasTrabajador(Vt,Vh,N);
MostrarRegistro(i,Vn[i],Vt[i],vh);
end;

var
vNombre:tvNombre;
vTurno:tvTurno;
N:tRindice;
vHorario:tvHorario;
opcion:Integer;
CargoHorario,CargoChoferes:Boolean;
Begin

CargoHorario:=False;
CargoChoferes:=False;
Repeat
ClrScr;
Writeln('1-Cargar Horarios');
Writeln('2-Cargar Choferes y sus Turnos');
Writeln('3-Mostrar el mas Trabajador');
Writeln('4-Mostrar dias Sin Asignar');
Writeln('5-Mostrar todos los Cheferes');
Writeln('6-Reindexar Borrando no Asignados');
Writeln('7-Salir');
Write('Ingrese Opcion: ');
Readln(Opcion);
Case Opcion of
1: Begin
ClrScr;
CargoHorario:=True;
Writeln('Ingrese Horas Laborales x Dia:');
CargarHorarios(vHorario);
end;
2: Begin
ClrScr;
If Not CargoHorario then
Begin
Writeln('Debe Cargar Primero las Horas x Dia');
Write('Pulse una Tecla Para Continuar'); ReadKey;
end
else Begin
CargarChoferes (VNombre,VTurno,N);
CargoChoferes:=True;
end;
end;

3:Begin
ClrScr;
If Not CargoChoferes then
Begin
Writeln('Debe Cargar Primero los Choferes');
Write('Pulse una Tecla Para Continuar'); ReadKey;
end
else Begin
Writeln('El mas Trabajador es: ');
MostrarTrabajador(VNombre,VTurno,N,Vhorario);
Writeln;
Write('Pulse una Tecla Para Continuar'); ReadKey;
end;
end;
4:Begin
ClrScr;
If Not CargoChoferes then
Begin
Writeln('Debe Cargar Primero los Choferes');
Write('Pulse una Tecla Para Continuar'); ReadKey;
end
else Begin
MostrarDiasSinAsig(Vturno,N);
Writeln;
Write('Pulse una Tecla Para Continuar'); ReadKey;
end;
end;

5: Begin
ClrScr;
MostrarEstructura(VNombre,VTurno,N,vHorario);
Writeln;
Write('Pulse una Tecla Para Continuar'); ReadKey;
end;

6: Begin
ClrScr;
Reindexar(VNombre,VTurno,N);
Write('Pulse una Tecla Para Continuar'); ReadKey;
end;

end;
until Opcion = 7;

end.

{************************************FIN************************************}