estudiante
Publicado por Federico (4 intervenciones) el 11/12/2007 06:39:21
Hola gente del foro
Me dirijo a ustedes para ver si me pueden ayudar con este problema que me esta volviendo loco...resulta que estoy estudiando ingenieria y una de las materias es informatica y bueno, nos hacen programar en pascal.
El asunto es que en unos dias hay que entregar el ultimo trabajo practico del año y yo todavia estoy
renegando con un error que me da el programa: el error 100 "disk read error".
Por lo que vi es bastante comun, pero no lo pude solucionar de las formas que se proponen generalmente q basicamete consisten en cabiar la ubicacion de los archivos...
Este es el codigo completo:
program tp2;
type
reg=record
nmed, year,mes: integer;
consumo: longint;
nombre: string[40];
descripcion: string[50];
end;
nombres= array[1..100]of string[40];
arre= array[1..100, 1..12] of longint;
numeros= array[1..100] of integer;
var
r: reg;
archi: file of reg;
num: numeros;
nomb: nombres;
i,j,n ,nm, camb_mes, cant_cli: integer;
A, B, CONSA, CONSB: arre;
PROCEDURE PROMEDIO (CONSB: ARRE; CANTCLI: INTEGER);
TYPE
PROME=ARRAY [1..12,1..2] OF REAL;
VAR
P: PROME;
J, I: INTEGER;
AUX: REAL;
BEGIN
FOR J := 1 TO 12 DO
BEGIN
FOR I := 1 TO CANT_CLI DO
BEGIN
P[I, 2] := P[I, 2] + CONSB[I, J];
END;
P[I, 2] := P[I, 2] / CANT_CLI;
P[I, 1] := J;
END;
FOR I := 1 TO 11 DO
BEGIN
FOR J := I+1 TO 12 DO
BEGIN
IF (P[I, 2] < P[J, 2]) THEN
BEGIN
AUX := P[I, 2];
P[I, 2] := P[J, 2];
P[J, 2] := AUX;
AUX := P[I, 1];
P[I, 1] := P[J, 1];
P[J,1] := AUX;
END;
END;
END;
FOR I := 1 TO 12 DO
BEGIN
WRITELN(' promedio mes ', P[I, 1], ':', P[I, 2]);
END;
END;
PROCEDURE COMPARATIVA_DE_MESES ( CONSA, CONSB: ARRE ; CANT_CLI: INTEGER; NOMB: NOMBRES);
VAR
CONTADOR, I, J: INTEGER;
BEGIN
CONTADOR:= 0;
FOR I := 1 TO CANT_CLI DO
BEGIN
FOR J := 1 TO 12 DO
BEGIN
IF (CONSB[I,J] < CONSA[I,J]) AND (CONSA[I,J] <> 0) AND (CONSB[I,J] <> 0) THEN;
CONTADOR := CONTADOR +1;
END;
WRITELN('el cliente : ', NOMB[I] , 'Num.: ', NUM[I], 'tuvo un menor consumo en', CONTADOR, 'meses');
END;
END;
PROCEDURE BUSQUEDA (NM: INTEGER; NUM: NUMEROS; NOMB: NOMBRES);
VAR
CONT, I: INTEGER;
BEGIN
CONT := 0;
REPEAT
CONT := CONT + 1;
UNTIL ( NM = NUM[CONT] ) OR (CONT = 100);
IF (CONT =100) AND (NM<> NUM[100]) THEN;
BEGIN
WRITELN ('no se encuentra el cliente especificado');
END;
WRITELN ('el cliente', NOMB[CONT],'numero', NUM[CONT], 'CONSUMIO:');
FOR I := 1 TO 12 DO
BEGIN
WRITELN ('mes', I, CONSB[CONT, I] );
END;
END;
begin
assign(archi, 'c:clientes.dat');
reset(archi);
i:=0;
while not(eof(archi)) do
begin
read(archi, r);
i:= i+1;
num[i]:= r.nmed;
nomb[i]:=r.nombre;
end;
close(archi);
i:= 0;
assign(archi, 'c:consumos.dat');
reset(archi);
while not(eof(archi)) do
begin
read(archi, r);
writeln(r.nmed, r.year,r.mes, r.consumo);
i:= i+1;
if (r.mes>camb_mes) then
i:= 0;
if (r.year = 2005) then
A[i,r.mes]:= r.consumo;
if (r.year = 2006) then
begin
B[i,r.mes]:= r.consumo;
end;
camb_mes:= r.mes;
end;
close(archi);
FOR I := 1 TO CANT_CLI DO
CONSA[I, 1] := A[I, 1];
CONSB[I, 1] := B[I, 1];
FOR J := 2 TO 12 DO
CONSA[I, J] := A[I, J] - A[I, J-1];
CONSB[I, J] := B[I, J] - B[I, J-1];
REPEAT
WRITELN ('si desea un listado del consumo promedio de cada mes del a¤o 2006, presione 1');
WRITELN ('para obtener un listado que contenga la cantidad de meses de 2006 en los cuales el consumo por cliente, presione 2');
WRITELN ('si desea ingresar un numero de medidor para consultar las cantidades consumidas en los meses del 2006, presione 3');
WRITELN ('si desea salir presione 4');
READ (N);
IF (N=1) THEN
PROMEDIO (CONSB, CANT_CLI);
IF (N=2) THEN
COMPARATIVA_DE_MESES (CONSA, CONSB, CANT_CLI, NOMB);
IF (N=3) THEN
BEGIN
WRITELN('ingrese numero del medidor');
READ (NM);
BUSQUEDA (NM, NUM, NOMB);
END;
UNTIL (N = 4);
END.
Gracias desde ya y un saludoo
Me dirijo a ustedes para ver si me pueden ayudar con este problema que me esta volviendo loco...resulta que estoy estudiando ingenieria y una de las materias es informatica y bueno, nos hacen programar en pascal.
El asunto es que en unos dias hay que entregar el ultimo trabajo practico del año y yo todavia estoy
renegando con un error que me da el programa: el error 100 "disk read error".
Por lo que vi es bastante comun, pero no lo pude solucionar de las formas que se proponen generalmente q basicamete consisten en cabiar la ubicacion de los archivos...
Este es el codigo completo:
program tp2;
type
reg=record
nmed, year,mes: integer;
consumo: longint;
nombre: string[40];
descripcion: string[50];
end;
nombres= array[1..100]of string[40];
arre= array[1..100, 1..12] of longint;
numeros= array[1..100] of integer;
var
r: reg;
archi: file of reg;
num: numeros;
nomb: nombres;
i,j,n ,nm, camb_mes, cant_cli: integer;
A, B, CONSA, CONSB: arre;
PROCEDURE PROMEDIO (CONSB: ARRE; CANTCLI: INTEGER);
TYPE
PROME=ARRAY [1..12,1..2] OF REAL;
VAR
P: PROME;
J, I: INTEGER;
AUX: REAL;
BEGIN
FOR J := 1 TO 12 DO
BEGIN
FOR I := 1 TO CANT_CLI DO
BEGIN
P[I, 2] := P[I, 2] + CONSB[I, J];
END;
P[I, 2] := P[I, 2] / CANT_CLI;
P[I, 1] := J;
END;
FOR I := 1 TO 11 DO
BEGIN
FOR J := I+1 TO 12 DO
BEGIN
IF (P[I, 2] < P[J, 2]) THEN
BEGIN
AUX := P[I, 2];
P[I, 2] := P[J, 2];
P[J, 2] := AUX;
AUX := P[I, 1];
P[I, 1] := P[J, 1];
P[J,1] := AUX;
END;
END;
END;
FOR I := 1 TO 12 DO
BEGIN
WRITELN(' promedio mes ', P[I, 1], ':', P[I, 2]);
END;
END;
PROCEDURE COMPARATIVA_DE_MESES ( CONSA, CONSB: ARRE ; CANT_CLI: INTEGER; NOMB: NOMBRES);
VAR
CONTADOR, I, J: INTEGER;
BEGIN
CONTADOR:= 0;
FOR I := 1 TO CANT_CLI DO
BEGIN
FOR J := 1 TO 12 DO
BEGIN
IF (CONSB[I,J] < CONSA[I,J]) AND (CONSA[I,J] <> 0) AND (CONSB[I,J] <> 0) THEN;
CONTADOR := CONTADOR +1;
END;
WRITELN('el cliente : ', NOMB[I] , 'Num.: ', NUM[I], 'tuvo un menor consumo en', CONTADOR, 'meses');
END;
END;
PROCEDURE BUSQUEDA (NM: INTEGER; NUM: NUMEROS; NOMB: NOMBRES);
VAR
CONT, I: INTEGER;
BEGIN
CONT := 0;
REPEAT
CONT := CONT + 1;
UNTIL ( NM = NUM[CONT] ) OR (CONT = 100);
IF (CONT =100) AND (NM<> NUM[100]) THEN;
BEGIN
WRITELN ('no se encuentra el cliente especificado');
END;
WRITELN ('el cliente', NOMB[CONT],'numero', NUM[CONT], 'CONSUMIO:');
FOR I := 1 TO 12 DO
BEGIN
WRITELN ('mes', I, CONSB[CONT, I] );
END;
END;
begin
assign(archi, 'c:clientes.dat');
reset(archi);
i:=0;
while not(eof(archi)) do
begin
read(archi, r);
i:= i+1;
num[i]:= r.nmed;
nomb[i]:=r.nombre;
end;
close(archi);
i:= 0;
assign(archi, 'c:consumos.dat');
reset(archi);
while not(eof(archi)) do
begin
read(archi, r);
writeln(r.nmed, r.year,r.mes, r.consumo);
i:= i+1;
if (r.mes>camb_mes) then
i:= 0;
if (r.year = 2005) then
A[i,r.mes]:= r.consumo;
if (r.year = 2006) then
begin
B[i,r.mes]:= r.consumo;
end;
camb_mes:= r.mes;
end;
close(archi);
FOR I := 1 TO CANT_CLI DO
CONSA[I, 1] := A[I, 1];
CONSB[I, 1] := B[I, 1];
FOR J := 2 TO 12 DO
CONSA[I, J] := A[I, J] - A[I, J-1];
CONSB[I, J] := B[I, J] - B[I, J-1];
REPEAT
WRITELN ('si desea un listado del consumo promedio de cada mes del a¤o 2006, presione 1');
WRITELN ('para obtener un listado que contenga la cantidad de meses de 2006 en los cuales el consumo por cliente, presione 2');
WRITELN ('si desea ingresar un numero de medidor para consultar las cantidades consumidas en los meses del 2006, presione 3');
WRITELN ('si desea salir presione 4');
READ (N);
IF (N=1) THEN
PROMEDIO (CONSB, CANT_CLI);
IF (N=2) THEN
COMPARATIVA_DE_MESES (CONSA, CONSB, CANT_CLI, NOMB);
IF (N=3) THEN
BEGIN
WRITELN('ingrese numero del medidor');
READ (NM);
BUSQUEDA (NM, NUM, NOMB);
END;
UNTIL (N = 4);
END.
Gracias desde ya y un saludoo
Valora esta pregunta


0