Exercício – Implementar ramificações de código usando instruções de seleção
Neste exercício, você desenvolve o código que atribui automaticamente a nota em letras de um aluno com base em sua pontuação numérica final e atualiza o aplicativo para que as notas adicionais de projetos de crédito sejam incluídas na nota final do aluno. Você começará escrevendo um constructo if-elseif-else que pode ser usado para avaliar a pontuação numérica do aluno e atribuir a nota em letra. Em seguida, você examinará os requisitos do aplicativo relacionados ao trabalho de crédito extra e, em seguida, trabalhará nas atualizações de código necessárias. As tarefas detalhadas que você concluir durante este exercício são:
Desenvolver um constructo
if-elseif-elseque avalia a nota do aluno para atribuir uma nota em letra. A expressão avaliada compara a pontuação numérica do aluno com uma variedade de pontuações obtidas de um gráfico de classificação fornecido pelo professor.Integre pontuações de crédito extras à matriz de pontuações de cada aluno e atualize o código usado para calcular a pontuação numérica do aluno. O
foreachque é usado para somar as pontuações do aluno será atualizado para incluir uma instruçãoifque ramifica o código. As pontuações do exame são aplicadas à soma em uma ramificação e às pontuações de crédito extras na outra ramificação.
Importante
Você precisa ter concluído o exercício anterior deste módulo, "Criar matrizes e loops foreach", para começar o atual.
Atribuir notas em letra usando um constructo if-elseif-else
Nesta tarefa, você desenvolverá uma estrutura if-elseif-else que pode ser usada para atribuir notas em letras com base em uma pontuação numérica calculada.
Abra o arquivo Program.cs no Editor do Visual Studio Code.
Crie uma linha de código em branco abaixo da linha usada para declarar
studentScoresa matriz.Para criar uma variável de cadeia de caracteres que pode ser usada para manter a nota de letra do aluno, insira o seguinte código:
string currentStudentLetterGrade = "";Role para baixo até a parte inferior do arquivo Program.cs.
Adicione uma linha de código em branco abaixo da linha à qual atribui um valor
currentStudentGradecalculado.Reserve um minuto para considerar o gráfico de avaliação que mostra a nota em letras correspondente às pontuações numéricas.
97 - 100 A+ 93 - 96 A 90 - 92 A- 87 - 89 B+ 83 - 86 B 80 - 82 B- 77 - 79 C+ 73 - 76 C 70 - 72 C- 67 - 69 D+ 63 - 66 D 60 - 62 D- 0 - 59 FNa linha superior de notas, os valores maiores ou iguais a 97 têm uma nota em letra de "A+". Em outras palavras, se a pontuação final de um aluno for >= 97, eles receberão uma nota de letra "A+".
Para criar uma instrução
ifque atribuaA+acurrentStudentLetterGradequando a pontuação do aluno for maior ou igual a 97, insira o seguinte código:if (currentStudentGrade >= 97) currentStudentLetterGrade = "A+";Para criar uma instrução
else ifque atribuaAacurrentStudentLetterGradequando a pontuação do aluno for maior ou igual a 93, insira o seguinte código:else if (currentStudentGrade >= 93) currentStudentLetterGrade = "A";O
else ifnão atribuiráAacurrentStudentLetterGradequando a pontuação do aluno for maior ou igual a 97 porque essa expressão retornoutruenoifanterior.Você pode estender esse padrão
else ifconforme move para baixo as linhas do gráfico de notas em letra. Ao chegar ao final do gráfico, você pode usar umelsefinal para capturar qualquercurrentStudentGradeque esteja abaixo de 60.Crie as instruções
else ifque atribuem notas em letra acurrentStudentLetterGradepara os intervalos de pontuação entre 60 e 92.Depois de concluir esta etapa, você deverá ter uma estrutura de instrução
ifque corresponda ao seguinte código:if (currentStudentGrade >= 97) currentStudentLetterGrade = "A+"; else if (currentStudentGrade >= 93) currentStudentLetterGrade = "A"; else if (currentStudentGrade >= 90) currentStudentLetterGrade = "A-"; else if (currentStudentGrade >= 87) currentStudentLetterGrade = "B+"; else if (currentStudentGrade >= 83) currentStudentLetterGrade = "B"; else if (currentStudentGrade >= 80) currentStudentLetterGrade = "B-"; else if (currentStudentGrade >= 77) currentStudentLetterGrade = "C+"; else if (currentStudentGrade >= 73) currentStudentLetterGrade = "C"; else if (currentStudentGrade >= 70) currentStudentLetterGrade = "C-"; else if (currentStudentGrade >= 67) currentStudentLetterGrade = "D+"; else if (currentStudentGrade >= 63) currentStudentLetterGrade = "D"; else if (currentStudentGrade >= 60) currentStudentLetterGrade = "D-";A etapa final é adicionar o
elseque aborda as notas restantes.Para criar o
elseque se aplica a pontuações abaixo de 60, insira o seguinte código:else currentStudentLetterGrade = "F";Reserve um minuto para examinar o código do aplicativo.
O código Program.cs 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]; string currentStudentLetterGrade = ""; // Display the Report Header Console.WriteLine("Student\t\tGrade\n"); foreach (string name in studentNames) { string currentStudent = name; if (currentStudent == "Sophia") // assign Sophia's scores to the studentScores array studentScores = sophiaScores; else if (currentStudent == "Andrew") // assign Andrew's scores to the studentScores array studentScores = andrewScores; else if (currentStudent == "Emma") // assign Emma's scores to the studentScores array studentScores = emmaScores; else if (currentStudent == "Logan") // assign Logan's scores to the studentScores array 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; if (currentStudentGrade >= 97) currentStudentLetterGrade = "A+"; else if (currentStudentGrade >= 93) currentStudentLetterGrade = "A"; else if (currentStudentGrade >= 90) currentStudentLetterGrade = "A-"; else if (currentStudentGrade >= 87) currentStudentLetterGrade = "B+"; else if (currentStudentGrade >= 83) currentStudentLetterGrade = "B"; else if (currentStudentGrade >= 80) currentStudentLetterGrade = "B-"; else if (currentStudentGrade >= 77) currentStudentLetterGrade = "C+"; else if (currentStudentGrade >= 73) currentStudentLetterGrade = "C"; else if (currentStudentGrade >= 70) currentStudentLetterGrade = "C-"; else if (currentStudentGrade >= 67) currentStudentLetterGrade = "D+"; else if (currentStudentGrade >= 63) currentStudentLetterGrade = "D"; else if (currentStudentGrade >= 60) currentStudentLetterGrade = "D-"; else currentStudentLetterGrade = "F"; Console.WriteLine($"{name}\t\t{currentStudentGrade}\t?"); } Console.WriteLine("Press the Enter key to continue"); Console.ReadLine();Observe que seu aplicativo é organizado de maneira muito lógica de cima para baixo:
Você inicializa variáveis e cria as matrizes que servem como fonte de dados para o aplicativo. Você tem matrizes que fornecem pontuações dos alunos, bem como uma matriz que fornece os nomes dos alunos. Você também tem uma matriz independente de aluno chamada
studentScoresque você pode usar para manter as pontuações de qualquer aluno quando chegar a hora de calcular as notas.Você tem uma instrução
Console.WriteLine()que grava os rótulos de coluna do seu relatório de notas no console.Você tem um loop externo
foreachque é iterado por meio da matrizstudentNames, fornecendo um bloco de código que se repete para cada aluno.Você continua organizando seu código usando uma abordagem de cima para baixo dentro do bloco de código do loop externo
foreach:Você tem uma declaração
ifpara avaliar o nome do aluno atual, por exemploif (currentStudent == "Sophia"). Quando a expressão é avaliada comotrue, você atribui a matriz de notas do aluno à matriz independente do aluno, por exemplo:studentScores = sophiaScores;Você declara as duas variáveis necessárias para calcular as notas dos alunos. A primeira variável é
sumAssignmentScoresusada para calcular a soma das pontuações de atribuição. A segunda variável,currentStudentGrade, é usada para calcular a nota numérica final. Você inicializa as variáveis com um valor de0.Você tem um loop
foreachque é iterado por meio destudentScorespara calcular o valor desumAssignmentScores.Você calcula
currentStudentGradedividindosumAssignmentScorespelo número de tarefas no livro de notas. O número de atribuições classificadas é mantido em uma variável chamadacurrentAssignments.Você tem um constructo
if-elseif-elseque atribui notas em letra com base no valor decurrentStudentGrade.Você tem uma instrução
Console.WriteLine()que grava nomes de alunos e notas no console para concluir o relatório de notas.
Localize a instrução
Console.WriteLine()que escreve os nomes e as notas dos alunos no console.Console.WriteLine($"{currentStudent}\t\t{currentStudentGrade}\t?");Observe que você ainda precisa incluir a nota em letra calculada no relatório de notas.
Para incluir o valor de
currentStudentLetterGradeno relatório de classificação, atualize o código da seguinte maneira:Console.WriteLine($"{currentStudent}\t\t{currentStudentGrade}\t{currentStudentLetterGrade}");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.
No prompt de comando terminal, digite o build dotnet e pressione Enter.
Se houver mensagens de erro ou de aviso, será necessário corrigi-las 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- Andrew 89.6 B+ Emma 85.6 B Logan 91.2 A- Press the Enter key to continueSeu aplicativo está ganhando forma. Agora você precisa integrar as tarefas dos créditos extras.
Integrar pontuações de créditos extras dentro de uma ramificação de código
Nesta tarefa, você atualizará o aplicativo para acomodar as atividades de crédito extra que foram entregues pelos alunos. Os alunos completam projetos de crédito extras para ganhar pontos de bônus que podem ajudar a elevar suas notas. O professor deu pontuações de créditos extras para cada aluno com base no que eles entregaram:
- Sophia: 94, 90
- Andrew: 89
- Emma: 89, 89, 89
- Logan: 96
Você usará essas pontuações de crédito extras e os requisitos de aplicativo fornecidos pelo professor para concluir essa tarefa.
Leve um minuto para considerar os requisitos do projeto relacionados a atribuições de crédito extras.
A unidade "Preparar" para este módulo de projeto guiado inclui uma seção de visão geral do Projeto que inclui os seguintes requisitos:
Seu aplicativo precisa acomodar as atribuições de créditos extras.
- As pontuações de crédito extras devem ser incluídas na matriz de pontuações do aluno.
- As atribuições de créditos extras valerão 10% a nota de um exame quando aplicadas à nota numérica final.
- As pontuações extras de atribuição de crédito devem ser adicionadas à pontuação total do exame do aluno antes de calcular a nota numérica final.
Integre pontuações extras de crédito ao calcular a nota numérica e de letra final do aluno da seguinte maneira:
- O código precisa detectar tarefas de crédito extra com base no número de elementos na matriz de pontuações do aluno.
- O código precisa aplicar o fator de ponderação de 10% às tarefas de crédito extra antes de adicionar as pontuações de crédito extra à soma das pontuações dos exames.
Role para a parte superior do seu arquivo Program.cs.
Para adicionar as
sophiaScorespontuações extras de atribuição de crédito de Sophia à matriz, atualize o código da seguinte maneira:int[] sophiaScores = new int[] { 90, 86, 87, 98, 100, 94, 90 };Observe que você adicionou os créditos extras
94e90à lista de pontuações incluídas na matriz. Simples.Adicione as pontuações de crédito extras para os outros alunos às suas matrizes de pontuação.
Verifique se as matrizes de pontuação do aluno correspondem ao seguinte código:
int[] sophiaScores = new int[] { 90, 86, 87, 98, 100, 94, 90 }; int[] andrewScores = new int[] { 92, 89, 81, 96, 90, 89 }; int[] emmaScores = new int[] { 90, 85, 87, 98, 68, 89, 89, 89 }; int[] loganScores = new int[] { 90, 95, 87, 88, 96, 96 };Role para baixo para localizar o loop interno
foreachusado para somar pontuações de tarefas.foreach (int score in studentScores) { // add the exam score to the sum sumAssignmentScores += score; }Leve um minuto para considerar as atualizações que você precisa implementar.
Primeiro, considere o que você já sabe:
- Você sabe que um
foreachloop itera sequencialmente por todos os elementos de uma matriz, independentemente de quantos elementos a matriz contém. - Você sabe que os alunos têm cinco notas do exame, e que você tem uma variável relacionada:
int currentAssignments = 5;. - Você sabe que as pontuações de crédito extras são incluídas no final da matriz.
- Você sabe que as pontuações de crédito extra valem 10% de uma pontuação do exame.
- Você sabe que pontuações extras de crédito devem ser adicionadas à soma das pontuações do exame antes de calcular a nota numérica final do aluno.
Agora considere o que você precisa:
- Você precisa detectar quais pontuações na matriz de pontuações são as pontuações de crédito extras.
- Você precisa ajustar o valor de pontuações de crédito extra para que elas valham 10% de uma pontuação de exame.
- Você precisa atualizar o cálculo usado para somar as pontuações dos alunos para que a soma inclua as pontuações de crédito extras.
- Você sabe que um
Identifique as atualizações de codificação necessárias para diferenciar as pontuações do exame e as pontuações de crédito extras.
Você sabe que as pontuações extras de crédito são listadas após as cinco notas do exame. Em outras palavras, a primeira pontuação de crédito extra será a sexta pontuação na matriz de pontuações. Essa relação entre o tipo de pontuação e o número do elemento de matriz informa que você precisa de um contador dentro do
foreachloop. Depois que o valor do contador for maior que o número de pontuações do exame, você saberá que a pontuação atual é uma pontuação de crédito extra.Veja o que você precisa implementar para diferenciar as pontuações do exame e as pontuações extras de crédito:
- Você precisa declarar um inteiro acima do loop interno
foreachque possa ser usado para contar atribuições que valem nota. Você pode nomear essa variávelgradedAssignments. - Você precisa incrementar
gradedAssignmentsem1dentro do loopforeach. Se você inicializargradedAssignmentspara0, poderá incrementar seu contador na parte superior do bloco de códigoforeach. - Você precisa de uma instrução
ifque avalie se o contador,gradedAssignments, é maior que o número de notas de exame. A variável que contém o número de atribuições de exame é denominadacurrentAssignments. Esse nome pode causar confusão agora que você tem tarefas de crédito extra além de tarefas de exame. Você deve alterar o nome da variável decurrentAssignmentsparaexamAssignments. Depois que essa alteração de nome for implementada, você poderá usar oifavaliar(gradedAssignments <= examAssignments).
- Você precisa declarar um inteiro acima do loop interno
Altere o nome da variável de
currentAssignmentsparaexamAssignments.Importante
Ao alterar um nome de variável, você precisa garantir que atualize todas as instâncias da variável em seu aplicativo. Nesse caso, há duas instâncias.
O painel editor do Visual Studio Code dá suporte ao uso do atalho de teclado Control + F para localizar o texto que você especificar. O painel editor do Visual Studio Code também dá suporte ao uso do atalho de teclado Control + H para localizar e substituir o texto especificado.
Crie uma linha de código em branco acima do
foreachloop usado para somar pontuações de atribuição.Na linha de código em branco, para declarar uma variável de inteiro nomeada
gradedAssignmentse inicializá-la0, insira o seguinte código:// initialize/reset a counter for the number of assignments int gradedAssignments = 0;Crie uma linha de código em branco na parte superior do bloco de código para o
foreachloop usado para somar pontuações de atribuição.Na linha de código em branco, para incrementar
gradedAssignmentsem1a cada iteração do loopforeach, insira o seguinte código:// increment the assignment counter gradedAssignments += 1;Para criar uma instrução
ifque avalie a expressão(gradedAssignments <= examAssignments), insira o seguinte código:if (gradedAssignments <= examAssignments)Identifique as atualizações de codificação necessárias para o cálculo usado para somar as pontuações dos alunos.
Quando sua instrução
ifavalia(gradedAssignments <= examAssignments)comotrue, a pontuação é uma pontuação de exame e você pode adicionar o valor à sua soma. Se a expressão não for avaliada comotrue, a pontuação será uma pontuação de crédito extra e você precisará dividi-la por 10 antes de adicionar o valor à sua soma. Uma estruturaif-elseserá perfeita.Observe que a equação existente,
sumAssignmentScores += score;, é o cálculo correto a ser usado quando a sua declaraçãoifavalia(gradedAssignments <= examAssignments)comotrue.Crie uma linha de código em branco abaixo
sumAssignmentScores += score;.Na linha de código em branco, para construir a parte
elsedo constructoif-else, digite outro e pressione Enter.Para criar a equação que adiciona uma pontuação de crédito extra à soma, insira o seguinte código:
// add the extra credit points to the sum - bonus points equal to 10% of an exam score sumAssignmentScores += score / 10;No menu Arquivo do Visual Studio Code, clique em Salvar.
Reserve um minuto para examinar o código do aplicativo.
Verifique se o aplicativo atualizado corresponde ao seguinte código:
// initialize variables - graded assignments int examAssignments = 5; int[] sophiaScores = new int[] { 90, 86, 87, 98, 100, 94, 90 }; int[] andrewScores = new int[] { 92, 89, 81, 96, 90, 89 }; int[] emmaScores = new int[] { 90, 85, 87, 98, 68, 89, 89, 89 }; int[] loganScores = new int[] { 90, 95, 87, 88, 96, 96 }; // Student names string[] studentNames = new string[] { "Sophia", "Andrew", "Emma", "Logan" }; int[] studentScores = new int[10]; string currentStudentLetterGrade = ""; // 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; // initialize/reset a counter for the number of assignment int gradedAssignments = 0; // loop through the scores array and complete calculations for currentStudent foreach (int score in studentScores) { // increment the assignment counter gradedAssignments += 1; if (gradedAssignments <= examAssignments) // add the exam score to the sum sumAssignmentScores += score; else // add the extra credit points to the sum - bonus points equal to 10% of an exam score sumAssignmentScores += score / 10; } currentStudentGrade = (decimal)(sumAssignmentScores) / examAssignments; if (currentStudentGrade >= 97) currentStudentLetterGrade = "A+"; else if (currentStudentGrade >= 93) currentStudentLetterGrade = "A"; else if (currentStudentGrade >= 90) currentStudentLetterGrade = "A-"; else if (currentStudentGrade >= 87) currentStudentLetterGrade = "B+"; else if (currentStudentGrade >= 83) currentStudentLetterGrade = "B"; else if (currentStudentGrade >= 80) currentStudentLetterGrade = "B-"; else if (currentStudentGrade >= 77) currentStudentLetterGrade = "C+"; else if (currentStudentGrade >= 73) currentStudentLetterGrade = "C"; else if (currentStudentGrade >= 70) currentStudentLetterGrade = "C-"; else if (currentStudentGrade >= 67) currentStudentLetterGrade = "D+"; else if (currentStudentGrade >= 63) currentStudentLetterGrade = "D"; else if (currentStudentGrade >= 60) currentStudentLetterGrade = "D-"; else currentStudentLetterGrade = "F"; //Console.WriteLine("Student\t\tGrade\tLetter Grade\n"); Console.WriteLine($"{currentStudent}\t\t{currentStudentGrade}\t{currentStudentLetterGrade}"); } // required for running in VS Code (keeps the Output windows open to view results) Console.WriteLine("\n\rPress the Enter key to continue"); Console.ReadLine();
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 houver mensagens de erro ou de aviso, será necessário corrigi-las 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 95.8 A Andrew 91.2 A- Emma 90.4 A- Logan 93 A Press the Enter key to continueNo painel “TERMINAL”, para interromper a execução do aplicativo, pressione a tecla Enter.
Feche o painel do terminal.
Reserve um momento para considerar o seguinte requisito de projeto:
- Seu aplicativo precisa dar suporte à adição de alunos adicionais e pontuações com impacto mínimo ao código.
Algum requisito crítico para seu aplicativo foi ignorado?
Verifique se sua combinação de matrizes e
foreachloops permite incluir alunos adicionais sem uma reescrita de código completa.Role até a parte superior do aplicativo Program.cs e atualize as matrizes da seguinte maneira:
int[] sophiaScores = new int[] { 90, 86, 87, 98, 100, 94, 90 }; int[] andrewScores = new int[] { 92, 89, 81, 96, 90, 89 }; int[] emmaScores = new int[] { 90, 85, 87, 98, 68, 89, 89, 89 }; int[] loganScores = new int[] { 90, 95, 87, 88, 96, 96 }; int[] beckyScores = new int[] { 92, 91, 90, 91, 92, 92, 92 }; int[] chrisScores = new int[] { 84, 86, 88, 90, 92, 94, 96, 98 }; int[] ericScores = new int[] { 80, 90, 100, 80, 90, 100, 80, 90 }; int[] gregorScores = new int[] { 91, 91, 91, 91, 91, 91, 91 }; // Student names string[] studentNames = new string[] { "Sophia", "Andrew", "Emma", "Logan", "Becky", "Chris", "Eric", "Gregor" };Role para baixo até o loop de nomes
foreache localize as seguintes linhas de código:if (currentStudent == "Sophia") studentScores = sophiaScores; else if (currentStudent == "Andrew") studentScores = andrewScores; else if (currentStudent == "Emma") studentScores = emmaScores; else if (currentStudent == "Logan") studentScores = loganScores;Para incluir os novos alunos, adicione o seguinte código ao final da estrutura de seleção:
else if (currentStudent == "Becky") studentScores = beckyScores; else if (currentStudent == "Chris") studentScores = chrisScores; else if (currentStudent == "Eric") studentScores = ericScores; else if (currentStudent == "Gregor") studentScores = gregorScores; else continue;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.
No prompt de comando terminal, digite o build dotnet e pressione Enter.
Se houver mensagens de erro ou de aviso, será necessário corrigi-las 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 95.8 A Andrew 91.2 A- Emma 90.4 A- Logan 93 A Becky 94.8 A Chris 93.4 A Eric 93.4 A Gregor 94.6 A 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, você concluiu este projeto guiado!