[ Foro de Pascal ]
Hola, soy estudiante de Ing.en Sistema y tengo una duda con un ejercicio que me dieron (estoy practicando para el final) sobre array....dice asi:
Una compañia aerea que realiza vuelos Rosario-Bs.As., tiene en servicio 12 aviones. Por cada viaje realizado completa una planilla con los siguientes datos:
-Codigo del avion ('A'..'L')
-Tiempo de vuelo (real)
Realizar un programa que permita el ingreso de los datos de la planilla (estos datos no estan ordenados y se desconode la cantidad de vuelos realizado por cada avion) y emita un listado ordenado en forma decreciente por tiempo total de vuelos de cada avion, con su correspondiente codigo, como el siguiente:
CODIGO AVION TIEMPO VUELO TOTAL
C 355,3
K 320,1
A 287,5
.. .......
Ese es el enunciado, lo hice al programa y funciona bien, salvo por un detalle, yo lo ordeno por tiempo de vuelo, cuando ordeno asi y muestro la lista de cada avion, no coincide el tiempo de vuelo con el codigo del avion ya que no se como hacer eso....ME PUEDEN AYUDAR?¡ GRACIAS..
¿Usastes registros para anotar los datos de cada avión?. ¿Por qué no colocas el código para revisarlo?. Saludos.
El ejercicio lo pide asi, por eso lo hice de esa manera...
Voy a subir el programa codificado para que lo vean y asi me dan una mejor ayuda...
Hola, subo el codigo del programa a ver si me puede ayudar...
PROGRAM AVION (INPUT,OUTPUT);
USES CRT;
VAR
J,I,L,CODAV:CHAR;
COD:ARRAY['A'..'L']OF REAL;
AUX,TVUELO:REAL;
BEGIN
FOR I:= 'A' TO 'L' DO
BEGIN
COD[I]:=0;
END;
WRITE('INGRESE EL CODIGO DEL AVION (DE A a L): ');
READLN(CODAV);
WHILE CODAV<>'*' DO
BEGIN
WRITE('INGRESE TIEMPO DE VUELO: ');
READLN(TVUELO);
COD[CODAV]:=COD[CODAV]+TVUELO;
WRITE('INGRESE EL CODIGO DEL AVION (DE A a L): ');
READLN(CODAV);
END;
FOR I:= 'A' TO 'K' DO
FOR J:= 'B' TO 'L' DO
BEGIN
IF COD[I]<COD[J] THEN
BEGIN
AUX:=COD[I];
COD[I]:=COD[J];
COD[J]:=AUX;
END
END;
FOR I:= 'A' TO 'L' DO
BEGIN
WRITELN('EL AVION ',I,' REALIZO UN TOTAL DE ',COD[I],' HORAS DE VUELO);
END;
WRITELN('PRECIONE UNA TECLA PARA FINALIZAR');
READLN(L);
CLRSCR;
END.
Bueno eso es lo que yo codifique, espero me puedan ayudar...
La razón por la que no concuerdan el código del avión con sus correspondientes horas de vuelo, es porque cuando los organizas en orden decreciente (en esos ciclos), sin querer estás asignando los valores reales a los códigos de otro avión que no le corresponde. Ese problema se presenta por utilizar como sub-índices los mismos códigos de cada avión. Sería preferible utilizar dos arrays, uno para almacenar el código del avión y otro para guardar el dato real; eso se llama arrays paralelos, entonces, para ordenarlos, cambias tanto el dato real de una array como el dato char del otro array.
Otra cosa, probé el programa y no ordena todos los datos en orden decreciente.
Saludos.
Yo hice un programa que funciona con "arrays paralelos". Este programa funciona introduciendo todos los valores para cada uno de los 12 aviones, cuyos códigos se pueden entrar en forma aleatoria, pero deben meterse todos los valores, ya que lo hice con ciclos for. Para los índices utilicé enteros desde el 1 al 12 y, el método de ordenación es el conocido método de la burbuja. Espero que te sirva de orientación y que tú realices otro programa usando arrays de estructuras. Aquí te dejo el código. Saludos.
program Avion;
uses Crt;
var
i,j: integer;
codAv: Array[1..12] of char;
cod: Array[1..12] of real;
aux_char: char;
aux_real: real;
BEGIN
{Inicializamos a 0 el array cod y a ' ' el array codAv}
for i:=1 to 12 do cod[i]:= 0;
for i:=1 to 12 do codAv[i]:=' ';
{Para introducir los datos de todos lo aviones (no puede faltar ni uno)}
for i:=1 to 12 do
begin
write('Codigo del Avion(A..L): ');
readln(codAv[i]);
write('Numero de horas vuelo del avion ',codAv[i],': ');
readln(cod[i]);
end;
{Ordenamos en forma descendente por numero de horas vuelo}
for i:=1 to (12-1) do
for j:=1 to (12-i) do
if (cod[j]<cod[j+1]) then
begin
aux_real:= cod[j];
cod[j]:= cod[j+1];
cod[j+1]:= aux_real;
aux_char:= codAv[j];
codAv[j]:= codAv[j+1];
codAv[j+1]:= aux_char;
end;
{Ahora presentamos los arrays ordenados}
ClrScr;
Writeln('CODIGO AVION TIEMPO DE VUELO TOTAL');
for i:=1 to 12 do
Writeln(codAv[i]:7,cod[i]:30:2);
Writeln;
Write('PRESIONES CUALQUIER TECLA PARA SALIR...');
readln;
END.
Luis, gracias por la ayuda, pero no lo puedo hacer asi, ya que en la parte de ingreso puedo ingresar una dato por avion no es asi?¡ si te fijas bien el enunciado del problema me dice que no sabe cuantos datos son, osea que por avion puedo ingresar las cantidad de horas de vuelo mas de una vez y estas se tienen que ir sumando, por eso yo usaba un while y salia de este con un '*'.
Bueno, puedes cambiar, en la lectura de datos los ciclos for por ciclos while, en los ciclos while coloca un contador y además realiza la asignación de valores tal como tú señalas. Luego, en la parte de ordenación y presentación de datos sustituyes el contador en donde están los números "12". En el ejemplo que te pasé, pues queda bien ilustradado el trabajo con los arrays paralelos y, además el método de ordenación llamado Burbuja. Trata de hacerlo y luego lo revisamos. Saludos.
Coincido con Luis: la estructura más sencilla para guardar datos repetitivos es un array, pero si no sabes la cantidad de datos no hay más remedio que sobredimensionar (hacerlo más grande de lo que esperas necesitar).
Entonces, todos los "for" que lo recorren, ya sea para mostrar o para ordenar, no pasarán por todos los elementos que cabrían en el array sino sólo por las posiciones que están ocupadas. Para saber cuántas posiciones has ocupado, necesitas llevar un contador, que incrementarás cada vez que guardes un nuevo dato.
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)