Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Questão 13 módulo 5 de estrutura da dados : calculo do abono

Oi pessoal, tudo bem? Vi que a minha solução para a questão 13 do módulo 05 ficou um pouco diferente da resposta proposta na aula. Como os cálculos propostos na resposta fazem algumas consistências que eu não fiz, fiquei um pouco inseguro se minha solução funciona da mesma forma ou se deixei alguma coisa passar batido. Conseguem me ajudar a fazer essa validação? Meu código segue logo abaixo.

#lista com os salários elegíveis
relacao_salarios_elegiveis = [1172, 1644, 2617, 9130, 5532, 6341, 6650, 7238, 7685, 7782, 7903]

#criação de dicionário vazio
dic_salarios_abonados = {}
#inicio do contador para registrar a quantidade de salários que foram corrigidos para o mínimo
soma_corrigidos = 0
#inicio do contador para registrar o maior abono recebido
cont_maior_abono = 0

#laço para calcular o valor do abono com 10% do salário
for salarios_elegiveis in relacao_salarios_elegiveis:
    salarios_abonados = 0.1 * salarios_elegiveis
    #incremento o dicionário iniciado com os seus respectivos valores de abono
    dic_salarios_abonados[salarios_elegiveis] = salarios_abonados
    #condição para verificar se o salário abonado está abaixo do mínimo e imprime quais foram os salários que entraram nesta condição
    if salarios_abonados <= 200:
        print(f'O(s) salários {salarios_elegiveis} será/serão ajustados para o valor mínimo de abono')
        
#laço para atualizar o dicionário de salários aplicando o valor mínimo nos salários elegíveis, aqui eu não sei se daria para otimizar para inserir essa
#lógica no for alí de cima
for abono in dic_salarios_abonados.values():
    if abono <= 200:
        #transformo todo abono menod ou igual 200 em 200
        abono_corrigido = 200
        #atualizo o dicionário com a aplicação dos abonos mínimosb
        dic_salarios_abonados[salarios] = abono_corrigido

#laço para calcular a soma total dos abonos e mostrar o maior abono/salário
for salarios_corrigidos in dic_salarios_abonados.keys():
    #atualizo o registrador de salários corrigidos com valor do salário que está passando pelo lasso
    soma_corrigidos = soma_corrigidos + dic_salarios_abonados[salarios_corrigidos]
    #condição para verificar se o valor que está passando pelo lasso é maior do que o que está guardado no registrador
    if dic_salarios_abonados[salarios_corrigidos] > cont_maior_abono:
        #grava o maior abono do dicionário de salários
        cont_maior_abono = dic_salarios_abonados[salarios_corrigidos]
        #grava o maior salário 
        cont_maior_salario = salarios_corrigidos

#mostrando os resultados
print(f'O maior salário a ser abonado é o R$ {cont_maior_salario} com valor de R$ {cont_maior_abono}')
print(f'A soma total em gratificações será de: R$ {soma_corrigidos}')
print(f'{cont_abono} salários receberão o valor mínimo de abono')

Além disso, no trecho abaixo, eu não consegui otimizar para fazer com que o cálculo do abono E a atualização do dicionário fossem feitos no mesmo for. Não sei porque, mas achei que não estou sendo eficiente aqui. Será que tem algum jeito de melhorar?

#laço para atualizar o dicionário de salários aplicando o valor mínimo nos salários elegíveis, aqui eu não sei se daria para otimizar para inserir essa
#lógica no for alí de cima
for abono in dic_salarios_abonados.values():
    if abono <= 200:
        #transformo todo abono menod ou igual 200 em 200
        abono_corrigido = 200
        #atualizo o dicionário com a aplicação dos abonos mínimosb
        dic_salarios_abonados[salarios] = abono_corrigido

Uma outra dúvida é que percebi que nas resoluções não é usado as funções embutidas de "sum", por exemplo. Existe algum motivo especial ou é somente para exercitar a construção da lógica de diferentes formas.

Desde já, muito obrigado! Estou gostando muito dos exercícios propostos. Diferentemente de outros cursos, aqui eles são desafiadores e tem me feito gastar um tempo considerável "matutando" sobre as resoluções.

1 resposta
solução!

Oi, Rafael! Tudo certo contigo?

Você está no caminho certo no desenvolvimento do programa! Abaixo, estarei apresentando uma sugestão de como você pode unificar, de forma simples, o cálculo do abono com a atualização do dicionário:

#laço para calcular o valor do abono com 10% do salário
for salario in relacao_salarios_elegiveis:
    abono = 0.1 * salario
    #condição para verificar se o salário abonado está abaixo do mínimo e imprime quais foram os salários que entraram nesta condição
    if abono <= 200:
      abono = 200
      cont_abono += 1
      print(f'O(s) salários {salario} será/serão ajustados para o valor mínimo de abono')
    #incremento o dicionário iniciado com os seus respectivos valores de abono (atualizado ou não)
    dic_salarios_abonados[salario] = abono

No código acima, trabalhamos apenas com um laço de repetição. Para cada iteração envolvendo a lista relacao_salarios_elegiveis, estaremos trabalhando com um único salário — o qual terá um abono associado a ele. Caso este abono seja menor ou igual a 200, a variável abono recebe o valor de 200 e somamos 1 à variável cont_abono (lembre-se de inicializá-la no início do seu código).

Ainda dentro do mesmo for, adicionamos o valor do abono ao dicionário dic_salarios_abonados. Ao trabalhar somente com a variável abono, adicionamos os valores corretos de abono ao dicionário, independentemente dele ter sido ou não atualizado!

Ao fim, chegaremos no seguinte código:

#lista com os salários elegíveis
relacao_salarios_elegiveis = [1172, 1644, 2617, 9130, 5532, 6341, 6650, 7238, 7685, 7782, 7903]

#criação de dicionário vazio
dic_salarios_abonados = {}
#inicio do contador para registrar a quantidade de salários que foram corrigidos para o mínimo
soma_corrigidos = 0
#inicio do contador para registrar o maior abono recebido
cont_maior_abono = 0
#início do contador para registrar a quantidade de abonos mínimos
cont_abono = 0

#laço para calcular o valor do abono com 10% do salário
for salario in relacao_salarios_elegiveis:
    abono = 0.1 * salario
    #condição para verificar se o salário abonado está abaixo do mínimo e imprime quais foram os salários que entraram nesta condição
    if abono <= 200:
      abono = 200
      cont_abono += 1
      print(f'O(s) salários {salario} será/serão ajustados para o valor mínimo de abono')
    #incremento o dicionário iniciado com os seus respectivos valores de abono
    dic_salarios_abonados[salario] = abono

#laço para calcular a soma total dos abonos e mostrar o maior abono/salário
for salario_corrigido in dic_salarios_abonados.keys():
    #atualizo o registrador de salários corrigidos com valor do salário que está passando pelo lasso
    soma_corrigidos = soma_corrigidos + dic_salarios_abonados[salario_corrigido]
    #condição para verificar se o valor que está passando pelo lasso é maior do que o que está guardado no registrador
    if dic_salarios_abonados[salario_corrigido] > cont_maior_abono:
        #grava o maior abono do dicionário de salários
        cont_maior_abono = dic_salarios_abonados[salario_corrigido]
        #grava o maior salário 
        cont_maior_salario = salario_corrigido

#mostrando os resultados
print(f'O maior salário a ser abonado é o R$ {cont_maior_salario} com valor de R$ {cont_maior_abono}')
print(f'A soma total em gratificações será de: R$ {soma_corrigidos}')
print(f'{cont_abono} salários receberão o valor mínimo de abono')

Rafa, note que fiz uma pequena mudança em seu código: nos laços de repetição, sempre trabalhamos com um único elemento do conjunto de dados em cada iteração, como em for salario_corrigido in dic_salarios_abonados.keys(). Sendo assim, por questão de legibilidade, utilize expressões no singular, como salario_corrigido, em vez de salarios_corrigidos! :)

Espero ter ajudado, Rafa! Fico muito alegre em saber que gostou dos exercícios. Estamos trabalhando com bastante carinho para levar essa experiência para outros cursos da plataforma!

Um abraço.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!