Ir para o conteúdo
Dexter's Lab

Teste e Duvida na condição

Mensagens Recomendadas

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Editado por pmg
Falta GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 */;

Editado por 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.