Pascal/Turbo Pascal - Ayuda programa!

 
Vista:

Ayuda programa!

Publicado por Jaf (1 intervención) el 19/10/2007 04:34:43
Alguien me puede decir que es lo que estoy haciedno mal, realmente no se que es, un saludo, me tira runtime error. El programa es agregar una definicion al diccionario, modificarla, o buscarla, les agradecería si me ayudan con esto.


Program Diccionario;

Type

Str=String;

RegPalabra=Record

Palabra,definicion:str;

end;

ArchPalabra=file of RegPalabra;


Function BusBin(var Arch:ArchPalabra;Palabra:str):longint;

var pos:longint;

RPalabra:RegPalabra;

Pri,ult,med:word;

Begin

Pri:=0;

Ult:=filesize(Arch)-1;

Pos:=-1;

while ((pri<=ult) and (pos=-1)) do

med:=(pri+ult) div 2;

seek(arch,med);

read(arch,RPalabra);

if Palabra=RPalabra.Palabra then

pos:=med

else

begin

if palabra<Rpalabra.Palabra then

ult:=med-1

else

pri:=med+1

end

end;


Procedure Abrir(var Arch:ArchPalabra);

Begin

Assign(Arch,'Diccionario.dat');

{$i-}

reset(Arch);

{$i-}

If ioresult<>0 then

rewrite(Arch)

else

reset(Arch)

end;

Procedure Agregar_Definicion(var Arch:ArchPalabra);

var RPalabra:RegPalabra;

palabra:str;

Begin

writeln('Introduzca la palabra que desea agregar: ');

readln(upcase(palabra));

if (BusBin(Arch,palabra)<>-1) then

writeln('La palabra ya se encuentra agregada en el diccionario.')

else

begin

seek(Arch,FileSize(Arch));

writeln('Introduzca la definici¢n de dicha palabra: ');

readln(upcase(RPalabra.Definicion));

write(arch,RPalabra)

end

end;

Procedure Modificar_Definicion(var Arch:ArchPalabra);

var RPalabra:RegPalabra;

pos:longint;

Begin

reset(Arch);

writeln('Introduzca la palabra que quiere modificar');

readln(upcase(RPalabra.Palabra));

pos:=BusBin(Arch,Rpalabra.Palabra);

if (pos<>-1) then

begin

seek(Arch,pos);

writeln('Introduzca la nueva definici¢n para esa palabra');

readln(Rpalabra.definicion);

write(Arch,Rpalabra)

end

else

writeln('Error: La palabra que intenta modificar no existe en el diccionario')

end;


Procedure Buscar_Definicion(var Arch:ArchPalabra);

var RPalabra:RegPalabra;

Palabra:str;

pos:longint;

Begin

writeln('Introduzca la palabra que desea buscar');

readln(Palabra);

pos:=BusBin(Arch,Palabra);

seek(Arch,pos);

read(Arch,RPalabra);

writeln('Palabra: ',RPalabra.Palabra);

writeln('Definici¢n: ',RPalabra.Definicion)

end;

Procedure Inicio(var Arch:ArchPalabra);

var opcion:byte;

Begin

writeln('Diccionario de la Real academia espa¤ola');

repeat

writeln('Indique con el n£mero correspondiente que tipo de operaci¢n desea realizar');

writeln('1-Agregar palabra');

writeln('2-Modificar la definici¢n de una palabra existente');

writeln('3-Buscar definici¢n');

writeln('4-Salir');

readln(opcion);

case opcion of

1:Agregar_definicion(Arch);

2:Modificar_definicion(Arch);

3:Buscar_definicion(Arch)

end

until opcion=4;

end;

var

Arch:ArchPalabra;

Begin

Inicio(Arch)

end.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda programa!

Publicado por Mariano (57 intervenciones) el 19/10/2007 05:33:28
Tenes 2 probelmas con el progmra.
El primero, es que si la primera accion que queres hacer es agregar definicion, sale del programa, xq no se abre el archivo en ningun lado, ni ocn reset ni con rewrite, por lo que sale por un error de que no encuentra el archivo.
El segundo error, es que en caso de que modifiques (que ahi si esta el reset) la primera vez entra sin probelmas, pero caundo vuelve al menu y queres modificar una palabra, surge un error, que no lo compile pero seguramente el rpoblema es que queres vovler a abrir un archivo que no cerraste:

q quiero decir con esto, que vos siempre al principio de modificar x ej, pones un reset
pero eso nunk lo cerras, tonces si modificas una vez, y dps vovles a entrar, queres abrir un archivo que nunk cerrast (y q ya esta en memoria), tonces surge un error en tiempo de ejecucion y sale del programa.
Poara soloucionar esto tenes dos pociones, o bien unicamente abris el archivo una primera vez antes de entrar al menu, o en cada opcion, al finalizar lo cerras el archivo, para que cuadno vuelva a entrar pueda ahcer un reset!

Espero que te haya sido util, y cualquier cosa consultaaa de nuevo!
Y avisaa si es que te sirvio :)!

Un abrazoo!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda programa!

Publicado por Jaf (83 intervenciones) el 20/10/2007 03:15:53
Acá está el código. Opte por la opción de abrirlo y cerrarlo cada vez que consulto o agrego palabra, o modifico. Pero sigue dando runtime error, no se que pasara, si me podes decir que hice mal te agradecería. Saludos


Program Diccionario;

Type

Str=String;

RegPalabra=Record

Palabra,definicion:str;

end;

ArchPalabra=file of RegPalabra;


Function BusBin(var Arch:ArchPalabra;Palabra:str):longint;

var pos:longint;

RPalabra:RegPalabra;

Pri,ult,med:word;

Begin

Pri:=0;

Ult:=filesize(Arch)-1;

Pos:=-1;

while ((pri<=ult) and (pos=-1)) do

med:=(pri+ult) div 2;

seek(arch,med);

read(arch,RPalabra);

if Palabra=RPalabra.Palabra then

pos:=med

else

begin

if palabra<Rpalabra.Palabra then

ult:=med-1

else

pri:=med+1

end

end;


Procedure Abrir(var Arch:ArchPalabra);

Begin

Assign(Arch,'Diccionario.dat');

{$i-}

reset(Arch);

{$i-}

If ioresult<>0 then

rewrite(Arch)

else

reset(Arch)

end;

Procedure Agregar_Definicion(var Arch:ArchPalabra);

var RPalabra:RegPalabra;

palabra:str;

Begin

abrir(Arch);

writeln('Introduzca la palabra que desea agregar: ');

readln(upcase(palabra));

if (BusBin(Arch,palabra)<>-1) then

writeln('La palabra ya se encuentra agregada en el diccionario.')

else

begin

seek(Arch,FileSize(Arch));

writeln('Introduzca la definici¢n de dicha palabra: ');

readln(upcase(RPalabra.Definicion));

write(arch,RPalabra)

end;

close(Arch)

end;

Procedure Modificar_Definicion(var Arch:ArchPalabra);

var RPalabra:RegPalabra;

pos:longint;

Begin

abrir(Arch);

writeln('Introduzca la palabra que quiere modificar');

readln(upcase(RPalabra.Palabra));

pos:=BusBin(Arch,Rpalabra.Palabra);

if (pos<>-1) then

begin

seek(Arch,pos);

writeln('Introduzca la nueva definici¢n para esa palabra');

readln(Rpalabra.definicion);

write(Arch,Rpalabra)

end

else

writeln('Error: La palabra que intenta modificar no existe en el diccionario');

close(Arch)

end;


Procedure Buscar_Definicion(var Arch:ArchPalabra);

var RPalabra:RegPalabra;

Palabra:str;

pos:longint;

Begin

Abrir(Arch);

writeln('Introduzca la palabra que desea buscar');

readln(Palabra);

pos:=BusBin(Arch,Palabra);

seek(Arch,pos);

read(Arch,RPalabra);

writeln('Palabra: ',RPalabra.Palabra);

writeln('Definici¢n: ',RPalabra.Definicion);

close(Arch)

end;

Procedure Inicio(var Arch:ArchPalabra);

var opcion:byte;

Begin


writeln('Diccionario de la Real academia espa¤ola');

repeat

writeln('Indique con el n£mero correspondiente que tipo de operaci¢n desea realizar');

writeln('1-Agregar palabra');

writeln('2-Modificar la definici¢n de una palabra existente');

writeln('3-Buscar definici¢n');

writeln('4-Salir');

readln(opcion);

case opcion of

1:Agregar_definicion(Arch);

2:Modificar_definicion(Arch);

3:Buscar_definicion(Arch)

end

until opcion=4;

end;

var

Arch:ArchPalabra;

Begin

Inicio(Arch);

close(Arch)

end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda programa!

Publicado por Mariano (57 intervenciones) el 20/10/2007 03:23:40
Hola!
Ahora que leo de nuevo el codigo, otro error que tenes es usar la busqueda binaria.
La busqueda binaria sirve para buscar un registro a partir de un campo NUMERICO ORDENADO de un registro, lo que te perimte tomar el valor del medio, y segun como sea, con que mitad quedarte.
Sin embargo vos aplicas busqueda binaria a palabras , cosa que es imposible, xq no sabes si la palabra esta en la mitad de arriba o en la mitad de abajo, xq no tiene nada q ver con la direccion en la que este
La unica forma que tenes para ver si la palabra ya se encuentra o no, es recorrer el archivo secuencialmente.

Fiajte si eso lo soluciona! y cualquier cosa reveo el codigo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda programa!

Publicado por jaf (83 intervenciones) el 23/10/2007 03:56:51
Mejor que antes, ya no tira runtime error, pero cuando quiero agregar una definición me dice que la palabra ya existe en el diccionario,y cuando busco definicion me sale

Palabra:(caracteres ascii) diccionario
definición: la que agregue

Lo unico que me deja hacer es agregar 1 sola vez al archivo una palabra, despues cuando intento agregar una 2da definicion no me deja, me dice que la palabra ya existe. yo lo que hice es buscar en el archivo, y si la funcion busqueda secuencial(BusSec) da -1 entonces que la deje agregar, sino que diga que la palabra ya existe, no se cual es el problema relaemnte, me estoy volviendo lcoo con esto. Acá está el código:


Program Diccionario;

Type

Str=String;

RegPalabra=Record

Palabra,definicion:str;

end;

ArchPalabra=file of RegPalabra;


Function BusSec(var Arch:ArchPalabra;Palabra:str):longint;

var pos:longint;

RPalabra:RegPalabra;

Pri,ult,med:word;

Encontrado:boolean;

Begin

while not eof(Arch) and not encontrado do

begin

if Rpalabra.Palabra=Palabra then

begin

encontrado:=true;

BusSec:=Filepos(Arch)-1

end

end;

if not encontrado then

BusSec:=-1


end;

Procedure Abrir(var Arch:ArchPalabra);

Begin

Assign(Arch,'Diccionario.dat');

{$i-}

reset(Arch);

{$i-}

If ioresult<>0 then

rewrite(Arch)

else

reset(Arch)

end;

Procedure Agregar_Definicion(var Arch:ArchPalabra);

var RPalabra:RegPalabra;

palabra:str;

Begin

abrir(Arch);

writeln('Introduzca la palabra que desea agregar: ');

readln(upcase(palabra));

if (BusSec(Arch,palabra)<>-1) then

writeln('La palabra ya se encuentra agregada en el diccionario.')

else

begin

seek(Arch,FileSize(Arch));

writeln('Introduzca la definici¢n de dicha palabra: ');

readln(upcase(RPalabra.Definicion));

write(arch,RPalabra)

end;

close(Arch)

end;

Procedure Modificar_Definicion(var Arch:ArchPalabra);

var RPalabra:RegPalabra;

pos:longint;

Begin

abrir(Arch);

writeln('Introduzca la palabra que quiere modificar');

readln(upcase(RPalabra.Palabra));

pos:=BusSec(Arch,Rpalabra.Palabra);

if (pos<>-1) then

begin

seek(Arch,pos);

writeln('Introduzca la nueva definici¢n para esa palabra');

readln(Rpalabra.definicion);

write(Arch,Rpalabra)

end

else

writeln('Error: La palabra que intenta modificar no existe en el diccionario');

close(Arch)

end;


Procedure Buscar_Definicion(var Arch:ArchPalabra);

var RPalabra:RegPalabra;

Palabra:str;

pos:longint;

Begin

Abrir(Arch);

writeln('Introduzca la palabra que desea buscar');

readln(Palabra);

pos:=BusSec(Arch,Palabra);

seek(Arch,pos);

read(Arch,RPalabra);

writeln('Palabra: ',RPalabra.Palabra);

writeln('Definici¢n: ',RPalabra.Definicion);

close(Arch)

end;

Procedure Inicio(var Arch:ArchPalabra);

var opcion:byte;

Begin


writeln('Diccionario de la Real academia espa¤ola');

repeat

writeln('Indique con el n£mero correspondiente que tipo de operaci¢n desea realizar');

writeln('1-Agregar palabra');

writeln('2-Modificar la definici¢n de una palabra existente');

writeln('3-Buscar definici¢n');

writeln('4-Salir');

readln(opcion);

case opcion of

1:Agregar_definicion(Arch);

2:Modificar_definicion(Arch);

3:Buscar_definicion(Arch)

end

until opcion=4;

end;

var

Arch:ArchPalabra;

Begin

Inicio(Arch);

close(Arch)

end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda programa!

Publicado por Mariano (57 intervenciones) el 23/10/2007 04:51:20
Hola Mira el problema que tenes es que al principio del modulo de BusSec, tenes q hacer un seek(archivo, 0);
Con esto lo que haces, es llevar el puntero a la posicion inicial, entonces cada vez que invoque el modulo empieza desde el comienzo, porquie sino sigue desde Filepos(archivo), que es de donde quedo la anterior busqueda.

Cualquier cosa volveee a preguntar :) y avisaa si te sirvioo !!

un abrazooo!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda programa!

Publicado por jaf (83 intervenciones) el 23/10/2007 17:15:27
El problema persiste, cada vez qeu quiero agregar una palabra me dice "la palabra ya se encuentra agregada al diccionario, no se que carajjo pasa.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda programa!

Publicado por Mariano (57 intervenciones) el 23/10/2007 20:14:18
Hola, recien lo lei bien el modulo y encontre el que creo que es el error, vos en la busqueda secuencial, no lees el archivo!!
El modulo es asi:

Function BusSec(var Arch:ArchPalabra;Palabra:str):longint;

var pos:longint;
RPalabra:RegPalabra;
Encontrado:boolean;

Begin
seek(arch,0);
BusSec:=-1;
encontrado:=false;
while not eof(Arch) and not encontrado do begin
read (arch,rPalabra);
if Rpalabra.Palabra=Palabra then begin
encontrado:=true;
BusSec:=Filepos(Arch)-1
end {if}
end {while}
end; {fin de funcion}

Proba asi, y cualquier cosa avisameee

Un abrazoo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda programa!

Publicado por juan (83 intervenciones) el 24/10/2007 00:55:46
Si, un error menos por lo menos, pero a ver si podes captar mejor el gran problema que hay, cuando quiero agregar una palabra me dice que ya existe, agregue la palabra que agregue, no se que es lo que pasa, aparte cuando busco una definición me salen todos caracteres ascii, compilalo y trata de agregar palabras o buscarlas y vas a ver, un saludo y si encontras el error te agradecería terriblemente si me avisas cual es.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda programa!

Publicado por Mariano (1 intervención) el 24/10/2007 02:08:11
Hola, ya esta solucionado:

Program Diccionario;
uses
crt;
Type

Str=String;

RegPalabra=Record

Palabra,definicion:str;

end;

ArchPalabra=file of RegPalabra;

Function BusSec(var Arch:ArchPalabra;Palabra:str):longint;

var

RPalabra:RegPalabra;

Encontrado:boolean;

Begin
seek(arch,0);
encontrado:=false;
BusSec:=-1;
while not eof(Arch) and not encontrado do

begin
read(arch,rPalabra);
if Rpalabra.Palabra=Palabra then

begin

encontrado:=true;

BusSec:=Filepos(Arch)-1

end

end;
end;

Procedure Abrir(var Arch:ArchPalabra);

Begin

Assign(Arch,'Diccionario.dat');

{$i-}

reset(Arch);

{$i-}

If ioresult<>0 then

rewrite(Arch)

else

reset(Arch)

end;

Procedure Agregar_Definicion(var Arch:ArchPalabra);

var RPalabra:RegPalabra;

palabra:str;

Begin

abrir(Arch);

writeln('Introduzca la palabra que desea agregar: ');

readln(rPalabra.palabra);

if (BusSec(Arch,rPalabra.palabra)<>-1) then

writeln('La palabra ya se encuentra agregada en el diccionario.')

else

begin

seek(Arch,FileSize(Arch));

writeln('Introduzca la definici¢n de dicha palabra: ');

readln(RPalabra.Definicion);

write(arch,RPalabra)

end;

close(Arch)

end;

Procedure Modificar_Definicion(var Arch:ArchPalabra);

var RPalabra:RegPalabra;

pos:longint;

Begin

abrir(Arch);

writeln('Introduzca la palabra que quiere modificar');

readln(RPalabra.Palabra);

pos:=BusSec(Arch,Rpalabra.Palabra);

if (pos<>-1) then

begin

seek(Arch,pos);

writeln('Introduzca la nueva definici¢n para esa palabra');

readln(Rpalabra.definicion);

write(Arch,Rpalabra)

end

else

writeln('Error: La palabra que intenta modificar no existe en el diccionario');

close(Arch)

end;

Procedure Buscar_Definicion(var Arch:ArchPalabra);

var RPalabra:RegPalabra;

Palabra:str;

pos:longint;

Begin

Abrir(Arch);

writeln('Introduzca la palabra que desea buscar');

readln(Palabra);

pos:=BusSec(Arch,Palabra);

seek(Arch,pos);

read(Arch,RPalabra);

writeln('Palabra: ',RPalabra.Palabra);

writeln('Definici¢n: ',RPalabra.Definicion);

close(Arch)

end;

Procedure Inicio(var Arch:ArchPalabra);

var opcion:byte;

Begin

writeln('Diccionario de la Real academia espa¤ola');

repeat

writeln('Indique con el n£mero correspondiente que tipo de operaci¢n desea realizar');

writeln('1-Agregar palabra');

writeln('2-Modificar la definici¢n de una palabra existente');

writeln('3-Buscar definici¢n');

writeln('4-Salir');

readln(opcion);

case opcion of

1:Agregar_definicion(Arch);

2:Modificar_definicion(Arch);

3:Buscar_definicion(Arch)

end

until opcion=4;

end;

var

Arch:ArchPalabra;

Begin

clrscr;
Inicio(Arch);

close(Arch)

end.



EL PROBLEMA ERAN 2 COSAS:
- EL PRIMERO, QUE CUADNO AGREGABAS UNA PALABRA, no le asignabas al registro la palbra a agregar, usabas una variable palabra, pero nunk dps hacias una asignacion
rpalabra.palabra:=palabra;

-En otro parte pasabas la palabra palabra, pero no la asociabas rpalabra.palabra!!

Un abrazoo, y decime si te funciono finalmente
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda programa!

Publicado por jaf (83 intervenciones) el 24/10/2007 03:13:57
Te hago una pregunta, el upcase porque lo sacaste? generaba algún problema?. Yo lo puse para que no haya distinción entre mayúsculas y minúsculas. El primer error lo pude detectar en mi código, el segundo error que marcas no se a que te referic, me podrías mostrar las lineas de codigo en la cual: "En otro parte pasabas la palabra palabra, pero no la asociabas rpalabra.palabra!! ", con eso es lo qeu no se a que te referías. Bueno, es solo para aprender y no volver a cometer los mismos errores .......
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar