[ Foro de Pascal ]

duda en parametro en una estructura...

08-May-2012 11:34
oscar gomez
2 Respuestas

cordial saludo para todos.
queria pedir su ayuda en cuanto aun problema que tengo referente a lo siguiente:


tengo la siguiente definicion de estructura:

type
      tdias=28..31;
      tfecha=record
          dia:integer;
          mes:integer;
          anno:1900..3000;
         end;
   var
      archivoE:file of tfecha;
      fechaE:tfecha;
      dias_en_mes:tdias;

necesito hacer una funcion para saber si un año que se pasa como parametro es o no bisiesto, para en base a ello pueda definir los dias del mes de febrero 28 0 29 segun sea no bisiesto o sea bisiesto.



mi problema esta en como pasar el parametro para el año, yo intento lo siguiente:

function esBisiesto(fechaE.anno: integer): boolean;
    Begin
if((fechaE.anno mod 4 = 0) and (fechaE.anno mod 100 <>0)) or(fechaE.anno mod 400 = 0) then
         esBisiesto:= true
          else
          esBisiesto:= false;
          End;        

...

         case fechaE.mes of
           
             2:if esBisiesto(fechaE.anno) then
                 dias_en_mes:=29
                  else
                    dias_en_mes:=28;
             end;

como puedo pasar correctamente el parametro para el año.?
he intentado hacer tambien:

function esBisiesto(fanno: integer): boolean;
 Begin
  if((fechaE.anno mod 4 = 0) and (fechaE.anno mod 100 <>0)) or(fechaE.anno mod 400 = 0) then
     esBisiesto:= true
        else
         esBisiesto:= false;
   End;    


y no me da error, y me compila, pero no se si es correcto hacerlo, me gustaria saber su opinion si estoy errado o es ok , o alguna otra idea seria de gran ayuda.mil gracias.


08-May-2012 14:56
Nacho Cabanes (+83)

Esto está casi bien, pero sólo casi:


function esBisiesto(fanno: integer): boolean;
Begin
  if((fechaE.anno mod 4 = 0) 
          and (fechaE.anno mod 100 <>0)) 
          or(fechaE.anno mod 400 = 0) then
      esBisiesto:= true
  else
      esBisiesto:= false;
End;    



pero en los parámetros hablas de una variable "fanno" y dentro de la función hablas de otra distinta, que es un campo de un struct: "fechaE.anno". Si uniformizas eso, debería funcionar:


function esBisiesto(a: integer): boolean;
Begin
  if((a mod 4 = 0) 
          and (a mod 100 <>0)) 
          or (a mod 400 = 0) then
      esBisiesto:= true
  else
      esBisiesto:= false;
End;    



08-May-2012 15:18
oscar gomez

cordial saludo profesor Nacho cabanes y gracias por responderme.
efectivamente como tu dices cometi un error pero creeme fue mas de observacion al enviartelo que de haberlo hecho asi, solo que copie el primer fragmento y lo copie haciendo el cambio en el parametro y no me fije de haberlo modificado dentro de la funcion , pero que solo fue error de apreciacion mas no de concepto por que esa parte la tengo clara de saber que como parametro si utilizo un nombre de variable, dentro de la funcion  debo utilizar el mismo nombre, la verdad no me fije,,

sin embargo con tu respuesta se que entonces mi solucion era correcta, pues a pesar de que me funciona corractamente en el programa que utiliza esta funcion, no tenia la certeza de si lo que hacia estaba correcto, pero ahora se que si lo es, gracias a ti.

de igual manera aprovecho para comentarte lo referente a : el otro que has consultado de los valores cero...  ;-)

pues de igual manera me funciona ok al ejecutar el programa que utiliza el procedimiento pero alli insisto me queda la duda de si es correcto hacer el if ( especificamente con el and para las condiciones de salida del repeat -- until) que precede al until, es realmente mi duda o si hay otra forma mejor de hacerlo, mil gracias por tu ayuda y por tu tiempo, de igual manera por tu paciencia.






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