الخوارزمياتالتعامل مع المصفوفة ذات البعدين - التمرين السابع
المطلوب
هذا التمرين مقسّم إلى خمسة أفكار رئيسية, عليك اتباع التقسيم التالي خطوة خطوة حتى تنجز البرنامج.
- أكتب برنامج يعرّف مصفوفة إسمها
matrix
تتألف من 4 أسطر و 4 أعمدة. - ثم يطلب من المستخدم إدخال قيم لها.
إنتبه: نريد هذه المصفوفة أن تحتوي فقط على قيم أكبر أو تساوي صفر, مثل10
,43
,3
,5
,8
. - ثم يعرض للمستخدم جميع القيم التي أصبحت تحتويها المصفوفة.
- بعدها يقوم بجمع قيم جميع العناصر الموجودة على الـ Diagonal, فوق الـ Diagonal و تحت الـ Diagonal.
- في الأخير يعرض للمستخدم ناتج الجمع.
إرشادات
لتمييز قيم العناصر الموجودة على الـ Diagonal, فوق الـ Diagonal, و تحت الـ Diagonal برمجياً عليك إستغلال مكان وجود العنصر في المصفوفة.
ركز جيداً في الصورة و ستلاحظ أنه يمكنك تمييز مكان وجود العنصر بالنسبة للـ Diagonal كالتالي:
- إذا كان index السطر يساوي index العامود فهذا يعني أن العنصر موجود على الـ Diagonal مثل العناصر التالية:
matrix[0][0]
matrix[1][1]
matrix[2][2]
matrix[3][3]
- إذا كان index السطر أكبر من index العامود فهذا يعني أن العنصر موجود تحت الـ Diagonal مثل العناصر التالية:
matrix[1][0]
matrix[2][0]
matrix[2][1]
matrix[3][0]
matrix[3][1]
matrix[3][2]
- إذا كان index السطر أصغر من index العامود فهذا يعني أن العنصر موجود فوق الـ Diagonal مثل العناصر التالية:
matrix[0][1]
matrix[0][2]
matrix[0][3]
matrix[1][2]
matrix[1][3]
matrix[2][3]
النتيجة المطلوبة
لنفترض أن المستخدم أدخل 12 قيمة كما في الصورة التالية عند التشغيل.
تحليل النتيجة
الخوارزمية
كود الجافا
import java.util.Scanner; public class Matrix { public static void main (String[] args) { Scanner input = new Scanner(System.in); int[][] matrix = new int[4][4]; int SOD = 0; // Diagonal سنخزن فيه قيم العناصر الموجودة على الـ SOD المتغير int SAD = 0; // Diagonal سنخزن فيه قيم العناصر الموجودة فوق الـ SAD المتغير int SUD = 0; // Diagonal سنخزن فيه قيم العناصر الموجودة تحت الـ SUD المتغير for (int i=0; i<4; i++) { for (int j=0; j<4; j++) { do { System.out.print("Enter matrix["+i+"]["+j+"]: "); matrix[i][j] = input.nextInt(); } while( matrix[i][j] < 0 ); } System.out.print("\n"); } for (int i=0; i<4; i++) { for (int j=0; j<4; j++) { System.out.print(matrix[i][j] + "\t"); } System.out.print("\n"); } for (int i=0; i<4; i++) { for (int j=0; j<4; j++) { if ( i == j ) { SOD = SOD + matrix[i][j]; } else if ( i < j ) { SAD = SAD + matrix[i][j]; } else if ( i > j ) { SUD = SUD + matrix[i][j]; } } } System.out.print("\n"); System.out.print("The sum of elements above the diagonal is: " +SAD+ "\n"); System.out.print("The sum of elements on the diagonal is: " +SOD+ "\n"); System.out.print("The sum of elements under the diagonal is: " +SUD+ "\n"); } }
شرح الكود
int[][] matrix = new int[4][4]; int SOD = 0; int SAD = 0; int SUD = 0;
- هنا قمنا بتجهيز المصفوفة
matrix
و حددنا أنها تتألف من 4 أسطر و 4 أعمدة. - و المتغير
SOD
و أعطيناه القيمة 0 كقيمة أولية لأننا سنستخدمه لتخزين ناتج جمع قيم العناصر الموجودة على الـ Diagonal. - و المتغير
SAD
و أعطيناه القيمة 0 كقيمة أولية لأننا سنستخدمه لتخزين ناتج جمع قيم العناصر الموجودة فوق الـ Diagonal. - و المتغير
SUD
و أعطيناه القيمة 0 كقيمة أولية لأننا سنستخدمه لتخزين ناتج جمع قيم العناصر الموجودة تحت الـ Diagonal.
for (int i=0; i<4; i++) { for (int j=0; j<4; j++) { do { System.out.print("Enter matrix["+i+"]["+j+"]: "); matrix[i][j] = input.nextInt(); } while( matrix[i][j] < 0 ); } System.out.print("\n"); }
- هنا قمنا بإنشاء الحلقتين
i
وj
لجعل المستخدم يدخل قيمة لكل عنصر في المصفوفةmatrix
. - الحلقة
i
للإنتقال من سطر إلى آخر في المصفوفة, و الحلقةj
للإنتقال من عمود إلى آخر في كل سطر في المصفوفة. - هنا في كل دورة من دورات الحلقة
i
سيتم إنشاء حلقةj
للمرور على جميع العناصر الموجودة في نفس السطر. - في كل دورة من دورات الحلقة
j
سيطلب من المستخدم إدخال قيمة لعنصر محدد في المصفوفة. - قبل تخزين القيمة التي أدخلها المستخدم في المصفوفة سيتم فحصها, إذا كانت أصغر من 0 سيطلب من المستخدم إدخال القيمة من جديد.
- الآن, بعد أن يدخل المستخدم قيمة أكبر أو تساوي 0 سيتم تخزينها في المصفوفة, و سيطلب من المستخدم إدخال قيمة للعنصر التالي في المصفوفة.
- بعد توقف الحلقة
j
(أي بعد إعطاء قيم لجميع العناصر الموجودة في نفس السطر) سيتم النزول على سطر جديد بسبب الرمز\n
.
for (int i=0; i<4; i++) { for (int j=0; j<4; j++) { System.out.print(matrix[i][j] + "\t"); } System.out.print("\n"); }
- هنا قمنا بإنشاء الحلقتين
i
وj
لعرض جميع قيم المصفوفةmatrix
. - الحلقة
i
للإنتقال من سطر إلى آخر فيها, و الحلقةj
للإنتقال من عمود إلى آخر في كل سطر فيها. - هنا في كل دورة من دورات الحلقة
i
سيتم إنشاء حلقةj
لعرض قيمة جميع العناصر الموجودة في نفس السطر. - في كل دورة من دورات الحلقة
j
سيتم عرض قيمة عنصر, ثم وضع بعض المسافات الفارغة بسبب الرمز\t
. - بعد توقف الحلقة
j
(أي بعد عرض قيم جميع العناصر الموجودة في نفس السطر) سيتم النزول على سطر جديد بسبب الرمز\n
.
for (int i=0; i<4; i++) { for (int j=0; j<4; j++) { if ( i == j ) { SOD = SOD + matrix[i][j]; } else if ( i < j ) { SAD = SAD + matrix[i][j]; } else if ( i > j ) { SUD = SUD + matrix[i][j]; } } }
- هنا أنشانا الحلقتين
i
وj
للوصول إلى جميع عناصر المصفوفة. - كل عنصر يتم الوصول إليه سيتم مقارنة مكان وجوده مع قيمة العدادين
i
وj
كالتالي: - إذا كانت قيمة العداد
i
تساوي قيمة العدادj
فهذا يعني أن العنصر موجود على الـ Diagonal و بالتالي سيتم إضافة قيمته على قيمة المتغيرSOD
. - و إذا كانت قيمة العداد
i
أصغر من قيمة العدادj
فهذا يعني أن العنصر موجود فوق الـ Diagonal و بالتالي سيتم إضافة قيمته على قيمة المتغيرSAD
. - و إذا كانت قيمة العداد
i
أكبر من قيمة العدادj
فهذا يعني أن العنصر موجود تحت الـ Diagonal و بالتالي سيتم إضافة قيمته على قيمة المتغيرSUD
.
System.out.print("\n"); System.out.print("The sum of elements above the diagonal is: " +SAD+ "\n"); System.out.print("The sum of elements on the diagonal is: " +SOD+ "\n"); System.out.print("The sum of elements under the diagonal is: " +SUD+ "\n");
- هنا قمنا بعرض ناتج جمع قيم العناصر الموجودة على الـ Diagonal, فوق الـ Diagonal و تحت الـ Diagonal التي تم تخزينها في المتغيرات
SAD
,SOD
وSUD
.