UTNianos

Versión completa: [Algoritmos] Ayuda con TP
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2
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 =P

Gracias =D
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 =D 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 =P
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...
que es lo que anda mal ?
(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 Confused

Te dejo el codigo una vez mas y no te jodo mas =P


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 =D Tengo errores boludos por despistado nomas jajaja ya pueden cerrar el topic
Páginas: 1 2
URLs de referencia