Pascal/Turbo Pascal - ayuda!

 
Vista:

ayuda!

Publicado por usuaria (27 intervenciones) el 25/01/2007 20:57:23
Hola, tengo dos consultas del siguiente codigo a las cuales no logro encontrar explicacion.

Program Liquidacion;
Uses
crt;
Type
tregistro=Record
codigo:integer;
nomyap:string[10];
dni:longint;
sueldo_basico:real;
reten:real;
End;

tArchivo=file of tregistro;

Var
empleados:tArchivo;

Procedure Carga (Var Arch:tArchivo);
Var
opcion:char;
reg:tregistro;

Begin
opcion:='s';
While (opcion='s') do
Begin
Writeln ('Codigo');
Read(reg.codigo);
Writeln ('Nombre'); {?????????????????}
Read(reg.nomyap);
Writeln ('DNI');
Read(reg.dni);
Writeln ('SueldoBasico');
Read(reg.sueldo_basico);
Writeln ('Retenciones');
Read(reg.reten);
Write (Arch,reg);
Writeln ('¨Ingresar Otro? s/n');
Readln (opcion);
end;
End;

Procedure Liquida (Var Arch:tArchivo);
Var
reg:tregistro;
Begin

Reset(empleados);

While not eof(empleados) do
Begin
Read(empleados,reg);
Writeln ('Nombre Apellido:',reg.nomyap);
Writeln ('DNI',reg.dni);
Writeln ('SueldoBasico',reg.sueldo_basico);
Writeln ('Retenciones',reg.reten);
Writeln ('Sueldo Neto',reg.sueldo_basico-reg.reten);
End;

End;

{PROGRAMA PRINCIPAL}
Begin
ClrScr;
Assign (Empleados,'EMPLEADOS.DAT');
Rewrite (empleados);
Carga(empleados);
Liquida(empleados);
Close(empleados);
End.

1)PUEDO ESCIRBIR EL CODIGO, DNI, SUELDOS, RETENCIONES,PERO EL NOMBRE NO ME LO DEJA ESCRIBIR ME SALTA DIRECTO A DNI QUERIA SABER PORQ PASA ESO????? (en el procedimiento carga donde estan los signos es el problema)

2)LA CARGA SOLO ME LA DEJA HACER CON WHILE CON REPEAT(abajo escribi como la hago con repeat) NO ME LA TOMA:
Begin
Repeat
Writeln ('Codigo');
Read(reg.codigo);
Writeln ('Nombre');
Read(reg.nomyap);
Writeln ('DNI');
Read(reg.dni);
Writeln ('SueldoBasico');
Read(reg.sueldo_basico);
Writeln ('Retenciones');
Read(reg.reten);
Write (Arch,reg);
Writeln ('¨Ingresar Otro? s/n');
Readln (opcion);
Until (opcion='n');
End;

desçde ya muchas gracias!!!" :)
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!

Publicado por M@rceloL (7 intervenciones) el 25/01/2007 21:57:38
Yo le apostaría al Read, te recomendaría que uses ReadLn en vez de Read. A veces pasa con el read, que salta las cosas. No me acuerdo bien por qué pasaba pero creo que era porque... bueno, no te voy a mentir, la verdad es que no me acuerdo. Pero yo cambiaría los Read por ReadLn.

Saludos.
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

GRACIAS

Publicado por usuaria (27 intervenciones) el 25/01/2007 22:30:05
GRACIAS!! ERA ESO :)
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!

Publicado por Carlos Guimaraenz (265 intervenciones) el 26/01/2007 02:45:54
Hola Usuaria, M@rceloL! Les transcribo una respuesta de Diego Romero acerca del problema con el Read:

Para comenzar diré que la tecla ENTER genera un caracter no imprimible, el #13, el cual es válido para ser contenido en un string, pero no lo es para ser contenido en un integer. El #13 también le indica a Read() cuándo terminar con el ingreso de datos. Esto no causa problemas con variables string ya que el caracter #13 va a parar a la variable aunque no se modifique su tamaño.
Me explico mejor, supongamos que en "nomb" ingreso la cadena "Diego", usando Read(), el contenido de "nomb" sería "Diego#13" ("Diego" más el caracter #13) pero el largo de la cadena se mantiene en el correcto es decir 5 ya que el #13 le indica a Read() que allí terminó el ingreso.
Sin embargo con los integers el caracter #13 no es válido y no va a parar a la variable, Read() termina su lectura con el caracter #13 pero NO VACÍA el buffer de teclado, entonces en el próximo Read() el #13 aún está allí y ese nuevo Read() lo toma, como ese caracter indica el final del ingreso pues simplemente hace eso, termina el ingreso, por eso es que "se salta" el tercer Read() en tu programa.
Este efecto no sucede con ReadLn() siempre captura el #13 que genera la tecla ENTER.

Hasta pronto amigos!
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