5)Fazer uma função que recebe um dia,um mês e um ano como parâmetros e retor- na o número de dias desde o início daquele ano.Para o dia 10 de janeiro de qual- quer ano,a função deve retornar 1.Para o dia 31 de dezembro,ela deve retornar 365 ou 366,dependendo de o ano ser ou não bissexto.Um ano é bissexto quando é múltiplo de 400 ou também quando é múltiplo de 4 e não múltiplo de 100 .
Passo 1
O problema pede uma função que, dado um dia, um mês e um ano, devolva o “número do dia” dentro daquele ano (o dia 1 de janeiro corresponde ao dia 1, o dia 2 de janeiro ao dia 2, e assim por diante). Vamos precisar de dois ingredientes principais:
- Um teste para saber se o ano é bissexto.
- A soma dos dias de todos os meses anteriores ao mês dado, mais o dia atual.
Passo 2
Para definir se um ano é bissexto, aplicamos a regra:
– É bissexto se ,
– ou se e
.
Em notação matemática:
– É bissexto se
– ou se
Em notação matemática:
Passo 3
Vamos montar um vetor com o número de dias em cada mês, assumindo fevereiro com 28 dias inicialmente, e ajustar para 29 se o ano for bissexto. Em pseudocódigo:
int diasMes[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (bissexto) {
diasMes[1] \(=29\); // fevereiro passa a ter 29 dias
}
Passo 4
Somamos os dias de todos os meses que vieram antes do mês informado. Sejam
o mês de 1 a 12 e
o acumulador de dias:
int soma \(=0\);
for (int i \(=0\); i < mes-1; i\(++\)) {
soma \(+=\) diasMes[i];
}
Aqui o laço vai de
(janeiro) até
(mês anterior ao informado).
Passo 5
Por fim, acrescentamos o dia do mês corrente:
soma \(+=\) dia;
A variável de janeiro.
soma
agora contém exatamente o número do dia dentro do ano, contando a partir de
Resposta
Um possível código em C para essa função é:
int diaDoAno(int dia, int mes, int ano) {
int diasMes[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int bissexto = (ano%\(400==0\)) || (ano%\(4==0\) && ano%100 !\(=0\));
if (bissexto) {
diasMes[1] \(=29\);
}
int soma \(=0\);
for (int i \(=0\); i < mes-1; i\(++\)) {
soma \(+=\) diasMes[i];
}
return soma + dia;
}