Bug do caracter em loop.

1. Bug do caracter em loop.

S-man
s-man

(usa Ubuntu)

Enviado em 26/09/2016 - 09:23h

Fiz um programa para imprimir o número de termos, a soma de todos eles e a sua média assim que o usuário digitasse o número 0. Mas há um bug em que quando digita-se um caractere ele entra em um loop infinito.
Sendo assim,queria saber como faz para que o programa não leia caracteres.
Aqui está a linha de código:
int main()
{

int a=0,i;
float vetor[i],soma=0,media=0;

do
{

a++;
printf("%dº>>>>",a);
scanf("\n%f",&vetor[i]);
soma = soma+vetor[i];
media = soma/(a-1);

}while(vetor[i]!=0);

printf("A quantidade de números digitados foi = %d\n",a-1);

printf("A soma foi = %.2f\n",soma);

printf("A média dos termo foi =%.2f\n",media);

return 0;
}



  


2. Re: Bug do caracter em loop.

Rodrigo
sn8ker

(usa Debian)

Enviado em 26/09/2016 - 11:53h

Não está faltando dar um valor para i?


3. Re: Bug do caracter em loop.

Eduardo Augusto
daoaugusto

(usa Debian)

Enviado em 26/09/2016 - 15:23h

O problema é que em c++ faz a conversão implícita de char para int. Acho que um jeito prático de resolver esse problema é verificar a variável char que está sendo lida, se esse char for diferente de algum valor numérico, você manda ler novamente.


4. Re: Bug do caracter em loop.

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/09/2016 - 18:26h

Permita-me apontar alguns problemas no seu programa.

int main() 


Se o seu programa for em C++, tudo OK, pois isso diz que main() não recebe nenhum argumento.. Mas se for em C, a assinatura de main está errada, pois os parênteses vazios significam que a função pode receber qualquer quantidade de argumentos de quaisquer tipos, mas o padrão prevê apenas os casos em que você não recebe argumento nenhum, que exigiria a forma “int main(void)” ou que recebe um contador de argumentos e um array de ponteiros de caracteres com o texto de cada argumento, caso em que a assinatura seria algo como “int main(int argc, char **argv)”.

{

int a=0,i;


Qual o valor de i aqui?

    float vetor[i],soma=0,media=0; 


Você está usando i sem ter definido um valor. Isso é, no mínimo, perigoso.

Além do mais, essa sintaxe de array com tamanho não-constante em tempo de compilação é inválida em C++ (e também nas versões do C anteriores a 1999).

        do
{

a++;
printf("%dº>>>>",a);
scanf("\n%f",&vetor[i]);


Aqui existe um problema com a forma como se ensina a usar scanf().

Como eu sempre digo, scanf() é uma das funções mais complexas que existem na biblioteca padrão do C. Em particular, quando ela encontra dados que fogem do esperado -- como, por exemplo, uma letra durante a leitura de de um valor supostamente numérico -- a função aborta a execução prematuramente. Quando isso acontece, normalmente o caráter inesperado é devolvido ao buffer de leitura, e a função sinaliza o erro através do código de retorno. Então é sua obrigação examinar esse código de retorno, assim como de eliminar eventuais caracteres inválidos, antes de tentar novas operações de leitura.

Além disso, de novo há o problema com o valor desconhecido de i, e com um agravante: qualquer que seja o valor, você vai extrapolar o limite do último elemento. E você volta a cometer esse erro nas linhas seguintes, também.

            soma = soma+vetor[i];
media = soma/(a-1);

}while(vetor[i]!=0);

printf("A quantidade de números digitados foi = %d\n",a-1);

printf("A soma foi = %.2f\n",soma);

printf("A média dos termo foi =%.2f\n",media);

return 0;
}



5. Re: Bug do caracter em loop.

S-man
s-man

(usa Ubuntu)

Enviado em 26/09/2016 - 19:37h

O programa é em C.


6. Re: Bug do caracter em loop.

S-man
s-man

(usa Ubuntu)

Enviado em 26/09/2016 - 21:46h

Deu certo aqui, parou o loop,vlw!!!







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts