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

Resolução: Controlando o orçamento mensal

Esse exercício decidi fazer juntando todo o conhecimento adquirido até aqui, inclusive do curso Python: crie sua primeira aplicação

import os, sys, platform

# Cria uma lista vazia que guardará vários dicionários,
# cada um representando uma despesa com 'nome' e 'valor'.
despesas = []

# Define o orçamento máximo permitido para o total das despesas.
orcamento_maximo = 3000.00

# Define uma função que apenas mostra as opções do menu na tela.
def exibir_menu():
    
    # Exibe as opções numeradas para o usuário escolher.
    print('1. Cadastrar despesa')
    print('2. Listar despesas')
    print('3. Relatório final')
    print('4. Sair')

# Define a função responsável por cadastrar (inserir) uma nova despesa.
def cadastrar_despesas():

    # Pede ao usuário o nome da despesa (ex.: "Internet").
    nome_da_despesa = input('Nome da despesa: ')

    # Pede o valor da despesa e converte para float (número com casas decimais).
    # Se o usuário digitar algo que não é número, isso gera ValueError.
    try:
        valor_da_despesa = float(input('Valor da despesa: '))
    except ValueError:
        print('Digite apenas valores numéricos!')
        voltar_ao_menu_principal()

    # Monta um dicionário com as informações da despesa.
    dados_da_despesa = {'nome': nome_da_despesa, 'valor': valor_da_despesa}

    # Adiciona o dicionário na lista global de despesas.
    despesas.append(dados_da_despesa)

    # Dá um feedback amigável de que a despesa foi cadastrada.
    print(f'{nome_da_despesa} foi cadastrada com sucesso!')

    # Depois de cadastrar, volta para o menu principal.
    voltar_ao_menu_principal()

# Define a função que percorre e mostra todas as despesas já cadastradas.
def listar_despesas():

    # Se a lista estiver vazia, informa que não há despesas.
    if not despesas:
        print('Nenhuma despesa cadastrada ainda.')
    else:
        # Se houver despesas, percorre cada item da lista.
        for despesa in despesas:

            # Pega o nome da despesa do dicionário atual.
            nome_da_despesa = despesa['nome']

            # Pega o valor da despesa do dicionário atual.
            valor_da_despesa = despesa['valor']

            # Imprime a linha formatada: nome alinhado à esquerda e valor ao lado.
            print(f'- {nome_da_despesa.ljust(20)} | {valor_da_despesa}')

    # Ao fim da listagem (ou da mensagem de vazio), volta ao menu principal.
    voltar_ao_menu_principal()

# Define a função que calcula e mostra o total e diz se passou do orçamento.
def relatorio_final():

    # Soma, com segurança, o campo 'valor' de cada despesa (0 se a chave não existir).
    total = sum(item.get('valor', 0) for item in despesas)

    # Compara o total com o orçamento máximo e informa o resultado.
    if total > orcamento_maximo:
        print(f'Seus gastos totais foram de R$ {total}. Você ultrapassou o limite de orçamento de R$ {orcamento_maximo}')
    else:
        print(f'Parabéns! Seus gastos foram R$ {total} e ficaram dentro do orçamento máximo de R$ {orcamento_maximo}')
    
    # Depois do relatório, encerra o aplicativo.
    finalizar_app()

# Define a função que pausa e retorna ao menu principal.
def voltar_ao_menu_principal():

    # Aguarda o usuário pressionar alguma tecla (Enter) para continuar.
    input('\nDigite uma tecla para voltar ao menu principal: ')
    
    # Chama a função main() novamente para redesenhar o menu e perguntar a opção.
    main()

# Define a função para limpar o texto no terminal, de forma compatível com o SO.
def limpar_tela():

    # Se for Windows, usa 'cls'; caso contrário, usa 'clear' (Linux/Mac).
    os.system('cls' if platform.system() == 'Windows' else 'clear')

# Define a função para tratar qualquer opção inválida escolhida pelo usuário.
def opcao_invalida():

    # Mensagem de erro simples.
    print('\nOpção inválida!\n')

    # Retorna ao menu principal após a mensagem.
    voltar_ao_menu_principal()

# Define a função para finalizar o aplicativo.
def finalizar_app():

    # Mensagem final de encerramento.
    print('Encerrando o programa...')

    # Sai do programa imediatamente.
    sys.exit()

# Define a função que lê a opção do usuário e direciona o fluxo do programa.
def escolher_opcao():

    try:

        opcao_escolhida = int(input('Escolha uma opção: '))


        match opcao_escolhida:
            case 1:
                cadastrar_despesas()
            case 2:
                listar_despesas()
            case 3:
                relatorio_final()
            case 4:
                finalizar_app()
            case _:
                opcao_invalida()
    

    except ValueError:
        opcao_invalida()
                

def main():

    limpar_tela()
    exibir_menu()
    escolher_opcao()

if __name__ == '__main__':
    main()

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
2 respostas

E aí, Jonas! Tudo joia?

Que projeto incrível! Você não só resolveu o exercício, como foi muito além, criando uma aplicação completa e super bem organizada.

É exatamente essa mentalidade de conectar os aprendizados de vários cursos que acelera a evolução na programação. Seu código ficou excelente, com funções bem definidas, menu interativo, tratamento de erros e até o uso de match case.

Parabéns pela dedicação e por compartilhar esse código tão caprichado com a gente!

Bons estudos!

Sucesso

Imagem da comunidade
solução!

Muito obrigado. Fico feliz que tenha gostado :)