Ayuda con runtime error!!!
Publicado por Juan (83 intervenciones) el 28/10/2007 08:01:44
Miren la cosa es así, tenía que hacer un tp, se tienen dos archivos uno de accidentes y otro de empresas. El programa saca 2 listados.
El tema es que los archivos los tenía que crear yo para lo cual usé 2 programas:
este es el que usé para crear el archivo de empresas:
Program crearchempre;
Type
Str4=string[4];
Str40=string[40];
REmp=record
CodEmp:str4;
RazSoc:str40;
CanTraAs:word
end;
AEmp=File of REmp;
Var
ArchEmp:AEmp;
RegEmp:REmp;
i:byte;
Begin
assign(ArchEmp,'Empresas.dat');
rewrite(ArchEmp);
for i:=1 to 3 do
begin
writeln('Ingrese c¢digo de la empresa(4 caracteres)');
readln(RegEmp.CodEmp);
writeln('Ingrese raz¢n social(40 caracteres)');
readln(RegEmp.RazSoc);
writeln('Ingrese Cantidad de trabajadores asegurados(3 digitos)');
readln(RegEmp.CanTraAs);
write(ArchEmp,RegEmp)
end;
close(ArchEmp)
end.
y este para el archivo de accidentes:
Program crearchaccidentes;
Type
Str4=string[4];
Str5=string[5];
RAcc=record
CodEmp:str4;
Leg:str5;
Fecha:Longint;
CantDiasLic:word
end;
AAcc=File of RAcc;
Var
ArchAcc:AAcc;
RegAcc:RAcc;
i:byte;
respuesta:char;
Begin
assign(ArchAcc,'Accidentes.dat');
rewrite(ArchAcc);
repeat
writeln('Ingrese c¢digo de la empresa(4 caracteres)');
readln(RegAcc.CodEmp);
writeln('Ingrese n£mero de legajo(5 caracteres)');
readln(RegAcc.leg);
writeln('Ingrese la fecha(6 digitos)');
readln(RegAcc.fecha);
writeln('Ingrese la cantidad de d¡as de licencia(3 d¡gitos)');
readln(RegAcc.CantDiasLic);
write(ArchAcc,RegAcc);
writeln('¨Desea agregar otro registro?(S o N)');
readln(respuesta)
until respuesta='N';
close(ArchAcc)
end.
Y bueno una vez que creé los archivos hice el programa para hacer todos los procesos necesarios para obtener los dos listados, el programa compila bien , este es el código:
Program TrabajoPractico;
Uses crt,dos;
Type
Str5=string[5];
Str4=string[4];
Str40=string[40];
REmp=record
CodEmp:str4;
RazSoc:str40;
CanTrabAs:word
end;
RAcc=record
CodEmp:str4;
Leg:str5;
Fecha:Longint;
CantDiasLic:word
end;
AEmp=File of REmp;
AAcc=File of RAcc;
RegVemp=record
Codemp:str4;
Razsoc:str40;
CanTrabAs:word;
Porc:byte
end;
TipoInfo=record
Leg:Str5;
CantDiasLic:byte
end;
Tipolista=^tiponodo;
Tiponodo=record
Info:TipoInfo;
Sgte:TipoLista
end;
TvecEmp=Array[1..100] of RegVemp;
TveCont=Array[1..100] of Word;
TvecLis=array[1..100] of TipoLista;
(*Desarrollo de Procedimientos*)
Procedure Abrir(var Empresas:AEmp;Var Accidentes:AAcc);
Begin
assign(Empresas,'Empresas.Dat');
Reset(Empresas);
assign(Accidentes,'Accidentes.Dat');
Reset(Accidentes)
end;
Procedure Inicializar(Var ContAcc:TVeCont;Var Veclis:TvecLis);
Var i:byte;
Begin
for i:=1 to 100 do
begin
ContAcc[i]:=0;
VecLis[i]:=nil
end
end;
Procedure Cargar_Vector(var Empresas:AEmp;Var VecEmp:TvecEmp);
Var i:byte;
Rempresas:Remp;
Begin
For i:=1 to 100 do
begin
read(Empresas,Rempresas);
VecEmp[i].CodEmp:=Rempresas.Codemp;
VecEmp[i].RazSoc:=Rempresas.Razsoc;
VecEmp[i].CanTrabAs:=Rempresas.CanTrabAs
end
end;
Procedure Leer(var Accidentes:AAcc;var RegAcc:RAcc;Var FinArch:boolean);
Begin
if not eof(Accidentes) then
begin
read(Accidentes,RegAcc);
FinArch:=false
end
else
FinArch:=true
end;
Procedure Bus_Lin_Vec(VecEmp:TvecEmp;cod:str4;var pos:word);
Var encontrado:boolean;
i:byte;
Begin
i:=1;
encontrado:=false;
while not (encontrado) do
begin
if VecEmp[i].CodEmp=cod then
begin
encontrado:=true;
pos:=i
end;
inc(i)
end
end;
Function Porcen(CantrabAs,cont:word):byte;
begin
Porcen:=random(100)
end;
Procedure Agregar_Nodo_Lista(var lista:tipolista;valor:tipoinfo);
var PtrN,PtrAux:TipoLista;
Begin
new(PtrN);
if lista<>nil then
begin
PtrAux:=lista;
while PtrAux<>nil do
PtrAux:=PtrAux^.sgte;
ptrn^.Info:=valor;
ptrAux^.sgte:=PtrN
end
else
Lista:=Ptrn
end;
Procedure Procesar(Var Accidentes:AAcc;Var VecEmp:TVecEmp;Var VContAcc:Tvecont;Var VecLIsEmp:TVecLis);
var i,DiasLic:byte;
clave:str5;
RInfo:TipoInfo;
RegAcc:Racc;
Pos:Word;
FinArch:boolean;
Begin
Leer(Accidentes,Regacc,FinArch);
while not FinArch do
begin
clave:=Regacc.Leg;
Rinfo.Leg:=Regacc.leg;
DiasLic:=0;
while (not FinArch) and (Regacc.Leg=clave) do
begin
DiasLic:=DiasLic+Regacc.CantDiasLic;
Leer(Accidentes,Regacc,FinArch)
end;
Bus_Lin_Vec(VecEmp,Regacc.CodEmp,Pos);
VContAcc[Pos]:=VContAcc[Pos]+1;
Rinfo.CantDiasLic:=DiasLic;
Agregar_Nodo_Lista(VecLisEmp[Pos],Rinfo)
end;
for i:=1 to 100 do
VecEmp[i].Porc:=Porcen(VecEmp[i].CanTrabAs,VContAcc[i])
end;
Procedure OrdenarMam(var VecEmp:TVecEmp;var VeclisEmp:TVecLis;Tope:byte);
var ordenado:boolean;
aux:RegVemp;
AuxLis:TipoLista;
i:byte;
Begin
Ordenado:=false;
while not ordenado do
begin
Ordenado:=True;
for i:=1 to tope-1 do
begin
if VecEmp[i].Porc<VecEmp[i+1].Porc then
begin
Aux:=VecEmp[i];
VecEmp[i]:=VecEmp[i+1];
VecEmp[i+1]:=Aux;
AuxLis:=VecLisEmp[i];
VecLisEmp[i]:=VecLisEmp[i+1];
VecLisEmp[i+1]:=AuxLis;
Ordenado:=False
end
end
end
end;
Procedure ListarPorc(VecEmp:TvecEmp);
Var i:byte;
Begin
for i:=1 to 100 do
begin
writeln('Empresa: ',VecEmp[i].RazSoc);
writeln('Porcentaje: ',VecEmp[i].Porc)
end
end;
Procedure Suprime_Nodo_Lista(var Lista:TipoLista;Var RInfo:TipoInfo);
Var PtrAux,PtrSgte:TipoLista;
Begin
PtrAux:=lista;
PtrSgte:=PtrAux^.Sgte;
Lista:=Ptrsgte;
RInfo:=PtrAux^.Info;
dispose(PtrAux)
end;
Procedure ListarTrabAcc(VecEmp:TVecEmp;VecLis:TVecLis);
Var Rinfo:TipoInfo;
Begin
writeln('Empresas: ',VecEmp[1].RazSoc);
writeln('Legajo del Trabajador Cantidad de Inasistencias');
while Veclis[1]<> Nil do
begin
Suprime_Nodo_Lista(VecLis[1],RInfo);
writeln(RInfo.Leg,' ',Rinfo.CantDiasLic)
end
end;
(*Variables Globales*)
Var
Empresas:AEmp;
Accidentes:AAcc;
Veclis:Tveclis;
CantAcc:TVeCont;
VecEmp:TVecEmp;
(*Bloque Principal*)
Begin
Abrir(Empresas,Accidentes);
Inicializar(CantAcc,VecLis);
Cargar_Vector(Empresas,VecEmp);
Procesar(Accidentes,VecEmp,CantAcc,VecLis);
OrdenarMam(VecEmp,VecLis,100);
ListarPorc(VecEmp);
ListarTrabAcc(VecEmp,VecLis);
Close(Empresas);
Close(Accidentes);
readkey
end.
Ahora el problema esta que cuando lo ejecuto me tira runtime error, yo sospecho que es alguna incompatibilidad entre los types, pero no se, les agradecería si alguno me puede decir cual puede ser el problema, estuve probando de todo pero no pude lograr ejecutarlo.
El tema es que los archivos los tenía que crear yo para lo cual usé 2 programas:
este es el que usé para crear el archivo de empresas:
Program crearchempre;
Type
Str4=string[4];
Str40=string[40];
REmp=record
CodEmp:str4;
RazSoc:str40;
CanTraAs:word
end;
AEmp=File of REmp;
Var
ArchEmp:AEmp;
RegEmp:REmp;
i:byte;
Begin
assign(ArchEmp,'Empresas.dat');
rewrite(ArchEmp);
for i:=1 to 3 do
begin
writeln('Ingrese c¢digo de la empresa(4 caracteres)');
readln(RegEmp.CodEmp);
writeln('Ingrese raz¢n social(40 caracteres)');
readln(RegEmp.RazSoc);
writeln('Ingrese Cantidad de trabajadores asegurados(3 digitos)');
readln(RegEmp.CanTraAs);
write(ArchEmp,RegEmp)
end;
close(ArchEmp)
end.
y este para el archivo de accidentes:
Program crearchaccidentes;
Type
Str4=string[4];
Str5=string[5];
RAcc=record
CodEmp:str4;
Leg:str5;
Fecha:Longint;
CantDiasLic:word
end;
AAcc=File of RAcc;
Var
ArchAcc:AAcc;
RegAcc:RAcc;
i:byte;
respuesta:char;
Begin
assign(ArchAcc,'Accidentes.dat');
rewrite(ArchAcc);
repeat
writeln('Ingrese c¢digo de la empresa(4 caracteres)');
readln(RegAcc.CodEmp);
writeln('Ingrese n£mero de legajo(5 caracteres)');
readln(RegAcc.leg);
writeln('Ingrese la fecha(6 digitos)');
readln(RegAcc.fecha);
writeln('Ingrese la cantidad de d¡as de licencia(3 d¡gitos)');
readln(RegAcc.CantDiasLic);
write(ArchAcc,RegAcc);
writeln('¨Desea agregar otro registro?(S o N)');
readln(respuesta)
until respuesta='N';
close(ArchAcc)
end.
Y bueno una vez que creé los archivos hice el programa para hacer todos los procesos necesarios para obtener los dos listados, el programa compila bien , este es el código:
Program TrabajoPractico;
Uses crt,dos;
Type
Str5=string[5];
Str4=string[4];
Str40=string[40];
REmp=record
CodEmp:str4;
RazSoc:str40;
CanTrabAs:word
end;
RAcc=record
CodEmp:str4;
Leg:str5;
Fecha:Longint;
CantDiasLic:word
end;
AEmp=File of REmp;
AAcc=File of RAcc;
RegVemp=record
Codemp:str4;
Razsoc:str40;
CanTrabAs:word;
Porc:byte
end;
TipoInfo=record
Leg:Str5;
CantDiasLic:byte
end;
Tipolista=^tiponodo;
Tiponodo=record
Info:TipoInfo;
Sgte:TipoLista
end;
TvecEmp=Array[1..100] of RegVemp;
TveCont=Array[1..100] of Word;
TvecLis=array[1..100] of TipoLista;
(*Desarrollo de Procedimientos*)
Procedure Abrir(var Empresas:AEmp;Var Accidentes:AAcc);
Begin
assign(Empresas,'Empresas.Dat');
Reset(Empresas);
assign(Accidentes,'Accidentes.Dat');
Reset(Accidentes)
end;
Procedure Inicializar(Var ContAcc:TVeCont;Var Veclis:TvecLis);
Var i:byte;
Begin
for i:=1 to 100 do
begin
ContAcc[i]:=0;
VecLis[i]:=nil
end
end;
Procedure Cargar_Vector(var Empresas:AEmp;Var VecEmp:TvecEmp);
Var i:byte;
Rempresas:Remp;
Begin
For i:=1 to 100 do
begin
read(Empresas,Rempresas);
VecEmp[i].CodEmp:=Rempresas.Codemp;
VecEmp[i].RazSoc:=Rempresas.Razsoc;
VecEmp[i].CanTrabAs:=Rempresas.CanTrabAs
end
end;
Procedure Leer(var Accidentes:AAcc;var RegAcc:RAcc;Var FinArch:boolean);
Begin
if not eof(Accidentes) then
begin
read(Accidentes,RegAcc);
FinArch:=false
end
else
FinArch:=true
end;
Procedure Bus_Lin_Vec(VecEmp:TvecEmp;cod:str4;var pos:word);
Var encontrado:boolean;
i:byte;
Begin
i:=1;
encontrado:=false;
while not (encontrado) do
begin
if VecEmp[i].CodEmp=cod then
begin
encontrado:=true;
pos:=i
end;
inc(i)
end
end;
Function Porcen(CantrabAs,cont:word):byte;
begin
Porcen:=random(100)
end;
Procedure Agregar_Nodo_Lista(var lista:tipolista;valor:tipoinfo);
var PtrN,PtrAux:TipoLista;
Begin
new(PtrN);
if lista<>nil then
begin
PtrAux:=lista;
while PtrAux<>nil do
PtrAux:=PtrAux^.sgte;
ptrn^.Info:=valor;
ptrAux^.sgte:=PtrN
end
else
Lista:=Ptrn
end;
Procedure Procesar(Var Accidentes:AAcc;Var VecEmp:TVecEmp;Var VContAcc:Tvecont;Var VecLIsEmp:TVecLis);
var i,DiasLic:byte;
clave:str5;
RInfo:TipoInfo;
RegAcc:Racc;
Pos:Word;
FinArch:boolean;
Begin
Leer(Accidentes,Regacc,FinArch);
while not FinArch do
begin
clave:=Regacc.Leg;
Rinfo.Leg:=Regacc.leg;
DiasLic:=0;
while (not FinArch) and (Regacc.Leg=clave) do
begin
DiasLic:=DiasLic+Regacc.CantDiasLic;
Leer(Accidentes,Regacc,FinArch)
end;
Bus_Lin_Vec(VecEmp,Regacc.CodEmp,Pos);
VContAcc[Pos]:=VContAcc[Pos]+1;
Rinfo.CantDiasLic:=DiasLic;
Agregar_Nodo_Lista(VecLisEmp[Pos],Rinfo)
end;
for i:=1 to 100 do
VecEmp[i].Porc:=Porcen(VecEmp[i].CanTrabAs,VContAcc[i])
end;
Procedure OrdenarMam(var VecEmp:TVecEmp;var VeclisEmp:TVecLis;Tope:byte);
var ordenado:boolean;
aux:RegVemp;
AuxLis:TipoLista;
i:byte;
Begin
Ordenado:=false;
while not ordenado do
begin
Ordenado:=True;
for i:=1 to tope-1 do
begin
if VecEmp[i].Porc<VecEmp[i+1].Porc then
begin
Aux:=VecEmp[i];
VecEmp[i]:=VecEmp[i+1];
VecEmp[i+1]:=Aux;
AuxLis:=VecLisEmp[i];
VecLisEmp[i]:=VecLisEmp[i+1];
VecLisEmp[i+1]:=AuxLis;
Ordenado:=False
end
end
end
end;
Procedure ListarPorc(VecEmp:TvecEmp);
Var i:byte;
Begin
for i:=1 to 100 do
begin
writeln('Empresa: ',VecEmp[i].RazSoc);
writeln('Porcentaje: ',VecEmp[i].Porc)
end
end;
Procedure Suprime_Nodo_Lista(var Lista:TipoLista;Var RInfo:TipoInfo);
Var PtrAux,PtrSgte:TipoLista;
Begin
PtrAux:=lista;
PtrSgte:=PtrAux^.Sgte;
Lista:=Ptrsgte;
RInfo:=PtrAux^.Info;
dispose(PtrAux)
end;
Procedure ListarTrabAcc(VecEmp:TVecEmp;VecLis:TVecLis);
Var Rinfo:TipoInfo;
Begin
writeln('Empresas: ',VecEmp[1].RazSoc);
writeln('Legajo del Trabajador Cantidad de Inasistencias');
while Veclis[1]<> Nil do
begin
Suprime_Nodo_Lista(VecLis[1],RInfo);
writeln(RInfo.Leg,' ',Rinfo.CantDiasLic)
end
end;
(*Variables Globales*)
Var
Empresas:AEmp;
Accidentes:AAcc;
Veclis:Tveclis;
CantAcc:TVeCont;
VecEmp:TVecEmp;
(*Bloque Principal*)
Begin
Abrir(Empresas,Accidentes);
Inicializar(CantAcc,VecLis);
Cargar_Vector(Empresas,VecEmp);
Procesar(Accidentes,VecEmp,CantAcc,VecLis);
OrdenarMam(VecEmp,VecLis,100);
ListarPorc(VecEmp);
ListarTrabAcc(VecEmp,VecLis);
Close(Empresas);
Close(Accidentes);
readkey
end.
Ahora el problema esta que cuando lo ejecuto me tira runtime error, yo sospecho que es alguna incompatibilidad entre los types, pero no se, les agradecería si alguno me puede decir cual puede ser el problema, estuve probando de todo pero no pude lograr ejecutarlo.
Valora esta pregunta


0