تحليل البيانات
جزء من قسم Logic & Flow في رحلة C# على Coddy — الدرس 42 من 66.
التحدي
متوسطالآن بعد أن أصبح بإمكاننا جمع وتحديث بيانات الطلاب، دعنا نقوم بتنفيذ وظائف التحليل للحصول على رؤى من الدرجات. قم بإنشاء فئة تسمى DataAnalyzer تحتوي على هذه الطرق (methods):
CalculateStudentAverage(int[][] scoreGrid, int studentIndex): يحسب ويعيد متوسط الدرجات لطالب معين. أعد -1 إذا كان studentIndex غير صالح.CalculateAssignmentAverage(int[][] scoreGrid, int assignmentIndex): يحسب ويعيد متوسط الدرجات لمهمة معينة لجميع الطلاب. أعد -1 إذا كان assignmentIndex غير صالح.FindHighestScore(int[][] scoreGrid): يعيد مصفوفة من ثلاثة أعداد صحيحة تمثل أعلى درجة وموقعها: [studentIndex, assignmentIndex, score]. إذا كانت هناك عدة إدخالات لها نفس أعلى درجة، فأعد أول إدخال تم العثور عليه.
ملاحظة: عند حساب المتوسطات، خذ في الاعتبار الدرجات الصالحة فقط (0-100). تجاهل المهام غير المصنفة (-1).
جرّب بنفسك
using System; // لا تحذف هذا السطر
public class DataAnalyzer
{
public static double CalculateStudentAverage(int[][] scoreGrid, int studentIndex)
{
// اكتب كودك هنا
}
public static double CalculateAssignmentAverage(int[][] scoreGrid, int assignmentIndex)
{
// اكتب كودك هنا
}
public static int[] FindHighestScore(int[][] scoreGrid)
{
// اكتب كودك هنا
}
}
// مطلوب للاختبار - لا تقم بالتعديل
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)
{
// التحقق من الفهارس الخارجة عن النطاق
if (studentIndex < 0 || studentIndex >= scoreGrid.Length ||
assignmentIndex < 0 || assignmentIndex >= scoreGrid[studentIndex].Length)
{
return -1;
}
// التحقق من صحة الدرجة
if (!DataCollector.ValidateScore(score))
{
return -2;
}
// تعيين الدرجة
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;
}
}جميع دروس Logic & Flow
1المصفوفات متعددة الأبعاد
أساسيات المصفوفات ثنائية الأبعادتعريف وتهيئة المصفوفات ثنائية الأبعادالوصول إلى عناصر المصفوفة ثنائية الأبعادالحلقات المتداخلة مع المصفوفات ثنائية الأبعادالمصفوفات المتعرجة (Jagged Arrays)عمليات المصفوفات الشائعةمراجعة - المصفوفات متعددة الأبعاد4تقنيات التحكم في التدفق
الإرجاع المبكرشروط الحمايةجمل القفز (goto)Break و Continueتسطيح الشروط المتداخلة7المعاملات المنطقية المتقدمة
التقييم المختصرالمعاملات المنطقية الشرطيةأولوية المعاملاتمراجعة - المعاملات المتقدمة2اتخاذ القرارات المتقدم
الشروط المتعددةالمنطق البولياني المعقدمقارنة بين If و Switchجمل Switch المتداخلةمراجعة - القرارات المتقدمة5معالجة الاستثناءات
أساسيات Try-Catchأنواع الاستثناءاتكتل Catch المتعددةالتعامل مع الملفاتكتلة FinallyUsing مقابل Try-Finallyاستثناءات مخصصةمراجعة - معالجة الأخطاء8نظام تحليل البيانات
إعداد جمع البياناتمنطق إدخال البيانات11HashSet الجزء الأول
ما هو الـ HashSet؟إضافة عنصرحذف عنصرالتحقق من وجود عنصرالفراغ والحجمملخص - HashSet3تحسينات الحلقات التكرارية
أداء الحلقات التكراريةالتكرار عبر البيانات المعقدةأنواع الحلقات التكراريةإعادة هيكلة الحلقات التكراريةملخص - الحلقات المحسنة6التعامل مع الـ Null
أساسيات الـ Null Referenceأنواع القيم القابلة للـ Nullأنماط التحقق من الـ Nullالبرمجة الدفاعيةملخص - أمان الـ Null