Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Felipe Bis

Problema com calculo em C.

Recommended Posts

Oi pessoal, estou com um problema em um código. O algoritmo funciona basicamente assim, uma tabela (simples) para calcular gastos de meses, onde o usuario informa o mes, entra em um condicional, que armazena valores para cada tipo de gasto, e no final exibe a soma desses valores (armazena em float, e exibe em float - 14,00; 15,50; etc - mas, ao exibir esses floats ele aparece numeros aleatorios como "-12021020; 2020935060760; etc "

 

Segue o código. Desde já grato!!

tabeladefeituosa.txt

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

Esse é um problema com float vs printf. Veja em http://www.cplusplus.com/reference/cstdio/printf/

Não existe nenhum specifier pra float. Dependendo do compilador e do ambiente em que você está compilando vai funcionar esse código. Por exemplo, aqui no meu computador compilando com TDM-C++ 4.9.2 x64 exibe os valores corretamente. Mas funciona porque o float é transformado em um double pelo compilador, ao ser passado para uma função com lista de argumentos variável. Nem todos farão isso, e claramente o que você está usando não faz.

 

A solução mais simples é usar double em vez de float, e então usar %lf no scanf e %f no printf (ou %.2f, tanto faz).

Editado por RafaelCLP
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, vi que um dos seus resultados você mostrou um número negativo. Pelo que vi você junta muitas contas. Talvez o ideal seja usar um double mesmo ou long double só por garantia. Numero negativo, em geral, significa estouro de variável, pois o tipo de dado funciona como uma roleta. Se o tamanho máximo for 345 e você poe 347, a variável recebe -343, ou algo do tipo. A depender do compilador o tamanho do float é de acordo com a arquitetura do seu processador. Enfim, vai de double ou long double.

 

Ah. O sistema ficou da hora, man. Todo desenhadinho no ascii art. kkkk

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Postado (editado)

    Obrigado pela dica, vou fazer o teste com double, mas no caso se eu quero armazernar "40,00" ou "50,00" eu uso long double, ou simplesmente um %d ? Vou mudar depois dou um up aqui

    Editado por Felipe Bis

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Postado (editado)

    Uma dica, não é necessário ficar repetindo tanto código, olha como fica seu código quando tira um pouco da parte repetida.

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
    #include <windows.h>
    #define slogan "Tabela para calcular gastos - "
    #define versao "1.0:"
    #define autor "fREAKZOiD / F"
    #define versao2 "BETA TEST! </>"
    #define line "----------------------------------"
    #define line2 "-----"
    #define padrão "Hello World!"
    #define mes1 "Janeiro"
    #define mes2 "Fevereiro"
    #define mes3 "Marco"
    #define mes4 "Abril"
    #define mes5 "Maio"
    #define mes6 "Junho"
    #define mes7 "Julho"
    #define mes8 "Agosto"
    #define mes9 "Setembro"
    #define mes10 "Outubro"
    #define mes11 "Novembro"
    #define mes12 "Dezembro"
    
    
    /*Trabalho para exercitar meus conhecimentos em C. Uma tabela de gastos para calcular o total de gastos mensais.
    Melhorias:
    1. Uma variavel para cada mês, simulando um banco de dados.
    2. No final do código disponibilizar uma maneira de exibir todos os meses (for)
    */
    
    delay05s()
    {
        Sleep(500);
    }
    
    
    delay1s()
    {
        Sleep(1000);
    }
    
    
    pular1linha()
    {
        printf("\n");
    }
    
    
    pular2linhas()
    {
        printf("\n\n");
    }
    
    
    int main()
    {
        system("color 0a"); //Terminal preto e fonte de cor verde
    
    //Variaveis
        float aluguel, luz, telefone, internet, vest, mercado, combs, ipvtu, conv, total;
        int att, mes, i;
        char meses[12][15] = {"Janeiro", "Fevereiro", "Marco", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"};
        //char meses[12][15] = {mes1, mes2, mes3, mes4, mes5, mes6, mes7, mes8, mes9, mes10, mes11, mes12};
    
    
    //Se não tiver hello world não funciona
        printf("%s", padrão);
        Sleep(2000);
        system("cls");
    
    //Inicio Definitivo
        printf("%s %s\n%s\n%s\n\n",slogan, versao, versao2, line2);
    
    //Tabela em Branco
        printf("+------+-----+----------+----------+-----------+--------------+-------------+-------------+----------+\n");
        printf("|                                            .::Tabela::.                                            |\n");
        printf("+------+-----+----------+----------+-----------+--------------+-------------+-------------+----------+\n");
        printf("| Agua | Luz | Telefone | Internet | Vestuario | Supermercado | Combustivel | IPVA / IPTU | Convenio |\n");
        printf("+----+-------+----------+----------+-----------+--------------+-------------+-------------+----------+\n");
        printf("|      |     |          |          |           |              |             |             |          |\n");
        printf("|      |     |          |          |           |              |             |             |          |\n");
        printf("+----+-------+----------+----------+-----------+--------------+-------------+-------------+----------+\n");
        printf("| TOTAL:     |          |          |           |              |             |             |          |\n");
        printf("+----+-------+----------+----------+-----------+--------------+-------------+-------------+----------+\n");
        pular2linhas();
        Sleep(2000);
        system("cls");
    
    //Capturar valor do mes
        printf("Escolha o mes: \n");
        for(i = 0; i < 12; i++)
            printf("%d.%s\n", i + 1, meses[i]);
        scanf("%i", &mes);
        system("cls");
    
        if(mes > 0 && mes <= 12)
        {
    
            printf("\n\n%s\n", meses[mes - 1]);
            delay05s();
            //Lendo os valores
            printf("Digite o valor da Agua: \n");
            scanf("%f", &aluguel);
            //fflush(stdin);
            delay05s();
    
            printf("Digite o valor da conta de luz: \n");
            scanf("%f", &luz);
            //fflush(stdin);
            delay05s();
    
            printf("Digite o valor da Internet: \n");
            scanf("%f", &internet);
            //fflush(stdin);
            delay05s();
    
            printf("Digite o valor do gasto com vestuario: \n");
            scanf("%f", &vest);
            //fflush(stdin);
            delay05s();
    
            printf("Digite o valor do supermercado: \n");
            scanf("%f", &mercado);
            //fflush(stdin);
            delay05s();
    
            printf("Digite o valor que foi gasto com Combustivel: \n");
            scanf("%f", &combs);
            //fflush(stdin);
            delay05s();
    
            printf("Digite o valor gasto com IPTU e IPVA: \n");
            scanf("%f", &ipvtu);
            //fflush(stdin);
            delay05s();
    
            printf("Digite o valor do Convenio: \n");
            scanf("%f", &conv);
            //fflush(stdin);
            delay05s();
    
            printf("\nAtualizar tabela?\n\n");
            printf("1.SIM\n");
            printf("2.NAO\n\n");
            scanf("%d", &att);
    
            if(att == 1)
            {
                Sleep(2000);
                printf("\n\nAtualizando tabela.");
                delay1s();
                printf(".");
                delay1s();
                printf(".");
                delay1s();
                printf(".");
                delay1s();
                printf(".");
                Sleep(2000);
                system("cls");
                delay1s();
                total = aluguel+luz+telefone+internet+vest+mercado+combs+ipvtu+conv;
                printf("+-------+------+-----------+-----------+------------+---------------+--------------+--------------+-----------+\n");
                printf("|                                                .::Tabela::.                                                 |\n");
                printf("+-------+------+-----------+-----------+------------+---------------+--------------+--------------+-----------+\n");
                printf("| Agua  | Luz  | Telefone  | Internet  | Vestuario  | Supermercado  | Combustivel  | IPVA / IPTU  | Convenio  |\n");
                printf("+-------+------+-----------+-----------+------------+---------------+--------------+--------------+-----------+\n");
                printf("| %.2f  | %.2f |   %.2f    |    %.2f   |    %.2f    |     %.2f      |     %.2f     |    %.2f      |   %.2f    |\n", aluguel, luz, telefone, internet, vest, mercado, combs, ipvtu, conv);
                printf("|       |      |           |           |            |               |              |              |           |\n");
                printf("+-------+------+-----------+-----------+------------+---------------+--------------+--------------+-----------+\n");
                printf("| TOTAL: %.2f  |           |           |            |               |              |              |           |\n", total);
                printf("+-------+------+-----------+-----------+------------+---------------+--------------+--------------+-----------+\n");
                pular2linhas();
    
    
            }
            else
                printf("Saindo.");
            delay1s();
            printf(".");
            delay1s();
            printf(".");
            delay1s();
            system("pause");
        }
    
    
        else printf("\nADEUS!!\n\n");
        system("pause");
    
        return 0;
    }

    Você pode usar um vetor de strings igual eu usei.

    Citação

    char meses[12][15] = {"Janeiro", "Fevereiro", "Marco", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"};

    Ou aproveita e usa as constantes definidas

    Citação

    char meses[12][15] = {mes1, mes2, mes3, mes4, mes5, mes6, mes7, mes8, mes9, mes10, mes11, mes12};

     

     

    Outra coisa, o total tem que ser calculado depois de pegar os valores e não antes.

    Editado por MassakiMsk

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Postado (editado)

    Nossa que demais, não sabia dessa possibilidade kkk. Ele continua com a mesma funcionalidade?? e como ficaria trocando pra double? Ele exibe os meses, ou pede para o usuario escolher??

    Editado por Felipe Bis

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    2 horas atrás, Felipe Bis disse:

    Obrigado pela dica, vou fazer o teste com double, mas no caso se eu quero armazernar "40,00" ou "50,00" eu uso long double, ou simplesmente um %d ? Vou mudar depois dou um up aqui

    Em vez de algo como:

    float minhaVar;
    scanf("%f", &minhaVar);
    printf("%.2f", minhaVar); // esta é a linha que nao funciona como esperado com float

    Seria:

    double minhaVar;
    scanf("%lf", &minhaVar);
    printf("%.2f", minhaVar);

     

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    14 horas atrás, Felipe Bis disse:

    Nossa que demais, não sabia dessa possibilidade kkk. Ele continua com a mesma funcionalidade?? e como ficaria trocando pra double? Ele exibe os meses, ou pede para o usuario escolher??

    As funcionalidades são exatamente as mesmas que tinha antes.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×