Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

nith_head

Erro de lógica

Recommended Posts

Ola a todos.

Se alguem puder me ajudar, queria saber o erro de logica do codigo seguinte, pois o compilador nao acusa nenhum erro:

/* Programa que requere dois numeros, soma-os e retorna o quadrado do resultado da soma caso a resposta do usuario seja s(de sim).*/1		  main ( )2		{3		 int soma, x, y, z;4		 char resp; 56		 printf ("Digite x: ");7		 scanf ("%d", &x);8		 printf ("Digite y: ");9		 scanf ("%d", &y); 10	   12	   soma= 0; 11	   soma = x+y;12	   z = soma;13	   printf ("Soma= %d\n", soma);14	   printf ("Deseja obter o quadrado do resultado da soma?[s/n]  \n");15	   scanf ("%c", &resp);16 17	   if (resp == 'n')18	 printf("Fim do programa!");19	 else20	 if (resp == 's')21	   printf ("Quadrado= %d.",  z*z);22	   }
OBS: A numeração indica as linhas.

O programa executa corretamente até a linha 14. Então em vez de esperar a entrada de dado do tipo caracter(%c) na linha 15 ele acaba. Queria saber porque o SCANF() da linha 15 não executa. Agradeço qualquer ajuda. http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

 

Uso o sistema operacional Slackware 10.2(Linux) e compilador gcc 3.3.6.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara essa tua linha 3 onde diz o seguinte int soma=0, x, y, z;ta muito confusa o ideal é você declará-las no inicio, e depois colocar o valor de cada, dependendo do compilador ele pode estar truncando ai e dando um possível erro não detectado. Faça assim int soma, x, y, z; soma=0;E se não me falhe a memória, em if (resp == 'n') seria if (resp == "n") mesmo sendo um char.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Higor.

 

Bom, fiz o que voce disse e ainda não está funcionando como eu quero ,ou seja, esperar o usuario digitar s(para sim) ou n(para não), que está na linha 15. scanf("%c", &resp);

Coloquei soma=0; em outra linha.

Na sentença if(resp == 'n') substitui aspas simples por aspas duplas e o compilador deu o seguinte aviso:

teste2.c:22: warning: comparison between pointer and integer

 

O compilador que uso é o gcc 3.12 do Linux.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito estranho, tentei fazer o resp receber outros tipos, como string ou int e continua o mesmo problema. Quando chega na linha 14 o programa acaba do nada! Vo tentar outras formas, mas ta estranho esse problema!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é cara. Quebrei a cabeça aqui e não encontrei nenhum erro, como é que podee! Vou quebrar a cabeça mais um pouco, não é possivel que esse problema não tenha solução! Usei um artificio com while mas não gostei. Ficou assim:

13				printf ("Soma= %d\n",z);14				while (resp != 't') {15				printf ("Deseja obter o quadrada do resultado?[s/n] \n");16				scanf ("%c",&resp);17 18				if (resp == 'n')19			 printf("Fim do programa!");20			 if (resp == 's')22			   printf ("Quadrado= %d.", z*z);23				if (resp == 't')24					break; 25					 }
Desse jeito ele pergunta, mas fica com loop infinito. Isso não é bom. Para sair é só apertar t.

A proposito, meu compilador gcc é a versão 3.3.6 e não 3.12.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola renato.

 

Se eu tivesse que mudar para scanf("%s", &resp); teria que mudar varias coisas, começando pela declaração de repos, pois o tipo string é uma matriz. E este comando estaria errado, teria que ser:

scanf("%s", resp)

Ai o scanf leria o primeiro indice, ou seja, resp[0]. Só para confirmar testei aqui do jeito que voce disse e não retorna o quadrado direito. Em vez disso retorna sempre 0, para qualquer numero, nao sei se aí tambem.

Ai testei tambem do meu jeito: scanf("%s", resp); , detalhe: sem declarar resp como matriz.

Coloquei 2 para x e 4 para y. Ok, ele executou o scanf, mas na hora de retornar o quadrado ele diz:

Falha de segmentação.

Ainda não é a solução.

Mesmo assim valeu pela dica.

Compartilhar este post


Link para o post
Compartilhar em outros sites

E ai galera!

Resolvi o problema. Descobrir que ele só executa o scanf() se eu usar um while() com break para não ficar com loop infinito. Ficou assim:

15	while (1) /* Sempre verdadeiro */ {16	printf ("Deseja obter o quadrada do resultado?[s/n] ");17	scanf ("%c",&resp);1819	if (resp == 'n'){20	printf("Fim do programa!");21		 break; } 22		 else23	if (resp == 's'){24	printf ("Quadrado= %d.\n", z*z);25	break; }26	}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Nit Head, vou postar aqui o código inteiro, apenas modifiquei aquela linha, eu estou usando o Turbo C.

Ele calcula perfeitamente o quadro e pregunta se você quer que mostre o quadrado.

 

/* Testes */

main ( )

{

int soma=0, x, y, z;

char resp;

clrscr();

 

printf ("Digite x: ");

scanf ("%d", &x);

printf ("Digite y: ");

scanf ("%d", &y);

 

soma = x+y;

z = soma;

printf ("Soma= %d\n", z);

printf ("Deseja obter o quadrado do resultado da soma?[s/n] \n");

scanf ("%s", &resp);

 

if (resp == 'n')

printf("Fim do programa!");

else

if (resp == 's')

printf ("Quadrado= %d.", z*z);

getch();

}

 

Engraçado, nunca acho a o

 para colocar o fonte...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ué!, isso é muito estranho. No compilador que uso, gcc 3.3.6, ele não retorna o quadrado direito. Sempre dá zero. Deve ser porque são compiladores diferentes. Ah.Tive que tirar o getch() do final porque não consegui usar o getch do gcc. Afinal para que ele serve?Para inserir o texto em code basta delimita-lo com COCHETEcodeCOCHETE programa... COCHETE/codeCOCHETE, sendo que voce de substituir a palavra COCHETE pelo simbolo [ ].

Compartilhar este post


Link para o post
Compartilhar em outros sites

O getch(); serve para dar um "pause" no programa, pra ele não encerrar após a execção, senão você não consegue ver o resultado. É semelhante a um system("pause");. Entendeu???

 

Quanto a tag CODE, é que em outros fóruns que eu posto, tem um botão escrito CODE, ai é só clicar nele. rsrsrs

 

Teste

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.