Skip to content

Instantly share code, notes, and snippets.

@natan20200679
Last active July 2, 2021 23:26
Show Gist options
  • Select an option

  • Save natan20200679/934259a125d64c25d459980f6104f9a6 to your computer and use it in GitHub Desktop.

Select an option

Save natan20200679/934259a125d64c25d459980f6104f9a6 to your computer and use it in GitHub Desktop.
Lista de Exercícios Python Brasil
""" Foram anotadas as idades e alturas de 30 alunos. Faça um Programa que determine quantos alunos com mais de 13 anos possuem
altura inferior à média de altura desses alunos."""
idades = []
alturas = []
q = 0
soma = 0
for i in range(1,31):
idade = int(input("Idade:"))
idades.append(idade)
altura = float(input("Altura:"))
alturas.append(altura)
soma += altura
i += 1
media = soma / len(alturas)
if idade > 13 and altura < media:
q += 1
print("\nIdades:",idades)
print("Alturas:",alturas)
print("Média Alturas: %.2f" % media)
print("Alunos com 14 anos ou mais com altura inferior à média:",q)
@emersonccf
Copy link

Oi Natanael tudo bem?

Vamos lá...

Você está pedido para entrar apenas com duas alturas pois a função range funciona da seguinte forma recebendo até três parâmetros e no mínimo um:

range(3) -> se eu fizer assim o intervalo vai iniciar em 0 e vai até 2 logo 0, 1, 2 só o 3 não fará parte do retorno da função range.
range(1,3) onde 1 será o inicio e (3-1) o fim logo irá obter 1, 2 o 3 não entra no intervalo
range(1, 9, 2) diferente dos outros exemplo o terceiro parâmetro, o 2, significa o passo para avanço para o próximo número ou seja o retorno será: 1, 3, 5 e 7. O 9 não entra pois como é o último está fora do intervalo considerado como já foi dito. Sugiro que para maiores detalhes sobre a função range você lei a documentação oficial do Python, links abaixo:
https://docs.python.org/pt-br/3/tutorial/controlflow.html#the-range-function
https://docs.python.org/pt-br/3/library/stdtypes.html#range

Logo a sua iteração com o "for" na linha 3 só irá solicitar duas alturas e não 30 como você coloca para dividir a soma na linha 13 para achar a média.

Existem muitas outras questões no seu código, como a indentação para definir que trecho de código pertence ao "for" pois o que vai acontecer no que está descrito acima é que você a cada repetição irá calcular uma soma diferente, uma média diferente e vai realizar a verificação da idade e altura sempre em relação a uma média equivocada, parcial.

Uma possibilidade é calcular a média fora do "for" após todas as idades e alturas serem adicionadas em cima do tamanho da estrutura de dados que você decidiu usar (lista ou tupla) aí pode usar o função len() para saber o tamanho dela e dividir a soma das idades pelo tamanho da lista ou tupla.

Está é uma possiblidade, primeiro você achar a média depois verificar em outro "for" quais alunos atendem as condições impostas pela questão.

A propósito, o que vc acha de armazenar idade e altura juntos em uma lista de dicionários? Você poderia tentar... tipo [{'idade': 13, 'altura':1.57}, {'idade': 14, 'altura':1.67},{'idade': 13, 'altura':1.27}, ...]

São apenas sugestões e espero que possa lhe ajudar a ajustar o código. Qualquer coisa pode falar lá no grupo. Estou apendendo também e suas duvidas me instigam e pesquisar e a estudar também. Espero que lhe ajude. Bons estudos!

@natan20200679
Copy link
Author

Oi Emerson! Vamos lá...quanto à eu ter colocado um range(1,3), foi apenas pra eu poder fazer o teste do código de forma mais rápida, entende?! Realmente esqueci de deixar isso claro, rsrs.

Não consegui entender como fazer isso: "Uma possibilidade é calcular a média fora do "for" após todas as idades e alturas serem adicionadas em cima do tamanho da estrutura de dados que você decidiu usar (lista ou tupla) aí pode usar o função len() para saber o tamanho dela e dividir a soma das idades pelo tamanho da lista ou tupla."

@emersonccf
Copy link

Falo isso pq apesar de você ter dito que era apenas um teste de range(1,3) você está dividindo embaixo como tivesse recebido 30 alturas quando só recebeu apenas duas. E tem a questão do escopo onde você está colocando o a variável de média. Você conhece ou já ouviu falar em teste de mesa de algoritmos? Dê uma pesquisada para fazer esse teste com seu código para poder entender o erro. Só compreendendo o erro será possível avançar na construção de algoritmos que resolvam problemas.

@natan20200679
Copy link
Author

Qual o erro em: "E tem a questão do escopo onde você está colocando o a variável de média."?

Sobre o teste de mesa, vi agora e entendi. Faço isso apenas analisando o que cada linha de código executa.

@emersonccf
Copy link

Sim... E também simulando o loop e a tomada de decisão no if. Sugiro você dá uma olhada no curso gratuito de lógica de programação do curso em vídeo de Gustavo Guanabara, já ouviu falar?

Sobre o escopo para lhe mostra, vou fazer o seguinte daqui para mais tarde te mostro como pensei este algoritmo. Blz?

@natan20200679
Copy link
Author

Eu fiz 2 cursos de Lógica de Programação a partir de 2 sites diferentes. Não precisa de preocupar em me mostrar um exemplo de código pronto amigo, basta vc me apontar os erros que estou cometendo, e que estão levando ao erro no cálculo que mencionei no código, mas se vc acha melhor me mostrar um exemplo de código que resolve, tudo bem.

@emersonccf
Copy link

Só consigo colocar aqui entre acentos agudos...

from random import randint, random

alunos = list()
# Cria uma estrutura randômica de lista de dicionarios com x alunos
for i in range(31):
    idade = randint(10, 20)  # cria uma idade entre 10 e 20 anos
    altura = round(1 + (1*random()), 2)  # cria uma altura ente 1 e 2 metros
    aluno = {'idade': idade, 'altura': altura}  # cria um novo aluno
    alunos.append(aluno)  # preenche a lista de alunos com mais um aluno

# Resposta começa aqui...
print(alunos)
media_alturas = round(float(sum([aluno.get('altura')
                                 for aluno in alunos])) / len(alunos), 2)

alunos_13_abaixo_media_altura = [1 if aluno.get('idade') > 13 and aluno.get(
    'altura') < media_alturas else 0 for aluno in alunos]

print(
    f"Exitem {sum(alunos_13_abaixo_media_altura)} aluno(s) com 14 anos ou mais" +
    f"que possuem altura inferior à média ({media_alturas}) de altura do grupo."
)

Testa aí qualquer coisa estamos a disposição.

@emersonccf
Copy link

Se preferir esse mais detalhado em pedaços, para ir estudando parte por parte...

from random import randint, random

alunos = list()
# Cria uma estrutura randômica de lista de dicionarios com x alunos
for i in range(31):
    idade = randint(10, 20)  # cria uma idade entre 10 e 20 anos
    altura = round(1 + (1*random()), 2)  # cria uma altura ente 1 e 2 metros
    aluno = {'idade': idade, 'altura': altura}  # cria um novo aluno
    alunos.append(aluno)  # preenche a lista de alunos com mais um aluno

# Resposta começa aqui...
print(alunos)
lista_alturas = [aluno.get('altura') for aluno in alunos]
print(lista_alturas)
soma_alturas = round(sum(lista_alturas), 2)
print(soma_alturas)
media_alturas = round(soma_alturas / len(alunos), 2)
print(media_alturas)

alunos_13_abaixo_media_altura = [1 if aluno.get('idade') > 13 and aluno.get(
    'altura') < media_alturas else 0 for aluno in alunos]
print(alunos_13_abaixo_media_altura)
print(
    f"Exitem {sum(alunos_13_abaixo_media_altura)} aluno(s) com 14 anos ou mais" +
    f"que possuem altura inferior à média ({media_alturas}) de altura do grupo."
)

@natan20200679
Copy link
Author

Cara, vou ser bem sincero contigo...achei suas sugestões um pouco rebuscadas ou mais difíceis de compreender, principalmente na segunda linha após o for, e no último parágrafo de código. De qualquer forma te agradeço muito o tempo que gastou comigo, e vou analisar se é melhor eu me basear neste último código que me mostrou, ou se é melhor eu modificar o meu, incluindo idéias do seu.

@emersonccf
Copy link

De boa, a ideia é ver que existem várias possibilidades. No processo de aprendizado é assim... Vamos juntos. No que puder ajudar me coloco a disposição. Tudo de bom.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment