Created
July 2, 2016 01:37
-
-
Save augustoguerrero/bfe4634bc0e14040f03fec25c82923c5 to your computer and use it in GitHub Desktop.
Parcial CADP Completo 11/6/2016 - Resuelto
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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