Ir para conteúdo
Fórum Script Brasil
  • 0

Problema com valor float


Lyudmila Pavlichenko

Pergunta

Olá, estou com um problema no valor float de uma variável (peso).

Quando o valor não é acrescido de decimais na entrada do dado (por exemplo, peso = 1 ou 2 ou 3...) o resultado é correto. Entretanto, quando o valor do peso vem com decimais (por exemplo, peso = 1.3 ou 2.3 ou 4.45...) o programa simplesmente ignora todos os demais comandos e roda o programa de maneira errada. Já quebrei a cabeça mas não encontrei solução. Quem puder me ajudar, agradeço demais.

PS- sou noob então relevem se for algo prosaico rs

Abaixo segue o código:

/* programa para ler o peso de uma encomenda, tipo
de entrega(1-sedex, 2-sedex 10) e região onde será entregue a
encomenda(1- Norte, 2-Nordeste, 3-Centro-Oeste, 4-Sudeste,
5-Sul), calcular o valor de postagem com base nas condições
referentes ao peso, região de entrega e tipo de entrega dispostos
na apostila e imprimir o valor total da postagem */

//Inclusão de bibliotecas
#include <stdio.h>
#include <locale.h>

int main(void) {
    
    //Comando que faz escrever com acentuação
    setlocale(LC_ALL,"Portuguese");
    
    //Declaração das variáveis
    float peso, postagem;
    int tipo, regiao;
    
    //Título esubtítulo do programa
    printf("\tLOJAS PYONGYANG\n\n\n\n");
    printf("\tCálculo do valor da postagem\n\n\n");
    
    //Leitura dos seguintes dados de entrada: peso, tipo de entrega e região de entrega
    printf("Digite aqui o peso da encomenda, em kg: ");
    scanf("%f", &peso);
    printf("\nQual o tipo de entrega?\n(1- Sedex, 2- Sedex 10)\n");
    scanf("%d", &tipo);
    printf("\nQual a região da entrega?\n(1- Norte, 2- Nordeste, 3- Centro-Oeste, 4- Sudeste, 5- Sul)\n");
    scanf("%d", &regiao);
    
    postagem = 0;
    
    //Switch para os casos referentes à região, com if-else referentes à peso e tipo de entrega
    switch(regiao)
    {
        case 1: postagem = postagem+3;
                if (tipo == 1)
                {
                    postagem = postagem+9;
                }else
                    {
                        if(tipo == 2)
                        postagem = postagem+11;
                        
                    }
                if (peso <= 1.00)
                    postagem = postagem+5;
                else
                {
                    if(peso >= 1.00 || peso <= 5.00)
                    postagem = postagem+10;
                    else
                    {
                        if(peso > 5.00)
                        postagem = ((peso-5.00)*3)+15+postagem;
                    }
                }
                
                break;
        case 2: postagem = postagem+2;
                if (tipo == 1)
                {
                    postagem = postagem+9;
                }else
                    {
                        if(tipo == 2)
                        postagem = postagem+11;
                        
                    }
                if (peso <= 1.00)
                    postagem = postagem+5;
                else
                {
                    if(peso >= 1.00 && peso <= 5.00)
                    postagem = postagem+10;
                    else
                    {
                        if(peso > 5.00)
                        postagem = ((peso-5.00)*3)+15+postagem;
                    }
                }
                
                break;
        case 3: postagem = postagem+6;
                if (tipo == 1)
                {
                    postagem = postagem+9;
                }else
                    {
                        if(tipo == 2)
                        postagem = postagem+11;
                        
                    }
                if (peso <= 1.00)
                    postagem = postagem+5;
                else
                {
                    if(peso >= 1.00 && peso <= 5.00)
                    postagem = postagem+10;
                    else
                    {
                        if(peso > 5.00)
                        postagem = ((peso-5.00)*3)+15+postagem;
                    }
                }
                
                break;
        case 4: postagem = postagem+5;
                if (tipo == 1)
                {
                    postagem = postagem+9;
                }else
                    {
                        if(tipo == 2)
                        postagem = postagem+11;
                        
                    }
                if (peso <= 1.00)
                    postagem = postagem+5;
                else
                {
                    if(peso >= 1.00 && peso <= 5.00)
                    postagem = postagem+10;
                    else
                    {
                        if(peso > 5.00)
                        postagem = ((peso-5.00)*3)+15+postagem;
                    }
                }
                
                break;
        case 5: postagem = postagem+7;
                if (tipo == 1)
                {
                    postagem = postagem+9;
                }else
                    {
                        if(tipo == 2)
                        postagem = postagem+11;
                        
                    }
                if (peso <= 1.00)
                    postagem = postagem+5;
                else
                {
                    if(peso >= 1.00 && peso <= 5.00)
                    postagem = postagem+10;
                    else
                    {
                        if(peso > 5.00)
                        postagem = ((peso-5.00)*3)+15+postagem;
                    }
                }
                
                break;        
    }
    
    //Impressão dos resultados
    printf("\n\n\nVALOR TOTAL DA POSTAGEM...................R$ %.2f\n\n", postagem);
    
    system("pause");
        
}

Editado por Lyudmila Pavlichenko
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

SETLOCALE

Olá, tudo bem? Espero que esteja bem. A função setlocale mais os argumentos LC_ALL, 'Portuguese' alteram os padrões C, em específico, o formato do dado real (flutuante ou dobro). Antes de chamar a função considera o (.) ponto o seu separador de inteiro e fração após chamada passa a considerar (,) vírgula.

Veja

image.png.f32e08592d796f14052cb390efc24ce6.png

Então

Essa mudança, no entanto, tem efeito somente para os inputs|outputs. Isso é, a sintaxe c permanece com separação padrão: por (.) ponto.

Exemplo

#include"stdio.h"
#include"locale.h" //setlocale LC_ALL localeconv struct lconv
int
main(void){
  // Demonstracao dos efeitos na entrada com uso da funcao selocale com os argumentos
  // LC_ALL e "Portuguese"
  struct lconv * pattern = localeconv();
  printf("Entre com valor real(d%sdd)\n",pattern->decimal_point);
  double valor0 = 0.0; scanf("%lf",&valor0); printf("Valor0: %f\n",valor0);

  puts(setlocale(LC_ALL,"pt_BR.UTF-8"));
  // altera os padroes c para Portuguese

  pattern = localeconv();
  printf("Entre com valor real(d%sdd)\n",pattern->decimal_point);
  double valor1 = 0.0; scanf("%lf",&valor1); printf("Valor1: %f\n",valor1);

  puts("Fim da demonstracao");
  return 0;
  }

Se reler a documentação dessa função terá mais informações para determinar a melhor solução do problema.

🙂 

Editado por britivaldo
demonstração
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...