101551509-tp-324
TRANSCRIPT
UNA_______________________________________________________Trabajo Práctico Computación II
Estructura de Datos tipo Grafo (Diseño del trazado de rutas aéreas)
Cargar rutas aéreas en archivo de texto
Almacenar rutas en nodos tipo lista
Buscar en lista país de salida
Buscar en lista país de llegada
Solicitud de país de salida y de llegada
Trazado de ruta aérea
UNA_______________________________________________________Trabajo Práctico Computación II
Figura 1
T1
A1
S1
B1
B2
R1
UNA_______________________________________________________Trabajo Práctico Computación II
TAD GRAFO
OPERACIÓN DESCRIPCIONLeer archivo texto Carga en memoria un archivo de texto con las
rutas aéreas.Cargar texto en lista Crea una lista con el contenido del archivo de
texto, almacenando en cada nodo las rutas aéreas.
Introducir país de salida y llegada
Carga el país de salida y de llegada
Localizar países en lista Busca los países en las rutas almacenadas en cada nodo de la lista
Trazar ruta de vuelo Calcula la ruta de vuelo con el menor numero de conexiones posibles
Leer archivo texto
Cargar texto en
lista
Introducir país de salida y
llegada
Localizar países en lista
Trazar ruta de vuelo
Grafo
UNA_______________________________________________________Trabajo Práctico Computación II
MATRIZ ADYACENCIA
A =
0 1 0 0 0 0
0 0 0 1 1 0
0 0 0 1 1 1
0 1 1 0 1 0
0 0 1 1 0 1
0 0 1 0 1 0
1
2
3
4
5
6
1
2
3
4
56
UNA_______________________________________________________Trabajo Práctico Computación II
TAD: Lista
Operaciones:
CrearLista: → ListaCrea una lista vacía.
Primero: Lista → PosicionDevuelve la posición del primer elemento de la lista.
Siguiente: Lista x Posicion → PosicionDada una posición p en la lista, devuelve la posición del elemento situado a continuación.
Dato: Lista x Posicion → TipobaseDada una posición en la lista, devuelve el dato que contiene.
Almacenar: Lista x Tipobase → ListaDado un dato e, lo añade a la lista como último elemento.
Buscar: Lista x Tipobase → PosicionDado un dato e, lo busca en la lista y devuelve la posición que ocupa.
Longitud: Lista → EnteroDada una lista, devuelve su longitud.
Trazar ruta: → Lista → Posicion → string Localiza el menor numero de conexiones entre el pais de llegada con el de salida
UNA_______________________________________________________Trabajo Práctico Computación II
CODIGO FUENTE
{Desarrollado por ******************program aerolineas_LUXOR;uses crt;type vector= array[1..50] of string;
tnodo = ^nodo; nodo = record paises:string; ruta:integer; prox:tnodo; end;var i:integer; ftxt:text; aux1,aux2,lista:tnodo; cad,cad2:integer; linea,salida,llegada,op:string; v1,v2,v3:vector;{*******************************}procedure imprimirlista(lista:tnodo); var aux:tnodo; begin aux := lista; {nos situamos al principio de la lista} writeln('Imprimiendo estructura de datos..'); while (aux <> nil) do begin writeln(aux^.paises); aux:=aux^.prox; end; end;
{************************************************}procedure insertarnuevo(var l:tnodo; elem:string); var nuevo:tnodo; begin new(nuevo); nuevo^.paises:=elem; nuevo^.prox:= l; l:=nuevo; end;
{***********************************************}procedure cargarutas(var lista:tnodo); var archivo:text; x:string;
UNA_______________________________________________________Trabajo Práctico Computación II
aux,aux2:tnodo; i:integer; begin i:=0; assign(archivo, 'c:\luxor\paises.txt'); reset(archivo); lista := nil; while not eof(archivo) do begin i:=i+1; readln(archivo, x);
new(aux); aux^.paises:= x; aux^.ruta:=i;
writeln('Ruta ',aux^.ruta,' ',x); delay(150);
if (lista = nil) then begin lista:=aux; aux2:=lista; end else begin aux2^.prox:=aux; aux2:=aux2^.prox; end; end;
aux2^.prox:=nil;
close(archivo); writeln; end;
procedure cabecera;begin clrscr; writeln; writeln('****** AEROlineas Luxor ******'); writeln; writeln('...... Control Rutas aereas ......'); writeln('..................................'); writeln; writeln('-> Cargando lista Rutas de vuelo...(paises.txt)'); delay(1000); writeln;
UNA_______________________________________________________Trabajo Práctico Computación II
end;{**********************************************************}procedure HASH_llegada(var lista:tnodo; rutapos,celda:integer; salida,llegada:string);var q:tnodo; ciudad,cadena,scan:string; i,j,k,m,max,conex,sw,rutaposl,r1:integer;begin q:=lista; cadena:=''; ciudad:=''; j:=1; k:=1; sw:=0; while (q <> nil) do begin if (q^.ruta >= rutapos) then begin ciudad:=string(q^.paises); max:=length(ciudad); rutaposl:=q^.ruta;
for i:= 1 to max do begin cadena := cadena + ciudad[i]; if (ciudad[i] <= chr(32)) then begin if (cadena <> '') then begin v2[j]:=cadena; j:=j+1; cadena:=''; end; end; end;{for para armar las ciudades por separado} writeln; writeln('<--* Localizando pais de llegada: ',llegada,' en ruta: ',rutaposl); writeln;
for i:=1 to j do begin write(v2[i]); end; writeln;
for i:=1 to j do begin if (i >= celda) then begin
UNA_______________________________________________________Trabajo Práctico Computación II
if (v2[i] = llegada+chr(32)) then begin writeln; writeln('***> Ubicado en el nodo ',i); writeln; r1:=q^.ruta; sw:=1; break; end else begin {cargando vector con las escalas} v3[k]:=v2[i]; k:=k+1; end; end; end;{for}
if (sw=0) then begin writeln; writeln('..No se encontro el pais de llegada en esta Ruta!'); writeln; end; delay(100);
end;{1 if} {limpiando vector v2} for i:=1 to j do v2[i]:=''; j:=1;
q:=q^.prox;
if (sw=1) then begin sw:=0; break; end; end;{end while} writeln('-> Posible ruta de viaje..'); writeln(' -----------------------'); writeln; writeln('Pais Salida ---> ', salida); writeln; writeln('-> (',k-1,') Escalas en: ','con las rutas: ',rutapos,' ',r1); writeln; for i:=1 to k do begin write(v3[i]);
UNA_______________________________________________________Trabajo Práctico Computación II
end; writeln; writeln; write('Pais Llegada <--- ',llegada); writeln;end;{procedure}
{**********************************************************}procedure HASH_salida(var lista:tnodo; salida,llegada:string);var p:tnodo; ciudad,cadena,scan:string; i,j,k,m,max,conex,rutapos,sw,sw2,celda:integer;begin cabecera; writeln; p:=lista; j:=1; m:=1; conex:=0; k:=1; cadena:=''; ciudad:=''; sw:=0; sw2:=0; {buscando el pais de salida en la lista para saber a que ruta pertenece} while (p <> nil) do begin ciudad:=string(p^.paises); rutapos:=p^.ruta; max:=length(ciudad);
for i:= 1 to max do begin cadena := cadena + ciudad[i]; if (ciudad[i] <= chr(32)) then begin if (cadena <> '') then begin v1[j]:=cadena; j:=j+1; cadena:=''; end; end; end;{for para armar las ciudades por separado} writeln; writeln('--> Localizando pais de salida: ',salida,' en ruta: ',rutapos); writeln;
UNA_______________________________________________________Trabajo Práctico Computación II
for i:=1 to j do begin write(v1[i]); end; writeln;
for i:=1 to j do begin if (v1[i] = salida+chr(32)) then begin writeln; writeln('***> Ubicado en el nodo ',i); writeln; celda:=i; sw:=1; sw2:=1; break; end else begin {cargando vector con las escalas v2[k]:=v1[i]; k:=k+1;} end; end;
if (sw2=1) then begin sw2:=0; HASH_llegada(lista,rutapos,celda,salida,llegada); break; end else begin if (sw=0) then begin writeln; writeln('..No se encontro el pais de salida en esta Ruta!'); writeln; end else begin sw:=0; end; delay(100); {limpiando vector v1} for i:=1 to j do v1[i]:=''; j:=1;
UNA_______________________________________________________Trabajo Práctico Computación II
p:=p^.prox; end; end;{end while de la lista} writeln;end;
{*********************************************}procedure inicio;
begin cabecera;
cargarutas(lista);
writeln; write('-> Coloque el pais de Salida: ');readln(salida); writeln; write('-> Coloque el pais de Llegada: ');readln(llegada); writeln; writeln('-> Buscando posibles rutas...'); delay(1000);
HASH_salida(lista,salida,llegada);
end;
BEGIN{************************************* ppal}op:='s';while (op='s') or (op='S') dobegininicio;
{imprimirlista(lista);}
{**********************************************************************}writeln;{write('-> Presione la tecla <ENTER> para SALIR del programa..');readln;}write('PRESIONE tecla <S/s> para continuar <N/n> para salir del programa: ');readln(op);if (op='N') or (op='n') then break;end;{while ppal}END.