Ir para conteúdo
Fórum Script Brasil
  • 0

calendario do ano 1900 em diante


ovatsug

Pergunta

Ola pessoal, eu tenho um programa em C feito que imprime o calendario do ano de 1900 em diante, porém este programa imprime o calendário de um dado ano, com os meses um em baixo do outro e eu preciso que o mesmo seja feito com os meses tres a tres um ao lado do outro, exemplo:

é impresso:

janeiro [caso 1]

fevereiro

março

abril

maio

junho

[...]

e deve ser impresso:

janeiro fevereiro março [caso 2]

abril maio junho

[...]

coloquei apenas o titulo dos meses, mas deve ser impresso em baixo d cada titulo o respectivo calendario. o programa que faz o mencionado no caso 1 é o seguinte [ele só é grande, mas não tem nada complexo, rapidinho vocês leêm e entendem]:

#include <stdio.h>
#include <stdlib.h>

/* 
 * Constantes:
 * Os dias da semana são representados pelos inteiros de 0 a 6.
 * Os meses do ano são representados pelos inteiros de 1 a 12.
 */

#define domingo    0
#define segunda    1
#define terca      2
#define quarta     3
#define quinta     4
#define sexta      5
#define sabado     6

#define NMAX     100

#define VERDADEIRO 1
#define FALSO      0


/* Prototipos de funcoes */
void forneca_instrucoes(void);
int obtenha_ano(void);
void imprima_calendario(int ano);
void imprima_calendario_do_mes(int mes, int ano);
void indente_primeira_linha(int dia_da_semana);
int numero_de_dias_do_mes(int mes, int ano);
int primeiro_dia_do_mes(int mes, int ano);
int eh_bissexto(int ano);
void imprima_cabecalho(int mes, int ano);


/* Programa principal */
int main()
{
    int ano;

    forneca_instrucoes();
    ano = obtenha_ano();
    imprima_calendario(ano);

    system("pause");
    return 0;
}

/* Esta função imprime uma mensagem com instruções para o usuário */
void forneca_instrucoes(void)
{
    printf("Este programa imprime o calendario para um dado ano.\n");
    printf("O ano não pode ser anterior a 1900.\n");
}

/*
 * Esta funcao le um ano digitado pelo usuario. Se o usuario fornece 
 * um ano anterior a 1900, a funcao avisa que o ano deve ser pelo menos 1900.
 * Quando um tal valor e' fornecido, a funcao devolve esse valor.
 */

int obtenha_ano(void)
{
    int ano;

    while (VERDADEIRO) {
        printf("Calendario de que ano? ");
        scanf("%d", &ano);
        if (ano >= 1900){
            printf("Calendario de %d\n\n", ano);
            return ano;
        }
        printf("O ano precisa ser pelo menos 1900.\n");
    }
}

/* Esta funcao imprime o calendario do ano dado. */

void imprima_calendario(int ano)
{
    int mes;
    
    for (mes = 1; mes <= 12; mes++) {
        imprima_calendario_do_mes(mes, ano);
        printf("\n");
    }
}

/* Esta funcao imprime o calendario de um dado mes e ano. */

void imprima_calendario_do_mes(int mes, int ano)
{
    int dia_da_semana, n_dias, dia, v[NMAX], A[NMAX][NMAX], B[NMAX][NMAX], C[NMAX][NMAX];

    imprima_cabecalho(mes, ano);
    printf(" Do Se Te Qu Qu Se Sa\n");
    n_dias = numero_de_dias_do_mes(mes, ano);
    dia_da_semana = primeiro_dia_do_mes(mes, ano);
    indente_primeira_linha(dia_da_semana);
    for (dia = 1; dia <= n_dias; dia++) {
        printf(" %2d", dia);
        if (dia_da_semana == sabado){
          printf("\n");
        }
        dia_da_semana = (dia_da_semana + 1) % 7;
        
    }
    if (dia_da_semana != domingo) printf("\n");
}

/* Esta funcao imprime um cabecalho para o calendario do mes do ano dado.*/

void imprima_cabecalho(int mes, int ano)
{
  switch(mes) {
    case  1: printf("    Janeiro"); break;
    case  2: printf("    Fevereiro"); break; 
    case  3: printf("    Marco"); break; 
    case  4: printf("    Abril"); break; 
    case  5: printf("    Maio"); break; 
    case  6: printf("    Junho"); break; 
    case  7: printf("    Julho"); break; 
    case  8: printf("    Agosto"); break; 
    case  9: printf("    Setembro"); break; 
    case 10: printf("    Outubro"); break; 
    case 11: printf("    Novembro"); break; 
    case 12: printf("    Dezembro"); break; 
    default: printf("não pode acontecer!\n"); exit(0);
  }

  printf(" %d\n", ano);
}

/*
 * Esta funcao indenta a primeira linha de um calendario
 * de um mes, imprimindo o numero suficiente de brancos
 * para colocar o cursor na posicao correta para a impressao
 * do primeiro dia daquele mes, que cai no dia da semana
 * dado como parametro (dia_da_semana).
 */

void indente_primeira_linha(int dia_da_semana)
{
    int i;

    for (i = 0; i < dia_da_semana; i++) {
        printf("   ");
    }
}

/* Esta funcao devolve o numero de dias do dado mes do dado ano. */

int numero_de_dias_do_mes(int mes, int ano)
{
    switch (mes) {
      case 2:
        if (eh_bissexto(ano)) return 29;
        return 28;
      case 4: case 6: case 9: case 11:
        return 30;
      default:
        return 31;
    }
}

/*
 * Esta funcao devolve o dia da semana em que cai o dia
 * primeiro do mes dado do ano dado.
 * 
 * O metodo usado para determinar este dia da semana
 * é simples: usamos o fato que 1/1/1900 foi uma 
 * segunda-feira e contamos o numero de dias decorridos 
 * desde então ate a data em questao.
 */

int primeiro_dia_do_mes(mes, ano)
{
    int dia_da_semana, i;

    dia_da_semana = segunda;
    for (i = 1900; i < ano; i++) {
        dia_da_semana = (dia_da_semana + 365) % 7;
        if (eh_bissexto(i)) dia_da_semana = (dia_da_semana + 1) % 7;
    }
    for (i = 1; i < mes; i++) {
        dia_da_semana = (dia_da_semana + numero_de_dias_do_mes(i, ano)) % 7; 
    }
    return dia_da_semana;
}

/* Esta funcao devolve VERDADEIRO se o dado ano é bissexto. */

int eh_bissexto(int ano)
{
    return  ((ano % 4 == 0) && (ano % 100 != 0))
             || (ano % 400 == 0);
}

caso não tenha ficado claro o modo como está sendo impresso, podem colocar pra compilar esse código que está rodando direitinho. Só preciso de ajuda para a nova formataçao estipulada para impressao, sei que eu precisarei usar matrizes, mas não vi como usa-las aí, agradeço quem puder ajudar.

obrigado

Editado por ovatsug
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Vejo um jeito utilizando gotoxy, apesar de ela ser somente da Borland. (TOTALMENTE não portável)

Ou você também pode escrever os meses, depois os dias dos 3 meses..

Vai ter que fazer uma boa restruturação pelo segundo método.

Abraços.

Link para o comentário
Compartilhar em outros sites

  • 0
Vejo um jeito utilizando gotoxy, apesar de ela ser somente da Borland. (TOTALMENTE não portável)

Ou você também pode escrever os meses, depois os dias dos 3 meses..

Vai ter que fazer uma boa restruturação pelo segundo método.

Abraços.

o comando gotoxy não posso usar por ser um comando que ainda não aprendi e esses exercícios exigem que se use o que conhecemos.... no caso acho que vou ter que usar pelo seu segundo metodo apontado e usar matrizes que foi o que foi recomendado, mas é justamente aí minha dúvida, que ponto do programa eu devo aproveitar, seria melhor usaur tres matrizes ou como seria melhor??

obrigado

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...