Ir para conteúdo

POWERED BY:

Arquivado

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

paivadaniel

Variáveis em C

Recommended Posts

Olá, fiz um programa que simplesmente é a representação de uma fórmula, do coeficiente de correlação de pearson, meu resultado é um número real, podendo ser 0,9114 por exemplo, ou até uma dízima períodica simples ou composta.

Gostaria de saber qual o melhor tipo de dados para se trabalhar com as variáveis tomando o programa abaixo como modelo, quem responder primeiro analise o programa antes de responder. Para vetores iguais (no caso 1,2,3,4,5), o valor printado, ou seja, o valor de r, deve ser 1. Porém, como estou trabalhando com int, para todos os outros casos eu estou tendo 0 como resultado (deveria encontrar 0,78 por exemplo, e não zero), e o intervalo de resultados possíveis deve compreender -1 até +1, ou seja, também pode haver resultados negativos. Já tentei long int e float mas o erro persiste.

 

Segue o código do programa:

 

 

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define TAM_MAX 5

int main()
{

int v1[TAM_MAX] = {1,2,3,4,5};
int v2[TAM_MAX] = {1,2,3,4,5};
int r;
int i = 0;

// variáveis numerador

int somatoria_v1;
int somatoria_v2;
int produto_somatoria_v1_v2;
int somatoria_produto_v1_v2;
int numerador;

// variáveis denominador

int somatoria_quadrado_v1;
int somatoria_quadrado_v2;
int quadrado_somatoria_v1;
int quadrado_somatoria_v2;
int denominador_sem_raiz;
int denominador;

// numerador

while (i<TAM_MAX) {
somatoria_v1 += v1[i];
i++;
}

i=0;

while (i<TAM_MAX) {
somatoria_v2 += v2[i];
i++;
}

produto_somatoria_v1_v2 = (somatoria_v1)*(somatoria_v2);

i = 0;

while (i<TAM_MAX) {
somatoria_produto_v1_v2 += v1[i]*v2[i];
i++;
}

numerador = (TAM_MAX*(somatoria_produto_v1_v2) - (produto_somatoria_v1_v2));

// denominador

quadrado_somatoria_v1 = somatoria_v1*somatoria_v1;
quadrado_somatoria_v2 = somatoria_v2*somatoria_v2;

i = 0;

while (i<TAM_MAX) {
somatoria_quadrado_v1 += v1[i]*v1[i];
i++;
}

i = 0;

while (i<TAM_MAX) {
somatoria_quadrado_v2 += v2[i]*v2[i];
i++;
}

denominador_sem_raiz = ((TAM_MAX*somatoria_quadrado_v1) - (quadrado_somatoria_v1))*((TAM_MAX*somatoria_quadr ado_v2)-(quadrado_somatoria_v2));
denominador = (0,707*denominador_sem_raiz)*(0,707*denominador_se m_raiz);

r = numerador/denominador;

printf ("%d\n", r);

system("pause");
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

A inicialização das variáveis não é automática. Em Java, por exemplo, se você não atribuir um valor aos ints, a máquina atribui zero.

 

while (i < TAM_MAX) {
   somatoria_v1 += v1[i];
   i++;
}

 

Aqui você está somando os elementos do array v1 a um lixo qualquer existente na memória.

 

Dica: os dois whiles podem ser substituídos por apenas 1 for:

 

for (int i=0; i < TAM_MAX; i++) {
   somatoria_v1 +=  v1[i];
   somatoria_v2  += v2[i];
}

 

O mesmo pode ser feito na somatória dos quadrados.

 

P/ trabalhar com números inteiros grandes existe o long int e o long long. Para ponto flutuante existe o double e o long double (1989, 1999). Como tudo depende do compilador, veja qual dos tipos é suportado pelo seu. O que ocorre na divisão é que você está usando inteiros. Se você não fizer casting de tipos, a divisão SEMPRE será inteira, ignorando completamente a parte decimal. Ou você usa somente floats ou doubles onde existem int ou faz

 

double r = (double)numerador/(double) denominador;

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.