Skip to content

Instantly share code, notes, and snippets.

@augustoguerrero
Created July 2, 2016 01:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save augustoguerrero/bfe4634bc0e14040f03fec25c82923c5 to your computer and use it in GitHub Desktop.
Save augustoguerrero/bfe4634bc0e14040f03fec25c82923c5 to your computer and use it in GitHub Desktop.
Parcial CADP Completo 11/6/2016 - Resuelto
program parcial1;
rango1 = 1..100;
type
camion = record
patente:string;
año_fabricacion:integer;
capacidad:real;
end;
viaje = record
codigo_viaje:integer;
codigo_camion:rango1;
distancia:real;
ciudad_destino:string;
año_viaje:integer;
DNI:integer;
end;
flota = array[rango1] of camion;
kilometros = array[rango1] of integer;
lista = ^nodo;
nodo = record
dato:viaje;
sig:lista;
end;
procedure inicializar_vector(var v2:kilometros;)
var i:integer;
begin
for i:= 1 to 100 do begin
v2[i] := 0;
end;
end;
procedure crear_lista(var l1:lista;)
begin
l1 := nil;
end;
procedure leer_registro(var r:viaje;)
begin
read(r.codigo_viaje);
if (r.codigo_viaje <> -1) then begin // Pregunto por la condicion de corte dentro del leer
read(r.codigo_camion);
read(r.distancia);
read(r.ciudad_destino);
read(r.año_viaje);
read(r.DNI);
end;
end;
procedure insertar(var l1:lista; r:viaje;)
var nue:lista;
begin
new(nue); // Se crea el nodo vacio
nue^.dato := r; // Le asigno la información
nue^.sig := l1; // Engancho el nuevo nodo con la lista
l1 := nue; // Actualizo el primer nodo de la lista
end;
procedure cargar_lista(var l1:lista; r:viaje;)
begin
leer_registro(r);
while (r.codigo_viaje <> -1) do begin
insertar(l1,r);
leer_registro(r);
end;
end;
function DNI_Impar(dni:integer;):boolean;
var num, dig, cant, imp:integer;
begin
cant := 0;
imp := 0;
num := dni;
while (num <> 0) do begin
dig := num mod 10; // Me quedo con el ultimo digito
if ((dig mod 2) = 1) then
imp := imp +1; // Si dig es impar sumo +1
cant := cant +1; // Cuento cantidad de numeros en dni
num := num div 10; // Achico el numero
end;
if (imp = cant) then begin // Si la cantidad de numeros es igual a la cantidad de impares, cumple
DNI_Impar := True;
else
DNI_Impar := False;
end;
end;
function cantidad_camiones(toneladas:real; año_fabricacion:integer; año_viaje:integer;):boolean;
var años:integer;
begin
años := año_fabricacion - año_viaje;
if (toneladas > 30.5) and (años > 5) then
cantidad_camiones := True;
else
cantidad_camiones := False;
end;
end;
procedure sumar_kilometros_recorridos(var v2:kilometros; codigo:rango1; distancia:real;)
begin
v2[codigo] := v2[codigo] + distancia; // Sumo distancia por codigo de camion
end;
procedure calcular_patentes(v2:kilometros; v1:camion; var patente_max:string; var patente_min:string;)
var i,max,min:integer;
begin
max := -1;
min := 9999;
for i:= 1 to 100 do begin
if (v2[i] > max) then begin
max := v2[i];
patente_max := v1[i].patente;
end;
if (v2[i] < min) then begin
min := v2[i];
patente_min := v1[i].patente;
end;
end;
end;
///////////// Principal
var
l1:lista;
r:viaje;
v1:flota;
v2:kilometros;
aux:lista;
codigo_camion:rango1;
toneladas:real;
año_fabricacion:integer;
año_viaje:integer;
cant_cam:integer;
patente_max:string;
patente_min:string;
begin
cant_cam := 0;
inicializar_vector(v2); // V2 de kilometros en cero
crear_lista(l1); // Lista l1 en nil
crear_lista(aux); // No se
cargar_lista(l1); // Leo y cargo todos los datos en la lista l1
aux := l1; // Copia de L1 para recorrer
// Una vez cargada la estructura tengo que recorrerla y solucionar incisos
while (aux <> nil) do begin // Bucle principal
if (DNI_Impar(aux^.data.DNI) = True) then
write("Codigo de viaje con chofer de DNI impar: ", aux^.dato.codigo_viaje);
toneladas := v1[cod_camion].capacidad;
año_fabricacion := v1[cod_camion].año_fabricacion;
cod_camion := aux^.data.codigo_camion;
año_viaje := aux^.data.año_viaje;
distancia := aux^.data.distancia;
sumar_kilometros_recorridos(v2, cod_camion, distancia);
if (cantidad_camiones(toneladas, año_fabricacion, año_viaje) = True) then
cant_cam := cant_cam +1;
aux := aux^.sig; // Siguiente de la lista
end;
calcular_patentes(v2, v1, patente_max, patente_min);
write("La patente del camion con más km es: ", patente_max,"Y la del camion con menos es: ", patente_min);
write("La cantidad de camiones con >30.5 toneladas y >5 años de antiguedad es: ", cant_cam);
end;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment