19688113-c-arab-team-c-c

  • June 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View 19688113-c-arab-team-c-c as PDF for free.

More details

  • Words: 13,599
  • Pages: 103
‫كتاب البرمجة بلغة ال ‪ C‬وال ‪C++‬‬ ‫لي استفسار او وجود تعديل الرجاء مراسلتي على البريد اللكتروني السم ‪MLN4EVER :‬‬ ‫البريد اللكتروني ‪[email protected] :‬‬ ‫اهداء ‪ :‬اهدي هذا الكتاب لوالدتى العزيزة ……‪ .‬حفظها ال من كل مكروه وسوء وادام عليها‬ ‫الصحة والعافية ‪ .‬وكذلك احب ان اهديه الى ) منتديات الفريق العربي للبرمجة ( ‪.‬‬ ‫مقدمة ‪ :‬أتمنى ان يفيد هذا الكتاب جميع المهتمين بلغة ال ‪ C‬وال‪ C++‬ويكون سهل‬ ‫) مع الفهم ‪ ..........‬فهو يبدأ في لغة ال ‪ C‬من الصفر ثم ينتقل بعد ذلك الى لغة ال‪C++‬‬ ‫ذكر الفرق بينها ( فأرجو ان يحوز هذا الكتاب على رضاكم ‪ .‬وفقني ال واياكم الى فعل‬ ‫الخير ‪ ...........‬ملحظة ‪ :‬هذا الكتاب مجاني‬

‫لـــغة الـــــسي‬ ‫ي‬ ‫‪:‬‬ ‫الول‪:‬‬ ‫الفصل‬ ‫لغة ‪ … C‬نظرة تاريخية و ملمح عامة‬ ‫ة‬ ‫لغة ‪ C‬لغة متفردة في ملمحها ومنشآتها‪ ،‬وتتميز بأنها سلح قوي للمبرمج‪ ،‬فهي تؤدي العديد‬ ‫مما ل تستطيع اللغات الخرى – عالية المستوى‪ -‬أن تؤديه كما تتيح للمبرمج التحكم بصورة‬ ‫أفضل في الكمبيوتر‪ ،‬ولذلك فإن لغة ال ‪ C‬قد أصبحت لغة العصر‪.‬‬ ‫‪.‬‬ ‫و على الرغم من أن لغة ال ‪ C‬ليست جديدة فإنها لغة سريعة التطور ‪ ،‬حيث أبتكرها " دينيس‬ ‫ريتشي" في أوائل السبعينات وقدمها بالشتراك مع " بريان كارينجان" في كتابهما ) ‪The C‬‬ ‫‪ ) programming language‬والذي يعد المرجع الساسي في اللغة‪ .‬ومنذ ذلك الحين واللغة في‬ ‫تطور مستمر‪.‬‬ ‫‪.‬‬ ‫وتطورت لغة ‪ C‬تطورا سريعا ليظهر منها المتداد الذي يطلق عليه ‪ ++C‬وتتميز لغة ‪++C‬‬ ‫‪+‬‬ ‫)‪ .‬باعتمادها أساسا جديدا من طرق البرمجة وهو ما يطلق عليه ) ‪Object Oriented‬‬ ‫‪Programming‬ومهدت لغة ‪ ++C‬الطريق لظهور لغة ‪ ++Visual C‬وهي الصورة الحدث من اللغة‬ ‫والتي تعمل في بيئة الويندوز‪.‬‬ ‫‪.‬‬ ‫ونتيجة تزايد استخدام لغة ‪ C‬قامت مؤسسة القياسات المريكية في عام ‪ 3891‬بعملية توحيد‬ ‫للهجات المختلفة التي كادت أن تنتشر للغة ‪ C‬فأصدرت اللغة القياسية التي يطلق عليها "‬ ‫‪ " ANSI C‬وهي تحتوي على بعض الضافات إلى اللغة الصلية التي ابتكرها ريتشي‪.‬‬ ‫‪.‬‬ ‫ما هو البرنامج‪ :‬البرنامج اصطلح يرمز لعدد محدد من الوامر التي تعطى للكمبيوتر‪ ،‬بغرض‬ ‫تنفيذ مهمة محددة أو أداء وظيفة مطلوبة‪.‬‬ ‫‪.‬‬ ‫ومن أهم ملمح البرمجة بلغة ‪ C‬أن البرنامج ما هو إل معمار دقيق التصميم يعتمد في بنائه‬ ‫على البلوكات الجاهزة التي تتكامل معا لتصنع البناء الضخم‪.‬و البلوك أو مايسمى بالدالة‬ ‫) ‪) function‬‬

‫ما هو إل مجموعة من الوامر متعلقة بجزء محدد من البرنامج‪ ،‬وتنتج البلوكات من تقسيم‬ ‫البرنامج إلى أجزاء أصغر لكل وظيفته التي يتم تحديدها بالوامر التي تكتب في البلوك‪.‬‬ ‫‪.‬‬ ‫و استخدام البلوكات الجاهزة يوفر الوقت ول سيما عندما نرغب في تطوير البرنامج أو‬ ‫إحداث تغيرات جذرية به‪ .‬وليس هذا هو الحال مع لغة مثل بيسك حيث يبني المبرمج البناء‬ ‫كله من البداية‪ ،‬فإذا أراد المبرمج تعديل البرنامج فإنه يعيد كتابتة أو على القل يعيد‬ ‫كتابة أغلب أجزائة‪.‬‬ ‫‪.‬‬ ‫ونستطيع مع لغة ‪ C‬استخدام البلوكات الجاهزة الموجودة بمكتبات المبرمجين الخرين‪ ،‬أو‬ ‫بناء مكتبة من الدوال للستعانة بها وقت الحاجة‪.‬‬ ‫‪.‬‬ ‫وهناك خطوات مطلوبة لتنفيذ أي برنامج وهي‪ -1 :‬كتابة البرنامج وحفظة على القرص‬ ‫‪ 2‬عملية الترجمة ) ‪ ) compilation‬وينتج عن هذه باستخدام أحد برامج التحرير ) )‪Editors‬‬ ‫‪ 3‬عملية الربط بمكتبة اللغة ) العملية البرنامج الهدف الذي يحمل عادةالمتداد " ‪OBJ" .‬‬ ‫‪ )Linking‬وينتج عن هذه العملية البرنامج التنفيذي الذي يحملالمتداد "‪ ."EXE‬والبرنامج‬ ‫التنفيذي هو البرنامج الذي يتم تنفيذه بمجرد إدخال اسمه ‪.‬‬ ‫"‬ ‫‪"Quick‬‬ ‫وهناك العديد من برامج الترجمة الشهيرة على الكمبيوتر مثل " ‪ "Terbo C‬أو "‪C‬‬ ‫وتلك البرامج تحتوي على بيئة مجمعة تشمل محررا لكتابة البرنامج‪ ،‬و قوائم ذات نوافذ‬ ‫بها أوامر الحفظ والترجمة و الربط و التنفيذ‪.‬‬ ‫‪.‬‬ ‫‪-------------------------------------------------------------------‬‬

‫الفصل الثاني ‪ :‬مبادئ لغة ال ‪C :‬‬ ‫‪ 1‬البرنامج الول بلغة ال ‪C‬‬‫من أفضل الطرق للبدء بتعلم لغة جديدة النظر لحد البرامج البسيطة المكتوبة بهذه اللغة‬ ‫ودراسة أجزاءه كل على حدة‪ ،‬ولنتخذ برنامجا متكامل جاهزا للتنفيذ‪.‬‬ ‫‪.‬‬ ‫يوضح البرنامج التالي برنامجا صغيرا يطبع على الشاشة عند تشغيله العبارة "‪" Hello C‬‬ ‫} ‪CODE >#include <stdio.h ()main { ;(”printf ) “Hello C‬‬ ‫إن البرنامج يعتمد أساسا على الدالة ‪ printf‬فهي المسئولة عن طباعة العبارة المطلوب‬ ‫طباعتها على الشاشة‪ .‬وعندما تتقدم في اللغة ستجد أن لغة ‪ C‬مبنية من دوال مختلفة لكل‬ ‫وظيفتها المحددة‪ ،‬كما ذكرنا سابقا‪ .‬ولتؤدي الدالة ‪ printf‬المطلوب منها ل تستخدم‬ ‫بمفردها بل لبد أن تأتي بداخل الطار الموضح بالشكل السابق حتى تتمكن من القيام‬ ‫‪.‬‬ ‫بعملها‪.‬‬ ‫والطار الذى يحوي البرنامج يبدأ بكلمة ‪ main‬يعقبها القوس اليسر " { " والذي تتالى‬ ‫بعده عبارات البرنامج‪ ،‬ثم ينتهي بالقوس اليمن " } "‪.‬‬ ‫‪.‬‬ ‫ويطلق على الجزء المحتوى بين القوسين " { } " اسم البلوك )‪. )block‬و البلوك الذي يبدأ‬ ‫بكلمة )‪ )main‬يسمى بلوك البرنامج‪.‬‬ ‫‪.‬‬

‫وفي المثال السابق يتكون البرنامج من بلوك واحد هو بلوك البرنامج‪.‬‬ ‫‪.‬‬ ‫والسطر الول من البرنامج والمحصور بين العلمتين " ‪ "/* */‬يسمى التعليق ويستخدم‬ ‫التعليق لكتابة الملحظات على البرنامج‪ ،‬ومن المفيد دوما كتابة التعليقات لتسهيل‬ ‫مراجعة البرنامج ‪.‬‬ ‫وعند ترجمة هذا البرنامج فإن مترجم لغة ‪ C‬يتجاهل تماما كل ما يأتي بين هاتين‬ ‫العلمتين‪ .‬ويجوز أن تضيف إلى البرنامج ما تشاء من الملحظات وفي أي مكان من البرنامج‬ ‫وبأي عدد من السطور مادمت تبدأ وتنتهي بالعلمتين المميزتين" ‪." /* " ، " */‬‬ ‫‪.‬‬ ‫أما السطر الثاني والذي يبدأ بالعلمة الخاصة " ‪ " #‬فيسمى بالتوجيه ) ‪ ) Directive‬وهو‬ ‫ل يمثل جزءا من منطق البرنامج ولكنه يستخدم لتوجيه المترجم أثناء الترجمة ‪ ،‬حيث يدله‬ ‫على مكان الملف " ‪ " stdio.h‬والذي يطلق عليه اسم ملف العناوين للدخل و الخرج أو )‬ ‫‪Standard Input ) Output header file‬‬ ‫ويجب اللتزام بسطور التوجيه لن هناك دوال لبد لها من إستدعاء ملفات خاصه بها‪ ،‬وعندما‬ ‫نستخدم دالة دون استخدام سطر التوجية الخاص بها نحصل على خطأ من المترجم عند بداية‬ ‫‪.‬‬ ‫الترجمة‪.‬‬ ‫و هناك قواعد بسيطة لكتابة البرنامج بلغة ‪ C‬ولبد من مراعتها عند كتابة البرامج ومن‬ ‫هذه القواعد ما يمكن التسامح فيه فمثل المسافات الخالية والسطور التي تفصل ما بين‬ ‫الكلمات والعبارات كلها اختيارية ويمكن الستغناء عنها‪.‬‬ ‫‪.‬‬ ‫ولكن هناك من القواعد ما يجب اللتزام به ‪:‬‬ ‫‪ -1‬تكتب التوجيهات على سطر مستقل‪ -2 .‬تستخدم الدوال ) مثل ‪ ) printf‬في تكوين عبارات‬ ‫البرنامج ) ‪ )staements‬وتنتهي كل عبارة بفاصلة منقوطة‪ .‬والفاصلة المنقوطة لغنى عنها‬ ‫حتى لو كان البرنامج محتويا على عبارة واحدة‪ ،‬وأغلب الخطاء التي نحصل عليها تكون‬ ‫نتيجة نسيان فاصلة منقوطة‪ -3 .‬تتطلب بعض الكلمات الخاصة باللغة أن نعقبها بمسافة‬ ‫خالية على القل وإل تعرضنا لرسالة خطأ‬ ‫أ‬

‫من المترجم عند ترجمة البرنامج‪ -4 .‬تكتب الكلمات المفتاحية للغة ) ‪ ) key words‬مثل‬ ‫)‬ ‫‪)Small‬‬ ‫أسماء الدوال )مثل ‪ ) printf‬بالحروف الصغيرة ‪letters ) .‬‬ ‫‪ 2‬الطباعة على الشاشةتستخدم الدالة ‪ printf‬لطابعة النصوص على الشاشة وهي كأي دالة‬ ‫أخرى تأتي متبوعة بقوسين نكتب بينهما النص المطلوب طباعته بين علمتي اقتباس‪.‬‬ ‫‪.‬‬ ‫وكل ما نكتبة بين علمتي القتباس يظهر كما هو على الشاشة ولذلك يصطلح على تسميته‬ ‫‪ . )string‬بالحرفي )‬ ‫والبرنامج الموضح في الشكل التالي يحتوي على عبارتين تستخدم في كل منهما الدالة ‪print‬‬ ‫ة ‪f‬‬ ‫لطباعة حرفي معين على الشاشة‬ ‫} ‪CODE >#include <stdio.h ()main { ;(” printf)“Welcome ;(”printf)“ C Programmer‬‬ ‫وناتج البرنامج موضح بالشكل التالي‬ ‫ي‬ ‫‪WelcomeC Programmer‬‬

‫ونلحظ أن العبارتين طبعتا على الشاشة دون أي فاصل بينهما‪.‬‬ ‫‪.‬‬ ‫و لكننا حتما نريد الفصل بين العبارات المختلفة فمثل ماذا لو أردنا النتقال لسطر جديد‬ ‫لتطبع العبارة الثانية على سطر مستقل؟‬ ‫؟‬ ‫إن النتقال لسطر جديد يستلزم إضافة علمة خاصة إلى نهاية الحرفي الول‪ ،‬وتسمى هذه‬ ‫العلمة بعلمة السطر الجديد ) ‪ ) new line character‬وتكتب كالتي ) \‪)n‬‬ ‫)‬ ‫ولنجرب إستخدام هذه العلمة وذلك كما هو موضح في الشكل التالى‬ ‫ى‬ ‫} ‪CODE >#include <stdio.h ()main { ;(”printf)“Welcome \n ;(”printf)“ C Programmer‬‬ ‫‪ Welcome C Programmer‬وعند تنفيذ هذا البرنامج نحصل على النتيجة التالية‬ ‫ومما يجب ملحظته أن علمة السطر الجديد تكتب بداخل علمتي القتباس ول تظهر على الشاشة‬ ‫كما هي !!!‬ ‫!‬

‫وذلك لن المترجم يفهم العلمات الخاصة على نحو ما وتعتبر أمرا من الوامر يقوم بتنفيذها‬ ‫بالصورة المطلوبة‪.‬‬ ‫ويمكن استخدام دالة الطباعة لتطبع على الشاشة محتويات بطاقة تحمل السم والعنوان كما‬ ‫هو موضح بالشكل التالي‬ ‫‪.Future Horizons Co 81 emarat othman NasrCity Cairo‬‬ ‫و البرنامج المستخدم لطباعة هذة البطاقة موضح بالمثال التالي‬ ‫‪CODE >#include <stdio.h ()main { ;(”printf)“Future Horizons Co.\n ;(“printf)“81‬‬ ‫} ‪emarat othman \n ;(”printf)“NasrCity\n ;(”printf)“Cairo\n‬‬ ‫‪ 3-‬التعامل مع العداد‬

‫يمكن باستخدام عبارة الطباعة و الدالة ‪ printf‬أن نعرض الرقام على الشاشة بل يمكننا‬ ‫أيضا أن نجري العمليات الحسابية المختلفة فتتولى الدالة ‪ printf‬تقييم التعبيرات‬ ‫الحسابية وطباعة النتيجة على الشاشة‪.‬ومن الملحظ أن العداد ل تحتاج لعلمات اقتباس‪.‬‬ ‫‪.‬‬ ‫وفي لغة ‪ C‬يجب أن نفرق بين نوعين من العداد‪:‬‬ ‫‪:‬‬ ‫) ‪-1‬العداد الصحيحة )) ‪Integers‬‬ ‫‪ 2‬العداد الحقيقية )‪)Real numbers‬‬‫أما العداد الصحيحة فهي تلك العداد التي ل تحوي كسورا‪ .‬بينما تحتوي العداد الحقيقية‬ ‫على علمة عشرية ) بصرف النظر عن وجود كسر من عدمه(‪.‬‬ ‫‪.‬‬ ‫فورمات العداد‪:‬‬ ‫‪:‬‬ ‫يلزم إخبار الكمبيوتر دائما عن نوع العدد باستخدام صيغة خاصة )فورمات( تأتي بداخل‬ ‫علمتي القتباس‪ ،‬لن الكمبيوتر يتعامل مع كل نوعية من العداد بطريقة مختلفة تماما‪.‬‬ ‫‪.‬‬ ‫ولتوضيح استخدام الفورمات انظر الشكل‬ ‫ل‬ ‫{ وفي ;)‪CODE #include <stdio.h < main() printf)“%d \n”,031); } printf)“%f\n ”,5.031‬‬ ‫هذا البرنامج استخدمنا نوعين من العداد و لكل منهما له فورمات الخاصة به فنجد أن رمز‬ ‫والحرف ) ‪ ) d‬بهذا الرمز هو اختصار كلمة الفورمات المستخدم مع العدد الصحيح هو ) ‪)d%‬‬ ‫) ‪ ) decimal‬بمعنى رقم عشري أي مكتوب بالنظام‬ ‫م‬

‫العشري‪.‬‬ ‫أما رمز الفورمات المستخدم لطباعة العدد الحقيقي فهو ) ‪ )f%‬والحرف ) ‪ ) f‬بهذا الرمز‬ ‫هو اختصار كلمة ) ‪ ) floating point number‬وهي العداد ذات العلمة العشرية‪.‬‬ ‫وعند تنفيذ البرنامج السابق نحصل على النتيجة الموضحة بالشكل ‪5.031 031‬‬ ‫ويجب على المبرمج تحري الدقة التامة عند التعامل مع الفورمات ‪ ،‬فل نستخدم فورمات‬ ‫العداد الحقيقية مع العداد الصحيحة أو العكس‪ .‬لن الخطأ في الستخدام ينتج عنه نتائج‬ ‫غير صحيحة‪.‬‬ ‫التعبيرات الحسابية‪ :‬كما ذكرنا سابقا فأن دالة الطباعة يمكنها أيضا أن تجري العمليات‬ ‫الحسابية المختلفة وتطبع النتيجة على الشاشة‪ .‬وتستخدم المؤثرات الحسابية الموضحة‬ ‫ادناه لبناء التعبيرات الحسابية‪:‬‬ ‫مؤثر الجمع ‪ +‬مؤثر الطرح ‪ -‬مؤثر الضرب * مؤثر القسمة ‪/‬‬ ‫والمثال التالي يوضح استخدام المؤثرات الحسابية مع الدالة )‪) printf‬‬ ‫‪CODE‬‬

‫} ‪>#include <stdio.h ()main { ;(2*821,”printf)“%d\n ;(2/0.821,”printf)“%f\n‬‬ ‫‪0‬‬ ‫‪000000.46‬‬ ‫وعند تنفيذ البرنامج نحصل على الناتج الموضح بالشكل التالي ‪652‬‬ ‫‪ 4‬استخدام المتغيراتيقوم الكمبيوتر بتخزين البيانات التي يحتاجها في الذاكرة‬ ‫والمتغيرات ما هي إل عناوين خانات في الذاكرة التي نحفظ فيها البيانات‪ .‬ولتسهيل‬ ‫الوصول للبيانات المختزنة يتم في لغات البرمجة عالية المستوى استبدال العناوين‬ ‫الرقمية بأسماء المتغيرات‪.‬‬ ‫‪.‬‬ ‫ويكفينا هنا ‪ -‬لو كنا مبتدئين في البرمجة‪ -‬أن نتذكر دائما أن المتغير ما هو إل اسم‬ ‫لحد الماكن التي تختزن فيها البيانات في الذاكرة‪ .‬وأسماء المتغيرات يصطلح عليها في‬ ‫وهناك قواعد محددة لختيار أسماء البيانات لغة ال ‪ C‬باسماء البيانات ) ‪)Identifiers‬‬ ‫‪:‬‬ ‫وهي‪:‬‬ ‫‪ -1‬أل يكون اسم البيان أحد الكلمات المحجوزة باللغة ) ‪ ) Reserved words‬أو الكلمات‬ ‫التي تحمل معنى خاصا مثل) ‪ ) main‬ويمكن التعرف على الكلمات المحجوزة باللغة من دفتر‬ ‫التشغيل المصاحب للمترجم‪ -2 .‬يمكن أن يحتوي السم على أى حرف من الحروف البجدية ) ‪)A-‬‬ ‫‪ Z‬سواء صغيرة كانت أم كبيرة‪ ،‬وأي رقم من الرقام )‪ ( 9-0‬كما يمكن أن تحتوي على علمة‬ ‫الشرطة السفلى ) _ ( ولكن ل‬

‫يجوز أن يبدأ السم برقم‪ -3 .‬ل قيود على طول السم ‪ ،‬وتتيح هذه الميزة استخدام أسماء‬ ‫معبرة عن مضمونها‪ ،‬ومن الفضل دائما استخدام السم المعبر عن محتوى المتغير لتسهيل‬ ‫عملية فحص البرنامج في حالة الخطأ من جهة‪ ،‬ولتسهيل عملية الضافة والتعديل للبرنامج‪.‬‬ ‫يختلف ‪ -4‬الحروف الكبيرة و الصغيرة ليست متكافئة في لغة ‪ C‬فمثل اسم البيان)‪)MY_NUMBER‬‬ ‫‪.‬‬ ‫‪.)My_Number‬‬ ‫عن السم ) ‪ )my_number‬وكلهما يختلف عن السم )‬ ‫العلن عن المتغيرات‪ :‬ليتمكن المستخدم من استخدام المتغيرات التي يريدها يتطلب‬ ‫البرنامج المكتوب بلغة ‪ C‬العلن المسبق عن أسمائها ونوعياتها في مستهل البرنامج ‪.‬‬ ‫وتصنف المتغيرات بحسب البيانات التي يمكن أن تختزن فيها فهناك المتغيرات الصحيحة ) أي‬ ‫التي تصلح لختزان العداد الصحيحة( و هناك المتغيرات الحقيقية ) أي التي تختزن العداد‬ ‫الحقيقية(‪ ،‬ومع تقدمنا في اللغة سنتعرف على نوعيات أخرى من المتغيرات‪.‬‬ ‫والشكل التالي يوضح برنامجا قمنا فيه بالعلن عن المتغيرات‬ ‫*‪CODE >#include <stdio.h ()main { /*/* variable declaration ;int a ;float b /‬‬ ‫} ‪/*Display output ;(printf)“%d\n”,a ;(printf)“%f\n”,b‬‬

‫) وكما نرى في البرنامج أنه قد تم العلن عن متغيرين الول )‪ )a‬وهو من النوع الصحيح )‬ ‫‪integer‬وقد استخدمنا الكلمة ‪ int‬للعلن عنه‪ .‬وأما المتغير الثاني )فهو يختزن العداد‬ ‫الحقيقية )‪ )Real‬وقد استخدمنا معه الكلمة ‪ float‬للعلن عنه‪.‬‬ ‫‪.‬‬ ‫وكما ذكرنا سابقا‪ ،‬نلحظ أن عبارة العلن تنتهي بفاصلة منقوطة كسائر عبارات البرنامج‪،‬‬ ‫كما أنه يلزم ترك مسافة خالية على القل بعد كل من الكلمات المحجوزة ) ‪ int‬أو ‪)float‬‬ ‫)‬ ‫وبعد ذلك تقوم بقية البرنامج بطباعة محتوى المتغيرات ‪ a,b‬ولننا لم نخزن في هذين‬ ‫المتغيرين أية بيانات فإن ما نحصل علية ليس إل بعض المخلفات الموجودة في الذاكرة‪ ،‬وهي‬ ‫بل معنى على الطلق والشكل التالي يوضح مثال لهذة المخلفات كنتيجة لتشغيل البرنامج‬ ‫‪ 059.674 84322‬تخزين البيانات في المتغيرات ) ‪:) Assignment‬‬ ‫‪:‬‬ ‫في البرنامج السابق لحظنا أنه لبد من أن تختزن عددا ما في المتغير العددي الذي أعلنا‬ ‫عنه ويتم ذلك باستخدام عبارة التخصيص ) ‪ )assignment statement‬ويوضح الشكل التالي‬ ‫برنامجا قمنا فية بالعلن عن متغيرين و إختزان بيانين عدديين في كل منهما ‪ ،‬ثم نطبع‬ ‫محتويات هذين المتغيرين على الشاشة‪.‬‬ ‫‪CODE‬‬

‫*‪>#include <stdio.h ()main { /*/* variable declaration ;int a ;float b /* /‬‬ ‫; ‪Assignment ;0001=a ;5.697=b /* /*Display output ;(printf)“%d\n”,a‬‬ ‫} ‪(printf)“%f\n”,b‬‬ ‫وعند تنفيذ هذا البرنامج نحصل على النتيجة الموضحة بالشكل ‪ 5.697 0001‬عبارة التخصيص )‬ ‫‪: ) Assignment statment‬‬ ‫ومن يمكن قرائتها على النحو التالي‪ :‬خصص العدد ‪ 0001‬للمتغير "‪ "a‬إن العبارة ‪;a=0001‬‬ ‫الجائز أن نخصص متغيرا لمتغير آخر ‪ ،‬ومعنى ذلك أننا نضع نسخة من المغير الول في‬ ‫المتغير الثاني‪.‬‬ ‫‪.‬‬ ‫أما لو قمنا بتخصيص تعبير حسابي يحتوي على متغيرات وقيم عددية لمتغير ما فأن البرنامج‬ ‫ه‬ ‫هذه‬ ‫في‬

‫الحالة يجري عملية تقييم للتعبير الحسابي ويضع قيمته النهائية في المتغير المقصود‪.‬‬ ‫‪ 2‬ويوضح المثال التالي ثلث عمليات تخصيص كالتي‪ -1 :‬تخصيص قيمة عددية للمتغير " "‪a‬‬ ‫قسمة محتويات المتغير " ‪ "a‬على ‪ 2‬وتخصيص الناتج للمتغير " "‪ b-3‬جمع محتويات كل من "‬ ‫‪.‬‬ ‫‪."c‬‬ ‫‪"a" ، " b‬وتخصيصها للمتغير "‬ ‫‪CODE >#include<stdio.h ()main { ;int a ;float b,c‬‬ ‫‪;4201=a ;0.2/b=a ;c= b+a‬‬ ‫‪;(printf)“The result is %f\n”,c‬‬ ‫}‬ ‫ومن الملحظ في هذا البرنامج أنه قد تم إعلن المتغيرين " ‪ "b" ، " c‬في عبارة واحدة‬ ‫وقمنا بإستخدام علمة الفاصلة للفصل بينهما‪.‬‬ ‫ونتيجة البرنامج النهائية هي طباعة محتويات المتغير " "‬ ‫‪"c‬‬

‫التخصيص المتعدد‪ :‬يمكننا في لغة ‪ C‬أن نخصص قيمة ما لكثر من متغير في نفس العبارة‬ ‫كالتي‪; = b = c = 42 :‬‬ ‫‪;a‬‬ ‫تخصيص قيم ابتدائية المتغيرات‪:‬‬ ‫ونقوم يمكن أيضا شحن المتغير بقيمة إبتدائية أثناء العلن عنه كالتي‪; float a = 6.5 :‬‬ ‫بشحن المتغيرات بقيمة ابتدائية عند العلن عنها لضمان تنظيف وعاء المتغير من مخلفات‬ ‫‪.‬‬ ‫الذاكرة‪.‬‬ ‫‪ -5‬التحكم في الفورمات‬ ‫عند تنفيذ البرامج السابقة رأينا أن العداد الحقيقية تظهر على الشاشة متبوعة بعدد من‬ ‫الصفار‪ .‬ومما ل شك فيه أننا في التطبيقات الحقيقية قد نرغب في تعديل هذه الصورة‬ ‫لتحتوي على رقمين عشريين أو رقم واحد‪ ،‬كما أننا قد ل نرغب في مشاهدة الصفار الزائدة‬ ‫على الطلق‪ .‬فالفضل أن نرى العدد ‪ 0000000.52‬مكتوبا بالصورة ‪5‬‬ ‫‪52‬‬ ‫ويتم ذلك باستخدام علمات خاصة لتعديل مواصفات الفورمات يطلق عليها علمات تعديل‬ ‫والشكل التالي يوضح طرقا مختلفة لطباعة الرقم الحقيقي ‪ ) format modifiers‬الفورمات )‬ ‫‪5‬‬ ‫‪52‬‬ ‫الوصف | التأثير على شكل الناتج | النتيجة‬ ‫‪ | 0f.%‬حذف جميع الصفار الزائدة | ‪5‬‬ ‫‪52‬‬

‫‪0‬‬ ‫‪000.52‬‬ ‫‪ | 3f.%‬إظهار ثلث أصفار فقط بجوار العلمة |‬ ‫ومن هذا الجدول نلحظ أن الرقم السابق للحرف ‪ f‬يتحكم في عدد الصفار التي تظهر على يمين‬ ‫العلمة العشرية‪ .‬والمثال التالي يوضح برنامجا لطباعة العدد ‪ 57‬بصور مختلفة‬ ‫ة‬ ‫; ‪CODE >#include <stdio.h ()main { ;float x ;57=x ;(printf)“%.0f\n”,x‬‬ ‫} ‪(printf)“%.1f\n”,x ;(printf)“%.2f\n”,x‬‬ ‫‪0‬‬ ‫‪00.57‬‬ ‫وعند تنفيذه نحصل على الناتج الموضح بالشكل ‪0.57 57‬‬ ‫والن ماذا لو كان العدد المطلوب طباعته محتويا على كسر عشري مثل ‪ 6578.52‬واستخدمنا‬ ‫تعديل في الفورمات لطباعته ؟ إن ما يحدث في هذه الحالة هو تقريب العدد إلى عدد من‬

‫الخانات العشرية بحسب الرقم المستخدم في الفورمات‬ ‫ت‬ ‫ويمكنك تجربة البرنامج التالي لطباعة قيمة الكسر ¾ في صور مختلفة وبدرجات مختلفة من‬ ‫‪.‬‬ ‫التقريب‪.‬‬ ‫; ‪CODE >#include <stdio.h ()main { ;(0.4/0.3,”printf)“%.0f\n‬‬ ‫} ‪(0.4/0.3,”printf)“%.1f\n ;(0.4/0.3,”printf)“%.2f\n‬‬ ‫‪5‬‬ ‫‪57.0‬‬ ‫وناتج هذا المثال هو الموضح بالشكل ‪8.0 1‬‬ ‫‪ 6‬متغير الرمز ) ‪ : ) char variable‬ذكرنا فيما سبق أننا سنلتقي مع أنواع أخرى من‬ ‫المتغيرات‪ ،‬والن بعد أن تعرفنا على المتغيرات العددية نتعرف على نوع آخر من المتغيرات‬ ‫ويطلق على هذا النوع من المتغيرات السم ) وهو ما يصلح لتخزين رمز واحد ) ‪)character‬‬ ‫‪.) char‬‬ ‫‪.‬‬ ‫و الرموز التي يمكن تخزينها في هذا النوع من المتغيرات فهي قد تكون رموزا موجودة في‬ ‫جدول الكود آسكي ) ‪ )ASCII code table‬وهو جدول يحتوي الرموز المعتمدة من هيئة‬ ‫ت‬ ‫المواصفات‬

‫القياسية المريكية‪ ،‬ويضم جميع الحروف والرقام والعلمات الخاصة وعلمات التحكم والرقام‬ ‫الكودية المناظرة لكل منها‪.‬‬ ‫‪.‬‬ ‫ولتخصيص رمز ما ‪ ;char a‬و للعلن عن متغير رمز بالسم "‪ "a‬مثل نستخدم العبارة التالية‪:‬‬ ‫و بهذا التخصيص أصبح ‪ 'a = 'Z‬لهذا المتغير فإننا نضعه بين علمتي اقتباس مفردتين كالتي‬ ‫متغير الرمز "‪ " a‬محتويا على الحرف " ‪ ،"Z‬ولطباعة محتويات المتغير الرمز نحتاج إلى‬ ‫توصيف جديد للفورمات وهو التوصيف" ‪" %‬‬ ‫‪"c‬‬ ‫‪,‬هذا التوصيف يحتوي على الحرف الول من كلمة ‪ character‬وهو مخصص لطباعة الرموز‪.‬‬ ‫‪.‬‬ ‫ثم والمثال التالي يوضح برنامجا قمنا فيه بالعلن عن متغير رمز بالسم " ‪"first_letter‬‬ ‫وعند خصصنا لهذا المتغير الحرف " ‪ "A‬ثم طبعنا محتويات المتغير باستخدام التوصيف ‪.c%‬‬ ‫تنفيذ هذا البرنامج فإنه يطبع على الشاشة الحرف ‪.‬‬ ‫‪.A‬‬ ‫; ‪CODE >#include <stdio.h ()main { ;char first_letter ;’first_letter = ‘A‬‬ ‫} ‪(printf)“%c\n”,first_letter‬‬ ‫ومن أهم خصائص متغير الرمز أننا نستطيع أن نطبعه بطريقتين مختلفتين‪ -1 :‬باستخدام‬ ‫‪ .d‬الفورمات ‪c.%‬‬ ‫‪ 2-‬باستخدام الفورمات ‪. %‬‬

‫في الحالة الولى كما رأينا في المثال السابق فأن الرمز المختزن هو الذي يظهر على‬ ‫‪.‬‬ ‫الشاشة‪.‬‬ ‫أما لو استخدمنا الفورمات ‪ d%‬فإن رقم الكود آسكي المناظر للرمز هو الذي يظهر على‬ ‫‪.‬‬ ‫الشاشة‪.‬‬ ‫والمثال التالي يوضح استخدام نوعي موصفات الفورمات مع متغير الرمز‬ ‫ز‬ ‫; ‪CODE #>include <stdio.h ()main { ;char first_letter ;’first_letter = ‘A‬‬ ‫‪(printf)“%c\n”,first_letter ;)printf)“%d\n”,first_letter‬‬ ‫{‬ ‫‪ 6‬تخزين الحرفيات والمؤشرات )‪ ) String & Pointer‬في لغة ‪: C‬‬‫إلى الن تعلمنا كيفية التعامل مع المتغير الرمز ‪ ،‬والمتغيرات العددية‪ .‬و سنتعلم الن‬ ‫نوعا جديدا من المتغيرات وهو المتغير الحرفي ) ‪ ) string‬ول ريب أن كل المبرمجين الذين‬ ‫سبق لهم التعامل مع لغات أخرى مثل البيسك قد تعودوا على إستخدام هذا النوع من‬ ‫…‬ ‫المتغيرات…‬ ‫ولكن لغة ‪ C‬لتحتوي متغيرا من هذا النوع بل تختزن الحرفيات بطرية خاصة كرموز متتابعة‪.‬‬ ‫‪.‬‬

‫وأحدى الطرق المستخدمة لتخزين الحرفيات هي استخدام نوع خاص من المتغيرات يسمى المؤشر‬ ‫‪ ،)pointer‬الذي يشير إلى أول رمز في الحرفي المختزن في الذاكرة كما يتم تمييز نهاية )‬ ‫الحرفي برمز خاص ‪ ،‬وبذلك يمكن الستدلل على أولة و آخرة‪.‬‬ ‫‪.‬‬ ‫المؤشر متغير كسائر المتغيرات ولكنه يختلف عنها فيما يختزنه من المؤشرات ) ‪:)pointers‬‬ ‫بيانات‪ ،‬فالمؤشر ل يختزن البيانات العادية مثل الرقام أو الرموز‪ .‬ولكنة يختزن فقط‬ ‫عناوين الذاكرة‪ ،‬ومن هنا جاء اسمة كمؤشر لنة يشير مباشرة إلى أحد خانات الذاكرة‪.‬‬ ‫‪.‬‬ ‫وتختلف طريقة العلن عن المؤشر بحسب البيان المخزون فيه‪ ،‬فإذا كان المؤشر يشير إلى عدد‬ ‫صحيح مثل فيسمى في هذة الحالة ) مؤشر إلى عدد صحيح ( ويعلن عنه بعبارة كالعبارة‬ ‫; التاليه‪:‬‬ ‫‪;int *a‬‬ ‫أما لو كان يشير إلى رمز من الرموز فيسمى في هذه الحالة مؤشر إلى رمز أو ) ‪character‬‬ ‫‪ )pointer‬ويعلن عنه بعبارة كالعبارة التاليه‪:‬‬ ‫‪:‬‬ ‫ونلحظ أنه في كلتا الحالتين فأن " ‪ "a‬هو اسم المؤشر الذي اخترناه وهو يأتي ‪char * a‬‬ ‫مسبوقا بالعلمة " * " التي تدل على كونه مؤشرا‪ .‬أما نوع المؤشر فهو يتم تحديدة وفقا‬ ‫لنوع البيان المشار إلية فقد يكون عددا صحيحا ) ‪ ) int‬أو حقيقيا ) ‪ ) real‬أو رمزا )‬ ‫‪ ) char‬وهي النواع الثلثة التي عرفناها في لغة ‪C‬‬ ‫والمثال التالي يوضح كيفية تخصيص متغير حرفي وطباعته على الشاشة‪ ،‬ونلحظ أنه لطباعة‬ ‫الحرفي نقوم بطباعة المؤشر الذي يشير إليه مع استخدام توصيف جديد للفورمات وهو ) ‪) s%‬‬ ‫‪CODE‬‬

‫‪>#include <stdio.h ()main { ;char *a ;”a = “Welcome C programmer ;(printf)“%s\n”,a‬‬ ‫}‬ ‫‪ Welcome C programmer‬وناتج البرنامج هو الموضح بالشكل التالي ‪:‬‬ ‫فأن هذا يؤدي إلى خلق التي‪ -1 :‬المؤشر " " ‪ ;char *a‬وعند العلن عن مؤشر بالعبارة‬ ‫‪ a‬الذي يشير إلى أول حرف من الحرفي‪ -2 .‬المتغير" *‪ " a‬الذي يحتوي على أول حرف من‬ ‫‪.‬‬ ‫الحرفي‪.‬‬ ‫من المهم لمن كان جديدا على لغة ‪ C‬أن يحاول التدقيق في مفهوم المؤشرات فهي أداة قوية‬ ‫تساعد المبرمج على إنجاز مهام كثيرة في أقل وقت ممكن‪ ،‬ولكنها في نفس الوقت تمثل مصدرا‬ ‫للخطاء ما لم تستخدم بصورة مناسبة‪.‬‬ ‫والمثال التالي يساعدنا على تعميق مفهوم المؤشر‪ ،‬فهو يبدأ بإعلن عن متغير رمز " "‬ ‫‪a‬ثم يختزن فيه الحرفي " ‪ ،" Hello again‬ويطبع محتويات العديد من المتغيرات المتعلقة‬ ‫‪.‬‬ ‫بالحرفي‪.‬‬ ‫‪CODE‬‬

‫; ‪>#include <stdio.h ()main { ;char *a ;”a = “Hello again ;(printf)“%s\n”,a‬‬ ‫} ‪(printf)“%c\n”,*a ;(printf)“%d\n”,a ;(printf)“%p\n”,a ;(printf)“%d\n”,*a‬‬ ‫ويلحظ أنه عند تنفيذ البرنامج قد يختلف عنوان الذاكرة المطبوع‪ .‬ورمز الفورمات " ‪"%‬‬ ‫‪.‬‬ ‫عشري‪.‬‬ ‫‪ p‬هو رمز خاص بالمؤشرات ويؤدي إلى طباعة عنوان الذاكرة بالنظام السداسي‬

‫الفصل الثالث ‪ :‬الدخال و الخراج ) ‪) I/O‬‬ ‫حتى الن قمنا بالطباعة على الشاشة باستخدام الدالة ‪ printf‬لطباعة الخرج وفقا لصيغة‬ ‫محددة )فورمات(‪ .‬و لكن قد يحتاج المبرمج لدخال البيانات في وقت تنفيذ البرنامج‬ ‫ويستلزم ذلك استخدام دوال لدخال البيانات‪ ،‬وهو ما سنتعرض له الن بشيء من التفصيل‪.‬‬ ‫أما الدالة المناظرة للدالة ‪ ،printf‬والمخصصه لدخال البيانات وفقا لصيغة محددة‪ ،‬فهي‬ ‫‪ ، scanf‬ويعتبر الحرف " ‪ "f‬الذي تنتهي به كل من الدالتين هو الحرف الول من الدالة‬ ‫" كلمة "‪format‬‬ ‫والمثال التالي يوضح كيفية استخدام الدالة ‪ scanf‬لدخال البيانات‪.‬‬ ‫‪.‬‬ ‫‪CODE >#include <stdio.h ()main { ;float x,y,z ;(scanf )“%f”,&x ;(scanf )“%f”,&y‬‬ ‫} ‪;z=x+y ;(printf)“the sum of the numbers you entered is : %.2f\n”,z‬‬ ‫يبدأ البرنامج بالعلن عن ثلثة متغيرات من النوع الحقيقي " ‪ " x,y,z‬ثم يتم استقبال‬ ‫‪s‬‬ ‫‪scanf‬‬ ‫قيمة المتغير " ‪ "x‬من لوحة الزرار بموجب العبارة ‪)"%f",&x) :‬‬

‫ثم يتم استقبال المتغير الثاني"‪ "y‬بعبارة مماثلة ثم يتم جمع المتغيرين " ‪ " x,y‬وتخصيص‬ ‫‪ .‬الناتج للمتغير " ‪"z‬‬ ‫وفي النهاية نطبع قيمة المتغير " ‪ " z‬المحتوي على المجموع‪.‬‬ ‫عند تشغيل البرنامج سوف ينتظر إدخال قيمة المتغير "‪ "x‬فإذا أدخلنا العدد المطلوب‬ ‫وأتبعنا ذلك بالضغط على الزر ‪ ، Enter‬فإن البرنامج يتوقف مرة أخرى منتظرا إدخال قيمة‬ ‫‪ .‬المتغير " ‪" y‬‬ ‫متبوعة بالضغط على الزر ‪ Enter‬وعندئذ يوافينا البرنامج بالنتيجة‪.‬‬ ‫والن فلننظر بتفحص لحدى العبارات التي تحتوي على الدالة ‪ scanf‬فنلحظ ما يلي‪:‬‬ ‫‪:‬‬ ‫‪ -1‬ضرورة استخدام توصيف للفورمات بنفس السلوب المتبع مع الدالة ‪ printf‬وفي المثال‬ ‫‪ 2‬لم السابق قد استخدمنا التوصيف " ‪ " f%‬الذي يناظر المتغير الحقيقي "‪ "x‬أو " ‪y".‬‬ ‫&‪، )x‬وهذه‬ ‫تستخدم الدالة المتغير " ‪ "x‬أو "‪ "y‬صراحة بل استخدمت صورة محورة منه وهي )&‬ ‫الصورة الجديدة تسمى مؤشر العنوان ) ‪ ) address operator‬وهي عبارة عن عنوان المتغير ل‬ ‫‪ )operator‬المتغير نفسه‪ .‬أما المؤثر الجديد & فيسمى مؤثر العنوان إلى ) ‪address-of‬‬ ‫)‬ ‫إدخال أكثر من قيمة متغير واحد بنفس العبارة‪ :‬تماما كما مع الدالة ‪ printf‬يمكننا مع‬ ‫الدالة ‪ scanf‬استخدام عبارة واحدة ودالة واحدة لستقبال قيم عدة متغيرات كما في المثال‬ ‫ي‬ ‫التالي‬ ‫‪CODE‬‬

‫; ‪>#include <stdio.h ()main { ;float x,y,z ;(scanf )“%f%f”,&x,&y ;z=x+y‬‬ ‫} ‪(printf)“the sum of the numbers you entered is : %.2f\n”,z‬‬ ‫نلحظ أن الجزء الخاص بالفورمات ) والواقع بين علمتي القتباس ( يحتوي على توصيفين‬ ‫للفورمات " ‪ " f %f%‬بنفس عدد المتغيرات التي تأتي مفصولة عن بعضها البعض باستخدام‬ ‫الفاصلة " ‪ ) " ,‬أنظر العبارة المحتوية على الدالة ‪)scanf‬‬ ‫ومن الملحظات الهامه أن ترتيب الفورمات في الدالة ‪ scanf‬يجب أن يكون بنفس ترتيب‬ ‫المتغيرات التي سيتم إدخالها‪ .‬وهذه الملحظة غير واضحة في المثال السابق نظرا لن كل‬ ‫المتغيرين المراد إدخالهما من نفس النوع‪.‬‬ ‫الفصل بين المدخلت‪ :‬في المثال السابق كانت المتغيرات تدخل كل على حدة متبوعا بالضغط‬ ‫على الزر ‪ ، Enter‬ولكن ماذا لو أردنا إدخال المتغيرين في سطر واحد؟؟؟‬ ‫المثال التالي يوضح الطريقة الجديدة لدخال المتغيرين في سطر واحد ويتم الفصل بينهما‬ ‫بفاصلة ‪ ،‬ويتم ذلك بكتابة الفاصلة في البرنامج نفسه كفاصل بين توصيفات الفورمات‪.‬‬ ‫‪CODE‬‬

‫; ‪>#include <stdio.h ()main { ;int x ;float y,z ;(scanf )“%d,%f”,&x,&y ;z=x+y‬‬ ‫} ‪(printf)“the sum of %d and %f is : %.2f\n”,x,y,z‬‬ ‫رسالة لتنبية مستخدم البرنامج ‪:‬‬ ‫من عيوب الدالة ‪ scanf‬أنها ل يمكن استخدامها لطباعة أي نص على الشاشة كما مع دوال‬ ‫‪ printf‬إذا أردنا الدخل في لغة مثل البيسك ‪ .‬وهذا معناه ضرورة الستعانة بدالة الطباعة‬ ‫‪ Pleas‬أن نطبع على الشاشة رسالة تنبه المستخدم إلى أن البرنامج ينتظر إدخال بيان مثل‪:‬‬ ‫في المثال التالي نرى صورة محسنة لدخال قيمتي متغيرين مع طباعة ‪e Enter the number‬‬ ‫الرسائل اللزمة لتنبية المستخدم‪.‬‬ ‫‪CODE‬‬

‫;) ;)” ‪#include <stdio.h < main() float x,y,z ; } printf)“Enter the first number :‬‬ ‫;) ;‪scanf )“%f”,&x printf)“Enter the second number : ”); scanf )“%f”,&y ); z=x+y‬‬ ‫{ ملحظة هامة‪ :‬ل يوصى ‪printf)“the sum of the numbers you entered is : %.2f\n”,z‬‬ ‫باستخدام الدالة ‪ scanf‬لستقبال الحرفيات من لوحة المفاتيح‪ ،‬حيث يتطلب المر احتياطات‬ ‫كثيرة ‪ .‬ولستقبال الحرفيات من لوحة المفاتيح توجد طرق أفضل سيأتي الحديث عنها‪.‬‬ ‫‪.‬‬ ‫طرق جديدة للتعامل مع الحرفيات‪:‬‬ ‫‪:‬‬ ‫لقد رأينا من قبل كيف يمكننا تخزين الحرفي بالستعانة بالمؤشرات حيث يشير المؤشر إلى‬ ‫الرمز الول من الحرفي المختزن في الذاكرة ‪ .‬هذا من ناحية بداية الحرفي ‪ .‬أما من ناحية‬ ‫نهاية الحرفي فإن البرنامج من تلقاء نفسه يضيف إلى مؤخرة الحرفي الرمز الصفري ) )‬ ‫‪NULL character .‬‬ ‫وهو الرمز رقم صفر في جدول الكود آسكي‪.‬‬ ‫ويفيد هذا الرمز في تمييز مؤخرة الحرفي و بالتالي في تحديد طوله لتسهيل التعامل معه‬ ‫قراءة وكتابة ومعالجة بالطرق المختلفة‪.‬‬ ‫‪.‬‬ ‫وفي الواقع أن هذه الطريقة برغم ما تحتويه من تفصيلت فنية دقيقة لكنها أفضل من الطرق‬ ‫المستخدمة في اللغات الخرى التي تتوفر بها المتغيرات الحرفية ) ‪،) string‬‬ ‫‪variables‬فمع هذه الطريقة في لغة ‪ C‬ل توجد أية قيود على طول الحرفي المستخدم‪.‬‬ ‫‪.‬‬

‫ومن وهنا سنتناول طريقة أخرى لتمثيل الحرفيات وهي مصفوفة الرموز ) ‪) character arrays‬‬ ‫اسم هذه الطريقة يتضح أنه يتم حجز خانات الذاكرة اللزمة للحرفي مقدما‪.‬‬ ‫‪.‬‬ ‫العلن عن مصفوفة الرموز‪:‬‬ ‫‪:‬‬ ‫لننشئ مصفوفة من الرموز فإننا نبدأ بالعلن عنها في بداية البرنامج ‪ .‬ويشمل العلن اسم‬ ‫المصفوفة وسعتها ) ‪ ) size‬أي الحد القصى لعدد الرموز بها ‪.‬‬ ‫فمثل الجملة التالية يتم فيها العلن عن مصفوفة رموز بالسم ) ‪:) employee_name‬‬ ‫‪:‬‬ ‫‪CODE ;]02[char employee_name‬‬ ‫في هذا العلن يتم حجز عشرين خانة في الذاكرة تتسع كل منها لرمز واحد ‪ ،‬كما تخصص‬ ‫الخانة الخيرة للرمز الصفري) ‪. NULL‬‬ ‫)‪.‬‬ ‫ولشحن هذه المصفوفة بأحد الحرفيات‪ ،‬فإن دالة خاصة تستخدم لهذا الغرض وهي الدالة )‬ ‫‪ ) ,) a‬حيث " ‪ " a‬هو اسم مصفوفة الرموز‪ ،‬و "‪ "b‬هو الحرفي المراد تخزينه في ‪strcpy‬‬ ‫‪.‬‬ ‫المصفوفة‪.‬‬ ‫والمثال التالي يوضح العلن عن مصفوفة رموز بالسم " ‪ "a‬تتسع لعشرين رمزا ثم ننسخ إلى‬ ‫عناصرها الحرفي " ‪ " Hello again‬وفي النهاية نطبع محتويات المصفوفة باستخدام دالة‬ ‫‪.‬‬ ‫‪.%s‬‬ ‫الطباعة ‪ printf‬مع استخدام الفورمات المناسبة للحرفيات‬ ‫‪CODE‬‬

‫‪>#include <stdio.h >#include <string.h ()main { ;]02[char a ;(”strcpy)a,”Hello‬‬ ‫} ‪again ;(printf)“ %s\n”,a‬‬ ‫إن هذا التوجيه ومن الملحظ في هذا البرنامج ظهور توجيه جديد هو ‪#include <string.h < :‬‬ ‫يصبح لزما عند استخدام الدالة ‪ strcpy‬حيث أن الملف " ‪ "string.h‬هو الملف الذي يحتوي‬ ‫على تعريف الدالة " ‪ " strcpy‬وبقية دوال الحرفيات‪ ،‬ويطلق على هذا الملف اسم ملف‬ ‫العناوين للحرفيات " ‪"string header file‬‬ ‫"‬ ‫والن سنتناول طريقة عمل البرنامج بشىء من التفصيل‪ ،‬ولنبدأ بدالة الطباعة ‪.‬‬ ‫‪ printf‬فعندما تتعامل مع مصفوفة الرموز " ‪ " a‬فغنها تقرأ و تطبع عناصر المصفوفة واحدا‬ ‫بعد الخر حتى تصادف الرمز الصفري فتتوقف‪.‬‬ ‫‪.‬‬ ‫أما عن طريقة تخزين الرموز في المصفوفة فهناك نقاط جديرة باهتمامنا ‪.‬‬ ‫إننا عندما نعلن عن المصفوفة " [‪ "a]02‬فإن عناصر المصفوفة تأخذ الرقام المسلسلة من "‬ ‫‪ " 0‬إلى " ‪ "91‬كالتالي‪:‬‬ ‫‪:‬‬ ‫‪CODE ]91[a[0], a[1],…………………..,a‬‬

‫ول يشترط عندما نخصص أحد الحرفيات لهذه المصفوفة أن نشغل جميع العناصر ) الخانات( ففي‬ ‫المثال السبق مثل عدد رموز الحرفي كانت ‪ 11‬حرفا و استخدم العنصر الثاني عشر من‬ ‫المصفوفة لتخزين الرمز الصفري‪.‬‬ ‫‪.‬‬ ‫طرق مختلفة لدخال الحرفيات‪:‬‬ ‫‪:‬‬ ‫ذكرنا من قبل أنه ل يوصى باستخدام الدالة ‪ scanf‬لدخال الحرفيات من لوحة المفاتيح‬ ‫‪.‬والن سنستعرض البدائل المختلفة التي تتيحها اللغة لدخال الحرفيات‪.‬‬ ‫‪.‬‬ ‫يعتبر اسم الدالة اختصارا للعبارة " ‪ " get string‬وهي تقوم بقراءة الدالة ‪: gets‬‬ ‫الحرفي المدخل من لوحة المفاتيح ‪ ،‬وتضيف إليه الرمز الصفري ) ‪ ) NULL‬ثم تقوم بتخصيصه‬ ‫حيث " " ‪ ;)gets)a‬للمتغير المطلوب و الذي يستخدم كدليل للدالة‪ .‬وصيغة الدالة كالتي‪:‬‬ ‫‪a‬مصفوفة الرموز‪.‬‬ ‫‪.‬‬ ‫والمثال التالي يوضح استخدام هذه الدالة‪.‬‬ ‫‪.‬‬ ‫; ‪CODE >#include <stdio.h ()main { ;]02[char employee_name ;(gets)employee_name‬‬ ‫} ‪(printf)“ Employee: %s\n”,employee_name‬‬

‫وعندما يبدأ البرنامج سوف ينتظر منك إدخال الحرفي المطلوب وهو اسم الموظف " ‪employee‬‬ ‫‪ " name‬ثم يخصصه لمصفوفة الرموز المكونة من عشرين عنصرا‪ .‬وفي النهاية يطبع البرنامج‬ ‫السم على الشاشة كتأكيد لتمام الستلم و الحفظ‪.‬‬ ‫‪.‬‬ ‫ويمكننا هنا إدخال السم محتويا على مسافات خالية وذلك على العكس من الدالة ‪ scanf‬التي‬ ‫ولكن هناك قيد على الحرفي تعتبر المسافة الخالية مماثلة للضغط على المفتاح ‪.Enter‬‬ ‫المدخل إذ يجب مراعاة أل يزيد طوله عن الحجم المحجوز للمصفوفة مع العلم بأن المترجم‬ ‫يستغل خانة من المصفوفة لتخزين الرمز الصفري‪ .‬ففي هذا المثال ل يمكن إدخال أكثر من ‪91‬‬ ‫رمز فقط‪.‬‬ ‫‪.‬‬ ‫الدالة ‪: fgets‬‬ ‫تستخدم هذه الدالة لقراءة حرفي من ملف أو جهاز للدخل ) ‪ .) input device‬ويتم تعريف‬ ‫الملف ) أو جهاز الدخال ( ضمن صيغة الدالة نفسها كالتالي‪:‬‬ ‫‪:‬‬ ‫‪CODE ;( fgets) a, n, stdin‬‬ ‫حيث " ‪ " a‬مصفوفة رموز و " ‪ " n‬الحد القصى للرموز المدخلة‪ .‬و " ‪ "stdin‬اسم جهاز الدخل‬ ‫القياسي ) لوحة المفاتيح (‬ ‫ويمكن بالطبع استبدال جهاز الدخل القياسي ‪ stdin‬باجهزة أخرى حسب الموقف و لكننا في‬ ‫الوقت الحالي سوف نكتفي بلوحة المفاتيح كجهاز للدخل ‪.‬‬ ‫عند استخدام هذه الدالة في إدخال الحرفيات فإنها تضيف إلى مؤخرة الحرفي كل من ‪-1 :‬‬ ‫علمة السطر الجديد ) \‪n ).‬‬

‫‪ 2‬الرمز الصفري ) ‪.) NULL‬‬‫ولذلك فإنه مع هذه الدالة لبد وأن نخصص عنصرين في المصفوفة لهذين الرمزين ‪ .‬والمثال‬ ‫التالي يوضح استخدام هذه الدالة‬ ‫;) } ;[‪CODE #include <stdio.h < main() char employee_name ]2+02‬‬ ‫{ طرق مختلفة ;) ‪fgets)employee_name,22,stdin printf)“ Employee: %s\n”,employee_name‬‬ ‫لطباعة الحرفيات‪:‬‬ ‫سنتناول الن بعضا من دوال الخرج التي تصلح لطباعة الحرفيات بطريقة مبسطة‪.‬‬ ‫اسم هذه الدالة إختصار للعبارة " ‪ " put string‬وهي الدالة المقابلة الدالة ‪:puts‬‬ ‫لدالة الدخل ‪ gets‬وصيغة هذه الدالة كالتي‪puts ) a); :‬‬ ‫حيث ‪ a‬ثابت حرفي ‪ ،‬أو مصفوفة رموز‪.‬‬ ‫والمثال التالي يوضح استخدام هذه الدالة لطباعة رسالة لتنبيه المستخدم قبل استخدام‬ ‫لستقبال البيان الدالة ‪gets‬‬ ‫‪CODE‬‬

‫‪>#include <stdio.h ()main { ;]1+02[char employee_name ;(” :puts)“Enter‬‬ ‫} ‪employee_name ;(gets)employee_name ;(puts)employee_name‬‬ ‫وعند تنفيذ البرنامج نلحظ أن السم المدخل قد جاء على سطر مستقل بعد رسالة التنبيه ‪.‬‬ ‫وذلك لن الدالة ‪ puts‬عندما تطبع حرفيا على الشاشة تطبع في مؤخرته علمة السطر الجديد "‬ ‫\‪"n‬‬ ‫الدالة ‪:fputs‬‬ ‫هذه الدالة هي المناظرة للدالة ‪ fgets‬فهي تستخدم لرسال الخرج إلى ملف أو جهاز الخرج‬ ‫المذكور اسمه ضمن بارامترات الدالة‪.‬‬ ‫وصيغة الدالة كالتي‪fputs) a, stdout ); :‬‬ ‫حيث ‪ a‬مصفوفة رموز أو ثابت حرفي‪ .‬و " ‪ " stdout‬اسم جهاز الخرج القياسي وهو جهاز‬ ‫الشاشة‪.‬‬ ‫ومن الطبيعي استبدال جهاز الشاشة كما يتطلب التطبيق‪.‬‬ ‫والدالة ‪ fputs‬تختلف عن ‪ puts‬في أنها ل تطبع علمة السطر الجديد في نهاية الحرفي‪.‬‬

‫الفصل الرابع ‪ :‬المؤثرات‬ ‫إن لغة ‪ – C‬كأي لغة أخرى – تتعامل مع التعبيرات‪ ،‬وتتكون التعبيرات من الثوابت و‬ ‫المتغيرات المرتبطة ببعضها البعض بواسطة المؤثرات‪.‬‬ ‫‪ 2‬والمؤثرات تنقسم إلى عدة أنواع هي‪ -1 :‬المؤثرات الحسابية ) ) ‪Arithmetic Operators‬‬ ‫المؤثرات العلقية ) ) ‪ Relational Operators-3‬المؤثرات المنطقية ) ‪) Logical‬‬ ‫‪Operators‬‬ ‫تتيح لغة ‪ C‬استخدام العديد من المؤثرات المؤثرات الحسابية ) ‪: ) Arithmetic Operators‬‬ ‫الحسابية‪ ،‬منها المؤثرات الساسية والتي تقوم بالعمليات الحسابية الساسية وهي الموضحة‬ ‫أدناه‬ ‫)‪(+‬الجمع‬

‫(( الطرح)*(الضرب ‪ ((/‬القسمة وبالضافة لهذه المؤثرات توجد مؤثرات خاصة بلغة‬ ‫‪ C‬وهي الموضحة أدناه‬ ‫‪ ( (%‬باقي القسمة ‪ ( (-‬النقصان)‪ (++‬الزيادة‬ ‫وسنتناول بشيء من التفصيل استخدام هذه المؤثرات الخاصة‪.‬‬ ‫مؤثر باقي القسمة الصورة العامة لستخدام هذا المؤثر هي ‪x % y :‬‬

‫ويكون الناتج هو باقي قسمة " ‪ " x‬على " ‪ ، " y‬والشكل التالي يوضح استخدام المؤثر‬ ‫والناتج‬ ‫‪CODE 3%7‬‬ ‫ويكون الناتج لهذه العملية هو "‪ " 1‬وهو باقي القسمة للعددين ‪3/7‬‬ ‫من مزايا لغة ال ‪ C‬انها تستعمل مؤثرات الزيادة والنقصان ) ‪: )Decrement & Increment‬‬ ‫الداتين الحسابيتين ‪ ++‬و – لزيادة القيم بمقدار ‪1‬أو انقاصها بمقدار ‪ 1‬والمثال التالي‬ ‫يوضح طريقة الستعمال ‪:‬‬ ‫‪CODE ;++X ;++X‬‬ ‫ومعناه اضافة قيمة ‪ 1‬الى ‪ X‬ويمكن كتابته بصورة مكافئة على النحو التالي ‪:‬‬ ‫‪CODE ;1+X=X‬‬ ‫وبالطريقة نفسها يمكن انقاص ‪ 1‬من قيمة ‪ X‬على النحو التالي ‪:‬‬ ‫‪CODE ;--X ;--X‬‬ ‫وهو يكافيء الصورة ‪:‬‬ ‫‪CODE ;1-X=X‬‬

‫وهذه هي الفائدة لكن هناك فرقا في سرعة التنفيذ ‪ ,‬فالتعبير ‪ X++‬اسرع من التعبير ‪X=X+1‬‬ ‫من جراء استخدام مثل هذه الدوات‬ ‫يرجع اسم المؤثرات العلقية الى العمليات المؤثرات العلقية ) ‪: ) Relational Operators‬‬ ‫المختصة بالقيم التي بينها علقات وهو اجراء عمليات مقارنة بين كميات حسابية او‬ ‫وفي لغة السي تعامل رمزية ‪ ,‬وتكون نتيجة منطقية وهي اما نعم )‪ )true‬أو ل )‪)false‬‬ ‫النتيجة )‪ )false‬على انها صفر " ‪ " 0‬وتأخذ النتيجة )‪ )true‬أية قيمة غير الصفر‬ ‫والمشهور أنها " ‪ . " 1‬ويبين الشكل التالي المؤثرات العلقية ‪ :‬نفرض ان ‪int a=b=3 :‬‬ ‫المؤثرات المنطقية ) ‪: ) Logical Operators‬‬

‫الفصل الخامس ‪ :‬اتخاذ القرار‬ ‫تعرضنا حتى الن لبرامج متتالية الوامر‪ ،‬حيث ينفذ الكمبيوتر العبارات الموجودة في‬ ‫البرنامج بالترتيب الذي وردت به ‪.‬‬ ‫ولكن في الحياة العملية نحتاج لتخاذ بعض القرارات تبعا لشروط معينة‪ ،‬ومن هنا ظهرت‬ ‫الحاجة لوجود طرق لجعل البرنامج قادرا على تغيير تسلسل تنفيذ التعليمات تبعا للشروط‬ ‫المطلوبة‪.‬‬ ‫وسنتعرض هنا لطرق اتخاذ القرار في لغة ال ‪ C‬وكيفية تغيير تسلسل التنفيذ تبعا للشروط‬ ‫الموضوعة‪.‬‬ ‫العبارة الشرطية البسيطة ) ‪:)if statement‬‬ ‫تكوين العبارة الشرطية البسيطة كما هو موضح بالشكل‬ ‫‪CODE ( if ) condition ;statement‬‬ ‫حيث ) ‪ ) condition‬هو الشرط و ) ‪ ) statement‬هو القرار المراد اتخاذه عند تحقق الشرط‬ ‫المعطى‪ .‬وعندما ترغب في تنفيذ أكثر من عبارة بتحقق الشرط نستبدل العبارة التي تمثل‬ ‫القرار المراد اتخاذه ببلوك به العبارات المراد تنفيذها‪ .‬ولتوضيح استخدام العبارة‬ ‫الشرطية البسيطة أنظر البرنامج التالي‬ ‫‪CODE‬‬

‫; ‪>#include <stdio.h ()main { ;float sum ;(“ : printf)“\n Enter the Sum‬‬ ‫} ‪(scanf)“%f”,sum (05> if )sum ;(”printf )“\n The student had passed‬‬ ‫وفي هذا البرنامج يطبع الكمبيوتر رسالة ليسأل المستخدم عن مجموع الطالب وبعد ذلك يقوم‬ ‫بمقارنتها بالشرط اللزم للتأكد من النجاح ) وهو تجاوز المجموع ‪( 05‬فإذا تحقق الشرط‬ ‫يطبع الكمبيوتر رسالة للمستخدم يعلمه أن الطالب ناجح‪،‬‬ ‫العبارة الشرطية الكاملة ) ‪)if ……. else statement‬‬ ‫إن اتخاذ القرارات في الحياة العملية ليست بالسهولة التي ذكرت في البرنامج السابق‪ ،‬إذ‬ ‫نحتاج في معظم الحيان لتخاذ اجراء تبعا لشرط معين‪ ،‬واتخاذ إجراء آخر إذا لم يتحقق هذا‬ ‫الشرط‪.‬‬ ‫لو نظرنا للبرنامج السابق لوجدنا سؤال ملحا ‪ :‬ماذا لو كان مجموع الطالب أقل من ‪ 05‬؟؟‬ ‫الجابة على هذا السؤال هي أن الطالب يكون راسبا‪ .‬ولكن البرنامج ل يتضمن أمرا بإعطاء‬ ‫حالة الرسوب‪ ،‬لننا استخدمنا عبارة الشرط البسيطة والتي تستجيب لشرط واحد‪ .‬وسنتعرض الن‬ ‫لعبارة مركبة كما في البرنامج التالي‪:‬‬ ‫‪CODE‬‬

‫; ‪>#include <stdio.h ()main { ;float sum ;(“ : printf)“\n Enter the Sum‬‬ ‫; ‪(scanf)“%f”,sum (05> if )sum ;(”printf )“\n The student had passed else‬‬ ‫} ‪(”printf)“\n The student had failed‬‬ ‫وفي هذا البرنامج استخدمنا العبارة الشرطية الكاملة والتي تأتي على الصورة الموضحة‬ ‫بالشكل التالي‬ ‫‪CODE (if ) condition ;1-statement else ;2-statement‬‬ ‫حيث أن ) ‪ ) condition‬هو الشرط و ) ‪ ) statement -1‬هي عبارة النتيجة الصلية‪ .‬و )‪) -2‬‬ ‫‪statement‬هي عبارة النتيجة البديلة‪.‬‬ ‫ومنطق اتخاذ القرار هنا هو ‪ " :‬لو تحقق الشرط يقوم الكمبيوتر بتنفيذ عبارة النتيجة‬ ‫الصلية أما لو لم يتحقق الشرط فيقوم الكمبيوتر بتنفيذ عبارة النتيجة البديلة"‬

‫وهكذا ‪-‬باستخدام العبارة الشرطية الكاملة ‪ -‬تمكننا من اتخاذ القرار لحالتين‬ ‫متضادتين ‪ ،‬والن ماذا لو كانت النتيجة الصلية و النتيجة البديلة تتضمنان أكثر من أمر‬ ‫للكمبيوتر؟ في هذه الحالة نحتاج إلى احتواء عبارات النتيجة الصلية بين قوسين من أقواس‬ ‫البلوكات‪ ،‬وهو الموضح بالشكل‬ ‫‪CODE (if ) condition { ;1 statement ;2 statement ;statement n } else { ;1‬‬ ‫} ‪statement ;2 statement ;statement m‬‬ ‫نلحظ أن عبارة النتيجة تم استبدالها ببلوك النتيجة‪ ،‬والمثال التالي‬ ‫السابق بعد تعديل عبارات النتائج لتصبح بلوكات‪ ،‬وذلك ليتمكن البرنامج من‬ ‫بالنجاح أو الرسوب متضمنا النسبة المئوية باعتبار المجموع الكلي ‪ 0001‬في‬ ‫أو رسالة تفيد بأنه ل يمكن احتساب النسبة المئوية‬

‫هو البرنامج‬ ‫إعطاء تقرير‬ ‫حالة النجاح‬ ‫لطالب راسب‪.‬‬ ‫‪CODE‬‬

‫; ‪>#include <stdio.h ()main { ;float sum ;(“ : printf)“\n Enter the Sum‬‬ ‫‪(scanf)“%f”,sum (05> if )sum { ;(”printf )“\n The student had passed‬‬ ‫‪(001*(0001/printf)“\n The percentage is : %f”,)sum } else { ;(”printf)“\n The‬‬ ‫} } ‪student had failed ;(”! printf)“\ There is no percentage for failed student‬‬ ‫لو افترضنا انه قد طلب منك ‪ -‬كمبرمج ‪ -‬عمل برنامج يمكنه احتساب التقديرات اعتمادا على‬ ‫مجموع الطالب‪ ،‬في هذه الحالة نستخدم عبارة شرطية أيضا ولكن بها عدد من الشروط وعدد‬ ‫مناظر من النتائج‪ .‬أو ما يطلق علية العبارة الشرطية المتدرجة‪.‬‬ ‫والشكل التالي يوضح التكوين العام للعبارة الشرطية المتدرجة‬ ‫‪CODE‬‬

‫)‪(1– if ) condition ;1– statement (2-else if ) condition ;2-statement (3-else if‬‬ ‫‪condition ;3-statement ..……… else ;statement-n‬‬ ‫يعتبر الختيار المتعدد البدائل بديل الختيار متعدد البدائل ) ‪) statement switch‬‬ ‫للعبارة الشرطية المتدرجة التي تعرضنا لها سابقا‪ ،‬والواقع أن الختيار المتعدد البدائل‬ ‫أعد خصيصا ليكون أسهل استخداما من العبارة الشرطية المتدرجة‪.‬ويتميز عنها بأنه أفضل‬ ‫توضيحا‪.‬‬ ‫والشكل التالي يوضح الصورة العامة للختيار متعدد البدائل‬ ‫‪CODE‬‬

‫‪(switch )variable { ;1case value ;1 statement ;break ;2case value ;2 statement‬‬ ‫} ‪;break ;3 case value ;3 statement ;break …………… :default ;statement‬‬ ‫وكما نرى فإن الختيار المتعدد البدائل يبدأ بكلمة ) ‪ )switch‬يليها متغير الختيار‬ ‫والذي تحدد قيمته الختيار الذي سيتم تنفيذه‪ ،‬ويلي ذلك قوس بلوك كبير يحتوي داخله‬ ‫بلوكات صغيرة كل منها يمثل اختيارا من البدائل المطروحة و كل بلوك من بلوكات البدائل‬ ‫يبدأ بكلمة ) ‪ ) case‬متبوعة بقيمة لمتغير الختيار ‪ -‬والتي تمثل الشرط ‪ -‬وبعد ذلك تأتي‬ ‫عبارة النتيجة‪.‬‬ ‫ويختتم بلوك البديل بكلمة ) ‪ )break‬والغرض من هذه الكلمة هو منع الكمبيوتر من تنفيذ‬ ‫عبارة النتيجة التالية!!! وقد تبدو هذه العبارة غريبة للوهلة الولى ويتبادر للذهن‬ ‫سؤال ملح ‪ :‬ألم يتحقق الشرط الول مثل فماذا يدفع الكمبيوتر لتنفيذ بقية عبارات‬ ‫النتائج؟؟ والجابة عن هذا السؤال هي أن عبارة الختيار متعدد البدائل ل ترسل للكمبيوتر‬ ‫أمرا بالتوقف بعد تحقق أي شرط فيها‪ ،‬لذا لزم الستعانة بكلمة )‪) break‬‬

‫وبعد نهاية بلوكات البدائل تأتي كلمة )‪ ) default‬متبوعة بعبارة أو بعبارات ينفذها‬ ‫الكمبيوتر في حالة عدم تحقق أي من الشروط السابقة‪.‬‬ ‫‪.‬‬ ‫ة‬ ‫التكرارية‬ ‫الفصل السادس ‪ :‬الحلقات‬ ‫كثيرا ما نحتاج في البرامج إلى تكرار أمر موجه للكمبيوتر عددا من المرات‪ ،‬وتوفر لغة‬ ‫‪ C‬عدة وسائل تمكن المبرمج من أداء هذا التكرار‪ .‬وعادة ما تسمى هذه الوسائل " الحلقات‬ ‫سنتناول منها هنا ‪ -1‬الحلقة التكرارية "‪ ،‬ويوجد العديد من الحلقات التكرارية في لغة ‪C‬‬ ‫‪ 2‬الحلقة ‪ while ) while loop3 ).‬الحلقة ‪for ) for loop ). .)do…. while ) do-while‬‬ ‫‪ loop‬وفيما يلي سنتناول كل حلقة بالدراسة من حيث الشكل العام و أسلوب الستخدام وأمثلة‬ ‫‪.‬‬ ‫توضيحية‪.‬‬ ‫تستخدم الحلقة ‪ for‬لتكرار أمر معين ) أو مجموعة من الوامر( الحلقة ‪:)for ) for loop‬‬ ‫عددا من المرات وتحتاج الحلقة إلي ثلث عناصر أساسية ) انظر الشكل التالي(‬ ‫(‬ ‫‪CODE (for ) counter statement; condition; step‬‬ ‫و هذه العناصر هي‪ -1 :‬العداد ) ‪ : ) counter‬وظيفة العداد هي تسجيل عدد مرات التكرار‪.‬‬ ‫‪ -2‬الشرط ) ‪ :)condition‬والشرط الذي يحدد نهاية التكرار إذ يظل التكرار قائما حتى‬ ‫ينتفي الشرط‪ -3 .‬الخطوة) ‪ : )step‬وهي القيمة التي تحدد عدد مرات التكرار‪.‬‬ ‫‪.‬‬

‫والشكل التالي يوضح برنامجا قمنا فيه باستخدام الحلقة ‪: for‬‬ ‫) ‪CODE >#include <stdio.h ()main { ;int counter (++for‬‬ ‫} ‪counter=1;counter<=20;counter ;(printf)“%d”,counter‬‬ ‫ومن البرنامج السابق نجد أن الحلقة ‪ for‬بدأت بكلمة ) ‪ ) for‬متبوعة بقوسين بينهما ثلثة‬ ‫عبارات تفصل بينها علمة الفاصلة المنقوطة‪ .‬العبارة الولى تخزن القيمة البتدائية في‬ ‫العداد‪ .‬والعبارة الثانية هي الشرط وهنا الشرط أن قيمة العداد أقل من أو تساوي ‪.02‬‬ ‫أما العبارة الثالثة فهي تحدد الخطوة‪ ،‬وفي هذا البرنامج يزاد العداد بمقدار ‪ 1‬كل مرة‬ ‫تنفذ فيها الحلقة‪ .‬والبرنامج السابق ينتج عنه طباعة الرقام من ‪ 1‬إلى ‪.02‬‬ ‫ملحظات‪ -1 :‬العبارات الثلثة المكونة لحلقة ‪ for‬يجب أن تفصل عن بعضها بالفاصلة‬ ‫المنقوطة‪ ،‬وهذا الخطأ من الخطاء الشهيرة جدا في عالم البرمجة لذا وجب توخي الحذر‪-2 .‬‬ ‫في حالة تكرار أكثر من أمر يتم استبدال العبارة التي تلي بداية الحلقة ‪( for‬في المثال‬ ‫السابق هي العبارة ) ‪ ) ;)printf ) " %d",counter‬ببلوك يحتوي العبارات المراد‬ ‫تنفيذها‪.‬‬ ‫الحلقة ‪:)while ) while loop‬‬

‫في هذه الحلقة التكرارية نحتاج إلى الشرط فقط وطالما كان هذا الشرط متحققا استمرت‬ ‫الحلقة في التكرار‪ ..‬والصورة العامة للحلقة ‪ while‬موضحة بالشكل التالي‬ ‫} ‪CODE ( while ) conditon { ;1 statement ;2 statement . . ;statement n‬‬ ‫حيث ) ‪ ) condition‬هو الشرط اللزم لداء التكرار‪ ،‬والعبارات بداخل أقواس البلوكات هي‬ ‫العبارات المراد تكرارها‪ .‬والمثال الموضح بالشكل التالي يوضح استخدام الحلقة‬ ‫‪while‬لطباعة العداد من ‪ 1‬إلى ‪02‬‬ ‫; { ‪CODE >#include <stdio.h ()main { ;1=int counter ( 02=< while ) counter‬‬ ‫} } ‪(printf)“%d”,counter ;++counter‬‬

‫‪ 1‬تخصيص القيمة من المثال السابق يمكننا استخلص النتاتج التالية عن الحلقة ‪while:‬‬ ‫البتدائية للعداد تتم خارج الحلقة ‪ while-2.‬زيادة العداد تتم داخل الحلقة ‪while‬‬ ‫تختلف هذه الحلقة عن الحلقتين السابقتين في مكان كتابة الحلقة التكرارية ‪:do-while‬‬ ‫الشرط ‪ ،‬حيث يكتب الشرط هنا بعد العبارات المطلوب تكرارها‪ .‬والشكل التالي يوضح الصورة‬ ‫العامة للحلقة ‪do-while‬‬ ‫‪CODE do { ;1 statement ;2 statement . . ;statement n } while ) conditon‬‬ ‫وأهم ملحظة على الحلقة التكرارية ‪ do-while‬أنها تنفذ العبارات المطلوب تكرارها مرة‬ ‫واحدة على القل حتى ولو كان الشرط غير متحقق !!! وتفسير ذلك أن التحقق من الشرط يتم‬ ‫بعد التنفيذ وليس قبله كما في الحلقتين السابقتين‪.‬‬

‫الــــسي‪++‬‬ ‫الفصل الول مميزات لغة ‪ ++C‬عن لغة ‪: C‬‬ ‫تدعم لغة ‪ ++C‬أسلوب برمجة الكائنات الموجهة وبالضافة لذلك تمتاز لغة ‪ ++C‬بالعديد من‬ ‫المزايا والتي سنتناولها فيما يلي بشيء من التفصيل‪.‬‬ ‫المزيد من الحرية في العلن عن البيانات ‪ :‬في لغة ‪ C‬يشترط العلن عن المتغيرات في مستهل‬ ‫البرنامج‪ ،‬وعند الحاجة لمتغير جديد لبد من الرجوع لول البرنامج و العلن عنه‪ .‬ومع لغة‬ ‫‪ ++C‬ينتفي هذا الشرط إذ يتمكن المبرمج من تعريف المتغيرات وقت الحاجة إليها وفي أي‬ ‫مكان‪ .‬ويمكن للمبرمج القتصاد في استخدام الذاكرة باستخدام هذه الميزة ولتوضيح ذلك‬ ‫فلننظر للمثال التالي‬ ‫”(; ‪CODE >#include <stdio.h ()main { ;int I ;(scanf)“%d”,&I (5>if )I { ;int j‬‬ ‫} ‪printf)“Enter the second number ;(scanf)“%d”,j ;(printf)“ the result is “,j*I‬‬

‫نلحظ هنا أن المتغير " ‪ " j‬تم العلن عنه وقت الحاجة لستخدامه فقط موفرة بذلك ميزة‬ ‫رائعة‪ ،‬لنة يمكن للمبرمج أن يقتصد في استخدام الذاكرة وذلك بتعريف المتغيرات التي‬ ‫يحتاجها عند تحقق شرط معين مثل داخل هذا الشرط‪ .‬وبذلك ل نحجز للمتغير مكانا إل عند‬ ‫الحاجة إليه فقط‪.‬‬ ‫إعطاء قيم البتدائية لمعاملت الدوال‪ :‬تسمح لغة ‪ ++C‬بإعطاء قيم ابتدائية لمعاملت‬ ‫الدوال عند تعريفها‪ ،‬وعندما يتم استدعاء الدالة في البرنامج بدون معاملت يتم استعمال‬ ‫القيم البتدائية‪ ،‬أما إذا أعطى المبرمج قيما للمعاملت فإنها تستخدم بدل من القيم‬ ‫البتدائية‪ .‬ويسمح في هذه الحالة باستدعاء الدالة بأكثر من طريقة‪ ،‬والمثال التالي يلقي‬ ‫مزيدا من الضوء على هذه الميزة‪.‬‬ ‫; { ‪CODE >#include
‫كتابة التعليقات‪ :‬سهلت لغة ‪ ++C‬عملية كتابة التعليقات حيث أصبح بالمكان كتابة‬ ‫التعليقات بعد العلمة " ‪ " //‬ودون التقيد بعلمة في نهاية التعليق كما كان سابقا في‬ ‫لغة ‪ C‬حيث كان التعليق يكتب دوما بين العلمتين " ‪ " */‬و " *‪ ." /‬ويجب مراعاة أن‬ ‫التعليق لو جاء في عدة أسطر لزم وضع العلمة " ‪ " //‬في أول كل سطر ‪ ،‬ومن الممكن في هذه‬ ‫الحالة وضع التعليق بين العلمتين المعتادتين لتلفي الخطأ عند نسيان وضع العلمة " ‪" //‬‬ ‫في أول السطر‪.‬‬ ‫القدرة على إنشاء واستخدام الفصائل‪ :‬وهذه الميزة من أهم المميزات والتي تجعل لغة ‪+‬‬ ‫‪ +C‬تدعم أسلوب برمجة الكائنات الموجهة ويتم إنشاء الفصيلة باستخدام الكلمة المحجوزة )‬ ‫‪ ) class‬وذلك تبعا للصورة العامة الموضحة بالشكل التالي‬ ‫‪CODE {class class_name :private private data and functions : public public data‬‬ ‫} ‪and functions‬‬ ‫حيث يعطى اسم الفصيلة بعد الكلمة المحجوزة ) ‪ ) class‬ويتوالى بعد ذلك تعريف البيانات‬ ‫والدوال‪.‬‬ ‫تحديد درجة حماية البيانات ‪:‬‬ ‫تتيح لغة ‪ ++C‬تحديد درجات لحماية البيانات وذلك على مستوى الفصيلة‪ ،‬وتتحدد درجة‬ ‫الحماية باستخدام الكلمات ) ‪ ) public , private , protected‬ويوضح الجدول التالي‬ ‫درجات الحماية‬

‫المختلفة‬ ‫و بالتقدم في البرمجة سنألف استخدام محددات الحماية‪ ،‬وسنتعرض لها بشيء من التفصيل عند‬ ‫الحديث عن الفصائل والكائنات‪.‬‬ ‫كما ذكرنا سابقا فالفصيلة دوال البناء والهدم ) ‪:) constructors and destructors‬‬ ‫للمبرمج أن ينشئ تتكون من بيانات و دوال تتعامل مع هذه البيانات‪ ،‬وتتيح لغة ‪++C‬‬ ‫دالتين خاصتين تسمى إحداهما دالة البناء ) ‪ ) constructor‬وهي دالة تنفذ تلقائيا عند‬ ‫العلن عن كائن من هذه الفصيلة‪ .‬وتظهر فائدة هذه الدالة عندما نرغب في تخصيص قيم‬ ‫ابتدائية لبيانات الفصيلة‪.‬‬ ‫أما الدالة الخرى فهي دالة الهدم ) ‪ ) destructor‬وتنفذ تلقائيا عند انتهاء استخدام‬ ‫الفصيلة وتستخدم هذه الدالة لتحرير أجزاء من الذاكرة كنا نستخدمها أثناء استعمال‬ ‫الفصيلة ولم نعد بحاجة إليها‪ ،‬أو لتنفيذ سطور معينة عند النتهاء من استخدام الفصيلة‪.‬‬ ‫ودالة البناء تحمل نفس اسم الفصيلة‪ ،‬فمثل لو كان اسم الفصيلة ) ‪ )Ball‬كانت دالة‬ ‫أما دالة الهدم فتأتي بنفس اسم الفصيلة مسبوقا بالعلمة) ~ البناء تحمل السم ) ‪.) Ball‬‬ ‫( فللفصيلة السابقة دالة الهدم تحمل السم ) ~‪.) Ball‬‬ ‫من أقوى خصائص برمجة الكائنات الموجهة خاصية التوريث‪ .‬ونعني التوريث ) ‪: )Inheritance‬‬ ‫هنا توريث فصيلة إلى فصيلة‬

‫أخرى‪ .‬وهنا ترث الفصيلة المشتقة ) ‪ ) derived class‬من الفصيلة الساسية ) ‪)parent‬‬ ‫‪ class‬كل بياناتها ودوالها ويمكن التعديل بعد ذلك في خصائص الفصيلة المشتقة لتناسب‬ ‫الحتياجات الجديدة‪ ،‬بإضافة المزيد من البيانات والدوال‪ .‬وبذلك نجد أن برمجة الكائنات‬ ‫الموجهة تعفي المبرمج من إعادة بناء البرامج من الصفر بل يعتمد على ما سبق لنجاز‬ ‫البرامج الجديدة‪ ،‬فتمكنه من استخدام الفصائل السابقة و عمل فصائل جديدة للستفادة منها‬ ‫مستقبل‪.‬‬ ‫عندما تعلن فصيلة عن دالة صديقة أو عدة دوال الدوال الصديقة) ‪:) friend functions‬‬ ‫صديقة فإنها تسمح لهذه الدوال باستعمال البيانات العضاء فيها ول تسمح لغير هذه الدوال‬ ‫بذلك‪ .‬وكذلك الحال عندما تعلن فصيلة عن فصيلة صديقة‪ ،‬فإنها تسمح لجميع دوال الفصيلة‬ ‫الصديقة باستخدام بيانات الفصيلة الساسية‪ .‬وسيأتي الحديث بالتفصيل عن الدوال الصديقة‬ ‫في فصل الفصائل والكائنات‪.‬‬

‫‪: ++C‬‬ ‫الفصل الثاني‪ :‬أساسيات البرمجة بلغة‬ ‫توجد لكل لغة أساسياتها التي ينبغي اللمام بها قبل كتابة البرامج بواسطتها‪ ،‬وهذا‬ ‫الفصل يوضح هذه الساسيات مثل‪ :‬هيكل البرنامج‪ ،‬المتغيرات‪ ،‬الدخال والخراج‪ .‬وبجانب هذا‬ ‫يلمس الباب العديد من مزايا اللغة من كتابة التعليقات‪ ،‬والعمليات الحسابية‪ ،‬وتحويل‬ ‫البيانات‪ .‬وغيرها من المزايا‪.‬‬ ‫البناء الساسي للبرنامج‪ :‬لنلق نظرة متعمقة على البرنامج التالي‬ ‫‪CODE >#include
‫والدالة لها اسمها ويليه قوسين توضع بينهما معاملت الدالة‪ ،‬ونلحظ أن الدالة الرئيسية‬ ‫في هذا المثال ليس لها معاملت‪ .‬أما الكلمة المحجوزة ) ‪ ) void‬والتي تسبق اسم الدالة‬ ‫فتوضح أن الدالة ليس لها قيمة ترجع بها ‪ ،‬بخلف بعض الدوال التي نخصص لها نوعا من‬ ‫البيانات بحيث ترجع قيمة من نوع هذا البيان‪.‬‬ ‫وعبارات الدالة نفسها تحاط بقوسين خاصين" } " ‪ " { " ،‬يسميان بقوسي البلوكات‪ .‬و‬ ‫الدالة الرئيسية هي أول ما ينفذه الكمبيوتر عند تنفيذ البرنامج‪.‬‬ ‫عبارات الخراج في البرنامج السابق نلحظ أننا قد استخدمنا عبارة لطباعة الحرفيات‪،‬‬ ‫وتختلف هذه العبارة عن العبارات التي تعودنا عليها عند استخدام اللغات الخرى فهنا لم‬ ‫نستخدم دالة خاصة لتطبع الخرج على الشاشة‪ ،‬بل قمنا بكتابة الحرفي بين علمتي تنصيص‬ ‫والمعامل ) >> ( والعبارة التي استخدمناها للطباعة واستخدمنا الكلمة المحجوزة ) ‪)cout‬‬ ‫يفهمها الكمبيوتر بكما هو موضح بالشكل التالي‬ ‫العبارة التي بدأ بها البرنامج ) موجهات ما قبل المعالجة) ‪:) preprocessor directives‬‬ ‫‪ )
‫عند كتابة برنامج بأية لغة يستحب كتابة التعليقات لتوضيح العبارات المكونة للبرنامج‪.‬‬ ‫والمبرمج الذكي يحرص دوما على كتابة كل ما يمكنه من تعليقات على برنامجه ليسهل عليه‬ ‫تصحيحه أو استخدام بعض أجزاءه إن دعت الحاجة لذلك‪.‬‬ ‫وتسمح لغة ‪ ++C‬بكتابة التعليقات بطريقتين تسهلن على المبرمج وضع ما يشاء من التعليقات‬ ‫على البرنامج ‪.‬‬ ‫والطريقة الولى هي كتابة التعليق بعد العلمة " ‪ " //‬حيث يتجاهل المترجم السطر الذي‬ ‫يلي هذه العلمة‪ .‬ولكن لو تجاوز التعليق السطر لزم إضافة المزيد من الرموز " ‪ "//‬أمام‬ ‫كل سطر من التعليقات‪ .‬وللستغناء عن الحاجة لكتابة العلمة " ‪ " //‬أمام كل سطر يمكن‬ ‫للمبرمج أن يستخدم الطريقة الثانية وهي كتابة التعليق بين العلمتين " ‪ "*/‬و " *‪"/‬‬ ‫ويسمح في هذة الحالة كتابة التعليق على أكثر من سطر دون التسبب في الخطأ‪ ،‬طالما كان‬ ‫التعليق بين العلمتين المذكورتين‪ .‬والمثال التالي يوضح كيفية استخدام الطريقتين‬ ‫‪CODE // this is the first method‬‬ ‫‪// this is the // first method‬‬ ‫‪/* /* this is the second method‬‬ ‫‪/* this is the second /*method‬‬ ‫في المرة الولى استخدمنا الطريقة الولى ولم يتجاوز التعليق السطر فلم نستخدم سوى علمة‬ ‫تعليق واحدة‪ .‬أما في المرة الثانية تجاوز التعليق السطر فلزم علينا استخدام علمة‬ ‫تعليق ثانية ‪.‬‬

‫وفي المرة الرابعة استخدمنا الطريقة الثانية لكتابة التعليقات ومع ان التعليق تجاوز‬ ‫السطر فلم نستخدم علمة تعليق جديدة لكل سطر بل اكتفينا بوجود العلمة " ‪ "*/‬في بداية‬ ‫التعليق والعلمة " *‪ "/‬في نهايته‪.‬‬ ‫‪.‬‬ ‫المتغيرات في لغة ‪ ( ++C‬تحدثنا مسبقا عن هذا الموضوع في السي ولكن باختصار(‬ ‫(‬ ‫تمثل المتغيرات الجزء الهم من أي لغة‪ ،‬والمتغيرات ليست إل أسماء رمزية لوعية اختزان‬ ‫البيانات في الذاكرة‪ .‬وحسب أنواع البيانات المختزنة تنقسم المتغيرات إلى أنواع عديدة‪،‬‬ ‫ويخضع اختيار أسماء المتغيرات لقواعد هي‪ -1 :‬أل يكون اسم المتغير أحد الكلمات‬ ‫المحجوزة باللغة ) ‪ ) Reserved words‬أو الكلمات التي تحمل معنى خاصا مثل) )‬ ‫‪ main‬ويمكن التعرف على الكلمات المحجوزة باللغة من دفتر التشغيل المصاحب للمترجم‪-2 .‬‬ ‫يمكن أن يحتوي السم على أى حرف من الحروف البجدية ) ‪ )A-Z‬سواء صغيرة كانت أم كبيرة‪،‬‬ ‫وأي رقم من الرقام )‪ ( 9-0‬كما يمكن أن تحتوي على علمة الشرطة السفلى ) _ ( ولكن ل‬ ‫يجوز أن يبدأ السم برقم‪ -3 .‬ل قيود على طول السم ‪ ،‬وتتيح هذه الميزة استخدام أسماء‬ ‫معبرة عن مضمونها‪ ،‬ومن الفضل دائما استخدام السم المعبر عن محتوى المتغير لتسهيل‬ ‫عملية فحص البرنامج في حالة الخطأ من جهة‪ ،‬ولتسهيل عملية الضافة والتعديل للبرنامج‪.‬‬ ‫) ‪ -4‬الحروف الكبيرة و الصغيرة ليست متكافئة في لغة ‪ ++C‬فمثل اسم المتغير )‬ ‫‪MY_NUMBER .)My_Number‬يختلف عن السم ) ‪ )my_number‬وكلهما يختلف عن السم )‬ ‫‪.‬‬ ‫وسنتناول هنا بالشرح بعض النواع الساسية من المتغيرات التي ل غنى للمبرمج عنها‪.‬‬ ‫‪.‬‬ ‫لنتعرف على كيفية تعريف المتغيرات المتغيرات العددية الصحيحة ) ‪:) integer variables‬‬ ‫العددية الصحيحة نلقي نظرة على البرنامج التالي‬ ‫ي‬ ‫‪CODE‬‬

‫‪>#include
‫المتغير الرمزي هو المتغير الذي يسمح بتخزين المتغيرات الرمزية ) ‪:) char variables‬‬ ‫رمز فيه‪ ،‬والرمز في لغة الكمبيوتر هو كل ما يرد في جدول الكود آسكي والذي يحدد الرموز‬ ‫التي يمكن للكمبيوتر التعامل معها‪ .‬والرموز تحتوي الحروف الكبيرة والصغيرة والعداد‬ ‫بالضافة إلى العديد من رموز التحكم‪ .‬ولتعريف متغير رمزي نستخدم العبارة ;‪char‬‬ ‫‪variable_name‬‬ ‫حيث ) ‪ )variable_name‬هو اسم المتغير الرمزي‪ ،‬ويخضع أيضا للقواعد العامة لتسمية‬ ‫المتغيرات‪ .‬وعند تخصيص قيمة لمتغير رمزي نستخدم علمتي اقتباس مفردتين كما بالعبارة‬ ‫التالية ;’ ‪variable = ‘A‬‬ ‫وهذه العبارة تخصص الرمز ) ‪ )A‬للمتغير ) ‪) variable‬‬ ‫من إمكانيات لغة ‪ ++C‬استخدام بعض رموز الحروف تتابعات الهروب ) ‪: ) escape sequences‬‬ ‫‪ CODE‬لداء مهام خاصة ولنلق نظرة على البرنامج التالي ‪:‬‬

‫‪>#include
‫المتغيرات العددية العشرية) ‪)floating point variables‬‬ ‫تعرفنا في جزء سابق على المتغيرات العددية الصحيحة‪ ،‬ونعني بالصحيحة تلك التي ل تحتوي‬ ‫على كسور أي ل توجد بها علمة عشرية‪ .‬والن نتعرف على المتغيرات العددية العشرية أو كما‬ ‫تسميها بعض الكتب المتغيرات الحقيقية وهي المتغيرات التي تسمح لنا بالتعامل مع العداد‬ ‫التي تحوي الكسور أو العلمات العشرية‪ ،‬ومن هنا جاء اسمها‪.‬‬ ‫ولتعريف متغيرات من النوع الحقيقي نلقي نظرة على البرنامج التالي‪:‬‬ ‫‪CODE‬‬

‫‪>#include
‫يتم بنفس الطريقة وباستخدام‬ ‫‪ ) floating‬والتي تعني علمة‬ ‫العداد الحقيقية بنفس طريقة‬ ‫المتغيرات العددية الصحيحة‪.‬‬

‫وتجب ملحظة أنه لو خصصنا ناتج عملية حسابية تحتوي على متغيرات حقيقية و أخرى صحيحة‬ ‫لبد من أن يكون الناتج مخصصا لمتغير من النوع الحقيقي‪ ،‬وإل حصلنا على أخطاء عند‬ ‫التنفيذ‪.‬‬ ‫المؤشرات‪:‬‬ ‫فكرة المؤشرات قد تبدو للوهلة الولى صعبة ولكن مع الفهم الجيد يصبح استعمال المؤشرات‬ ‫في غاية السهولة‪ .‬والفكرة الساسية هي أن ذاكرة الكمبيوتر مقسمة إلى أماكن لتخزين‬ ‫البيانات المختلفة ولكل مكان من هذه الماكن عنوانه الخاص‪ ،‬وهذا العنوان يفهمه‬ ‫الكمبيوتر بصورته العددية ) أي أن هذه العناوين ما هي إل أعداد (‪ .‬والبرنامج عندما‬ ‫يعلن عن متغير من نوع معين فإن الكمبيوتر يحجز مكانا له في الذاكرة‪ .‬وبالتالي‬

‫يكون لكل متغير من متغيرات البرنامج عنوانه الخاص‪.‬‬ ‫والمؤشر هو متغير يحمل العنوان‪ ،‬ويمكننا تعريف مؤشرات لكل أنواع المتغيرات في لغة ‪. +‬‬ ‫‪+C‬‬ ‫ولتعريف مؤشر ما يذكر نوعه أول ثم اسم المتغير مسبوقا بالعلمة ) *( وذلك كما في‬ ‫وفي هذه العبارة قمنا بتعريف مؤشر لعدد حقيقي‪ ،‬واسم المؤشر هو ‪ ;float *ptr .p‬العبارة‬ ‫‪tr‬‬ ‫ويمكننا بنفس الطريقة تعريف مؤشرات لكل أنواع البيانات التي توجد في لغة ‪.++C‬‬ ‫تعرفنا على العبارة المستخدمة في الخراج ونتناول الن عبارات الدخال باستخدام ‪cin‬‬ ‫العبارة التي تستخدم للدخال‪ .‬والمثال التالي يوضح العبارة قيد الستخدام‬ ‫;“ ‪CODE #include> ftemp; int ctemp= )ftemp -23) * 9/5; cout<<”The temperature‬‬ ‫{ والدخال في هذا البرنامج يتم بالعبارة التي تحوي ‪in Celsius is : “ <
‫السجل عبارة عن مجموعة مترابطة من البيانات كما في المصفوفات السجلت ) ‪:)Structures‬‬ ‫ولكن السجل يحتوي بيانات مختلفة النواع وليست من نوع واحد كما في المصفوفة‪ .‬والسجل‬ ‫يتكون من عدة حقول ) ‪ ) fields‬تحوي البيانات المختلفة ويستخدم السجل لتخزين بيانات‬ ‫مترابطة متكررة‪ ،‬كما في قاعدة البيانات حيث تتكون قاعدة البيانات من سجلت بكل سجل‬ ‫منها نفس الحقول‪ ،‬ولكن قيم تلك الحقول تختلف من سجل لخر‪.‬‬ ‫والعلن عن السجل يتم كما هو موضح بالشكل التالي‬ ‫}; … ‪CODE struct structure_name { ;1type field ;2type field‬‬ ‫حيث ) ‪ )stucture_name‬هو اسم السجل وبداخل السجل تتوالى الحقول المختلفة النواع ) ) ‪2‬‬ ‫‪..…,field1, field‬ولكل حقل نوعه الخاص‪.‬‬ ‫وبتعريفنا للسجل يمكننا بعد ذلك تعريف متغيرات من نوع هذا السجل لستخدامها في‬ ‫البرنامج حسب الحاجة ويتم تعريف المتغيرات من السجل كما هو موضح بالشكل التالي الذي‬ ‫من نوع السجل ) ‪ 1)structure‬يوضح تعريف متغير )‪1)var‬‬ ‫‪CODE‬‬

‫‪1struct structure { ;1type field ;2type field … ;1} var‬‬ ‫ويمكننا تعريف أي عدد من المتغيرات من نوع هذا السجل كما يتطلب البرنامج والن كيف‬ ‫نتعامل مع السجلت؟؟ إننا نحتاج مثل لتخزين قيمة معينة في أحد الحقول‪ ،‬وفي هذه الحالة‬ ‫نستخدم المؤثر )‪ (.‬والمثال التالي يوضح عمل سجل باسم ) ‪ )Student‬وتخصيص اسم ))‬ ‫; } ;‪Mohammed )name CODE #include
‫الفصل الثالث ‪ :‬اتخاذ القرارات‬ ‫تعرضنا حتى الن لبرامج متتالية الوامر‪ ،‬حيث ينفذ الكمبيوتر العبارات الموجودة في‬ ‫البرنامج بالترتيب الذي وردت به ‪.‬‬ ‫ولكن في الحياة العملية نحتاج لتخاذ بعض القرارات تبعا لشروط معينة‪ ،‬ومن هنا ظهرت‬ ‫الحاجة لوجود طرق لجعل البرنامج قادرا على تغيير تسلسل تنفيذ التعليمات تبعا للشروط‬ ‫المطلوبة‪.‬‬ ‫وسنتعرض هنا لطرق اتخاذ القرار في لغة ‪ ++C‬كيفية تغيير تسلسل التنفيذ تبعا للشروط‬ ‫الموضوعة‪.‬‬ ‫تكوين العبارة الشرطية البسيطة كما هو موضح العبارة الشرطية البسيطة ) ‪:)if statement‬‬ ‫;‪ statement‬بالشكل التالي ) ‪if ) condition‬‬ ‫حيث ) ‪ ) condition‬هو الشرط و ) ‪ ) statement‬هو القرار المراد اتخاذه عند تحقق الشرط‬ ‫المعطى‪ .‬وعندما ترغب في تنفيذ أكثر من عبارة بتحقق الشرط نستبدل العبارة التي تمثل‬ ‫القرار المراد اتخاذه ببلوك به العبارات المراد تنفيذها‪ .‬ولتوضيح استخدام العبارة‬ ‫الشرطية البسيطة أنظر البرنامج التالي‬ ‫‪CODE‬‬

‫‪>#include > sum‬‬ ‫} ‪(05>if)sum ;”cout<<” The student had passed‬‬ ‫وفي هذا البرنامج يطبع الكمبيوتر رسالة ليسأل المستخدم عن مجموع الطالب وبعد ذلك يقوم‬ ‫بمقارنتها بالشرط اللزم للتأكد من النجاح ) وهو تجاوز المجموع ‪( 05‬فإذا تحقق الشرط‬ ‫يطبع الكمبيوتر رسالة للمستخدم يعلمه أن الطالب ناجح‪،‬‬ ‫العبارة الشرطية الكاملة ) ‪)if ……. else statement‬‬ ‫إن اتخاذ القرارات في الحياة العملية ليست بالسهولة التي ذكرت في البرنامج السابق‪ ،‬إذ‬ ‫نحتاج في معظم الحيان لتخاذ اجراء تبعا لشرط معين‪ ،‬واتخاذ إجراء آخر إذا لم يتحقق هذا‬ ‫الشرط‪.‬‬ ‫لو نظرنا للبرنامج السابق لوجدنا سؤال ملحا ‪ :‬ماذا لو كان مجموع الطالب أقل من ‪ 05‬؟؟‬ ‫الجابة على هذا السؤال هي أن الطالب يكون راسبا‪ .‬ولكن البرنامج ل يتضمن أمرا بإعطاء‬ ‫حالة الرسوب‪ ،‬لننا استخدمنا عبارة الشرط البسيطة والتي تستجيب لشرط واحد‪ .‬وسنتعرض الن‬ ‫لعبارة مركبة كما في البرنامج التالي‬ ‫‪CODE‬‬

‫‪>#include > sum‬‬ ‫‪(05>if)sum ;”cout<<” The student had passed else ;”cout<<” The student had failed‬‬ ‫}‬ ‫وفي هذا البرنامج استخدمنا العبارة الشرطية الكاملة والتي تأتي على الصورة الموضحة‬ ‫;‪ statement-1; else statement-2‬بالشكل التالي )‪if ) condition‬‬ ‫حيث أن ) ‪ ) condition‬هو الشرط و ) ‪ ) statement -1‬هي عبارة النتيجة الصلية‪ .‬و )‪) -2‬‬ ‫‪ statement‬هي عبارة النتيجة البديلة‪ .‬ومنطق اتخاذ القرار هنا هو ‪ " :‬لو تحقق الشرط‬ ‫يقوم الكمبيوتر بتنفيذ عبارة النتيجة الصلية أما لو لم يتحقق الشرط فيقوم الكمبيوتر‬ ‫بتنفيذ عبارة النتيجة البديلة"‬ ‫وهكذا ‪-‬باستخدام العبارة الشرطية الكاملة ‪ -‬تمكننا من اتخاذ القرار لحالتين‬ ‫متضادتين ‪ ،‬والن ماذا لو‬

‫كانت النتيجة الصلية و النتيجة البديلة تتضمنان أكثر من أمر للكمبيوتر؟ في هذه الحالة‬ ‫نحتاج إلى احتواء عبارات النتيجة الصلية بين قوسين من أقواس البلوكات‪ ،‬وهو الموضح‬ ‫بالشكل التالي‬ ‫‪CODE (if ) condition { ;1 statement ;2 statement . . ;statement n } else { ;1‬‬ ‫} ‪statement ;2 statement . . ;statement m‬‬ ‫نلحظ أن عبارة النتيجة تم استبدالها ببلوك النتيجة‪ ،‬والمثال التالي هو نفس البرنامج‬ ‫السابق بعد تعديل عبارات النتائج لتصبح بلوكات‪ ،‬وذلك ليتمكن البرنامج من إعطاء تقرير‬ ‫بالنجاح أو الرسوب متضمنا النسبة المئوية في حالة النجاح أو رسالة تفيد بأنه ل يمكن‬ ‫احتساب النسبة المئوية لطالب راسب‪.‬‬ ‫‪CODE‬‬

‫‪>#include > sum‬‬ ‫‪(05>if)sum { ;”cout<<” The student had passed ;001/cout<< “ His points are “<< sum‬‬ ‫‪} else { ;”cout<<” The student had failed ;”!! cout<<” No points are calculated‬‬ ‫} } ‪for failed student‬‬ ‫العبارة الشرطية المتدرجة ‪) if-else- if Ladder ):‬‬ ‫لو افترضنا انه قد طلب منك ‪ -‬كمبرمج ‪ -‬عمل برنامج يمكنه احتساب التقديرات اعتمادا على‬ ‫مجموع الطالب‪ ،‬في هذه الحالة نستخدم عبارة شرطية أيضا ولكن بها عدد من الشروط وعدد‬ ‫مناظر من النتائج‪ .‬أو ما يطلق علية العبارة الشرطية المتدرجة‪.‬‬ ‫والشكل التالي يوضح التكوين العام للعبارة الشرطية المتدرجة‬ ‫‪CODE‬‬

‫)‪(1– if ) condition ;1– statement (2-else if ) condition ;2-statement (3-else if‬‬ ‫‪condition ;3-statement ..……… else ;statement-n‬‬ ‫يعتبر الختيار المتعدد البدائل بديل الختيار متعدد البدائل ) ‪) statement switch‬‬ ‫للعبارة الشرطية المتدرجة التي تعرضنا لها سابقا‪ ،‬والواقع أن الختيار المتعدد البدائل‬ ‫أعد خصيصا ليكون أسهل استخداما من العبارة الشرطية المتدرجة‪.‬ويتميز عنها بأنه أفضل‬ ‫توضيحا‪.‬‬ ‫والشكل التالي يوضح الصورة العامة للختيار متعدد البدائل‬ ‫‪CODE‬‬

‫‪(switch )variable { ;1case value ;1 statement ;break ;2case value ;2 statement‬‬ ‫} ‪;break ;3 case value ;3 statement ;break …………… :default ;statement‬‬ ‫وكما نرى فإن الختيار المتعدد البدائل يبدأ بكلمة ) ‪ )switch‬يليها متغير الختيار‬ ‫والذي تحدد قيمته الختيار الذي سيتم تنفيذه‪ ،‬ويلي ذلك قوس بلوك كبير يحتوي داخله‬ ‫بلوكات صغيرة كل منها يمثل اختيارا من البدائل المطروحة و كل بلوك من بلوكات البدائل‬ ‫يبدأ بكلمة ) ‪ ) case‬متبوعة بقيمة لمتغير الختيار ‪ -‬والتي تمثل الشرط ‪ -‬وبعد ذلك تأتي‬ ‫عبارة النتيجة‪.‬‬ ‫ويختتم بلوك البديل بكلمة ) ‪ )break‬والغرض من هذه الكلمة هو منع الكمبيوتر من تنفيذ‬ ‫عبارة النتيجة التالية!!! وقد تبدو هذه العبارة غريبة للوهلة الولى ويتبادر للذهن‬ ‫سؤال ملح ‪ :‬ألم يتحقق الشرط الول مثل فماذا يدفع الكمبيوتر لتنفيذ بقية عبارات‬ ‫النتائج؟؟ والجابة عن هذا السؤال هي أن عبارة الختيار متعدد البدائل ل ترسل للكمبيوتر‬ ‫أمرا بالتوقف بعد تحقق أي شرط فيها‪ ،‬لذا لزم الستعانة بكلمة )‪) break‬‬ ‫وبعد نهاية بلوكات البدائل تأتي كلمة )‪ ) default‬متبوعة بعبارة أو بعبارات ينفذها‬ ‫الكمبيوتر في‬

‫حالة عدم تحقق أي من الشروط السابقة‪-------------------------------- .‬‬

‫الفصل الرابع‪ :‬الحلقات التكرارية‬ ‫كثيرا ما نحتاج في البرامج إلى تكرار أمر موجه للكمبيوتر عددا من المرات‪ ،‬وتوفر لغة‬ ‫‪ ++C‬عدة وسائل تمكن المبرمج من أداء هذا التكرار‪ .‬وعادة ما تسمى هذه الوسائل " الحلقات‬ ‫سنتناول منها هنا ‪ -1‬الحلقة التكرارية "‪ ،‬ويوجد العديد من الحلقات التكرارية في لغة ‪C‬‬ ‫‪ 2‬الحلقة ‪ while ) while loop3 ).‬الحلقة ‪for ) for loop ). .)do…. while ) do-while‬‬ ‫‪ loop‬وفيما يلي سنتناول كل حلقة بالدراسة من حيث الشكل العام و أسلوب الستخدام وأمثلة‬ ‫توضيحية‪.‬‬ ‫تستخدم الحلقة ‪ for‬لتكرار أمر معين ) أو مجموعة من الوامر( الحلقة ‪:)for ) for loop‬‬ ‫عددا من المرات وتحتاج الحلقة إلي ثلث عناصر أساسية كما هو موضح بالشكل التالي )) ‪for‬‬ ‫‪counter statement; condition; step‬‬ ‫و هذه العناصر هي‪ -1 :‬العداد ) ‪ : ) counter‬وظيفة العداد هي تسجيل عدد مرات التكرار‪.‬‬ ‫‪ -2‬الشرط ) ‪ :)condition‬والشرط الذي يحدد نهاية التكرار إذ يظل التكرار قائما حتى‬ ‫ينتفي الشرط‪ -3 .‬الخطوة) ‪ : )step‬وهي القيمة التي تحدد عدد مرات التكرار‪.‬‬ ‫والشكل التالي يوضح برنامجا قمنا فيه باستخدام الحلقة ‪: for‬‬ ‫‪CODE‬‬

‫‪>#include
‫} ‪CODE ( while ) conditon { ;1 statement ;2 statement . . ;statement n‬‬ ‫حيث ) ‪ ) condition‬هو الشرط اللزم لداء التكرار‪ ،‬والعبارات بداخل أقواس البلوكات هي‬ ‫العبارات المراد تكرارها‪ .‬والمثال الموضح بالشكل التالي يوضح استخدام الحلقة‬ ‫‪while‬لطباعة العداد من ‪ 1‬إلى ‪02‬‬ ‫{ ‪CODE >#include
‫‪ 2‬زيادة العداد تتم داخل الحلقة ‪.while‬‬‫تختلف هذه الحلقة عن الحلقتين السابقتين في مكان كتابة الحلقة التكرارية ‪:do-while‬‬ ‫الشرط ‪ ،‬حيث يكتب الشرط هنا بعد العبارات المطلوب تكرارها‪ .‬والشكل التالي يوضح الصورة‬ ‫العامة للحلقة ‪do-while‬‬ ‫‪CODE do { ;1 statement ;2 statement . . ;statement n } ( while ) conditon‬‬ ‫وأهم ملحظة على الحلقة التكرارية ‪ do-while‬أنها تنفذ العبارات المطلوب تكرارها مرة‬ ‫واحدة على القل حتى ولو كان الشرط غير متحقق !!! وتفسير ذلك أن التحقق من الشرط يتم‬ ‫بعد التنفيذ وليس قبله كما في الحلقتين السابقتين‪.‬‬

‫الفصل الخامس‪ :‬الدوال و الماكرو ) ‪: )Function & Macro‬‬ ‫معنى الدالة‪ :‬الدالة هي مجموعة من الوامر المحددة التي تعطى للكمبيوتر وغالبا ما تكون‬ ‫هذه الوامر مرتبطة بأداء وظيفة محددة‪ .‬والدوال تمنح اللغة بعض المزايا مثل‪:‬‬ ‫‪ -1‬توفر في حجم البرنامج‪ ،‬حيث نستعيض عن تكرار عدد السطور التي تؤدي مهمة الدالة‬ ‫بإعادة استدعاء الدالة فقط‪ -2 .‬توفر مكتبة دائمة للمبرمج‪ ،‬حيث يمكن الحتفاظ بالدوال‬ ‫وإعادة استخدامها حين الحاجة دون كتابتها من البداية‪ -3 .‬يؤدي استخدام الدوال الى‬ ‫زيادة وضوح البرنامج وتسهيل عملية تصحيحه‪ ،‬حيث يبدو البرنامج مع استخدام الدوال مقسما‬ ‫إلى أجزاء محددة واضحة أو ما يسمى بالبلوكات‪.‬‬ ‫وسنتناول الن طريقة استخدام الدوال في البرامج‪ ،‬ليتم استخدام الدالة يجب أول العلن‬ ‫عنها‪ ،‬وبعد عملية العلن عن الدالة يمكننا استخدامها بواسطة ما يسمى باستدعاء الدالة‪،‬‬ ‫ولبد من كتابة التعليمات التي تؤديها الدالة فيما يعرف باسم تعريف الدالة‪.‬‬ ‫والمثال التالي مثال )‪ (1‬يوضح استخدام دالة عرفها المبرمج‬ ‫‪CODE‬‬

‫‪>#include
‫‪،)function‬‬ ‫‪definition‬‬ ‫أربعين مرة‬ ‫يشكل الخرج‬

‫المطلوب من الدالة‪.‬‬ ‫ومن أهم الملحظات التي يجب وضعها دائما في العتبار ‪ -1 :‬يمكن أن يأتي تعريف الدالة‬ ‫قبل استدعائها‪ ،‬وفي هذه الحالة ل حاجة بنا للعلن عن الدالة في سطر مستقل‪ -2 .‬ل يمكن‬ ‫بأية حال أن يتم استدعاء الدالة قبل العلن عنها أو تعريفها‪.‬‬ ‫أنواع الدوال‪ :‬تصنف الدوال تبعا للقيمة التي تعيدها‪ ،‬وتبعا لذلك نجد النواع التالية‪:‬‬ ‫‪ -1‬دوال أعداد صحيحة ) ‪ )int functions‬وهي التي تعيد بيانا من النوع العددي الصحيح ‪.‬‬ ‫‪ 2‬دوال أعداد حقيقية ) ‪ ) float functions‬والقيمة المعادة في هذه الحالة ))‪integer‬‬ ‫‪3‬دوال حرفيات ) ‪ ) string functions‬وتعيد بيانا من تكون من النوعالحقيقي ‪float ) ) .‬‬ ‫النوع الحرفي وهو سلسلة من الرموز ‪ -4.‬دوال الرموز ) ‪ ) char functions‬وتعيد بيانا من‬ ‫‪ 5‬دوال ل تعيد قيما ) ‪ )void function‬ول تعيد قيما من أي نوع النوع الرمزي ) ‪char).‬‬‫مثال(‪:(2‬‬ ‫‪CODE‬‬

‫‪>#include
‫والجواب على هذا السؤال أنه يمكن بالفعل استخدام الدالة الرئيسية بمعاملت والمثال‬ ‫التالي مثال)‪ (3‬يوضح برنامجا فيه الدالة الرئيسية تم استدعائها بمعاملتها‬ ‫…‪CODE > #include < iostream.h (][main )int argc, char*argv { (3=!if)afgc { ;”.‬‬ ‫‪cout<<” Arguments number error ;(1)exit } ;’cout<<”the first argument‬‬ ‫} ‪is”<<argv[1]<<’\n ;]2[cout<<”the second argument is”<<srgv‬‬ ‫نلحظ أن الدالة الرئيسية تستخدم معاملين هما ) ‪ )argc‬وهو من النوع العددي الصحيح‪،‬‬ ‫ويستخدم لتخزين عدد المعاملت التي سيكتبها المستخدم عند استدعاء الدالة‪ ،‬والسم ) )‬ ‫‪argc‬اختصار لعدد المعاملت ) ‪)argument counter‬‬ ‫أما المعامل الثاني فهو ) ‪ ) argv‬وهو عبارة عن مصفوفة حرفيات تختزن المعاملت التي‬ ‫يكتبها المستخدم عند استدعاء البرنامج‪ .‬وتكتب المعاملت الخاصة بالدالة الرئيسية عند‬ ‫استدعاء البرنامج فمثل لو كان البرنامج السابق في صورته القابلة للتنفيذ محفوظا باسم‬ ‫‪ C:> prog1 First Second‬وكتبنا السطر التي لتنفيذه‪)prog1.exe ) :‬‬ ‫فإن المعاملت تختزن في مصفوفة المعاملت بالشكل الموضح بالجدول أدناه‬

‫القيمة المختزنة ‪ **** :‬القيمة المختزنة ‪1 *** Prog :‬عنصر المصفوفة ‪[argv]0 :‬‬ ‫القيمة المختزنة ‪ ** Second :‬عنصر المصفوفة ‪First [argv]2 :‬عنصر المصفوفة ‪[argv]1 :‬‬ ‫ويقوم البرنامج بالتأكد من عدد المعاملت المعطاة فإذا كان غير ثلثة طبع البرنامج‬ ‫رسالة خطأ‪ .‬و لو كان العدد مساويا لثلثة ) كما هو الحال في السطر المعطى بعالية( فإن‬ ‫البرنامج يطبع قيمة المعامل الول ‪ .‬ثم ينتقل لسطر جديد ليطبع المعامل الثاني‪ .‬ويكون‬ ‫‪ the first argument is First the second argument is Second‬خرج البرنامج كالتي‬ ‫الماكرو‪ :‬الماكرو هو مجموعة أوامر مصممة لداء غرض معين‪ ،‬والمثال التالي يوضح برنامجا‬ ‫استخدمنا فيه ماكرو لحساب مربع العدد‬ ‫‪CODE‬‬

‫‪>#include > x ;(cout << “ The square of “<< x‬‬ ‫} ‪<< “is :” << SQUARE)x‬‬ ‫والبرنامج هنا ينتظر من المستخدم إدخال قيمة عددية للحصول على مربعها‪ ،‬ويحسب البرنامج‬ ‫‪ #define SQUARE)A( A*A‬قيمة مربع العدد باستخدام الماكرو المعلن في السطر الثاني‬ ‫ولحساب القيمة يقوم البرنامج باستدعاء الماكرو ;)‪SQUARE)x‬‬ ‫والماكرو يشبه الدالة إلى حد ما وإن كان هناك اختلف بينهما نتناوله الن بالتفصيل‪ .‬يمر‬ ‫البرنامج بعدة مراحل قبل الحصول على النسخة القابلة للتنفيذ منه وهذه المراحل هي‪-1 :‬‬ ‫كتابة البرنامج وحفظة باستخدام أحد برامج التحرير ) ‪ )Editors‬وتسمى هذه العملية‬ ‫بكتابة الكود ) ‪ ) coding‬ويحتفظ بالملف في هذه الحالة بالمتداد " ‪ "cpp.‬ويسمى بالملف‬ ‫‪ 2‬عملية الترجمة ) ‪ ) compilation‬وينتج عن هذه العملية المصدر ) ‪source file).‬‬ ‫‪ 3‬عملية الربط بمكتبة اللغة ) ) البرنامج الهدف الذي يحمل عادةالمتداد " ‪OBJ" .‬‬ ‫‪ Linking‬وينتج عن هذة العملية البرنامج التنفيذي الذي يحملالمتداد "‪ ."EXE‬والبرنامج‬ ‫التنفيذي هو البرنامج الذي يتم تنفيذه بمجرد إدخال اسمه ‪.‬‬

‫والدالة بعد كتابتها في البرنامج تمر بمرحلة الترجمة إلى لغة اللة ول تنفذ إل في‬ ‫مرحلة الربط‪ ،‬أما الماكرو وأثناء عملية الترجمة فيتم استبداله في كل سطر يتم استدعاؤه‬ ‫فيه بنتيجته النهائية ول ينتظر مرحلة التنفيذ كالدالة‪.‬‬ ‫ويمتاز الماكرو عن الدالة بالسرعة والسهولة في الكتابة بالضافة لستخدامه أنواعا‬ ‫محايدة من البيانات ) فلم نشترط نوعا معينا من المتغيرات في تعريفنا للماكرو ) ) )‬ ‫‪ SQUARE)A‬فهو ل يحتاج إلى تحديد النوع كما في الدوال‪ .‬وذلك بالضافة إلى حصولنا على ملف‬ ‫تنفيذي أصغر في حالة استعمال الماكرو‪.‬‬ ‫وبصفة عامة يوصى باستخدام الماكرو في العمليات القصيرة التي ل تتعدى سطرا واحدا‪.‬‬

‫الفصل السادس ‪:‬المصفوفات‬ ‫المصفوفة هي مجموعة من العناصر من نفس النوع‪ ،‬وتكون عناصر المصفوفة مرتبة بحيث يمكننا‬ ‫الوصول لي عنصر نريده بتحديد ترتيبه في المصفوفة‪.‬‬ ‫والمصفوفات تنقسم لنوعين فهناك المصفوفات ذات البعد الواحد‪ ،‬والمصفوفات ذات البعدين‪.‬‬ ‫مصفوفات البعد الواحد‬ ‫المصفوفة ذات البعد الواحد هي مجموعة من العناصر مرتبة بحيث يمكن الوصول إلى أى عنصر‬ ‫فيها باستخدام ترتيبه بالنسبة لول عنصر في المصفوفة وفي لغة ‪ ++C‬يأخذ أول عنصر الرقم‬ ‫صفر‪ .‬والشكل التالي يوضح مصفوفة ذات بعد واحد [‪A= ] 2 3 4 5 6‬‬ ‫وعناصر المصفوفة مرتبة بدءا من العنصر الول والذي يأخذ الرقم صفر ويكون العنصر الول‬ ‫‪ [A]0‬مساويا للقيمة ‪ .2‬وبالمثل يكون ‪ ، A[1] = 3 ، A]2[ = 4‬وهكذا…‬ ‫مصفوفات ذات بعدين‬ ‫المصفوفة ذات البعدين تحتوي على عناصر من نفس النوع‪ ،‬ولكنها مرتبة في صفوف و أعمدة ‪.‬‬ ‫وبالتالي تختلف طريقة الوصول للعناصر إذ يلزم لتحديد العنصر استخدام رقم الصف و رقم‬ ‫العمود و الشكل التالي يوضح مصفوفة ذات بعدين‬

‫وعناصر المصفوفة في هذه الحالة كما ذكرنا تحدد باستخدام رقمين رقم الصف ورقم العمود‪،‬‬ ‫فالعنصر ‪ 21‬يقع في العمود الول والصف الول أو بلغة الكمبيوتر ‪ .B]0[]0[=21‬لحظ أن‬ ‫الترقيم في المصفوفة يبدأ بالرقم صفر دائما‪.‬‬ ‫وبالمثل يمكن تحديد العناصر المختلفة ‪ ،‬ويذكر رقم الصف أول ثم رقم العمود‪ ،‬والشكل‬ ‫التالي يوضح أمثلة لتحديد عناصر مختلفة من المصفوفة ‪B‬‬ ‫‪CODE 53 = ]2[]1[B‬‬ ‫‪08 = ]1[]2[B‬‬ ‫‪51 = ]2[]0[B‬‬ ‫‪61 = ]2[]2[B‬‬ ‫وسنتناول فيما يلي كيفية التعامل مع المصفوفات من خلل لغة ‪ ++C‬والعلن عنها وتخصيص قيم‬ ‫للعناصر وطباعة العناصر وغيرها من اساليب معالجة المصفوفات‪.‬‬ ‫المثال الموضح بالشكل التالي يوضح كيفية التعامل مع مصفوفة البعد الواحد في لغة ‪++C‬‬ ‫مصفوفة ذات بعد واحد بالسم ‪A‬‬

‫‪CODE >#include > A[I‬‬ ‫<< ”‪(++for)int I=0; I<4; I { ;]cout<<” The value of the element A[“ << I << ”] is‬‬ ‫} } ‪A[I‬‬ ‫ويقوم المثال بعد ذلك بعدة عمليات نتناولها بالتفصيل السطر المشار إليه بالرقم) ‪( 1‬‬ ‫‪ )int‬وعدد العناصر أربعة‪ .‬يعلن عن المصفوفة وعناصر المصفوفة من النوع العددي الصحيح )‬ ‫والعلن عن المصفوفة كالعلن عن المتغيرات العادية يذكر نوع المتغيرات أول ثم اسم‬ ‫المصفوفة متبوعا بعدد العناصر بين قوسين مربعين‪.‬‬ ‫والحلقة ‪ for‬الولى تقوم بتعبئة المصفوفة بالبيانات التي يدخلها المستخدم واحدا بعد‬ ‫الخر‪ ،‬ويلحظ أنه ل بد لنا من حلقة تكرارية لدخال البيانات في المصفوفة‪ .‬أما الحلقة‬ ‫‪ for‬الثانية فتقوم بعرض عناصر المصفوفة التي تم إدخالها عنصرا عنصرا‪.‬‬

‫المصفوفة ذات البعدين في لغة ‪: ++C‬‬ ‫في أحد الفصول الدراسية كانت نتائج ثلثة طلب كما هو موضح بالجدول التالي‬ ‫والن لو طلب منا برنامج يمكنه التعامل مع هذا الجزء من النتيجة‪ ،‬فإننا نحتاج بكل‬ ‫تأكيد لمصفوفة ذات بعدين والبرنامج التالي يوضح كيفية إنشاء مصفوفة ذات بعدين‪ ،‬وبعد‬ ‫ذلك يطلب من المستخدم إدخال البيانات الموضحة في الجدول ويقوم بتخزينها في عناصر‬ ‫المصفوفة المناظرة‪ ،‬وبعد ذلك يطبع البرنامج القيم المدخلة‪.‬‬ ‫‪CODE‬‬

#include main)( { float Degrees[3][3]; // Array declaration // Array Element entry for )int I=0; I<3; I++( { for)int J=0; J<3; J++( { cout<<” Enter the result of subject ” << I << “for student “<< J; cin >> Degrees[I][J]; } }; // Array elements display for )int I=0; I<3; I++( { for)int J=0; J<3; J++( { cout<<” the result of subject ” << I << “for student “<< J <<”is”; cout<< Degrees[I][J]; } }; }

‫ويلحظ استعمال حلقتين تكراريتين من النوع ‪ for‬لتخصيص البيانات للمصفوفة ولعرضها بعد‬ ‫التخصيص وكل من الحلقتين التكراريتين تتكونان من حلقة خارجية تقوم بزيادة عداد العمدة‬ ‫وحلقة الداخلية تقوم بزيادة عداد الصفوف‪.‬‬ ‫وترمز العمدة هنا لرقم المادة بينما ترمز الصفوف لرقم الطالب‪.‬‬

‫الفصل السابع ‪ :‬الفصائل والكائنات ) ‪) Classes & Objects‬‬ ‫سنتناول في هذا الفصل بشيء من التفصيل الفصائل والكائنات لنتعرف عن قرب على برمجة‬ ‫الكائنات الموجهة ‪ .‬الفصيلة تتكون من بينات ودوال تتعامل مع هذه البيانات والشكل‬ ‫التالي )شكل ‪ (1‬يوضح الصورة العامة للعلن عن الفصيلة‬ ‫‪CODE {class class_name :private private data and functions : public public data‬‬ ‫} ‪and functions‬‬ ‫والعلن عن الفصيلة يتكون من‪:‬‬ ‫أول ‪ :‬الكلمة المحجوزة ) ‪ ) class‬يليها اسم الفصيلة ) ‪ )class_name‬ويخضع اسم الفصيلة‬ ‫لقواعد عامة هي‪:‬‬ ‫أل يكون اسم الفصيلة أحد الكلمات المحجوزة باللغة ) ‪ ) Reserved words‬أو الكلمات‬ ‫التيتحمل معنى خاصا مثل) ‪ ) main‬ويمكن التعرف على الكلمات المحجوزة باللغة من دفتر‬ ‫التشغيل المصاحب للمترجم‪.‬‬ ‫يمكن أن يحتوي السم على أى حرف من الحروف البجدية ) ‪ )A-Z‬سواء صغيرة كانت أم‬ ‫كبيرة‪،‬وأي رقم من الرقام )‪ ( 9-0‬كما يمكن أن تحتوي على علمة الشرطة السفلى ) _ ( ولكن‬ ‫ل يجوز أن يبدأ السم برقم‪- .‬ل قيود على طول السم ‪ ،‬وتتيح هذه الميزة استخدام أسماء‬ ‫معبرة عن مضمونها‪ ،‬ومن الفضل‬

‫دائما استخدام السم المعبر عن محتوى الفصيلة لتسهيل التعامل مع الفصائل‪.‬‬ ‫الحروف الكبيرة و الصغيرة ليست متكافئة في لغة ‪ ++C‬فمثل اسم البيان)‪ )MY_CLASS‬يختلفعن‬ ‫السم ) ‪ )my_class‬وكلهما يختلف عن السم ) ‪.)My_Class‬‬ ‫ثانيا‪ :‬تحديد درجة الحماية ‪ ،‬ونبدأ عادة بدرجة الحماية الخاصة ) ‪ ) private‬وتلي هذه‬ ‫الكلمة البيانات و الدوال الخاصة بالفصيلة‪.‬‬ ‫ثالثا‪ :‬تحديد درجة حماية أخرى ‪،‬وفي هذا المثال استخدمنا الدرجة العامة ) )‬ ‫‪ public‬وسنتعرف على درجات الحماية بالتفصيل في وقت لحق‪.‬‬ ‫والمثال الموضح بالشكل التالي يوضح كيفية استخدام الفصيلة في برنامج‪.‬‬ ‫‪CODE‬‬

01: #include 02: class smallobj // class name 03:{ 04: private: 05: int somedata; //class data 06: public: 07: void setdata )int d(; // member function to set data 08: {somedata= d;} 09: void showdata)( // mamber function to display data 10: { cout << “ \n Data is “ << somedata;} 11:}; 12: void main)( 13:{ 14: smallobj s1,s2; // define two objects of the class 15: s1.setdata)1096(; //call member function to set data 16: s2.setdata)200(; 17: s1.showdata)(; 18: s2.showdata)(; 19:} ‫ وفائدة هذا التوجيه إخبار المترجم بمكان‬، ‫يبدأ البرنامج بالتوجيه في السطر الول‬ ‫وتتابع‬: ‫على تعريفات الدوال الساسية والتي سنستخدمها في البرنامج‬. ‫الملف المحتوي‬ ‫السطور بعد ذلك كالتي‬ ‫( ويلحظ التعليق المكتوب بعد العلمة‬smallobj ( ‫ تعريف فصيلة جديدة تحمل‬: 20 ‫السطر‬ ‫السم‬

‫" ‪ ، "//‬وهذة الميزة لم تسمح بها لغة ‪. C‬‬ ‫السطرين ‪ 40‬و ‪ :50‬تعلنان عن بيان من النوع الصحيح‪.‬‬ ‫السطر ‪ :60‬يعلن درجة الحماية العامة‪ ،‬بمعنى أن ما سيأتي بعد ذلك سيكون عاما فيمكن‬ ‫للفصائل المشتقة أن تتعامل معه‪.‬‬ ‫السطور من ‪ 70‬إلى ‪ 01‬فيهما تعريف الدالتين الوحيدتين في الفصيلة‪ .‬ويلحظ في السطر ‪01‬‬ ‫‪ .C‬وسنتعرض كيفية الطباعة على الشاشة وهو أسلوب جديد لم يكن مستعمل من قبل في لغة‬ ‫للساليب الجديدة في فصل مستقل‪.‬‬ ‫وبداية من السطر ‪ 21‬يبدأ البرنامج فعليا كالعادة بالدالة ‪. )(main‬‬ ‫وفي السطر ‪ 41‬نعرف كائنين من الفصيلة السابقة‪ ،‬ويلحظ أن تعريف الكائنات يتم كتعريف‬ ‫المتغيرات العادية‪.‬‬ ‫السطر ‪ 51‬يستدعي الدالة ) ‪ ) )(setdata‬للكائن الول‪ ،‬وتجب ملحظة طريقة الستدعاء‬ ‫باستخدام المؤثر ) ‪ ،(.‬حيث يذكر اسم الكائن متبوعا بالمؤثر ) ‪ (.‬ثم اسم الدالة المراد‬ ‫تنفيذها مع تخصيص قيم لمتغيرات الدالة‪.‬‬ ‫السطرين ‪ 71‬و ‪ 81‬يتم فيهما استدعاء الدالة ) ‪ ) )(showdata‬لكل من الكائنين ) ‪2.)s1,s‬‬ ‫درجة حماية أعضاء الفصيلة‪:‬‬ ‫تعرضنا لعبارة " درجة حماية أعضاء الفصيلة " والن نتناول هذه العبارة بشيء من‬ ‫التفصيل‪.‬‬ ‫أن درجة الحماية هي تحديد مدى القدرة على التعامل مع أعضاء الفصيلة ) البيانات و‬ ‫الدوال ( والكلمات المستخدمة لتحديد درجة الحماية موضحة بالجدول التالي‬

‫دالة البناء ‪ :‬ذكرنا سابقا أن دالة البناء ما هي إل عضو من الفصيلة وتحمل نفس اسمها‪،‬‬ ‫وتنفذ هذه الدالة تلقائيا عند العلن عن كائن من الفصيلة‪ .‬ويمكننا أن نستفيد من هذه‬ ‫الدالة في تخصيص قيم لبعض بيانات الكائن عند العلن عنه‪.‬‬ ‫و المثال التالي يوضح برنامجا قمنا فيه بالعلن عن فصيلة ودالة البناء تقوم بعملية‬ ‫تخصيص القيم التي تأخذها لبيانات الفصيلة ) ‪) a , b‬‬ ‫‪CODE‬‬

‫{ ‪”# include “iostream.h class MyClass { ;int a,b :public (MyClass )int i, int j‬‬ ‫; } ‪;a=i ;b=j } ()void Show { “ <
‫مصفوفة الكائنات‪ :‬المصفوفة هي مجموعة من العناصر من نفس النوع‪ ،‬وجرت العادة أن نعرف‬ ‫مصفوفات من أنواع المتغيرات المتاحة في اللغة‪ .‬و مع لغة ‪ ++C‬يتمكن المبرمج من العلن‬ ‫عن مصفوفة من الكائنات أيضا بنفس الكيفية التي يستخدمها للعلن عن مصفوفة من المتغيرات‬ ‫العادية‪.‬‬ ‫والمثال التالي يوضح كيفية العلن عن مصفوفة الكائنات‬ ‫‪CODE >#include
‫استعمال المؤشرات مع الكائنات المؤشرات ) ‪ ) pointers‬في لغات البرمجة لها أهميتها‬ ‫القصوي ) والتي قد ل يدركها المبتدئ ( ونتيجة لهذة الهمية ظهرت الحاجة لستخدام‬ ‫المؤشرات مع الكائنات‪ .‬وتدعم لغة ‪ ++C‬استخدام المؤشرات مع الكائنات‪ ،‬ويتم العلن عن‬ ‫مؤشر لكائن ما وللعلن عن مؤشر لكائن من الفصيلة ) ‪ ) Date‬الموضحة في المثال السابق‬ ‫‪ ) ;*dptr‬كما بالمثال التالي نستخدم العبارة ) ‪Date‬‬ ‫)‪CODE #include day Date.day=4‬‬ ‫‪date‬ومؤشر إلى كائن ) ‪ ، )dptr‬ومعاملة كل منهما تختلف عن الخر حيث نستخدم المؤثر ) ‪>-‬‬ ‫‪ ) day‬فيه بينما استخدمنا المؤثر ) ‪ (.‬مع ( مع المؤشر للكائن للوصول إلى البيان )‬ ‫الكائن ) ‪.) date‬‬ ‫ويجب توخي الحرص دائما عند التعامل مع المؤشرات لتلفي الخطاء التي يمكن أن تحدث‪.‬‬

‫تم بحمد ال‬