Ir para conteúdo

POWERED BY:

Arquivado

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

Raphael C.

Função Media

Recommended Posts

Bom galera, eu estou fazendo uma classe com diferentes operações matemáticas, e comecei a ter problemas na media e media ponderada:

Qual é ele?

Eu não consigo gerar loop dentro de uma variável.

Eis meu código:

 

 

<?
function media($valor) {
$contar = count(explode(', ', $valor))
for ($i=0; $i<$contar; $i++){
	$soma = foreach(", ","",$valor1);
}
	$resultado = $soma / $contar;
	echo "$resultado";
}

media("10, 20, 30");
?>

O Sistema da média ponderada é a mesma coisa, resolvendo esse eu termino ele.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na média aritmetica, você pode utilizar func_get_args() e func_num_args(). Veja como fica simples:

 

function avg() {
return array_sum( func_get_args() ) / func_num_args();
}

 

Você pode passar quantos argumentos quiser, que ela irá retornar a média desses argumentos.

 

echo avg( 1, 2 ); // 1.5
echo avg( 10, 20, 30 ); // 20
echo avg( 20, 50 ) // 35

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só tem um problema com essa função André, veja:

 

avg( 'A', 'B', 1 ); // 0.333333333

Isso porque, desde o PHP 4.2.1, array_sum() converte os tipos dos valores do array passado para inteiros e, como uma letra não é um número, é convertido para zero.

 

O problema maior está na segunda metade da "fórmula", pois para func_get_args() não importa se você está passando inteiro, string, objeto ou tudo junto, ele apenas contará, logo:

 

avg( 'A', 'B', 1 );

É o mesmo que:

avg( 0, 0, 1 ); // ( 0 + 0 + 1 / 3 ) = 1 / 3 = 0.333333333

Então, uma correçãozinha rápida, seria remover os índices nulos (zeros) que caracterizaria a divisão:

 

function avg() {

   $args = array_map( 'intval', func_get_args() );

   return array_sum( $args ) / count( array_filter( $args ) );
}

Podem haver outras mais eficientes, mas essa é uma delas ;)

 

P.S.: Tudo isso pderia ter sido evitado se houvesse uma Função Matemática nativa para calcular média. <_<

Compartilhar este post


Link para o post
Compartilhar em outros sites

A média aritmética ponderada está com um problema:

O Resultado está indo além do esperado, eu estou somando todos os valores e multiplicando pelo peso, mas no caso teria que multiplicar o valor pelo peso um por um e depois somar e dividir pela soma dos pesos.

 

Eis o código, sem a parte da divisão:

Function media_ponderada($quantidade, $peso){
$peso = explode(', ', $peso);
$quantidade = explode(', ', $quantidade);
        return array_sum($quantidade)*array_sum($peso);
}

Para testar estou usando o exemplo abaixo:

media_ponderada("3, 9", "1, 2")

 

Nesse caso deveria resultar em 21, porém esta dando 36

Compartilhar este post


Link para o post
Compartilhar em outros sites

Média aritmética ponderada:

M = (p[1]x[1] + p[2]x[2] + ... + p[n]x[n])/(p[1] + p[2] + ... + p[n])

No caso,você está fazendo:

M = (x[1] + x[2] + ... + x[n])(p[1] + p[2] + ... + p[n])

O que é totalmente diferente do apresentado.

A função poderia ser algo como:

<?php
function pAvg()
{
    $args = func_get_args();
    $s = 0;
    $q = 0;
    foreach($args as $arg) {
        $s += array_product($arg);
        $q += $arg[1];
    }
    return $s/$q;
}

echo pAvg(array(10,2),array(10,1));
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

function avg() {

   $args = array_map( 'intval', func_get_args() );

   return array_sum( $args ) / count( array_filter( $args ) );
}

 

Pra mim funcionou assim:

function media_aritmetica($vetor) {
   if (count( array_filter( $vetor ))!=0) {
       return array_sum($vetor) / count(array_filter($vetor));
   } else {
       return false;
   }
}

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.