Ir para conteúdo

POWERED BY:

Arquivado

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

Ringeril

[Resolvido] Calculando algo no PHP

Recommended Posts

Boa noite,

Gostaria de ajuda para fazer um calculo no PHP, preciso que criar uma fórmula pra fazer isso.

Exemplo:

Y é 350, X é 0.
Conforme Y diminuir, X aumenta mas X só pode valer até 10.
Quando Y chegar a 0, X é obrigado a valer 10.
Ou seja, não sei como fazer.

Exemplo 2:

Y é 20, X é 0.
Y é 19, X é 0.
Y é 18, X é 1.
Y é 17, X é 1.
Y é 16, X é 2.
Y é 15, X é 2.
Y é 14, X é 3.
Y é 13, X é 3.
Y é 12, X é 4.
Y é 11, X é 4.
Y é 10, X é 5.
Y é 9, X é 5.
Y é 8, X é 6.
Y é 7, X é 6.
Y é 6, X é 7.
Y é 5, X é 7.
Y é 4, X é 8.
Y é 3, X é 8.
Y é 2, X é 9.
Y é 1, X é 9.
Y é 0, X é 10.
Agora como faria isso se o Y fosse 350 ou parecido.

Preciso de uma fórmula.

 

Abraço e obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Ringeril,

 

Ficou um tanto confuso o que você precisa, mas vamos pelo que eu entendi:

 

Primeiro, vamos usar um loop para demonstrar:

<?php
$valor = 20;

for ( $x = 0 , $y = $valor , $z = 0 ; $y > 0 ; --$y , ++$z ){
if ( ( $z % 2 ) == 0 ){
	if ( ++$x > 10 ) $x = 0;
}

printf( 'Y é %2d, X é %2d%s' , $y , $x , PHP_EOL );
}

printf( 'O valor final de X é %d%s' , $x , PHP_EOL );

 

A saída desse fragmento será:

Y é 20, X é 1
Y é 19, X é 1
Y é 18, X é 2
Y é 17, X é 2
Y é 16, X é 3
Y é 15, X é 3
Y é 14, X é 4
Y é 13, X é 4
Y é 12, X é 5
Y é 11, X é 5
Y é 10, X é 6
Y é 9, X é 6
Y é 8, X é 7
Y é 7, X é 7
Y é 6, X é 8
Y é 5, X é 8
Y é 4, X é 9
Y é 3, X é 9
Y é 2, X é 10
Y é 1, X é 10
O valor final de X é 10

Como pode ver, é exatamente o que você ilustrou ser sua necessidade. Se analisarmos bem, a cada duas descidas de Y, sobe um X. Como X pode valer apenas até 10, se X for maior ele deverá ser 0.

 

Como precisamos de duas descidas de Y, então temos na verdade apenas 1/2 Y:

$valor = 20;
$y = $valor / 2;

 

Como o valor máximo de X é 10 e, se for maior ele assumirá 0, então basta utilizarmos o resto da divisão euclidiana:

<?php
$valor = 20;
$y = $valor / 2;
$x = $y % 11;

printf( 'O valor final de X é %d%s' , $x , PHP_EOL );

 

A saída será:

O valor final de X é 10

Usando apenas 1 linha:

<?php
$y = 350;
$x = ( $y / 2 ) % 11;

printf( 'O valor final de X é %d%s' , $x , PHP_EOL );

 

Novamente a saída será:

O valor final de X é 10

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa, você é realmemte bom. http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

Mas nesse código:

$y = 350;
$x = ( $y / 2 ) % 11;

printf( 'O valor final de X é %d%s' , $x , PHP_EOL );
O Y diminui o X a cada duas decidas. mas não pode ser assim.

Pois se Y fosse 40 ele teria que aumentar o X a cada 4 decidas.

Teria que ser proporcional.

 

Ainda nesse código:

$y = 350;
$x = ( $y / 2 ) % 11;

printf( 'O valor final de X é %d%s' , $x , PHP_EOL );
A saida tem que ser:

O valor final de X é 0
Se Y fosse 0 ai sim a saida seria:

O valor final de X é 10

Mas e se o Y fosse aleatório como ficaria?

 

Abraço e obrigado desde já. http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois se Y fosse 40 ele teria que aumentar o X a cada 4 decidas.

@Ringeril,

 

Como eu disse no primeiro post, está muito confuso o que você precisa, no primeiro tópico você não mencionou em nenhum momento essa proporção.

 

Explique com mais detalhes o que você precisa, só assim será possível te ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só ler os dois juntos que dá pra entender. Um resumo:

Y é aleatório. O minimo de X é 0, o máximo é 10.

Y é 40, X é 0.
Y é 20, X é 5.
Y é 0, X é 10.
Proporcionalmente.

Y é 100, X é 0.
Y é 50, X é 5.
Y é 0, X é 10.
Mas Y é aleatório.

Y é 218, X é 0.
Y é 152.6, X é ???.
Y é 109, X é 5.
Y é 72.1, X é ???.
Y é 0, X é 10.
Como calcular o X nessas condições?

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

X vai de 0 a 10 dentro de YN intervalos

Cada valor inteiro de X vai ser chamado de intervalo_X = 11(se vai de 0 a 10, são 11 valores) / YN

 

Y descresce de X0 até XN formando um intervalo = Y0 - YN

Cada valor inteiro do intervalo vale o intervalo_total / intervalo_X

 

Y descresce irregularmente, mas segue uma proporção quanto ao intervalo_total.

Proporção = intervalo_irregular / intervalo_total

 

para saber o quanto devemos acrescer a X, basta multiplicar a proporção pelo total de intervalos

 

na prática

$y = array(10,9,8,7,6,5,4,3,2,1,0); // fictício para ilustração TODO: remover
$x[0] = 0;
foreach($i = 1; $i < $intervalos; $i++) $x[$i] = ($y[$i] - $y[$i - 1]) / ($y[0] - $y[$intervalos - 1]) / 11 / sizeof($y); * $intervalos;

Compartilhar este post


Link para o post
Compartilhar em outros sites

tem um ponto-e-vírgula sobrando ali

$y = array(10,9,8,7,6,5,4,3,2,1,0); // fictício para ilustração TODO: remover
$x[0] = 0;
foreach($i = 1; $i < $intervalos; $i++) $x[$i] = ($y[$i] - $y[$i - 1]) / ($y[0] - $y[$intervalos - 1]) / 11 / sizeof($y) * $intervalos;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Evandro, sua explicação foi muito boa. :lol:

Mas o código não está funcionando.

$y = array(10,9,8,7,6,5,4,3,2,1,0); // fictício para ilustração TODO: remover
$x[0] = 0;
foreach($i = 1; $i < $intervalos; $i++) $x[$i] = ($y[$i] - $y[$i - 1]) / ($y[0] - $y[$intervalos - 1]) / 11 / sizeof($y) * $intervalos;
Dá erro no FOREACH. Então substitui por FOR, dai deu erro na variavel $INTERVALOS, que não existe.

Tentei o valor dela de várias maneiras:

$intervalos = 10; //o valor máximo de X
$intervalos = 250; //o mesmo valor Y
$intervalos = sizeof($y); //?????
Mas o erro a partir dai foi que x[$i] está fazendo divisão por 0. Pois não há valores nos colchetes: x[$i].

Então tirei todos os colchetes, e o código não roda mais...

Como resolvo isso? ^_^

 

Abraço e muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

nossa! eu tava dormindo aqui kkkk

foreach no formato de for

adicione antes do for isso aqui

$intervalos = sizeof($y)

Compartilhar este post


Link para o post
Compartilhar em outros sites

OK Evandro, agora seu código rodou.

Mas não é isso o que eu quero, ou pelo menos o retorno do código não dá certo.

Vou explicar com código:

$max = 260; // Máximo para Y
$y = rand(0,$max); // Pega número aleatório de 0 ao Máximo para Y
if($y == 0){
   $x = 10; // Se Y é 0, X é 10
}else if($y == $max/2){
   $x = 5; // Se Y é Metade do Máximo, X é 5
}else if($y == $max){
   $x = 0; // Se Y é Máximo, X é 0
}else{
   $x = ???; // Agora se Y for qualquer outro número entre 0 e o Máximo ele é ???
}
Ou seja.

Y é aleatório.
Se Y é 260, X é 0.
Se Y é 205, X é ???.
Se Y é 130, X é 5
Se Y é 105.54, X é ???.
Se Y é 0, X é 10.

Abraço e obrigado pela ajuda e atenção!

Compartilhar este post


Link para o post
Compartilhar em outros sites

o segredo está na parte de descobrir a proproção do intervalo pelo intervalo original.

 

$yn = sizeof($y);
for ($i = 0; $i < $yn; $i++) echo "se Y é {$y[$i]}, X é ".(($y[$i] - $y[$i - 1]) / $max * 10);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rodando o código:

<?php
$max = 10;
$y = 250;
$yn = sizeof($y);
for ($i = 0; $i < $yn; $i++) echo "se Y é {$y[$i]}, X é ".(($y[$i] - $y[$i - 1]) / $max * 10)."<br>";
?>
Retorna:

se Y é , X é 0
Sem definição para o X.

 

Já rodando desse jeito:

<?php
$max = 10;
$y = array(10,9,8,7,6,5,4,3,2,1,0);
$yn = sizeof($y);
for ($i = 0; $i < $yn; $i++) echo "se Y é {$y[$i]}, X é ".(($y[$i] - $y[$i - 1]) / $max * 10)."<br>";
?>
Retorna:

se Y é 10, X é 10
se Y é 9, X é -1
se Y é 8, X é -1
se Y é 7, X é -1
se Y é 6, X é -1
se Y é 5, X é -1
se Y é 4, X é -1
se Y é 3, X é -1
se Y é 2, X é -1
se Y é 1, X é -1
se Y é 0, X é -1

Ainda não dá certo. :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu não to sabendo aplicar a lógica na codificação =x

 

me explica duas coisas, eu tenho um número indefinido de Y's e o número de X's é sempre igual ao de Y's, certo?

 

6 Y's, geram 6 X's

 

o último valor de Y vai ser SEMPRE 0?

 

aqui deu certo:

// opcional
$y[0] = rand(1,30);
$i = 0;
while($y[$i] > 0) {
$y[] = rand(0,($y[$i] - 1));
$i++;  
}

// necessário
$x[0] = 0;
$indices = sizeof($y);
for($i = 1; $i < $indices; $i++){
$x[$i] = ($x[$i - 1] + ($y[$i] - $y[$i - 1]) / $y[0] * -10);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara muito bom, seu código funcionou certinho, só mudei algumas coisas:

$y[0] = rand(0,30);
$i = 0;
while($y[$i] > 0) {
        $y[] = ($y[$i] - 1);
        $i++;  
}

// necessário
$x[0] = 0;
$indices = sizeof($y);
for($i = 1; $i < $indices; $i++){
        $x[$i] = ($x[$i - 1] + ($y[$i] - $y[$i - 1]) / $y[0] * - 10);
}
Tive que adicionar um array_reverse() no retorno do código. Nada de mais.

 

Case Closed. http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

Muito obrigado mesmo, ajudou muito! http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Abraço!!

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.