Ir ao conteúdo

Posts recomendados

Postado

Alguem pode me ajudar? preciso fazer um calendario em c mas estou com certa dificuldade em montar o calendario ele tem que ser 2x6

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

int i; //mes
int j; //dia
int data;
int cont = 0; //quebra linha
int ano, mes, dia, bis,bar, linhaCalendario;
int g, c, x, z, e, d, n;
int inicioMes;
int mesDias[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
char *meses[12]=
{
    "Janeiro",
    "Fevereiro",
    "Marco",
    "Abril",
    "Maio",
    "Junho",
    "Julho",
    "Agosto",
    "Setembro",
    "Outubro",
    "Novembro",
    "Dezembro"
};

int main() {
    printf("Digite o ano: ");
    scanf("%d", &ano);


    //P A S C O A

    g = (ano % 19) + 1; //resto inteiro - AUREO
    c = (ano / 100) + 1; //SECULO
    x = ((3 * c) / 4) - 12; //correção 1
    z = (((8 * c) + 5) / 25) - 5; //correção 2
    e = ((11 * g) + 20 + z - x) % 30; //resto inteiro


    //EPACTA
    if((e == 25 && g > 11) || e ==  24){
        e++;
    }
 

    //LUA CHEIA
    n = 44 - e; 
    if(n < 21){
         n += 30;
    }

    //DOMINGO DE PASCOA faça N = 44 - E. Se N < 21,
    d = ((5 * ano) / 4) - (x + 10);
      data = (n + 7) - ((d+n) % 7);

 if(data > 31){
        data = data - 31;
        printf("Pascoa: %d de abril ", data);
        mes = 4;

    }else{
        printf("Pascoa: %d de marco ", data);
        mes = 3;
    }



int y=ano;



if(y%100 == 0)
{
 y = y/100;
}

printf("%d\n",y);
if(y%4 == 0)
{
 printf("bissexto\n");
}else{
 printf("nao e bissexto\n") ;
}
 //Calculo do primeiro de janeiro
	
 int diaSemana = 7;
     if(ano!= bis)
     {
         bar=31+28+dia;
    }else{
        bar=31+29+31+dia; 
    }
    for(bar=0;bar>0;bar--){    //qual dia termina o mes?: inicioMes(0-DOM, 1-SEG, 3-TER, 4-QUA, 5-QUI, 6-SEX)
        if(diaSemana==1){
            diaSemana=7;
        }else{
            diaSemana--;
        }
    }
    
     
return 0;


}
 

 

  • Curtir 1
  • Amei 1
Postado

@marvelous12   para escrever em colunas você pode usar essa função gotoYX  ;

#include <windows.h>
void gotoYX(int x,int y){
    SetConsoleCursorPosition(GetStdHandle,(COORD){x,y});
}
int main(){
    char *meses[12]={"Janeiro"," "," "," "," "," "," "," "," "," "," "," "};
    gotoYX(10,10);
    printf("%s",meses[0]);
}

e depois especificar em ( x , y )  ,   em qual linha e coluna quer escrever   .

  • Curtir 1
Postado

Se você tem o gabarito --- e ele já te dá o conforto de ter seis semanas por mês --- apenas faça o programa ler o gabarito e simplesmente escrever em cima. Não precisa de qualquer lógica exceto saber em que dia começou o ano, o que o sistema te diz.

  • Curtir 1
Postado

@arfneto faz parte do trab achar o primeiro dia a partir da data da pascoa

adicionado 5 minutos depois

@herbertbahia não um programa que com base na nada ta pascoa ache o primeiro de janeiro (q dia cai) e com isso eu entre com o ano no programa e saia o calendario do ano todo

  • Curtir 1
Postado
29 minutos atrás, marvelous12 disse:

@arfneto faz parte do trab achar o primeiro dia a partir da data da pascoa

adicionado 5 minutos depois

@herbertbahia não um programa que com base na nada ta pascoa ache o primeiro de janeiro (q dia cai) e com isso eu entre com o ano no programa e saia o calendario do ano todo

 

e?

 

Não entendi. Você vai gerar um calendário 2x6 como disse. Imagino que em um arquivo para poder salvar , confrir e imprimir. Não vejo interesse em mostrar isso na tela.
 

E determinar o primeiro dia é algo distinto. 
 

O que eu te disse é que esse calendário que mostrou sequer tem as otimizações que normalmente se tem ao imprimir um calendário via programa: ele mantem 6 semanas para mês inclusive fevereiro, como está lá. 36x12 slots = 432 dias. Então você pode ler o seu próprio exemplo e escrever em cima do calendário, depois que usar qualquer meio para determinar o primeiro dia. Só isso. Não precisa de qualquer lógica. 

  • Curtir 1
Postado

Matriz Painel

 

 

Gostou da recomendação do colega @devair1010, então aplique numa matriz; Tem-se uma matriz que substitui a área prompt e sua função de posicionamento gotoxy  se posiciona respectivamente nessas coordenadas dessa matriz.

 

Logo, XY é respectivamente Coluna e Linha dessa matriz.

Depois que 'desenha' ao menos um par de meses coloque a matriz num loop (0 à 10) para imprimir no Prompt de Comando ou qualquer outra saída;

 

Um estrutura para modela matriz:

char matriz [10][64] = {
 "|-----------------------------||-----------------------------|\n",
 "|_____________________________||_____________________________|\n",
 "|-----------------------------||-----------------------------|\n",
 "| dom seg ter qua qui sex sab || dom seg ter qua qui sex sab |\n",
 "| --  --  --  --  --  --  --  || --  --  --  --  --  --  --  |\n",
 "| --  --  --  --  --  --  --  || --  --  --  --  --  --  --  |\n",
 "| --  --  --  --  --  --  --  || --  --  --  --  --  --  --  |\n",
 "| --  --  --  --  --  --  --  || --  --  --  --  --  --  --  |\n",
 "| --  --  --  --  --  --  --  || --  --  --  --  --  --  --  |\n",
 "| --  --  --  --  --  --  --  || --  --  --  --  --  --  --  |\n",
};

Atenção: Receberá alertas com relação a sintaxe de inicialização se tem compilador desatualizado.

 

 

 

 

  • Curtir 1
Postado

A janela padrão da console do Windows tem 9001 linhas, o calendário tem = 60 linhas. Se usar uma fonte tamanho 10 ou 12 pode ter o calendário todo numa tela sem scroll, se estiver usando um terminal FullHD ou de maior resolução. Veja um exemplo com 70 linhas e fonte 10:
 

image.thumb.png.4efdc3efca11bf4d785cc0f21bd77cf0.png

 

Então se usar um bloco com um mês todo pode até usar o cursor para escrever os meses direto na tela nos 12 endereços certinhos. Aritmética apenas, Só que não pode imprimir ou gravar em arquivo com a mesma lógica.

 

Mas se usar um gabarito como o postado acima, com as duas colunas, há menos sentido ainda em posicionar o cursor diretamente em qualquer posição.

 

Mas acho que a ideia é gravar isso em arquivo ou imprimir mesmo. Como o cal do Linux. Veja um exemplo:

image.thumb.png.9f01c7f44fd6ad61ce1cc0af5d3747ce.png

 

A unidade de trabalho: mês


Formalmente o calendário vai agrupar uma sequência de meses. No Linux é fixo em 3 colunas, seu programa vai usar 2, mas podiam ser 3,4,6,12. Mesmo 5 ou 15. 

 

A matemática


O que vai fazer é como se fosse trabalhar em uma planilha,  uma grande matriz onde vai pegar um grupo de células e transpor da horizontal para a vertical. Mas o trabalho é o mesmo para qualquer número de colunas. Perto do que faz o comando &nbsp;pr do Unix/Linux

 

O mês

-----------------------------
 XXXXXXXXXXXXXXXXXXXXXXXXXXX                            
-----------------------------
 dom seg ter qua qui sex sab 
  01  02  03  04  05  06  07 
  08  09  10  11  12  13  14 
  15  16  17  18  19  20  21 
  22  23  24  25  26  27  28 
  29  30  31  32  33  34  35 
  36  37  38  39  40  41  42 

Essa é sua unidade. Seu calendário já foi formatado para facilitar tudo, e se fosse olhar a tabela acima vai entender que pode escrever em cima desses valores mesmo: Identificado o dia em que começa o mês você desenha a tabela. Comparando o seu exemplo com o do Linux você vê que o seu usa "--" para os dias vagos e usa '|' para as bordas. O Linux usa espaços. Se você usar dois parâmetros pode ter os dois. O Linux usa 3 colunas, Você 2. 
 

Citação

Matematicamente dá na mesma e podia ser só um parâmetro também.


Uma possível lógica: como o programa só mostra anos inteiros, basta usar a técnica pedida para identificar como montar janeiro. Daí pra diante a fila anda e não precisa fazer mais nada: basta a função que monta o mês retornar o dia da semana para começar o mês seguinte.
 

A transposição, de um modo mais formal

int         transpor(char*entrada, char L, char C, char* saida);

Imagine uma função assim declarada que pega um arquivo com uma tabela de uma certa largura. E dentro dela tem blocos de L linhas. Então você quer reagrupar isso em uma outra tabela, sem mexer na original, com esses mesmos blocos em C colunas. Nada mal, certo ;) ? 
 

Se ela funcionar e você passar pra ela um arquivo de calendário como o seu, com um mês atrás do outro, o que vai rolar? A função vai ler o arquivo e ver que é uma matriz de sei lá quantas linhas --- não importa --- onde cada linha tem digamos Z colunas. Tanto faz também. E você chama a rotina assim

	transpor("2020-1-col.txt", 10, 2, "2020-2-col.txt");
	transpor("2020-1-col.txt", 10, 3, "2020-3-col.txt");
	transpor("2020-1-col.txt", 10, 4, "2020-4-col.txt");	
	transpor("2020-1-col.txt", 10, 6, "2020-6-col.txt");

Ela faz as contas das colunas de cada linha, sabe as colunas na saída, sabe o arquivo a gerar e ao sair você vai ter esses arquivos todos prontos. Os computadores são para isso. E C e C++ são bem adequadas para escrever essas coisas.


Veja uns exemplos usando o calendário
 

calendars.png.96889878f4978115d2a1326acac25b0c.png

 

Não faz diferença: é só uma transposição.

 

Veja uma implementação dessa função

int         transpor(char* entrada, char linhas, char colunas, char* saida)
{
    if (entrada == NULL) return -1;
    FILE* in = fopen(entrada, "r");
    FILE* out = fopen(saida, "w");
    if (out == NULL) return -2;
    char linha[256];
    fgets(linha, 80, in);
    fputs(linha, out); // a primeira linha tem o ano
    fgets(linha, 256, in);
    int largura = strlen(linha) - 1;
    int area = linhas*largura*colunas + 1;
    char* bloco = (char*)malloc(area);
    char* origem = bloco;
    rewind(in); // volta pro comeco
    fgets(linha, 256, in); // le o cabecalho de novo
    memset(bloco, 32, area-1); // limpa a area
    bloco[area - 1] = 0;
    fgets(linha, 256, in); // a primeira linha de dados
    while (!feof(in))
    {
        for (int col = 0; col < colunas; col += 1)
        {  
            for (int y = 0, l = 0; l < linhas; y += colunas*largura, l+=1)
            {   // le um bloco e coloca na posicao
                memcpy((origem + y), linha, largura);
                fgets(linha, 256, in); // uma linha
                if (feof(in)) break;
            };  // for()
            if (feof(in)) break;
            origem += largura;
        };  // for()
        origem = bloco; // aqui tem um bloco completo
        int lw = colunas * largura; // largura da linha
        for (int l = 0; l < linhas; l += 1)
        {   char save = *(origem + lw);
            *(origem + lw) = 0; // termina a string
            fprintf(out,"%s\n", origem);
            *(origem + lw) = save; // restaura
            origem += lw; // avanca linha
        };
        // mostrou o bloco todo
        memset(bloco, 32, area-1); // vai tentar ler outro
        origem = bloco;
    };  // while()
    fclose(in);
    fclose(out);
    free(bloco);
    fprintf(stderr, "Gerado '%s' com %d colunas\n", saida, colunas);
    return 0;
}

Um loop pra ler, um loop para montar, um bloco de colunas por vez. Nada mais.

 

E daí para o programa?

 

Bastaria uma função para montar o mês e retornar o dia da semana em que começa o próximo.
 

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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!