Esercizio - Costruire una struttura a cicli annidati per i calcoli dei voti degli studenti
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:
Creare la matrice di nomi: consente di creare una matrice dei nomi degli studenti.
Creare il ciclo esterno: consente di creare un ciclo
foreachche esegue l'iterazione dei nomi degli studenti.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".
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.
Assicurarsi che il file Program.cs sia aperto nell'editor di Visual Studio Code.
Scorrere fino alla parte superiore del file di codice e quindi individuare le righe di codice usate per dichiarare le matrici dei voti.
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.Per creare una matrice di stringhe denominata
studentNamesche 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.
Per creare un'istruzione
foreachche è possibile usare per eseguire l'iterazione dei nomi degli studenti, immettere il codice seguente:foreach (string name in studentNames) { }Per verificare che il ciclo
foreachesegua l'iterazione della matricestudentNamescome previsto, aggiornare il blocco di codice dell'istruzioneforeachcome indicato di seguito:foreach (string name in studentNames) { Console.WriteLine($"{name}"); }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
foreachcome ciclo esterno dell'applicazione. Durante questo esercizio si implementerà la logica seguente nell'applicazione:Per ognuno degli studenti nella matrice
studentNamesl'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.
Fare clic su Salva nel menu File di Visual Studio Code.
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.
Al prompt dei comandi del terminale digitare dotnet build e quindi premere INVIO.
Il comando
dotnet buildindica al compilatore di compilare l'applicazione. Se vengono rilevati errori, verranno segnalati.Se vengono visualizzati messaggi di errore o di avviso, è necessario correggerli prima di continuare.
Nel prompt dei comandi del terminale, digitare dotnet run e quindi premere INVIO.
Verificare che il codice produca l'output seguente:
Sophia Andrew Emma Logan Student Grade Sophia: 92.2 A- Press the Enter key to continueNota
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.
Nel pannello TERMINALE premere INVIO per arrestare l'applicazione in esecuzione.
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".
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".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:
Selezionare il codice usato per calcolare e visualizzare il voto di Sophia.
È possibile fare clic e trascinare per selezionare le righe di codice.
In Visual Studio Code scegliere Taglia nel menu Modifica.
Nell'editor di Visual Studio Code posizionare il cursore sulla riga di codice vuota sotto il codice seguente:
Console.WriteLine($"{name}");In Visual Studio Code scegliere Incolla nel menu Modifica.
Aggiornare il codice per visualizzare il rientro corretto della riga di codice.
Suggerimento
Visual Studio Code fornisce un comando
Format Documentche 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.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
namedello studente corrente. Questo verrà affrontato a breve.Eliminare il codice seguente:
Console.WriteLine($"{name}");Nella riga di codice vuota appena creata immettere il codice seguente:
if (name == "Sophia") {Creare una riga di codice vuota dopo il codice usato per scrivere il voto di Sophia nella console.
Per chiudere il blocco di codice dell'istruzione
if, immettere il codice seguente:}Aggiornare il codice per visualizzare il rientro corretto della riga di codice.
Suggerimento
Usare il comando
Format Documentper 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.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
ifall'interno del blocco di codiceforeachesterno limita il voto dello studente che viene calcolato e visualizzato. Questo non è esattamente quanto serve, ma è un passo nella giusta direzione.Fare clic su Salva nel menu File di Visual Studio Code.
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.
Al prompt dei comandi del terminale digitare dotnet build e quindi premere INVIO.
Il comando
dotnet buildindica al compilatore di compilare l'applicazione. Se vengono rilevati errori, verranno segnalati.Se vengono visualizzati messaggi di errore o di avviso, è necessario correggerli prima di continuare.
Nel prompt dei comandi del terminale, digitare dotnet run e quindi premere INVIO.
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.
Nel pannello TERMINALE premere INVIO per arrestare l'applicazione in esecuzione.
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.
Creare una riga di codice vuota sotto la dichiarazione della matrice
studentNames.La riga vuota deve essere sopra l'istruzione
foreachesterna.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.
Creare una riga di codice vuota nella parte superiore del blocco di codice
foreachesterno.La riga vuota deve essere all'interno del blocco di codice
foreache sopra l'istruzioneifche valuta senameè uguale a Sophia.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
nameper tenere traccia del nome dello studente corrente durante l'iterazione della matrice di nomi, ma l'uso dicurrentStudentsemplifica la comprensione della logica del codice durante la compilazione dell'applicazione nei passaggi successivi.Per sostituire
currentStudentconnamenell'istruzioneifche valuta senameè uguale a Sophia, aggiornare il codice come indicato di seguito:if (currentStudent == "Sophia")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.
Verificare che il codice nel blocco di codice
foreachesterno 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-"); }Per assegnare la matrice
sophiaScoresastudentScoresquandocurrentStudent == "Sophia", aggiornare il codice dell'istruzioneifcome 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.Per aggiungere un'istruzione
else ifche assegna la matriceandrewScoresastudentScoresquandocurrentStudent == "Andrew", immettere il codice seguente:else if (currentStudent == "Andrew") studentScores = andrewScores;Creare un'altra istruzione
else ifper assegnare la matriceemmaScoresastudentScoresquandocurrentStudent == "Emma".Creare un'istruzione
else ifper assegnare la matriceloganScoresastudentScoresquandocurrentStudent == "Logan".Assicurarsi che il blocco di codice
foreachcorrisponda 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
foreachinterno per usarestudentScorese "depersonalizzare" le variabili usate nei calcoli.Per sostituire
studentScoresconsophiaScoresnel cicloforeachche esegue l'iterazione della matrice dei voti, aggiornare il codice come indicato di seguito:foreach (int score in studentScores)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;Per applicare il nuovo nome di variabile all'equazione usata per sommare i voti degli studenti, aggiornare il blocco di codice
foreachinterno come indicato di seguito:foreach (int score in studentScores) { // add the exam score to the sum sumAssignmentScores += score; }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;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
foreachannidati 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.Per stampare il nome dello studente e il voto calcolato nella console, aggiornare la seconda istruzione
Console.WriteLinecome 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.
Spostare l'istruzione
Console.WriteLineusata per scrivere le etichette di colonna del report dei voti subito prima il cicloforeachesterno.Non si vogliono ripetere le intestazioni di colonna per ogni voto degli studenti, quindi si sposta questo codice in un punto sopra il ciclo
foreachesterno.Fare clic su Salva nel menu File di Visual Studio Code.
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.
Assicurarsi di aver salvato le modifiche apportate al file Program.cs.
Nella visualizzazione EXPLORER di Visual Studio Code fare clic con il pulsante destro del mouse su Starter e quindi scegliere Apri nel terminale integrato.
Nel prompt dei comandi del terminale, digitare dotnet build e quindi premere INVIO.
Se vengono visualizzati messaggi di errore o di avviso, è necessario correggerli prima di continuare.
Nel prompt dei comandi del terminale, digitare dotnet run e quindi premere INVIO.
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 continueNel pannello TERMINALE, premere INVIO per arrestare l'applicazione in esecuzione.
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.