0Pricing
Java Academy · درس

مشروع مصغّر ثنائي الأبعاد: سجل الدرجات

مشروع مصغّر: أنشئ سجل درجات صغيرًا باستخدام مصفوفة int ثنائية الأبعاد. اطبع جداول بمحاذاة صحيحة، واحسب متوسطات كل طالب وكل مهمة، واعثر على أفضل المؤدين، وعدّل الدرجات، وأخرج تقريرًا موجزًا.

مشروع مصغّر ثنائي الأبعاد: سجل الدرجات درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 4 من أصل 6. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 6 دروس في المجموع.

نظرة عامة على المشروع

هدف المشروع: مثّلوا سجل درجات كمصفوفة int ثنائية الأبعاد، بحيث يمثل كل صف طالبًا ويمثل كل عمود واجبًا منزليًا أو اختبارًا قصيرًا أو امتحانًا. ستطبعون جدولًا بمحاذاة صحيحة، وتحسبون متوسطات كل طالب وكل مهمة، وتجدون الطالب والمهمة الأعلى أداءً، وتعدّلون الدرجات، وتنشئون تقريرًا موجزًا.

اتبعوا المشاهد وشغّلوا كل عينة شيفرة بالترتيب. لا حاجة إلى إدخال.

البناء والطباعة

الخطوة 1: أنشئوا مصفوفة صغيرة لسجل الدرجات واطبعوها بأعمدة بمحاذاة صحيحة. نستخدم أداة مساعدة لحساب عروض الأعمدة وطابعًا يضيف حشوًا إلى كل قيمة.

public class Main {
				  // Join helper for one-dimensional arrays (space-separated)
				  static String join(int[] a) {
					String s = "";
					for (int i = 0; i < a.length; i = i + 1) {
					  s = s + a[i] + (i + 1 < a.length ? " " : "");
					}
					return s;
				  }

				  // Compute column widths for aligned printing (jagged-aware)
				  static int[] widths(int[][] m) {
					int maxCols = 0;
					for (int r = 0; r < m.length; r = r + 1) {
					  if (m[r].length > maxCols) maxCols = m[r].length;
					}
					int[] w = new int[maxCols];
					for (int r = 0; r < m.length; r = r + 1) {
					  for (int c = 0; c < m[r].length; c = c + 1) {
						int len = Integer.toString(m[r][c]).length();
						if (len > w[c]) w[c] = len;
					  }
					}
					for (int c = 0; c < w.length; c = c + 1) if (w[c] < 1) w[c] = 1;
					return w;
				  }

				  // Print matrix with aligned columns
				  static void printAligned(int[][] m) {
					int[] w = widths(m);
					for (int r = 0; r < m.length; r = r + 1) {
					  String line = "";
					  for (int c = 0; c < m[r].length; c = c + 1) {
						String s = Integer.toString(m[r][c]);
						while (s.length() < w[c]) s = " " + s;
						line = line + s + (c + 1 < m[r].length ? " " : "");
					  }
					  System.out.println(line);
					}
				  }

				  public static void main(String[] args) {
					// Create a 4x5 gradebook (4 students, 5 assignments)
					int[][] g = {
					  {78, 85, 90, 88, 92},
					  {95, 91, 89, 93, 87},
					  {60, 72, 70, 68, 75},
					  {88, 84, 79, 85, 90}
					};

					System.out.println("Gradebook (rows: students, cols: assignments):");
					printAligned(g);
				  }
				}
				

متوسطات الصفوف والأعمدة

الخطوة 2: احسبوا متوسطات كل طالب (صف) وكل مهمة (عمود). يجب أن تتحقق متوسطات الأعمدة من طول كل صف لتتعامل بأمان مع المصفوفات المتعرجة.

public class Main {
				  // Average of one row (student r)
				  static double rowAverage(int[][] g, int r) {
					int sum = 0;
					for (int c = 0; c < g[r].length; c = c + 1) sum = sum + g[r][c];
					return (double) sum / g[r].length;
				  }

				  // Average of one column (assignment c)
				  static double colAverage(int[][] g, int c) {
					int sum = 0;
					int count = 0;
					for (int r = 0; r < g.length; r = r + 1) {
					  if (c < g[r].length) { sum = sum + g[r][c]; count = count + 1; }
					}
					return (double) sum / count;
				  }

				  public static void main(String[] args) {
					int[][] g = {
					  {78, 85, 90, 88, 92},
					  {95, 91, 89, 93, 87},
					  {60, 72, 70, 68, 75},
					  {88, 84, 79, 85, 90}
					};

					// Compute per-student averages
					for (int r = 0; r < g.length; r = r + 1) {
					  double avg = rowAverage(g, r);
					  System.out.println("student " + r + " avg = " + String.format("%.2f", avg));
					}

					// Compute per-assignment averages
					int assignments = g[0].length;
					for (int c = 0; c < assignments; c = c + 1) {
					  double avg = colAverage(g, c);
					  System.out.println("assignment " + c + " avg = " + String.format("%.2f", avg));
					}
				  }
				}
				

أفضل طالب ومهمة

الخطوة 3: ابحثوا عن أفضل طالب (أعلى متوسط للصف) وأفضل مهمة (أعلى متوسط للعمود).

public class Main {
				  static double rowAverage(int[][] g, int r) {
					int sum = 0;
					for (int c = 0; c < g[r].length; c = c + 1) sum = sum + g[r][c];
					return (double) sum / g[r].length;
				  }

				  static double colAverage(int[][] g, int c) {
					int sum = 0;
					int count = 0;
					for (int r = 0; r < g.length; r = r + 1) { if (c < g[r].length) { sum = sum + g[r][c]; count = count + 1; } }
					return (double) sum / count;
				  }

				  public static void main(String[] args) {
					int[][] g = {
					  {78, 85, 90, 88, 92},
					  {95, 91, 89, 93, 87},
					  {60, 72, 70, 68, 75},
					  {88, 84, 79, 85, 90}
					};

					// Find top student by average
					int bestStudent = -1;
					double bestAvg = -1.0;
					for (int r = 0; r < g.length; r = r + 1) {
					  double avg = rowAverage(g, r);
					  if (avg > bestAvg) { bestAvg = avg; bestStudent = r; }
					}

					// Find top assignment by average
					int assignments = g[0].length;
					int bestAssign = -1;
					double bestCol = -1.0;
					for (int c = 0; c < assignments; c = c + 1) {
					  double avg = colAverage(g, c);
					  if (avg > bestCol) { bestCol = avg; bestAssign = c; }
					}

					System.out.println("top student = " + bestStudent + " (avg=" + String.format("%.2f", bestAvg) + ")");
					System.out.println("top assignment = " + bestAssign + " (avg=" + String.format("%.2f", bestCol) + ")");
				  }
				}
				

تعديل الدرجات

الخطوة 4: طبّقوا تعديلًا ثابتًا (مثلًا: +5 نقاط لكل درجة، بحد أقصى 100) واطبعوا المصفوفتين قبل التعديل وبعده.

public class Main {
				  // Add a flat curve of k points (capped at 100)
				  static void curve(int[][] g, int k) {
					for (int r = 0; r < g.length; r = r + 1) {
					  for (int c = 0; c < g[r].length; c = c + 1) {
						int v = g[r][c] + k;
						if (v > 100) v = 100;
						g[r][c] = v;
					  }
					}
				  }

				  static void print(int[][] g) {
					for (int r = 0; r < g.length; r = r + 1) {
					  for (int c = 0; c < g[r].length; c = c + 1) {
						System.out.print(g[r][c] + (c + 1 < g[r].length ? " " : ""));
					  }
					  System.out.println();
					}
				  }

				  public static void main(String[] args) {
					int[][] g = {
					  {78, 85, 90, 88, 92},
					  {95, 91, 89, 93, 87},
					  {60, 72, 70, 68, 75},
					  {88, 84, 79, 85, 90}
					};

					System.out.println("before curve:");
					print(g);
					curve(g, 5); // +5 points each
					System.out.println("after curve (+5, capped at 100):");
					print(g);
				  }
				}
				

تقرير موجز

الخطوة 5: أنشئوا تقريرًا بسيطًا: متوسطات كل طالب ومتوسط الصف العام. (يمكنكم توسيعه لاحقًا ليشمل التقديرات الحرفية.)

public class Main {
				  static double rowAverage(int[][] g, int r) {
					int sum = 0;
					for (int c = 0; c < g[r].length; c = c + 1) sum = sum + g[r][c];
					return (double) sum / g[r].length;
				  }

				  static double overallAverage(int[][] g) {
					int sum = 0;
					int count = 0;
					for (int r = 0; r < g.length; r = r + 1) {
					  for (int c = 0; c < g[r].length; c = c + 1) { sum = sum + g[r][c]; count = count + 1; }
					}
					return (double) sum / count;
				  }

				  public static void main(String[] args) {
					int[][] g = {
					  {83, 90, 95, 93, 97},  // assume already curved values
					  {100, 96, 94, 98, 92},
					  {65, 77, 75, 73, 80},
					  {93, 89, 84, 90, 95}
					};

					// Print each student average
					for (int r = 0; r < g.length; r = r + 1) {
					  double avg = rowAverage(g, r);
					  System.out.println("student " + r + " avg = " + String.format("%.2f", avg));
					}

					// Print overall average
					System.out.println("overall avg = " + String.format("%.2f", overallAverage(g)));
				  }
				}
				

تحقق من متوسط الطالب

تحقق سريع: أي صيغة تحسب متوسط الطالب r؟

مراجعة وما التالي

مراجعة: نمذجتم دفتر الدرجات باستخدام مصفوفة ثنائية الأبعاد، وطبعتم جداول بمحاذاة متناسقة، وحسبتم متوسطات الصفوف والأعمدة، وحددتم أصحاب الأداء الأعلى، وطبّقتم منحنى على الدرجات، وأنشأتم تقريرًا موجزًا. الخطوة التالية: تغليف هذه الأدوات في فئة مساعدة قابلة لإعادة الاستخدام.

الأسئلة الشائعة

هل درس «مشروع مصغّر ثنائي الأبعاد: سجل الدرجات» مجاني؟

نعم — نص درس «مشروع مصغّر ثنائي الأبعاد: سجل الدرجات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 6 دروس في المجموع.

ماذا ستتعلم في «مشروع مصغّر ثنائي الأبعاد: سجل الدرجات»؟

مشروع مصغّر: أنشئ سجل درجات صغيرًا باستخدام مصفوفة int ثنائية الأبعاد. اطبع جداول بمحاذاة صحيحة، واحسب متوسطات كل طالب وكل مهمة، واعثر على أفضل المؤدين، وعدّل الدرجات، وأخرج تقريرًا موجزًا. تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 6.

كم من الوقت يستغرق درس «مشروع مصغّر ثنائي الأبعاد: سجل الدرجات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات المصفوفات ثنائية الأبعاد والتكرار المتداخل
  2. المصفوفات متباينة الأطوال وتنسيق الجداول
  3. القيم الكبرى للصفوف والأعمدة، والتحويل، والتنسيق
  4. مشروع مصغّر ثنائي الأبعاد: سجل الدرجات
  5. أدوات ثنائية الأبعاد كفئة مساعدة (إعادة الهيكلة)
  6. تنظيف البيانات ثنائية الأبعاد والتحقّق منها
← العودة إلى Java Academy