UTNianos

Versión completa: Ayuda TP Algoritmos
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2
Buenas mañanas(?
Estoy teniendo problemas con un TP de algoritmos, al punto que estoy llegando al borde de la locura(?, no tanto pero se me hizo un matete de conceptos en la cabeza y estoy bloqueado.
Les dejo las consignas:
Spoiler: Mostrar
[Imagen: Tweets0001.jpg]
[Imagen: Tweets0002.jpg]
[Imagen: Tweets0003.jpg]
les dejo lo que hice(saltense a la parte del proceso "procesar" y el programa principal).


type
TipoPalabra = string[30];
T_Fech = record
dia : integer;
mes : integer;
anio : integer;
end;
T_Reg = record
usu : string[30];
msg : string [140];
fecha: integer;
end;
T_Arch = file of T_Reg;
var
arch:T_Arch;
palabra:TipoPalabra;
myPalabra:TipoPalabra;
maxPal:integer;
maxFech:integer;

//Funcion Cantidad de palabras
function CantidadDePalabras(texto:string):byte;
var
posicion,total:byte;
begin
total := 0;
posicion := pos(' ', texto);
while (posicion > 0) do begin
delete(texto, 1, posicion);
if (posicion > 1) then begin
inc(total);
end;
posicion := pos(' ', texto);
end;
if (length(texto)>0) then begin
inc(total);
end;
CantidadDePalabras := total;
end;
// Procedimiento Obtener palabra
procedure ObtenerPalabra(texto:string; indice:byte; var palabra:TipoPalabra);
var posicion,i:byte;
begin
i:=1;
posicion:=pos(' ', texto);
while (posicion = 1) OR (i < indice) do begin
delete(texto,1,posicion);
if (posicion <> 1) then begin
inc(i);
end;

posicion := pos(' ',texto);
end;
if (posicion > 0) then begin
delete(texto,posicion,(length(texto) - posicion + 1));
end;
palabra:=texto;
end;
// Funcion texto contiene palabra
function TextoContienePalabra(texto:string; palabra:TipoPalabra):boolean;
var posicion:byte;
begin
posicion:=pos(palabra,texto);
if (posicion=0) then begin
TextoContienePalabra:=FALSE
end
else begin
TextoContienePalabra:=TRUE
end;
end;
// Ingresar Palabra
procedure IngresarPalabra(var myPalabra:TipoPalabra);
begin
writeln('Ingresar Palabra');
readln(myPalabra);
end;
// Abrir archivo
procedure abrir_archivo(var arch:T_Arch; ruta:string);
begin
assign(arch,ruta);
reset(arch);
end;
//Procesar
procedure procesar(var palabra:TipoPalabra; var arch:T_Arch; var maxPal:integer; var maxFech:integer);
var
i:integer;
Regi:T_Reg;
antCantPal:integer;
cantPal:integer;
begin
antCantPal:=0;
cantPal:=0;
while not eof(arch) do
begin
read(arch,Regi);
antCantPal:=
for i:=0 to CantidadDePalabras(regi.msg) do
begin
ObtenerPalabra(Regi.msg, i, palabra);
IngresarPalabra(myPalabra);
if (palabra = myPalabra) then
inc(cantPal);
end;
if cantPal>antCantPal then begin
maxPal:=cantPal;
maxFech:=Regi.fecha;
end;
end;
end;
//Cerrar archivo
procedure cerrar_archivo(var arch:T_Arch);
begin
close(arch)
end;
//Resultado
procedure resultado(maxFech:integer;maxPal:integer);
begin
write('El dia en el que la palabra ',myPalabra);
writeln('se repitio mas veces fue ', maxFech);
writeln('y la cantidad de veces fue ', maxPal);
end;
//procedure ini_proces(var tamPal,cantPal,posPal,maxPal:integer;fechaMaxPal:logint;palabra:TipoPalabra;texto:string);
//begin
// tamPal:=lenght(palabra);
// cantPal:=0;
// posPal:=pos(palabra,texto);
// maxPal:=-1;
// fechaMaxPal:=0;
//end;

//Programa principal
begin
maxPal:=0;
maxFech:=0;
IngresarPalabra(myPalabra);
abrir_archivo(arch,'D:\TWEETS.DAT');
procesar(palabra,arch,maxPal,maxFech);
cerrar_archivo(arch);
resultado(maxPal,maxFech);
end.



La parte de maximos esta mal, pero como ya dije estoy quemado y ademas ya salgo para la facu.
Esta bien el sintaxis en general?
Esta bien la "idea principal" del procedimiento "procesar"?
no uso nunca el procedimiento TextoContienePalabra(), donde lo puedo enganchar?

Saludos
No revisé si desarrollaste bien las funciones, miré el código por encima para ver la estructura.
A mi parecer procesar está mal. Estás recorriendo el archivo y mientras tanto pidiendo a cada rato que el usuario ingrese una palabra a buscar, cuando lo que deberías hacer es que el usuario ingrese la palabra al comienzo(fuera del ciclo) y después recorrer todo el archivo para ver cuándo fue que hubo más tweets con dicha palabra.

Respecto a la búsqueda de máximos, tu problema es que no estás haciendo un corte de control por fecha (ya te dan el archivo ordenado para que lo hagas). Tengo unas dudas del enunciado, cuando dice "retorne mes y año", no sé si desea que lleves una cuenta por mes y otra por año (ej: abril y 2009) o que sólo busques el mes de un año (ej: abril del 2010), el primero se puede hacer combinando corte de control por año con un vector de 12 words en que le vayas sumando la cantidad de palabras por mes, entonces para el año usás lo que obtuviste del corte de control y para el mes sólo sacás el máximo del vector. Por si acaso consultalo con el ayudante o profesor.

La idea de TextoContienePalabra() es que metas ahí todo lo que se refiere a buscar la palabra, de modo que cuando hagas el corte de control directamente pongas un
if TextoContienePalabra(texto, palabra) do incrementarContadorCorrespondiente;

Es decir, sólo dentro de esa función usarías las funciones CantidadDePalabras y ObtenerPalabra y harías las comparaciones para ver si alguna es la palabra que ingresó el usuario.
muchas gracias por responder anirus, tome en cuenta algunas cosas que me dijiste y estuve modificando. Aca te dejo como mas o menos lo arme, igual sigue sin funcionar.



program TPAlgoritmos;
uses crt;
type
T_Fech = record
anio : integer;
mes : integer;
dia : integer;


end;
T_Reg = record
usu : string[30];
fecha: T_Fech;
msg : string [140];

end;
TipoPalabra = string[30];
T_Arch = file of T_Reg;
var
arch:T_Arch;
palabra:TipoPalabra;
myPalabra:TipoPalabra;
maxPal:integer;
maxFechMes,maxFechAnio:integer;

//Funcion Cantidad de palabras
function CantidadDePalabras(texto:string):byte;
var
posicion,total:byte;
begin
total := 0;
posicion := pos(' ', texto);
while (posicion > 0) do begin
delete(texto, 1, posicion);
if (posicion > 1) then begin
inc(total);
end;
posicion := pos(' ', texto);
end;
if (length(texto)>0) then begin
inc(total);
end;
CantidadDePalabras := total;
end;
// Procedimiento Obtener palabra
procedure ObtenerPalabra(texto:string; indice:byte; var palabra:TipoPalabra);
var posicion,i:byte;
begin
i:=1;
posicion:=pos(' ', texto);
while (posicion = 1) OR (i < indice) do begin
delete(texto,1,posicion);
if (posicion <> 1) then begin
inc(i);
end;

posicion := pos(' ',texto);
end;
if (posicion > 0) then begin
delete(texto,posicion,(length(texto) - posicion + 1));
end;
palabra:=texto;
end;
// Funcion texto contiene palabra
function TextoContienePalabra(texto:string; palabra:TipoPalabra):boolean;
var posicion:byte;
begin
posicion:=pos(palabra,texto);
if (posicion=0) then begin
TextoContienePalabra:=FALSE
end
else begin
TextoContienePalabra:=TRUE
end;
end;
// Ingresar Palabra
procedure IngresarPalabra(var myPalabra:TipoPalabra);
begin
writeln('Ingresar Palabra');
readln(myPalabra);
end;
// Abrir archivo
procedure AbrirArchivo(var arch:T_Arch);
begin
assign(arch,'c:\tweets.dat');
reset(arch);
end;
//Procesar
procedure Procesar(var palabra:TipoPalabra; var arch:T_Arch; var maxPal:integer; var maxFechMes,maxFechAnio:integer);
var
i:integer;
Regi:T_Reg;
//antCantPal:integer;
cantPal:integer;
antFech:T_Fech;
begin
while not eof(arch) do
begin
read(arch,Regi);
//antCantPal:=0;
cantPal:=0;
maxPal:=0;
//maxFech:=0;
antFech.mes:=0;
antFech.anio:=0;
antFech.mes :=Regi.fecha.mes;
antFech.anio :=Regi.fecha.anio;
if TextoContienePalabra(Regi.msg,myPalabra) = TRUE then begin
while (antFech.mes = Regi.fecha.mes) AND (antFech.anio = Regi.fecha.anio) do
begin
for i:=0 to CantidadDePalabras(Regi.msg) do
begin
ObtenerPalabra(Regi.msg, i, palabra);
if (palabra = myPalabra) then
inc(cantPal);
end;
read(arch,Regi);
end;
if cantPal>maxPal then begin
maxPal:=cantPal;
maxFechMes:=antFech.mes;
maxFechAnio:=antFech.anio;
end;
end;
end;


end;
//Cerrar archivo
procedure CerrarArchivo(var arch:T_Arch);
begin
close(arch)
end;
//Resultado
procedure resultado(maxFechMes:integer;maxFechAnio:integer;maxPal:integer);
begin
write('El dia en el que la palabra ',myPalabra);
writeln('se repitio mas veces fue ', maxFechAnio,maxFechMes);
writeln('y la cantidad de veces fue ', maxPal);
end;
//procedure ini_proces(var tamPal,cantPal,posPal,maxPal:integer;fechaMaxPal:logint;palabra:TipoPalabra;texto:string);
//begin
// tamPal:=lenght(palabra);
// cantPal:=0;
// posPal:=pos(palabra,texto);
// maxPal:=-1;
// fechaMaxPal:=0;
//end;

//Programa principal
begin
maxPal:=0;
maxFechAnio:=0;
maxFechMes:=0;
IngresarPalabra(myPalabra);
AbrirArchivo(arch);
Procesar(palabra,arch,maxPal,maxFechMes,maxFechAnio);
CerrarArchivo(arch);

resultado(maxPal,maxFechMes,maxFechAnio);
end.



me di cuenta que el gran problema que tengo es con los archivos, no entiendo bien como tiene que estar estructurado el archivo que lee.
Saludos
Como te dice que el formato de la fecha es AAAAMMDD sería:


T_Reg = record
usuario = string[30];
fecha = longint;
mensage = string[140];
end;




Es decir, no tenés un campo para el día, uno para mes y uno para año, sino que eso lo tenés que separar después usando divisiones.
bueno,Anirus, disculpa por colgar, tenes razon por lo de la fecha, lo que pasa que segui los ejemplos del blog holamundopascal y hay uno que usa la fecha como un registro y supuse que se hacia asi(?
y como la separo?, con alguna funcion de cadena?

Saludos
(26-08-2011 10:44)damj escribió: [ -> ]bueno,Anirus, disculpa por colgar, tenes razon por lo de la fecha, lo que pasa que segui los ejemplos del blog holamundopascal y hay uno que usa la fecha como un registro y supuse que se hacia asi(?
y como la separo?, con alguna funcion de cadena?

Saludos

Tendrías que usar X DIV Y (divide a X por Y y trunca el resultado) y MOD (devuelte el resto de dividir X por Y). fecha DIV 10000 para el año y fecha MOD 100 para el día. Para el mes podés hacer DIV 100 y después MOD 100, MOD 10000 y después DIV 100, o restarle a fecha los campos que ya sacaste multiplicados por potencias de 10.

El sentido de que la fecha la pongas como AAAAMMDD en lugar de definir un registro es que, en el primer caso, el orden alfabético/numérico coincide con el orden cronológico, mientras que los registros tendrías que ordenarlos por varios niveles.
Esta es una modificación de la que estaba en holamundo pascal que era para ddmmaaaa(cap 2, problema 2.2)


var
fec: longint;
dia,mes,anio: integer;

begin
write('Ingrese una fecha (aaaammdd): ');
readln(fec);

anio:= fec div 10000;
mes := (fec - anio*10000) div 100;
dia := fec mod 100;

writeln('dia=',dia,' mes=',mes,' anio=',anio);
end.



muchas gracias anubis y anirus. Creo que habíamos hecho unos ejercicios con fechas, esto de la materia anual se me esta olvidando todo jaja.
La cuestión es que hice las modificaciones, pero funca mal, me parece que es por la estructura del archivo.
cuando ejecuto esto



program TPAlgoritmos;
uses crt;
type
//T_Fech = record
//anio : integer;
//mes : integer;
//dia : integer;
//end;
T_Reg = record
usu : string[30];
fecha: longint;
msg : string [140];

end;
TipoPalabra = string[30];
T_Arch = file of T_Reg;
var
arch:T_Arch;
palabra:TipoPalabra;
myPalabra:TipoPalabra;
maxPal:integer;
maxFechMes,maxFechAnio:integer;

function CantidadDePalabras(texto:string):byte;
var
posicion,total:byte;
begin
total := 0;
posicion := pos(' ', texto);
while (posicion > 0) do begin
delete(texto, 1, posicion);
if (posicion > 1) then begin
inc(total);
end;
posicion := pos(' ', texto);
end;
if (length(texto)>0) then begin
inc(total);
end;
CantidadDePalabras := total;
end;
procedure ObtenerPalabra(texto:string; indice:byte; var palabra:TipoPalabra);
var posicion,i:byte;
begin
i:=1;
posicion:=pos(' ', texto);
while (posicion = 1) OR (i < indice) do begin
delete(texto,1,posicion);
if (posicion <> 1) then begin
inc(i);
end;

posicion := pos(' ',texto);
end;
if (posicion > 0) then begin
delete(texto,posicion,(length(texto) - posicion + 1));
end;
palabra:=texto;
end;
function TextoContienePalabra(texto:string; palabra:TipoPalabra):boolean;
var posicion:byte;
begin
posicion:=pos(palabra,texto);
if (posicion=0) then begin
TextoContienePalabra:=FALSE
end
else begin
TextoContienePalabra:=TRUE
end;
end;
procedure IngresarPalabra(var myPalabra:TipoPalabra);
begin
writeln('Ingresar Palabra');
readln(myPalabra);
end;
procedure AbrirArchivo(var arc:T_Arch);
begin
assign(arc,'c:\tweets.dat');
reset(arc);
end;
procedure Procesar(var palabra:TipoPalabra; var arch:T_Arch; var maxPal:integer; var maxFechMes:integer; var maxFechAnio:integer);
var
Regi:T_Reg;
i,cantPal,anio,mes,antMes,antAnio:integer;
fec:longint;
begin
maxPal:=0;
while ( NOT eof(arch) ) do
begin
read(arch,Regi);
cantPal:=0;
fec := Regi.fecha;
anio:= fec div 10000;
mes := (fec - anio*10000) div 100;
//dia := fec mod 100;
antMes := mes;
antAnio := anio;
writeln('mensaje: ',Regi.msg); // esto es para debug
if TextoContienePalabra(Regi.msg,myPalabra) = TRUE then begin
while (antMes = mes) AND (antAnio = anio) do
begin
for i:=0 to CantidadDePalabras(Regi.msg) do
begin
ObtenerPalabra(Regi.msg, i, palabra);
if (palabra = myPalabra) then
inc(cantPal);
end;
read(arch,Regi);
end;
if cantPal>maxPal then begin
maxPal:=cantPal;
maxFechMes:=antMes;
maxFechAnio:=antAnio;
end;
end;
end;


end;
procedure CerrarArchivo(var arch:T_Arch);
begin
close(arch)
end;
procedure Resultado(maxFechMes:integer;maxFechAnio:integer;maxPal:integer);
begin
write('El dia en el que la palabra ',myPalabra);
writeln(' se repitio mas veces fue el ', maxFechAnio, '/', maxFechMes);
writeln('y la cantidad de veces fue ', maxPal);
end;
begin
maxPal:=0;
maxFechAnio:=0;
maxFechMes:=0;
IngresarPalabra(myPalabra);
AbrirArchivo(arch);
Procesar(palabra,arch,maxPal,maxFechMes,maxFechAnio);
CerrarArchivo(arch);
if maxPal=0 then
begin
writeln('La palabra ',myPalabra, ' nunca fue escrita')
end
else
begin
Resultado(maxPal,maxFechMes,maxFechAnio);
end;
end.



con este archivo:


pepe 20110223 que lindo dia asdas
juan 20110223 que dia lindo dia
jose 20110223 que dia hermoso
roberto 20110223 dia dia dia
carlo 20110223 que lindo dia asdas
santiago 20110223 que dia lindo dia
nicolas 20110223 que dia hermoso



me devuelve


Ingresar Palabra
dia
mensaje: juan 2011
La palabra dia nunca fue escrita



es decir el registro mensaje me toma cualquier otra cosa. la verdad no tengo idea de como estructurar archivos planos, y no encontre nada en la intranet.
nuevamente gracias por toda la ayuda y la paciencia =D
Y si te hacés un programa para grabar los registros en el archivo?
(27-08-2011 01:30)damj escribió: [ -> ]es decir el registro mensaje me toma cualquier otra cosa. la verdad no tengo idea de como estructurar archivos planos

Acá:



T_Reg = record
usu : string[30];
fecha: longint;
msg : string [140];




Eliminá el tamaño de los string. Que "usu" y "msg" sean string a secas (no "string[30]" y "string[140]", solo "string").
Pero es una restricción del enunciado eso, si pone sólo string es lo mismo que ponga string[255], el problema a mi parecer es que está escribiendo todo a mano.
¿Cómo "escribiendo a mano"? ¿No lo está mostrando por pantalla?
Me corrijo, según esto: http://pascal-programming.info/lesson11.php#5 , no necesitás ni siquiera declararlas como string:

Mirá este ejemplo:


Type
Str25 = String[25];
TBookRec = Record
Title, Author,
ISBN : Str25;
Price : Real;
End;

Procedure EnterNewBook(var newBook : TBookRec);
Begin
Writeln('Please enter the book details: ');
Write('Book Name: ');
Readln(newBook.Title);
Write('Author: ');
Readln(newBook.Author);
Write('ISBN: ');
Readln(newBook.ISBN);
Write('Price: ');
Readln(newBook.Price);
End;

Var
bookRecArray : Array[1..10] of TBookRec;
tempBookRec : TBookRec;
bookRecFile : File of TBookRec;
i : 1..10;

Begin
Assign(bookRecFile, 'bookrec.dat');
ReWrite(bookRecFile);
For i := 1 to 10 do
Begin
EnterNewBook(bookRecArray[i]);
{ bookRecArray[i] now contains the book details }
Write(bookRecFile, bookRecArray[i]);
End;
Close(bookRecFile);
Writeln('Thanks for entering the book details.');
Writeln('They are saved in a file!');
Write('Now choose a record to display from 1 to 10: ');
Readln(i);
ReSet(bookRecFile);
Seek(bookRecFile, i-1);
Read(bookRecFile, tempBookRec);
Close(bookRecFile);
Writeln('Here are the book details of record #',i,':');
Writeln;
Writeln('Title: ', tempBookRec.Title);
Writeln('Author: ', tempBookRec.Author);
Writeln('ISBN: ', tempBookRec.ISBN);
Writeln('Price: ', tempBookRec.Price);
Readln;
End.


Es lo que digo, que lo grabe por programa en vez de escribir él el .dat (creo que lo escribió él, me suena que sino los nros no serían legibles)
Ahí te entendí =)
Páginas: 1 2
URLs de referencia