[ Foro de Pascal ]

finalizar archivo con fechas

22-Mar-2012 11:59
oscar gomez
3 Respuestas

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.


22-Mar-2012 20:57
Nacho Cabanes (+83)

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);      


22-Mar-2012 22:00
Luis Torres (+18)

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.


23-Mar-2012 10:44
oscar gomez

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