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
|c|c|c|c|c|c|c| hline mu d(1= 2= 7= 01 / & B=A-1973 ; & C=A-1901 ; & D=A-1601 ; & d=(1+B+B / 4-C / 100+D / 400-(A-1) / 4000) % 7+1
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:

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:
B = A - 1973
C = A - 1901
D = A - 1601
e então
d = (1 + B + B/4 - C/100 + D/400 - (A-1)/4000) % 7 + 1
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

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;
}
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 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;
// 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;
}

Exercícios relacionados