Ir ao conteúdo
  • Cadastre-se

Problema com variável float


Heiisenberg
Ir à solução Resolvido por Heiisenberg,

Posts recomendados

Problema simples. Eu criei um algoritmo onde faz a leitura de uma matriz de 4x3, e depois ele faz a soma e a média dos valores digitados... Até ai tudo bem, o problema e quando vou imprimir o valor da média na tela o programa só mostra zeros depois da vírgula (o valor antes da vírgula é impresso corretamente) mesmo tendo. Não sei o que está havendo...

#include <stdio.h>#include <stdlib.h>#define linha 4#define coluna 3int matriz [linha][coluna];int x,y,soma=0;float media=0;int main(){		for(x=1;x<=linha;x++){				for(y=1;y<=coluna;y++){				printf(">> Valor da linha %d e coluna %d: ",x,y);		scanf("%d",&matriz[x][y]);							soma = soma + matriz[x][y];					}					printf("\n");				}				media = soma/12;		for(x=1;x<=linha;x++){				for(y=1;y<=coluna;y++){						printf("   %d	",matriz[x][y]);								}				printf("\n");				}		printf("\nA Soma: %d",soma);	printf("\nA media: %f\n\n",media);	system("PAUSE");	}	
Link para o comentário
Compartilhar em outros sites

Olá 

 

Se o que voce quer é omitir os valores apos a vírgula faça como exemplo abaixo:

printf("\nA media: %0.f\n\n",media);

Mas, Cuidado! Ao limitar a exibição do valor somente até a virgula (sua parte inteira) voce não saberá se o valor será exato, e quando tentar fazer algum cálculo aritmético com este valor o seu resultado pode não sair como esperado.

 

 

Uma boa prática seria limitar duas casas (float, double)após a vírgula ficando assim:

printf("\nA media: %0.2f\n\n",media);

Espero ter te ajudado.

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

  • Solução

Olá 

 

Se o que voce quer é omitir os valores apos a vírgula faça como exemplo abaixo:

printf("\nA media: %0.f\n\n",media);

Mas, Cuidado! Ao limitar a exibição do valor somente até a virgula (sua parte inteira) voce não saberá se o valor será exato, e quando tentar fazer algum cálculo aritmético com este valor o seu resultado pode não sair como esperado.

 

 

Uma boa prática seria limitar duas casas (float, double)após a vírgula ficando assim:

printf("\nA media: %0.2f\n\n",media);

Espero ter te ajudado.

 

Disso eu já sei, você entendeu a minha dúvida errado... mas de qualquer forma obrigado pela intenção de ajudar. 

A matriz deve ser float ou double, e a variavel soma também, todas as variaveis em realidade devem ser iguais, menos x, y que sao indices. si a matriz é de inteiros e você tentar guardar algo como 1.6 você vai perder o que tem depois do ponto, pois variáveis do tipo int não tem capacidade de guardar isso.

#include <stdio.h>#include <stdlib.h>#define linha 4#define coluna 3float matriz [linha][coluna];int x, y;float media = 0;float soma = 0;int main() {    for ( x = 0; x < linha; x++ ) {            for ( y = 0; y < coluna; y++ ) {                    printf ( ">> Valor da linha %d e coluna %d: ", x+1, y+1 );            scanf ( "%f", &matriz[x][y] );                        soma = soma + matriz[x][y];                    }                printf ( "\n" );            }        media = soma / 12;        for ( x = 0; x < linha; x++ ) {            for ( y = 0; y < coluna; y++ ) {                    printf ( "   %f	", matriz[x][y] );                    }                printf ( "\n" );            }        printf ( "\nA Soma: %f", soma );    printf ( "\nA media: %f\n\n", media );    system ( "PAUSE" );    }

Outra coisa... comece a contar desde zero, e termine em linha-1 por exemplo, nos loops. Si eu declaro char palavra [10]; eu tenho desde palavra[0] até palavra[9], isso são 10 números, nunca devo parar em palavra[10] por que si conto de 0 a 10 são 11 números, você passou 1, e em C isso é um erro grave.

 

 

Então depois que vi sua reposta vi que você disse que a "matriz deve ser float ou double" e que as variáveis soma e média também deveriam... e enfim, apesar de ser iniciante vi que não faz muita lógica isso, não estou criticando sua resposta, a questão é que, para resolver o problema não era necessário isso.

 

Eu conseguir descobrir o error... aparentemente se eu pegar um valor inteiro e dividir por outro inteiro, mesmo o resultado sendo float não posso armazenar o resultado em uma variável float, que era o que eu estava fazendo, porém seu eu pegar um valor inteiro e dividir por um float ai sim isso é possível (vai entender).

 

Consegui resolver o problema substituindo esta equação: "media = soma/12" por essa "media = soma/12.0" , enfim vai entender isso.

#include <stdio.h>#include <stdlib.h>#define linha 4#define coluna 3int matriz [linha][coluna];int x,y,soma=0;float media=0;int main(){		for(x=1;x<=linha;x++){				for(y=1;y<=coluna;y++){				printf(">> Valor da linha %d e coluna %d: ",x,y);		scanf("%d",&matriz[x][y]);							soma = soma + matriz[x][y];					}			printf("\n");		}			media = soma/12.0; //  <----------------------------------------------------------- O erro estava aqui		for(x=1;x<=linha;x++){				for(y=1;y<=coluna;y++){						printf("   %d	",matriz[x][y]);						}		printf("\n");				}	printf("\nA Soma: %d",soma);	printf("\nA media: %f\n\n",media);	system("PAUSE");}

E em relação a dica que você me deu sobre começar o contador de 0, tanto faz... antes eu também começava o contador de 0, porém se você começar de 1 ou de outro valor tem que ficar atento até onde ele irá incrementar/decrementar dependendo do operador ( < ou <=), isso é só uma questão de lógica e preferência :).

 

Enfim... obrigado pela resposta.

Link para o comentário
Compartilhar em outros sites

Vamos lá... :chicote:  XD

 

"deve" não é o mesmo que "tem que ser". Mais aí eu vou dar um ponto pra você, 1x0

 

 

??? :seila:

 

:priv:

 

:muro:

 

:bandeira:

 

Pode sim... 1X1 XD   float f = (float)10/3;

 

:seila: Onde você fez o experimento?? Aqui: media = soma/12.0? :seila: Não vejo nenhum float, isso é um double :lol: . Não acredita?

Prova isso:

#include <stdio.h>int main() {        float f;        printf("Escreva 10.10 XD"); //XD    scanf( "%f", &f );        if ( f == 10.10 ){        printf ( "2X1" );            }else{        printf ( "1X2 XD" );    }        return 0;}

Que aconteceu? Conseguiu comparar? XD Lógico que não né, pois é, o float 10.10 do if, em realidade é tão float como o float da sua solução  "media = soma/12.0;". É um double hahah!!!! Quando você por 12.0, a variável soma, automaticamente se converte em double hahaha. Para que ele seja float você tem que fazer isso:

#include <stdio.h>int main() {        float f;        printf("Escreva 10.10 XD"); //XD    scanf( "%f", &f );        if ( f == 10.10f ){ //<---------------Aqui!!!!! (f)        printf ( "2X0" );            }else{        printf ( "1X1 XD" );    }        return 0;}

Ou seja... você "deve" por f ao lado do seu 12.0f, então acontece o chamado cast implícito, e tanto soma, como 12.0f se convertem em float. Si não ponho nada o programa o pode tomar como double, que é a mesma coisa que 12.0lf.

Bom... 1X1 XD

 

Olhe como agora não da erro si tudo fossem tipos iguais:

#include <stdio.h>int main() {        double f;        printf("Escreva 10.10 XD"); //XD    scanf( "%lf", &f );        if ( f == 10.10 ){        printf ( "2X0" );            }else{        printf ( "1X1 XD" );    }        return 0;}

Por isso falei anteriormente que era melhor que tudo "deveria" ser float, ou double, para evitar essas conversões de tipo implícitas.

 

 

ainda não... falta a f ao lado do 12.0 ;)

 

Então agora retire a eleição de melhor resposta do seu próprio post, e passe ela pra mim hahaha. É brincadeira hein hehe.

Sorte ;)

 

kkkkkk parece que você levou a sério demais meus comentários, não queria parecer agressivo, inclusive disse isso antes, a questão é que você me propôs uma solução (que também funcionava), porém existia uma mais simples.

 

Aliás qual a diferença de um float para um doble?

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!