Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Bug menor lance

Boa tarde,

Não entendi a explicação do porquê ocorre o erro do menor lance, que retorna o valor 1.7976931348623157e+308. Já assisti todos os vídeos da unidade e no último deles a solução é deixar dois if´s, contudo continuo sem entender as explicações.

Ao instrutor, peço por gentileza esclarecer melhor.

Obrigado,

2 respostas
solução!

Olá Frederico.

Vamos fazer o teste mesa, porque ele facilita muito o entendimento do código.

No incio atribuímos o maior e menor números possíveis para as nossas variáveis.

self.maior_lance =  sys.float_info.max
self.menor_lance = sys.float_info.min

Depois quando é feito o primeiro lance, vamos dizer que é o lance de 100, ele vai verificar se 100 é maior que o maior lance ( if lance.valor > self.maior_lance: ) e vai ser, já que o maior lance está com o valor do menor numero possível, então a variável self.maior_lance agora guarda o valor de 100.

for lance in leilao.lances:
    if lance.valor > self.maior_lance:
        self.maior_lance = lance.valor
    elif lance.valor < self.menor_lance:
        self.menor_lance = lance.valor

Mas o importante é que, por ele ter entrado no if ele não vai entrar no else elif e dessa maneira o self.menor_lance vai continuar guardando o maior numero possível.

Isso já gera um 'erro', já que quando é feito primeiro lance, ele deveria ser tanto o maior lance quanto o menor lance, já que só existe ele, mas vamos seguir para entender onde o problema maior aparece.

Agora quando é feito o segundo lance, vamos dizer que é o lance de 150. Ele passa por todos os lances, repetindo a logica com o valor 100 e quando ele vai verificar se 150 é maior que o maior lance ( if lance.valor > self.maior_lance: ), ele vai ser, já que o maior lance está com o valor de 100, então a variável self.maior_lance agora guarda o valor de 150.

for lance in leilao.lances:
    if lance.valor > self.maior_lance:
        self.maior_lance = lance.valor
    elif lance.valor < self.menor_lance:
        self.menor_lance = lance.valor

Então após 2 lances, nosso programa está incorreto, porque nosso menor lance deveria ser o 100 e o maior o 150, porem o nosso menor_lance ainda guarda o maior numero possível que atribuímos no inicio do programa.

Resolvemos isso tirando o elif e permitindo que um valor possa ser o maior e menor lance ao mesmo tempo, algo que sempre acontece na primeira rodada.

Vamos fazer o teste de mesa agora com essa correção:

Quando é feito o primeiro lance, que é o lance de 100, ele vai verificar se 100 é maior que o maior lance ( if lance.valor > self.maior_lance: ) e vai ser já que o maior lance está com o valor do menor numero possível, então a variável self.maior_lance agora guarda o valor de 100.

for lance in leilao.lances:
    if lance.valor > self.maior_lance:
        self.maior_lance = lance.valor
    if lance.valor < self.menor_lance:
        self.menor_lance = lance.valor

Agora acontece uma mudança, porque apos o if temos outro if que vai ser verificado lance.valor < self.menor_lance:, nosso lance de 100 é menor que self.menor_lance, sim porque o valor atual dele é o maior numero possível, então a variável self.maior_lance agora guarda o valor de 100.

E quando é feito o segundo lance, que é o lance de 150. Ele passa por todos os lances, repetindo a logica com o valor 100 e quando ele vai verificar se 150 é maior que o maior lance ( if lance.valor > self.maior_lance: ), ele vai ser já que o maior lance está com o valor de 100, então a variável self.maior_lance agora guarda o valor de 150. E também vai verificar se o 150 é menor que o menor lance que é o 100, algo que não é verdade então a varável self.menor_lance continua guardando o 100

for lance in leilao.lances:
    if lance.valor > self.maior_lance:
        self.maior_lance = lance.valor
    if lance.valor < self.menor_lance:
        self.menor_lance = lance.valor

Então agora nosso código diz uma verdade, dos lances feitos o maior foi o de 150 e o menor foi o de 100.

Espero ter ajudado, recomendo sempre simular o código em um papel ou escrevendo no próprio código para tentar entende-lo melhor como ele está funcionando, mas qualquer duvida não hesite em perguntar.

Bons Estudos.

Perfeito!

Muito obrigado pela explicação detalhada, sensacional!

Abs,