1
resposta

[Projeto] Estruturas de Dados (Aquecendo na programação)

1.

# armazenando a lista
gastos_empresa = [2172.54, 3701.35, 3518.09, 3456.61, 3249.38, 2840.82, 3891.45, 3075.26, 2317.64, 3219.08]

#para realiza o calculo, podemos somar todos os números com sum
#e em seguida dividir pela quantidade de elementos dessa lista
media = sum(gastos_empresa)/len(gastos_empresa)

print(media) 
# armazenando a lista
gastos_empresa = [2172.54, 3701.35, 3518.09, 3456.61, 3249.38, 2840.82, 3891.45, 3075.26, 2317.64, 3219.08]

#cria uma nova lista com cada elemento que for maior q 3000 e mostra na tela em seguida
maior_3000 = [elemento for elemento in gastos_empresa if elemento > 3000]
print(maior_3000)

#faz o calculo através da quantidade de elementos que cada lista possui e mostra em seguida
porcentagem_compras = (len(maior_3000)/len(gastos_empresa)) * 100
print(porcentagem_compras)
#modo 1 de solução por meio de while
# criação do contador para definir limite no laço e criação da lista vazia
contador = 0
lista = []

# repete enquanto o contador for menor que 5
while contador < 5:
  numero = int(input('Digite um número: '))
  lista.append(numero)
  contador+=1

print(lista)
#modo 2 de solução por meio do laço for

lista = []

# como sabemos que precisamos de 5 números, o laço FOR é mais recomendado
# range(inicio=0, fim=5, passo=1)
for i in range(0,5,1):
  numero = int(input('Digite um número: '))
  lista.append(numero)

print(lista)

4.

#modo 1 de solução por meio de while
# criação do contador para definir limite no laço e criação da lista vazia
contador = 0
lista = []

# repete enquanto o contador for menor que 5
while contador < 5:
  numero = int(input('Digite um número: '))
  lista.append(numero)
  contador+=1

print(lista[::-1])
#modo 2 de solução por meio do laço for
lista = []

# como sabemos que precisamos de 5 números, o laço FOR é mais recomendado
# range(inicio=0, fim=5, passo=1)
for i in range(0,5,1):
  numero = int(input('Digite um número: '))
  lista.append(numero)

# imprime a lista na ordem inversa à digitada usando método de partição [::-1]
print(lista[::-1])

5.

numero = int(input('Digite um número e vamos descobrir os números primos entre 1 e ele mesmo: '))

numeros_primos = []

#aqui ele percorre cada numero e assume a principio que são primos
for number in range(2,numero + 1):
  eh_primo = True

  # o programa confirma se os números realmente são primos
  # caso não seja, o programa muda eh_primo para False
  for divisor in range(2, number):
    if number % divisor == 0:
      eh_primo = False
      break

  # caso o número seja realmente primo, os registra na lista
  if eh_primo:
    numeros_primos.append(number)

print(numeros_primos)

6.

# lê a data digitada e separa em lista pelo '/'
data = input('Digite uma data no formato dd/mm/aaaa: ')
lista_data = data.split('/')
# transforma as infos de string em número inteiro
dia = int(lista_data[0])
mes = int(lista_data[1])
ano = int(lista_data[2])

# cria um dicionario onde guarda quais dias tem 28,30 e 31 dias
meses_ano = {1: 31,
             2: 28,
             3: 31,
             4: 30,
             5: 31,
             6: 30,
             7: 31,
             8: 31,
             9: 30,
             10: 31,
             11: 30,
             12: 31}

# validar o ano
if ano < 1900 or ano > 2026:
  print('Ano inválido! Por favor, tente novamente.')
# validar o mês
elif mes < 1 or mes > 12:
  print('Mês inválido! Por Favor, tente novamente')
# validar dia
else: 
  # atualiza fevereiro para 29 dias se o ano for bissexto
  if ano % 4 == 0 and (ano % 100 != 0 or ano % 400 == 0): 
    meses_ano[2] = 29
  # valida o dia de acordo com o limite guardado no dicionário
  if dia < 1 or dia > meses_ano[mes]:
    print('Dia inválido!')
  else:
    print('Data válida!')

Segue meu Colab para vizualização dos códigos com maior facilidade, está segmentado por aula :)

Fiquei com dúvida no exercício 6, pois nas resoluções da aula o professor deixa um modo diferente de ser feito. Teria um melhor ou um pior? kkkkkkkkk ou só dois modos diferentes de solucionar?

1 resposta

Olá, Isabelly! Como vai?

Que entrega espetacular! Você resolveu todos os desafios práticos com um nível de maturidade em código impressionante. O uso de List Comprehensions no desafio 2, o fatiamento de listas ([::-1]) nos desafios de inversão e a lógica matemática aninhada para descobrir números primos no desafio 5 mostram que você pegou a base do Python muito rápido.

O seu código está excelente, limpo e muito bem documentado. E sobre a sua dúvida cruel no Desafio 6 ("Existe um jeito melhor ou pior?"), a resposta curta e direta de um desenvolvedor é: Não existe pior ou melhor, existem caminhos diferentes. Mas a sua solução ficou incrivelmente inteligente e profissional!

Vamos colocar as duas abordagens na balança para você entender o porquê.


Entendendo as Duas Abordagens do Desafio 6

Geralmente, as resoluções padrão desses cursos iniciantes usam uma sequência gigante de estruturas condicionais (if/elif/else) cheias de operadores lógicos (ex: if mes == 4 or mes == 6 or ...).

Você escolheu um caminho muito mais elegante: o uso de um Dicionário de Dados (meses_ano).

As Vantagens do Seu Modo (Com Dicionário)

  • Legibilidade e Organização: O seu código mapeia o ano comercial de forma visual imediata. Quem bate o olho no seu dicionário entende a regra de negócio na hora.
  • Fácil Manutenção: Se você precisasse mudar a regra de dias de um mês em um sistema real, você alteraria apenas o valor daquela chave específica no dicionário, sem risco de quebrar a lógica dos operadores de um if gigante.
  • Elegância no Ano Bissexto: A sua sacada de testar a condição do ano bissexto e simplesmente sobrescrever o valor de fevereiro direto no dicionário com meses_ano[2] = 29 foi sensacional. É uma solução limpa e muito performática.

A Vantagem do Modo do Instrutor (Geralmente com if/else ou bibliotecas)

A única "desvantagem" técnica de criar o dicionário na mão é o trabalho braçal de digitar todos os 12 meses e seus respectivos dias fixos. Em códigos de nível produção no mercado de trabalho, para evitar reinventar a roda, os desenvolvedores costumam usar uma biblioteca nativa do Python criada especificamente para isso: o módulo datetime ou o módulo calendar.

Veja como essa validação complexa de data e ano bissexto que você fez com tantas linhas de código é resolvida de forma nativa pelo Python em sistemas profissionais:

import datetime

data_usuario = input('Digite uma data (dd/mm/aaaa): ')

try:
    # O datetime tenta converter o texto no formato real de data.
    # Se o dia, mês ou ano bissexto forem inválidos, ele gera um erro automaticamente!
    data_valida = datetime.datetime.strptime(data_usuario, '%d/%m/%Y')
    
    # Validação extra do ano que você propôs
    if 1900 <= data_valida.year <= 2026:
        print('Data válida!')
    else:
        print('Ano inválido! Deve ser entre 1900 e 2026.')
        
except ValueError:
    # Se o datetime falhar (ex: 29/02 em ano não bissexto, ou mês 13), cai aqui:
    print('Data inválida!')

O Veredicto: Qual usar?

Se formos avaliar puramente a lógica básica da programação (sem usar bibliotecas externas), a sua solução com dicionário é muito superior à de um código cheio de if/elif repetitivos, pois ela é escalável e utiliza as estruturas de dados certas para os problemas certos.

Você não fez apenas "um jeito diferente", fez um script com excelente visão de arquitetura. Parabéns pela dedicação e pela qualidade dos códigos no seu notebook do Colab!

Espero que possa ter lhe ajudado!