الخوارزمياتالتعامل مع المصفوفة ذات البعدين - التمرين التاسع
المطلوب
هذا التمرين مقسّم إلى خمسة أفكار رئيسية, عليك اتباع التقسيم التالي خطوة خطوة حتى تنجز البرنامج.
- أكتب برنامج يعرّف مصفوفة إسمها
matrix
تتألف من 3 أسطر و 5 أعمدة. - ثم يطلب من المستخدم إدخال قيم لها.
- ثم يعرض للمستخدم جميع القيم التي أصبحت تحتويها المصفوفة.
- بعدها يطلب من المستخدم إدخال أي عدد ليرى إذا كان موجوداً في المصفوفة, و يخزنه في المتغير
x
.
إنتبه: يكفي أن يعرف المستخدم إذا كان العدد الذي يبحث عنه موجوداً مرة واحدة في المصفوفة. - في الأخير يعرض للمستخدم ناتج عملية البحث, أي إذا وجد نفس قيمة المتغير
x
في المصفوفةmatrix
أم لا.
ملاحظة: قم بتعريف العدادين i
و j
مرة واحدة في بداية البرنامج.
إرشادات
هنا يجب إستخدام حلقتين while
أو do while
أثناء عملية البحث في المصفوفة لأنك لست بحاجة إلى المرور على جميع عناصرها.
ملاحظة: الأسلوب الذي ستتعلمه في هذا التمرين مهم جداً و يستخدم كثيراً.
النتيجة المطلوبة
لنفترض أن المستخدم أدخل قيم عشوائية في المصفوفة, ثم أدخل العدد 8 ليعرف إذا كانت القيمة 8 موجودة في المصفوفة أم لا.
الخوارزمية
كود الجافا
import java.util.Scanner; public class Matrix { public static void main (String[] args) { Scanner input = new Scanner(System.in); int[][] matrix = new int[3][5]; int x; boolean found = false; int i; int j; for (i=0; i<3; i++) { for (j=0; j<5; j++) { System.out.print("Enter matrix["+i+"]["+j+"]: "); matrix[i][j] = input.nextInt(); } System.out.print("\n"); } for (i=0; i<3; i++) { for (j=0; j<5; j++) { System.out.print(matrix[i][j] + "\t"); } System.out.print("\n"); } System.out.print("\nEnter any number: "); x = input.nextInt(); i=0; while (i<3 && found == false) { j=0; while (j<5 && found == false) { if( matrix[i][j] == x ) { found = true; } j++; } i++; } if( found == true ) { System.out.print(x + " is exist in the matrix \n"); } else { System.out.print(x + " is not exist in the matrix \n"); } } }
شرح الكود
int[][] matrix = new int[3][5]; int x; boolean found = false; int i; int j;
- هنا قمنا بتجهيز المصفوفة
matrix
و حددنا أنها تتألف من 3 أسطر و 5 أعمدة. - و المتغير
x
لأننا سنستخدمه لتخزين القيمة (أي العدد) التي سيدخلها المستخدم لاحقاً للبحث عنها في المصفوفة. - و المتغير
found
الذي نوعهboolean
أعطيناه القيمة false عند إنشائه لأننا سنستخدمه كشرط أساسي لإيقاف عملية البحث لاحقاً. - و المتغيران
i
وj
سنستخدمها كعدادين لاحقاً بداخل حلقتينwhile
عند البحث في المصفوفة لأننا هذه المرة لا نريد المرور على جميع عناصرها.
for (i=0; i<3; i++) { for (j=0; j<5; j++) { System.out.print("Enter matrix["+i+"]["+j+"]: "); matrix[i][j] = input.nextInt(); } System.out.print("\n"); }
- هنا قمنا بإنشاء الحلقتين
i
وj
لجعل المستخدم يدخل قيمة لكل عنصر في المصفوفة. - الحلقة
i
للإنتقال من سطر إلى آخر في المصفوفة, و الحلقةj
للإنتقال من عمود إلى آخر في كل سطر في المصفوفة. - هنا في كل دورة من دورات الحلقة
i
سيتم إنشاء حلقةj
للمرور على جميع العناصر الموجودة في نفس السطر. - في كل دورة من دورات الحلقة
j
سيطلب من المستخدم إدخال قيمة لعنصر, ثم سيتم تخزينها في هذا العنصر. - بعد توقف الحلقة
j
(أي بعد إعطاء قيم لجميع العناصر الموجودة في نفس السطر) سيتم النزول على سطر جديد بسبب الرمز\n
.
for (i=0; i<3; i++) { for (j=0; j<5; j++) { System.out.print(matrix[i][j] + "\t"); } System.out.print("\n"); }
- هنا قمنا بإنشاء الحلقتين
i
وj
لعرض جميع قيم المصفوفةmatrix
. - الحلقة
i
للإنتقال من سطر إلى آخر فيها, و الحلقةj
للإنتقال من عمود إلى آخر في كل سطر فيها. - هنا في كل دورة من دورات الحلقة
i
سيتم إنشاء حلقةj
لعرض قيمة جميع العناصر الموجودة في نفس السطر. - في كل دورة من دورات الحلقة
j
سيتم عرض قيمة عنصر, ثم وضع بعض المسافات الفارغة بسبب الرمز\t
. - بعد توقف الحلقة
j
(أي بعد عرض قيم جميع العناصر الموجودة في نفس السطر) سيتم النزول على سطر جديد بسبب الرمز\n
.
System.out.print("\nEnter any number: ");
x = input.nextInt();
- هنا سيطلب من المستخدم إدخال أي عدد, و بعدها سيتم تخزينه في المتغير
x
.
i=0; while (i<3 && found == false) { j=0; while (j<3 && found == false) { if( matrix[i][j] == x ) { found = true; } j++; } i++; }
- هنا أنشانا الحلقتين
i
وj
للمرور على جميع عناصر المصفوفة طالما أن القيمة التي نريد البحث عنها لم يتم إيجادها بعد. - قبل بداية الحلقة
i
أعطينا العدادi
القيمة 0 لكي نبدأ عملية البحث إبتداءاً من السطر الأول في المصفوفة. - بعدها إستخدمنا الحلقة
while
و التي ستجعلنا ننتقل من سطر إلى آخر طالما أننا لا نتعدى عدد أسطر المصفوفة و أن القيمة التي نبحث عنها لم يتم إيجادها بعد. - قبل بداية الحلقة
j
أعطينا العدادj
القيمة 0 لكي نبدأ عملية البحث إبتداءاً من العامود الأول في كل سطر من أسطر المصفوفة. - بعدها إستخدمنا الحلقة
while
و التي ستجعلنا ننتقل من عامود إلى آخر طالما أننا لا نتعدى عدد أعمدة المصفوفة و أن القيمة التي نبحث عنها لم يتم إيجادها بعد. - إذاً الحلقتين سيمرون على جميع العناصر الموجودة في المصفوفة طالما أن قيمة المتغير
found
تساويfalse
.
و في حال وجدنا القيمة التي نبحث عنها في المصفوفة علينا تغيير قيمة المتغيرfound
إلىtrue
لجعل الحلقتان تتوقفان عن العمل. - بداخل الحلقة
j
سيتم مقارنة قيمة كل عنصر في المصفوفة مع قيمة المتغيرx
أي ( مع العدد الذي أدخله المستخدم ) كالتالي: - في حال كانت قيمة العنصر تساوي قيمة المتغير
x
سيتم تغيير قيمة المتغيرfound
إلىtrue
حتى يتم إيقاف الحلقتين, لأنه عندها سنكون قد وجدنا ما نبحث عنه. - بعدها سيتم زيادة قيمة العداد
j
واحداً حتى يتم الإنتقال إلى العنصر التالي في نفس السطر في حال بقيت قيمة المتغيرfound
تساويfalse
. - في حال بحثنا في جميع العناصر الموجودة في نفس السطر و لم نجد قيمة أي عنصر تساوي قيمة المتغير
x
سيتم زيادة قيمة العدادi
واحداً للإنتقال إلى السطر التالي, لأننا سنكون قد لم نجد بعد ما نبحث عنه. - إذاً, إذا تغيرت قيمة المتغير
found
إلىtrue
يعني ذلك أننا وجدنا القيمة التي يبحث عنهاالمستخدم و سنوقف مباشرةً الحلقتينi
وj
لأننا سنوقف حينها عملية البحث.
if( found == true ) { System.out.print(x + " is exist in the matrix \n"); } else { System.out.print(x + " is not exist in the matrix \n"); }
- هنا سيتم فحص قيمة المتغير
found
لتحديد الجملة التي سيتم طباعتها للمستخدم. - إذا أصبحت قيمة المتغير
found
تساويtrue
فهذا يعني أن القيمة التي بحث عنها المستخدم موجودة في المصفوفة. - أما إذا بقيت قيمة المتغير
found
تساويfalse
فهذا يعني أن القيمة التي بحث عنها المستخدم غير موجودة في المصفوفة.