Fazer um programa que, dados os valores de M e A , produz o calendário do mês M do ano A. Por exemplo:
JUNHO/2019
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
0 programa deverá incluir uma função int anoBissexto(int A) que retorna 1 se A é ano bissexto; senão, retorna 0 .
Um ano é bissexto (tem 29 dias em fevereiro) se:
a) for divisível por 100 e divisível por 400; ou
b) não for divisível por 100, mas for divisível por 4.
O programa deverá incluir também uma função int diaDaSemana(int A) que retorna o valor
domingo,
segunda-feira,…,
sábado) que corresponde ao dia da semana referente à
janeiro do ano A. Algoritmo para calcular d:
JUNHO/2019 | ||||||
|
|
|
|
|
|
|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 |
a) for divisível por 100 e divisível por 400; ou
b) não for divisível por 100, mas for divisível por 4.
Passo 1
O enunciado pede um programa em C que, dados um mês M e um ano A, imprima o calendário desse mês no ano A. O conteúdo envolve: determinar se o ano é bissexto, calcular o dia da semana de 01/01/A, obter o dia da semana do primeiro dia do mês M e, por fim, montar o calendário em formato de grade.
Passo 2
Criar a função int anoBissexto(int A) que retorna 1 se A for ano bissexto ou 0 caso contrário. A lógica é: divisível por 100 e por 400; ou não divisível por 100 e divisível por 4.
Passo 3
Criar a função int diaDaSemana(int A) baseada no algoritmo do enunciado. Primeiro definimos:
e então
Como o C faz divisão inteira, não precisamos usar \lfloor\cdot\rfloor.
Passo 4
No main, criar um vetor com o número de dias de cada mês: int diasMes[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; ajustar fevereiro para 29 se anoBissexto(A)==1.
Passo 5
Calcular o dia da semana do primeiro dia do mês M: chamar int d0 = diaDaSemana(A) que dá o dia de 01/jan; somar os dias de janeiro até M-1, fazer somaTotal % 7 e obter o deslocamento. Ou seja:
int desloc = d0 - 1; // para zero-based
for(int i=0; i< M-1; i++) desloc = (desloc + diasMes[i]) % 7;
int primeiro = desloc + 1; // volta a 1…7
int desloc = d0 - 1; // para zero-based
for(int i=0; i< M-1; i++) desloc = (desloc + diasMes[i]) % 7;
int primeiro = desloc + 1; // volta a 1…7
Passo 6
Imprimir o cabeçalho com nome do mês e ano, depois a linha de dias da semana “D S T Q Q S S”. Em seguida imprimir espaços em branco (ou tabs) até chegar em primeiro-1 colunas, e então numerar de 1 até diasMes[M-1], quebrando linha a cada 7 colunas.
Passo 7
Encerrar o programa. O resultado é um calendário alinhado em 7 colunas, iniciando no dia de semana correto e mostrando todos os dias do mês.
Resposta
#include <stdio.h>
int anoBissexto(int A) {
if ((A % 100 == 0 && A % 400 == 0) || (A % 100 != 0 && A % 4 == 0))
return 1;
else
return 0;
}
if ((A % 100 == 0 && A % 400 == 0) || (A % 100 != 0 && A % 4 == 0))
return 1;
else
return 0;
}
int diaDaSemana(int A) {
int B = A - 1973;
int C = A - 1901;
int D = A - 1601;
return (1 + B + B/4 - C/100 + D/400 - (A-1)/4000) % 7 + 1;
}
int B = A - 1973;
int C = A - 1901;
int D = A - 1601;
return (1 + B + B/4 - C/100 + D/400 - (A-1)/4000) % 7 + 1;
}
int main() {
int M, A;
scanf("%d %d", &M, &A);
const char *meses[] = {“JANEIRO”,“FEVEREIRO”,“MARCO”,“ABRIL”,“MAIO”,“JUNHO”,
“JULHO”,“AGOSTO”,“SETEMBRO”,“OUTUBRO”,“NOVEMBRO”,“DEZEMBRO”};
int diasMes[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
if (anoBissexto(A)) diasMes[1] = 29;
int d0 = diaDaSemana(A); // dia da semana de 01/jan (1=dom,…,7=sab)
int desloc = d0 - 1;
for (int i = 0; i < M-1; i++)
desloc = (desloc + diasMes[i]) % 7;
int primeiro = desloc + 1;
int M, A;
scanf("%d %d", &M, &A);
const char *meses[] = {“JANEIRO”,“FEVEREIRO”,“MARCO”,“ABRIL”,“MAIO”,“JUNHO”,
“JULHO”,“AGOSTO”,“SETEMBRO”,“OUTUBRO”,“NOVEMBRO”,“DEZEMBRO”};
int diasMes[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
if (anoBissexto(A)) diasMes[1] = 29;
int d0 = diaDaSemana(A); // dia da semana de 01/jan (1=dom,…,7=sab)
int desloc = d0 - 1;
for (int i = 0; i < M-1; i++)
desloc = (desloc + diasMes[i]) % 7;
int primeiro = desloc + 1;
// Cabeçalho
printf(" %s/%d\n", meses[M-1], A);
printf(" D S T Q Q S S\n");
// Espaços iniciais
for (int i = 1; i < primeiro; i++)
printf(" ");
// Impressão dos dias
int totalDias = diasMes[M-1];
for (int dia = 1, col = primeiro; dia <= totalDias; dia++) {
printf("%2d ", dia);
if (col == 7) {
printf("\n");
col = 1;
} else {
col++;
}
}
printf("\n");
return 0;
}