Pascal/Turbo Pascal - Ayuda con modificación

 
Vista:

Ayuda con modificación

Publicado por juan (83 intervenciones) el 28/08/2007 01:24:07
Que tal Diego "Jesús" Romero, como va, bueno, la duda que tengo es esta. El ejercicio consiste
en abrir un archivo "Socios" que esta ordenado ascendentemente por numero de socio, y hay que actualizar el numero de telefono, proveyendo al programa únicamente con el número de socio y el nuevo número de teléfono a actualizar. Con este código no solo que no actualizó el número de teléfono del número de socio, sino que ademas me borró todos los datos del registro que sigue(ej actualizo el socio 01, y el número no se modifica, y además, se borra toda la información del socio 02), esto me da a pensar que estoy acutalizando el registro N+1 en vez del
N. Cuando quiero actualizar un campo, solo tengo que hacer una asignación al campo que quiero o tengo que reingresar todos los datos en su campo correspondiente para no perderlos??, si ves el error te agradecería que me digas, te agradezco de nuevo, un saludo.

Program ej7S3;

Type

Str12=string[12];

Str30=string[30];

Fech=record

dd,mm:byte;

aaaa:word;

end;

Rsocio=Record

Nombre:str30;

Nsoc:Integer;

Cat:char;

Fecha:Fech;

NTel:str12;

end;

ArchivoSocios=file of Rsocio;

Procedure Abrir(var Archsoc:ArchivoSocios);

Begin

assign(ArchSoc,'Socios.Dat');

reset(ArchSoc)

end;

Function Menu:byte;

var eleccion:byte;

begin

writeln('Ingrese 0 para salir o 1 para ingresar un n£mero de socio');

readln(eleccion);

Menu:=Eleccion

end;


Procedure ActualizarNum(var ArchSoc:ArchivoSocios;Nsoc:integer;NumNuev:str12);

var Rsoc:Rsocio;

Encontrado:boolean;

Begin

seek(archsoc,0);

Encontrado:=False;

while (not Encontrado) and (not eof(Archsoc)) do

begin

read(ArchSoc,Rsoc);

if Rsoc.Nsoc=Nsoc

then

begin

Encontrado:=True;


Rsoc.Ntel:=NumNuev;

write(ArchSoc,Rsoc)

end;

end;

if not Encontrado then

writeln('No se ha encontrado informaci¢n bajo ese n£mero de socio.');

end;

var Asoc:ArchivoSocios;

NumeroSocio:integer;

Opc:byte;

NuevoNum:Str12;

Begin

Abrir(Asoc);

opc:=menu;

while opc=1 do

begin

writeln('Ingrese n£mero de socio');

readln(NumeroSocio);

writeln('Ingrese el nuevo n£mero de tel‚fono del socio');

readln(NuevoNum);

ActualizarNum(Asoc,NumeroSocio,NuevoNum);

Opc:=Menu

end;

close(ASoc);

readln

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 con modificación

Publicado por Diego Romero (996 intervenciones) el 28/08/2007 02:35:49
El problema es este: cada vez que haces un read() el puntero del archivo se mueve al siguiente registro de modo tal que la próxima operación sobre el archivo afectará al registro siguiente.

En el procedimiento ActualizarNum estás leyendo hasta encontrar el registro buscado y una vez encontrado haces un write sin más... sobre el registro siguiente al encontrado. Tienes que retroceder el puntero un registro. Esto lo haces con Seek(archsoc,FilePos(archsoc)-1);
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 con modificación

Publicado por juan (83 intervenciones) el 28/08/2007 10:09:45
claro, pero digo, para actualizar el registro actualizo solo el campo que quiero o tengo que reingresar TODOS los datos nuevamente para no perderlos? porque se puede escribir un solo campo o el pascal graba todo el registro de una?
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 con modificación

Publicado por Diego Romero (996 intervenciones) el 28/08/2007 19:31:50
Como lo haces está bien.

Para verificar que todo funciona como debería es muy útil usar watch y F7 ;).
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 con modificación

Publicado por juan (83 intervenciones) el 29/08/2007 01:29:35
como es eso de watch+f7????ajajajja yo y mis preguntas, ya te debo tener harto, pero bue, algun d{ia podré ser yo el que conteste preg
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 con modificación

Publicado por Diego Romero (996 intervenciones) el 29/08/2007 03:59:57
El "watch" es una característica del depurador (debugger) del IDE de Turbo Pascal por la cual puedes ver qué valores toman las variables a medida que se ejecuta el programa.

Ve a Debug->Add watch... (o presiona CRTL+F7) y en el cuadro que te aparece escribe el nombre de una variable (también puede ser el nombre de un array o registro completo).

Luego ejecuta el programa con F8 o F7.

La diferencia con F8 es que trata las funciones y procedimientos como si fueran una sentencia atómica, es decir "no entran dentro de la función o procedimiento", mientras que con F7 sí lo hace. A medida que ejecutas el programa sentencia a sentencia puedes ver qué valores van tomando las variables que anotaste en "watch" en una ventana aparte.
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