 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:333
|
|
21-05-2017, 01:00 PM
المشاركة 1
|
|
المصفوفات Arrays :
المصفوقات الرقمية :
أثناء تطوير (إنشاء) البرنامج ، عادة ما يكون هناك حاجة (ضرورة) لمعالجة العديد من "بنود البيانات من نفس النوع" . على سبيل المثال ، برنامج مصمم لقراءة أعمار 50 طالب فى حجرة صف ، فقد يتبادر للذهن من أول وهلة أننا بحاجة لاستخدام 50 متغير منفصل من نوع الأعداد الصحيحة . لكن ، مثل هذا النهج يجعل من الصعب معالجة البيانات ، حيث أنه علينا الوصول لكل عدد صحيح بشكل منفصل . علاوة على ذلك ، إذا زاد عدد الصف إلى 70 طالب ، على سبيل المثال ، عنئذ علينا إدخال 20 عدد صحيح أخرى و20 عبارة أخرى لمعالجة المدخلات الجديدة .
الحل لهذه المشكلة هو استخدام المصفوفة array كوسيلة سهلة لجمع البنود ذات الصلة تحت اسم متغير واحد . يتم إعلان (تعريف) المصفوفة عن طريق " تحديد اسمها ، ونوع وعدد عناصرها " التى عليها تخزينها . على سبيل المثال ، فيما يلى صيغة إعلان مصفوفة "أعداد صحيحة بدون إشارة" ، تسمى Average ، وبها خمس عناصر :
كود:
unsigned int Average[5];
يتم حفظ المصفوفة فى أماكن (مواقع) ذاكرة متتابعة (متسلسلة) كما هو موضح بالشكل التالى :
فى هذا المثال ، أول عنصر "رقمه المسلسل صفر " index 0 ، وآخر عنصر رقمه المسلسل (4) . يتم عنونة عناصر المصفوفة عن طريق "كتابة اسم المصفوفة متبوعا بقوسين مربعين ( […] ) بداخلهما الرقم المسلسل للعنصر المحدد" . على سبيل المثال ، لتحديد "العنصر الثالث" بالمصفوفة بالقيمة "120" يمكن كتابة مايلى :
بالمثل ، على سبيل المثال ، لنسخ محتويات العنصر الثالت من المصفوفة إلى متغير يسمى MyValue يمكننا كتابة ما يلى :
كود:
MyValue = Average[2];
كلما واجه المترجم تعريف لمصفوفة ، يتم تنفيذ عملية حسابية لتحديد متطلبات تخزين كل عنصر .
يمكن "تهيئة البداية" لمحتويات المصفوفة خلال إعلان المصفوفة عن طريق تحديد عناصر المصفوفة ، مفصولة بفواصل ، ومحاطة بأقواس مجعدة ( {..,..,..} ) . فيما يلى مثال لمصفوفة تسمى numbers ، بها 10 عناصر ، وفيها العنصر الأول numbers[0] = 0 ، والعنصر الثانى numbers[1] = وهلم جرا :
كود:
unsigned int numbers[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
يمكن إعلان نفس المصفوفة ، بدون تحديد "حجم المصفوفة" كما يلى . هنا ، "يحدد المترجم" حجم المصفوفة و "يخصص" عدد البايتات المطلوبة بالذاكرة :
كود:
unsigned int numbers[ ] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
لاحظ أنه ليس من الضرورى "التهيئة الابتدائية" لجميع عناصر المصفوفة . على سبيل المثال ، يمكننا التهيئة الابتدائية للعناصر الثلاثة الأولى فقط من المصفوفة وترك باقى العناصر بدون تهيئة ابتدائية ليكون التعريف كما يلى :
كود:
int MyNumbers[10] = {0, 2, 5};
فى هذه الحالة تم التهيئة الابتدائية للعناصر [0] , [1] , [2] ، على الرغم من أنه سوف يتم حجز تخزين لعشر عناصر . هنا ، أى عناصر متبقية بدون تهيئة ابتدائية يتم تهيئتها ضمنيا بصفر .
ملحوظة :
من الخطأ أن يكون هناك عناصر أكثر من تعريف حجم المصفوفة . على سبيل المثال ، التعريف التالى سوف يولد خطأ للمترجم :
كود:
int numbers[2] = {0, 3, 7, 8, 9};
كلما تم تهيئة مصفوفة ، فإن المترجم ينسخ البيانات المحددة إلى عناصر المصفوفة . فإذا حدث وكانت المصفوفة داخل دالة ، عندئذ فى كل مرة يتم استدعاء الدالة ، سوف يتم إعادة تحميل عناصر المصفوفة ، مما يتسبب فى تأخير لا لزوم له . لهذا السبب ، يجب أن نستخدم الكلمة الخاصة static لإجبار عناصر المصفوفة ليتم تحميلها مرة واحدة فقط عند بداية البرنامج ، كما يلى :
كود:
static int numbers[2] = {0, 5};
المصفوفات ذات الأبعاد المتعددة :
فى المترجم ميكروسى برو ، يمكننا أيضا إعلان المصفوفة ذات الأبعاد المتعددة . تستخدم مثل هذه المصفوفات عادة فى العمليات الحسابية ، مثل حسابات المتجه والمصفوفات .
يتم إعلان المصفوفات ذات الأبعاد المتعددة عن طريق تحديد "نوع البيانات" ، و "اسم المصفوفة" و "حجم كل بعد بالمصفوفة" . فى المثال التالى ، يتم تعريف مصفوفة ذات بعدين باسم MyMatrix ، بها "ثلاثة صفوف" و "عمودين" :
هذه المصفوفة لها البناء التالى : المصفوفة بها أجمالى 6 عناصر . العنصر الأول من المصفوفة هو
MyMatrix[0][0] ، والعنصر الأخير هو MyMatrix[2][1] ، كما فى الجدول التالى :

يمكن التهيئة الابتدائية للمصفوفة ذات الأبعاد المتعددة كما سبق ، عن طريق تحديد العناصر داخل أقواس مجعدة ومفصولة بفواصل ، كما فى المثال التالى :
كود:
int numbers[2][3] = { {0, 2, 5}, {6, 8, 5} };
فى المثال السابق لدينا "2 صف" و "3 عامود" . قيمة كل عنصر يمكن بيانها كما يلى :

حجم "البعد الأول" اختيارى ويمكن أن يترك فارغا ، كما هو مبين فيما بعد للمثال أعلاه . يقوم المترجم بالملىء بالحجم الصحيح خلال الترجمة :
كود:
int numbers[ ][3] = { { 0, 2, 5}, {6, 8, 5} };
مصفوفات الحروف Character Arrays :
يتم إعلان مصفوفات الحروف بطريقة مشابهة لإعلان مصفوفات الأرقام ، حيث يتم فصل كل حرف بفاصلة واحاطتها داخل زوج من الأقواس المعرجة . فى المثال التالى ، مصفوفة الحروف MyName بها أربعة عناصر :
كود:
unsigned char MyName[4] = {‘J’, ‘O’, ‘H’, ‘N’};
كما سبق ، يمكننا ترك حجم المصفوفة فارغا كما يلى :
كود:
unsigned char MyName[ ] = {‘J’, ‘O’, ‘H’, ‘N’};
السلاسل النصية Strings :
السلاسل النصية هى مصفوفات حروف تنتهى بحرف NULL ( قيمته بالسداسى عشر 0x0 ويكتب "\0" ) . فى المثال أدناه ، MyName هى سلسلة نصية ( مصفوفة حروف) بها خمس عناصر ، بما فى ذلك حرف الانتهاء NULL :
كود:
unsigned char MyName[ ] = {‘J’, ‘O’, ‘H’, ‘N’, ‘\0’};
كما ترى من المثال أعلاه ، علينا الفصل بين كل حرف باستخدام الفاصلة وإنهاء السلسلة النصية بحرف NULL .
الطريقة البديلة والأسهل لإعلان نفس السلسة النصية تكون بالشكل التالى :
كود:
unsigned char MyName[ ] = “JOHN”;
هنا ، يتم إنهاء الحروف تلقائيا بحرف NULL وهذا الخيار الثانى هو الأكثر قابلية للقراءة ، وخاصة عندما يكون المطلوب هو إعلان سلسلة طويلة . بالإضافة إلى ذلك ، سوف لن يتم إنهاء السلسة النصية بشكل صحيح إذا نسينا إدراج حرف NULL .
مثال على مصفوفات السلاسل النصية Arrays of Strings :
هناك العديد من التطبيقات ، حيث أننا قد نرغب فى إنشاء مصفوفات من السلاسل النصية فى برامجنا . فى المثال التالى ، المصفوفة Days تخزن أيام الأسبوع . لاحظ أن تحديد حجم البعد الأول "اختيارى" .
كود:
char Days[ ][10] = { “Monday”,
“Tuesday”,
“Wednesday”,
“Thursday”,
“Friday”,
“Saturday”,
“Sunday”
};
فى المثال أعلاه ، يتم تعيين (تحديد) حجم البعد الأول تلقائيا عن طريق المترجم ليكون 7 عناصر . يتم تعيين حجم البعد الثانى ليكون 10 عناصر ، والذى هو حجم أطول كلمة فى المصفوفة . لاحظ أن كل كلمة فى المصفوفة هى سلسلة نصية ومن ثم يتم إنهاؤها بحرف NULL .
الشكل التالى يبين بناء هذه المصفوفة :

ثابت السلاسل النصية Constant Strings :
فى العديد من التطبيقات قد يكون هناك حاجة لإنشاء "سلاسل نصية طويلة ثابتة" فى ذاكرة البرنامج الفلاش بالميكروكونترولر . مثل هذه السلاسل يمكن إنشاؤها كثابت لسلسلة نصية لتوفير مساحة فى ذاكرة البيانات RAM .
كود:
const unsigned char Text[ ] = “This is the main menu of the program”;
ملاحظات على الأحرف ومصفوفة الأحرف :
• تخزين الأحرف يختلف قليلا عن تخزين الأعداد . "الأحرف" characters فى لغة السى هى الحروف الهجائية المنفصلة letters ، والأعداد numbers والرموز الخاصة . يتم تخزين هذه الأحرف باستخدان بايت واحد أى 8 بت باستخدام "قيم" رموز أحرف كود أسكى . ومن ثم عندما نخزن الحرف ‘A’ فى متغير ، فإن لغة السى تخزن قيمة كود أسكى للحرف ‘A’ ، والتى هى العدد الصحيح 65 . لذلك يكون من الصحيح تماما ، فى لغة السى ، كتابة ما يلى :
النتيجة result سوف تكون الآن العدد العشرى 97 ، والتى هى قيمة كود أسكى للحرف ‘a’ .
فى لغة السى يتم تخزين الأحرف المنفصلة فى شكل مصفوفة بالشكل التالى :
كود:
char MenuOption[4] = {‘A’, ‘E’, ‘D’, ‘Q’};
لاحظ استخدام علامة التنصيص المفردة ‘A’ .
يتم تخزين مجموعة من الأحرف ، تسمى فى لغة السى "سلسلة" string ، بالشكل التالى :
كود:
char callsign[6] = “9w2gu”;
هذا يعنى ، إعلان المتغيرcallsign بطول 6 عناصر مع تخصيص القيمة الابتدائية 9w2gu لهذه العناصر .
لعلك لاحظت أن القيمة الابتدائية 9w2gu موكنة من خمس أحرف فقط فلماذا حددنا العناصر 6 عناصر ؟
المترجم يحتاج إلى أن يعرف متى يتم إنهاء السلسلة ، يقوم المترجم بعمل ذلك عن طريق إضافة الحرف ‘\0’ ، يسمى حرف NUL ، عند نهاية السلسلة .
أيضا يمكن إعلان السلسلة عن طريق بدايتها ونهايتها بعلامة التنصيص المزدوجة “..” ، فى هذه الحالة لا تحتاج السلسة للأقواس { } المستخدمة من أجل مصفوفة البعد الواحد . لذلك كن حذرا عند إعلان السلاسل .
لإعلان وتخصيص قيمة ابتدائية لمصفوفة متغيرات سلسلة أحرف نستخدم الشكل التالى :
كود:
char callsign[] = “9W2DTR”; // let compiler find the size
char handle[7] = ”Dexter”; // max char handle is 6 and 1 for ’\0’ NUL
لعرض محتويات السلسلة ، فقط يتم استخدام اسم المتغير كما يلى :
Lcd_Out(1,1,callsign);
إذا تم الإعلان بالشكل التالى :
كود:
char callsign[6];
callsign = “9w2dtr”
سوف يتم طباعة 9w2dt فقط ، أو طباعة نتيجة غير مرغوب فيها ، تذكر أنك تحتاج إلى تحديد حيز لحرف NUL أيضا . الشكل التالى يوضح مصفوفة الحروف .

مصفوفات الأحرف متعددة الأبعاد :
كود:
char dow[7][4] = {“Mon”, “Tue”, “Wed”, “Thu”, “Fri”, “Sat”, “Sun”};
فى هذه الصيغة يتم إنشاء مصفوفة لها 7 صفوف rows ، وبكل صف 4 أحرف ، كما فى الشكل التالى :

لعرض يوم الجمعة Friday ، سوف يجب علينا تحديد فقط عنصر الصف كما يلى :
كود:
lcd_out(1,1,dow[4]);
هذا سوف يتم عرض Fri على وحدة العرض LCD .
|