المصفوفات
متغيّر واحد يخزّن مجموعة قيم من النوع نفسه، تحت اسم واحد، ونصل لكل قيمة برقمها.
- تعرّف المصفوفة، وتُنشئها بقيم أو بحجم محدّد.
- تصل إلى عناصر المصفوفة بالفهرس، وتحدّد فهرس أول عنصر وآخر عنصر.
- تمرّ على عناصر المصفوفة بحلقة for و for-each.
- تحسب المجموع والمتوسط وأكبر قيمة في مصفوفة.
١الفكرة
تريد تخزين درجات 30 طالبًا؟ لن تنشئ 30 متغيّرًا. المصفوفة صفّ من الصناديق المرقّمة بجانب بعضها؛ كل صندوق يحمل قيمة، ونصل إليه برقمه.
اضغط صندوقًا، أو اكتب فهرسًا (جرّب 4 أو -1).
int[] grades = {90, 85, 70, 100};ومصفوفة نصوص بالمنطق نفسه:
String[] names = {"أحمد", "سارة", "خالد"};٢إنشاء مصفوفة
int[] grades = {90, 85, 70, 100};int[] grades = new int[4]; // 4 صناديقgrades[0] = 90;grades[1] = 85;
int[] مصفوفة أعداد صحيحة، و String[] للنصوص، و double[] للأعداد العشرية.
٣القراءة والتعديل و length
System.out.println(grades[0]); // 90 (أول عنصر)System.out.println(grades[3]); // 100 (آخر عنصر)grades[1] = 88; // تعديل العنصر رقم 1System.out.println(grades.length); // 4 (عدد العناصر)
٤المصفوفات مع الحلقات
بدل طباعة كل عنصر يدويًّا نمرّ عليها بـ for. لاحظ الشرط i < grades.length وليس <=.
int[] grades = {90, 85, 70, 100};int sum = 0; for (int i = 0; i < grades.length; i++){ sum = sum + grades[i];}double average = sum / grades.length;System.out.println("المجموع = " + sum);System.out.println("المتوسط = " + average);
٥for-each: أسهل طريقة للقراءة
int[] grades = {90, 85, 70, 100}; // لكل عنصر g في gradesfor (int g : grades){ System.out.println(g);}
تُقرأ: «لكل g من نوع int في grades، افعل…». والرمز : يعني «في».
| for-each | for العادية | |
|---|---|---|
| الاستخدام | قراءة أو عرض كل العناصر | حين تحتاج رقم الفهرس، أو جزءًا من المصفوفة، أو تعديل القيم |
| الميزة | كود أبسط وأقلّ خطأً | تحكّم كامل |
| حدودها | لا تعطي الفهرس، و g نسخة لا تعدّل المصفوفة | — |
٦نقاط مهمة
- كل عناصر المصفوفة من النوع نفسه.
- حجم المصفوفة ثابت بعد إنشائها.
- الوصول لفهرس خارج الحدود مثل
grades[4]في مصفوفة من 4 عناصر يسبّب خطأً عند التشغيل.
توقّع وتحقّق
تأمل الكود التالي،
String[] c = {"Red", "Green", "Blue"};System.out.println(c[1]);
ماذا سيكون الناتج عند تنفيذه؟
مصفوفة فيها 10 عناصر. ما فهرس آخر عنصر؟
تأمل الكود التالي،
int[] grades = {90, 85, 70, 100};for (int i = 0; i <= grades.length; i++) System.out.println(grades[i]);
ما الخطأ في هذه الحلقة؟
تريد مضاعفة كل قيمة داخل المصفوفة. أي حلقة تستخدم؟
الخلاصة
- المصفوفة: متغيّر واحد لمجموعة قيم من النوع نفسه.
- الفهرس يبدأ من 0، وآخر فهرس length - 1.
- المرور الآمن:
for (int i = 0; i < arr.length; i++) - for-each للقراءة المبسّطة، و for العادية للفهرس والتعديل.
- انتبه للقسمة الصحيحة عند حساب المتوسط.
تحدٍّ برمجي: تحليل درجات الحرارة
متقدّملديك درجات حرارة أسبوع في مصفوفة. أوجد الأعلى والأدنى والمتوسط، وعدد الأيام الأعلى من 38.
int[] temps = {32, 35, 41, 38, 29, 44, 40};- حلقة واحدة تكفي للأربعة.
- المتوسط عدد عشري (انتبه لفخ القسمة الصحيحة).
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
public class Temps{ public static void main(String[] args) { int[] temps = {32, 35, 41, 38, 29, 44, 40}; // max, min, sum, count }}
💡 تلميح 1
💡 تلميح 2
💡 تلميح 3
حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
public class Temps{ public static void main(String[] args) { int[] temps = {32, 35, 41, 38, 29, 44, 40}; int max = temps[0], min = temps[0], sum = 0, count = 0; for (int i = 0; i < temps.length; i++) { if (temps[i] > max) max = temps[i]; if (temps[i] < min) min = temps[i]; if (temps[i] > 38) count++; sum = sum + temps[i]; } System.out.println("الأعلى = " + max); System.out.println("الأدنى = " + min); System.out.println("المتوسط = " + (double) sum / temps.length); System.out.println("أيام فوق 38: " + count); }}