Dúvida em estrutura de repetição

Estou com um problema em um código e não estou conseguindo obter a resposta correta. O Usuário deve informar os salários de várias pessoas e o código deve calcular o aumento em função do salário de entrada, por meio de uma condição (se o salário está menor que 500, o aumento é de 15%, etc…) . Quando é informado um valor de salário negativo, o código deve encerrar apresentando a mensagem de FIM e a soma de todos os rendimentos, ou seja, gasto extra. O problema é: Quando eu informo o valor negativo, o código encerra e não é contabilizado no valor final, porém, o while lê este valor negativo e printa na tela a mensagem como se fosse um salário válido. Como pode um print dentro do while calcular um valor negativo sendo que a condição do while é salario>=0?

EXEMPLO DE ENTRADA E SAÍDA:

Prezado(a), digite o salário atual: 100
O novo salário é R$ 115.0
Prezado(a), digite o salário atual: 0
O novo salário é R$ 0.0
Prezado(a), digite o salário atual: -2
O novo salário é R$ -2.0
O valor do salário é inválido pois é um valor negativo. Fim de execução.
O valor total de despesas a mais para a empresa é R$ 15.0

CÓDIGO

novosalario = 0
reajuste = 0
salario = 0
novoreajuste = 0
while salario>=0:
salario = float(input("Prezado(a), digite o salário atual: "))
if salario>=0 and salario<500:
reajuste=float((salario0.15))
elif salario >=0 and salario>=500 and salario<=1000:
reajuste=float((salario
0.1))
elif salario>=0 and salario>1000:
reajuste=float((salario*0.05))
novoreajuste+=reajuste
novosalario=salario+reajuste
print(“O novo salário é R$ {}”.format(novosalario))
print(“O valor do salário é inválido pois é um valor negativo. Fim de execução.”)
print(“O valor total de despesas a mais para a empresa é R$ {}”.format(novoreajuste-reajuste))

Sugestão:

reajusteTotal = 0
while True:
    salario = float(input('Digite o salário:'))
    if salario < 0:
        print('salário negativo, fim da execução')
        break # sai do while
 
    # se chegou aqui é porque não é negativo então não precisa testar de novo se é maior que zero
    if salario < 500:
        reajuste = salario * 0.15
    elif salario <= 1000:
        reajuste = salario * 0.1
    else:
        reajuste = salario * 0.05
    reajusteTotal += reajuste
    print('novo salário: R$ {:.2f}'.format(salario + reajuste))
 
print('total de despesas a mais: R$ {:.2f}'.format(reajusteTotal))

while True cria um loop infinito, que só é interrompido por break - e eu só uso break se o valor for negativo (e também mostro a respectiva mensagem). Assim ele não mostra o valor negativo como se fosse um salário válido.

Depois veja que no if seguinte eu não preciso testar se o valor é maior ou igual a zero. Se não entrou no primeiro if (o que testa se o salário é negativo), é porque com certeza é positivo, então só preciso testar se é menor que 500.

Se não entrar nesse if é porque com certeza é maior ou igual a 500, então testar isso no elif é redundante (por isso só testo se é menor ou igual a 1000).

Por fim, se também não entrou no elif é porque com certeza é maior que 1000, então não precisa testar essa condição.

Repare também que você não precisa declarar todas as variáveis no início. E ao fazer as contas, não precisa usar float pois como salario já é um float, o resultado da conta também será.

E por fim, imprimi os valores com 2 casas decimais, usando o formato .2f. Veja a documentação para mais detalhes.

1 curtida