Ir ao conteúdo
  • Cadastre-se

Problema com calculo em C.


Felipe Bis

Posts recomendados

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
Link para o comentário
Compartilhar em outros sites

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).

  • Curtir 1
Link para o comentário
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

Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
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);

 

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...