Ir para conteúdo

POWERED BY:

Arquivado

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

marxrtf

Eliminar menor nota

Recommended Posts

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

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

<?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.00

Media: 7.00

Compartilhar este post


Link para o post
Compartilhar em outros sites
<?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

@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

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

 

É 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

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

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,50
5

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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
<?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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.