صفحة 239 - كتاب إنترنت الأشياء - الصف 11 - الفصل 1 - المملكة العربية السعودية

الكتاب: كتاب إنترنت الأشياء - الصف 11 - الفصل 1 | المادة: إنترنت الأشياء | المرحلة: الصف 11 | الفصل الدراسي: 1

الدولة: المملكة العربية السعودية | المنهج: المنهج السعودي - وزارة التعليم

📚 معلومات الصفحة

الكتاب: كتاب إنترنت الأشياء - الصف 11 - الفصل 1 | المادة: إنترنت الأشياء | المرحلة: الصف 11 | الفصل الدراسي: 1

الدولة: المملكة العربية السعودية | المنهج: المنهج السعودي - وزارة التعليم

نوع المحتوى: درس تعليمي

📝 ملخص الصفحة

📚 البحث عن خطأ برمجي

المفاهيم الأساسية

خطأ قاعدي (Syntax Error): خطأ في كتابة قواعد لغة البرمجة.

خطأ منطقي (Logical Error): خطأ في تسلسل أو منطق التعليمات يؤدي لنتيجة خاطئة.

خريطة المفاهيم

```markmap

تمارين برمجة C++ لإنترنت الأشياء

التمرين 1: دالة تضخيم الإشارة

المطلوب

  • كتابة دالة بلغة C++

خصائص الدالة

  • تستقبل وسيطين
#### النوع: float

  • تستقبل إشارة تناظرية
  • تستقبل مضاعفًا

الوظيفة

  • تضخيم (مضاعفة) الإشارة
  • إرجاع الإشارة بعد التضخيم

التمرين 2: تحويل درجة الحرارة وإرسالها

المطلوب

  • رسم مخطط بلغة C++

خطوات المخطط

  • قراءة إشارة تناظرية
#### تمثل: درجة الحرارة بالفهرنهايت

  • إنشاء دالة تحويل
#### التحويل من فهرنهايت إلى مئوية

  • إرسال القيمة المحولة
#### الإرسال إلى: طرف كمخرج تناظري

التمرين 3: البحث عن خطأ قاعدي ومنطقي

الكود الأول

#### خطأ قاعدي

  • استخدام دالة `delay()` مع قيمة نصية `"1000"`
#### خطأ منطقي

  • استخدام `--counter` في حلقة `for` مما يؤدي إلى عد تنازلي لا نهائي

الكود الثاني

#### خطأ قاعدي

  • استخدام `digitalRead()` لقراءة قيمة تناظرية من `A0`
#### خطأ منطقي

  • مقارنة قيمة درجة الحرارة بـ `270` دون توضيح الوحدة (مئوية؟ فهرنهايت؟)
```

نقاط مهمة

  • يطلب التمرين من الطالب تحديد نوعين من الأخطاء في كودين برمجيين.
  • الأخطاء القاعدية تتعلق بشكل كتابة الكود.
  • الأخطاء المنطقية تتعلق بتصميم الكود ووظيفته.

📋 المحتوى المنظم

📖 محتوى تعليمي مفصّل

3

نوع: محتوى تعليمي

ابحث عن خطأ قـاعدي (Syntax Error)، وخطأ منطقي (Logical Error) في التعليمات البرمجية الآتية:

نوع: محتوى تعليمي

void loop() { for (counter = 0; counter < 5; --counter) { digitalWrite(11, HIGH); // Wait for 1000 millisecond(s) delay("1000"); digitalWrite(11, LOW); // Wait for 1000 millisecond(s) delay("1000"); } }

نوع: محتوى تعليمي

خطأ قـاعدي

نوع: محتوى تعليمي

خطأ منطقي

نوع: محتوى تعليمي

void loop() { temperature = digitalRead(A0); Serial.println(temperature); if (temperature >= 270) { digitalWrite(11, 1); // Wait for 2000 millisecond(s) delay(2000); digitalWrite(11, 0); } }

نوع: محتوى تعليمي

خطأ قـاعدي

نوع: محتوى تعليمي

خطأ منطقي

نوع: METADATA

وزارة التعليم Ministry of Education 2025 - 1447

📄 النص الكامل للصفحة

--- SECTION: 3 --- ابحث عن خطأ قـاعدي (Syntax Error)، وخطأ منطقي (Logical Error) في التعليمات البرمجية الآتية: void loop() { for (counter = 0; counter < 5; --counter) { digitalWrite(11, HIGH); // Wait for 1000 millisecond(s) delay("1000"); digitalWrite(11, LOW); // Wait for 1000 millisecond(s) delay("1000"); } } خطأ قـاعدي خطأ منطقي void loop() { temperature = digitalRead(A0); Serial.println(temperature); if (temperature >= 270) { digitalWrite(11, 1); // Wait for 2000 millisecond(s) delay(2000); digitalWrite(11, 0); } } خطأ قـاعدي خطأ منطقي وزارة التعليم Ministry of Education 2025 - 1447

✅ حلول أسئلة الكتاب الرسمية

عدد الأسئلة: 4

سؤال س:٣ - التعليمات البرمجية الأولى - خطأ منطقي: ابحث عن خطأ قـاعدي (Syntax Error)، وخطأ منطقي (Logical Error) في التعليمات البرمجية الآتية: void loop() { for (counter = 0; counter < 5; --counter) { digitalWrite(11, HIGH); // Wait for 1000 millisecond(s) delay("1000"); digitalWrite(11, LOW); // Wait for 1000 millisecond(s) delay("1000"); } }

الإجابة: استخدام إنقاص العداد (--counter) بدلاً من زيادته مما يعطل عمل الحلقة.

خطوات الحل:

  1. **الخطوة 1 (فهم حلقة التكرار):** حلقة `for` تتكون عادةً من ثلاثة أجزاء: تهيئة العداد، شرط الاستمرار، وتحديث العداد. الهدف منها هو تكرار مجموعة من التعليمات لعدد محدد من المرات.
  2. **الخطوة 2 (تحليل الخطأ المنطقي):** في هذه التعليمة البرمجية، تم تهيئة العداد `counter` بالقيمة 0، وشرط الاستمرار هو `counter < 5`. الجزء الثالث هو `--counter`، والذي يعني إنقاص قيمة العداد في كل مرة. إذا بدأ العداد من 0 وتناقص في كل مرة (-1، -2، -3...)، فإنه سيظل دائمًا أقل من 5، مما يجعل شرط الاستمرار محققًا باستمرار.
  3. **الخطوة 3 (النتيجة):** هذا يؤدي إلى حلقة تكرار لا نهائية (أو لا تتوقف عند العدد المطلوب)، وهو خطأ في منطق البرنامج لأن الهدف كان على الأرجح تكرار الحلقة 5 مرات بزيادة العداد. لذلك، الخطأ المنطقي هو: **استخدام إنقاص العداد (--counter) بدلاً من زيادته مما يعطل عمل الحلقة.**

سؤال س:٣ - التعليمات البرمجية الأولى - خطأ قاعدي: ابحث عن خطأ قـاعدي (Syntax Error)، وخطأ منطقي (Logical Error) في التعليمات البرمجية الآتية: void loop() { for (counter = 0; counter < 5; --counter) { digitalWrite(11, HIGH); // Wait for 1000 millisecond(s) delay("1000"); digitalWrite(11, LOW); // Wait for 1000 millisecond(s) delay("1000"); } }

الإجابة: كتابة قيمة التأخير "1000" كنص بين علامات تنصيص بدلاً من رقم.

خطوات الحل:

  1. **الخطوة 1 (فهم وظيفة الدالة `delay()`):** الدالة `delay()` في بيئة الأردوينو تستخدم لإيقاف تنفيذ البرنامج مؤقتًا لعدد معين من المللي ثانية. هذه الدالة تتوقع قيمة رقمية (عدد صحيح) كمدخل يمثل مدة التأخير.
  2. **الخطوة 2 (تحليل الخطأ القاعدي):** في السطر `delay("1000");`، تم تمرير القيمة "1000" بين علامتي تنصيص مزدوجتين. هذا يعني أن القيمة تُعامل كنص (String Literal) وليس كعدد صحيح (Integer).
  3. **الخطوة 3 (النتيجة):** تمرير نص إلى دالة تتوقع عددًا صحيحًا هو خطأ في قواعد اللغة البرمجية (Syntax Error) وسيمنع البرنامج من التجميع بنجاح. لذلك، الخطأ القاعدي هو: **كتابة قيمة التأخير "1000" كنص بين علامات تنصيص بدلاً من رقم.**

سؤال س:٣ - التعليمات البرمجية الثانية - خطأ منطقي: ابحث عن خطأ قـاعدي (Syntax Error)، وخطأ منطقي (Logical Error) في التعليمات البرمجية الآتية: void loop() { temperature = digitalRead(A0); Serial.println(temperature); if (temperature >= 270) { digitalWrite(11, 1); // Wait for 2000 millisecond(s) delay(2000); digitalWrite(11, 0); } }

الإجابة: استخدام analogRead بدلاً من digitalRead لقراءة الحرارة (270).

خطوات الحل:

  1. **الخطوة 1 (فهم وظائف القراءة الرقمية والتماثلية):** الدالة `digitalRead()` تُستخدم لقراءة حالة مدخل رقمي (HIGH أو LOW، أي 1 أو 0). بينما الدالة `analogRead()` تُستخدم لقراءة قيمة جهد تماثلي من مدخل تماثلي (مثل A0)، وتُرجع قيمة تتراوح عادةً بين 0 و 1023.
  2. **الخطوة 2 (تحليل الخطأ المنطقي):** التعليمات البرمجية تحاول قراءة `temperature` من المنفذ `A0` باستخدام `digitalRead(A0)`. المنفذ `A0` هو منفذ تماثلي، وقراءة درجة الحرارة عادةً ما تتطلب قراءة قيمة تماثلية (جهد متغير) وليس قيمة رقمية (تشغيل/إيقاف). إذا استخدمنا `digitalRead()`، فإن القيمة التي ستُرجع ستكون 0 أو 1 فقط، ولن تكون أبدًا 270 أو أي قيمة أخرى يمكن مقارنتها بـ 270 بشكل منطقي لدرجة حرارة.
  3. **الخطوة 3 (النتيجة):** البرنامج يحاول مقارنة القيمة المقروءة (التي ستكون 0 أو 1) بالرقم 270، وهذا يشير إلى أن القراءة لم تتم بالشكل الصحيح لتمثيل درجة الحرارة. لذلك، الخطأ المنطقي هو: **استخدام `digitalRead` بدلاً من `analogRead` لقراءة الحرارة (270).**

سؤال س:٣ - التعليمات البرمجية الثانية - خطأ قاعدي: ابحث عن خطأ قـاعدي (Syntax Error)، وخطأ منطقي (Logical Error) في التعليمات البرمجية الآتية: void loop() { temperature = digitalRead(A0); Serial.println(temperature); if (temperature >= 270) { digitalWrite(11, 1); // Wait for 2000 millisecond(s) delay(2000); digitalWrite(11, 0); } }

الإجابة: استخدام المتغير temperature دون تعريف نوع البيانات (غير معروف).

خطوات الحل:

  1. **الخطوة 1 (قواعد تعريف المتغيرات في البرمجة):** في لغات البرمجة مثل C++ (التي تُستخدم في الأردوينو)، يجب تعريف جميع المتغيرات قبل استخدامها. يتضمن التعريف تحديد نوع البيانات للمتغير (مثل `int` للأعداد الصحيحة، `float` للأعداد العشرية، إلخ).
  2. **الخطوة 2 (تحليل الخطأ القاعدي):** في التعليمات البرمجية المعطاة، يتم استخدام المتغير `temperature` في السطر `temperature = digitalRead(A0);`، ولكن لا يوجد أي تعريف مسبق لهذا المتغير (مثل `int temperature;` أو `float temperature;`) في نطاق الدالة `loop()` أو خارجها.
  3. **الخطوة 3 (النتيجة):** عدم تعريف نوع البيانات للمتغير `temperature` قبل استخدامه يُعد خطأً في قواعد اللغة البرمجية (Syntax Error) وسيؤدي إلى فشل عملية تجميع الكود. لذلك، الخطأ القاعدي هو: **استخدام المتغير `temperature` دون تعريف نوع البيانات (غير معروف).**

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

عدد البطاقات: 4 بطاقة لهذه الصفحة

في التعليمات البرمجية الآتية، ما هو الخطأ القاعدي (Syntax Error)؟ void loop() { for (counter = 0; counter < 5; --counter) { digitalWrite(11, HIGH); delay("1000"); digitalWrite(11, LOW); delay("1000"); } }

  • أ) استخدام حلقة for بدلاً من while.
  • ب) كتابة قيمة التأخير "1000" كنص بين علامات تنصيص بدلاً من رقم.
  • ج) عدم إغلاق الأقواس المعقوفة للدالة loop.
  • د) استخدام المنفذ الرقمي 11 بدلاً من 13.

الإجابة الصحيحة: b

الإجابة: كتابة قيمة التأخير "1000" كنص بين علامات تنصيص بدلاً من رقم.

الشرح: 1. دالة `delay()` في بيئة الأردوينو تستخدم لإيقاف التنفيذ لعدد معين من المللي ثانية. 2. هذه الدالة تتوقع قيمة رقمية (عدد صحيح) كمدخل. 3. في الكود، تم تمرير القيمة "1000" بين علامتي تنصيص، مما يجعلها نصاً (String). 4. تمرير نص إلى دالة تتوقع عدداً صحيحاً هو خطأ في قواعد اللغة (Syntax Error).

تلميح: تتوقع دالة التأخير (delay) في لغة الأردوينو نوعاً محدداً من البيانات كمعامل.

التصنيف: مفهوم جوهري | المستوى: سهل

في التعليمات البرمجية الآتية، ما هو الخطأ المنطقي (Logical Error)؟ void loop() { for (counter = 0; counter < 5; --counter) { digitalWrite(11, HIGH); delay(1000); digitalWrite(11, LOW); delay(1000); } }

  • أ) استخدام إنقاص العداد (--counter) بدلاً من زيادته، مما يؤدي إلى حلقة تكرار لا نهائية.
  • ب) استخدام القيمة 5 كحد أقصى للتكرار، بينما يجب أن تكون 10.
  • ج) عدم وجود تأخير كافٍ بين تشغيل وإطفاء الليد.
  • د) استخدام المنفذ 11 الذي لا يدعم الإخراج الرقمي.

الإجابة الصحيحة: a

الإجابة: استخدام إنقاص العداد (--counter) بدلاً من زيادته، مما يؤدي إلى حلقة تكرار لا نهائية.

الشرح: 1. حلقة `for` تتكون من: تهيئة العداد (`counter = 0`)، شرط الاستمرار (`counter < 5`)، وتحديث العداد (`--counter`). 2. التحديث `--counter` يعني إنقاص قيمة العداد بمقدار 1 في كل تكرار. 3. إذا بدأ العداد من 0 وتناقص (-1، -2، -3...)، فإنه سيبقى دائماً أقل من 5. 4. هذا يجعل شرط الاستمرار محققاً إلى الأبد، مما يؤدي إلى حلقة تكرار لا نهائية، وهو خطأ في منطق البرنامج.

تلميح: فكر في كيفية عمل حلقة for: التهيئة، الشرط، والتحديث. ماذا يحدث للعداد في كل تكرار؟

التصنيف: مفهوم جوهري | المستوى: متوسط

في التعليمات البرمجية الآتية، ما هو الخطأ القاعدي (Syntax Error)؟ void loop() { temperature = digitalRead(A0); Serial.println(temperature); if (temperature >= 270) { digitalWrite(11, 1); delay(2000); digitalWrite(11, 0); } }

  • أ) استخدام عامل المقارنة >= بدلاً من ==.
  • ب) استخدام المتغير temperature دون تعريف نوع البيانات الخاص به.
  • ج) كتابة delay(2000) بدون علامات تنصيص.
  • د) استخدام Serial.println() داخل الدالة loop.

الإجابة الصحيحة: b

الإجابة: استخدام المتغير temperature دون تعريف نوع البيانات الخاص به.

الشرح: 1. في لغة البرمجة C++ المستخدمة في الأردوينو، يجب تعريف جميع المتغيرات قبل استخدامها. 2. يتضمن التعريف تحديد نوع البيانات (مثل `int`، `float`). 3. في الكود، يتم استخدام المتغير `temperature` مباشرة في السطر `temperature = digitalRead(A0);`. 4. لا يوجد تعريف مسبق لهذا المتغير (مثل `int temperature;`)، وهذا خطأ في قواعد اللغة (Syntax Error).

تلميح: في لغات البرمجة مثل C++ (لغة الأردوينو)، يجب الإعلان عن المتغيرات وتحديد نوعها قبل استخدامها.

التصنيف: تعريف | المستوى: سهل

في التعليمات البرمجية الآتية، ما هو الخطأ المنطقي (Logical Error)؟ void loop() { int temperature = digitalRead(A0); Serial.println(temperature); if (temperature >= 270) { digitalWrite(11, 1); delay(2000); digitalWrite(11, 0); } }

  • أ) استخدام digitalRead() لقراءة قيمة تماثلية (من منفذ A0) تمثل درجة حرارة.
  • ب) استخدام قيمة عتبة 270 درجة، بينما يجب أن تكون 25 درجة.
  • ج) عدم تحويل قيمة القراءة التماثلية إلى فولت.
  • د) استخدام الدالة loop() بدلاً من setup() لقراءة المستشعر.

الإجابة الصحيحة: a

الإجابة: استخدام digitalRead() لقراءة قيمة تماثلية (من منفذ A0) تمثل درجة حرارة.

الشرح: 1. الدالة `digitalRead()` تُستخدم لقراءة حالة مدخل رقمي، وتُرجع إما HIGH (1) أو LOW (0). 2. المنفذ A0 هو منفذ تماثلي، يُستخدم عادةً لقراءة مستويات جهد متغيرة (مثل مستشعر الحرارة). 3. قراءة مستشعر الحرارة تتطلب عادةً استخدام `analogRead()` التي تُرجع قيمة بين 0 و1023. 4. استخدام `digitalRead(A0)` سيعيد فقط 0 أو 1، ولن يعطي قيمة مثل 270، مما يجعل المقارنة `temperature >= 270` غير منطقية.

تلميح: ما الفرق بين قراءة الإشارة الرقمية (HIGH/LOW) وقراءة الإشارة التماثلية (قيمة متدرجة)؟

التصنيف: فرق بين مفهومين | المستوى: متوسط