Ir para conteúdo

POWERED BY:

Arquivado

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

AndreVidal

Programa simples

Recommended Posts

Galera.. tô aqui denovo com uma pequena dúvida, fiz um programinha para facilitar a vida do caixa do metrô, bilhete unico custa R$3.10, o duplo R$6,20 e o de 10 viagens custa R$30.. daí fui fazendo, a principio deu tudo certo, mas quando eu escolho para bilhete unico ou duplo, colocando o valor pago como o mesmo preço do custo da passagem, dá erro.

 

Acredito que seja no IF, dêem uma olhada:

 

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

int main (void) {
   int quantidade, opcao;
   float valorpago;

   printf("Menu de Opcoes\n\n");

   printf("1 - Bilhete Unico\n");
   printf("2 - Bilhete Duplo\n");
   printf("3 - Bilhete 10 viagens\n\n");

   printf("Escolha a opcao: ");
   scanf("%d", &opcao);

   printf("Entre com o valor pago: ");
   scanf("%f", &valorpago);

   printf("Entre com a quantidade desejada: ");
   scanf("%d", &quantidade);

   switch (opcao) {

          case 1:
               if (valorpago>=3.10) { /* se colocar 3.10 aparece dinheiro insuficiente */
                  printf("Seu troco eh %f\n", valorpago-(3.10*quantidade));
               }
               else {
                  printf("Dinheiro insuficiente\n");
               }
          break;

          case 2:
               if (valorpago>=6.20) { /* se colocar 6.20 aparece dinheiro insuficiente */
                  printf("Seu troco eh %f\n", valorpago-(6.20*quantidade));
               }
               else {
                  printf("Dinheiro insuficiente\n");
               }
          break;

          case 3:
              if (valorpago>=30) { /* se colocar 30 aparece o TROCO CERTINHO */
                  printf("Seu troco eh %f\n", valorpago-(30*quantidade));
               }
               else {
                  printf("Dinheiro insuficiente\n");
               }
          break;

          default:
                  printf("Opcao invalida!\n");
   }
   getch();
   return 0;
}

 

 

 

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, a noção que tenho é que o troco é para o valor do bilhete multiplicado pelo número comprado, não é?

 

 

Então ficaria:

 

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

int main (void) {
   int quantidade, opcao;
   float valorpago;

   printf("Menu de Opcoes\n\n");

   printf("1 - Bilhete Unico\n");
   printf("2 - Bilhete Duplo\n");
   printf("3 - Bilhete 10 viagens\n\n");

   printf("Escolha a opcao: ");
   scanf("%d", &opcao);

   printf("Entre com o valor pago: ");
   scanf("%f", &valorpago);

   printf("Entre com a quantidade desejada: ");
   scanf("%d", &quantidade);

   switch (opcao) {

          case 1:
               if (valorpago >= 3.10f * quantidade) { /* se colocar 3.10 aparece dinheiro insuficiente */
                  printf("Seu troco eh %f\n", valorpago-(3.10*quantidade));
               }
               else {
                  printf("Dinheiro insuficiente\n");
               }
          break;

          case 2:
               if (valorpago>=6.20f * quantidade) { /* se colocar 6.20 aparece dinheiro insuficiente */
                  printf("Seu troco eh %f\n", valorpago-(6.20*quantidade));
               }
               else {
                  printf("Dinheiro insuficiente\n");
               }
          break;

          case 3:
              if (valorpago>=30.0f * quantidade) { /* se colocar 30 aparece o TROCO CERTINHO */
                  printf("Seu troco eh %f\n", valorpago-(30*quantidade));
               }
               else {
                  printf("Dinheiro insuficiente\n");
               }
          break;

          default:
                  printf("Opcao invalida!\n");
   }
   getch();
   return 0;
}

 

Outra coisa: quando está utilizando floats (isso inclui double), você sempre tem que por um .0 após o valor inteiro caso ele for bom, inteiro, exato ;D

 

E quando se tem um float, coloca-se um f depois para simbolizar isso.

 

 

Testa para ver se funciona...

 

 

Agora, qual tipo de erro? Erro do compilador? Erro em que mostra um valor errado? No caso, qual valor? Seja mais específico. É mais fácil descobrir o erro tendo dados sobre ele do que adivinhá-lo.

 

 

Ok?

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa valeu pelas dicas Renato o erro é esse:

 

Após executá-lo, aparece isso:

 

 

Menu de Opcoes

 

1 - Bilhete Unico

2 - Bilhete Duplo

3 - Bilhete 10 viagens

 

Escolha a opcao: 1

Entre com o valor pago: 3.10

Entre com a quantidade desejada: 1

Dinheiro insuficiente

 

 

 

Não era para aparecer Dinheiro insuficiente e sim seu troco eh 0.000. Entendeu?

 

E outra, Fazendo isso que você fez no IF, o troco aparece -0.000. Mas se já for maior que o preço de custo(3.10), já poderá fazer o calculo do troco.. ou seja, daria, teoricamente, lógicamente, no mesmo colocar 'Se valorpago>=3.10f' ou 'Se valorpago>=3.10f * quantidade', concorda? rs

 

Vai entender esse Dev C++ .. rs

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema não é o uso dos if statements, mas da representação de ponto flutuante definida pela IEEE 754, que falha em determinados valores:

 

#include <stdio.h>

int main(void)
{

   float f1 = 3.10, f2 = 6.20;

   if (f1 == 3.10)
printf("\n\tSem problemas para %f.", f1);
   else
printf("\n\tProblema de representacao de ponto flutuante para 3.10.\n");

   if (f2 == 6.20)
printf("\n\tSem problemas para %f.", f2);
   else
printf("\n\tProblema de representacao de ponto flutuante para 6.20.\n");

   return 0;
}

 

Pra resolver o problema, você precisa trabalhar com valores maiores que 1. Multiplique os valores por tantas ordens de grandeza quanto necessário para que as partes decimais sejam eliminadas, manipule-os, depois divida-os:

 

#include <stdio.h>

int main(void)
{

   float f1 = 3.10 * 10, f2 = 6.20 * 10;

   if (f1 == 3.10 * 10)
printf("\n\tSem problemas para %f.", f1 / 10);
   else
printf("\n\tProblema de representacao de ponto flutuante para 3.10.\n");

   if (f2 == 6.20 * 10)
printf("\n\tSem problemas para %f.", f2 / 10);
   else
printf("\n\tProblema de representacao de ponto flutuante para 6.20.\n");

   return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo bem.. mas não achei um modo para aplicar isso no meu programa. Como eu faço?

 

Edit¹:

Usando só 'Se valorpago>=3.10f' dá certo, o troco fica -0.000.

 

Mas antes de trancar ou acabar com o tópico, guidjos me explica melhor isso ae, por favor.

 

Grande Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para realmente entender o que estou dizendo, você precisa aprender o sistema de representação de ponto flutuante definido pelo IEEE 754. Sugiro também que leia 'What Every Computer Scientist Should Know About Floating-Point Arithmetic'.

 

Fora isso, é tão simples quanto eu disse: para ter segurança sobre a execução de algoritmos que se baseiam em ponto flutuante, você precisa eliminar ordens decimais. Leia e repare nas diferenças entre o primeiro código que postei e o segundo.

 

Este é um caso raro em que o defeito não é do C, mas do algoritmo de representação em si. Qualquer linguagem que use o mesmo padrão de ponto flutuante vai estar sujeita ao defeito para os mesmos valores. Um exemplo é o JavaScript, que usa ponto flutuante de precisão dupla para representar todos os seus números.

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.