Oii João Vítor,
Mandou bem demais na resolução! A lógica de cálculo da média e o uso do this para acessar os dados internos do objeto estão certinhos.
Gostaria de trazer dois pontos de atenção para polir ainda mais o seu código:
1. O laço de repetição (Loop)
Você utilizou o for...in. Embora ele funcione, em JavaScript ele é projetado tecnicamente para percorrer chaves (propriedades) de um objeto. Quando lidamos com arrays (listas), a boa prática é usar o for...of.
Ele acessa diretamente o valor (o objeto aluno), eliminando a necessidade de criar a variável let aluno = this.estudantes[i]. O código fica mais limpo.
2. O Operador relacional
O enunciado pede aprovação para nota "igual ou maior que 70". No seu código está > 70.
Isso cria um edge case (caso de borda): se um aluno tirar exatamente 70, seu código o colocaria "Em Progresso", quando ele deveria estar "Aprovado". O correto seria >= 70.
Veja como ficaria com esses ajustes:
curso.gerarRelatorio = function() {
let somaProgresso = 0;
// usando for...of (mais direto para arrays)
for (let aluno of this.estudantes) {
somaProgresso += aluno.progresso;
// ajuste para >= (maior OU igual)
const status = aluno.progresso >= 70 ? "Aprovado" : "Em Progresso";
console.log(`Nome: ${aluno.nome} | Progresso: ${aluno.progresso}% | ${status}`);
}
const media = (somaProgresso / this.estudantes.length).toFixed(2);
console.log(`Total de estudantes: ${this.estudantes.length}`);
console.log(`Média geral da turma: ${media}%`);
}
Essa linha de adicionar a função ao objeto depois de criado (curso.gerarRelatorio = ...) é totalmente válida e mostra que você entende como o JavaScript trata funções como valores.
Continue assim.
Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!