Jump to content
asasar

Recomeçar programa

Recommended Posts

asasar

Boas.

Estou a fazer um programa no VS 2008 em que no inicio é pedido ao utilizador que escolha uma entre três opções: fornecer os dados (um ano entre 1999 e 2010) por teclado, por um ficheiro, ou sair do programa.

No caso de o utilizador escolher fornecer os dados por ficheiro, se o ficheiro contem um ano fora dos possiveis, por ex. 1978, gostava que o programa voltasse ao inicio e apresentasse de novo as opções. Pensei em fazê-lo com um do... while, mas como para as opções tenho um if{.....}else if{...}else{...} não sei como fazê-lo.

Se tiverem alguma dica agradecia.

Obrigado desde já.

Cumprimentos!

Share this post


Link to post
Share on other sites
Localhost

O melhor talvez seja teres uma variável do tipo bool que te vai indicar se já podes sair do ciclo ou não.

Algo do género:

bool fly = false;

while (!fly)
{
   // carrada de if's aqui
   // Imaginando que já leu do ficheiro para uma variável chamada data fica:
   if (data < 1999 || data > 2010)
     fly = true;
}

Já agora, em vez de if's podias utilizar um switch..case.


here since 2009

Share this post


Link to post
Share on other sites
asasar

Obrigado pela resposta. Tentei mas não consegui.

Sou um bocado novo nisto e talvez não tenha percebido completamente o teu conselho.

O troço do programa é o seguinte

do
      {
         printf("Como quer fornecer o ano para o processamento ?\n\n\tPor teclado [1]\n\n\tPor ficheiro [2]\n\n\tQuero sair do programa [3]\n\t>");
         scanf_s(" %d", &escolha);

         if(escolha < 1 || escolha > 3)
         {
          printf("\n\nEscolha invalida\n\n");
         }
      }
      while(escolha < 1 || escolha > 3);

      
      if(escolha == 1) //por teclado
      {
         ....
      }
      else if(escolha == 2)
      {
         fich = fopen("C:\\Documents and Settings\\Utilizador\\Os meus documentos\\Visual Studio 2008\\Projects\\Trabalho final\\TF_escola\\ano.txt", "r");
         
	 if(fich == NULL)
	 {
		 printf("!!O ficheiro nao existe!!\n\n");
	 }
	 else
	 {
		 fscanf_s(fich, " %d", &ano);
	 }

	 if(ano < 1999 || ano > 2010)
	 {
		  //se o programa chega aqui, quero que volte ao início, ou seja, voltar a pedir como se quer fornecer o ano para processamento    
                         printf("\n!!O ficheiro contem um ano invalido!!\n\n");
	 }

	 fclose(fich);
      }
      else
      {
         exit(1);
      }

Share this post


Link to post
Share on other sites
pikax

@asasar mete o código em c++.

uma das muitas soluções é como o localhost falou, é melhor usar uma variável bool, ficava algo do genero disto:

bool data_invalida=true;
while(data_valida)
{	
do
      {
         printf("Como quer fornecer o ano para o processamento ?\n\n\tPor teclado [1]\n\n\tPor ficheiro [2]\n\n\tQuero sair do programa [3]\n\t>");
         scanf_s(" %d", &escolha);

         if(escolha < 1 || escolha > 3)
         {
          printf("\n\nEscolha invalida\n\n");
         }
      }
      while(escolha < 1 || escolha > 3);

     
      if(escolha == 1) //por teclado
      {
         ....
      }
      else if(escolha == 2)
      {
         fich = fopen("C:\\Documents and Settings\\Utilizador\\Os meus documentos\\Visual Studio 2008\\Projects\\Trabalho final\\TF_escola\\ano.txt", "r");
         
                 if(fich == NULL)
                 {
                         printf("!!O ficheiro nao existe!!\n\n");
                 }
                 else
                 {
                         fscanf_s(fich, " %d", &ano);
                 }

                 if(ano < 1999 || ano > 2010)
                 {
                          //se o programa chega aqui, quero que volte ao início, ou seja, voltar a pedir como se quer fornecer o ano para processamento   
                         printf("\n!!O ficheiro contem um ano invalido!!\n\n");
                 }
			 else
				data_invalida=false;  //Se a data for valida entao sai do ciclo senão a data continua invalida

                 fclose(fich);
      }
      else
      {
         exit(1);
      }
}

Já agora quando olhei para o código iria jurar que era C :)


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
asasar

Obrigado pikax, parece funcionar.

Em relação ao código ser C, se o dizes...

Tenho uma cadeira de programação na faculdade e dizem-me que é para aprender-mos a programar (coisas básicas) em C++, daí eu postar aqui 😳

Obrigado aos dois, mais uma vez.

Share this post


Link to post
Share on other sites
pikax

Obrigado pikax, parece funcionar.

Em relação ao código ser C, se o dizes...

Tenho uma cadeira de programação na faculdade e dizem-me que é para aprender-mos a programar (coisas básicas) em C++, daí eu postar aqui 😳

Obrigado aos dois, mais uma vez.

Ainda bem que funciona, apenas me limitei a fazer o que o localhost disse  :)

Eu não disse por mal, mas eu estou habituado a ver "cin", "cout", etc...

C é quase 100% senão 100% compatível com C++, acho que se tu substituíres o bool por int e mudares o true para 1 e false para 0, podes compilar no gcc que funciona direito :D

Sempre que tenhas alguma dúvida, vem aqui ao fórum que a comunidade ajuda  :P


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
Localhost

Não foi bem isso que eu disse. Esse código não funciona bem como o asasar quer.

@asasar: por que é que utilizas funções como scanf_s em vez de scanf? É que essas que utilizas não são portáveis (microsoft-only) e não as convém usar por esse mesmo motivo.


here since 2009

Share this post


Link to post
Share on other sites
pikax

Não foi bem isso que eu disse. Esse código não funciona bem como o asasar quer.

Pelo o que  ele pediu no inicio do post:

No caso de o utilizador escolher fornecer os dados por ficheiro, se o ficheiro contem um ano fora dos possiveis, por ex. 1978, gostava que o programa voltasse ao inicio e apresentasse de novo as opções. Pensei em fazê-lo com um do... while, mas como para as opções tenho um if{.....}else if{...}else{...} não sei como fazê-lo.

O programa volta ao inicio, só que tem uns inconvenientes como por exemplo, se ele não quiser voltar ao menu tem que meter a variável data_invalida=true.

@localhost: porque que o código não funciona da maneira que ele quer? 🤔

*EDIT: não é data_invalida=true, é data_invalida=false; para cancelar o ciclo


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
asasar

Boas.

Para funcionar como queria, meti a variável data_invalida=true; antes do ciclo while, e data_invalida=false; no início da primeira instrução if. Pelo que vi essa parte já funciona como pretendia.

@localhost: em relação ao scanf_s em vez de scanf, utilizo pois um professor meu diz que é melhor utilizarmos em modo seguro, ou algo do género. :)

Share this post


Link to post
Share on other sites
Localhost

Aconselho-te a não dares muita importância a isso que o teu professor diz. Na minha máquina, por exemplo, esse teu código já não compila. Mas são opções.


here since 2009

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

×
×
  • 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.