Menu
Coddy logo textTech

Generazione dei report

Fa parte della sezione Logica e flusso del percorso C# di Coddy. Lezione 44 di 66.

challenge icon

Sfida

Medio

Ora 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:

  1. 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.
  2. 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: #"
  3. 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

Esercitati da solo: Compilatore C# online