قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 21-05-2017, 01:00 PM المشاركة 1   
افتراضي المصفوفات Arrays Twitter FaceBook Google+



المصفوفات Arrays :

المصفوقات الرقمية :
أثناء تطوير (إنشاء) البرنامج ، عادة ما يكون هناك حاجة (ضرورة) لمعالجة العديد من "بنود البيانات من نفس النوع" . على سبيل المثال ، برنامج مصمم لقراءة أعمار 50 طالب فى حجرة صف ، فقد يتبادر للذهن من أول وهلة أننا بحاجة لاستخدام 50 متغير منفصل من نوع الأعداد الصحيحة . لكن ، مثل هذا النهج يجعل من الصعب معالجة البيانات ، حيث أنه علينا الوصول لكل عدد صحيح بشكل منفصل . علاوة على ذلك ، إذا زاد عدد الصف إلى 70 طالب ، على سبيل المثال ، عنئذ علينا إدخال 20 عدد صحيح أخرى و20 عبارة أخرى لمعالجة المدخلات الجديدة .
الحل لهذه المشكلة هو استخدام المصفوفة array كوسيلة سهلة لجمع البنود ذات الصلة تحت اسم متغير واحد . يتم إعلان (تعريف) المصفوفة عن طريق " تحديد اسمها ، ونوع وعدد عناصرها " التى عليها تخزينها . على سبيل المثال ، فيما يلى صيغة إعلان مصفوفة "أعداد صحيحة بدون إشارة" ، تسمى Average ، وبها خمس عناصر :

كود:
unsigned int Average[5];
يتم حفظ المصفوفة فى أماكن (مواقع) ذاكرة متتابعة (متسلسلة) كما هو موضح بالشكل التالى :



فى هذا المثال ، أول عنصر "رقمه المسلسل صفر " index 0 ، وآخر عنصر رقمه المسلسل (4) . يتم عنونة عناصر المصفوفة عن طريق "كتابة اسم المصفوفة متبوعا بقوسين مربعين ( […] ) بداخلهما الرقم المسلسل للعنصر المحدد" . على سبيل المثال ، لتحديد "العنصر الثالث" بالمصفوفة بالقيمة "120" يمكن كتابة مايلى :

كود:
Average[2] = 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 ، بها "ثلاثة صفوف" و "عمودين" :

كود:
int MyMatrix[3][2];
هذه المصفوفة لها البناء التالى : المصفوفة بها أجمالى 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 = ‘A’ + 32;
النتيجة 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 .

احصائية الشكر والاعجاب - 2 شكراً, 0 عدم اعجاب, 2 اعجاب
شكراً عبدالله حجازى, محمد إلياس ( شكر العضو على هذه المشاركة )
اعجاب عبدالله حجازى, محمد إلياس ( أعجبته المشاركة )
اعلانات

الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,688
نشاط [ عبدالله حجازى ]
قوة السمعة:111
قديم 22-05-2017, 03:31 AM المشاركة 2   
Thumbs up اللهم انفعنا بما علمتنا وعلمنا ما ينفعنا وزدنا علما


ممتاز .. مهندسنا القدير " فتح الله عبد العزيز " بارك الله فيك وذادك من العلم النافع ... بالتوفيق ...

متابعين معك .. أكمل .. وشكراااا جزيلا لك

احصائية الشكر والاعجاب - 0 شكراً, 0 عدم اعجاب, 1 اعجاب
اعجاب محمد إلياس ( أعجبته المشاركة )
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

الصورة الرمزية مسلم11
مسلم11
:: عضو ذهبي ::
تاريخ التسجيل: Jun 2009
الدولة: بلاد الشام
المشاركات: 3,803
نشاط [ مسلم11 ]
قوة السمعة:184
قديم 22-06-2017, 08:26 PM المشاركة 3   
افتراضي


للرفع
شكرا لك اخي الكريم

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 02:09 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025