Ir ao conteúdo
  • Cadastre-se

Do-while não executando como esperado


Mayk.hsm

Posts recomendados

Olá, estou começando a estudar lógica de programação e surgiu uma dúvida que não consegui identificar, poderiam me ajudar? Obs: Estou usando o CodeBlocks

O codigo em si é para calcular o desconto  sobre um automóvel de acordo com o ano do veículo, e somar o valor de todos os veículos comprados, assim como mostrar a quantidade que foi comprada.

O codigo está funcionando corretamente. O problema é no laço de repetição que eu criei, ao executar as operações o comando do-while faz uma verificação no final perguntando se deseja comprar mais carros, ao digitar 's' ele volta no começo para ler uma entrada de tipo Int (digitar o ano), mas quando é digitado um tipo char ele ignora as outras leituras, executa o laço de repetição mais uma vez e fecha.( isso altera os valores dos contadores e acumuladores, o que eu faço?)

 

No visualg da erro quando é digitado um valor caracter onde é para ser uma entrada do tipo numérica, o que acontece na linguagem C ??

 

Obrigado.

#include <stdio.h>

void main(){

    float PRECO,DESCONTO,TOTAL,ACUMULADOR;
    int ANO,CONTADOR1,CONTADOR2;
    char decisão;
    CONTADOR1=CONTADOR2=ACUMULADOR=0;


    do{
        printf("Digite o ano do automovel\n");
        scanf("%d",&ANO);
        printf("Digite o valor do automovel\n");
        scanf("%f",&PRECO);
        CONTADOR1++;
        if (ANO <= 2000){
            CONTADOR2++;
            TOTAL = PRECO-PRECO*0.12;
        }
            else
                TOTAL = PRECO-PRECO*0.07;

        printf("\nO valor do carro e: %.2f\n",TOTAL);
        ACUMULADOR+=TOTAL;
        printf("O valor total e: %.2f\n",ACUMULADOR);
        printf("Total de carros: %d\n",CONTADOR1);
        printf("carros ate ano 2000: %d\n",CONTADOR2);
        printf("Deseja continuar com a operacao?\n");
        scanf(" %c",&decisão);

    }while(decisão == 's');

}

 

Link para o comentário
Compartilhar em outros sites

@Mayk.hsm é exatamente por isso cara, se você digitar um caracter em um entrada do tipo int, float (%d, %f) ira ocorrer um erro, você pode criar limitações de entrada usando operadores logicos ' && ' e ' || ' '!' com IF/ELSE e algum laço de repetição para imprimir uma mensagem de erro e retornar a entrada de informação, algo parecido com o que ocorre ai em baixo.

...
scanf ( " %c", &decisão)
if (decisão == (int)decisão)
      printf ( "ERRO\n" );
...

 

Por hora, acho que você nao deve focar em criar um programa livre desses erros, porque seria um pouco mais complexo acredito eu. enfim, se eu estiver errado outras pessoas mais experientes podem responder xD eu só tenho 1 ano estudado essa linguagem... bons estudos =D

Link para o comentário
Compartilhar em outros sites

Boa noite!

Em nome de variavel não sem se coloca til.

Eu alterei um pouco o codigo acima e deu certo, segue ele abaixo.

#include <stdio.h>

int main(){

    float PRECO,DESCONTO,TOTAL,ACUMULADOR;
    int ANO,CONTADOR1,CONTADOR2;
    char decisão;
    CONTADOR1=CONTADOR2=ACUMULADOR=0;


    do{
        printf("Digite o ano do automovel\n");
        scanf("%d",&ANO);
        printf("Digite o valor do automovel\n");
        scanf("%f",&PRECO);
        CONTADOR1++;
        if (ANO <= 2000){
            CONTADOR2++;
            TOTAL = PRECO-PRECO*0.12;
        }
            else
                TOTAL = PRECO-PRECO*0.07;

        printf("\nO valor do carro e: %.2f\n",TOTAL);
        ACUMULADOR+=TOTAL;
        printf("O valor total e: %.2f\n",ACUMULADOR);
        printf("Total de carros: %d\n",CONTADOR1);
        printf("carros ate ano 2000: %d\n",CONTADOR2);
        printf("Deseja continuar com a operacao?\n");
        scanf(" %c",&decisão);

    }while(decisão == 's');
    return 0;
}

Espero ter te ajudado com a minha opinião!

Link para o comentário
Compartilhar em outros sites

@rjort_nine @Paulo Moraes da Silva

 

Paulo, o problema não era no main, mesmo na função void main() o programa estava executando. O problema é que o code::blocks (compilador que eu uso), mesmo quando da erro ele não interrompe o fluxo do algoritmo. Quando digito um caracter tipo char em um local reservado para um tipo int deveria acusar erro e parar o fluxo ( o que ocorre em outros compiladores), mas no code::blocks o fluxo continua e muda os valores dos contadores e do acumulador.

rjort_nine, não consegui compreender muito bem o que acontece nessa condição do if, se souber me explicar por favor

...
scanf ( " %c", &decisão)
if (decisão == (int)decisão)
      printf ( "ERRO\n" );
...

Para testar eu montei esse, e independente do valor digitado (int ou char) a mensagem que aparece é sempre "ERRO", e caso eu mude o == por !=  a mensagem apresentada é sempre "Okay".Como disse, sou novo nisso. Você usou alguma biblioteca específica? Pois como padrão eu utilizo somente a <stdio.h> e <stdlib.h>.

...
scanf ( " %c", &decisão);
if (decisão == (int)decisão)
      printf ( "ERRO\n" );
	else
		printf( "Okay\n" );
...

De qualquer forma, meu problema inicial era só o compilador, testei o mesmo codigo em outro compilador e deu certo. Obrigado pela contribuição de vocês. 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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...