Exercício – Criar uma estrutura de loop aninhado para cálculos de notas de alunos

Concluído

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:

  1. Criar uma matriz de nomes: criar uma matriz com os nomes dos alunos.

  2. Criar um loop externo: criar um loop foreach que fará a iteração pelos nomes dos alunos.

  3. 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".

  4. 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.

  1. Abra o arquivo Program.cs no Editor do Visual Studio Code.

  2. 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.

  3. 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.

  4. Para criar uma matriz de cadeia de caracteres chamada studentNames que 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.

  5. Para criar uma instrução foreach que possa ser usada a fim de fazer a iteração pelos nomes dos alunos, insira o seguinte código:

    foreach (string name in studentNames)
    {
    }
    
  6. Para verificar se o loop foreach está fazendo a iteração na matriz studentNames conforme pretendido, atualize o bloco de código da instrução foreach da seguinte maneira:

    foreach (string name in studentNames)
    {
        Console.WriteLine($"{name}");
    
    }
    
  7. 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 foreach como 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.

  8. No menu Arquivo do Visual Studio Code, clique em Salvar.

  9. 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.

  10. No prompt de comando terminal, digite o build dotnet e pressione Enter.

    O comando dotnet build instrui o compilador a criar o aplicativo. Se forem detectados erros, eles serão relatados.

  11. Se você vir mensagens de erro ou aviso, corrija-as antes de continuar.

  12. No prompt de comando do terminal, digite dotnet run e pressione Enter.

  13. 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 continue
    

    Observaçã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.

  14. No painel “TERMINAL”, para interromper a execução do aplicativo, pressione a tecla Enter.

  15. 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".

  1. 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".

  2. 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:

    1. Selecione o código usado para calcular e relatar a nota de Sofia.

      É possível clicar e arrastar para selecionar linhas de código.

    2. No menu Editar código do Visual Studio, selecione Recortar.

    3. 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}");

    4. No menu Editar do Visual Studio Code, selecione Colar.

  3. Atualize o código para exibir o recuo de linha de código adequado.

    Dica

    O Visual Studio Code fornece um comando Format Document que 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.

  4. 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 name do aluno atual. Você abordará isso em breve.

  5. Exclua o seguinte código:

    Console.WriteLine($"{name}");
    
  6. Na linha de código em branco que você acabou de criar, insira o seguinte código:

    if (name == "Sophia")
    {    
    
  7. Crie uma linha de código em branco após o código que é usado para gravar a nota de Sofia no console.

  8. Para fechar o bloco de código da instrução if, insira o seguinte código:

    }    
    
  9. Atualize o código para exibir o recuo de linha de código adequado.

    Dica

    Use o comando Format Document para 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.

  10. 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 if dentro do bloco de código do foreach externo limita qual nota do aluno é calculada e relatada. Isso não é exatamente o que você precisa, mas é um passo nessa direção.

  11. No menu Arquivo do Visual Studio Code, clique em Salvar.

  12. 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.

  13. No prompt de comando terminal, digite o build dotnet e pressione Enter.

    O comando dotnet build instrui o compilador a criar o aplicativo. Se forem detectados erros, eles serão relatados.

  14. Se você vir mensagens de erro ou aviso, corrija-as antes de continuar.

  15. No prompt de comando do terminal, digite dotnet run e pressione Enter.

  16. 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.

  17. No painel “TERMINAL”, para interromper a execução do aplicativo, pressione a tecla Enter.

  18. 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.

  1. 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 foreach externa.

  2. 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.

  3. Crie uma linha de código em branco na parte superior do bloco de código foreach externo.

    A linha em branco deve estar dentro do bloco de código foreach e acima da instrução if que avalia se name é igual a Sofia.

  4. 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 name para rastrear o nome do aluno atual ao fazer a iteração pela matriz de nomes, mas usar currentStudent facilitará a compreensão da lógica do código durante a criação do aplicativo nas próximas etapas.

  5. Para substituir currentStudent por name na instrução if que avalia se name é igual a Sofia, atualize o código da seguinte maneira:

    if (currentStudent == "Sophia")
    
  6. 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.

  7. Verifique se o código no bloco de código foreach externo 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-");
    
    }
    
  8. Para atribuir a matriz sophiaScores a studentScores quando currentStudent == "Sophia", atualize o código da instrução if da seguinte maneira:

    if (currentStudent == "Sophia")
        studentScores = sophiaScores;
    
    

    Observe que você removeu as chaves do bloco de código da instrução if durante essa atualização de código.

  9. Para adicionar uma instrução else if que atribui a matriz andrewScores a studentScores quando currentStudent == "Andrew", insira o seguinte código:

    else if (currentStudent == "Andrew")
        studentScores = andrewScores;
    
    
  10. Crie outra instrução else if para atribuir a matriz emmaScores a studentScores quando currentStudent == "Emma".

  11. Crie uma instrução else if para atribuir a matriz loganScores a studentScores quando currentStudent == "Logan".

  12. Verifique se o bloco de código foreach corresponde 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 foreach interno para usar studentScores e "despersonalize" as variáveis usadas nos cálculos.

  13. Para substituir studentScores por sophiaScores no loop foreach que faz a iteração pela matriz de pontuações, atualize o código da seguinte maneira:

    foreach (int score in studentScores)
    
  14. 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;
    
  15. Para aplicar o novo nome de variável à equação usada para somar as pontuações dos alunos, atualize o bloco de código foreach interno da seguinte maneira:

    foreach (int score in studentScores)
    {
        // add the exam score to the sum
        sumAssignmentScores += score;
    }
    
  16. 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;
    
  17. 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 foreach aninhados 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.

  18. Para imprimir o nome do aluno e a pontuação calculada no console, atualize a segunda instrução Console.WriteLine da 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.

  19. Mova a instrução Console.WriteLine usada para escrever os rótulos das colunas do relatório de pontuações para o local logo acima do loop foreach externo.

    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 foreach externo.

  20. No menu Arquivo do Visual Studio Code, clique em Salvar.

  21. 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.

  1. Verifique se você salvou as alterações no arquivo Program.cs.

  2. 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.

  3. No prompt de comando terminal, digite o build dotnet e pressione Enter.

  4. Se você vir mensagens de erro ou aviso, corrija-as antes de continuar.

  5. No prompt de comando do terminal, digite dotnet run e pressione Enter.

  6. 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 continue
    
  7. No painel “TERMINAL”, para interromper a execução do aplicativo, pressione a tecla Enter.

  8. 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.