Generazione dei report
Fa parte della sezione Logica e flusso del percorso C# di Coddy. Lezione 44 di 66.
Sfida
MedioOra che abbiamo il sistema di valutazione, creiamo un modulo di reportistica per generare report formattati sul rendimento degli studenti. Crea una classe chiamata ReportGenerator con questi metodi:
GenerateStudentReport(int[][] scoreGrid, int studentIndex): restituisce una stringa formattata che riporta i punteggi, la media e il voto in lettere di uno studente specifico.- Formato: "Student #X | Average: YY.Y | Grade: Z\nAssignment scores: S1, S2, S3, ..." dove S1, S2, S3, ... sono i punteggi numerici di ogni compito.
- Per i compiti non valutati (punteggio pari a -1), visualizza "N/A" invece del punteggio.
- Restituisci "Invalid student index" per qualsiasi indice studente non valido.
GenerateClassSummary(int[][] scoreGrid): restituisce una stringa formattata che riassume il rendimento della classe.- Formato: "Class Summary\nTotal Students: X\nClass Average: YY.Y\nGrade Distribution: A: #, B: #, C: #, D: #, F: #"
GenerateAssignmentReport(int[][] scoreGrid, int assignmentIndex): restituisce una stringa formattata con le statistiche di un compito specifico.- Formato: "Assignment #X | Average: YY.Y | Completion Rate: Z%"
- Il tasso di completamento è la percentuale di studenti che hanno un voto per questo compito (diverso da -1).
- Restituisci "Invalid assignment index" per qualsiasi indice del compito non valido.
Provalo tu
using System; // Non eliminare questa riga
using System.Text;
public class ReportGenerator
{
public static string GenerateStudentReport(int[][] scoreGrid, int studentIndex)
{
// Scrivi il tuo codice qui
}
public static string GenerateClassSummary(int[][] scoreGrid)
{
// Scrivi il tuo codice qui
}
public static string GenerateAssignmentReport(int[][] scoreGrid, int assignmentIndex)
{
// Scrivi il tuo codice qui
}
}
// Necessario per i test - non modificare
public class DataCollector
{
public static int[][] CreateScoreGrid(int students, int assignments)
{
int[][] scoreGrid = new int[students][];
for (int i = 0; i < students; i++)
{
scoreGrid[i] = new int[assignments];
}
return scoreGrid;
}
public static bool ValidateScore(int score)
{
return score >= 0 && score <= 100;
}
public static int[][] PopulateWithDefaultValues(int[][] scoreGrid)
{
for (int i = 0; i < scoreGrid.Length; i++)
{
for (int j = 0; j < scoreGrid[i].Length; j++)
{
scoreGrid[i][j] = -1;
}
}
return scoreGrid;
}
}
public class DataEntry
{
public static int SetStudentScore(int[][] scoreGrid, int studentIndex, int assignmentIndex, int score)
{
// Controlla se gli indici sono fuori dai limiti
if (studentIndex < 0 || studentIndex >= scoreGrid.Length ||
assignmentIndex < 0 || assignmentIndex >= scoreGrid[studentIndex].Length)
{
return -1;
}
// Verifica che il punteggio sia valido
if (!DataCollector.ValidateScore(score))
{
return -2;
}
// Imposta il punteggio
scoreGrid[studentIndex][assignmentIndex] = score;
return 0;
}
public static int UpdateAllScores(int[][] scoreGrid, int[] studentIndices, int assignmentIndex, int score)
{
int successCount = 0;
for (int i = 0; i < studentIndices.Length; i++)
{
int result = SetStudentScore(scoreGrid, studentIndices[i], assignmentIndex, score);
if (result == 0)
{
successCount++;
}
}
return successCount;
}
}
public class DataAnalyzer
{
public static double CalculateStudentAverage(int[][] scoreGrid, int studentIndex)
{
// Controlla se l'indice dello studente è valido
if (studentIndex < 0 || studentIndex >= scoreGrid.Length)
{
return -1;
}
int sum = 0;
int count = 0;
// Calcola la somma dei punteggi validi
for (int j = 0; j < scoreGrid[studentIndex].Length; j++)
{
int score = scoreGrid[studentIndex][j];
if (score != -1) // Ignora i compiti non ancora valutati
{
sum += score;
count++;
}
}
// Restituisci la media o 0 se non ci sono punteggi validi
return count > 0 ? (double)sum / count : 0;
}
public static double CalculateAssignmentAverage(int[][] scoreGrid, int assignmentIndex)
{
// Controlla se ci sono studenti
if (scoreGrid.Length == 0)
{
return -1;
}
// Controlla se l'indice del compito è valido
if (assignmentIndex < 0 || assignmentIndex >= scoreGrid[0].Length)
{
return -1;
}
int sum = 0;
int count = 0;
// Calcola la somma dei punteggi validi per il compito
for (int i = 0; i < scoreGrid.Length; i++)
{
if (assignmentIndex < scoreGrid[i].Length)
{
int score = scoreGrid[i][assignmentIndex];
if (score != -1) // Ignora i compiti non ancora valutati
{
sum += score;
count++;
}
}
}
// Restituisci la media o 0 se non ci sono punteggi validi
return count > 0 ? (double)sum / count : 0;
}
public static int[] FindHighestScore(int[][] scoreGrid)
{
int highestStudentIndex = 0;
int highestAssignmentIndex = 0;
int highestScore = -1;
// Cerca il punteggio più alto
for (int i = 0; i < scoreGrid.Length; i++)
{
for (int j = 0; j < scoreGrid[i].Length; j++)
{
int currentScore = scoreGrid[i][j];
if (currentScore > highestScore)
{
highestScore = currentScore;
highestStudentIndex = i;
highestAssignmentIndex = j;
}
}
}
return new int[] { highestStudentIndex, highestAssignmentIndex, highestScore };
}
}
public class GradingSystem
{
public static string ConvertToLetterGrade(double score)
{
if (score < 0 || score > 100)
{
return "N/A";
}
else if (score >= 90)
{
return "A";
}
else if (score >= 80)
{
return "B";
}
else if (score >= 70)
{
return "C";
}
else if (score >= 60)
{
return "D";
}
else
{
return "F";
}
}
public static string GetStudentGrade(int[][] scoreGrid, int studentIndex)
{
double average = DataAnalyzer.CalculateStudentAverage(scoreGrid, studentIndex);
if (average == -1)
{
return "N/A";
}
return ConvertToLetterGrade(average);
}
public static int[] GetClassDistribution(int[][] scoreGrid)
{
int[] distribution = new int[5]; // [A, B, C, D, F]
for (int i = 0; i < scoreGrid.Length; i++)
{
string grade = GetStudentGrade(scoreGrid, i);
switch (grade)
{
case "A":
distribution[0]++;
break;
case "B":
distribution[1]++;
break;
case "C":
distribution[2]++;
break;
case "D":
distribution[3]++;
break;
case "F":
distribution[4]++;
break;
// I voti N/A non vengono conteggiati nella distribuzione
}
}
return distribution;
}
}Tutte le lezioni di Logica e flusso
1Array multidimensionali
Fondamenti degli array 2DDichiarare e inizializzare array 2DAccedere agli elementi di un array 2DCicli annidati con array 2DArray irregolariOperazioni comuni sulle matriciRipasso: array multidimensionali4Tecniche di controllo del flusso
Uscite anticipateClausole di guardiaIstruzioni di salto (goto)Break e continueAppiattire le condizioni annidate2Decisioni avanzate
Condizioni multipleLogica booleana complessaConfronto tra if e switchIstruzioni switch annidateRiepilogo - decisioni avanzate5Gestione delle eccezioni
Nozioni di base su try-catchTipi di eccezioneBlocchi catch multipliLavorare con i fileBlocco finallyUsing vs. try-finallyEccezioni personalizzateRiepilogo - gestione degli errori8Sistema di analisi dei dati
Configurazione della raccolta datiLogica di inserimento dei dati3Miglioramenti dei cicli
Prestazioni dei cicliIterare strutture complesseOgni tipo di cicloRifattorizzare i cicliRiepilogo - Cicli ottimizzati6Gestione dei valori null
Fondamenti dei riferimenti nullTipi valore nullableSchemi di controllo dei valori nullProgrammazione difensivaRiepilogo: sicurezza rispetto ai valori nullEsercitati da solo: Compilatore C# online