3
respostas

[Dúvida] Saída errada do meu sistema

Boa tarde à todos.

Estou construindo (ou pelo menos tentando) um sistema que calcula o melhor custo benefício na compra/comparação de cerveja. basicamente o sistema pergunta quantas cervejas o usuário quer comparar, qual o tamanho da cerveja e o valor dessa cerveja.

Hoje o sistema devolve qual a cerveja de melhor custo benefício. Porém estou com um problema e não estou conseguindo avançar na solução dele. O problema é o seguinte:

  1. Ao preencher duas ou mais cervejas do mesmo tamanho e valor o sistema sempre está informando a primeira cerveja preenchida como melhor custo benefício. Não estou conseguindo tratar isso e informar que as cervejas possuem o mesmo custo benefício.

Segue o código como está hoje:

class Cerveja:
    # Função construtora do objeto Cerveja
    def __init__(self, nome, quantidade_ml, valor):
        self.nome = nome
        self.quantidade_ml = quantidade_ml
        self.valor = valor

    # Função que calcula o custo por litro
    def calcular_custo_litro(self):
        quantidade_litros = self.quantidade_ml / 1000
        melhor_custo = self.valor / quantidade_litros
        return melhor_custo

    # Função para obter o melhor custo
    def obter_cerveja_melhor_custo(cervejas):
        melhor_custo = float('inf')
        cerveja_melhor_custo = None

        for cerveja in cervejas:
            custo_litro = cerveja.calcular_custo_litro()
            if custo_litro < melhor_custo:
                melhor_custo = custo_litro
                cerveja_melhor_custo = cerveja

        return cerveja_melhor_custo


    # Função auxiliar para ler a entrada do usuário
    def ler_entrada():
        quantidade_cervejas = int(input("Digite a quantidade de cervejas: "))

        cervejas = []
        for i in range(quantidade_cervejas):
            nome = input(f"Digite o nome da cerveja {i + 1}: ")
            quantidade_ml = float(input(f"Digite a quantidade em mililitros da cerveja {i + 1}: "))
            valor = float(input(f"Digite o valor da cerveja {i + 1}: "))

            cerveja = Cerveja(nome, quantidade_ml, valor)
            cervejas.append(cerveja)

        return cervejas


# Função principal
def main():
    cervejas = Cerveja.ler_entrada()
    
    cerveja_melhor_custo = Cerveja.obter_cerveja_melhor_custo(cervejas)

    if cerveja_melhor_custo is None:
        print("Não há cervejas cadastradas.")
    else:
        print(f"A cerveja com melhor custo por litro é {cerveja_melhor_custo.nome} com o custo de litro de R$ {cerveja_melhor_custo.valor}.")


# Execução da função principal
if __name__ == '__main__':
    main()

Toda e qualquer sugestão de melhoria, além da ajuda no problema acima, será muito bem vinda.

Obrigado pela atenção.

3 respostas

Ele sempre irá retornar a primeira.

Exemplo:

Custo benefício da Cerveja 1: 10

Cerveja 2: 5

Cerveja 3: 10

Cerveja 4: 5

-Passou a cerveja 1, é a melhor custo benefício.

-Passou a cerveja 2, virou a melhor custo benefício.

-Passou a cerveja 3, não acontece nada.

Passou a cerveja 4, não acontece nada, pois ela não é menor e sim igual. (No caso seu programa não trata).

Recomendo criar uma lista caso forem de mesmo preço, caso surja uma menor, limpa a lista e repita.

Obrigado pela resposta, Lucas.

Ainda estou travado na solução.

Essa função irá retornar uma lista com uma ou mais cervejas com melhor custo.

Se precisar de ajudar, só falar!


def obter_cerveja_melhor_custo(cervejas):
        melhor_custo = float('inf')
        cervejas_melhor_custo = []

        for cerveja in cervejas:
            custo_litro = cerveja.calcular_custo_litro()
            
            if custo_litro == melhor_custo:
                cervejas_melhor_custo.append(cerveja)
                continue
            
            if custo_litro < melhor_custo:
                melhor_custo = custo_litro
                cervejas_melhor_custo.clear()
                cervejas_melhor_custo.append(cerveja)
            
            

        return cervejas_melhor_custo