Menu
CoddyTech

Penanganan error

Termasuk bagian Logika dan Alur dalam perjalanan C# di Coddy. Pelajaran 45 dari 66.

challenge icon

Tantangan

Mudah

Mari tingkatkan sistem kita dengan penanganan error yang tangguh agar dapat menangani potensi masalah dengan baik. Buat class bernama ErrorHandler dengan method berikut:

  1. ValidateInput(int[][] scoreGrid, int studentIndex, int assignmentIndex): Memvalidasi indeks input dan mengembalikan pesan error yang sesuai atau string kosong jika valid.
    • Mengembalikan "Invalid student index" jika indeks siswa berada di luar batas.
    • Mengembalikan "Invalid assignment index" jika indeks tugas berada di luar batas.
    • Mengembalikan string kosong "" jika kedua indeks valid.
  2. SafeGetScore(int[][] scoreGrid, int studentIndex, int assignmentIndex): Mengambil nilai dengan aman menggunakan penanganan error.
    • Mengembalikan nilai jika kedua indeks valid.
    • Mengembalikan -999 jika salah satu indeks tidak valid.
  3. ProcessBatchUpdate(int[][] scoreGrid, int[][] updates): Memproses pembaruan batch, dengan setiap pembaruan berupa [studentIndex, assignmentIndex, score].
    • Mengembalikan array string[] berisi pesan error untuk setiap pembaruan yang gagal.
    • Setiap pembaruan dapat gagal dengan salah satu pesan error berikut:
      • "Invalid update format", jika pembaruan tidak berisi tepat 3 nilai.
      • "Invalid student index": jika indeks siswa berada di luar batas.
      • "Invalid assignment index": jika indeks tugas berada di luar batas.
      • "Invalid score value": jika nilai berada di luar rentang yang valid (0-100).
    • Format setiap error seperti berikut: "Error at index X: [specific error message]"
    • Mengembalikan array kosong jika semua pembaruan berhasil.
Petunjuk: Untuk mengumpulkan error secara dinamis sebelum mengembalikannya sebagai string[], gunakan List<string> errors = new List<string>();. List<string> berfungsi seperti array yang ukurannya dapat diubah, tempat kamu bisa memanggil errors.Add(...) untuk menambahkan item. Di akhir, ubah menjadi array dengan errors.ToArray(). Import using System.Collections.Generic; yang diperlukan untuk ini sudah disertakan di bagian atas file.

Coba sendiri

using System; // Jangan hapus baris ini
using System.Collections.Generic;

public class ErrorHandler
{
    public static string ValidateInput(int[][] scoreGrid, int studentIndex, int assignmentIndex)
    {
        // Tulis kodemu di sini
        
    }
    
    public static int SafeGetScore(int[][] scoreGrid, int studentIndex, int assignmentIndex)
    {
        // Tulis kodemu di sini
        
    }
    
    public static string[] ProcessBatchUpdate(int[][] scoreGrid, int[][] updates)
    {
        // Tulis kodemu di sini
        
    }
}

// Diperlukan untuk pengujian, jangan ubah
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)
    {
        // Periksa apakah ada indeks di luar batas
        if (studentIndex < 0 || studentIndex >= scoreGrid.Length || 
            assignmentIndex < 0 || assignmentIndex >= scoreGrid[studentIndex].Length)
        {
            return -1;
        }
        
        // Validasi nilai
        if (!DataCollector.ValidateScore(score))
        {
            return -2;
        }
        
        // Tetapkan nilai
        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)
    {
        // Periksa apakah indeks siswa valid
        if (studentIndex < 0 || studentIndex >= scoreGrid.Length)
        {
            return -1;
        }
        
        int sum = 0;
        int count = 0;
        
        // Hitung jumlah nilai yang valid
        for (int j = 0; j < scoreGrid[studentIndex].Length; j++)
        {
            int score = scoreGrid[studentIndex][j];
            if (score != -1)  // Abaikan tugas yang belum dinilai
            {
                sum += score;
                count++;
            }
        }
        
        // Kembalikan rata-rata atau 0 jika tidak ada nilai yang valid
        return count > 0 ? (double)sum / count : 0;
    }
    
    public static double CalculateAssignmentAverage(int[][] scoreGrid, int assignmentIndex)
    {
        // Periksa apakah ada siswa
        if (scoreGrid.Length == 0)
        {
            return -1;
        }
        
        // Periksa apakah indeks tugas valid
        if (assignmentIndex < 0 || assignmentIndex >= scoreGrid[0].Length)
        {
            return -1;
        }
        
        int sum = 0;
        int count = 0;
        
        // Hitung jumlah nilai yang valid untuk tugas tersebut
        for (int i = 0; i < scoreGrid.Length; i++)
        {
            if (assignmentIndex < scoreGrid[i].Length)
            {
                int score = scoreGrid[i][assignmentIndex];
                if (score != -1)  // Abaikan tugas yang belum dinilai
                {
                    sum += score;
                    count++;
                }
            }
        }
        
        // Kembalikan rata-rata atau 0 jika tidak ada nilai yang valid
        return count > 0 ? (double)sum / count : 0;
    }
    
    public static int[] FindHighestScore(int[][] scoreGrid)
    {
        int highestStudentIndex = 0;
        int highestAssignmentIndex = 0;
        int highestScore = -1;
        
        // Cari nilai tertinggi
        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 };
    }
}

Semua pelajaran di Logika dan Alur

Latihan sendiri: Compiler C# online