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

Gravecard

Saber se é maior de idade

18 mensagens neste tópico

Tenho uma função que me lê a data de nascimento de uma pessoa:

t_data ler_data(t_data *d)
{
   printf("\nIntroduza a data de nascimento:\n");
   d->dia = lerInteiro("\nDia: ", 1, 31);
   d->mes = lerInteiro("Mes: ", 1, 12);
   d->ano = lerInteiro("Ano: ", 1900, 2020);
}

Queria descobrir uma forma de ao acabar de escrever a data saber se a pessoa é maior de idade ou não. Estive a pesquisar sobre a biblioteca time.h para ir buscar o ano actual, mas mesmo assim não consigo fazer a verificação.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Algo do género ano_actual - ano tinha que ser maior ou igual a 18...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens que ver também se o dia de aniversário já passou ou não. Se ainda não passou, tens que retirar uma unidade à subtracção do ano actual pelo ano de nascimento para obter a idade.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Agora é que isto deu o nó lol...tinha um problema e agora arranjei 2.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Resolve um de cada vez :D

Que problemas encontraste na maneira como fizeste as contas?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu penso que o que está errado é a forma como eu estou a escrever código que não está a verificar correctamente...pois nunca usei funções do time.h antes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens alguma funções e tipos de dados fundamentais que tens que usar.

Depois de incluir a library time.h tens que declarar uma variável do tipo time_t. Em seguida aplicas a função time ao apontador para essa variável. Dessa forma ficas com o tempo actual guardado na variável que declaraste:

time_t agora;
time(&agora);

A partir desta variável do tipo time_t queres saber o ano, o mês e o dia em que estamos, certo?

Isso é muito simples porque existe uma função localtime() que recebe um apontador para uma variável do tipo time_t e devolve uma estrutura com minutos, segundos, dia do mês, mês, ano, etc. tudo em inteiros.

A estrutura também está definida na library time.h e é do tipo "struct tm"

struct tm *tmp = localtime(&agora);

Neste momento estás com toda a informação que precisas guardada nesta estrutura, podes aceder aos membros da estrutura fazendo tmp->membro.

Este link dá-te informação sobre os vários membros:

http://www.cplusplus.com/reference/clibrary/ctime/tm.html

Agora só precisas de pedir ao utilizador a data de nascimento e fazer os cálculos com base no tempo actual para determinar se é ou não maior de idade.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Muito obrigado....olhando para isso, fazer algo como isto:

((tmp->tm_year)-(1900 - d->ano)=<18)

É possível? Ou não se pode comparar desta forma?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
É possível? Ou não se pode comparar desta forma?

Acho que não :)

((tmp->tm_year)-(1900 - d->ano)=<18) /* suponhamos que d->ano era 1942 ... */

((108)-(1900 - 1942)=<18)

(108-(-42)=<18)

(108+42=<18)

(150=<18)

Além disso, para comparar se um valor é igual ou inferior a outro, o "token" a usar é <=

Acho que queres isto

if (d->ano + 18 <= (tmp->tm_year + 1900)) /* maior de idade */;

d->ano + 18 <= (tmp->tm_year + 1900) /* d->ano == 1942 */

1942 + 18 <= (108 + 1900)

1960 <= 2008 /* YES */

d->ano + 18 <= (tmp->tm_year + 1900) /* d->ano == 1992 */

1992 + 18 <= (108 + 1900)

2010 <= 2008 /* nao */

Mas ainda tens que ter em atenção o mês e o dia!

Outra forma de saberes se já passaram 18 anos desde uma data qualquer é fazeres o struct tm dessa data com mais 18 anos e comparar o time_t desse valor com o time_t de hoje.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu fiz isto assim, só para testar mesmo:

t_data ler_data(t_data *d)
{
int a;
       printf("\nIntroduza a data de nascimento:\n");
       d->dia = lerInteiro("\nDia: ", 1, 31);
       d->mes = lerInteiro("Mes: ", 1, 12);
       d->ano = lerInteiro("Ano: ", 1900, 2020);
       a = maior_idade(d);
       if (a==1)
          printf("certo");
       else
           printf("errado");
}

int maior_idade (t_data *d)
{
time_t agora;
struct tm *tmp = localtime(&agora);
if ((d->ano + 18) <= (tmp->tm_year + 1900))
     return 1;
else
     return 0;
}

Mas mesmo assim, não está a funcionar devidamente...o que está a falhar?

Está mesmo difícil isto  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Faltou-te o time(&agora) na função maior_idade()

int maior_idade (t_data *d)
{
time_t agora;
struct tm *tmp;

time(&agora);
tmp = localtime(&agora);
if ((d->ano + 18) <= (tmp->tm_year + 1900))
     return 1;
else
     return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Funciona :) agora vou tentar verificar com o mês e o dia. Muito obrigado desde já.

EDIT:

Vejam-me só isto agora está logicamente correcto:

int maior_idade (t_data *d)
{
time_t agora;
time(&agora);
struct tm *tmp = localtime(&agora);
if (((d->ano + 18) <= (tmp->tm_year + 1900))&&(d->mes <= (tmp->tm_mon +1))&&(d->dia <= tmp->tm_mday))
     return 1;
else
     return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tenho uma questão...

Usaram uma struct.. Mas uma estrutura não se mete antes dos protótipos?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A definição da struct tm está a cargo do <time.h>.

Suponho que puseste #include <time.h> no princípio do teu código.

Portanto a struct tm está definida antes de qualquer protótipo utilizado por ti.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora