Exercício – Criar uma estrutura de loop aninhado para cálculos de notas de alunos
Neste exercício, você adicionará uma matriz de cadeias de caracteres para armazenar os nomes dos estudantes e, em seguida, implementará uma estrutura foreach aninhada que percorrerá os nomes dos estudantes em um loop externo e as notas dos estudantes no loop interno. Você começa construindo a studentNames matriz e um foreach loop que itera por meio dos elementos da matriz. Em seguida, você move o código usado para calcular as notas de Sophia para dentro do bloco de código do loop "nomes". Por fim, você implementa a lógica de código que usa o nome do aluno para acessar a matriz de pontuações, calcular a pontuação média e gravar a nota no console. As tarefas detalhadas que você concluir durante este exercício são:
Criar uma matriz de nomes: criar uma matriz com os nomes dos alunos.
Criar um loop externo: criar um loop
foreachque fará a iteração pelos nomes dos alunos.Desenvolver o bloco de código do loop externo: realocar o código que calcula e relata a pontuação de Sofia, colocando-o no bloco de código do loop "nomes".
Atualizar os cálculos e relatórios: atualizar o código que executa os cálculos de pontuação dos alunos usando uma nova matriz de pontuações.
Importante
Você precisa ter concluído o exercício anterior deste módulo, "Criar matrizes e loops foreach", para começar o atual.
Criar uma matriz de nomes de alunos e um loop foreach externo
Nesta tarefa, você criará uma matriz de nomes de alunos e um loop foreach que fará a iteração pelos nomes dos alunos.
Abra o arquivo Program.cs no Editor do Visual Studio Code.
Role até a parte superior do arquivo de código e localize as linhas de código usadas para declarar as matrizes de pontuações.
Crie uma linha de código em branco abaixo da declaração das matrizes de pontuações.
A linha de código em branco deve estar entre as linhas usadas para declarar as matrizes de pontuações e a linha usada para declarar
sophiaSum.Para criar uma matriz de cadeia de caracteres chamada
studentNamesque contenha os nomes dos alunos, insira o seguinte código:// Student names string[] studentNames = new string[] { "Sophia", "Andrew", "Emma", "Logan" };Observe que você especificou os nomes dos alunos como parte da declaração.
Para criar uma instrução
foreachque possa ser usada a fim de fazer a iteração pelos nomes dos alunos, insira o seguinte código:foreach (string name in studentNames) { }Para verificar se o loop
foreachestá fazendo a iteração na matrizstudentNamesconforme pretendido, atualize o bloco de código da instruçãoforeachda seguinte maneira:foreach (string name in studentNames) { Console.WriteLine($"{name}"); }Reserve um minuto para revisar o código que você criou.
// Student names string[] studentNames = new string[] { "Sophia", "Andrew", "Emma", "Logan" }; foreach (string name in studentNames) { Console.WriteLine($"{name}"); }O código usará esse loop
foreachcomo o loop externo do aplicativo. Durante este exercício, você implementará a seguinte lógica no aplicativo:Para cada um dos alunos na matriz
studentNames, o aplicativo fará o seguinte:- determinar o aluno atual.
- acessar as pontuações do aluno atual.
- calcular a nota atual do aluno (soma e média).
- gravar a nota do aluno atual no console.
No entanto, por enquanto, você só escreverá os nomes dos alunos no console.
No menu Arquivo do Visual Studio Code, clique em Salvar.
No modo de exibição explorador do Visual Studio Code, clique com o botão direito do mouse em Starter e, em seguida, selecione Abrir no Terminal Integrado.
Importante
O prompt de comando do Terminal deve exibir o caminho de pasta do arquivo Program.cs.
No prompt de comando terminal, digite o build dotnet e pressione Enter.
O comando
dotnet buildinstrui o compilador a criar o aplicativo. Se forem detectados erros, eles serão relatados.Se você vir mensagens de erro ou aviso, corrija-as antes de continuar.
No prompt de comando do terminal, digite dotnet run e pressione Enter.
Verifique se o código produziu a seguinte saída:
Sophia Andrew Emma Logan Student Grade Sophia: 92.2 A- Press the Enter key to continueObservação
Se não vir a lista de nomes de alunos acima do relatório de pontuações de Sofia, volte e verifique se você digitou o código corretamente.
No painel “TERMINAL”, para interromper a execução do aplicativo, pressione a tecla Enter.
Feche o painel do Terminal.
Calcule a pontuação de Sofia dentro do loop de nomes externo
Nesta tarefa, você realocará o código que calcula e relata a pontuação de Sofia, colocando-o no bloco de código do loop "nomes".
No Editor do Visual Studio Code, localize as linhas de código usadas para calcular e relatar a nota de Sofia.
int sophiaSum = 0; decimal sophiaScore; foreach (int score in sophiaScores) { // add the exam score to the sum sophiaSum += score; } sophiaScore = (decimal)sophiaSum / currentAssignments; Console.WriteLine("Student\t\tGrade\n"); Console.WriteLine("Sophia:\t\t" + sophiaScore + "\tA-");Observação
Sua próxima etapa será mover esse código da localização atual para o bloco de código do loop
foreach"nomes".Use uma operação do tipo “recortar e colar” para mover o código que calcula e relata a nota de Sofia para o bloco de código do loop
foreach"nomes".Se você não souber recortar e colar no Visual Studio Code, experimente a abordagem descrita nas seguintes etapas:
Selecione o código usado para calcular e relatar a nota de Sofia.
É possível clicar e arrastar para selecionar linhas de código.
No menu Editar código do Visual Studio, selecione Recortar.
No Editor do Visual Studio Code, posicione o cursor sobre a linha de código em branco abaixo do seguinte código:
Console.WriteLine($"{name}");No menu Editar do Visual Studio Code, selecione Colar.
Atualize o código para exibir o recuo de linha de código adequado.
Dica
O Visual Studio Code fornece um comando
Format Documentque pode ser usado para manter a formatação do código atualizada. Clique com o botão direito do mouse no Editor do Visual Studio Code e selecione Formatar Documento no menu pop-up. Em computadores Windows, o atalho de teclado para esse comando é:Shift + Alt + F. Os computadores Linux e macOS usam atalhos alternativos quando necessário para evitar conflitos com os atalhos fornecidos pelo sistema operacional.Verifique se suas atualizações correspondem ao seguinte código:
// Student names string[] studentNames = new string[] { "Sophia", "Andrew", "Emma", "Logan" }; foreach (string name in studentNames) { Console.WriteLine($"{name}"); int sophiaSum = 0; decimal sophiaScore; foreach (int score in sophiaScores) { // add the exam score to the sum sophiaSum += score; } sophiaScore = (decimal)sophiaSum / currentAssignments; Console.WriteLine("Student\t\tGrade\n"); Console.WriteLine("Sophia:\t\t" + sophiaScore + "\tA-"); } Console.WriteLine("Press the Enter key to continue"); Console.ReadLine();Observe que, aqui, o código calculará e informará a pontuação de Sofia independentemente do
namedo aluno atual. Você abordará isso em breve.Exclua o seguinte código:
Console.WriteLine($"{name}");Na linha de código em branco que você acabou de criar, insira o seguinte código:
if (name == "Sophia") {Crie uma linha de código em branco após o código que é usado para gravar a nota de Sofia no console.
Para fechar o bloco de código da instrução
if, insira o seguinte código:}Atualize o código para exibir o recuo de linha de código adequado.
Dica
Use o comando
Format Documentpara manter a formatação de código atualizada. Clique com o botão direito do mouse no painel editor do Visual Studio Code e selecione Formatar Documento no menu pop-up.Reserve um momento para examinar seu código.
Ele deve corresponder ao seguinte código:
// initialize variables - graded assignments int currentAssignments = 5; int[] sophiaScores = new int[] { 90, 86, 87, 98, 100 }; int[] andrewScores = new int[] { 92, 89, 81, 96, 90 }; int[] emmaScores = new int[] { 90, 85, 87, 98, 68 }; int[] loganScores = new int[] { 90, 95, 87, 88, 96 }; // Student names string[] studentNames = new string[] {"Sophia", "Andrew", "Emma", "Logan"}; foreach (string name in studentNames) { if (name == "Sophia") { int sophiaSum = 0; decimal sophiaScore; foreach (int score in sophiaScores) { // add the exam score to the sum sophiaSum += score; } sophiaScore = (decimal)(sophiaSum) / currentAssignments; Console.WriteLine("Student\t\tGrade\n"); Console.WriteLine("Sophia:\t\t" + sophiaScore + "\tA-"); } } Console.WriteLine("Press the Enter key to continue"); Console.ReadLine();Observe que a instrução
ifdentro do bloco de código doforeachexterno limita qual nota do aluno é calculada e relatada. Isso não é exatamente o que você precisa, mas é um passo nessa direção.No menu Arquivo do Visual Studio Code, clique em Salvar.
No modo de exibição explorador do Visual Studio Code, clique com o botão direito do mouse em Starter e, em seguida, selecione Abrir no Terminal Integrado.
Importante
O prompt de comando do Terminal deve exibir o caminho de pasta do arquivo Program.cs.
No prompt de comando terminal, digite o build dotnet e pressione Enter.
O comando
dotnet buildinstrui o compilador a criar o aplicativo. Se forem detectados erros, eles serão relatados.Se você vir mensagens de erro ou aviso, corrija-as antes de continuar.
No prompt de comando do terminal, digite dotnet run e pressione Enter.
Verifique se o código produziu a seguinte saída:
Student Grade Sophia: 92.2 A-Observação
Se você ainda vir a lista de nomes de alunos exibida acima do relatório de pontuações de Sofia, verifique se você salvou as atualizações.
No painel “TERMINAL”, para interromper a execução do aplicativo, pressione a tecla Enter.
Feche o painel do Terminal.
Atualize o loop aninhado para calcular todas as pontuações dos alunos
Nesta tarefa, você atualizará o código que executa os cálculos de pontuação do aluno usando uma nova matriz de pontuações. Você começará criando uma matriz chamada studentScores a ser usada para armazenar as pontuações de qualquer aluno. Em seguida, criará um constructo if .. elseif que usa o nome do aluno atual para atribuir a respectiva matriz de pontuações a studentScores. Por fim, você atualizará o código que calcula e relata as notas do aluno. Ao final, o relatório deve incluir o nome e a pontuação numérica de todos os alunos.
Crie uma linha de código em branco abaixo da declaração da matriz
studentNames.A linha em branco deve estar acima da instrução
foreachexterna.Para criar uma matriz de inteiros que pode ser usada para armazenar as pontuações do aluno atual, insira o seguinte código:
int[] studentScores = new int[10];Observe que esse código não atribui nenhum valor à matriz no momento. Você simplesmente especifica que a matriz pode conter 10 elementos.
Crie uma linha de código em branco na parte superior do bloco de código
foreachexterno.A linha em branco deve estar dentro do bloco de código
foreache acima da instruçãoifque avalia senameé igual a Sofia.Para criar uma variável de cadeia de caracteres a ser usada para armazenar o nome do aluno atual, insira o seguinte código:
string currentStudent = name;Observação
É possível continuar a usar
namepara rastrear o nome do aluno atual ao fazer a iteração pela matriz de nomes, mas usarcurrentStudentfacilitará a compreensão da lógica do código durante a criação do aplicativo nas próximas etapas.Para substituir
currentStudentpornamena instruçãoifque avalia senameé igual a Sofia, atualize o código da seguinte maneira:if (currentStudent == "Sophia")Mova o código que calcula e relata a pontuação de Sofia para um local abaixo do bloco de código.
Você está movendo todo o código que está no bloco de código para um local abaixo do bloco de código. A razão para isso ficará aparente nas próximas etapas.
Verifique se o código no bloco de código
foreachexterno corresponde ao seguinte:{ string currentStudent = name; if (currentStudent == "Sophia") { } int sophiaSum = 0; decimal sophiaScore; foreach (int score in sophiaScores) { // add the exam score to the sum sophiaSum += score; } sophiaScore = (decimal)sophiaSum / currentAssignments; Console.WriteLine("Student\t\tGrade\n"); Console.WriteLine("Sophia:\t\t" + sophiaScore + "\tA-"); }Para atribuir a matriz
sophiaScoresastudentScoresquandocurrentStudent == "Sophia", atualize o código da instruçãoifda seguinte maneira:if (currentStudent == "Sophia") studentScores = sophiaScores;Observe que você removeu as chaves do bloco de código da instrução
ifdurante essa atualização de código.Para adicionar uma instrução
else ifque atribui a matrizandrewScoresastudentScoresquandocurrentStudent == "Andrew", insira o seguinte código:else if (currentStudent == "Andrew") studentScores = andrewScores;Crie outra instrução
else ifpara atribuir a matrizemmaScoresastudentScoresquandocurrentStudent == "Emma".Crie uma instrução
else ifpara atribuir a matrizloganScoresastudentScoresquandocurrentStudent == "Logan".Verifique se o bloco de código
foreachcorresponde ao seguinte:foreach (string name in studentNames) { string currentStudent = name; if (currentStudent == "Sophia") studentScores = sophiaScores; else if (currentStudent == "Andrew") studentScores = andrewScores; else if (currentStudent == "Emma") studentScores = emmaScores; else if (currentStudent == "Logan") studentScores = loganScores; int sophiaSum = 0; decimal sophiaScore; foreach (int score in sophiaScores) { // add the exam score to the sum sophiaSum += score; } sophiaScore = (decimal)sophiaSum / currentAssignments; Console.WriteLine("Student\t\tGrade\n"); Console.WriteLine("Sophia:\t\t" + sophiaScore + "\tA-"); }Em seguida, atualize o loop
foreachinterno para usarstudentScorese "despersonalize" as variáveis usadas nos cálculos.Para substituir
studentScoresporsophiaScoresno loopforeachque faz a iteração pela matriz de pontuações, atualize o código da seguinte maneira:foreach (int score in studentScores)Para substituir as declarações de variáveis específicas de Sofia por nomes mais genéricos, atualize o código da seguinte maneira:
int sumAssignmentScores = 0; decimal currentStudentGrade = 0;Essas duas declarações de variáveis destinam-se a substituir as seguintes declarações de variáveis específicas de Sofia:
int sophiaSum = 0; decimal sophiaScore;Para aplicar o novo nome de variável à equação usada para somar as pontuações dos alunos, atualize o bloco de código
foreachinterno da seguinte maneira:foreach (int score in studentScores) { // add the exam score to the sum sumAssignmentScores += score; }Para aplicar o novo nome de variável à equação usada para calcular a pontuação média, atualize o código da seguinte maneira:
currentStudentGrade = (decimal)(sumAssignmentScores) / currentAssignments;Reserve um minuto para examinar o código.
int[] studentScores = new int[10]; foreach (string name in studentNames) { string currentStudent = name; if (currentStudent == "Sophia") studentScores = sophiaScores; else if (currentStudent == "Andrew") studentScores = andrewScores; else if (currentStudent == "Emma") studentScores = emmaScores; else if (currentStudent == "Logan") studentScores = loganScores; // initialize/reset the sum of scored assignments int sumAssignmentScores = 0; // initialize/reset the calculated average of exam + extra credit scores decimal currentStudentGrade = 0; foreach (int score in studentScores) { // add the exam score to the sum sumAssignmentScores += score; } currentStudentGrade = (decimal)(sumAssignmentScores) / currentAssignments; Console.WriteLine("Student\t\tGrade\n"); Console.WriteLine("Sophia:\t\t" + sophiaScore + "\tA-"); }Os loops
foreachaninhados agora farão a iteração pelos nomes dos alunos e usarão as pontuações do aluno para calcular suas notas. No entanto, ainda é necessário atualizar o código usado para gerar o relatório de pontuações.Para imprimir o nome do aluno e a pontuação calculada no console, atualize a segunda instrução
Console.WriteLineda seguinte maneira:Console.WriteLine($"{currentStudent}\t\t{currentStudentGrade}\t?");Observe que esse código substituiu a atribuição de nota de letra por um "?". Você trabalhará na automação da atribuição de notas no próximo exercício.
Mova a instrução
Console.WriteLineusada para escrever os rótulos das colunas do relatório de pontuações para o local logo acima do loopforeachexterno.Para não repetir os cabeçalhos das colunas para cada pontuação do aluno, mova esse código para um ponto acima do loop
foreachexterno.No menu Arquivo do Visual Studio Code, clique em Salvar.
Reserve um minuto para examinar o código do aplicativo.
O aplicativo completo agora deve corresponder ao seguinte código:
// initialize variables - graded assignments int currentAssignments = 5; int[] sophiaScores = new int[] { 90, 86, 87, 98, 100 }; int[] andrewScores = new int[] { 92, 89, 81, 96, 90 }; int[] emmaScores = new int[] { 90, 85, 87, 98, 68 }; int[] loganScores = new int[] { 90, 95, 87, 88, 96 }; // Student names string[] studentNames = new string[] { "Sophia", "Andrew", "Emma", "Logan" }; int[] studentScores = new int[10]; // Write the Report Header to the console Console.WriteLine("Student\t\tGrade\n"); foreach (string name in studentNames) { string currentStudent = name; if (currentStudent == "Sophia") studentScores = sophiaScores; else if (currentStudent == "Andrew") studentScores = andrewScores; else if (currentStudent == "Emma") studentScores = emmaScores; else if (currentStudent == "Logan") studentScores = loganScores; // initialize/reset the sum of scored assignments int sumAssignmentScores = 0; // initialize/reset the calculated average of exam + extra credit scores decimal currentStudentGrade = 0; foreach (int score in studentScores) { // add the exam score to the sum sumAssignmentScores += score; } currentStudentGrade = (decimal)(sumAssignmentScores) / currentAssignments; Console.WriteLine($"{currentStudent}\t\t{currentStudentGrade}\t?"); }Com o código que gera o relatório de pontuações do aluno atualizado, você está pronto para verificar o trabalho.
Verifique seu trabalho
Nesta tarefa, você executará o aplicativo para verificar se a lógica do código está funcionando conforme o esperado.
Verifique se você salvou as alterações no arquivo Program.cs.
No modo de exibição explorador do Visual Studio Code, clique com o botão direito do mouse em Starter e, em seguida, selecione Abrir no Terminal Integrado.
No prompt de comando terminal, digite o build dotnet e pressione Enter.
Se você vir mensagens de erro ou aviso, corrija-as antes de continuar.
No prompt de comando do terminal, digite dotnet run e pressione Enter.
Verifique se o código produziu a seguinte saída:
Student Grade Sophia 92.2 ? Andrew 89.6 ? Emma 85.6 ? Logan 91.2 ? Press the Enter key to continueNo painel “TERMINAL”, para interromper a execução do aplicativo, pressione a tecla Enter.
Feche o painel do Terminal.
Parabéns, seu aplicativo percorreu um longo caminho de onde você começou. Você está fazendo uso eficiente de matrizes e foreach iterações e integrou uma instrução if que permite que seu código selecione a matriz de pontuações correta.