Pascal/Turbo Pascal - problema en el algoritmo

 
Vista:

problema en el algoritmo

Publicado por Raul Gallardo (1 intervención) el 21/05/2008 16:50:33
Hola;
Estoy realizando un programa para la gestión de los asientos de un avión con Turbo Pascal. El problema esque a la hora de mostrar los asientos no los muestra bien. Si sabeis de mas fallos y como corregirlo decirmelo también.
Aquí dejo lo que llevo
Un saludo y muchas gracias.

PROGRAM Avion1 (input,output);
USES
crt;
CONST
MINFILA = 1;
MAXFILA = 25;
ULTIMOBUSSINES=2;
ULTIMOECONOMY=8;
PRIMERASIENTO= 'a';
ULTIMOASIENTO= 'f';
TYPE
{Tclase = (bussines, bussines_economy, turista);}
{Tplaza = string [2];}
TEstado = (L, O);
Tasientos=array [MINFILA..MAXFILA,PRIMERASIENTO..ULTIMOASIENTO]
of TEstado;
VAR
seat: Tasientos;
PROCEDURE ResetearPasaje (VAR Pasaje: Tasientos); {pone todos los
asientos libres}
{pasaje es el array}
VAR
i: integer;
j: char;
BEGIN
FOR i:=MINFILA TO MAXFILA DO
FOR j:= PRIMERASIENTO TO ULTIMOASIENTO DO
Pasaje[i,j]:=L;
END;
PROCEDURE EscribirFila (VAR asientos : Tasientos ; letra: char);
{asientos es el array, letra es la columna}
VAR
i: integer;
BEGIN {EscribirFila}
write (letra,' ');
FOR i:=MINFILA TO MAXFILA DO BEGIN
IF asientos[i,letra]=L THEN
write('L', ' ');
IF asientos[i,letra]=O THEN
write('O', ' ');
END;
writeln;
END; {EscribirFila}

PROCEDURE MostrarAvion(VAR pasaje:Tasientos);
VAR
i: integer;
BEGIN {Mostrar Avion}
writeln ('BOEING 737 - 300');
writeln ('Estado de las reservas');
EscribirFila(pasaje, 'A');
EscribirFila(pasaje, 'B');
EscribirFila(pasaje, 'C');
FOR i:=MINFILA TO MAXFILA DO BEGIN
IF i<10 THEN
write (' ',i)
ELSE
write(' ',i);
END;
writeln;
EscribirFila(pasaje, 'D');
EscribirFila(pasaje, 'E');
EscribirFila(pasaje, 'F');
writeln;
writeln ('L - Libre');
writeln ('O - Ocupado');
END; {MostrarAvion}
PROCEDURE sinasientos(VAR opcion:char;cantidad:integer);
{opcion nos dice si se quiere reservar otra cantidad de asientos
cantidad nos dice los asientos requeridos originalmente}
BEGIN
REPEAT
write('No se han conseguido colocar ');
writeln(cantidad,' de asientos juntos');
writeln('�Quiere reservar los asientos separados? s/n');
readln(opcion);
UNTIL (opcion='s') OR (opcion='S') OR (opcion='n') OR (opcion='N');
END;
PROCEDURE bucle (VAR situacion:Tasientos;number,p:integer;
VAR counter:integer;VAR k:char; VAR suma:integer);
{situacion es el array, number es el numero de asientos, p es la fila
para leer del array, counter es el contador, k es la columna del array,
suma nos dice el total de asientos libres}
BEGIN
counter:=0;
k:=PRIMERASIENTO;
suma:=0;
REPEAT
IF (situacion[p,k]=L) THEN BEGIN
k:=succ(k);
counter:=counter+1;
suma:=suma+1;
END
ELSE BEGIN
counter:=0;
k:=succ(k);
END;
UNTIL (k=ULTIMOASIENTO) OR (counter=number);
END;
PROCEDURE busqueda(VAR butaca:TAsientos; tipo, linea,cantidad:integer);
FORWARD;
PROCEDURE aux (VAR asiento:Tasientos; VAR fil:integer;
maximo,cuantity,short:integer);
{asiento es el array, fila nos dice si eligio fila y cual es,
maximo es hasta que fila llega la clase, cuantity es la cantidad
de asientos que se requieren}
VAR
i,contador,contaux, total:integer;
j,option:char;
BEGIN
contador:=0;
contaux:=0;
j:=PRIMERASIENTO;
IF fil=-1 THEN BEGIN {si no ha elegido la fila}
i:=0;
REPEAT
i:=i+1;
bucle(asiento,cuantity,i,contador,j,total);
UNTIL (i=maximo) OR (cuantity=contador);
contaux:=contaux+1;
END
ELSE BEGIN
bucle(asiento,cuantity,i,contador,j,total);
contaux:=contaux+1;
END;
IF (cuantity<>contador) AND (fil<>-1)THEN BEGIN
busqueda(asiento,short,-1,cuantity);
contaux:=contaux+1;
END;
IF total=0 THEN
writeln('Esta clase est� completa')
ELSE BEGIN
IF (contador<>cuantity) AND (contaux=1) THEN BEGIN
sinasientos(option,cuantity);
IF (option='s') OR (option='S') THEN BEGIN
busqueda(asiento,short,fil,cuantity-1);
busqueda(asiento,short,fil,1);
END
ELSE BEGIN
REPEAT
REPEAT
asiento[i,j]:=O;
j:=pred(j);
contador:=contador-1;
UNTIL (contador=0) OR (j<PRIMERASIENTO);
j:=ULTIMOASIENTO;
i:=i-1;
UNTIL (i=0) OR (contador=0);
write('Los asientos se han ');
writeln('reservados correctamente');
END;
END;
END;
END;
PROCEDURE busqueda (VAR butaca:TAsientos; tipo, linea,cantidad:integer);
VAR
i,contador,contaux:integer;
j,option:char;
BEGIN
{contador:=0;
contaux:=0;
j:=PRIMERASIENTO;}
CASE tipo OF
1:aux(butaca,linea,ULTIMOBUSSINES,cantidad,tipo);
2:aux(butaca,linea,ULTIMOECONOMY,cantidad,tipo);
3:aux(butaca,linea,MAXFILA,cantidad,tipo)
END;
END;

PROCEDURE HacerReserva (VAR sillon: TAsientos);
VAR
numero, fila, clase,i,lugar,categoria:integer;
asiento,eleccion:char;
BEGIN
asiento:=PRIMERASIENTO;
REPEAT
writeln('Introduzca la clase en la que quiere viajar');
writeln('1-Bussines');
writeln('2-Bussines Economy');
writeln('3-Turista');
readln(clase);
UNTIL (clase>=1) AND (clase<=3);
REPEAT
writeln('�Prefiere elegir el numero de la fila? s/n');
readln(eleccion);
UNTIL (eleccion='n') OR (eleccion='N') OR (eleccion='s') OR
(eleccion='S');
IF (eleccion='s') OR (eleccion='S') THEN BEGIN
writeln('Introduzca el n�mero de asientos que est� buscando');
readln(numero);
CASE clase OF
1:BEGIN
writeln('Filas 1-2');
readln(fila);
END;
2:BEGIN
writeln('Filas 3-8');
readln(fila);
END;
3:BEGIN
writeln('Filas 9-25');
readln(fila)
END;
END;
END
ELSE
fila:=-1;
busqueda (sillon,clase,fila,numero);
END;

PROCEDURE AnularReserva (VAR Asiento: TAsientos);
VAR
{plazaAnu: Tplaza;}
num,fila: integer;
letra, columna,letraAux: char;

BEGIN {AnularReserva}
REPEAT
REPEAT {Comprobar asiento v�lido}
writeln ('Introduzca la fila del asiento: 1-25');
readln (fila);
UNTIL (fila>=1) AND (fila<=25);
REPEAT
writeln('Introduzca la columna del asiento: a-f');
readln(columna)
UNTIL (columna>='a') AND (columna<='f');
IF (asiento[fila,columna]=L) THEN
writeln('El asiento estaba vacio')
ELSE BEGIN
asiento[fila,columna]:=O;
writeln ('El asiento ya NO ocupado')
END;
writeln ('�Cancelar otra reserva? S/N');
readln (letra);
UNTIL (letra <> 'N') AND (letra<>'n');
END; {AnularReserva}
PROCEDURE menu (VAR avion:Tasientos);
VAR
m:integer;
BEGIN {menu}
REPEAT
REPEAT
writeln('++++++++++++++++++++++++++++++');
writeln('1.- Mostrar estado de la reserva');
writeln('2.- Hacer reserva');
writeln('3.- Cancelar reserva');
writeln('4.- Salir');
writeln('++++++++++++++++++++++++++++++');
writeln('SELECCIONE FUNCION');
readln(m);
UNTIL (m>0) AND (m<5);
CASE m OF
1: MostrarAvion(avion);
2: HacerReserva(avion);
3: AnularReserva(avion);
END; {case of}
UNTIL m=4
END; {menu}


BEGIN {Prog. Principal}
ResetearPasaje(seat);
menu(seat);
END.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder