Ir ao conteúdo

Laço While ignora comandos scanf ou getchar?


Ibraim Rebouças

Posts recomendados

Postado

Pessoal, estou fazendo uns códigos pra treinar, e fiz um pequeno programinha que calcula o fatorial de um valor, tudo bem, porém no final, quero colocar uma opção para a pessoa selecionar se deseja calcular outro valor ou não, eu coloquei os comandos dentro de um laço. Aqui está o código:


#include <stdio.h>
#include <conio.h>

int main(int argc, char*argv[])

{
int contador,resultado,valor;
char S_N = 'D';

while (S_N != 'N')
{
printf("\n\nDigite um valor para calcular o fatorial(numero natural positivo): ");
scanf("%d",&valor);

for(contador=1;contador < valor;contador++);
{
resultado = contador*(contador-1);
resultado = resultado * (contador+1);

}
printf("\n\nResultado: %d\n\n",resultado);

printf("Deseja calcular outro valor? S para sim N para nao.");
S_N = toupper(getchar());
}

system("PAUSE");
return 0;
}

Ja testei com Scanf mas também não deu, o problema é que ele executa todos os comandos, e mostra o resultado, depois disso, seria para ele deixar a pessoa digitar S ou N, mas ele pula esta parte e vai dereto para o inicio do laço novamente... o que está contecendo?

Obrigado!

EDIT:

Moderadores, podem por favor corrigir o scanf no título do tópico?

Obrigado!

Postado

Cria uma função que calcule esse fatorial, e tenta o seguinte algoritmo:

1- defina essa função, que recolhe todos os parâmetros do usuário;

3-chama a função (se você definir ela antes de tudo, fica muito melhor);

4-pergunte ao usuário se ele quer ou não calcular outro número; se sim, no "switch", chama a função de novo e fecha com um "break"; se não, finaliza o programa só com um break".

Postado

Sabemos que pelo menos uma vez o fatorial será calculado, então a melhor estrutura de repetição a ser usada neste caso é DO...WHILE. Veja que usando esse laço não será necessário inicializar a variável "S_N".

As alterações estão em azul..


[COLOR="Blue"]char S_N;[/COLOR]

[COLOR="Blue"]do{[/COLOR]


...calculo fatorial;



[COLOR="Blue"] printf( "Deseja continuar( S ou N)? " );
scanf( "%c", &S_N );
}
while( S_N == 'S' || S_N == 's' );[/COLOR]

Postado

O problema todo tá no '\n' que scanf e getchar deixam no buffer de entrada...

Resultado:

1.1-valor é digitado ('\n' fica no buffer)

1.2-resultado é calculado

1.3-getchar pega o '\n' do buffer e o laço volta pois '\n' != 'N'

2.1-valor é digitado ('\n' fica no buffer)

2.2-resultado é calculado

2.3-getchar pega o '\n' do buffer e o laço volta pois '\n' != 'N'

3.1-valor é digitado ('\n' fica no buffer)

3.2-resultado é calculado

3.3-getchar pega o '\n' do buffer e o laço volta pois '\n' != 'N'

...

...

...

Postado

O problema está mesmo no buffer da stream stdin; precisas limpá-lo. Para este caso, um simples getchar antes do último printf resolve. Por outro lado, se estivesses trabalhando com strings, por exemplo, necessitarias de uma solução composta:

ou a função específica

fflush (stdin);

ou o artifício

while (getchar () != '\n');

Mudando um pouco de assunto, esse algoritmo não calcula corretamente o fatorial. Reunindo as recomendações acima, eu sugiro o seguinte código:

#include <stdio.h>
#include <ctype.h>

unsigned long long fatorial (int);

int main () {
int n;

do {
do {
printf ("\nDigite um numero positivo para calcular o fatorial:");
scanf ("%d", &n);
} while (n < 0);

getchar ();

printf ("\nO fatorial de %d é %llu!\n\nDigite N para fializar S para continuar: ", n, fatorial (n));
} while (toupper (getchar ()) != 'N');

return 0;
}

unsigned long long fatorial (int n) {
unsigned long long i;

for (i = 1; n > 1; i = i * n, n--);

return i;
}

Espero ter ajudado! :D

Postado

Muito bem explicado pessoal! Consegui resolver o problema, e corrigi o cálculo! Desculpem a demora em responder!

Só não compreendi uma coisa, a diferença entre do...while, e sómentte o While, e por que devo usar o do while neste caso.

Obrigado!

Postado
Muito bem explicado pessoal! Consegui resolver o problema, e corrigi o cálculo! Desculpem a demora em responder!

Só não compreendi uma coisa, a diferença entre do...while, e sómentte o While, e por que devo usar o do while neste caso.

Obrigado!

A diferença está no teste da condição. Veja bem:

---While:

-A condição é testada inicialmente.

-Se a condição não for estabelecida, nenhuma iteração ocorrerá.

-Serve para loops com base em variáveis que eu já possuo o valor.

---Do ... while:

-A condição é testada apenas no final.

-Garante que o trecho de código seja executado, pelo menos, uma vez.

-Serve para loops baseados em variáveis cujos valores ainda serão fornecidos pelo usuário. Muito útil para criticar variáveis.

Espero ter ajudado! :D

Postado

Perfeito! Entendi... estou fazendo alguns testes, e neste pequeno exemplo:


do {
printf("Digite valor para elevar ao quadrado");
scanf("%d",&valor);
resultado = valor*valor;
printf("\n\nResultado: %d",resultado);
continue;
printf("Digite letra");
letra = toupper(getchar());
}
while(letra != 'N');

Por que ele não espera a pessoa pressionar a atecla após terminar o calculo?

Obrigado!

Postado
Perfeito! Entendi... estou fazendo alguns testes, e neste pequeno exemplo:


do {
printf("Digite valor para elevar ao quadrado");
scanf("%d",&valor);
resultado = valor*valor;
printf("\n\nResultado: %d",resultado);
continue;
printf("Digite letra");
letra = toupper(getchar());
}
while(letra != 'N');

Por que ele não espera a pessoa pressionar a atecla após terminar o calculo?

Obrigado!

Primeiro:

A presença de "continue", que força uma nova iteração, ignorando todo o resto do código no laço.

Segundo:

É necessário um "getchar" exclusivo para esvaziar o buffer e outro para armazenar o valor na variável.

Segue o exemplo:

do {
printf("Digite valor para elevar ao quadrado: ");
scanf("%d",&valor);
printf("Resultado: %d\n", valor * valor);
/*continue; <- NÃO pode ter isso aqui! */
printf("Digite letra: ");
getchar (); //Esse vai esvaziar o buffer!
} while(toupper(getchar()) != 'N');
//Este último vai armazenar a tecla digitada!

Espero ter ajudado! :D

Arquivado

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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!