Ya tengo el programa andando lo mas bien, pero no me acuerdo como hacer funciones JAJAJA, alguien me puede dar una mano?
if (not eof(actf)) then begin
read(actf,ractas);
flag:=false;
end else begin
flag:=true;
end;
Esa funcion la usaria para hacer un
while (not flag) y ir accediendo a los registros, si lo hago 'asi nomas' no me agarra el ultimo registro.
Ademas uso corto de control, y usaria 2 veces la misma funcion
Gracias
no entiendo lo que queres hacer, pero si cual puede ser el problema
tenes un corte de control y de seguro lees al final el while, por lo que no lees el ultimo registro por la siguiente razon:
vos al leer moves el puntero del archivo a la posicion siguiente, por lo que en el caso del ultimo registro, al leerlo pasaria a apuntar a eof, es por eso que cuando volves a la condicion del while pregunta si es eof y dice que si, porque apunta a eof.
hay miles de formas de solucionar eso, llamados parches.
la mas optima, o al menos, una de las mas optimas, es hacer una funcion que se fije si es eof y que devuelva el registro leido.
conocida como la funcion "leer". tiene todo el polimorfismo.
en fin, si el problema es ese, avisa que te tiro un codigo copado
Ese seria el 'problema', mira te tiro el enunciado y el codigo
Program TP2;
uses crt;
type
ts20=string[20];
tracta=record
libro,codm,fecha,leg:longint;
folio:word;
nota:byte;
nomape:ts20;
end;
trtot=record
libro:longint;
folio:word;
tai,tau,taa,tad:byte;
end;
taactf=file of tracta;
tatotal=file of trtot;
var
actf:taactf;
total:tatotal;
ractas:tracta;
rtotal:trtot;
libroant:longint;
folioant:word;
flag:boolean;
Begin
clrscr;
assign(actf,'C:\actas.txt');
reset(actf);
assign(total,'C:\totales.txt');
rewrite(total);
if (not eof(actf)) then begin
read(actf,ractas);
flag:=false;
end else begin
flag:=true;
end;
while(not flag) do begin
libroant:=ractas.libro;
folioant:=ractas.folio;
rtotal.tai:=0;
rtotal.tau:=0;
rtotal.taa:=0;
rtotal.tad:=0;
while(not flag) AND (folioant=ractas.folio) AND (libroant=ractas.libro)do begin
rtotal.tai:=rtotal.tai+1;
case ractas.nota of
0: rtotal.tau:=rtotal.tau+1;
1: rtotal.tad:=rtotal.tad+1;
2: rtotal.tad:=rtotal.tad+1;
3: rtotal.tad:=rtotal.tad+1;
else
rtotal.taa:=rtotal.taa+1;
end;
if (not eof(actf)) then begin
read(actf,ractas);
flag:=false;
end else begin
flag:=true;
end;
end;
rtotal.folio:=folioant;
rtotal.libro:=libroant;
write(total,rtotal);
end;
//Lectura de totales desde disco
reset(total);
writeln('Libro, Folio, Ins., Aus., Apr., Des.');
while(not Eof(total)) do begin
read(total,rtotal);
writeln(rtotal.libro,' ',rtotal.folio,' ',rtotal.tai,' ',rtotal.tau,' ', rtotal.taa,' ',rtotal.tad);
end;
close(actf);
close(total);
writeln('Presione ENTER para salir...');
readkey;
end.
A eso me referia, creo que ahi se entiende mucho mejor =P
vos lo que queres es meter el codigo de tu primer comentario en una funcion ?
seria asi, en tu programa principal pones:
flag:=finArchivo(archivo,registro);
y arriba de todo, abajo de la seccion type pones:
function finArchivo(var actf: tipoArchivo, var ractas: tipoRegistro):boolean
begin
if (not eof(actf)) then begin
read(actf,ractas);
finArchivo:=false;
end else begin
finArchivo:=true;
end;
end;
si no es eso, no entiendo que precisas xD
edit: me comi un end;
Eso es lo que necesitaba
Lastima que tiro:
Syntax error, ) expected but , found
function finArchivo(var actf: tipoArchivo, var ractas: tipoRegistro):boolean
Capaz porque no se pasan los registros en las funciones? xD Algo asi escuche que dijo el profe
capaz es ; y no ,
eso no me lo acuerdo
jajaja era eso nomas, muchas gracias che, ahi te tiro repu
de nada
tambien tenes los procedimientos, que al contrario de las funciones, no tienen devolucion
la sintaxis es relativamente igual
procedure elProcedimiento (parametros)
begin
end;
y se invoca
begin
codigo chorizo
elProcedimiento(parametros);
mas codigo chorizo
end.
saludos
Use varios procedimientos pero funciones 1 o 2 ponele xD
Sabes que con la funcion me anda mal :/ pero a lo cabeza sigue andando 10 puntos (? Y no creo que la funcion tenga algun error...
(03-10-2011 21:47)el pibe escribió: [ -> ]de nada
tambien tenes los procedimientos, que al contrario de las funciones, no tienen devolucion
la sintaxis es relativamente igual
procedure elProcedimiento (parametros)
begin
end;
y se invoca
begin
codigo chorizo
elProcedimiento(parametros);
mas codigo chorizo
end.
saludos
Estas seguro que los procedures de Algoritmos y Pascal no devuelven nada??? la curse hace como 3 años y sinceramente ahora vivo en C por Sistemas Operativos, pero me parece q La diferencia entre Funcion y Procedimiento es que el primero solo devuelve 1 Valor y un Procedimiento podia devolver un monton (o sea 2,3 o 4).
of-topic:
Vos sos elpibe de er? yo era maguilla, me ubicas? mi acc ahora la usa un amigo asi q no me contactes por ahi.
los procedimientos no devuelven, las funciones devuelven un valor.
en AMBOS casos, le podes pasar parametros por referencia, y modificar su valor dentro de la funcion o procedimiento.
fijate que en el caso de finArchivo, la funcion
devuelve un flag,
modifica el puntero del archivo y carga en la estructura ractas los datos del archivo.
- Off-topic:
- si, soy el de eR. Te recuerdo, te tenia como "amigo" ingame, pero ultimamente y hace mucho, ya no entro muy seguido al foro, como tampoco hago un seguimiento
saludos
Obvio que hice eso, lo raro es que me devuelve false. Es mas, me lee todos los registros si lo pongo la primera vez, pero con Folio=0 y Libro=0
Te dejo el codigo una vez mas y no te jodo mas
Program TP2;
uses crt;
type
ts20=string[20];
tracta=record
libro,codm,fecha,leg:longint;
folio:word;
nota:byte;
nomape:ts20;
end;
trtot=record
libro:longint;
folio:word;
tai,tau,taa,tad:byte;
end;
taactf=file of tracta;
tatotal=file of trtot;
function finArchivo(var actf: taactf; ractas: tracta): boolean;
begin
if (not eof(actf)) then begin
read(actf,ractas);
finArchivo:=false;
end else begin
finArchivo:=true;
end;
end;
var
actf:taactf;
total:tatotal;
ractas:tracta;
rtotal:trtot;
libroant:longint;
folioant:word;
flag:boolean;
Begin
clrscr;
assign(actf,'C:\actas.txt');
reset(actf);
assign(total,'C:\totales.txt');
rewrite(total);
//Aca usaria
//flag:=finArchivo(actf,ractas);
if (not eof(actf)) then begin
read(actf,ractas);
flag:=false;
end else begin
flag:=true;
end;
while(not flag) do begin
libroant:=ractas.libro;
folioant:=ractas.folio;
rtotal.tai:=0;
rtotal.tau:=0;
rtotal.taa:=0;
rtotal.tad:=0;
while(not flag) AND (folioant=ractas.folio) AND (libroant=ractas.libro)do begin
rtotal.tai:=rtotal.tai+1;
case ractas.nota of
0: rtotal.tau:=rtotal.tau+1;
1: rtotal.tad:=rtotal.tad+1;
2: rtotal.tad:=rtotal.tad+1;
3: rtotal.tad:=rtotal.tad+1;
else
rtotal.taa:=rtotal.taa+1;
end;
//Aca usaria
//flag:=finArchivo(actf,ractas);
if (not eof(actf)) then begin
read(actf,ractas);
flag:=false;
end else begin
flag:=true;
end;
end;
rtotal.folio:=folioant;
rtotal.libro:=libroant;
write(total,rtotal);
end;
//Lectura de totales desde disco
reset(total);
writeln('Libro, Folio, Ins., Aus., Apr., Des.');
while(not Eof(total)) do begin
read(total,rtotal);
writeln(rtotal.libro,' ',rtotal.folio,' ',rtotal.tai,' ',rtotal.tau,' ', rtotal.taa,' ',rtotal.tad);
end;
close(actf);
close(total);
writeln('Presione ENTER para salir...');
readkey;
end.
te falto var ractas
function finArchivo(var actf: taactf; var ractas: tracta): boolean;
Muchas gracias
Tengo errores boludos por despistado nomas jajaja ya pueden cerrar el topic