[ Foro de Pascal ]

como restringir para fechas que sean negativas....

30-May-2011 21:11
oscar gomez
8 Respuestas

Cordial saludo profesor Nacho Cabanes y Antonio, mil gracias como siempre por sus ayudas, gracias, muchas gracias.

Estoy realizando un programa para el calculo de la fecha siguiente a traves de archivos,todo me va bien, sin embargo quise que para cualquier valor negativo de dia , mes u año el programa termine y se muestren los resultados de las fechas que se han introducido como positivas. les envio el esquema o estructura del programa funcionando ok,(con la salvedad claro de lo que quiero) con el fin de que me ayuden en que parte del programa o de que forma puedo realizarlo por que he intentado y no me sale.

program dia_siguiente;
 uses crt;
 type
      tfecha=record
      …..
         end;
   var
      archivoE,archivoS:file of tfecha;
      fechaE,fechaS:tfecha;
     
  begin
   assign(archivoE,'archivoE.dat');
   rewrite(archivoE);

   repeat
    clrscr;
    writeln;writeln;writeln;writeln;
    write('digite el dia: ');
    readln(fechaE.dia);
    write('digite el mes: ');
    readln(fechaE.mes);
    write('digite el anno: ');
    readln(fechaE.anno);
    write(archivoE,fechaE);
    writeln;
    writeln;
    assign(archivoS,'archivoS.dat');
    rewrite(archivoS);
    reset(archivoE);
    while not eof(archivoE) do
      begin
      ...cálculo del dia siguiente
      ...
      write(archivoS,fechaS);
      end;
until(((fechaE.dia)or(fechaE.mes)or(fechaE.anno)) <=0);
   close(archivoE);
   close(archivoS);
  readkey;
end.

asi tal como esta el programa en ejecucion me sale porejemplo:

porejemplo:
fecha anterior -----------------> fecha siguiente
31/12/2000                         1/1/2001
20/3/2002                          21/3/2002
-12/4/1980                         -12/4/1980

como veis cuando digito el dia ,mes y año en el tercer caso el dia es negativo, el programa tal como deseo debe terminar,de pedirme mas fechas pero en los resultados me muestra dicha fecha negativa y yo solo quiero que salga, es decir lo que yo quiero que salga como resultados en tal caso es:

fecha anterior -----------------> fecha siguiente
31/12/2000                         1/1/2001
20/3/2002                          21/3/2002


pues con la fecha  -12/4/1980 solo es para que el programa termine y no me pida mas fechas y me muestre las fecha siguiente a las que se dijitaron  como positivas como  el resultado anterior  
fecha anterior -----------------> fecha siguiente
31/12/2000                         1/1/2001
20/3/2002                          21/3/2002  



yo intento colocar un if como el siguiente pero la verdad lo he colocado en varios sitios y ninguno me va:
   if((fechaE.dia) and (fechaE.mes) and (fechaE.anno))<0 then

si pueden ayudarme a como podria hacerlo para que me funcione se los agradeceria,muchisimo le he dado vueltas y llevo tiempo en ello sin solucionarlo.


30-May-2011 22:57
Antonio P.G.

Hola, Óscar.

Si te soy sincero, no he mirado todo lo que has escrito porque voy un poco con prisa. He visto un fallo claro, y es en la condición de parada.

Vamos a ver: tú intentas decir "cuando el día o el mes o el año sea menor o igual que cero, paro". Eso Pascal no lo entiende. A Pascal hay que hablarle de forma más sencilla. Te doy una pista: tienes que intentar decirle "cuando el día sea menor o igual a cero, o el mes sea menor o igual a cero, o el año sea menor o igual a cero, entonces paro". (Creo que no es muy chungo, ¿no?)

Otra cosa: no te olvides de cerrar un archivo (close()) cuando hayas escrito en el si quieres guardar. Puede que te funcione sin usar close, pero a lo mejor a sido "suerte".

No entiendo muy bien el conjunto de tu programa, o mejor dicho la estructura, pero espero que te funcione.

Por cierto, la condición que has puesto "(((fechaE.dia)or(fechaE.mes)or(fechaE.anno)) <=0)", traducida al castellano, sería algo como "cuando el día sea verdadero o el mes sea verdadero o el año sea verdadero y todo lo anterior sea menor o igual a cero, entonces pararé". No tiene mucho sentido, ¿verdad? Da un repaso si eso a los condicionales, y ¡ánimo!

¡Ciao!


31-May-2011 11:43
oscar gomez

Hola Antonio, gracias por tu ayuda y tus indicaciones.
He realizado los cambios que me has propuesto que tenia mal pero aun asi me sigue sin funcionar. lo nuevo que he cambiado segun lo que me recomendaste quedo asi:

program dia_siguiente;
 uses crt;
 type
     tfecha=record
      ...
     end;
   var
     archivoE,archivoS:file of tfecha;
     fechaE,fechaS:tfecha;
     
 begin
   assign(archivoE,'archivoE.dat');
   rewrite(archivoE);

   repeat
   clrscr;
   writeln;writeln;writeln;writeln;
   write('digite el dia: ');
   readln(fechaE.dia);
   write('digite el mes: ');
   readln(fechaE.mes);
   write('digite el anno: ');
   readln(fechaE.anno);
   write(archivoE,fechaE);
   writeln;
   writeln;
  if((fechaE.dia>0) and (fechaE.mes>0) and (fechaE.anno>0)) then
   begin
       assign(archivoS,'archivoS.dat');
       rewrite(archivoS);
       reset(archivoE);
        while not eof(archivoE) do
         begin
          ...cálculo del dia siguiente
          ...
          write(archivoS,fechaS);
         end;
    end;
 until(fechaE.dia<=0)or(fechaE.mes<=0)or(fechaE.anno<=0);
 close(archivoE);
 close(archivoS);
 readkey;
end.


con el if:
if((fechaE.dia>0) and (fechaE.mes>0) and (fechaE.anno>0)) then
intento que solo ejecute el proceso para fecha siguiente si las fechas de entrada( en su dia, mes,año) son positivas, pues las fechas con algun valor negativo en su dia o en su mes o en su año no me interesan para los resultados, tan solo para no seguir pidiendo mas fechas(terminar),pero tal y como te lo muestro en el codigo al ejecutarlo no me visualiza ahora ningun resultado, podrias seguir orientandome ,te lo agradezco muchisimo.


31-May-2011 16:29
Antonio P.G.

Hola, Óscar.

A ver, veo algunas cosas que no tienen mucho sentido en el código, por ello te pido que me expliques claramente, punto por punto, qué pretendes que haga tu programa, incluyendo en qué momentos se imputan datos, se devuelven resultados... Así creo que te podré ayudar mejor.

Además, no omitas partes con puntos suspensivos, ya que no se sabe si ahí está el fallo. También, copia y pega desde la pantalla negra al menos una ejecución completa del programa.

(Para copiar desde la pantalla negra, clicas con el botón derecho del ratón en la barra de la ventana, y en "editar" seleccionas "marcar". Marcas todo el texto, y a continuación en "editar" le das a "copiar". No es que presuponga que no sabías esto, pero lo digo por si acaso.)

Saludos.


01-Jun-2011 17:11
oscar gomez

Hola Antonio y profesor Nacho. gracias antetodo por su valiosa ayuda.

el programa que estoy realizando consiste en introducir varias fechas( en el formato dia,mes, año) hasta que alguno de estos valores sea negativo. como resultado lo que busco es que una vez se digite un valor para el formato fecha indicado negativo se debe parar de pedir mas fechas y mostrar el resultado de la fecha siguiente ,para las fechas que se han introducido positivas(para dia , mes año)
ejemplo:

digite dia: 31
digite mes: 12
digite año:2000

digite dia: 30
digite mes:9
digite año 1980

digite dia: -12    **
digite mes: 4      ** como veis hasta aqui se pediran mas fechas
digite año: 2002   ** pues uno de los valores es negativo

y el resultado que se deberia mostrar en este caso es:

   fecha anterior -------------------> fecha siguiente

    31/12/2000                            1/1/2001
    30/9/1980                             1/10/1980  


adjunto el programa en formato .doc y en el la captura en ejecucion de lo que se me esta visualizando con dicho codigo asi como me lo habia pedido Antonio.

me gustaria me ayudaran pues llevo bastante pensando como puedo hacer para que me funcione correctamente, el problema no esta en el calculo de la fecha siguiente pues éste esta correcto , sino en como o donde o de que forma y en que lugar del programa, debo hacer la restrincion para cuando un valor del formato fecha sea negativo, tambien quiza no lo sé puede ser en algun reset o write o close... por favor ayundenme a dar con la solucion a lo que he explicado que deseo con el programa.
mil gracias


01-Jun-2011 17:15
oscar gomez

aqui esta en formato .zip


02-Jun-2011 17:59
Antonio P.G.

Hola Óscar.

He estado mirando tu código (hay que decir que es un poquillo lioso).

Antes que nada, algunas notas sobre el mismo:
- El programa terminará cuando un día, mes o año no esté dentro de su dominio, es decir, si un usuario proporciona un valor de 32 o de -2, es probable que el programa termine. Te recomiendo que estos tres campos sean "integer" si les vas a dar números negativos.

- Puedes escribir "año" en vez de "anno". La restrinción de la "ñ" es solamente para identificadores (variables, constantes,...), no para cadenas.

- Te propongo el siguiente cambio: "tdias" por "TDIasEnMes".

Ahora, con respecto al programa en sí, te conviene (en mi opinión) llevar una estructura más ordenada y que siga más el concepto de "programación descendente". Esto último no significa escribir de arriba a abajo, sino escribir desde lo superficial a lo profundo.

Así pues, te propongo el siguiente guión para tu programa:

1. Lectura de Fechas. Utiliza un procedimiento para esto. Este procedimiento podría tener como parámetro el nombre del archivo o el archivo. Simplemente, dentro de este procedimiento vas leyendo las fechas y escribiéndolas en el archivo. Para dejar de leer fechas puedes emplear la condición de parada que corregiste. No te olvides de cerrar el archivo después de haber leído todas las fechas.

2. Impresión de Fechas. Éste sería el segundo procedimiento de tu programa. Puedes meterle como parámetro el archivo o su nombre, como con el anterior procedimiento. Este procedimiento se valdría a su vez de otros 3:
    2.1. Leer fecha. Lee una fecha del archivo. Un parámetro (por variable) es la fecha y el otro es el archivo o su nombre.
    2.2. Imprimir fecha. Muestra la fecha leída por el anterior procedimiento.
    2.3. Calcular siguiente. Su parámetro es la fecha, que la modifica.
    2.4. Imprimir fecha. El mismo que en el 2.2, pero ahora, la fecha ha sido modificada.

Resumiendo:
----------------------------------------------
program

(--- Bla bla bla (esto te lo dejo a ti) ---)
procedure LecturaFechas (var f : text);
 begin
 end;
procedure LeerFecha (var f : text; var fecha : TFecha);
 begin
 end;
procedure ImprimirFecha (fecha : Tfecha);
 begin
 end;
procedure CalcularSiguiente (var fecha : Tfecha);
 begin
 end;
procedure ImpresionFechas (var f : text);
 begin
   {--- Aquí habrá que hacer cositas... ---}
   LeerFecha (fecha);
   ImprimirFecha (fecha);
   CalcularFecha (fecha);
   ImprimirFecha (fecha);
 end;

var
 archivo : text;
begin
 {--- Asigna aquí el archivo y haz aquí los preparativos que tengas que hacer... ---}
 LecturaFechas (archivo);
 ImpresionFechas (archivo);
end.
-------------------------------------------

Por cierto, he puesto que archivo es de tipo "text", pero es "file of fecha", al igual que en las cabeceras en las que he escrito "text"....

De esta manera, tu programa quedará más estructurado y modulado, de forma que será más fácil encontrar errores y modificar instrucciones. Recuerda que puedes crear otras funciones, como alguna que te calcule el número de días que tiene un mes si le proporcionas el mes y el año.

Además, así se entenderá mucho mejor. (Sinceramente, tu programa es un poco caos).

Ve subiendo los procedimientos y funciones que vayas haciendo, y así las vamos viendo ;-), ¿ok?

¡Un saludo!


04-Jun-2011 16:21
Nacho Cabanes (+84)

Una cosa más, Óscar. Además de las impecables (como siempre) sugerencias de Antonio, quería comentarte otra cosa:

Lo amigable es que si el usuario introduce un día incorrecto, no se le pida el mes, porque lo va a tener que re-introducir posteriormente. Es más razonable volverle a pedir el día incorrecto antes de permitirle teclear datos nuevos.

La forma razonable de conseguir esto es con un repeat...until, así:

repeat
 write('digite el dia: ');
 readln(fechaE.dia);
until fechaE.dia > 0;

Lógicamente, necesitarás otro "repeat" para el mes y otro para el año.


09-Jun-2011 16:38
oscar gomez

Hola Antonio y profesor Nacho , gracias por sus orientaciones en este ejercicio, con ellas y algunos cambios que realice en el mismo, me funciona perfecto tal y como lo deseaba, mil gracias por siempre contar con sus valiosas aportaciones.






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