[ Foro de Pascal ]
Cordial saludo profesor Nacho y compañeros.
profesor es que estoy realizando un pequeño programa con archivos y operaciones con fechas, pero tengo el problema que deseo parar los datos de ingreso al archivo cuando se digite una fecha incorrecta, pero no se en que este fallando y como puedo solucionarlo:
tengo lo siguiente:
program operaciones_fechas;
uses crt;
type
tdias=28..31;
tfecha=record
dia:1..31;
mes:1..12;
anno:1900..2012;
end;
var
archivo:file of tfecha;
fecha:tfecha;
terminar:boolean;
begin
terminar:=false;
assign(archivo,'archivo.dat'); { creo y
rewrite(archivo); abro el archivo}
repeat
clrscr;
writeln;writeln;writeln;writeln;
write('digite el dia: ');
readln(fecha.dia);
write('digite el mes: ');
readln(fecha.mes);
write('digite el anno: ');
readln(fecha.anno);
write(archivo,fecha);
until (fecha.dia <=0) or (fecha.dia >31) or (fecha.mes<=0)or(fecha.mes>12) or (fecha.anno <= 0);
reset(archivo); {abro el archivo para las operaciones}
while not eof(archivo) do
begin
read(archivo,fecha);
...operaciones fechas
end;
close(archivo);
readkey;
end.
tambien he intentado poner el until al final osea:
program operaciones_fechas;
uses crt;
type
tdias=28..31;
tfecha=record
dia:1..31;
mes:1..12;
anno:1900..2012;
end;
var
archivo:file of tfecha;
fecha:tfecha;
terminar:boolean;
begin
terminar:=false;
assign(archivo,'archivo.dat'); { creo y
rewrite(archivo); abro el archivo}
repeat
clrscr;
writeln;writeln;writeln;writeln;
write('digite el dia: ');
readln(fecha.dia);
write('digite el mes: ');
readln(fecha.mes);
write('digite el anno: ');
readln(fecha.anno);
write(archivo,fecha);
reset(archivo); {abro el archivo para las operaciones}
while not eof(archivo) do
begin
read(archivo,fecha);
...operaciones fechas
end;
until (fecha.dia <=0) or (fecha.dia >31) or (fecha.mes<=0)or(fecha.mes>12) or (fecha.anno <= 0);
close(archivo);
readkey;
end.
por favor ayudame u orientame a como podria hacer para que se me dejen de pedir datos cuando algun valor de fecha sea incorrecto y que en ese momento se hayan almacenado en el archivo solo los correctos,porejemplo
si digito:
ingrese dia: 12 {fecha valida}
ingrese mes:4
ingrese:2000
ingrese dia :30 {fecha valida
ingrese mes : 12
ingrese año: 2010
ingrese dia:-1 {quiero que el programa porejemplo para este caso que es un valor de dia incorrecto sin que me pida el mes y año me deje de pedir datos y se haya almacenado en el archivo los datos validos hasta ese momento es decir el archivo tendria en este caso las fechas:
12/04/2000
30/12/2010
espero tu ayuda genial como siempre y de ante mano mis inmensos agradecimientos por permitirnos aprender y corregir nuestros vacios.gracias.
En un vistazo rápido:
- Haces un "rewrite" para crear el fichero, y luego haces un "reset" para leer... pero no has cerrado entre medias.
- Guardas el dato antes de validarlo. Debería ser algo como
if esFechaValida( fecha ) then
write(archivo,fecha);
until not esFechaValida( fecha );
donde ese "esFechaValida" sería una función que devolvería "true" o "false" según se cumpla (o no) la condición que ya tenías preparada:
(fecha.dia <=0) or (fecha.dia >31) or (fecha.mes<=0)or(fecha.mes>12) or (fecha.anno <= 0);
En esta parte estás metiendo la operación de abrir el archivo entre los comentarios:
terminar:=false;
assign(archivo,'archivo.dat'); { creo y
rewrite(archivo); abro el archivo}
repeat
Y, por ende, no lo leerá.
Aquí tengo una solución, por favor revísala bien. No tuve mucho tiempo de revisarla a plenitud. La última parte del programa lee el archivo y lo muestra:
program operaciones_fechas;
uses crt;
type
tdias=28..31;
tfecha=record
dia:1..31;
mes:1..12;
anno:1900..2012;
end;
var
archivo:file of tfecha;
fecha:tfecha;
terminar:boolean;
begin
terminar:=false;
assign(archivo,'archivo.dat'); { creo y }
rewrite(archivo); { abro el archivo}
repeat
clrscr;
writeln;writeln;writeln;writeln;
write('digite el dia: ');
readln(fecha.dia);
write('digite el mes: ');
readln(fecha.mes);
write('digite el anno: ');
readln(fecha.anno);
if ((fecha.dia <= 31) and (fecha.dia >= 1) and (fecha.mes <= 12) and (fecha.mes >= 1) and (fecha.anno >= 1900)
and (fecha.anno <= 2012)) then
write(archivo,fecha)
else
begin
write('Fecha incorrecta. La entrada de fechas finalizara (PRESIONE ENTER)');
readln;
end;
until ((fecha.dia > 31) or (fecha.dia < 1) or (fecha.mes > 12) or (fecha.mes < 1) or (fecha.anno < 1900)
or (fecha.anno > 2012));
close(archivo); {Se debe cerrar el archivo antes de volverlo a abrir para otra operacion}
reset(archivo); {abro el archivo para las operaciones}
while not eof(archivo) do
begin
read(archivo,fecha);
writeln(fecha.dia,'/',fecha.mes,'/',fecha.anno);
end;
close(archivo);
readkey;
end.
Saludos.
Hola luis, mil gracias, era justo lo que necesitaba,asi a traves de tu codigo puedo ver muchisimo mejor,en donde estan mis errores mil gracias.
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)