Jump to content

Recommended Posts

Posted

Boas, amanhã vou ter teste de funções. Estou a tentar treinar com estruturas "pouco agradáveis" de forma a poder estar melhor preparado para o desafio.

A minha dúvida está no seguinte código:

#include <stdio.h>
#include <stdlib.h>
int MENU();	   /*Apresenta as opcoes ao user*/

int PRIMO(int num);	 /*Descobre o numero primo*/
void RECEBE_INPUT(int escolha);  /*Recebe os dados do utilizador*/
void DIVISORES(int num);	/*Descobre os divisores*/
void MULTIPLOS(int num);	/*Descobre os multiplos*/

#define PAUSE getch(); system("cls");
int main(void)
{
 unsigned sair;

  do {
	MENU();
 } while (!sair);

return 0;
}

int MENU()
{
 unsigned escolha;

puts("1....SABER SE E PRIMO");
 puts("2....SABER OS DIVISORES");
 puts("3....SABER OS MULTIPLOS");
 puts("\n0....SAIR");

printf ("\n\nESCOLHA: "); scanf("%ud", &escolha);


  if (!escolha)
		 return 0;
		else if (escolha > 3) {
			  printf ("\n\tOpcao Invalida! Tente novamente...");
	 PAUSE; MENU();
	  }	

RECEBE_INPUT(escolha);

}
void RECEBE_INPUT(int escolha)
{
  int confirma, val;

  do {
printf("INSIRA NUMERO: ");
confirma = (scanf("%ld", &val)) ? val > 0 : 0 ;
 } while(!confirma);


   switch(escolha) {
   case 1:
	 if (!(PRIMO(val)))
		 puts("E primo!");
	 else
		 puts("Nao e primo!");
   break;

   case 2: DIVISORES(val); break;	

   case 3: MULTIPLOS(val); break;

   default: break;
		}
   PAUSE;
   MENU();
}

int PRIMO(int num)
{
  int cont, aux = 0;

for(cont = 1; cont <= num; cont++) {
	  if (!(num%cont))
		aux++;
	  }
return (aux == 2) ? 0 : 1;
}

void DIVISORES(int num)
{
 int cont;

for(cont = 1; cont < num; cont++) {
   if (!(num%cont))
	 printf ("%d ", cont);
}
}

void MULTIPLOS(int num)
{
  int cont;

 for(cont = 1; cont <= 10; cont++) {
   printf("%d x %d = %d\n", num, cont, num*cont);
  }
}

Na função MAIN eu tenho que o ciclo decorre enquanto aquele valor for 0, quando deveria ser o inverso: decorreria enquanto o valor fosse diferente de 0. Mas, não sei porquê (e é essa a minha dúvida), se tiro a negação (!) ao carregar na opcao sair, ou seja, zero, ele mantém-se no programa.

De resto, quaisquer desafios curtos e pertinentes sobre estruturação para me preparar para o teste serão benvindos. Assim como dicas.

Posted

lê o teu código:

do              // fazer
{
}
while           // enquanto
     (!sair)   // a negação do valor booleano da variável "sair" 

se sair for zero, então a sua negação é verdadeira, então será :

"fazer ... enquanto verdadeiro" => fica no ciclo

se sair for diferente de zero, então a sua negação é falso, então será :

"fazer ... enquanto falso" => sai do ciclo

----

fica uma nota, que se fosse eu o professor, retirava 2 pontos a quem não indentasse o código e 1 ponto a quem indentar, mas que não seja consistente. tu ficavas logo sem 1 ponto.

-----

resolve algum problema com recursividade

- factorial de X

- calculo de um qualquer polinómio

- soma cumulativa de um array de valores

- redução de um array a um valor

- etc ...

IRC : sim, é algo que ainda existe >> #p@p
Posted

A tua variavel sair nao foi inicializada nem atribuida um valor antes do teste.

Nao interessa o que ponhas no teste, sem teres um valor qualquer na variavel nao podes tirar conclusoes validas do codigo.

Sugestao:

int main(void)
{
   unsigned sair = 0; /* inicializacao */
   /* resto do codigo */
}

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted (edited)

HHHippo, tens toda a razão, apesar de o código se ter modificado e se ter contorcido um pouco na cópia para aqui, admito que tenho alguma dificuldade na indentação.

Já procurei na net documentação sobre isso mas nunca encontrei nada demais.

Em relação à questão do meu código:

Estou a identificar se o valor é, ou não, zero. A negação feita à condição está só a substituir (sair == 0), certo? Ou seja, devia de decorrer enquanto o valor fosse diferente de zero e não o inverso (como está), porque quando fosse 0 pararia.

FAÇA (instruçoes) ENQUANTO "sair" for qualquer numero que nao zero -> para mim seria mais desta forma

FAÇA (instruçoes) ENQUANTO "sair" for zero -> é o que está e o que me parece não fazer sentido

A tua variavel sair nao foi inicializada nem atribuida um valor antes do teste.

Nao interessa o que ponhas no teste, sem teres um valor qualquer na variavel nao podes tirar conclusoes validas do codigo.

Sugestao:

int main(void)
{
   unsigned sair = 0; /* inicializacao */
   /* resto do codigo */
}

Ah, ok ok, já percebi a ideia.

Tendo em conta o que disseste e o que disse o HHHippo, fiz assim:

int main(void)
{
  while (MENU()){ };

return 0;
}

E já resulta como queria. Agora.. será "errado" fazer desta forma?

Edited by pmg
Falta GeSHi
Posted (edited)

... fiz assim:

int main(void)
{
  while (MENU()){ };

return 0;
}

... será "errado" fazer desta forma?

Assim esta correcto.

A parte do corpo do ciclo nao precisa de ser explicitado com um conjunto vazio de chavetas. O ponto-e-virgula isolado tambem serve perfeitamente.

while (1) ; /* ciclo infinito */
while (1) {} /* ciclo infinito */
; /* instrucao vazia */

Eu gosto de chamar a atencao para o facto do corpo do ciclo nao ter nada. Costumo faze-lo com um comentario

while (1) /* void */;
Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

HHHippo, tens toda a razão, apesar de o código se ter modificado e se ter contorcido um pouco na cópia para aqui, admito que tenho alguma dificuldade na indentação.

Já procurei na net documentação sobre isso mas nunca encontrei nada demais.

Uma indentação consistente, regra geral, é a aplicação de um de dois métodos de espaçamento, mas o mais habitual e, para mim, o mais legível é aquele em que dás o mesmo número de espaços para cada novo bloco. Eu costumo utilizar uma indentação de 4 espaços, pois é o tab pré-definido no IDE que utilizo e a indentação que me é mais confortável na leitura.

Para mais informações, podes começar por aqui.

Knowledge is free!

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.