Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
fo_11

Verificar se data é valida

Recommended Posts

fo_11

não existe uma maneira mais simples de verificar se uma data é válida sem ser assim?

OBS:aqui ainda não considero aqueles pormenores de fevereiro variar entre 28 e 29 nem se quer considerei ter 28 dias que é o o mais frequente.

int invalidas(int dia,int mes)
{
    if(mes<1 || 12<mes ||dia<1 )
     return 1;
    else
     {if(mes<=7)
       {if(mes%2!=0)
         {if(31<dia)
           return 1;
          else
            return 0;
         }
        else
         {if(30<dia)
           return 1;
          else
           return 0;
          }
       }
       else
        {if(mes%2!=0)
          {if(30<dia)
            return 1;
           else
            return 0;
          }
         else
          {if(31<dia)
            return 1;
           else
            return 0;
          }
        }
     }
}

Share this post


Link to post
Share on other sites
Localhost

É simples. Crias um array.

Um array por exemplo assim: 1,2,3,4,5,6,7,8,9,10,11,12. Este é o array dos meses. Pedes o mês. E verificas se é maior do que o último elemento do array ou menor do que o primeiro elemento.

Depois tens outro array com os dias em que cada posição corresponde a um mês, aproveitas o mês introduzido e vais à posição mês - 1 do array dos dias e verificas se o dia introduzido é diferente do valor que está lá.

int mes[12] = {1,2,3,4,5,6,7,8,9,10,11,12};
int dias[12] = {31,28,31,30,31,30,31,31,30,31,30,31};

scanf("%i", &M);
if(M > mes[11] || M < mes[0])
  printf("Bah\n");

scanf("%i", &D);
if(D > mes[M - 1] || D < 1)
  printf("Bah\n");

Algo como isto. Nem precisavas do array com os meses mas mais tarde pode ser útil  :P


here since 2009

Share this post


Link to post
Share on other sites
Localhost

Às vezes, quando estamos a iniciar nisto pensámos em soluções muito complicadas para um problema que é simples. Isso é natural acontecer  :P

EDIT: Na verificação dos meses não podes só verificar se é diferente mas sim se é maior do que o valor que está lá ou menor do que 1, já modifico.


here since 2009

Share this post


Link to post
Share on other sites
fo_11

Aqui está a porção de código correspondente à dos if's : :smoke:

OBS: Aqui admito o mes de fevereiro com 28 dias.

int invalidas(int dia,int mes)
{
    
    int dias[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    int i;
     if(0<mes&&mes<13)
      {if(dia==dias[mes-1])
        return 0;
       else
        return 1;
      }
     else
       return 1;
}        

EDIT:Agora penso que está correcto

Share this post


Link to post
Share on other sites
Localhost

Penso que isso está errado.

Tu não precisas de percorrer os arrays. Para verificação dos meses o que fizeste no programa que mostraste antes desse estava perfeito. Depois, para a verificação dos dias faz o que te disse. Vais à mes - 1 posição do array dias e verificas se o dia passado para a função é maior do que o dia que está nessa posição ou se é menor que 1.


here since 2009

Share this post


Link to post
Share on other sites
Localhost

Acho que continua mal o teu edit.

Vou tentar exemplificar melhor:

int invalid(int dia, int mes) {
  int dias[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
  if(mes > 12 || mes < 1) {
    return 0; // 0 se for inválido
  }
  if(dia > dias[mes - 1] || dia < 1) {
    return 0;
  }
  return 1;
}

Acho que é só isto.

EDIT: Não precisas de else's, olha bem para o meu exemplo.


here since 2009

Share this post


Link to post
Share on other sites
TheDark

Mas que raio aconteceu aqui...?

EDIT: Isso de apagar posts e deixar os outros a falar sozinhos é mau...


Desaparecido.

Share this post


Link to post
Share on other sites
Localhost

Se te estavas a referir a mim eu não apaguei post nenhum. Se te estavas a referir a ele, acho que não apagou, acho que editou.


here since 2009

Share this post


Link to post
Share on other sites
fo_11

Não, eu apaguei um post porque tinha feito um edit mas péssimo e por iss decidi apagar.

Peço desculpa se não devia ter feito isso.

O post que foi eliminado foi este Enviada: 02 de Abril de 2010, 11:41.

Share this post


Link to post
Share on other sites
TheDark

Sim, my mistake não ter especificado. Era com o fo_11, e entretanto recuperei o post.

A razão é unicamente porque houveram posts do Localhost ficaram fora de contexto.


Desaparecido.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.