Menu
CoddyTech

Génération de rapports

Fait partie de la section Logique & Flux du Journey C# de Coddy. Leçon 44 sur 66.

challenge icon

Défi

Moyen

Maintenant que nous avons le système de notation, créons un module de génération de rapports pour produire des rapports formatés sur les résultats des élèves. Crée une classe appelée ReportGenerator avec ces méthodes :

  1. GenerateStudentReport(int[][] scoreGrid, int studentIndex) : renvoie une chaîne formatée présentant les notes, la moyenne et la note en lettres d’un élève précis.
    • Format : "Student #X | Average: YY.Y | Grade: Z\nAssignment scores: S1, S2, S3, ..." où S1, S2, S3, ... sont les notes numériques de chaque devoir.
    • Pour les devoirs non notés (note égale à -1), affiche "N/A" à la place de la note.
    • Renvoie "Invalid student index" pour tout index d’élève non valide.
  2. GenerateClassSummary(int[][] scoreGrid) : renvoie une chaîne formatée résumant les résultats de la classe.
    • Format : "Class Summary\nTotal Students: X\nClass Average: YY.Y\nGrade Distribution: A: #, B: #, C: #, D: #, F: #"
  3. GenerateAssignmentReport(int[][] scoreGrid, int assignmentIndex) : renvoie une chaîne formatée contenant des statistiques sur un devoir précis.
    • Format : "Assignment #X | Average: YY.Y | Completion Rate: Z%"
    • Le taux de réalisation correspond au pourcentage d’élèves ayant une note pour ce devoir (différente de -1).
    • Renvoie "Invalid assignment index" pour tout index de devoir non valide.

Essayez vous-même

using System; // Ne supprimez pas cette ligne
using System.Text;

public class ReportGenerator
{
    public static string GenerateStudentReport(int[][] scoreGrid, int studentIndex)
    {
        // Écrivez votre code ici
        
    }
    
    public static string GenerateClassSummary(int[][] scoreGrid)
    {
        // Écrivez votre code ici
        
    }
    
    public static string GenerateAssignmentReport(int[][] scoreGrid, int assignmentIndex)
    {
        // Écrivez votre code ici
        
    }
}

// Nécessaire pour les tests - ne pas modifier
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)
    {
        // Vérifiez si les indices sont hors limites
        if (studentIndex < 0 || studentIndex >= scoreGrid.Length || 
            assignmentIndex < 0 || assignmentIndex >= scoreGrid[studentIndex].Length)
        {
            return -1;
        }
        
        // Vérifiez la validité de la note
        if (!DataCollector.ValidateScore(score))
        {
            return -2;
        }
        
        // Définissez la note
        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)
    {
        // Vérifiez si l’indice de l’étudiant est valide
        if (studentIndex < 0 || studentIndex >= scoreGrid.Length)
        {
            return -1;
        }
        
        int sum = 0;
        int count = 0;
        
        // Calculez la somme des notes valides
        for (int j = 0; j < scoreGrid[studentIndex].Length; j++)
        {
            int score = scoreGrid[studentIndex][j];
            if (score != -1)  // Ignorez les devoirs non notés
            {
                sum += score;
                count++;
            }
        }
        
        // Renvoyez la moyenne ou 0 s’il n’y a aucune note valide
        return count > 0 ? (double)sum / count : 0;
    }
    
    public static double CalculateAssignmentAverage(int[][] scoreGrid, int assignmentIndex)
    {
        // Vérifiez s’il y a des étudiants
        if (scoreGrid.Length == 0)
        {
            return -1;
        }
        
        // Vérifiez si l’indice du devoir est valide
        if (assignmentIndex < 0 || assignmentIndex >= scoreGrid[0].Length)
        {
            return -1;
        }
        
        int sum = 0;
        int count = 0;
        
        // Calculer la somme des notes valides pour le devoir
        for (int i = 0; i < scoreGrid.Length; i++)
        {
            if (assignmentIndex < scoreGrid[i].Length)
            {
                int score = scoreGrid[i][assignmentIndex];
                if (score != -1)  // Ignorez les devoirs non notés
                {
                    sum += score;
                    count++;
                }
            }
        }
        
        // Renvoyez la moyenne ou 0 s’il n’y a aucune note valide
        return count > 0 ? (double)sum / count : 0;
    }
    
    public static int[] FindHighestScore(int[][] scoreGrid)
    {
        int highestStudentIndex = 0;
        int highestAssignmentIndex = 0;
        int highestScore = -1;
        
        // Rechercher la note la plus élevée
        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;
                // Les notes N/A ne sont pas prises en compte dans la répartition
            }
        }
        
        return distribution;
    }
}

Toutes les leçons de Logique & Flux

Entraînez-vous par vous-même : Compilateur C# en ligne