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

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 02-04-2020, 06:25 PM المشاركة 1   
افتراضي الدرس الثامن عشر السلاسل النصية والاردوينو Arduino Strings Twitter FaceBook Google+



دورة برمجة الاردوينو : الدرس الثامن عشر
السلاسل النصية والاردوينو Arduino Strings


تُستخدم السلاسل Strings لتخزين نص text. يمكن استخدامها لعرض النص على شاشة LCD أو في نافذة الاردوينو التسلسلية لبيئة التطوير Arduino IDE.
السلاسل مفيدة أيضًا لتخزين إدخال input المستخدم - على سبيل المثال الأحرف التي يكتبها المستخدم على لوحة مفاتيح متصلة بالاردوينو .

هناك نوعان من السلاسل في برمجة الاردوينو Arduino:
1) مصفوفات Arrays الأحرف التي هي نفس السلاسل المستخدمة في برمجة لغة C.
2) سلسلة الاردوينو Arduino String التي تتيح لنا استخدام كائن السلسلة string object في البرنامج .
يتم بالكامل شرح السلاسل Strings والكائنات objects وكيفية استخدام السلاسل في برامج Arduino في هذا الدرس . يتم الإجابة على السؤال عن نوع السلسلة التي سيتم استخدامها في البرنامج في نهاية هذا الدرس .

سلسلة مصفوفات الحرف String Character Arrays
النوع الأول من السلسلة الذي سنتناوله هو السلسلة التي هي سلسلة (متتالية) series من الأحرف من نوع char. أوضح الدرس السابق ما هي المصفوقة - سلسلة متتالية consecutive series من نفس النوع من المتغيرات المخزنة في الذاكرة. السلسلة string هي مصفوفة من متغيرات الحرف char.
السلسلة هي مصفوفة خاصة تحتوي على عنصر إضافي واحد في نهاية السلسلة والذي يكون دائمًا له القيمة 0 (صفر). يُعرف هذا "سلسلة منتهية بحرف عديم الوجود أو لاشىء""null terminated string".

مثال برنامج على سلسلة مصفوفة الحرف :
سيوضح هذا البرنامج كيفية صنع (عمل) سلسلة وطباعتها إلى نافذة الشاشة التسلسلية.

كود:
void setup() {
  char my_str[6];    // an array big enough for a 5 character string
  
  Serial.begin(9600);
  
  my_str[0] = 'H';  // the string consists of 5 characters
  my_str[1] = 'e';
  my_str[2] = 'l';
  my_str[3] = 'l';
  my_str[4] = 'o';
  my_str[5] = 0;    // 6th array element is a null terminator
  
  Serial.println(my_str);
}

void loop() {
}

يُظهر البرنامج مما تتكون السلسلة من - تتكون من مصفوفة حرف بأحرف قابلة للطباعة و 0 في العنصر الأخير من المصفوفة لإظهار أن هذا حيث تنتهي السلسلة.
يمكن طباعة السلسلة إلى نافذة الشاشة التسلسلية باستخدام Serial.println() وتمريرها باسم السلسلة.
يمكن كتابة نفس هذا البرنامج بسهولة أكبر بهذه الطريقة:

كود:
void setup() {
  char my_str[] = "Hello";
  
  Serial.begin(9600);
  
  Serial.println(my_str);
}

void loop() {
}

في هذا البرنامج ، يحسب المترجم حجم مصفوفة السلسلة ويقوم أيضًا تلقائيًا بإنهاء السلسلة بصفر. يتم إنشاء مصفوفة تتكون من ستة عناصر ويتكون من خمسة أحرف متبوعة بصفر تمامًا كما هو الحال في البرنامج السابق.

السلاسل والحروف Strings and Characters :
تتم كتابة الأحرف بين علامات الاقتباس الفردية مثل هذا:

كود:
'w'

تتم كتابة السلاسل بين علامات الاقتباس المزدوجة مثل هذا:

كود:
"This is a string"

معالجة مصفوفات السلسلة Manipulating String Arrays
يمكننا تغيير مصفوفة سلسلة داخل برنامج كما يظهر البرنامج التالي.

كود:
void setup() {
  char like[] = "I like coffee and cake";  // create a string
  
  Serial.begin(9600);
  
  // (1) print the string
  Serial.println(like);
  
  // (2) delete part of the string
  like[13] = 0;
  Serial.println(like);
  
  // (3) substitute a word into the string
  like[13] = ' ';  // replace the null terminator with a space
  like[18] = 't';  // insert the new word
  like[19] = 'e';
  like[20] = 'a';
  like[21] = 0;    // terminate the string
  Serial.println(like);
}

void loop() {
}

إنشاء وطباعة السلسلة Creating and Printing the String
في هذا البرنامج ، يتم إنشاء سلسلة جديدة ثم طباعتها للعرض في النافذة التسلسلية (1) .

• تقصير السلسلة Shortening the String
يتم تقصير السلسلة عن طريق استبدال الحرف الرابع عشر في السلسلة بصفر الانتهاء (2). هذا هو العنصر رقم 13 في مصفوفة السلسلة العد من 0.
عند طباعة السلسلة ، تتم طباعة جميع الأحرف حتى صفر الانتهاء الجديد . لا تختفي الحروف الأخرى - فهي لا تزال موجودة في الذاكرة ولا تزال مصفوفة السلسلة بنفس الحجم. والفرق الوحيد هو أن أي دالة تعمل مع السلاسل لن ترى سوى السلسلة حتى حرف النهاية null الأول.


• تغيير كلمة في السلسلة Changing a Word in the String
وأخيرًا يستبدل البرنامج كلمة "cake" بكلمة "tea" (3). يجب أولاً استبدال حرف النهاية null في like[13] بمسافة space بحيث تتم استعادة السلسلة إلى كيفية إنشائها في الأصل.
الحروف الجديدة تستبدل "cak" من كلمة "cake" بكلمة tea" . يتم ذلك عن طريق استبدال الأحرف الفردية. يتم استبدال حرف "e" من "cake" بحرف إنهاء null جديد . والنتيجة هي أن السلسلة تنتهي فعليًا بحرفين فارغين - الحرف الأصلي في نهاية السلسلة والحرف الجديد الذي يحل محل حرف "e" في "cake" . لا يحدث هذا فرقًا عند طباعة السلسلة الجديدة لأن الدالة التي تطبع السلسلة تتوقف عن طباعة أحرف السلسلة عندما تواجه أول حرف نهاية null .

دوال لمعالجة مصفوفات السلسلة Functions to Manipulate String Arrays
في البرنامج السابق تم معالجة السلسلة بطريقة يدوية للغاية عن طريق الوصول إلى أحرف فردية في السلسلة. لتسهيل معالجة مصفوفات السلسلة ، يمكنك كتابة الدوال الخاصة بك للقيام بذلك ، أو استخدام بعض دوال السلسلة من مكتبة لغة C.
يستخدم البرنامج التالي بعض دوال سلسلة لغة C.

كود:
void setup() {
  char str[] = "This is my string";  // create a string
  char out_str[40];                  // output from string functions placed here
  int num;                           // general purpose integer
  
  Serial.begin(9600);
  
  // (1) print the string
  Serial.println(str);
  
  // (2) get the length of the string (excludes null terminator)
  num = strlen(str);
  Serial.print("String length is: ");
  Serial.println(num);
  
  // (3) get the length of the array (includes null terminator)
  num = sizeof(str);  // sizeof() is not a C string function
  Serial.print("Size of the array: ");
  Serial.println(num);
  
  // (4) copy a string
  strcpy(out_str, str);
  Serial.println(out_str);
  
  // (5) add a string to the end of a string (append)
  strcat(out_str, " sketch.");
  Serial.println(out_str);
  num = strlen(out_str);
  Serial.print("String length is: ");
  Serial.println(num);
  num = sizeof(out_str);
  Serial.print("Size of the array out_str[]: ");
  Serial.println(num);
}

void loop() {
}

يعمل البرنامج بالطريقة التالية.

(1) طباعة السلسلة Print the String
تتم طباعة السلسلة التي تم إنشاؤها حديثًا إلى النافذة التسلسلية كما تم في البرامج السابقة.

(2) الحصول على طول السلسلة Get the Length of the String
يتم استخدام الدالة strlen() للحصول على طول السلسلة. طول السلسلة مخصص للأحرف القابلة للطباعة فقط ولا يتضمن حرف النهاية null .
تحتوي السلسلة على 17 حرفًا ، لذلك نرى 17 مطبوعة في النافذة التسلسلية .

(3) الحصول على طول المصفوفة Get the Length of the Array
يستخدم العامل sizeof() للحصول على طول المصفوفة التي تحتوي على السلسلة. يشتمل الطول على حرف نهاية null ، لذا فإن الطول أكبر بواحد من طول السلسلة.
العامل sizeof() يشبه دالة ، ولكن من الناحية الفنية هو عامل operator . وهو ليس جزءًا من مكتبة السلسلة string للغة C ، ولكن تم استخدامه في البرنامج لإظهار الفرق بين حجم المصفوفة وحجم السلسلة (أو طول السلسلة).

(4) نسخ سلسلة Copy a String
يتم استخدام الدالة strcpy() لنسخ السلسلة str[] إلى المصفوفة out_num[] . تنسخ الدالة strcpy() السلسلة الثانية التي تم تمريرها إليها في السلسلة الأولى. توجد نسخة من السلسلة الآن في المصفوفة out_num[] ، ولكنها لا تستوعب سوى 18 عنصرًا من المصفوفة ، لذلك لا يزال لدينا 22 عنصرًا char حرا في المصفوفة . يتم العثور على هذه العناصر الحرة بعد السلسلة في الذاكرة.
تم نسخ السلسلة إلى المصفوفة بحيث يكون لدينا مساحة إضافية في المصفوفة لاستخدامها في الجزء التالي من البرنامج الذي يضيف سلسلة إلى نهاية السلسلة.

(5) إلحاق سلسلة بسلسلة (تسلسل) Append a String to a String (Concatenate)
يربط البرنامج سلسلة بأخرى ، والتي تُعرف بالسلسلة أو التسلسل concatenation . يتم ذلك باستخدام الدالة strcat() . تضع الدالة strcat() السلسلة الثانية التي تم تمريرها إليها في نهاية السلسلة الأولى التي تم تمريرها إليها.
بعد التسلسل ، تتم طباعة طول السلسلة لإظهار طول السلسلة الجديدة. ثم يتم طباعة طول المصفوفة لإظهار أن لدينا سلسلة طويلة مكونة من 25 حرفًا في مصفوفة بطول 40 عنصرًا.
تذكر أن السلسلة الطويلة المكونة من 25 حرفًا تستهلك في الواقع 26 حرفًا من المصفوفة بسبب حرف الانتهاء null .

حدود المصفوفة Array Bounds
عند العمل مع السلاسل والمصفوفات ، من المهم جدًا العمل ضمن حدود bounds السلسلة أو المصفوفة. في برنامج المثال ، تم إنشاء مصفوفة مكونة من 40 حرفًا من أجل تخصيص الذاكرة التي يمكن استخدامها لمعالجة السلاسل.

إذا كانت المصفوفة صغيرة للغاية وحاولنا نسخ سلسلة أكبر من المصفوفة إليها ، فسيتم نسخ السلسلة في نهاية المصفوفة . يمكن أن تحتوي الذاكرة بعد نهاية المصفوفة على بيانات مهمة أخرى مستخدمة في البرنامج والتي سيتم استبدالها overwritten بعد ذلك بواسطة السلسلة الخاصة بنا. إذا تم تجاوز الذاكرة بعد نهاية السلسلة ، فقد يتعطل البرنامج أو تسبب سلوكًا غير متوقع.

كائن سلسلة الاردوينو The Arduino String Object
النوع الثاني من السلسلة المستخدمة في برمجة الاردوينو هو الكائن String.

ما هو الكائن ؟ What is an Object?
الكائن هو بناء construct يحتوي على كل من البيانات data والدوال functions . يمكن إنشاء كائن String تمامًا مثل المتغير وتعيين قيمة أو سلسلة. يحتوي كائن String على دوال (والتي تسمى "طرق" "methods"في البرمجة الموجهة للكائنات (OOP)) والتي تعمل على بيانات السلسلة الموجودة في كائن السلسلة String.
سوف يوضح البرنامج والشرح التاليان ما هو الكائن وكيف يتم استخدام كائن String.

كود:
 void setup() {
  String my_str = "This is my string.";
  
  Serial.begin(9600);
  
  // (1) print the string
  Serial.println(my_str);
  
  // (2) change the string to upper-case
  my_str.toUpperCase();
  Serial.println(my_str);
  
  // (3) overwrite the string
  my_str = "My new string.";
  Serial.println(my_str);
  
  // (4) replace a word in the string
  my_str.replace("string", "Arduino sketch");
  Serial.println(my_str);
  
  // (5) get the length of the string
  Serial.print("String length is: ");
  Serial.println(my_str.length());
}

void loop() {
}

يتم إنشاء كائن سلسلة string object وتعيين قيمة (أو سلسلة) في أعلى البرنامج .

كود:
String my_str = "This is my string.";

يؤدي هذا إلى إنشاء كائن من الفئة String باسم my_str ويعطيه قيمة "This is my string." .
يمكن مقارنة ذلك بإنشاء متغير وتعيين قيمة له مثل عدد صحيح:

كود:
int my_var = 102;

(1) طباعة السلسلة Printing the String
يمكن طباعة السلسلة إلى النافذة التسلسلية تمامًا مثل سلسلة مصفوفة الأحرف.

(2) تحويل السلسلة إلى أحرف كبيرة Convert the String to Upper-case
يحتوي كائن السلسلة my_str الذي تم إنشاؤه على عدد من الدوال أو الأساليب methods التي يمكن عملها عليه. يتم استدعاء هذه الطرق باستخدام اسم الكائنات متبوعًا بعامل النقطة (.) ثم اسم الدالة المراد استخدامها.

كود:
my_str.toUpperCase();

تعمل الدالة toUpperCase() على السلسلة الموجودة في الكائن my_str وهو من النوع String وتحول بيانات السلسلة (أو النص) التي يحتوي عليها الكائن إلى أحرف كبيرة.
يمكن العثور على قائمة بالدوال التي تحتوي عليها الفئة String في مرجع سلسلة الاردوينو Arduino String reference .
فنيا تُسمى String فئة class وتُستخدم لإنشاء كائنات String.

(3) استبدال سلسلة Overwrite a String
يتم استخدام عامل التخصيص assignment operator لتعيين سلسلة جديدة إلى كائن my_str الذي يحل محل السلسلة القديمة.

كود:
my_str = "My new string.";

لا يمكن استخدام عامل التخصيص في سلاسل مصفوفات الأحرف ، ولكنه يعمل على كائنات سلسلة String فقط.

(4) استبدال كلمة في السلسلة Replacing a Word in the String
يتم استخدام الدالة replace() لاستبدال السلسلة الأولى التي تم تمريرها إليها بالسلسلة الثانية التي تم تمريرها إليها. replace() هي دالة أخرى مضمنة في الفئة String وهي متاحة للاستخدام على كائن String وهو my_str.

(5) الحصول على طول السلسلة Getting the Length of the String
يتم الحصول على طول السلسلة بسهولة باستخدام الدالة length() . في برنامج المثال ، يتم تمرير النتيجة التي تم إرجاعها بواسطة length() مباشرةً إلى Serial.println() بدون استخدام متغير وسيط.

متى يتم استخدام كائن سلسلة String Object أو مصفوفة أحرف سلسلة String Character Array
يعتبر استخدام كائن String أسهل بكثير من استخدام مصفوفة أحرف سلسلة. يحتوي الكائن على دوال مضمنة يمكنها إجراء عدد من العمليات على سلاسل موثقة بالكامل في القسم المرجعي على موقع Arduino على الويب.

العيب الرئيسي لاستخدام كائن String هو أنه يستخدم الكثير من الذاكرة ويمكنه استخدام ذاكرة Arduinos RAM بسرعة والتي قد تتسبب في تعليق Arduino أو تعطله أو إنتاج سلوك غير متوقع.
إذا كان البرنامج على Arduino صغيرًا ويحد من استخدام الكائنات ، فلا يجب أن تكون هناك مشاكل.

سلاسل مصفوفة الأحرف أكثر صعوبة في الاستخدام وقد تحتاج إلى كتابة دوالك الخاصة للعمل على هذه الأنواع من السلاسل. الميزة هي أنه يمكنك التحكم في حجم مصفوفة السلسلة التي تقوم بها ، بحيث يمكنك الحفاظ على المصفوفات صغيرة لتوفير الذاكرة.
تحتاج إلى التأكد من أنك لا تكتب فوق نهاية حدود المصفوفة باستخدام مصفوفات السلسلة. لا يحتوي كائن String على هذه المشكلة وسيهتم بحدود السلسلة نيابة عنك ، شريطة أن يكون هناك ذاكرة كافية للعمل عليها. يمكن أن يحاول كائن String الكتابة إلى الذاكرة التي لا توجد عند نفاد الذاكرة ، ولكن لن يكتب أبدًا في نهاية السلسلة التي يعمل عليها.

أين يتم استخدام السلاسل Where Strings are Used
تناول هذا الدرس ما هي السلاسل وكيف تبدو في الذاكرة وبعض العمليات التي يمكن القيام بها على السلاسل.
سيتم تغطية الاستخدامات العملية الفعلية للسلاسل في الدرس التالي عندما نتناول كيفية الحصول على إدخال المستخدم من نافذة الشاشة التسلسلية وحفظ الإدخال في سلسلة.

اعلانات
إضافة رد

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

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

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


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

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