Jump to content
Dexter's Lab

Teste e Duvida na condição

Recommended Posts

Dexter's Lab

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.

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
Dexter's Lab

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

Share this post


Link to post
Share on other sites
pmg

... 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!

Share this post


Link to post
Share on other sites
thoga31

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!

Share this post


Link to post
Share on other sites
HappyHippyHippo

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.

http://en.wikipedia.org/wiki/Indent_style

eu uso a Allman


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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


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