Esercizio - Costruire una struttura a cicli annidati per i calcoli dei voti degli studenti

Completato

In questo esercizio si aggiunge una matrice di stringhe per contenere i nomi degli studenti e quindi si implementa una struttura annidata foreach che scorre i nomi degli studenti in un ciclo esterno e i punteggi degli studenti nel ciclo interno. Si inizia creando la studentNames matrice e un foreach ciclo che scorre gli elementi della matrice. Successivamente, si inserisce il codice utilizzato per calcolare i voti scolastici di Sophia nel blocco di codice del ciclo "names". Infine, si implementa la logica del codice che usa il nome dello studente per accedere alla matrice dei punteggi, calcolare il punteggio medio e scrivere il voto nella console. Le attività dettagliate completate durante questo esercizio sono:

  1. Creare la matrice di nomi: consente di creare una matrice dei nomi degli studenti.

  2. Creare il ciclo esterno: consente di creare un ciclo foreach che esegue l'iterazione dei nomi degli studenti.

  3. Sviluppare il blocco di codice del ciclo esterno: consente di rilocare il codice che calcola e visualizza il voto di Sophia, inserendolo nel blocco di codice del ciclo "names".

  4. Aggiornare calcoli e report: consente di aggiornare il codice che esegue i calcoli dei voti degli studenti usando una nuova matrice dei voti.

Importante

Prima di iniziare questo esercizio, è necessario aver completato l'esercizio precedente contenuto nel modulo "Creare matrici e cicli foreach".

Creare una matrice di nomi degli studenti e un ciclo foreach esterno

In questa attività si creerà una matrice di nomi degli studenti e un ciclo foreach che esegue l'iterazione dei nomi degli studenti.

  1. Assicurarsi che il file Program.cs sia aperto nell'editor di Visual Studio Code.

  2. Scorrere fino alla parte superiore del file di codice e quindi individuare le righe di codice usate per dichiarare le matrici dei voti.

  3. Creare una riga di codice vuota sotto la dichiarazione delle matrici dei voti.

    La riga di codice vuota deve trovarsi tra le righe usate per dichiarare le matrici dei voti e la riga usata per dichiarare sophiaSum.

  4. Per creare una matrice di stringhe denominata studentNames che contiene i nomi degli studenti, immettere il codice seguente:

    // Student names
    string[] studentNames = new string[] { "Sophia", "Andrew", "Emma", "Logan" };
    

    Si noti che i nomi degli studenti sono stati specificati nella dichiarazione.

  5. Per creare un'istruzione foreach che è possibile usare per eseguire l'iterazione dei nomi degli studenti, immettere il codice seguente:

    foreach (string name in studentNames)
    {
    }
    
  6. Per verificare che il ciclo foreach esegua l'iterazione della matrice studentNames come previsto, aggiornare il blocco di codice dell'istruzione foreach come indicato di seguito:

    foreach (string name in studentNames)
    {
        Console.WriteLine($"{name}");
    
    }
    
  7. Soffermarsi un momento a esaminare il codice creato.

    // Student names
    string[] studentNames = new string[] { "Sophia", "Andrew", "Emma", "Logan" };
    
    foreach (string name in studentNames)
    {
        Console.WriteLine($"{name}");
    
    }
    

    Il codice userà questo ciclo foreach come ciclo esterno dell'applicazione. Durante questo esercizio si implementerà la logica seguente nell'applicazione:

    Per ognuno degli studenti nella matrice studentNames l'applicazione:

    • determinerà lo studente corrente.
    • accederà ai voti dello studente corrente.
    • calcolerà il voto dello studente corrente (somma e media).
    • scriverà il voto dello studente corrente nella console.

    Per il momento, tuttavia, si scriveranno solo i nomi degli studenti nella console.

  8. Fare clic su Salva nel menu File di Visual Studio Code.

  9. Nella visualizzazione EXPLORER di Visual Studio Code fare clic con il pulsante destro del mouse su Starter e quindi scegliere Apri nel terminale integrato.

    Importante

    Il prompt dei comandi del terminale deve visualizzare il percorso della cartella per il file Program.cs.

  10. Al prompt dei comandi del terminale digitare dotnet build e quindi premere INVIO.

    Il comando dotnet build indica al compilatore di compilare l'applicazione. Se vengono rilevati errori, verranno segnalati.

  11. Se vengono visualizzati messaggi di errore o di avviso, è necessario correggerli prima di continuare.

  12. Nel prompt dei comandi del terminale, digitare dotnet run e quindi premere INVIO.

  13. Verificare che il codice produca l'output seguente:

    Sophia
    Andrew
    Emma
    Logan
    Student         Grade
    
    Sophia:         92.2    A-
    Press the Enter key to continue
    

    Nota

    Se non viene visualizzato l'elenco dei nomi degli studenti sopra il report dei voti di Sophia, tornare indietro e verificare che il codice sia stato immesso correttamente.

  14. Nel pannello TERMINALE premere INVIO per arrestare l'applicazione in esecuzione.

  15. Chiudere il pannello Terminale.

Calcolare il voto di Sophia all'interno del ciclo esterno dei nomi

In questa attività si rilocherà il codice che calcola e visualizza il voto di Sophia, inserendolo nel blocco di codice del ciclo "names".

  1. Nell'editor di Visual Studio Code individuare le righe di codice usate per calcolare e visualizzare il voto di 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-");
    

    Nota

    Il passaggio successivo consiste nello spostare questo codice dalla posizione corrente al blocco di codice del ciclo foreach "names".

  2. Usare un'operazione taglia e incolla per spostare il codice che calcola e visualizza il voto di Sophia al blocco di codice del ciclo foreach "names".

    Se non si è certi di come eseguire l'operazione per tagliare e incollare in Visual Studio Code, provare l'approccio descritto nei passaggi seguenti:

    1. Selezionare il codice usato per calcolare e visualizzare il voto di Sophia.

      È possibile fare clic e trascinare per selezionare le righe di codice.

    2. In Visual Studio Code scegliere Taglia nel menu Modifica.

    3. Nell'editor di Visual Studio Code posizionare il cursore sulla riga di codice vuota sotto il codice seguente: Console.WriteLine($"{name}");

    4. In Visual Studio Code scegliere Incolla nel menu Modifica.

  3. Aggiornare il codice per visualizzare il rientro corretto della riga di codice.

    Suggerimento

    Visual Studio Code fornisce un comando Format Document che può essere usato per mantenere aggiornata la formattazione del codice. Fare clic con il pulsante destro del mouse all'interno dell'editor di Visual Studio Code e quindi scegliere Formatta documento dal menu di scelta rapida. Nei computer Windows il tasto di scelta rapida per questo comando è: Shift + Alt + F. I computer Linux e macOS usano collegamenti alternativi quando necessario per evitare conflitti con i collegamenti forniti dal sistema operativo.

  4. Assicurarsi che gli aggiornamenti corrispondano al codice seguente:

    // 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();
    

    Si noti che, a questo punto, il codice calcolerà e visualizzerà il voto di Sophia indipendentemente dall'oggetto name dello studente corrente. Questo verrà affrontato a breve.

  5. Eliminare il codice seguente:

    Console.WriteLine($"{name}");
    
  6. Nella riga di codice vuota appena creata immettere il codice seguente:

    if (name == "Sophia")
    {    
    
  7. Creare una riga di codice vuota dopo il codice usato per scrivere il voto di Sophia nella console.

  8. Per chiudere il blocco di codice dell'istruzione if, immettere il codice seguente:

    }    
    
  9. Aggiornare il codice per visualizzare il rientro corretto della riga di codice.

    Suggerimento

    Usare il comando Format Document per mantenere aggiornata la formattazione del codice. Fare clic con il pulsante destro del mouse all'interno del pannello dell'editor di Visual Studio Code e quindi scegliere Formatta documento dal menu di scelta rapida.

  10. Dedicare qualche minuto alla revisione del codice.

    Il codice dovrebbe corrispondere al seguente:

    // 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();
    

    Si noti che l'istruzione if all'interno del blocco di codice foreach esterno limita il voto dello studente che viene calcolato e visualizzato. Questo non è esattamente quanto serve, ma è un passo nella giusta direzione.

  11. Fare clic su Salva nel menu File di Visual Studio Code.

  12. Nella visualizzazione EXPLORER di Visual Studio Code fare clic con il pulsante destro del mouse su Starter e quindi scegliere Apri nel terminale integrato.

    Importante

    Il prompt dei comandi del terminale deve visualizzare il percorso della cartella per il file Program.cs.

  13. Al prompt dei comandi del terminale digitare dotnet build e quindi premere INVIO.

    Il comando dotnet build indica al compilatore di compilare l'applicazione. Se vengono rilevati errori, verranno segnalati.

  14. Se vengono visualizzati messaggi di errore o di avviso, è necessario correggerli prima di continuare.

  15. Nel prompt dei comandi del terminale, digitare dotnet run e quindi premere INVIO.

  16. Verificare che il codice produca l'output seguente:

    Student         Grade
    
    Sophia:         92.2    A-
    

    Nota

    Se viene ancora visualizzato l'elenco dei nomi degli studenti visualizzati sopra il report dei voti di Sophia, assicurarsi di aver salvato gli aggiornamenti.

  17. Nel pannello TERMINALE premere INVIO per arrestare l'applicazione in esecuzione.

  18. Chiudere il pannello Terminale.

Aggiornare il ciclo annidato per calcolare tutti i voti degli studenti

In questa attività si aggiornerà il codice che esegue i calcoli dei voti degli studenti usando una nuova matrice dei voti. Si inizierà creando una matrice denominata studentScores che può essere usata per contenere i voti di qualsiasi studente. Successivamente, si creerà un costrutto if .. elseif che usa il nome dello studente corrente per assegnare la matrice dei voti a studentScores. Infine, si aggiornerà il codice che calcola e visualizza i voti dello studente. Al termine, il report deve includere il nome e il voto numerico per tutti gli studenti.

  1. Creare una riga di codice vuota sotto la dichiarazione della matrice studentNames.

    La riga vuota deve essere sopra l'istruzione foreach esterna.

  2. Per creare una matrice di numeri interi che è possibile usare per contenere i voti dello studente corrente, immettere il codice seguente:

    int[] studentScores = new int[10];
    
    

    Si noti che questo codice non assegna valori alla matrice a questo punto. È sufficiente specificare che la matrice può contenere 10 elementi.

  3. Creare una riga di codice vuota nella parte superiore del blocco di codice foreach esterno.

    La riga vuota deve essere all'interno del blocco di codice foreach e sopra l'istruzione if che valuta se name è uguale a Sophia.

  4. Per creare una variabile stringa che verrà usata per contenere il nome dello studente corrente, immettere il codice seguente:

    string currentStudent = name;
    
    

    Nota

    È possibile continuare a usare name per tenere traccia del nome dello studente corrente durante l'iterazione della matrice di nomi, ma l'uso di currentStudent semplifica la comprensione della logica del codice durante la compilazione dell'applicazione nei passaggi successivi.

  5. Per sostituire currentStudentcon name nell'istruzione if che valuta se name è uguale a Sophia, aggiornare il codice come indicato di seguito:

    if (currentStudent == "Sophia")
    
  6. Spostare il codice che calcola e visualizza il voto di Sophia in una posizione sotto il blocco di codice.

    Si intende spostare tutto il codice presente nel blocco di codice in un percorso sotto il blocco di codice. Il motivo per farlo diventerà evidente durante i prossimi passaggi.

  7. Verificare che il codice nel blocco di codice foreach esterno corrisponda al codice seguente:

    {
        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. Per assegnare la matrice sophiaScores a studentScores quando currentStudent == "Sophia", aggiornare il codice dell'istruzione if come segue:

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

    Si noti che durante questo aggiornamento del codice sono state rimosse le parentesi graffe dal blocco di codice dell'istruzione if.

  9. Per aggiungere un'istruzione else if che assegna la matrice andrewScores a studentScores quando currentStudent == "Andrew", immettere il codice seguente:

    else if (currentStudent == "Andrew")
        studentScores = andrewScores;
    
    
  10. Creare un'altra istruzione else if per assegnare la matrice emmaScores a studentScores quando currentStudent == "Emma".

  11. Creare un'istruzione else if per assegnare la matrice loganScores a studentScores quando currentStudent == "Logan".

  12. Assicurarsi che il blocco di codice foreach corrisponda al codice seguente:

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

    A questo punto, è necessario aggiornare il ciclo foreach interno per usare studentScores e "depersonalizzare" le variabili usate nei calcoli.

  13. Per sostituire studentScores con sophiaScores nel ciclo foreach che esegue l'iterazione della matrice dei voti, aggiornare il codice come indicato di seguito:

    foreach (int score in studentScores)
    
  14. Per sostituire le dichiarazioni di variabile specifiche di Sophia con nomi più generici, aggiornare il codice come indicato di seguito:

    int sumAssignmentScores = 0;
    
    decimal currentStudentGrade = 0;
    

    Queste due dichiarazioni di variabili sono destinate a sostituire le dichiarazioni di variabili specifiche di Sophia seguenti:

    int sophiaSum = 0;
    
    decimal sophiaScore;
    
  15. Per applicare il nuovo nome di variabile all'equazione usata per sommare i voti degli studenti, aggiornare il blocco di codice foreach interno come indicato di seguito:

    foreach (int score in studentScores)
    {
        // add the exam score to the sum
        sumAssignmentScores += score;
    }
    
  16. Per applicare il nuovo nome di variabile all'equazione usata per calcolare la media dei voti, aggiornare il codice come indicato di seguito:

    currentStudentGrade = (decimal)(sumAssignmentScores) / currentAssignments;
    
  17. Dedicare qualche minuto alla revisione del codice.

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

    I cicli foreach annidati ora eseguiranno l'iterazione dei nomi degli studenti e useranno i voti degli studenti per calcolare i punteggi, ma è comunque necessario aggiornare il codice usato per generare il report dei voti.

  18. Per stampare il nome dello studente e il voto calcolato nella console, aggiornare la seconda istruzione Console.WriteLine come indicato di seguito:

    Console.WriteLine($"{currentStudent}\t\t{currentStudentGrade}\t?");
    

    Si noti che questo codice ha sostituito l'assegnazione del punteggio in lettere con un punto interrogativo "?". Si lavorerà sull'automazione dell'assegnazione dei voti in lettere nell'esercizio successivo.

  19. Spostare l'istruzione Console.WriteLine usata per scrivere le etichette di colonna del report dei voti subito prima il ciclo foreach esterno.

    Non si vogliono ripetere le intestazioni di colonna per ogni voto degli studenti, quindi si sposta questo codice in un punto sopra il ciclo foreach esterno.

  20. Fare clic su Salva nel menu File di Visual Studio Code.

  21. Dedicare qualche minuto alla revisione del codice dell'applicazione.

    L'applicazione completa dovrebbe ora corrispondere al codice seguente:

    // 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?");
    }
    

    Una volta aggiornato il codice che genera il report dei voti dello studente, è possibile passare al controllo del lavoro.

Eseguire il test di quanto fatto finora

In questa attività si eseguirà l'applicazione per verificare che la logica del codice funzioni come previsto.

  1. Assicurarsi di aver salvato le modifiche apportate al file Program.cs.

  2. Nella visualizzazione EXPLORER di Visual Studio Code fare clic con il pulsante destro del mouse su Starter e quindi scegliere Apri nel terminale integrato.

  3. Nel prompt dei comandi del terminale, digitare dotnet build e quindi premere INVIO.

  4. Se vengono visualizzati messaggi di errore o di avviso, è necessario correggerli prima di continuare.

  5. Nel prompt dei comandi del terminale, digitare dotnet run e quindi premere INVIO.

  6. Verificare che il codice produca l'output seguente:

    Student         Grade
    
    Sophia          92.2    ?
    Andrew          89.6    ?
    Emma            85.6    ?
    Logan           91.2    ?
    Press the Enter key to continue
    
  7. Nel pannello TERMINALE, premere INVIO per arrestare l'applicazione in esecuzione.

  8. Chiudere il pannello Terminale.

Congratulazioni, la tua applicazione ha fatto molta strada rispetto all'inizio. Stai usando in modo efficiente gli array e le foreach iterazioni, e hai integrato un'istruzione if che consente al codice di selezionare l'array di punteggi corretto.