marxrtf 2 Denunciar post Postado Abril 21, 2016 Bom galera, tenho um sistema de notas para alunos. Ele tem 4 notas bimestrais, então faço a soma das 4 notas e as divido por 4 dando a média final. No exemplo nota no 1º = 6 2º =5 3º =7 4º =8 total de 26 e a média final sendo 6.5 Mas tenho que colocar uma nota extra como se fosse a recuperação, no caso acima se essa nota extra fosse 7, ela eliminaria a segunda nota acima que seria a 5 e daria a média final, se eu não precisasse lançar essa nota extra, ele teria de manter a soma e média das 4 notas normalmente. Tenho dois campos que mostram essas médias, um no campo administrativo e outra no boletim, abaixo mostro como estão as somas e média no momento. No boletim <? //Soma as Notas para o total $n1 = $notaD['n1']; $n2 = $notaD['n2']; $n3 = $notaD['n3']; $n4 = $notaD['n4']; $nota = $notaD['nota']; $notaTotal = $n1 / $nota + $n2 / $nota + $n3 / $nota + $n4 / $nota + $nota = $notaTotal; //Somo as faltas para o total $faltas = $notaD['faltas']; $totalFaltas = $faltas + $totalFaltas; $t++; } //Calcula Media por Materia $mediaMateria = $notaTotal/$coluna['totalP']; //Guardo a Media Total das Materias $mediaTotal = $mediaMateria + $mediaTotal; ?> <td width="75" align="center" bgcolor="#CFCFCF"> <? if($mediaMateria >= $media): $cor = "blue"; else: $cor = "red"; endif;?> <b style="color: <?=$cor?>"> <? echo number_format($mediaMateria, 2, ".", ",") ?> </b> </td> Postei o código inteiro, os dados bem do banco, aonde $n1, $n2, $n3, $n4 são as notas, e o $nota e o número divisor 4 que está no bd Então aí teria de entrar a nota $n5 que seria a nota extra ou recuperação, que deverá eliminar a nota mais baixa das $n1, $n2, $n3, $n4 e fazer a média. Na administração o cálculo está assim: { $media = ($linha["n1"] + $linha["n2"] + $linha["n3"] + $linha["n4"])/$linha["nota"]; echo number_format($media,2,".",","); Se alguém tiver uma solução ou mesmo uma forma mais simples que essa é mais funcional agradeço. Abraços. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Abril 21, 2016 Não conheço php , mas ca rregue as notas em um array , elimine a menor ocorrencia , uma apenas pois podem haver notas iguais , varra o array e calcule a média. http://php.net/manual/pt_BR/book.array.php Compartilhar este post Link para o post Compartilhar em outros sites
marxrtf 2 Denunciar post Postado Abril 21, 2016 Já fiz muita coisa e não deu resultado, meu entendimento encerrou, por isso pedindo uma bola aqui. Compartilhar este post Link para o post Compartilhar em outros sites
saidmrn 26 Denunciar post Postado Abril 21, 2016 Seguinte,tem 4 notas,a nota da recuperação deve substituir a menor nota correto ? $n1 = 7; $n2 = 1 ; $n3 = 7; $n4 = 2; $n5 = 10; $notas = array($n1,$n2,$n3,$n4); if(isset($n5)) { if($n5 > min($notas)) { $indice = array_search(min($notas),$notas); $notas[$indice] = $n5; } } print_r($notas); Saída do código anterior: Array ( [0] => 7 [1] => 10 [2] => 7 [3] => 2 ) O indice 0 é o primeiro bimestre,indice 1 o segundo ... suponhamos que ele tire : 7-1-7-2 ai ele pode fazer a recuperação,supondo que ele tirou 10,as notas dele vai ficar: 7-10-7-2 Este código substitui a menor nota. Se ele tirar 5-5-5-5 e na recuperação tirar 5,não vai alterar nada. O isset é pra checar se ele fez ou não a recuperação. Compartilhar este post Link para o post Compartilhar em outros sites
Matheus Tavares 167 Denunciar post Postado Abril 21, 2016 <?php $n1 = 5.5; $n2 = 7.5; $n3 = 10; $n4 = 3; $n5 = 5;#recuperacao / nota extra //poderia ter escrito as notas todas direto aqui //mas fiz assim para ficar mais facil de entender $notas = [ $n1, $n2, $n3, $n4, $n5 ]; //ordenamos em ordem crescente sort( $notas, SORT_NUMERIC ); //removemos a primeira nota do array ordenado, no caso a mais baixa $nota_mais_baixa = array_shift( $notas ); //calculamos a media aritmética $media = array_sum( $notas ) / count( $notas ); //exibimos printf( 'Nota mais baixa: %.2f<br>Media: %.2f', $nota_mais_baixa, $media ); Nota mais baixa: 3.00Media: 7.00 Compartilhar este post Link para o post Compartilhar em outros sites
marxrtf 2 Denunciar post Postado Abril 21, 2016 <?php $n1 = 5.5; $n2 = 7.5; $n3 = 10; $n4 = 3; $n5 = 5;#recuperacao / nota extra //poderia ter escrito as notas todas direto aqui //mas fiz assim para ficar mais facil de entender $notas = [ $n1, $n2, $n3, $n4, $n5 ]; //ordenamos em ordem crescente sort( $notas, SORT_NUMERIC ); //removemos a primeira nota do array ordenado, no caso a mais baixa $nota_mais_baixa = array_shift( $notas ); //calculamos a media aritmética $media = array_sum( $notas ) / count( $notas ); //exibimos printf( 'Nota mais baixa: %.2f<br>Media: %.2f', $nota_mais_baixa, $media ); Essa sua situação printou na tela a eliminação da nota menor e destacando a nota maior, porém tentei várias coisas e não consegui ver como o fazer funcionar dentro do meu código. A lógica funcionou, porém não conseguir fazer dentro das formulas existentes no meu código postado, ele printa uma tela extra apenas. Vou tentar mais algumas mudanças aqui e retorno. Compartilhar este post Link para o post Compartilhar em outros sites
Matheus Tavares 167 Denunciar post Postado Abril 21, 2016 @marxrtf É justamente essa a ideia. O exemplo é para fins didáticos. Cabe a você estudá-lo e adaptá-lo às suas necessidades. Faça suas tentativas e se não conseguir, poste onde você está tendo dificuldades. []s e bons estudos! Compartilhar este post Link para o post Compartilhar em outros sites
marxrtf 2 Denunciar post Postado Abril 21, 2016 Consegui implantar ele na parte administrativa, já no boletim está complicado. Mas já vi que deu o resultado. Vou tentar por aqui e deixar esse tópico sem finalização, pois posso precisar de algum detalhe para fechar ou complicação que venha a dar. Mas já agradeço. Compartilhar este post Link para o post Compartilhar em outros sites
marxrtf 2 Denunciar post Postado Abril 22, 2016 @marxrtf É justamente essa a ideia. O exemplo é para fins didáticos. Cabe a você estudá-lo e adaptá-lo às suas necessidades. Faça suas tentativas e se não conseguir, poste onde você está tendo dificuldades. []s e bons estudos! Matheus Tavares, Muito obrigado mesmo. Deu tudo certo, consegui implementar tanto na administração como no boletim. Uma pergunta: Sempre quando se faz esses cálculos fica 0.00, você ou algum amigo aqui sabe como ocultar esse valor se não tiver valores? Se tiver qualquer nota tipo 6.00 aparece, mas se for 0.00 ficaria em branco. Porquê as colunas já auto inserem o 0.00 antes de ter qualquer nota, como não vem do banco e sim do calculo no php, Não sei como ocultar se tiver resultado 0.00. Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Abril 22, 2016 Ai é condicional, se é no momento do echo, use o operador ternário, pois não exigirá muitas linhas de código. echo $nota > 0 ? 'nota maior que zero' : 'nota igual/menor que zero'; Compartilhar este post Link para o post Compartilhar em outros sites
Matheus Tavares 167 Denunciar post Postado Abril 22, 2016 Você pode fazer algo assim: <?php function exibirCasasDecimaisSomenteSeHouver( $numero, $quantidade_de_casas = 2 ) { if ( (float)( $numero - (int)$numero ) > 0.0 ) return number_format( $numero, (int)$quantidade_de_casas, ',', '.' ); else return (int)$numero; } echo exibirCasasDecimaisSomenteSeHouver( 5.5 ); echo '<br>'; echo exibirCasasDecimaisSomenteSeHouver( 5.00 ); 5,505 Compartilhar este post Link para o post Compartilhar em outros sites
marxrtf 2 Denunciar post Postado Abril 23, 2016 Agradeço ao Gabriel e ao Matheus por essa bola de retirar o 0.00, mas com o próprio código postado do Matheus para a função da média da recuperação, fiz alguns ajustes e ele eliminou o 0.00 Mas agora peço outra ajuda. Nessa função do Matheus tudo funcional perfeito, agora não sei se é possível, mas vamos lá. Ficou assim e fiz um teste n1 1º = 1.00 n2 2º = 7.00 n3 3º = 7.00 n4 4º = sem nota lançada n5 Rec; = sem nota lançada Na média ele da o valor de 3.25. Então ele está pegando as 3 notas lançadas e dividindo por 4. Entendo que a linha a seguir seria essa, mas não teria como dar o valor de 5.00? No caso se tem 3 notas lançadas ele dividira por 3 na média, como se tivesse 2 lançadas até o momento ele dividisse por 2. Isso porque sendo a média 7 no meu exemplo se o aluno tivesse tirado nas 3 primeiras notas 7, 7 e 7, ele estaria até então com a nota na média e no meu caso com cor azul, já que na divisão por 3 ele daria 7. No caso ele dividindo por 4, ele teria 5.25, estaria com o resultado da média abaixo da média e vermelha. Não sei se é possível Matheus, dentro do seu código que você me passou. Compartilhar este post Link para o post Compartilhar em outros sites
Matheus Tavares 167 Denunciar post Postado Abril 23, 2016 Bom, não sei como você implementou, mas a ideia é bem simples. Levando em consideração que as notas vazias possuem valor NULL, você poderia remover as notas inexistentes antes de fazer os cálculos. Para remover os NULL do array, você pode fazer isso: array_filter( $notas, function( $nota ){ return !is_null( $nota ); } ); Compartilhar este post Link para o post Compartilhar em outros sites
marxrtf 2 Denunciar post Postado Abril 23, 2016 <?php $n1 = 5.5; $n2 = 7.5; $n3 = 10; $n4 = 3; $n5 = 5;#recuperacao / nota extra //poderia ter escrito as notas todas direto aqui //mas fiz assim para ficar mais facil de entender $notas = [ $n1, $n2, $n3, $n4, $n5 ]; //ordenamos em ordem crescente sort( $notas, SORT_NUMERIC ); //removemos a primeira nota do array ordenado, no caso a mais baixa $nota_mais_baixa = array_shift( $notas ); //calculamos a media aritmética $media = array_sum( $notas ) / count( $notas ); //exibimos printf( 'Nota mais baixa: %.2f<br>Media: %.2f', $nota_mais_baixa, $media ); Bom Matheus, tentei aqui e não consegui. Deixa eu me orientar melhor. Dentro do seu exemplo acima, aonde você faria essa mudança? Assim acho que conseguiria me achar melhor aqui. Compartilhar este post Link para o post Compartilhar em outros sites
Matheus Tavares 167 Denunciar post Postado Abril 23, 2016 Nas linhas iniciais nós inserimos todas as notas no array, correto? Mas agora surgiu a necessidade de filtrarmos as notas não definidas / nulas. Então você tem duas opções: 1 - Simplesmente não inserir no array quando a nota não existir (NULL). ou... 2 - Após inserir todas, use o array_filter para remover as NULL. Isso seria após a linha $notas = [ ... ]; Compartilhar este post Link para o post Compartilhar em outros sites
marxrtf 2 Denunciar post Postado Abril 23, 2016 Nas linhas iniciais nós inserimos todas as notas no array, correto? Mas agora surgiu a necessidade de filtrarmos as notas não definidas / nulas. Então você tem duas opções: 1 - Simplesmente não inserir no array quando a nota não existir (NULL). ou... 2 - Após inserir todas, use o array_filter para remover as NULL. Isso seria após a linha $notas = [ ... ]; Tentei aqui mas nada, continua fazendo a divisão por 4. E estou tentando fazer pelo seu código passado para ver se deu certo para depois fazer as mudanças, mas não funcionou do jeito que você falou. Por isso pedi para você o incluir no local correto para eu ver, tentei após a linha $notas = [...], mas nada. Compartilhar este post Link para o post Compartilhar em outros sites
Matheus Tavares 167 Denunciar post Postado Abril 23, 2016 Então as notas inexistentes provavelmente não são nulas. Você precisa verificar isso, pode ser assim: $notas = [ $n1, $n2, $n3, $n4, $n5 ];//apos essa linha echo '<pre>'; var_dump( $notas ); Entenda que as notas serão removidas desde que sejam NULL (que representa para nós: não cadastradas). Se as notas que você quer remover do array estiverem com valor string vazio '', ou inteiro 0 ou qualquer outra coisa, não é removido. Não sei como você está cadastrando isso no seu BD, mas se vc estiver utilizando uma tabela com colunas tipo "nota1", "nota2", etc (o que é errado...), você precisa se certificar de que, na hora da inserção dessas informações, as notas que ainda não existem recebam valor NULL (sem aspas). Entenda sobre tipos no PHP: http://php.net/manual/pt_BR/language.types.php Compartilhar este post Link para o post Compartilhar em outros sites
marxrtf 2 Denunciar post Postado Abril 23, 2016 Deixa eu mostrar aqui como eu fiz se baseando em seu código //Soma as Notas para o total $n1 = $notaD["n1"]; $n2 = $notaD["n2"]; $n3 = $notaD["n3"]; $n4 = $notaD["n4"]; $n5 = $notaD["nota"];#recuperacao / nota extra //poderia ter escrito as notas todas direto aqui //mas fiz assim para ficar mais facil de entender $notas = [ $n1, $n2, $n3, $n4, $n5 ]; //ordenamos em ordem crescente sort( $notas, SORT_NUMERIC ); //removemos a primeira nota do array ordenado, no caso a mais baixa $nota_mais_baixa = array_shift( $notas ); //calculamos a media aritmética $mediaMateria = array_sum( $notas ) / count( $notas ); //exibimos printf( 'Nota mais baixa: %.2f<br>Media: %.2f', $nota_mais_baixa, $mediaMateria ); Acima fiz como você me explicou, apenas a diferença é que estou puxando as notas do banco. Dei nota 1 para o n1, nora 7 para o n2 e nota 7 para n3. já n4 e n5 que é a recuperação estão vazias no banco, então trazendo o resultado null. Abaixo a adaptação que fiz para na tabela ele voltar as informações do código. } //Calcula Media por Materia $mediaMateria; $nota_mais_baixa; //Guardo a Media Total das Materias $mediaTotal = $mediaMateria + $mediaTotal; ?> <td width="75" align="center" bgcolor="#CFCFCF"> <? if($mediaMateria >= $media): $cor = "blue"; else: $cor = "red"; endif;?> <b style="color: <?=$cor?>"> <? echo number_format($mediaMateria, 2, ".", ",") ?> </b> </td> <td width="75" align="center" bgcolor="#CFCFCF"><b><?= $totalFaltas ?></b></td> <td width="75" align="center" bgcolor="#CFCFCF"> <? if($nota_mais_baixa >= $media): $cor = "blue"; else: $cor = "red"; endif;?> <b style="color: <?=$cor?>"> <? echo number_format($nota_mais_baixa, 2, ".", ",") ?> </b> </td> Então em uma tabela ele me traz a média e na outra ele me da a menor nota eliminada se tiver a nota de recuperação. Se não tiver nota da recuperação ele deixa vazio. Então até aí tá funcional. Mas ele divide por 4 sempre. Compartilhar este post Link para o post Compartilhar em outros sites
Matheus Tavares 167 Denunciar post Postado Abril 23, 2016 Faça o var_dump() e poste o resultado. É ele quem diz se essas variáveis são de fato NULL ou outra coisa. Se puder, tire uma print dessas linhas (notas) no seu banco também. Compartilhar este post Link para o post Compartilhar em outros sites
marxrtf 2 Denunciar post Postado Abril 23, 2016 Creio que primeiro agora terei de tratar os valores null, Pois realmente ele está gravando em branco no mysql. Então além de por padrão eu ter de deixar null no mysql, terei de tratar o updade para gravar null também. no mysql está assim que mudei agora `n1` varchar(10) default NULL, `n2` varchar(10) default NULL, `n3` varchar(10) default NULL, `n4` varchar(10) default NULL, E no local que faz o updade das notas é esse <input name="form_n4[]" type="text" value="<?=@mysql_result(mysql_query("SELECT n4 FROM notas WHERE id_aluno=$_GET[id] AND id_periodo=$col_periodo[id_periodo] AND id_serie=$_SESSION[id_serie] AND id_materia=$_SESSION[id_materia]"),0,n4)?>" size="6" maxlength="4" onKeydown="FormataMoeda(this,10,event)" onkeypress='return SomenteNumero(event)'> <input type="hidden" name="form_periodo[]" value="<?=$col_periodo[id_periodo]?>"> Compartilhar este post Link para o post Compartilhar em outros sites