Ir ao conteúdo

Posts recomendados

Postado

Olá, bom dia !

 

Alguém que conhece de programação poderia me ajudar na resolução do exercício abaixo ?

 

Dada a estrutura:
struct dma {
int dia ;
int mes ;
int ano ;
} ;
Escreva uma função que receba dois structs do tipo dma, cada um representando uma data válida, e
devolva o número de dias que decorreram entre as duas datas.

 

Obrigada !

Postado

Junto com o pessoal do grupo desenvolvemos assim :

 

#include <stdio.h> 
#include <stdbool.h> 

struct dma { 
int dia; 
int mes; 
int ano; 
}; 

bool valida(struct dma data) { 
/* retorna true se data válida ou false se inválida */ 
if (data.mes < 1 || data.mes > 12) 
return false; 
else { 
if (data.mes == 2) { 
if ((data.ano % 4 == 0) && (data.ano % 100 != 0) || (data.ano % 400 == 0)) { 
if (data.dia < 1 || data.dia > 29) 
return false; 

else 
if (data.dia < 1 || data.dia > 28) 
return false; 

else { 
if (data.mes == 4 || data.mes == 6 || data.mes == 9 || data.mes == 11) { 
if (data.dia < 1 || data.dia > 30) 
return false; 

else 
if (data.dia < 1 || data.dia > 31) 
return false; 


return true; 


int dias_decorridos(struct dma data_ini, struct dma data_fim) { 
int dias_no_mes[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, tot_dias_ini, tot_dias_fim, i; 
tot_dias_ini = data_ini.ano * 365.2425; 
for (i=1; i<data_ini.mes; i++) 
tot_dias_ini += dias_no_mes
if (((data_ini.ano % 4 == 0) && (data_ini.ano % 100 != 0) || (data_ini.ano % 400 == 0)) && data_ini.mes > 2) 
tot_dias_ini++; 
tot_dias_ini += data_ini.dia; 

tot_dias_fim = data_fim.ano * 365.2425; 
for (i=1; i<data_fim.mes; i++) 
tot_dias_fim += dias_no_mes
if (((data_fim.ano % 4 == 0) && (data_fim.ano % 100 != 0) || (data_fim.ano % 400 == 0)) && data_fim.mes > 2) 
tot_dias_fim++; 
tot_dias_fim += data_fim.dia; 

return (tot_dias_fim - tot_dias_ini); 


Porém da erro ao executar.

Postado

Tem basicamente 2 erros no código

 

1) Precisa isolar o tratamento de ano bissexto no "if" (destaque em vermelho):

 

Na função "valida()":

 

if (      ( (data.ano % 4 == 0) && (data.ano % 100 != 0) )    ||    ( data.ano % 400 == 0 )    )

 

 

Na função "dias_decorridos()":

 

if (    (     ( (data_ini.ano % 4 == 0) && (data_ini.ano % 100 != 0) )    ||     ( data_ini.ano % 400 == 0 ))     &&    data_ini.mes > 2    )

 

 

2) Na função "dias_decorridos()" troque para "float" o retorno da função e também defina para "float" as variáveis "dias_no_mes", "tot_dias_ini" e "tot_dias_fim".

 

 

Testei as rotinas e funcionou corretamente depois das mudanças que apresentei acima.

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!