Jump to content
Sign in to follow this  
markusmetal

Ajuda para fazer calendário em C

Recommended Posts

markusmetal

Estou a fazer um programa em que é suposto fazer um calendário. Vou na parte inicial em que apresento o menu e testo o ano colocado. Mais para a frente o ano vai ser fornecido ou por teclado ou por ficheiro. Só que neste programa ao fazer debug, quando coloco o ano que quero processar, volta a fazer-me a mesma pergunta outra vez. E isto acontece 3 vezes (ás vezes 4) e finalmente apresente o resultado certo. Será que está aqui alguma coisa mal? Agradecia a vossa ajuda.

#include <stdio.h>

int validar ();

void menu()

{

int op;

do

{

printf("Deseja fornecer o Ano atraves de que processo? \n\n");

    printf("Por Teclado      \t\t\t(responda \"1\")\n");

    printf("Por Ficheiro      \t\t\t(responda \"2\")\n");

    printf("Desejo sair do programa      \t\t(responda \"3\")\n\n");

    scanf(" %d",&op);

switch (op)

{

case 1: validar(); break;

case 2: printf("ZZZ\n\n"); break;

case 3: printf("Sair\n"); break;

default : printf("Opcao invalida. Escolha uma das 3 opcoes possiveis: 1, 2 ou 3\n");

}

}

while(op>3 || op<=0);

}

int validar()

{

int ano;

printf("Qual o ano que pretende processar? ");

scanf(" %d",&ano);

if(1975 <= ano <= 9999)

{

return ano;

}

else

{

printf("Ano invalido\n");

menu();  //perguntar outra vez se quer por teclado,ficheiro ou sair

}

}

int main()

{

menu();

validar();

printf("O ano eh %d",validar());

}

Share this post


Link to post
Share on other sites
KTachyon

scanf(" %d",&ano);

<espaço>%d?

E estás a chamar a função validar() duas vezes:

int main()
{
   menu();
   validar();
   printf("O ano eh %d",validar());
}

Mais o menu...


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Cr4zYPT

Tens ai alguns erro,

1. SO precisas de meter cabeçalho da função de a função estiver descrita depois da main, por isso int validar(); podes remover;

2. Reparei que quando retornas o ano na validar nao o estas a guarda num int da main por isso ele perde-se.

Share this post


Link to post
Share on other sites
KTachyon

Tens ai alguns erro,

1. SO precisas de meter cabeçalho da função de a função estiver descrita depois da main, por isso int validar(); podes remover;

2. Reparei que quando retornas o ano na validar nao o estas a guarda num int da main por isso ele perde-se.

Em nenhum dos casos é erro, mas, como ambas as funções se chamam uma à outra, é preciso lá estar a declaração de uma delas (consoante a ordem das funções no código). Portanto, a tua sugestão número 1 não serve ;)


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Cronometro

Tu estás a fazer <printf("O ano eh %d",validar());> e assim vai voltar a função validar() e depois na função validar tens menu(); e assim sucessivamente, o ultimo resultado da função, validar(), vai ser o resultado imprimido no ecra.

Não sei qual é o problema.


Software is like sex: It’s better when it’s free.

Share this post


Link to post
Share on other sites
markusmetal

Desde já agradeço imenso as respostas ao meu problema. Estive a analisar melhor como deveria começar o programa para fazer o calendário e alterei esse código porque estava algo estranho.

Fiz outro em que está melhor estruturado na minha opinião só que agora dá-me um debug error. Já pesquisei na net o motivo mas não consigo contornar o problema. Ao correr o programa selecciono a opção 2, abre um ficheiro no qual coloquei  o ano 1999, e aparece isto: Stack around the variable 'ficheiro' was corrupted

Foi criada a função ficheiro só para testar. O problema creio que está no if da função ficheiro porque se colocar um ano errado ele vai ao else e volta ao menu normalmente. Mas se coloco o ano correcto, aparece esse debug error e escreve qwerty. O meu ojectivo é retornar o valor da função ficheiro quando colocado correctamente, para que a partir daí possa criar a função que vai ter o algoritmo do calendário.

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

int main ();
int ficheiro ();
int teclado ();
void calendario ();


void calendario()
{
printf("qwerty");
}
int teclado (){ 

int ano;
printf("\n\nIntroduza o ano\n\n");
scanf(" %d", &ano);



   if(1975<=ano && ano<=9999)
   {
      return ano;
  
   }
   else
   {
      printf("\n\nAno invalido\n\n");
  teclado ();            //perguntar outra vez se quer por teclado,ficheiro ou sair
   }


}
int ficheiro ()
{ 

FILE *data ;
	char ficheiro[1][5];
	char ficheiro1 [1][40];
	int dataano;


					printf("\n\nQual a drive onde reside o ficheiro: ");

					scanf(" %s", ficheiro [0]);						// aqui estou a receber a localização do ficheiro

					printf("\n\nQual o nome do ficheiro: ");

					scanf(" %s", ficheiro1 [0]);	


					strcat(ficheiro [0],":\\");
					strcat(ficheiro [0], ficheiro1 [0]);

					data = fopen (ficheiro[0],"r");					// estou a abrir o ficheiro para leitura
						if (data == NULL)									// se o ficheiro nao existir
						{
						printf("\n\nOcorreu um erro na abertura do ficheiro..\n\n"); 
						fclose(data);
						}
						else {
						fscanf(data,"%d",&dataano); 
						fclose(data);
						}



   if(1975<=dataano && dataano<=9999)
  
   { calendario ();
   return dataano;
    
   }
   else
   {
      printf("\n\nAno invalido\n\n");  //perguntar outra vez se quer por teclado,ficheiro ou sair
  main();
   } 
}

int main()
{
int op;

	printf("Deseja fornecer o Ano atraves de que processo? \n\n");
        printf("Por Teclado       \t\t\t(responda \"1\")\n");
        printf("Por Ficheiro       \t\t\t(responda \"2\")\n");
        printf("Desejo sair do programa       \t\t(responda \"3\")\n\n");
        scanf("%d",&op);
        switch (op)
        {
	case 1: teclado(); break;
	case 2: ficheiro(); break;
        case 3: exit (1); break;
	default : 
		{
		printf("\n\n\tOpcao invalida. Escolha uma das 3 opcoes possiveis: 1, 2 ou 3\n\n"); 
		fflush (stdin); // elimina as letras como opçao
		system("pause");
		system("cls");         // limpa o ecrã
		main ();
			  }
	}
}

Share this post


Link to post
Share on other sites
markusmetal

Ja corrigi o problema do troço de programa anterior. Estou agora na parte em que tenho de desenvolver o algoritmo para fazer o calendário sendo fornecido anteriormente o ano. Tenho o algoritmo para calcular os feriados móveis e também a expressão para verificar se o ano é ou não bissexto. Estou a pensar em fazer o calendário com vectores bidimensionais (não sei se será o melhor processo) e preenxe-los através de ciclos for.  O problema é que não sei como começar a preenxe-los. Se forneço o ano 1999 o dia 1 de Janeiro começa numa 6ªfeira mas se colocar o ano 2060 o dia 1 de Janeiro é uma 5ªfeira.

Agradecia que me dessem a vossa opinião e sugestões  :cheesygrin:

Ps: Como mudo o nome deste tópico que abri?

Share this post


Link to post
Share on other sites
Baderous

Ps: Como mudo o nome deste tópico que abri?

Penso que podes fazê-lo editando o 1º post.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.