[ Foro de Pascal ]

Tengo dudas con Arrays

10-Dec-2011 11:04
Lucas Matias Guardón
10 Respuestas

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..


11-Dec-2011 18:40
Luis Torres (+18)

¿Usastes registros para anotar los datos de cada avión?. ¿Por qué no colocas el código para revisarlo?. Saludos.


12-Dec-2011 02:33
Lucas Matias Guardón

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...


12-Dec-2011 15:16
Lucas Matias Guardón

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...


12-Dec-2011 16:59
Antonio P.G.

Hola, Lucas.

Antes que nada, quizá lo sepas, pero decirte que un ClrScr al final de tu programa no hace nada.

Otra cosilla, hacerca del bucle while: no tiene mucho sentido que el programa le pida al usuario que ingrese un valor para la variable CODAV puesto que se trata de una petición secuencial 'A'...'L', a no ser, claro, que hayas tenido en cuenta que el usuario puede cometer errores y en cuyo caso estaría muy bien.

Ahora, con respecto a tu pregunta: date cuenta que tú solamente estás jugando con un array. ¿Dónde estás almacenando las letras de los aviones? En ningún sitio. Usas letras como índices, pero no como dato.

Para ello, puedes hacer dos cosas (bueno, por hacer, puedes hacer muchas, pero dos principales):
- Utilizar un array de registros (record), de forma que cada registro almacene los campos letra y tiempo. (Ésta es la que acertadamente sugería Luis).
- Utilizar dos arrays, de los cuales ya tendrías uno, y el otro sería un array que guardaría las letras.

Como la primera manera implica un cambio en la estructura de datos, te contaré la segunda, y si te quedas insatisfecho, vuelves y vemos la otra.

Necesitarás una nueva variable, a la que yo llamaré vLetras por "vector de letras", y podríamos definirla así, por ejemplo:

vLetras : array ['A'..'L'] of char = ('A','B','C','D','E','F','G','H','I','J','L');

Después, lo único que tendrás que hacer es, cuando realizas el intercambio de valores en el vector COD en la condición IF COD[I]<COD[J] THEN, realizar el mismo cambio pero en el vector de letras vLetras.

A la hora de imprimir, igual: tienes que imprimir los dos vectores.

Cuéntanos qué tal. Ciao.
12-Dec-2011 17:59
Luis Torres (+18)

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.


12-Dec-2011 18:56
Antonio P.G.

Tienes razón, Luis.

Lo que pasa, Lucas, es que no estás empleando correctamente el algoritmo de ordenamiento de burbuja, que supongo que es lo que intentas hacer. Si no conoces mucho el tema, te animo a que eches un vistazo en la wikipedia: http://en.wikipedia.org/wiki/Bubble_sort (la animación es muy ilustrativa), http://es.wikipedia.org/wiki/Ordenamiento_de_burbuja (en español).

En tu caso, creo que una de las posibles formas de este algoritmo sería así:

for i:= 'L' downto 'B' do
for j:= 'B' to i do
if COD[j] > COD[pred(j)] then
{"pred" es una función que devuelve el predecesor de un valor tipo char, byte, integer,... un tipo ordenado, al fin y al cabo. }
( Y aquí se haría el intercambio...)


Estudia si funciona, porque lo he hecho un poco rápido.

Ciao.
13-Dec-2011 13:14
Luis Torres (+18)

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.


13-Dec-2011 14:10
Lucas Matias Guardón

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 '*'.


13-Dec-2011 18:24
Luis Torres (+18)

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.


15-Dec-2011 14:50
Nacho Cabanes (+83)

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.)