المصفوفة أحادية البُعد
8.1 مقدمة – הקדמה
المصفوفة هي عبارة عن مجموعة من المُتغيرات من نفس النوع مرتبه ترتيباً تسلسليا في الذاكرة. نستعمل المصفوفة للتعامل مع كمية كبيرة من البيانات التي نريد تخزينها.
عندما نريد تعريف مصفوفة يجب أن نحدد ما يلي:
- عدد الخانات (كل خانة بمثابة مُتغير) الموجودة في المصفوفة (طول المصفوفة N)
- نوع البيانات التي سنخزنها في المصفوفة (نوع المصفوفة مثل: int, char, double…)
- اسم المصفوفة.
يمكن اعتبار المصفوفة مجموعة من المتغيرات من نفس النوع مرتبه بسطر واحد كما يلي:
في المثال بالصورة تظهر لدينا مصفوفة من النوع int واسمها arr ، المصفوفة ذات طول 10. كل خانة من خانات هذه المصفوفة هو مُتغير قائم بحد ذاته.
نلاحظ ما يلي:
- أول خانة في المصفوفة رقمها التسلسلي صفر.
- آخر خانة في المصفوفة رقمها التسلسلي هو 9 (N-1) حيث أن 10 (N) كان طول المصفوفة.
- عند بناء المصفوفة بلغة السي شارب نحصل عليها وفيها قيم بدائية صفرية ولا حاجة لإعطائها قيم بدائية او صفرية، وذلك يختلف عنما عهدنا في المُتغيرات حيث كنا نحصل عليها تحتوي قيما بلا معنى.
- مصفوفة int أو double تكون فيها قيم بدائية أصفار.
- مصفوفة char تكون فيها قيم فارغة (
\0). - مصفوفة string تكون فيها قيم فارغة (null).
- مصفوفة bool تكون فيها قيم false.
8.2 تعريف المصفوفات والتعامل مع المصفوفات – הגדרת מערכים והטיפול בהם
التوجه للمصفوفة يتم بواسطة اسم المصفوفة ومؤشر الحد، ويجدر بنا الانتباه أن مؤشر المصفوفات بلغة السي شارب يبدأ من 0، أي أن arr[0] هو الحد الأول بالمصفوفة وأن arr[1] هو الحد الثاني بالمصفوفة وهكذا ....
arr[N-1] .لذلك للتوجه لخانة من الخانات (مُتغير من مُتغيرات المصفوفة) نكتب اسم المصفوفة والرقم التسلسلي ونتعامل مع كل خانة كأنها مُتغير قائم بحد ذاته.
لكي نغير قيمة الخانة ذات المؤشر 2 نتوجه لها ونتعامل معها باسم المصفوفة وبرقم المؤشر التابع لها ثم نستطيع أن نتعامل معها كما نتعامل مع المُتغير العادي الذي عهدناه سابقا، مثلا نضع القيمة 70 داخل الخانة المذكورة بواسطة:
marks[2] = 70 ;
وإذا نفذنا الأمر التالي:
marks[6] = marks[2] + 3 ;
فإننا نحصل على ما يلي:
كيف نبني مصفوفة؟:
لكي نتعلم كيف نبني مصفوفة ننظر للمثال التالي:
int[] arr = new int[10];
في هذا المثال بنينا مصفوفة باسم arr ، طولها 10 خانات.
أولا عرفنا نوع المصفوفة وكانت int[ ] ، أي مصفوفة أعداد صحيحة، ثم أعطينا المصفوفة اسما وهو arr ثم بنينا المصفوفة بالذاكرة بواسطة الأمر new وحددنا طولها على أنه 10 خانات (من رقم مؤشر 0 حتى 9).
كما نرى نحصل على المصفوفة "مُصفرة". (מאופסת).
new .فعلنا ذلك سابقا عند تعاملنا مع الفئة Random .
Random dealer = new Random( );
ثم استعملنا العملية Next للحصول على أرقام عشوائية مثلا:
int x = dealer.Next(1,7) ;
x يمكنه أن يحتوي على 1 أو 2 أو 3 أو 4 أو 5 أو 6 .
ويمكن ذلك بسطر واحد على النحو التالي:
المصفوفات هي فئات حسب النوع.
مصفوفة من نوع اعداد صحيحة هي من فئة int[ ] .
مصفوفة من نوع اعداد عشرية هي من فئة double[ ] .
مصفوفة من نوع رموز هي من فئة char[ ].
مصفوفة من نوع جمل نصية هي من فئة string[ ] .
مصفوفة من نوع بوليانية هي من فئة bool[ ] .
نستطيع بناء مصفوفات مع قيم بدائية وتعريفها على النحو التالي أيضا:
int[] a = new int[] { 100, 97, 92, 100, 100 };في هذه الحالة نحصل على مصفوفة اسمها a وطولها 5 حدود (خانات) وفيها القيم المعطاة أعلاه.
نستطيع استقبال قيم الخانات في المصفوفة من المستخدم (كل خانة بمثابة مُتغير قائم بحد ذاته)، وذلك باستعمال اسم المصفوفة ورقم المؤشر للخانة فمثلا:
arr[0] = int.Parse(Console.ReadLine( ));
هذا يستقبل من المستخدم عدد صحيح ويضعه في الخانة الأولى من المصفوفة وهكذا نستطيع استقبال كل خانات المصفوفة (نستعين بأوامر التكرار).
8.3 أهمية استعمال المصفوفات – חשיבות השימוש במערכים
تُستعمل المصفوفات لحفظ الكثير من البيانات والتعامل مع هذه البيانات بواسطة أوامر التكرار حيث لا يمكن ذلك دون استعمال المصفوفات. يمكن توضيح ذلك بالمثال التالي:
كتب برنامج لاستقبال 10 حروف من المُستخدم وطباعتهن على النحو التالي:
(1) في سطر واحد الحرف بجانب الآخر بنفس ترتيب استقبال هذه الحروف من المُستخدم.
(2) في سطر واحد تحت السطر السابق ولكن نطبع هذه الحروف بترتيب معاكس لترتيب استقبالها من المُستخدم.
public static void Main (string[] args)
{
char a,b,c,d,e,f,g,h,i,j;
Console.Write("Give me a letter: ");
a=char.Parse(Console.ReadLine());
Console.Write("Give me a letter: ");
b=char.Parse(Console.ReadLine());
Console.Write("Give me a letter: ");
c=char.Parse(Console.ReadLine());
Console.Write("Give me a letter: ");
d=char.Parse(Console.ReadLine());
Console.Write("Give me a letter: ");
e=char.Parse(Console.ReadLine());
Console.Write("Give me a letter: ");
f=char.Parse(Console.ReadLine());
Console.Write("Give me a letter: ");
g=char.Parse(Console.ReadLine());
Console.Write("Give me a letter: ");
h=char.Parse(Console.ReadLine());
Console.Write("Give me a letter: ");
i=char.Parse(Console.ReadLine());
Console.Write("Give me a letter: ");
j=char.Parse(Console.ReadLine());
Console.WriteLine("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}",a,b,c,d,e,f,g,h,i,j);
Console.WriteLine("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}",j,i,h,g,f,e,d,c,b,a);
}ولكن إذا كتبنا الحل بواسطة المصفوفات فانه على النحو التالي:
using System;
class Hammam
{
public static void Main (string[] args)
{
char[] w = new char[10];
int i;
for(i=0;i<10;i++)
{
Console.Write("Give me a letter: ");
w[i]=char.Parse(Console.ReadLine());
}
for(i=0;i<10;i++)
Console.Write(w[i]);
Console.WriteLine();
for(i=9;i>=0;i--)
Console.Write(w[i]);
}
}إذا استعمال المصفوفات يمكننا من استعمال أوامر التكرار لأننا ببساطة نستطيع تغيير المؤشر لكل خانة بينما في المُتغيرات لا يمكننا ارفاق مؤشر حيث أن من الخطأ فعل ذلك.
8.4 العملية Length – הפעולה Length
العملية Length هي عملية تعمل على المصفوفات بعد وضع النقطة وهذه العملية تعيد لنا طول المصفوفة وهي تسهل علينا كتابة شرط التكرار حتى نصل آخر خانة بالمصفوفة.
static void Main(string[] args)
{
int i;
int[] arr = new int[12]; //from 0 to 11
for (i = 0; i < arr.Length; i++)
arr[i] = (int)Math.Pow(i,2);
for(i=0; i< arr.Length ; i++)
Console.Write("{0}|",arr[i]);
}عند تشغيل البرنامج نحصل على ما يلي:
0|1|4|9|16|25|36|49|64|81|100|121|
اطبع بين الحدود فاصلة (،) ولكن الحد الأخير يظهر بعده نقطة (.)
static void Main(string[] args)
{
int i;
int[] arr = new int[8];
for(i=0;i<arr.Length;i++)
{
Console.Write("Insert a number: ");
arr[i] = int.Parse(Console.ReadLine());
}
for(i=arr.Length-1; i>=0; i--)
Console.Write("{0}|",arr[i]);
}نتيجة تشغيل البرنامج:
Insert a number: 70 Insert a number: 100 Insert a number: -90 Insert a number: 11 Insert a number: 48 Insert a number: 98 Insert a number: 500 Insert a number: -4 -4|500|98|48|11|-90|100|70|
(أ) يبني مصفوفة جديدة تحتوي نفس أرقام المصفوفة السابقة ولكن مُرتبه بترتيب تصاعدي.
(ب) أن يرتب الأرقام المُخزنة في المصفوفة arr ترتيبا تصاعديا دون تعريف مصفوفة جديدة.
8.5 مصفوفة العدّادات – מערך מונים
يمكن استخدام المصفوفات كعدّادات (counters) حيث تكون كل خانة في المصفوفة هي عدّ عدّاد لمقدار مُعين، ويمكننا تقسيم الحالات الى قسمين:
- عدّاد: عدّادات تتقدم بواحد كل مرة. (מונים)
- جمّاع: عدّادات تتقدم بمقدار مُعين ممكن أن يكون ثابت أو غير ثابت. (צוברים – عدادات تراكمية).
const int Mohammad = 0 ; const int Abd = 1 ; const int Mriam = 2 ;
أمثلة: مصفوفة عدادات (تتقدم بواحد):
عدد الطلاب هو 33 طالب أرقامهم التسلسلية من 1 الى 33.
معلوم أن الحضور للمحاضرات اجباري ومهم ولا يستطيع الطالب أن يتقدم للامتحان النهائي اذا كنت نسبة حضوره للمحاضرات أقل من 80% .
على البرنامج أن يسجل عدد مرات الغياب لكل طالب خلال الفصل في هذا الموضوع، وعليه أن يطبع على الشاشة من هم الطلاب الذين لا يمكنهم التقدم للامتحان النهائي وعليهم إعادة الموضوع مرة أخرى بالفصل القادم لأن حضورهم كان أقل من 80% .
شرح وتوضيح لاستراتيجية الحل:
- تكرار 14 مرة (14 أسبوع) وكل مرة نسأل من هم الطلاب الغائبون، وحسب الغياب نقدم العدادات.
- يجب أن يشترك الطالب في 12 لقاء على الأقل، أي نطبع الرقم التسلسلي للطلاب الذين لديهم 3 غيابات وأكثر (يُسمح بغيابين لكن 3 غيابات غير مسموح ولن يستطيع الطالب أن يتقدم للامتحان).
اكتب برنامج يتتبع عدد النقاط لفرق دوري كأس الصيف لكرة القدم. افرض أن عدد الفرق هو 4 فرق، لذلك يوجد لدينا 6 دورات. على البرنامج أن يسأل عن كل الفرق ما هي الإضافة للنقاط في كل دورة ويحتلن المصفوفة الملائمة التي تحوي نقاط كل فرقة.
في نهائية البرنامج علينا أن نطبع من هو الفريق الفائز الذي حصل على أكثر نقاط، ومن هو الفريق الخاسر الذي حصل على اقل عدد من النقاط.
النقاط تحتسب حسب ما يلي:
الفوز (w) = 3 نقاط.
التعادل (d) = 1 نقطة.
الخسارة (l) = 0 نقاط.
كل دورة نسأل عن كل فريق ما هي نتيجة مباراته خلال هذه الدورة (أي تكرار 6 مرات (دورات)).
بعد أن نملأ النتائج في كل الدورات علينا أن نبحث عن الفائز والخاسر (البحث عن أكبر قيمة في المصفوفة وأقل قيمة بالمصفوفة)، وأن نطبع الرقم التسلسلي للفائز وعدد نقاطه والرقم التسلسلي للخاسر وعدد نقاطه.