Delphi - ¿Alguien me ayuda a programar?

 
Vista:

¿Alguien me ayuda a programar?

Publicado por Nanaky (5 intervenciones) el 01/06/2007 00:41:07
A ver si alguien es tan amable de ayudarme con un trabajo que tengo que hacer, en el cual me he quedado atascado.

Con la siguiente premisa:

Realizar una aplicación informática que gestiones los vuelos aereos de una companyia X. El programa debe guardar de cada vuelo la siguiente información. Codigo de vuelo(3 letras y 3 numeros), aeropuerto de salida, aeropuerto de llegada, fecha y hora real de salida, fecha y hora real de llegada, si el vuelo ha sido puntual o no y el número de pasajeros transportados. Se considera que un vuelo es puntual si la diferencia entre la hora estimada y la hora real de salida y/o llegada es menor a 5 minutos.

Tengo que hacer un programa que muestre en pantalla las siguientes opciones (con case of):

1.Entrar datos
2.Modificar datos.
3. Determinar puntualidad de los vuelos y guardar la información en el campo correspondiente.
4. Dadas dos fechas, dar el porcentaje de vuelos puntuales sobre el total de vuelos entre estas fechas.

Lo que llevo hecho es lo siguiente , pero me he quedado estancado y no sé como seguir:

uses
SysUtils;

Const MAXvuelos=100;

type
t_fecha_salida= record
minuto:0..59;
hora:0..23;
dia:1..31;
mes:1..12;
anyo: 2000..2100;
end;
t_fecha_llegada= record
minuto:0..59;
hora:0..23;
dia:1..31;
mes:1..12;
anyo: 2000..2100;
end;
t_vuelo= record
cod_vuelo: string[6];
aero_salida: string[3];
aero_llegada: string[3];
pasajeros: integer;
fecha_salida: t_fecha_salida;
fecha_llegada: t_fecha_llegada;
end;
t_index=1..MAXvuelos;
t_lista_vuelos= array[1..MAXvuelos]of t_vuelo;

var
l:t_lista_vuelos;
op:integer;
i:t_index;

procedure Leer_datos;
begin
writeln('Introduzca el codigo de vuelo: ');
readln(l[i].cod_vuelo);
writeln('Introduzca el codigo del aeropuerto de salida: ');
readln(l[i].aero_salida);
writeln('Introduzca el codigo del aeropuerto de llegada: ');
readln(l[i].aero_llegada);
writeln('Introduzca la fecha de salida: ');
write('Dia: ');
readln(l[i].fecha_salida.dia);
write('Mes: ');
readln(l[i].fecha_salida.mes);
write('Anyo: ');
readln(l[i].fecha_salida.anyo);
writeln('Introduzca la fehca de llegada: ');
write('Dia: ');
readln(l[i].fecha_llegada.dia);
write('Mes: ');
readln(l[i].fecha_llegada.mes);
write('Anyo: ');
readln(l[i].fecha_llegada.anyo);
writeln;

end;
begin
repeat

writeln ('Escoja una de las siguentes opciones: ');
writeln ('--------------------------------------');
writeln ('1) Leer datos');
writeln ('2) Modificar los datos de vuelo por referencia');
writeln ('3) Conocer la puntualidad de los vuelos');
writeln ('4) Porcentajes de puntualidad segun fechas');
writeln ('0) Salir');
readln (op);
if (op>=0) and (op<=4) then
else
writeln('La opción no es correcta, escoja otra opcion.');
(*else lo he puesto como: si no es ni 0,1,2,3 o 4 , opción incorrecta. No se si esto está bién así*)
case op of

'1': Leer_datos;
'2': Modificar_datos;
'3': Puntualidad;
'4': Porcentaje;

end;
until op='0'
end.

-Aquí ya no compila. Me dice que en 'op' incompatible types:integer y char son incompatibles, pero es que yo a la variable op le he dado valor de integer.

- También quiero cambiar el procedure leer_datos, porque de esta manera, luego no se como voy a modificarlos por referencia en el siguiente subprograma.
Quiero hacerlo de la siguiente manera (adjunto pseudocódigo):

Procedimiento leer_datos (ent/sal, VAR v1 : t_lista_vuelos, nvuelos:entero);
VAR j:t_index;
Inicio_secuencia
leer (nvuelos1);
desde j:=1 hasta nvuelos1 hacer
leer v1[j].codigo_vuelo;
f_desde;
f_secuencia;

donde luego en el case of irían así v y , n vuelos.
1:leer_datos (v,nvuelos)

Lo ha explicado el profesor así, pero no lo acabo de entender.
¿Cual sería la entrada y la salida del procedure? y en el caso de nvuelos, ¿puedo luego poner un nvuelos1 sin definirlo como variable, solo poniendole un 1? lo mismo pasa con el v1 y v.

De verdad, está bién copiado.

Estoy bastante perdido.

Agradecería muchíiiiisimo que alguien me ayudase a seguir con el trabajo.
Muchas gracias por anticipado, estaré muy agradecido al que conteste, y también al que le tome interés.

Espero vuestras respuestas!
mi correo:
[email protected]
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

RE:¿Alguien me ayuda a programar?

Publicado por Juacho (193 intervenciones) el 01/06/2007 13:40:34
1.Evidente es un problema entre tipos de datos, debes de hacer un cast entre tipos, esa funcion no hace las converciones directas(y practicamente ninguna en Pascal o Delphi Pascal, o prueba usando variants), no pudes asignar un char a una variable integer!.
2.Busca un buen tutorial de Object Pascal(no de Delphi), este te servira mas por lo que veo.
3.Por que no usas una Base de Datos.
4.Por que mejor no usas Objetos.
Espero que te ayude!.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

RE:¿Alguien me ayuda a programar?

Publicado por E.T. (1244 intervenciones) el 01/06/2007 17:14:55
Que tal, no puedes compilar debiado a que las opciones del case las tienes así:

'1':
'2':
etc
cuando deberían de ser:

1:
2:
etc

es decir sin las comillas, iguan en el Until

además puedes declarar en luagar de t_fehca_salida y t_fecha_llegada poner sólo t_fecha y en el registro t_vuelo poner:

fecha_salida,fecha_llegada:t_fecha;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Alguien me ayuda a programar?

Publicado por Nanaky (5 intervenciones) el 01/06/2007 19:37:04
Muchas gracias, no me habia dado cuenta de que solo hacia falta poner un t_fecha.

Y lo del case ya está arreglado. Pero todavía no compila bien, me dá dos errores.
Esto es el codigo que llevo hecho:

program Algoprueba3;

{$APPTYPE CONSOLE}

uses
SysUtils;
Const MAXvuelos=100;

type
t_fecha= record
minuto:0..59;
hora:0..23;
dia:1..31;
mes:1..12;
anyo: 2000..2100;
end;
t_vuelo= record
cod_vuelo: string[6];
aero_salida: string[3];
aero_llegada: string[3];
pasajeros: integer;
fecha_salida: t_fecha;
fecha_llegada: t_fecha;
end;
t_index=1..MAXvuelos;
t_lista_vuelos= array[1..MAXvuelos]of t_vuelo;

var
v1:t_lista_vuelos;
nvuelos:integer;
op:integer;
procedure Leer_datos (VAR v1 : t_lista_vuelos; nvuelos:integer );
VAR
j: t_index;
begin
readln (nvuelos);
for j:=1 to nvuelos do
writeln ('Escriba el codigo de vuelo(AAA111): ');
readln(v1[j].cod_vuelo);
writeln ('¿Cual es el codigo del aeropuerto de salida?(AAA): '); (*error 1*)
readln(v1[j].aero_salida);
writeln ('¿Cual es el codigo del aeropuerto de llegada?(AAA): ');
readln(v1[j].aero_llegada);
writeln ('¿Cuantos pasajeros hay en este vuelo?: ');
readln(v1[j].pasajeros);
end;
begin
repeat

writeln ('Escoja una de las siguentes opciones: ');
writeln ('--------------------------------------');
writeln ('1) Leer datos');
writeln ('2) Modificar los datos de vuelo por referencia');
writeln ('3) Conocer la puntualidad de los vuelos');
writeln ('4) Porcentajes de puntualidad segun fechas');
writeln ('0) Salir');
writeln;
readln (op);
writeln;
if (op<0) or (op>4) then
writeln('La opcion no es correcta, escoja otra opcion.');

case op of

1: Leer_datos (v1,nvuelos); (*error 2*)

end;
until op=0;

end.

me da los siguientes errores:

error 1: [Warning] Algoprueba3.dpr(46): FOR-Loop variable 'j' may be undefined after loop

error 2 :[Warning] Algoprueba3.dpr(73): Variable 'nvuelos' might not have been initialized

estaría muy agradecido si me ayudais a continuar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Alguien me ayuda a programar?

Publicado por jose rodriguez (6 intervenciones) el 01/06/2007 21:50:54
mas que errores son warning y permite que el programa compile y funciones
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Alguien me ayuda a programar?

Publicado por Nanaky (5 intervenciones) el 02/06/2007 09:55:30
Ahora funciona casi bien. Digo casi porque no lo que yo lo que necesito hacer es, darle a la opcion 1, introducir datos, que los guarde en una posicion, que seguidamente vuelva al menu, y si yo quiero darle de nuevo a la opcion 1, meter otro vuelo y que lo guarde en otra posición , para que luego al listar los vuelos me aparezcan todos los que haya metido. Ahora mismo, me deja introdu ir datos pero se ve que no guarda mas de uno, porque al intentar listar los vuelos (en el siguiente ejercicio) solo me aparece un vuelo.

He empezado a escribir el siguiente ejercicio, el de modificar los datos. Para empezar he puesto para que muestre un listado con las referencias de los vuelos. Pero hay un problema, parece ser que solo me guarda una entrada , mas concretamente la que he entrado en segundo lugar( de 3 entradas, no he metido mas).

Pongo aqui como lo llevo. La parte de modificar no la he empezado porque además de que no se como hacerla, me ha frenado lo que acabo de explicar.

]program Algoprueba3;

{$APPTYPE CONSOLE}

uses
SysUtils;
Const MAXvuelos=100;

type
t_fecha= record
minuto:0..59;
hora:0..23;
dia:1..31;
mes:1..12;
anyo: 2000..2100;
end;
t_vuelo= record
cod_vuelo: string[6];
aero_salida: string[3];
aero_llegada: string[3];
pasajeros: integer;
fecha_salida: t_fecha;
fecha_llegada: t_fecha;
end;
t_index=1..MAXvuelos;
t_lista_vuelos= array[1..MAXvuelos]of t_vuelo;

var
v1:t_lista_vuelos;
nvuelos:integer;
op:integer;

procedure Leer_datos (VAR v1 : t_lista_vuelos; nvuelos:integer );
VAR
j: t_index;
begin
for j:=1 to nvuelos do
begin
write ('Escriba el codigo de vuelo(AAA111): ');
readln(v1[j].cod_vuelo);
write ('Cual es el codigo del aeropuerto de salida?(AAA): ');
readln(v1[j].aero_salida);
write ('Cual es el codigo del aeropuerto de llegada?(AAA): ');
readln(v1[j].aero_llegada);
write ('Cuantos pasajeros hay en este vuelo?: ');
readln(v1[j].pasajeros);
write ('Escriba la fecha y hora programada de salida del vuelo: ');
Write ('Dia: ');
readln(v1[j].fecha_salida.dia);
Write ('Mes: ');
readln(v1[j].fecha_salida.mes);
Write ('Anyo: ');
readln(v1[j].fecha_salida.anyo);
Write ('Hora: ');
readln(v1[j].fecha_salida.hora);
Write ('Minuto: ');
readln(v1[j].fecha_salida.minuto);
write ('Escriba la fecha y hora programada de llegada del vuelo: ');
Write ('Dia: ');
readln(v1[j].fecha_llegada.dia);
Write ('Mes: ');
readln(v1[j].fecha_llegada.mes);
Write ('Anyo: ');
readln(v1[j].fecha_llegada.anyo);
Write ('Hora: ');
readln(v1[j].fecha_llegada.hora);
Write ('Minuto: ');
readln(v1[j].fecha_llegada.minuto);
end;
end;
procedure Modificar_datos (VAR v1 : t_lista_vuelos);
VAR
j: t_index;

begin
writeln(' - Ref. de vuelo: ',v1[j].cod_vuelo);
writeln(' - Trayecto: ', v1[j].aero_salida,'-',v1[j].aero_llegada);
writeln(' - Fecha: Sal-',v1[j].fecha_salida.dia,'/',v1[j].fecha_salida.mes,'/',v1[j].fecha_salida.anyo);
writeln(' - Hora: Sal ',v1[j].fecha_salida.hora,':',v1[j].fecha_salida.minuto);
writeln(' - Fecha: Lleg-',v1[j].fecha_llegada.dia,'/',v1[j].fecha_llegada.mes,'/',v1[j].fecha_llegada.anyo);
writeln(' - Hora: Lleg- ',v1[j].fecha_llegada.hora,':',v1[j].fecha_llegada.minuto);
readln;
end;

begin
repeat

writeln ('Escoja una de las siguentes opciones: ');
writeln ('--------------------------------------');
writeln ('1) Entrar datos');
writeln ('2) Modificar los datos de vuelo por referencia');
writeln ('3) Conocer la puntualidad de los vuelos');
writeln ('4) Porcentajes de puntualidad segun fechas');
writeln ('0) Salir');
writeln;
readln (op);
writeln;
if (op<0) or (op>4) then
writeln('La opcion no es correcta, escoja otra opcion.');

case op of

1: Leer_datos (v1,nvuelos);
2: Modificar_datos(v1);

end;
until op=0;

end.


Creo que el problema está en la variable nvuelos. No se como hacer para entrar los datos de la manera que he dicho al principio, y que se quede guardado mas de uno para poder listarlos posteriormente.

Muchas gracias a todos los que me estáis ayudando, y a los que se interesen por el hilo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

RE:¿Alguien me ayuda a programar?

Publicado por E.T. (1244 intervenciones) el 02/06/2007 17:00:28
Bueno, primero que nada necesito que me digas si estas usando delphi o algun pascal, si usas delphi será mejo que hicieras una interfaz gráfica, se vería mejor.

Segundo, tu variable t_lista_vuelos la puedes quitar y poner v1:array [1..100]of t_vuelo,
antes del repeat debes poner j=0, el for dentro de leer_datos no lo pongas y j la pones de tipo integer como variable global, y j dentro del procedimiento leer_datos lo cambias por el argumento nvuelos (o sea readln(v1[ nvuelos ].cod_vuelo) igual con todos)

En las opciones de case debes de poner:

case op of

1:begin
inc( j );
leer_datos(v1, j );
end;
2:modificar_datos(vi, j );

hay que cambiar el procedimiento modificar_datos y agregarle un argumento quedando de la siguiente manera

procedure Modificar_datos (VAR v1 : t_vuelo; n_vuelo:integer);

le debes de dar el indice del vuelo a modificar y en lugar de lo que tienes en el procedimiento modificar pones lo que tienes en leer_datos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Alguien me ayuda a programar?

Publicado por Nanaky (5 intervenciones) el 04/06/2007 12:57:12
Buenas a todos!

Y tengo casi todo el programa solucionado, gracias a todos y en especial a E.T. Ahora lo unico que me falta es hacer la cuarta y ultima opción. Espero que me podáis ayudar. En la última opción debo hacer lo siguiente:

"Dadas dos fechas, dar el porcentaje de vuelos puntuales sobre el total de vuelos entre estas fechas."

Donde encuentro la dificultad, es en como hacer para que utilice la informacion de puntualidad de la opción 3 entre dos fechas. ¿Como podría hacerlo?

Adjunto el codigo. Funciona correctamente.

Código Delphi [-]

uses
SysUtils;

type
t_fecha= record
minuto:0..59;
hora:0..23;
dia:1..31;
mes:1..12;
anyo: 2000..2100;
end;

t_vuelo= record
cod_vuelo: string[6];
aero_salida: string[3];
aero_llegada: string[3];
pasajeros: integer;
fecha_salida,fecha_llegada: t_fecha;
fecha_salida_real,fecha_llegada_real:t_fecha;
end;

var
v1:array[1..100]of t_vuelo;
j_v:integer;
op:integer;

procedure Leer_datos (j:integer );
begin
write ('Escriba el codigo de vuelo(AAA111): ');
readln(v1[j].cod_vuelo);
write ('Cual es el codigo del aeropuerto de salida?(AAA): ');
readln(v1[j].aero_salida);
write ('Cual es el codigo del aeropuerto de llegada?(AAA): ');
readln(v1[j].aero_llegada);
write ('Cuantos pasajeros hay en este vuelo?: ');
readln(v1[j].pasajeros);
write ('Escriba la fecha y hora programada de salida del vuelo: ');
Writeln ('Dia: ');
readln(v1[j].fecha_salida.dia);
Write ('Mes: ');
readln(v1[j].fecha_salida.mes);
Write ('Anyo: ');
readln(v1[j].fecha_salida.anyo);
Write ('Hora: ');
readln(v1[j].fecha_salida.hora);
Write ('Minuto: ');
readln(v1[j].fecha_salida.minuto);
writeln ('Escriba la fecha y hora programada de llegada del vuelo: ');
Write ('Dia: ');
readln(v1[j].fecha_llegada.dia);
Write ('Mes: ');
readln(v1[j].fecha_llegada.mes);
Write ('Anyo: ');
readln(v1[j].fecha_llegada.anyo);
Write ('Hora: ');
readln(v1[j].fecha_llegada.hora);
Write ('Minuto: ');
readln(v1[j].fecha_llegada.minuto);
end;
procedure Hora_real (j:integer );
begin
writeln ('Escriba la hora real de salida del vuelo: ');
Write ('Hora: ');
readln(v1[j].fecha_salida_real.hora);
Write ('Minuto: ');
readln(v1[j].fecha_salida_real.minuto);
writeln ('Escriba la hora real de llegada del vuelo: ');
Write ('Hora: ');
readln(v1[j].fecha_llegada_real.hora);
Write ('Minuto: ');
readln(v1[j].fecha_llegada_real.minuto);
end;

procedure Modificar_datos ();
var j,s:integer;
begin
j:=0;
if j_v <> 0 then begin
repeat
inc(j);
if j>j_v then
j:=1;
writeln(' - Ref. de vuelo: ',v1[j].cod_vuelo);
writeln(' - Trayecto: ', v1[j].aero_salida,'-',v1[j].aero_llegada);
writeln(' - Fecha: Sal-',v1[j].fecha_salida.dia,'/',v1[j].fecha_salida.mes,'/',v1[j].fecha_salida.anyo);
writeln(' - Hora: Sal ',v1[j].fecha_salida.hora,':',v1[j].fecha_salida.minuto);
writeln(' - Fecha: Lleg-',v1[j].fecha_llegada.dia,'/',v1[j].fecha_llegada.mes,'/',v1[j].fecha_llegada.anyo);
writeln(' - Hora: Lleg- ',v1[j].fecha_llegada.hora,':',v1[j].fecha_llegada.minuto);
writeln('--------------------------------------');
writeln('');
writeln('1) Seleccionar vuelo de la posicion actual ');
writeln('2) Mostrar el vuelo siguiente');
writeln('3) Volver al menu principal');
writeln('');
readln(s);
until (s=1) or (s=3);
if s<>3 then
begin
writeln('Introduzca ahora los nuevos datos');
Leer_datos(j);
end;
end
else
begin
Writeln('No hay vuelos guardados que modificar');
end;
end;

procedure Puntualidad();
var j,z,p,q,r,t:integer;

begin
j:=0;
if j_v <> 0 then begin
repeat
inc(j);
if j>j_v then
j:=1;
writeln(' - Ref. de vuelo: ',v1[j].cod_vuelo);
writeln(' - Hora: Sal ',v1[j].fecha_salida.hora,':',v1[j].fecha_salida.minuto);
writeln(' - Hora: Lleg- ',v1[j].fecha_llegada.hora,':',v1[j].fecha_llegada.minuto);
writeln('--------------------------------------');
writeln('');
writeln('1) Seleccionar vuelo de la posicion actual ');
writeln('2) Mostrar el vuelo siguiente');
writeln('3) Volver al menu principal');
writeln('');
readln(z);
until (z=1) or (z=3);
if z<>3 then
begin
writeln('Introduzca la hora de real de salida y de llegada del vuelo');
Hora_real (j);

end;
p:=(v1[j].fecha_salida.hora)-(v1[j].fecha_salida_real.hora);
q:=(v1[j].fecha_salida.minuto)-(v1[j].fecha_salida_real.minuto);
r:=(v1[j].fecha_llegada.hora)-(v1[j].fecha_llegada_real.hora);
t:=(v1[j].fecha_llegada.minuto)-(v1[j].fecha_llegada_real.minuto);

if ((q>-5) and (q<5))and((p>-1) and (p<1)) then
writeln ('El vuelo ha salido a la hora prevista')
else
writeln ('El vuelo ha salido con retraso');
if ((r>-5) and (r<5))and((t>-1) and (t<1)) then
writeln ('El vuelo ha llegado a la hora prevista')
else
writeln ('El vuelo ha llegado con retraso');
end
else
begin
Writeln('No hay vuelos guardados que modificar');
end;
end;

begin
j_v:=0;
repeat
writeln ('Escoja una de las siguentes opciones: ');
writeln ('--------------------------------------');
writeln ('1) Entrar datos');
writeln ('2) Modificar los datos de vuelo');
writeln ('3) Calcular la puntualidad de los vuelos');
writeln ('4) Porcentajes de puntualidad segun fechas');
writeln ('0) Salir');
writeln;
readln (op);
writeln;
if (op<0) or (op>5) then
writeln('La opcion no es correcta, escoja otra opcion.');

case op of
1:begin
inc(j_v);
Leer_datos(j_v);
end;
2: Modificar_datos();
3: Puntualidad();
end;
until op=0;
end.

Muchas gracias por la ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar