Ringeril 0 Denunciar post Postado Março 27, 2010 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
João Batista Neto 448 Denunciar post Postado Março 27, 2010 @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
Ringeril 0 Denunciar post Postado Março 27, 2010 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 é 0Se 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
João Batista Neto 448 Denunciar post Postado Março 27, 2010 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
Ringeril 0 Denunciar post Postado Março 27, 2010 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
Evandro Oliveira 331 Denunciar post Postado Março 28, 2010 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
Evandro Oliveira 331 Denunciar post Postado Março 28, 2010 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
Ringeril 0 Denunciar post Postado Março 28, 2010 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
Evandro Oliveira 331 Denunciar post Postado Março 28, 2010 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
Ringeril 0 Denunciar post Postado Março 28, 2010 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
Evandro Oliveira 331 Denunciar post Postado Março 28, 2010 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
Ringeril 0 Denunciar post Postado Março 29, 2010 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
Evandro Oliveira 331 Denunciar post Postado Março 29, 2010 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
Ringeril 0 Denunciar post Postado Março 29, 2010 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