The words you are searching are inside this book. To get more targeted content, please make full-text search by clicking here.

ترجمة لدرس تعلّم البرمجة بلغة السي الخاص بموقع OpenClassrooms

Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by Hamza Abbad, 2017-08-03 11:01:25

تعلّم البرمجة بلغة C

ترجمة لدرس تعلّم البرمجة بلغة السي الخاص بموقع OpenClassrooms

‫مق ّدمة‬

‫إن التحر ّر الفكري في بداية القرن العشرين أدّى إلى تو ّسع في البحوث العلمية التي شملت كل الميادين لاس ّيما‬
‫التكنولوجية منها كعلوم الحاسوب‪ .‬هذه الأخيرة أعقبتها ثورة في لغات البرمجة التي تعتبر ركيزة أساسية تقوم عليها‬
‫البرامج‪ .‬من بين هذه اللغات نجد لغة الـ‪ ،C‬إذ تعتبر من أقوى لغات البرمجة و أكثرها شيوعا ً‪ ،‬فهي مستلهمة من‬
‫طرف لغتي ‪ B‬و ‪ BCPL‬حيث تم ّ تطويرها في عام ‪ 1972‬من طرف ‪ Ken Thompson‬و ‪،Dennis Ritchie‬‬
‫و في ظرف سنة واحدة تو ّسعت لتكون عِـماد نظام التشغيل ‪ UNIX‬بنسبة ‪ 90%‬ثم تم توز يعها في العام المـ ُوالي‬
‫رسميا ً عبر الجامعات لتصبح بذلك لغة برمجة عالمية‪ .‬و اشتهرت لغة الـ‪ C‬كونـ ُها لغة عالية المستوى‪ ،‬لها مُترجم‬
‫سر يع و فعّال‪ .‬كما أنها لغة برمجية ن ّقالة‪ ،‬هذا يعني أن أي برنامج يحـترم المعيار ‪ AINSI‬يمكن أن يتم ّ تشغيله على أي ّة‬

‫من ّصة تحتوي على مترجم ‪ C‬دون أي ّة تخصيصات‪.‬‬
‫يعتبر هذا الكتاب بوابة سهلة لك ّل مبتدئ لتعلّم لغة الـ‪ C‬خطوة بخطوة بدء ً من الأساسيات وصولا ًإلى تطوير‬
‫ألعاب ثنائية الأبعاد و التحكّم في هياكل البيانات الأكثر تعقيدا ً‪ .‬الكتاب مرفق بجملة من التمارين و الأعمال‬
‫التطبيقية المحلولة التي تساعد على هضم المفاهيم المكتسبة و تطبيقها على أ ّي مشكل برمجي مهما كان نوعه‪ .‬و لأن‬
‫الـكثير من لغات البرمجة تعتمد أساسا ً على الـ‪ C‬كالـ‪ Java‬و الـ‪ C++‬و الـ‪) C#‬لغات برمجية غرضية التوجّه( و‬
‫حتى ‪) PHP‬لغة لبرمجة المواقع( فإن تعلّم لغة الـ‪ C‬سيساعد على تعلّم أي ّة لغة برمجية كانت‪ .‬تبقى الإرادة و ح ّب‬

‫العمل و الشغف المفاتيح الرئيسية للنجاح و الوصول إلى الاحترافية‪.‬‬

‫عدن بلواضح‬
‫‪ 3‬أوت ‪ -2017‬الجزائر‬

‫‪1‬‬

‫تح ّب تعلّم البرمجة لـكن لا تعرف من أين تبدأ ؟ هذه الدروس لتعليم لغة الـ‪ C‬للمبتدئين قد ُجعلت خ ّصيصا ً‬
‫من أجلك !‬

‫لغة الـ‪ C‬هي لغة لا مفر ّ منها‪ُ ،‬أستلهمَت منها العديد من اللغات الأخرى‪ .‬تم ّ اختراعها في السبعينات و لا‬
‫تزال مستعملة لح ّد الآن في البرمجة النظامية و عالم الروبوتات‪ .‬تعتبر لغة الـ‪ C‬لغة مع ّقدة‪ ،‬لـكن إن استطعت‬

‫تعل ّمها ستكوّن لك قاعدة برمجية صلبة !‬
‫في هذه الدروس‪ ،‬ستبدأ باكتشاف مبدأ عمل الذاكرة‪ ،‬المتغيرات‪ ،‬الشروط و الحلقات‪ .‬ثم ستقوم باستعمال‬
‫ك ّل ما تعل ّمته في إنشاء واجهات رسومية بالاستعانة بالمكتبة ‪) SDL‬ألعاب فيديو‪ ،‬تسجيلات صوتية …(‪ .‬أخيرا ً‪،‬‬
‫ستتعلّم كيف ٺتعامل مع هياكل البيانات الأكثر شيوعا ًمن أجل تنظيم المعلومات في الذاكرة ‪ :‬قوائم متسلسلة‪،‬‬

‫مكدّسات‪ ،‬طوابير‪ ،‬جداول تجزئة …‬
‫التحق بي في هذه الدروس من أجل اكتشاف البرمجة بلغة الـ‪! C‬‬

‫بعض الإنجازات ال ّتي سنقوم بها في هذا الكتاب‬

‫‪Mathieu Nebra‬‬

‫مؤسس مشارك لموقع ‪OpenClassrooms‬‬

‫‪2‬‬

‫الجزء ا‬

‫أساسي ّات البرمجة بلغة الـ‪C‬‬

‫‪3‬‬



‫الفصل ا‪1.‬‬

‫قلت برمجة ؟‬

‫ا‪ 1.1.‬ما هي البرمجة ؟‬

‫ما الذي تعنيه كلمة ”ب َرْ َمج َ”؟‬

‫لن أتعبك وأعطيك أصل كلمة ”ب َرْ َمج َ”‪ ،‬لـكنني سأختصر كل شيء في جملة ‪ :‬البرمجة تعني إنشاء برامج حاسوب‪.‬‬
‫وهذه البرامج التي تنشئها تأمر الجهاز بالقيام بتعليمات وأفعال معي ّنة‪ .‬حاسوبك الخاص يحتوي على كثير من هذه‬

‫البرامج وبمختلف أنواعها ‪:‬‬
‫• الآلة الحاسبة تعتبر برنامجا ً‪.‬‬
‫• معالج النصوص يعتبر برنامجا ًأيضا ً‪.‬‬

‫• وكذلك برنامج المحادثة‪.‬‬
‫• ألعاب الفيديو هي برامج كذلك‪.‬‬
‫‪5‬‬

‫الفصل ا‪ .1.‬قلت برمجة ؟‬

‫نسخة عن لعبة ‪ MetalSlug‬الشهيرة تم إنشاؤها من طرف العضو ‪joe87‬‬
‫باختصار البرامج موجودة في كل جهاز‪ ،‬وهي التي تعطي الحاسوب قدرته على إنجاز مختلف المهام التي ُتخ َوّل إليه‪.‬‬

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

‫يتطلب ذلك جهدا كبيرا ً !‬
‫وبما أننا في بداية الطر يق‪ ،‬ف ّإننا لن نقوم بإنشاء لعبة ثلاثية الأبعاد ! لـكن ّنا سنبدأ بكيفية عرض نص على‬

‫الشاشة‪ ،‬طبعا ستقول ما علاقة هذا بإنشاء الألعاب ؟ لـكن ث ِق بي‪ ،‬هذا الأمر ليس بسيطا كما يبدو !‬
‫بالطبع هذا ليس شيئا مُبهرا ً‪ ،‬ولـكن يجب علينا أن نبدأ من هنا؛ وشيئا فشيئا يمكنك أن تنشئ برامج مع ّقدة‬

‫أكثر‪ .‬فالهدف من هذا الكتاب هو أن أعرفك على كل ما يتعلق بهذه اللغة‪.‬‬

‫ا‪ 2.1.‬البرمجة‪ ،‬بأي لغة يا ترى ؟‬

‫حاسوبك هو آلة غريبة جدا ً‪ ،‬هذا أقل ما يمكن أن نقوله عنه‪ .‬يمكننا أن نخاطبه فقط بالصفر والواحد‪،‬‬
‫فمثلا إذا طلبنا منه حساب ‪ 3+5‬فيمكن لهذا أن يعطينا نتيجة كالتالي )هذه ليست ترجمة دقيقة ولـكنها تشبه ما‬

‫يحدث بالفعل(‪0010110110010011010011110 :‬‬
‫ما ت َر َاه هنا يسمى اللغة الثنائية )‪ (Binary language‬أو لغة الآلة )‪ ،(Machine language‬وحاسوبك لا‬

‫يفهم سوى هذه اللغة‪ ،‬وكما تلاحظ‪ ،‬هذه اللغة غير مفهومة على الإطلاق !‬
‫مشكلتنا الآن ‪:‬‬

‫‪6‬‬

‫قليل من المفردات‬

‫كيف يمكننا التعامل مع حاسوب لا يفهم سوى اللغة الثنائية ؟‬

‫حاسوبك لا يتحدث الإنجليز ية‪ ،‬ولا العربية‪ ،‬ولا أي لغة غير هذه اللغة‪ ،‬ولـكنها صعبة جدا لدرجة أن‬
‫حتى أكبر خبراء الحاسوب لا يستخدمونها‪ .‬لهذا قام بعض مهندسي الحواسيب باختراع لغات يمكن أن ت ُت َر َجمَ‬
‫إلى اللغة الثنائية‪ ،‬لـكن الشيء الأصعب هو إنشاء البرامج ال ّتي تقوم بهذه الترجمة‪ .‬ولحسن الحظ فقد قاموا بهذا‬
‫العمل نيابة عنا‪ .‬هذه البرامج تقوم بترجمة الأوامر ال ّتي تكتبها )مثلا ‪ُ ” :‬أحسب ‪ (”3+5‬إلى شيء يشبه هذا ‪:‬‬

‫‪. 0010110110010011010011110‬‬
‫هذا المخطط يلخص ما كنت أشرح ‪:‬‬

‫ا‪ 3.1.‬قليل من المفردات‬

‫حت ّى الآن كنت أتح ّدث إليك بكلمات بسيطة‪ ،‬لـكن يجب أن تعلم أنه في المعلوماتية توجد مصطلحات علمية‬
‫لكل ما ذكرت‪ .‬طوال هذا الكتاب‪ ،‬سوف ٺتعلم استخدام المفردات المناسبة‪ .‬هذا سيفيدك كثيرا خصوصا عندما‬

‫تتحدث مع مبرمجـين آخرين‪ ،‬حيث أنك سوف ٺتفاهم معهم بكل سهولة‪.‬‬
‫نعود إلى الحديث عن المخطط السابق‪ .‬في المستطيل الأول قلت أن ”برنامجك مكتوب بلغة مُب َ َ ّسطة”‪ ،‬في‬
‫الواقع هذا النوع من اللغات ي ُعرف باسم لغات البرمجة عالية المستوى )‪.(High-level programming languages‬‬
‫هناك مستو يات عديدة من لغات البرمجة‪ ،‬وكلما كان مستوى اللغة أعلى كانت أقرب إلى اللغة الحقيقية وكان‬
‫استخدامها أسهل‪ .‬إذن‪ ،‬اللغات عالية المستوى سهلة الاستخدام لـكنها ٺتضمن بعض السلبي ّات سوف نتعر ّف‬

‫عليها لاحقا‪.‬‬
‫توجد العديد من لغات البرمجة‪ ،‬وهي متفاوتة المستوى‪ ،‬منها ‪:‬‬

‫•‪C‬‬
‫• ‪C++‬‬
‫• ‪Java‬‬
‫• ‪Visual Basic‬‬
‫• ‪Delphi‬‬

‫‪7‬‬

‫الفصل ا‪ .1.‬قلت برمجة ؟‬
‫• و العديد غيرها‬

‫كما تلاحظ‪ ،‬لم أرتبها حسب مستو ياتها‪ ،‬لذلك لا تعتقد أن اللغة الأولى في القائمة هي الأسهل أو العكس‪.‬‬
‫عموما‪ ،‬لائحة اللغات الموجودة طو يلة جدا لدرجة أنه لا يمكنني كتابتها كلها هنا‪.‬‬

‫مصطلح آخر يجب تذكّره هو الشفرة المصدر ية )‪ ،(Source code‬وهي ببساطة الشفرة الخاصة ببرنامجك‬
‫الذي تكتبه بلغة عالية المستوى والذي يتم ترجمته فيما بعد إلى اللغة الثنائية‪.‬‬

‫ثم يأتي دور البرنامج الذي يحوّل هذه اللغة عالية المستوى إلى اللغة الثنائية‪ ،‬هذا النوع من البرامج يعرف باسم‬
‫المترجم أو المصن ّف‪ ،‬والعملية ال ّتي يقوم بها تسمى الترجمة أو التصنيف‪.‬‬

‫يوجد لكل لغة عالية المستوى مترجم خاص‪ ،‬وهذا شيء منطقي‪ ،‬فاللغات مختلفة فيما بينها‪ ،‬فلا يمكننا‬
‫ترجمة لغة ‪ C‬بنفس الطر يقة ال ّتي نترجم بها ‪ Delphi‬مثلا‪ .‬بعض اللغات مثل ‪ C‬تملك العديد من المترجمات‪،‬‬
‫فمنها من هو مكتوب من طرف ‪ ، Microsoft‬و منها من ‪ ، GNU‬إلخ …سوف نتعر ّف على كل هذا في‬
‫الفصل القادم‪ .‬لحسن الحظ‪ ،‬هذه المترجمات متطابقة تقريبا )رغم وجود اختلافات طفيفة بينها سوف‬

‫نتعرف عليها لاحقا(‪.‬‬
‫أخيرا‪ ،‬البرنامج الثنائي المنشئ بواسطة المترجم يسمى الملف القابل للتنفيذ أو التنفيذي )‪ .(Executable‬لهذا‬

‫السبب تملك البرامج )على الأقل برامج ‪ (Windows‬الامتداد ‪ .exe‬والذي هو اختصار كلمة ‪.EXEcutable‬‬
‫نعود إلى مخططنا السابق‪ ،‬وهذه المرة سنستخدم المصطلحات الصحيحة ‪:‬‬

‫ا‪ 4.1.‬لماذا نختار تعلّم ‪C‬؟‬

‫كما قلت سابقا‪ ،‬يوجد كثير من اللغات عالية المستوى‪ ،‬فلماذا ينبغي علينا أن نبدأ بإحداها على وجه الخصوص‬
‫؟ سؤال عظيم !‬

‫على أية حال يجب علينا أن نختار بأي لغة سنبدأ البرمجة عاجلا أم آجلا‪ ،‬وبالتالي لديك الخيار في البدء بـ ‪:‬‬
‫• لغة ذات مستوى عالي ج ّدا ‪ :‬وتكون سهلة ج ّدا أوعامة‪ ،‬نذكر من بينها ‪،Visual Basic ،Ruby ،Python‬‬
‫وغيرها‪ .‬هذه اللغات تسمح بكتابة برامج بشكل أسرع‪ .‬عامّة تحتاج لأن ت ُرفق معها ملفات مُسَاعِدة لـكي‬

‫تعمل )ك َم ُفَسِّرٍ مثلا(‪.‬‬

‫‪8‬‬

‫لماذا نختار تعلّم ‪C‬؟‬

‫• لغة ذات مستوى منخفض قليلا ‪ :‬هي أكثر صعوبة نوعا ما‪ ،‬ولـكن مع لغة مثل ‪ C‬سوف ٺتعلم كثيرا‬
‫عن البرمجة وحول طر يقة عمل حاسوبك‪ .‬ستكون بعد ذلك قادرا ً على تعلّم لغة برمجة أخرى إن أردت‬

‫وبكل ي ُس ْرٍ‪.‬‬

‫من ناحية أخرى‪ C ،‬لغة برمجة واسعة الإنتشار‪ُ ،‬أستخدمت في برمجة العديد من البرامج التي تعرفها‪ .‬حتى أنها‬
‫كثيرا ما تدرّس في الدراسات العليا في مجال المعلوماتية‪ .‬هذه هي الأسباب ال ّتي جعلتني أتحم ّس لتعليمك لغة‬
‫‪ C‬بالتحديد‪ .‬لم أقل أن ّه يجب عليك أن تبدأ بها‪ ،‬لـكن ّي قلت إنه خيار جي ّد لـكي أق ّدم لك معرفة صلبة في هذا‬

‫الكتاب‪.‬‬

‫بعض لغات البرمجة مو ّجهة أكثر للشبكة العنكبوتية )‪ (Web‬مثل ‪ PHP‬أكثر منها لإنشاء البرامج المعلوماتية‪.‬‬

‫سوف أفترض في هذا الكتاب أ ّن هذه هي لغة برمجتك الأولى وأن ّه لم يسبق لك أن برمجت من قبل‪ .‬فإن‬
‫كنت قد برمجت قليلا من قبل فلا مضرّة في أن تعيد من الصفر‪.‬‬

‫ما هو الفرق بين ‪ C‬و ‪ C++‬؟‬

‫هاتان اللغتان قريبتان ج ّدا من بعضهما‪ ،‬وكلاهما مستخدمتان بكثرة‪ .‬ولـكي تعرف كيف نشأتا يجب عليك‬
‫أن تدرس التاريخ قليلا ‪:‬‬

‫• في البداية‪ ،‬عندما كانت الحواسيب ت َزِنُ أطنانا وتشغل مكانا ق َ ْدرُهُ حجم منزلك‪ ،‬تم ّ اختراع لغة برمجة تسمّى‬
‫‪.Algol‬‬

‫• بعدها تطوّرت الأمور أكثر واخت ُرعَت لغة برمجة جديدة عُرِف َ ْت باسْ ِم ‪ CPL‬وال ّتي تطوّرت فيما بعد إلى لغة‬
‫‪ BCPL‬ثم أخذت إسم اللغة ‪.B‬‬

‫• مع مض ّي الزمن تو ّصل الخـبراء إلى ابتكار اللغة ‪ C‬وقد تم ّ إدخال بعض التعديلات عليها إلّا أنها لا تزال‬
‫من أحد اللغات الأكثر استخداما اليوم‪.‬‬

‫• وبعد زمن‪ ،‬أراد الخـبراء أن يضيفوا بعض الأشياء إلى ‪ ، C‬يمكن اعتبارها نوعا من التحسينات‪ .‬والنتيجة‬
‫كانت بما يعرف بلغة ‪ ، C++‬وهي لغة ‪ C‬مع إضافات تم ّكننا من البرمجة بطر يقة مختلفة‪.‬‬

‫الـ‪ C++‬ليست أحسن من الـ‪ ، C‬هي فقط تمكننا من البرمجة بطر يقة مختلفة وتساعد المبرمج على تنظيم شفرة‬
‫برنامجه‪ .‬رغم ذلك هي تشبه الـ‪ C‬كثيرا‪ .‬وإن كنت تنوي تعلّم الـ‪ C++‬فيما بعد ف َسَوْ َف تجد ذلك سهلا‪.‬‬

‫ولو اعت ُبرت ‪ C++‬تطويرا لـ‪ C‬فإن هذا لا يعني أنه يجب استخدام ‪ C++‬فقط لإنشاء البرامج‪ .‬لغة ‪ C‬ليست‬
‫لغة عجوزا منسي ّة‪ ،‬بالعكس هي مستخدمة بكثرة اليوم‪ .‬بل إنها أساس أنظمة التشغيل الـكبيرة مثل ‪) Unix‬ومنه‬

‫‪ GNU/Linux‬و ‪ (Mac OS‬و ‪.Windows‬‬

‫‪9‬‬

‫الفصل ا‪ .1.‬قلت برمجة ؟‬

‫ا‪ 5.1.‬هل البرمجة صعبة ؟‬

‫هذا سؤال يع ّذب روح كل من يريد تعلّم البرمجة ! هل يجب أن تكون أستاذ ر ياضيات كبير درس ‪10‬‬
‫سنوات من التعليم العالي حت ّى تبدأ البرمجة ؟‬

‫الجواب هو لا بالطبع‪ .‬كل ما تحتاج إليه هو معرفة العمليات الأربع الأساسية ‪:‬‬
‫• الجمع‬

‫• الطرح‬
‫• الضرب‬
‫• القسمة‬
‫هذا ليس مخيفا ! سوف أشرح لك في فصل لاحق كيف يقوم الحاسوب بهذه العمليات الأساسية في برامجك‪.‬‬
‫باختصار‪ ،‬لا توجد صعوبات غير قابلة للح ّل‪ .‬في الواقع‪ ،‬هذا يعتمد على طبيعة برنامجك‪ ،‬فإذا كنت تريد‬
‫إنشاء برنامج تشفير فيجب عليك معرفة بعض الأشياء في الر ياضيات‪ ،‬وإن كان برنامجك يقوم بالرسم ثلاثي الأبعاد‬
‫فيجب أن تكون لديك بعض المعرفة بالهندسة الفضائية‪.‬‬
‫كل حالة تعامل بطر يقة خا ّصة‪ .‬ولـكن لتعلّم لغة ‪ C‬نفسها لا تحتاج إلى أي ّة معارف قبلي ّة‪.‬‬

‫إذن أين هو الفخ ؟ وأين تكمن الصعوبة ؟‬

‫يجب أن تعرف كيف يعمل الحاسوب‪ ،‬لتفهم ما ال ّذي نقوم به في ‪ .C‬من هذا المنطلق‪ ،‬كن متي ّقنا أن ّي‬
‫سأعل ّمك ك ّل هذا شيئا فشيئا‪.‬‬

‫اعلم أن للمبرمج صفات أيضا مثل ‪:‬‬

‫• الصبر ‪ :‬البرنامج لا يعمل عادة من أ ّول محاولة‪ ،‬يجب أن تكون مثابرا ً‪.‬‬
‫• ح ّس المنطق ‪ :‬صحيح أن ّك لست بحاجة إلى أن يكون لديك مستوى جي ّد في الر ياضي ّات‪ ،‬لـك ّن هذا لا‬

‫يمنع من التفكير وتحليل المشكلات بالمنطق‪.‬‬
‫• الهدوء ‪ :‬فيجب عليك ألّا تضرب حاسوبك بالمطرقة‪ ،‬فهذا لن يجعل برنامجك يعمل !‬

‫‪10‬‬

‫الفصل ا‪2.‬‬

‫الحصول على الأدوات اللازمة‬

‫بعد تجاوزنا لفصل تمهيدي مليئ بالثرثرة سوف نبدأ بالدخول في صلب الموضوع‪ .‬سوف نجيب عن السؤال‬
‫التالي ‪” :‬ما هي البرامج التي نحتاج إليها للبدء في البرمجة ؟”‪.‬‬

‫لا يوجد شيء صعب في هذا الفصل‪ ،‬سوف نأخذ وقتنا للتأقلم على هذه البرامج الجديدة‪.‬‬
‫اغتنم الفرصة ! في الفصل التالي سنبدأ ح ّقا في البرمجة و لن يكون هناك وقت للقيلولة !‬

‫ا‪ 1.2.‬الأدوات اللازمة للمبرمج‬

‫إذن ما هي الأدوات التي نحتاج إليها ؟ إذا تابعت الفصل السابق جي ّدا‪ ،‬فستعرف واحدا على الأقل !‬
‫هل تعلم عم ّا أتح ّدث ؟ ح ّقا لا ؟‬

‫حسنا‪ ،‬نحن نتح ّدث عن المترجم الذي يم ّكن من ترجمة لغة الـ‪ C‬إلى اللغة الثنائيّة !‬
‫كما قلت لك في الفصل الأوّل‪ ،‬يوجد العديد من المترجمات للغة الـ‪ .C‬سنرى أن اختيار المترجم ليس أمرا‬

‫مع ّقدا في حالتنا هذه‪.‬‬
‫ما الذي نحتاج إليه أيضا ؟ لن أتركك تخم ّن كثيرا و سأعطيك القائمة ‪:‬‬
‫• محر ّر نصوص )‪ (Text Editor‬لكتابة الشفرة المصدر ية الخا ّصة بالبرنامح‪ .‬نظريّا برنامج تحرير نصوص بسيط‬
‫مثل ‪ Notepad‬على ‪ Windows‬أو ‪ vi‬على ‪ Unix‬يكفي‪ ،‬لـكن من الأحسن استخدام محر ّر نصوص ذكيّ‬

‫يقوم بتلوين الشفرة المصدر ية لـكي يسهّل عليك العمل‪.‬‬
‫• مترجم لتحو يل الشفرة المصدر ية إلى ملف ثنائي‪.‬‬

‫‪11‬‬

‫الفصل ا‪ .2.‬الحصول على الأدوات اللازمة‬

‫• المن ّقح )‪ (Debugger‬لمساعدك على كشف الأخطاء في برنامجك‪ .‬لسوء الحظ‪ ،‬لم نتم ّكن بعد من ابتكار‬
‫”المص ّحح” ال ّذي يص ّحح أخطائك لوحده‪ .‬لـكن‪ ،‬إن أحسنت استخدام المن ّقح‪ ،‬يمكنك ببساطة إيجاد‬

‫الأخطاء‪.‬‬

‫وجود مكتشف الأخطاء لا يعنى أن ٺتصرف بتهوّر و تسرع في كتابة برنامج مليء بالأخطاء‪ ،‬بل تريّث و كن‬
‫هادئا ً‪.‬‬

‫من الآن لدينا خياران ‪:‬‬

‫• إمّا أن نحصل على البرامج الثلاثة متفر ّقة و هذه هي الطر يقة الأكثر تعقيدا‪ ،‬و لـكنّها تعمل‪ .‬على ‪GNU/Linux‬‬
‫تحديدا‪ ،‬عدد كبير من المبرمجـين يف ّضلون استخدام ك ّل برنامج على حدة‪ .‬لن أشرح هذه الطر يقة هنا‪ ،‬بل‬

‫سأتح ّدث عن الطر يقة الأسهل‪.‬‬
‫• أو أن تحصل على برنامج ”ثلاثة في واحد” يتضمّن محر ّر النصوص و المترجم و المن ّقح‪ .‬هذا النوع من البرامج‬
‫يعرف باسم ”بيئات التطوير المتكاملة” )‪ (Integrated Development Environments‬و تسمّى اختصارا‬

‫‪.IDE‬‬

‫يوجد العديد من بيئات التطوير‪ .‬بداية‪ ،‬قد تواجه صعوبة في اختيار البيئة الملائمة لك‪ .‬الشيء الأكيد هو ‪:‬‬
‫أي بيئة مهما كانت ستحقق لك العمل المطلوب‪.‬‬

‫اختيار البيئة الخاصة بك‬

‫بدا لي أنه من الأفضل أن أر يك بعضا من البيئات الشهيرة و المجانيّة في نفس الوقت‪ .‬شخصي ّا‪ ،‬أنا أستخدمها جميعا‬
‫و أختار في كل يوم واحدا منها‪.‬‬

‫• أحد هذه البيئات ال ّتي أف ّضلها هو ‪ .Code::Blocks‬هو مج ّاني و يعمل على أغلب أنظمة التشغيل‪ .‬أنصح‬
‫ك ّل مبتدئ أن يختاره للبدء )و في ما بعد أيضا إذا شعرت أن ّه يلائمك جي ّدا !(‪.‬‬
‫يعمل على أنظمة التشغيل ‪ Mac OS ،Windows‬و ‪.GNU/Linux‬‬

‫• الأكثر شهرة على ‪ Windows‬هو ال ّذي أنشأته ‪ ،Microsoft‬إن ّه ‪ .Visual C++‬هو برنامج مدفوع )و باهظ‬
‫الثمن( لـكن لحسن الح ّظ توجد نسخة مجانية منه تسمّى ‪) Visual Studio Express‬أنا أستخدم النسخة‬
‫القديمة ‪ Visual C++ Express‬في هذا الكتاب(‪ .‬و هي ممتازة ج ّدا )بينها و بين النسخة المدفوعة فوارق‬

‫طفيفة(‪ .‬إنه برنامج كامل و يملك من ّقحا قويّا‪.‬‬
‫يعمل على ‪ Windows‬فقط‪.‬‬

‫• على ‪ Mac OS X‬يمكنك استخدام ‪ Xcode‬ال ّذي يفترض أن يكون متوف ّرا على قرص ٺثبيت النظام‪.‬‬
‫يناسب كثيرا مبرمجي ‪.Mac‬‬
‫يعمل على ‪ Mac OS X‬فقط‪.‬‬

‫‪12‬‬

‫‪Windows, Mac OS X, GNU/Linux)) Code::Blocks‬‬

‫ملاحظة لمستخدمي ‪ : GNU/Linux‬يوجد العديد من البيئات لهذا النظام‪ ،‬و لـكن المبرمجـين المحترفين‬
‫قد يف ّضلون تجاوز البيئات و القيام بالترجمة ”يدويّا”‪ ،‬و هو شيء أصعب قليلا‪ .‬نحن سنبدأ باستخدام‬
‫بيئات تطوير ية‪ .‬لذلك أنصحك بثبيت ‪ Code::Blocks‬إن كنت على ‪ GNU/Linux‬لـكي تتمكن من متابعة‬

‫شروحاتي‪.‬‬

‫من هي البيئة الأفضل من بين ك ّل بيئات التطوير هذه؟‬

‫كل واحدة من هذه البيئات تمكنك من البرمجة و متابعة بقي ّة الكتاب من دون أي ّة مشاكل‪ .‬بعضها كامل‬
‫أكثر من ناحية المميزات‪ ،‬و أخرى سهلة الإستخدام أكثر‪ ،‬ولـكن في ك ّل الأحوال البرامج ال ّتي تنشؤها تكون‬

‫ذاتها أيّا كانت البيئة التي ا ِ ْخت َرْتها‪ .‬فهذا الخيار ليس بالأهم ّية ال ّتي تعتقدها‪.‬‬
‫في هذا الكتاب سوف أستخدم ‪ .Code::Blocks‬فإن أردت الحصول على نفس لقطات الشاشة خا ّصتي‪،‬‬

‫خصوصا لـكي لا تضيع في البداية‪ ،‬أنصحك ب ِدَاي َة ً بتثبيت ‪.Code::Blocks‬‬

‫ا‪Windows, Mac OS X, GNU/Linux)) Code::Blocks 2.2.‬‬

‫‪ Code::Blocks‬هي بيئة تطوير متكاملة حرّة و مجانيّة‪ ،‬متوف ّرة للـ‪ Mac ،Windows‬و ‪.GNU/Linux‬‬
‫حالي ّا ‪ Code::Blocks‬متوف ّر بالإنجليز ي ّة فقط‪ .‬لـكن هذا ليس أمرا يدعوك إلى تجن ّب استخدامه ! فنحن‬

‫قل ّما نحتاج إلى العمل بقوائم واجهته‪ ،‬فلغة ‪ C‬هي ال ّتي تهمّنا‪.‬‬
‫كن على علم أنه عندما تبرمج سوف تقابل عادة توثيقا بالإنجليز ية‪ .‬هذا سبب آخر يدفعك للتدرّب على‬

‫استخدام هذه اللغة‪.‬‬

‫تنز يل ‪Code::Blocks‬‬

‫توجّه إلى صفحة تنز يل ‪Code::Blocks‬‬

‫‪http://www.codeblocks.org/downloads/binaries‬‬

‫ثم ّ نزّل الملف الذي يناسب نظامك ‪:‬‬

‫• إذا كنت تستخدم ‪ ،Windows‬إذهب إلى القسم ”‪ ”Windows‬في أسفل الصفحة‪ .‬نزّل البرنامج ال ّذي‬
‫يحوي ‪ mingw‬في اسمه )مثلا ‪ .( codeblocks-10.05mingw-setup.exe :‬النسخة الأخرى‬

‫لا تحوي مترجما‪ ،‬لن تتمكن في حال استخدمتها من ترجمة برامجك !‬
‫• إذا كنت تستخدم ‪ ،GNU/Linux‬اختر الحزمة ال ّتي تناسب توز يعتك‪.‬‬

‫‪13‬‬

‫الفصل ا‪ .2.‬الحصول على الأدوات اللازمة‬
‫• إذا كنت تستخدم ‪ ،Mac‬اختر الملف الأحدث في القائمة‪ ،‬مثلا ‪. codeblocks-10.05-p2-mac.zip :‬‬

‫أقول و أكر ّر ‪ :‬إذا كنت تستخدم ‪ Windows‬فيجب عليك تنز يل النسخة ال ّتي يتضمَن اسمها كلمة ‪mingw‬‬
‫لأن ّه إذا اخترت النسخة الخاطئة فلن تتم ّكن من ترجمة برامجك فيما بعد !‬

‫التثبيت بسيط و سر يع‪ .‬أترك جميع الخيارات كما هي و شغّل البرنامج‪ .‬سوف تظهر لك نافذة شبيهة بهذه ‪:‬‬

‫نميّز أربعة أقسام رئيسية في واجهة البرنامج‪ ،‬و هي مرق ّمة في الصورة ‪:‬‬
‫‪ .1‬شر يط الأدوات )‪ : (Toolbar‬يحتوي على كثير من الأزرار و لـكن ّنا سوف نستخدم بعضها فقط باستمرار‪،‬‬

‫سأعود للحديث عن هذا فيما بعد‪.‬‬
‫‪ .2‬قائمة ملفات المشروع ‪ :‬توجد بيسار النافذة‪ ،‬تحتوي على ك ّل الملفات المصدر ي ّة المتعلقة بالبرنامج الذي‬
‫تعمل عليه‪ .‬تكون فارغة في البداية لأننا لم ننشئ أي ملف لحد الآن‪ .‬سوف نبدأ بملأها خلال خمس‬

‫دقائق من الآن بتق ّدمك في هذا الفصل‪.‬‬
‫‪ .3‬المنطقة الرئيسية ‪ :‬هنا المساحة التي تكتب فيها الشفرة المصدر ية الخاصة ببرنامجك بلغة الـ‪.C‬‬
‫‪ .4‬منطقة الإشعار ‪ :‬و يدعوها البعض ”منطقة الموت”‪ ،‬هنا ت ُعْر َ ُض أخطاء الترجمة إذا كانت شفرة البرنامج‬

‫تحوي خطأ ً ما‪ .‬هذا الشيء يحدث كثيرا !‬
‫‪14‬‬

‫‪Windows, Mac OS X, GNU/Linux)) Code::Blocks‬‬
‫ما يهمّنا الآن هو قسم محدد من شر يط الأدوات‪ .‬تجد فيه الأزرار التالية )بهذا الترتيب( ‪، Compile :‬‬
‫‪ Recompile everything ، Compile & Execute ، Execute‬تذكّرهم جي ّدا لأننا سنستخدمهم‬

‫بانتظام‪.‬‬

‫و هذا شرح عمل ك ّل واحد من هذه الأزرار ‪:‬‬

‫• ‪ : Compile‬كل مل ّفات الشفرة المصدر ية ال ّتي كتبتها يتم ارسالها إلى المترجم ال ّذي يقوم بإنشاء الملف‬
‫التنفيذي في حالة عدم وجود أخطاء‪ .‬أمّا في حالة العثور على أخطاء )و هذا سيحدث عاجلا أم آجلا !(‬

‫فلن يتم ّ إنشاؤه بل يعرض رسائل خطأ في منطقة الإشعار‪.‬‬
‫• ‪ : Execute‬يقوم بتشغيل آخر ملف تنفيذي تم ّت ترجمته‪ .‬يعني أنك ستستخدم هذا الزر لاختبار برامجك‬

‫ال ّتي أنشأتها‪ .‬طبعا يجب عليك ترجمة البرنامج قبل تشغيله‪ .‬يمكننا أيضا استخدام الزرّ الثالث‪.‬‬
‫• ‪ : Compile & Execute‬لا يجب أن تكون عبقر يا لـكي تعرف أن ّه ليس إلا مجموع الزرّين السابقين‪ .‬في‬
‫الواقع هذا هو الزرّ ال ّذي ستستخدمه أكثر‪ .‬في حالة ما إذا حدثت أخطاء في الترجمة لن يتم ّ تشغيل البرنامج‬

‫بل ست ُعرض قائمة جميلة من الأخطاء التي يجب عليك تصحيحها أ ّولا !‬
‫• ‪ : Recompile everything‬عندما نستخدم ‪ Compile‬يقوم ‪ Code::Blocks‬في الحقيقة بترجمة الملفات‬
‫ال ّتي ع ّدلتها فقط‪ .‬أحيانا ‪-‬فقط أحيانا‪ -‬قد تحتاج إلى إعادة ترجمة جميع المل ّفات‪ .‬سنتح ّدث لاحقا عن‬
‫فائدة هذا الزر و أيضا عن كيفية عمل الترجمة بمزيد من التفصيل‪ .‬حاليا لـكي لا تختلط الأمور عليك‬

‫يمكنك أن تعتبر أن ّه غير مه ّم‪.‬‬

‫أنصحك باستخدام اختصارات لوحة المفاتيح بدلا من الضغط على الأزرار‪ ،‬لأن ّه شيء نكر ّره كثيرا‪ .‬تذكّر‬
‫خصوصا أن ّه يمكنك الضغط على ‪ F9‬بدل الزر ‪. Compile & Execute‬‬

‫إنشاء مشروع جديد‬

‫لإنشاء مشروع جديد إذهب إلى قائمة ‪ File‬ثم ّ ‪ New‬ثم ّ ‪ . Project‬من النافذة ال ّتي تظهر اختر‬
‫‪. Console application‬‬

‫‪15‬‬

‫الفصل ا‪ .2.‬الحصول على الأدوات اللازمة‬

‫كما ت َر َى‪ Code::Blocks ،‬يقترح عليك إنشاء عدد معتبر من أنواع البرامج ال ّتي تستخدم مكتبات‬
‫)‪ (Libraries‬معروفة مثل ‪ SDL‬للـ‪ 2D‬و ‪ OpenGL‬للـ‪ 3D‬و ‪ Qt‬و ‪ wxWidgets‬لإنشاء النوافذ الرسومي ّة‪.‬‬
‫حالي ّا‪ ،‬هذه الأيقونات ليست سوى للزينة لأ ّن المكتبات السابقة غير مثب ّتة على حاسوبك لهذا لا يمكنك‬
‫أن تجعلها تعمل‪ .‬سوف نعود لهذه الأنواع الأخرى لاحقا‪ .‬في هذه الأثناء لا يمكننا سوى أن نستخدم‬

‫الـ‪ Console‬لأن ّك لا تملك بعد المستوى اللازم لانشاء أنواع أخرى من البرامج‪.‬‬

‫أنقر على ‪ Go‬لانشاء المشروع الجديد‪ .‬ثم أنقر على ‪ Next‬فالصفحة الأولى ليس مهمّة‪ .‬بعدها سيأتيك‬
‫اختيار بين لغتي الـ‪ C‬أو الـ‪ ،C++‬اختر الـ‪.C‬‬

‫‪16‬‬

‫‪Windows, Mac OS X, GNU/Linux)) Code::Blocks‬‬

‫سي ُ ْطل َ ُب منك الآن إدخال اسم المشروع‪ ،‬و كذلك مسار المجل ّد الذي تختاره لحفظ المل ّفات فيه‪.‬‬

‫آخر خطوة ت ُطلب منك هي ‪ ،‬كيف ينبغي أن يترجم البرنامج‪ ،‬يمكنك ترك الخيارات على حالها‪ ،‬لن يكون‬
‫‪17‬‬

‫الفصل ا‪ .2.‬الحصول على الأدوات اللازمة‬
‫لهذا أي تأثير على ما سنقوم به الآن )تأكّد أن إحدى الخانتين ”‪ ”Release‬أو ”‪ ”Debug‬تكون مح ّددة على‬

‫الأقل(‪.‬‬

‫إضغط على ‪ ، Finish‬إنتهى !‬
‫لقد قام ‪ Code::Blocks‬بإنشاء المشروع الأ ّول و ملئه ببعض الشفرة المصدر ية‪.‬‬
‫في الخانة الخاصة بالمشار يع على اليسار‪ ،‬قم بتوسيعها بالضغط على ’ ‪ ’ +‬لـكي تظهر قائمة الملفات في المشروع‪.‬‬

‫سيكون لديك على الأقل ملف يسمّى ‪ . main.c‬هذا هو ك ّل شيء !‬

‫ا‪ Windows) Visual C++ 3.2.‬فقط(‬

‫بعض التذكيرات حول ‪: Visual C++‬‬
‫• إنها البيئة التطوير ية الخاصة بـ‪.Microsoft‬‬
‫• برنامج مدفوع في الأصل‪ ،‬لـكن توجد نسخة مج ّانية منه تسمّى ‪.Visual C++ Express‬‬
‫• تم ّكن من البرمجة باستخدام كلتا اللغتين ‪ C‬و ‪) C++‬و ليس فقط ‪ C++‬كما يوحي الاسم(‪.‬‬
‫طبعا ستقوم بتحميل النسخة المجانية ‪) Visual C++ Express‬احذر‪ ،‬هو غير متوافق مع ‪ Windows 7‬إلّا‬

‫بداية من النسخة ‪: (2010‬‬
‫‪18‬‬

‫‪ Windows) Visual C++‬فقط(‬

‫ما الفرق بين هذه النسخة و النسخة ”الحقيقي ّة” ؟‬
‫لا تحتوي على محر ّر موارد يسمح لك برسم الصور‪ ،‬الأيقونات أو النوافذ‪ .‬هذا لا يهمّنا لأنّنا لن نحتاج إلى‬

‫هذه الوظائف في هذا الكتاب‪ .‬وجود هذه الوظائف أمر مستحسن لـكن ّه ليس لازما‪.‬‬
‫للتنز يل‪ ،‬زر موقع ‪.Visual C++‬‬

‫‪https://msdn.microsoft.com/fr-fr/express/aa975050.aspx‬‬

‫و اختر تنز يل ‪ Community 2015‬و اختر لغتك المف ّضلة‪.‬‬

‫التثبيت‬

‫التثبيت سهل‪ .‬سوف يقوم البرنامج بتحميل آخر نسخة من الأنترنت تلقائيا‪.‬‬
‫أنصحك بترك الخيارات كما هي‪.‬‬

‫بعد ذلك سيطلب منك التسجيل في غضون ‪ 30‬يوما‪ .‬لا تقلق‪ ،‬إنه سر يع و مجاني لـكن يجب القيام بذلك‪.‬‬
‫اضغط على الرابط الم ُعطى لك‪ ،‬ستدخل موقع ‪ .Microsoft‬سج ّل دخولك باستخدام ‪Windows Live ID‬‬

‫)المكافئ لحساب ‪ Hotmail‬أو ‪ (MSN‬أو قم بإنشاء واحد إذا لم يكن لديك‪ ،‬ثم أجب بعد ذلك على الأسئلة‪.‬‬
‫سيتم إعطاؤك في النهاية مفتاح تفعيل‪ .‬انسخ هذا المفتاح في القائمة ? ثم ”تسجيل المنتج”‪.‬‬
‫‪19‬‬

‫الفصل ا‪ .2.‬الحصول على الأدوات اللازمة‬

‫إنشاء مشروع جديد‬

‫لإنشاء مشروع جديد‪ ،‬إذهب إلى قائمة ”ملف” ) ‪ ( File‬ثم ّ ”جديد” ) ‪ ( New‬ثم ”مشروع” ) ‪.( Project‬‬
‫اختر ‪ Win32‬في العمود الأيسر ثم ّ ‪ . Win32 Console Application‬ثم ّ أ ْد ِخل اسم مشروعك‪.‬‬

‫وافق‪ ،‬ستظهر لك نافذة جديدة‪.‬‬

‫هذه النافذة لا تحوي أ ّي شيء مه ّم‪ ،‬تابع فقط‪.‬‬
‫‪20‬‬

‫‪ Windows) Visual C++‬فقط(‬

‫اختر ‪ Console application‬و تأكّد من إنشاء مشروع فارغ عن طر يق تحديد ‪، Empty project‬‬
‫ثم اضغط على ”إنهاء” ) ‪.( Finish‬‬

‫إضافة ملف مصدري جديد‬

‫مشروعك فارغ لح ّد الآن‪ .‬لإضافة ملف مصدري‪ ،‬اضغط باليمين على ”الملفات المصدر ية” ) ‪( Source files‬‬
‫الموجود على اليسار‪ ،‬ثم ّ اختر ”إضافة” ) ‪ ( Add‬ثم ّ ”عنصر جديد” ) ‪.( New element‬‬

‫اختر ‪ Visual C++‬على اليسار ثم ّ ‪) C++ File‬أعلم ُأنّنا لا ندرس ‪ C++‬و لـكن ليس لهذا أهمي ّة هنا(‪.‬‬
‫أ ْد ِخل اسم الملف ‪main.c :‬‬

‫‪21‬‬

‫الفصل ا‪ .2.‬الحصول على الأدوات اللازمة‬

‫ثم اضغط على ”إضافة” ) ‪ .( Add‬سيتم إنشاء مل ّف فارغ‪ .‬أنصحك بحفظه بسرعة باسم ‪. main.c‬‬
‫انتهى‪ ،‬يمكنك الآن أن تبدأ في كتابة الشفرة‪.‬‬

‫النافذة الرئيسي ّة‬

‫لنرى ما هي أه ّم أقسام النافذة الرئيسي ّة في ‪.Visual C++ Express‬‬

‫‪22‬‬

‫‪ Mac OS X) Xcode‬فقط(‬

‫هذه النافذة تشبه مثيلتها في ‪ .Code::Blocks‬و لـكن رغم ذلك سوف نعيد رؤ ية معنى ك ّل جزء‪.‬‬

‫‪ .1‬شر يط الأدوات ‪ :‬فيه أزرار اعتيادية‪ .‬لـكن كما ترى لا يوجد أ ّي زرّ للترجمة‪ .‬يمكنك إضافته عن طر يق‬
‫النقر باليمين على هذا الشر يط و اختيار ”تنقيح” ) ‪ ( Debug‬و ”توليد” ) ‪ ( Generate‬من القائمة‪.‬‬

‫ك ّل هذه الأزرار لديها ما يكافئها في القوائم ‪ Debug‬و ‪ . Generate‬استخدام ‪ Generate‬ينشئ‬
‫الملف التنفيذي )أي أنها تعني الترجمة(‪ .‬إذا استخدمت ‪ Debug / Execute‬فسوف يقترح عليك‬

‫الترجمة قبل التشغيل‪ .‬إختصارات لوحة المفاتيح ‪ F7 :‬لتوليد المشروع و ‪ F5‬لتشغيله‪.‬‬
‫‪ .2‬هذه المساحة ج ّد مهمّة‪ ،‬إذ أنها تحتوي على الملفات الخاصة بمشروعك‪ .‬أنقر على ”مستكشف الحلول”‬
‫) ‪ ( Solution explorer‬في الأسفل إن لم يكن ف ُع ِل من قبل‪ .‬سوف ترى أن ّه قد تم ّ إنشاء مجل ّدات‬
‫لفصل أنواع المل ّفات المختلفة )مصدر ي ّة‪ ،‬رأسي ّة و موارد(‪ .‬سنتعرف لاحقا على مختلف أنواع الملفات التي‬

‫تكوّن المشروع‪.‬‬
‫‪ .3‬المساحة الرئيسية ‪ :‬التي نع ّدل فيها المل ّفات المصدر ي ّة‪.‬‬

‫أكملنا جولتنا في ‪ .Visual C++‬يمكنك إلقاء نظرة على الخيارات إن أردت لـكن لا تأخذ من وقتك ثلاث‬
‫ساعات هناك ! لأنه يوجد كثير منها‪.‬‬

‫ا‪ Mac OS X) Xcode 4.2.‬فقط(‬

‫هناك الـكثير من البيئات التطوير ية المتوافقة مع ‪ Mac‬على غرار ‪ Code::Blocks‬طبعا‪.‬‬
‫سأقدم لك البيئة الأكثر شهرة في الماك و هي ‪.Xcode‬‬

‫‪ ،Xcode‬أين أنت ؟‬

‫أغلب مستخدمي ‪ Mac OS X‬ليسوا مبرمجـين‪ .‬لقد فهمت ‪ Apple‬هذا‪ ،‬لذلك لم ٺثب ّته افتراضيا مع النظام‪.‬‬
‫لحسن الحظ‪ ،‬لك ّل من يريد أن يبرمج‪ ،‬ك ّل شيء جاهز‪ Xcode .‬متوف ّر على ‪ .MacAppStore‬ابدأ بأخذه من‬

‫هناك‪.‬‬
‫أنصحك أيضا بإلقاء نظرة على الموقع الخاص بالمطوّرين لـ‪.Apple‬‬

‫‪https://developer.apple.com/‬‬

‫سوف تجد هناك كم ّا هائلا من من المعلومات المهمّة للتطوير على ‪ .Mac‬يمكنك منه تحميل العديد من البرامج‬
‫للتطو ير‪.‬‬

‫لا تتردّد في التسجيل في ‪ ،(Apple Development Connection) ADC‬إنه مجاني و يساعدك على ٺتبع كل ما‬
‫هو جديد‪.‬‬

‫‪23‬‬

‫الفصل ا‪ .2.‬الحصول على الأدوات اللازمة‬

‫تشغيل ‪Xcode‬‬

‫أوّل شيء يمكننا فعله هو إنشاء مشروع جديد‪ ،‬فلنبدأ بهذا‪ .‬إذهب إلى ”ملف ” ) ‪ ( File‬ثم ّ ”مشروع جديد”‬
‫) ‪ .( New Project‬ستفتح لك نافذة اختيار المشروع‪.‬‬

‫اختر ‪ Application‬من اليسار ثم ّ ‪ . Command Line Tool‬اضغط بعدها على ‪ . Next‬سوف‬
‫ي ُطلب منكم بعدها حفظ مشروعك )ك ّل مشروع يجب أن يحفظ منذ البداية( و اسمه‪ .‬ضعه في المجل ّد ال ّذي تريد‪.‬‬
‫بمجر ّد إنشائه‪ ،‬سيتّم عرض مشروعك على شكل مجل ّد يحتوي على العديد من المل ّفات في الـ ‪ . Finder‬الملف‬
‫ال ّذي يملك الامتداد ‪ .xcodeproj‬يوافق ملف المشروع‪ .‬إنه الملف الذي عليك اختياره في المرة القادمة‬

‫لفتح مشروعك‪.‬‬

‫نافذة التطوير‬

‫في ‪ ،Xcode‬عندما تختار ‪ main.c‬تظهر لك نافذة شبيهة بهذه ‪:‬‬
‫‪24‬‬

‫‪ Mac OS X) Xcode‬فقط(‬

‫الواجهة مقسمة إلى أربعة أقسام‪ ،‬مرقمة هنا من ‪ 1‬إلى ‪: 4‬‬
‫‪ .1‬الجزء الأوّل هو شر يط الأزرار في الأعلى‪ .‬أه ّم زرّ فيه هو ”تشغيل” ) ‪ ( Run‬وظيفته تشغيل البرنامج‪.‬‬
‫‪ .2‬الجزء اليسار مخصص للتمثيل الشُجيري لمشروعك الخاص‪ .‬بعض الأقسام تحتوي على الأخطاء‪ ،‬التحذيرات‪،‬‬

‫إلخ‪ .‬يقوم ‪ Xcode‬تلقائيّا بنقلك إلى القسم المهم‪ .‬و هو الذي يحمل اسم المشروع‪.‬‬
‫‪ .3‬الجزء الثالث ٺتغيّر وظيفته حسب ما قمت بتحديده في الجزء الأيسر‪ .‬و هنا يعرض محتوى الملف ‪. main.c‬‬

‫‪ .4‬أخيرا‪ ،‬الجزء الرابع ي ُظهر نتائج تشغيل البرنامج على الشاشة عندما تقوم بتشغيل البرنامج‪.‬‬

‫إضافة مل ّف جديد‬

‫في البداية‪ ،‬لن تملك سوى ملف مصدري واحد و هو ‪ ، main.c‬و لـكن لاحقا عندما نتقدم في الدروس‬
‫سأطلب منك إنشاء ملفات مصدر ي ّة بنفسك‪ ،‬عندما تصبح برامجنا أكبر‪.‬‬

‫لإنشاء مل ّف جديد‪ ،‬اذهب إلى قائمة ‪ File‬ثم ّ ‪ . New File‬سيطلب منك إدخال نوع الملف الذي‬
‫تريد إنشاءه‪ .‬توجّه إلى قائمة ‪ Mac OS X‬و اختر ‪ C and C++‬ثم ّ ‪ . C File‬لاحظ هذه الصورة‪.‬‬
‫‪25‬‬

‫الفصل ا‪ .2.‬الحصول على الأدوات اللازمة‬

‫يجب عليك إعطاء اسم لمل ّفك الجديد‪ .‬امتداده يجب أن يبقى ‪ . .c‬أحيانا ‪-‬كما سنرى لاحقا‪ -‬يجب عليك‬
‫أيضا إنشاء مل ّفات بامتداد ‪ . .h‬الخانة ‪ Also create file.h‬مخ ّصصة لهذا الغرض‪ .‬حالي ّا هذا الخيار‬

‫لا يهمّنا‪.‬‬
‫انقر بعدها على ‪ . Finish‬انتهى ! أصبح في مشروعك مل ٌف آخر غير الملف ‪ ، main.c‬هنيئا لك فقد‬

‫أصبحت الآن جاهزا ً للبرمجة على الـ ‪. Mac‬‬

‫مل ّخص‬

‫• المبرمجون يحتاجون إلى ثلاثة أدوات ‪ :‬محر ّر نصوص‪ ،‬مترجم و من ّقح‪.‬‬
‫• من الممكن ٺثبيت هذه الأدوات منفصلة‪ ،‬لـكن ّه من المعتاد البوم الحصول على حُزمةٍ ثلاثة‪-‬في‪-‬واحد‬

‫نسميها بيئة التطوير المتكاملة‪.‬‬
‫• ‪ ،Visual C++ ،Code::Blocks‬و ‪ Xcode‬تع ّد من بين بيئات التطوير الأكثر شهرة‪.‬‬

‫‪26‬‬

‫الفصل ا‪3.‬‬

‫برنامجك الأوّل‬

‫لقد قمنا بحضير ك ّل شيء إلى حد الآن ويمكننا أن نبدأ قليلا من البرمجة‪ .‬مع نهاية هذا الفصل ستكون قد‬
‫نجحت في إنشاء أ ّول برنامج لك‪.‬‬

‫لـكي أصدقك القول‪ ،‬سيظهر البرنامج بالأبيض والأسود ولن يقوم بشيء سوى إلقاء التحي ّة‪ .‬يبدو عديم‬
‫الفائدة‪ ،‬لـكن ّه برنامجك الأ ّول وأؤكّد لك أن ّك ستكون فخورا به‪.‬‬

‫ا‪ 1.3.‬كونسول أو نافذة ؟‬

‫لقد تحدثنا سابقا عن فكرة برامج الـكونسول وبرامج النوافذ في الفصل السابق‪ .‬البيئة التطوير ية تطلب منا تحديد‬
‫أي نوع من البرامج نريد أن ننشئها‪ .‬ولقد قلنا إننا سننشئ برامج من نوع كونسول‪.‬‬
‫يوجد نوعان من البرامج‪ ،‬لا أكثر ‪:‬‬
‫• ‪،‬برامج بنوافذ‬
‫• برامج تعمل في الـكونسول‪.‬‬

‫البرامج ال ّتي تملك نوافذ‬

‫هي البرامج التي نعرفها جميعا‪ .‬هذا مثال على برنامج من نوع نافذة‪ ،‬مثل الرسام‪.‬‬
‫‪27‬‬

‫الفصل ا‪ .3.‬برنامجك الأ ّول‬

‫أعتقد أن ّك تحب إنشاء برامج كهذه‪ ،‬لـك ّن هذا ليس في مقدورك حاليا‪ .‬في الواقع‪ ،‬إنشاء برامج بنوافذ هو أمر‬
‫ممكن بلغة ‪ ،C‬لـك ّن بالنسبة لمبتدئ‪ ،‬هذا أمر مع ّقد ج ّدا‪ .‬كبداية‪ ،‬يستحسن إنشاء برامج الـكونسول‪.‬‬
‫لـكن ماذا يعنى برنامج ‪ Console‬؟‬

‫البرامج ال ّتي تعمل في الـكونسول‬

‫برامج الـكونسول هي أول ما ظهر من برامج‪ .‬في ذلك الوقت‪ ،‬شاشات الحواسيب لم تكن سوى بالأبيض والأسود‪،‬‬
‫ولم تكن فعّالة لـكي تتم ّكن من رسم النوافذ كما هو الحال مع حواسيبنا حالي ّا‪.‬‬

‫م ّر الزمن بسرعة وزادت شعبية الويندوز نظرا ً لبساطته إلى أن نسي كثير من الناس ما هي الـكونسول‪.‬‬
‫لد ّي خبر جي ّد لك ! الـكونسول لم تمت بعد ! في الواقع‪ GNU/Linux ،‬قد أعاد الـكونسول إلى الحياة‪ .‬هذه‬

‫صورة لـكونسول على ‪.GNU/Linux‬‬
‫‪28‬‬

‫كونسول أو نافذة ؟‬

‫مرعب ! صحيح ؟ لـكن على الأقل عرفت ما هي الـكونسول‪ ،‬وهذه بعض الملاحظات ‪:‬‬
‫• اليوم‪ ،‬يمكننا عرض الألوان في الـكونسول‪ .‬ليس ك ّل شيء بالأبيض والأسود كما تتخي ّل‪.‬‬

‫• الـكونسول هو الأسهل من ناحية البرمجة بالنسبة للمبتدئين‪.‬‬
‫• أداة عالية الإمكانيّات إذا عرفنا كيف نستخدمه‪.‬‬

‫كما قلت لك‪ ،‬إنشاء برامج كونسول أمر سهل ج ّدا وملائم للمبتدئين )وهذا عكس برامج النوافذ(‪ .‬ليكن في‬
‫علمك أيضا أ ّن الـكونسول قد تطوّرت وبإمكانها عرض الألوان‪ ،‬ولا شيء يمنعك من إضافة صورة خلفي ّة لها‪.‬‬

‫وفي الويندوز ألا توجد ‪ Console‬؟‬
‫بلى‪ ،‬لـكنّها مخفي ّة لو صح القول‪ .‬يمكنك فتحها بالذهاب إلى ”إبدأ” ) ‪ ( Start‬ثم ّ”ملحقات” ) ‪( Accessories‬‬
‫ثم ّ ”موجه الأوامر” ) ‪ ( Command prompt‬أو بالذهاب إلى ”إبدأ” ثم ّ ”تشغيل” ) ‪ ( Run‬واكتب فيها ‪cmd‬‬

‫واضغط على ”موافق”‪.‬‬
‫‪29‬‬

‫الفصل ا‪ .3.‬برنامجك الأوّل‬

‫إذا كنت تستخدم نظام ويندوز‪ ،‬فاعلم بأن أولى برامجك ستكون في نوافذ شبيهة بهذه‪ .‬أنا لم أختر البداية‬
‫هكذا لجعلك تشعر بالملل‪ ،‬بل لتعليمك الأساسي ّات اللازمة لـكي تتم ّكن لاحقا من إنشاء النوافذ‪.‬‬

‫إذن فلتكن متي ّقنا ً‪ ،‬بمجر ّد أن تصل إلى المستوى اللازم لإنشاء النوافذ‪ ،‬سوف أعل ّمك كيف تفعل ذلك‪.‬‬

‫ا‪ 2.3.‬الح ّد الأدنى من الشفرة المصدر ية‬

‫من أجل أي برنامج‪ ،‬يجب كتابة قدر معي ّن من الشفرة المصدر ية‪ .‬هذه الشفرة لا تقوم بشيء خا ّص لـكنّها‬
‫ضرور ي ّة‪ .‬هذه الشفرة التي سنكتشفها الآن ستكون أساس أغلب برامجك ال ّتي ستكتبها بلغة ‪.C‬‬

‫أطلب من البيئة التطوير ية الخاصة بك تزويدك بالحد الأدنى من الشفرة المصدر ية‬

‫لقد لاحظت أن طر يقة إنشاء مشروع جديد تختلف من بيئة تطوير ية إلى أخرى‪ .‬إليك تذكيرا ً بسيطا ‪ :‬في برنامج‬
‫‪) Code::Blocks‬الذي سنستخدمه في هذا الكتاب(‪ ،‬عليك التوجه نحو ‪ File‬ثم ّ ‪ New‬ثم ّ ‪ Project‬ثم‬
‫تختار ‪ Console Application‬وبعدها اللغة ‪ .C‬سيول ّد لك الحد الأدنى من الشفرة المصدر ية ‪ C‬التي‬

‫تحتاجها‪ .‬ها هي ‪:‬‬
‫>‪1 #include <stdio.h‬‬
‫>‪2 #include <stdlib.h‬‬
‫‪3‬‬
‫)(‪4 int main‬‬
‫{‪5‬‬
‫;)”‪6 printf(”Hello world!\n‬‬
‫;‪7 return 0‬‬
‫}‪8‬‬
‫‪9‬‬

‫‪30‬‬

‫الح ّد الأدنى من الشفرة المصدر ية‬

‫لاحظ أن ّه يوجد سطر فارغ في نهاية الشفرة‪ .‬يفترض أن ينتهي كل ملف مكتوب بلغة ‪ C‬هكذا‪ .‬إن لم‬
‫تفعل ذلك‪ ،‬فهذه ليست بمشكلة‪ ،‬لـكن توق ّع أن يعرض لك المترجم تحذيرا ً )‪.(Warning‬‬

‫علما ًأ ّن السطر ‪:‬‬

‫)(‪1 int main‬‬

‫…بإمكانه أن ي ُكتب كالتالي ‪:‬‬

‫)][‪1 int main(int argc, char *argv‬‬

‫كلتا العبارتين تحملان نفس المعنى لـكن الثانية‪ ،‬الأكثر تعقيدا‪ ،‬هي الأكثر شيوعا‪ ،‬لذلك فإنّنا سنستخدمها في‬
‫الفصول القادمة‪.‬‬

‫إستخدامنا للشكل الأ ّول أو الثاني لا يغيّر شيئا بالنسبة لنا‪ .‬لذلك لا داعي لإضاعة الوقت هنا‪ ،‬خصوصا ًأن ّك لا‬
‫تملك المستوى اللازم لفهم ما تعنيه‪.‬‬

‫إذا كنت تستخدم بيئة تطوير ية أخرى فقم بنسخ هذه الشفرة المصدر ية وألصقها في الملف ‪main.c‬‬
‫ليكون لديكم نفس الشفرة‪.‬‬

‫أخيرا‪ ،‬قم بحفظ عملك في المشروع‪ .‬أعلم أننا لم نقم بشيء حت ّى الآن لـكن من الجي ّد التعوّد على الحفظ في‬
‫ك ّل م ّرة‪.‬‬

‫تحليل أسطر الشفرة المصدر ية السابقة‬

‫قد تبدو لك الشفرة المصدر ية السابقة أ ّنها كاللغة الصيني ّة‪ ،‬أنا أتخي ّل ذلك ! في الواقع هي تسمح بإنشاء برنامج‬
‫كونسول يعرض ن ّصا على الشاشة‪ .‬يجب تعلّم كيفي ّة قراءة ك ّل هذا‪.‬‬

‫فلنبدأ بأ ّول سطرين ‪:‬‬

‫>‪1 #include <stdio.h‬‬
‫>‪2 #include <stdlib.h‬‬

‫هذان السطران يبدآن بعلامة ‪ . #‬وهي أسطر خا ّصة ت ُعرف باسم توجيهات المعالج القبلي )‪Preprocessor‬‬
‫‪ . (directives‬اسم مع ّقد‪ ،‬أليس كذلك ؟ هذه الأسطر تتم ّ قراءتها من طرف البرنامج المسمّى بالمعالج القبلي‪،‬‬

‫وهو برنامج يتم ّ تشغيله في بداية الترجمة‪.‬‬

‫ما رأيناه سابقا كان مخ ّططا بسيطا لعملي ّة الترجمة‪ .‬لـك ّن في الواقع‪ ،‬هناك الـكثير من المراحل التي تحدث في‬
‫هذه العملي ّة‪ .‬سنقوم بتفصيل هذا لاحقا‪ .‬حالي ّا عليك فقط تذكّر وضع هذين السطرين أعلى ك ّل مل ّفاتك‪.‬‬

‫‪31‬‬

‫الفصل ا‪ .3.‬برنامجك الأ ّول‬

‫حسنا لـكن ماذا يعنيه هذان السطران ؟ أريد أن أعرف !‬

‫كلمة ‪ include‬بالإنجليز ي ّة تعني ”تضمين”‪ .‬هذان السطران يقومان بتضمين مل ّفات في المشروع‪ ،‬أي‬
‫إضافة هذه المل ّفات من أجل عملي ّة الترجمة‪ .‬هناك سطران وبالتالي هناك ملفان يتم ّ تضمينهما في المشروع وهما‬

‫بالترتيب ‪ stdio.h :‬و ‪ . stdlib.h‬هذان المل ّفان موجودان بالفعل على حاسوبك وهما مل ّفان مصدريّان‬
‫جاهزان‪ ،‬سوف تعرف مستقبلا أنّنا نسميها مكتبات )‪ .(Libraries‬هذه المل ّفات تحتوي الشفرة المصدر ية اللازمة‬

‫لعرض ن ّص على الشاشة‪.‬‬

‫بدون هذين المل ّفين‪ ،‬كتابة ن ّص على الشاشة سيكون أمرا مستحيلا ً‪ .‬فالحاسوب لا يعرف فعل أي شيء‬
‫مبدئيا‪.‬‬

‫باختصار‪ ،‬السطران الأول والثاني يقومان بتضمين المكتبات التي ستساعدنا في إظهار ن ّص على الشاشة بك ّل‬
‫سهولة‪.‬‬

‫نمر للتالي‪ ،‬باقي الأسطر ‪:‬‬

‫)(‪1 int main‬‬
‫{‪2‬‬
‫;)”‪3 printf(”Hello world!\n‬‬
‫;‪4 return 0‬‬
‫}‪5‬‬

‫ما تراه هنا هو ما نسميه بـالتابع أو الدال ّة )‪ .(Function‬البرنامج في لغة ‪ C‬يتكوّن من مجموعة دوال‪ .‬حالي ّا‬
‫برنامجنا لا يحوي سوى دال ّة واحدة‪.‬‬

‫الدال ّة تم ّكننا من تجميع مجموعة من الأوامر‪ .‬الغرض من تجميع الأوامر هو جعلها تقوم بوظيفة ما‪ .‬مثلا يمكننا‬
‫إنشاء دال ّة باسم ‪ open_file‬وجعلها تحتوي التعليمات التي تشرح للحاسوب كيفي ّة فتح ملف‪.‬‬

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

‫أجل‪ ،‬اسم دال ّتنا هو ‪ main‬والذي يعني ”الرئيسية” ‪ .‬وتشغيل البرنامج دائما يبدأ من الدالة ‪. main‬‬

‫للدال ّة بداية ونهاية‪ ،‬وهي محدودة بالحاضنتين { و } ‪ .‬محتوى الدال ّة موجود بين هاتين الحاضنتين‪ .‬إن كنت‬
‫قد تابعت جيدا ً فقد عرفت أ ّن الدال ّة مش ّكلة من سطرين ‪:‬‬

‫;)”‪1 printf(”Hello world!\n‬‬
‫;‪2 return 0‬‬

‫هاته الأسطر في الداخل نسميها التعليمات )‪) (Instructions‬هذه إحدى المصطلحات ال ّتي يجب عليك‬
‫حفظها(‪ .‬ك ّل تعليمة تمث ّل أمرا ً بالنسبة للحاسوب‪ .‬فك ّل واحدة منها تطلب منه فعل شيء مح ّدد‪.‬‬

‫‪32‬‬

‫الح ّد الأدنى من الشفرة المصدر ية‬
‫كما قلت لك‪ ،‬بتجميع ذكيّ للتعليمات في الدال ّة يمكننا إنشاء أجزاء برنامج جاهزة للاستخدام‪ .‬باستخدام التعليمات‬
‫المناسبة يمكننا إنشاء دال ّة ‪ open_file‬كما شرحت لك قبل قليل‪ ،‬و أيضا دال ّة ‪ move_character‬في‬

‫لعبة فيديو‪ ،‬على سبيل المثال‪.‬‬
‫البرنامج في الواقع ما هو إلّا ٺتابع لتعليمات ‪ :‬إفعل هذا و إفعل ذاك‪ .‬أنت تعطي أوامر للحاسوب و هو يقوم‬

‫بتنفيذها‪.‬‬
‫هامّ ج ّدا ‪ :‬لا ب ّد أن تنتهي ك ّل تعليمة بفاصلة منقوطة ” ; ” ‪ .‬بهذا يمكن التفر يق بين ما إذا كانت هذه‬

‫تعليمة أم لا‪ .‬إذا نسيت وضع فاصلة منقوطة نهاية تعليمة ما‪ ،‬فلن تتم ّ ترجمة برنامجك‪.‬‬

‫السطر الأول ‪ printf(”Hello world!n”); :‬يطلب إظهار الرسالة ”!‪ ”Hello world‬على الشاشة‪.‬‬
‫عندما يصل برنامجك إلى هذا السطر‪ ،‬فسوف يقوم بعرض هذه الرسالة ثم ّ المرور إلى التعليمة التالية‪.‬‬

‫التعليمة التالية هي ;‪ return 0‬و هي تخـبرنا أ ّن الدال ّة ‪ main‬قد انتهت و تطلب منه إعادة ‪.0‬‬
‫لماذا يقوم برنامجي بإعادة العدد ؟‬

‫في الواقع‪ ،‬ك ّل برنامج عندما ينتهي ي ُرجع قيمة معينة‪ .‬على سبيل المثال‪ ،‬ليقول أ ّن ك ّل شيء سار على ما يرام‪.‬‬
‫عملي ّا‪ 0 ،‬يعني أ ّن ك ّل شيء سار على ما يرام‪ ،‬و ك ّل قيمة أخرى تد ّل على حدوث خطأ‪ .‬في أغلب الأحيان‬

‫هذه القيمة لا ت ُستخدم ‪ ،‬لـكن يجب رغم ذلك استعمالها‪.‬‬
‫كان يمكن أن يعمل برنامجك بدون ‪ ، return 0‬لـكن يمكننا القول أن وضعها يعتبر أمرا ً أكثر نظافة و أكثر‬

‫ج ّدية‪.‬‬
‫إلى هنا نكون قد ف ّصلنا قليلا في عمل هذه الشفرة المصدر ية‪.‬‬
‫طبعا‪ ،‬نحن لم ندرس ك ّل شيء بعمق‪ ،‬و قد تكون لديك بعض الأسئلة عالقة في ذهنك‪ .‬كن على يقين‬
‫بأنك ستجد لها أجوبة شيئا فشيئا مع تق ّدمنا في الكتاب‪ .‬لا يمكنني أن أطلعك على ك ّل شيء من البداية‪ ،‬لأ ّن‬

‫هناك كثيرا ً من الأشياء لاستيعابها‪.‬‬
‫إليك ما يلي ‪ :‬بما أنني في حال جي ّدة‪ ،‬سأقوم بوضع مخ ّطط يض ّم المصطلحات ال ّتي تعل ّمناها في هذا الفصل‪.‬‬

‫‪33‬‬

‫الفصل ا‪ .3.‬برنامجك الأوّل‬

‫لنجر ّب برنامجنا‬

‫ك ّل ما سنقوم به الآن هو ترجمة المشروع ثم ّتشغيله )اضغط على ‪ Build & Run‬إذا كنت على ‪.(Code::Blocks‬‬
‫سيطلب منك حفظ مشروعك إذا لم تقم بذلك من قبل‪.‬‬
‫إن لم تنجح الترجمة و ظهر لك خطأ مثل ‪:‬‬

‫‪”My-program - Release” uses an invalid compiler. Skipping...‬‬

‫‪ Nothing to be done...‬فهذا يعني أن ّك نزلت نسخة ‪ Code::Blocks‬دون ‪mingw‬‬
‫)المترجم(‪ ،‬عد و نزّل النسخة التي تحتوي على ‪. mingw‬‬
‫بعد ب ُرهة‪ ،‬يظهر برنامجك كما في الصورة ‪:‬‬

‫البرنامج ي ُظهر ”!‪) ”Hello world‬في السطر الأ ّول(‪.‬‬
‫الأسطر ال ّتي أسفله تم ّ توليدها من طرف ‪ Code::Blocks‬وتد ّل على أ ّن البرنامج قد تم ّ تشغيله بنجاح كما أنها تعطي‬

‫الوقت الذي استغرقه البرنامج في التشغيل‪.‬‬
‫سيطلب منك الضغط على إحدى المفاتيح لإغلاق النافذة‪ .‬أعلم أن الأمر لم يكن ممتعا ج ّدا‪ .‬لـكنه برنامجك‬

‫الأ ّول‪ ،‬وهذه لحظة ستتذكرها طيلة حياتك ! ألا تعتقد ذلك ؟‬

‫ا‪ 3.3.‬كتابة رسالة على الشاشة‬

‫من الآن سنقوم بإدخال التعديلات على الشفرة المصدر ية السابقة‪ .‬مهمّتك‪ ،‬إن قبلتها ‪ :‬عرض رسالة‬
‫”‪ ”Good morning‬على الشاشة‪.‬‬

‫كيف يمكنني اختيار النص ال ّذي سيظهر على الشاشة ؟‬

‫‪34‬‬

‫كتابة رسالة على الشاشة‬

‫الأمر بسيط جدا‪ ،‬إذا بدأت من الشفرة التي رأيناها سابقا ً‪ ،‬فسيكون عليك استبدال ”!‪”Hello world‬‬
‫بـ”‪ ”Good morning‬في السطر الذي يستدعي ‪. printf‬‬

‫كما قلت من قبل‪ printf ،‬هي تعليمة وهي تعطي أمرا ًللحاسوب ‪” :‬قم بعرض هذه الرسالة على الشاشة”‪.‬‬
‫يجب أن تعرف أيضا أن ‪ printf‬هي دال ّة ُكت ِب َت من قبل من طرف مبرمجـين قبلك‪.‬‬

‫أين توجد هذه الدال ّة ؟ أنا لا أرى سوى الدال ّة ‪! main‬‬
‫هل تذكر هذين السطرين ؟‬

‫>‪1 #include <stdio.h‬‬
‫>‪2 #include <stdlib.h‬‬

‫قلت لك من قبل أنهما يمكنان البرنامج من إضافة مكتبات‪ .‬المكتبات في الحقيقة هي مل ّفات تحوي أطنانا‬
‫من الدوال جاهزة للإستخدام‪ .‬هذه الملفات ) ‪ stdio.h‬و ‪ ( stdlib.h‬تحوي أغلب الدوال الأساسية‬
‫التي قد نحتاجها في برنامج ما‪ stdio.h .‬بحد ذاته يحوي دوال تم ّكن من عرض أشياء على الشاشة )مثل‬

‫‪ ( printf‬و أيضا الطلب من المستخدم إدخال شيء ما )هذه دوال سنتعر ّف عليها لاحقا(‪.‬‬

‫لنقل مرحبا للسي ّد‬

‫في دال ّتنا ‪ main‬نستدعي الدال ّة ‪ . printf‬أي أن لدينا دال ّة تستدعي أخرى )هنا ‪ main‬تستدعي‬
‫‪ .( printf‬سترى أن هذا ما يحدث دائما في لغة ‪ : C‬دال ّة تحتوي تعليمات تستدعي دوال أخرى‪ ،‬وهكذا‪.‬‬

‫إذن‪ ،‬لاستدعاء دال ّة يكفي كتابة اسمها متبوعا بقوسين‪ ،‬ثم فاصلة منقوطة‪.‬‬

‫;)(‪1 printf‬‬

‫هذا جيد‪ ،‬لـكنه غير كاف‪ .‬يجب أن ن ُعلم البرنامج بما يجب أن يكتبه في الشاشة‪ .‬لفعل هذا يجب أن‬
‫نعطي ‪ printf‬النص المطلوب عرضه‪ .‬لفعل هذا نقوم بوضع النص داخل علامات الإقتباس المزدوجة بين‬

‫القوسين‪.‬‬
‫في حالتنا هذه سنكتب تماما ‪:‬‬

‫;)”‪1 printf(”Good morning\n‬‬

‫آمل ألا تكون قد نسيت رمز الفاصلة المنقوطة في النهاية‪ ،‬وأذكّرك أ ّنها مهمّة جدا لأ ّنها تد ّل على نهاية التعليمة‪.‬‬
‫هذه هي الشفرة المصدر ية التي يجب أن تحصل عليها ‪:‬‬

‫‪35‬‬

‫الفصل ا‪ .3.‬برنامجك الأ ّول‬

‫>‪1 #include <stdio.h‬‬
‫>‪2 #include <stdlib.h‬‬
‫‪3‬‬
‫)(‪4 int main‬‬
‫{‪5‬‬
‫;)”‪6 printf(”Good morning‬‬
‫;‪7 return 0‬‬
‫}‪8‬‬

‫لدينا إذن تعليمتان تطلبان من الحاسوب القيام بهذين الأمرين بهذا الترتيب ‪:‬‬
‫‪ .1‬عرض ”‪ ”Good morning‬على الشاشة‪.‬‬

‫‪ .2‬نهاية الدال ّة ‪ ، main‬إعادة ‪ .0‬البرنامج يتوق ّف‪.‬‬
‫هذا ما يظهر على شاشتك ‪:‬‬

‫كما ترى‪ ،‬السطر الذي يحتوي الرسالة يكون ملتصقا ًقليلا بباقي النص‪ ،‬على خلاف ما رأيناه سابقا‪.‬‬
‫أحد الحلول الممكنة هو إضافة رمز للعودة إلى السطر بعد ”‪) ”Good morning‬كما لو أنّنا ضغطنا على المفتاح‬

‫‪.( Enter‬‬
‫ولـكن ضغط المفتاح ‪ Enter‬في الشفرة المصدر ية لن يعمل كما ٺتوقع‪ ،‬لهذا يجب استخدام المحارف الخا ّصة‬

‫)‪.(Special characters‬‬

‫المحارف الخا ّصة‬

‫المحارف أو الرموز الخا ّصة هي محارف تم ّكن من تعر يف عودة إلى السطر‪ ،‬جدولة‪ ،‬إلخ‪.‬‬
‫من السهل التعر ّف عليها‪ ،‬فهي مكوّنة من محرفين‪ .‬الأ ّول هو الش َرْ َطة ُ المائلة الخلفية )\( )‪ (Backslash‬والثاني‬

‫يكون رقما أو حرفا‪ .‬إليك محرفين خا ّصين قد تحتاجهما كثيرا ‪:‬‬

‫‪36‬‬

‫كتابة رسالة على الشاشة‬

‫• ‪ : \n‬العودة إلى السطر‪.‬‬
‫• ‪ : \t‬الجدولة )فراغ كبير في نفس السطر(‪.‬‬

‫في حالتنا هذه‪ ،‬يكفي أن نكتب ‪ \n‬لإنشاء العودة إلى السطر‪ .‬إذن‪ ،‬إذا أردنا أن نضع عودة إلى السطر‬
‫بعد ‪ ، Good morning‬فيكفي أن نكتب ‪:‬‬

‫;)”‪1 printf(”Good morning\n‬‬

‫وسيفهم حاسوبك أ ّن عليه كتابة ”‪ ”Good morning‬و يعود إلى السطر‪.‬‬

‫يمكنك الكتابة بعد ‪ \n‬بدون أي ّة مشكلة‪ .‬ك ّل ما تكتبه بعد ‪ \n‬سيوضع في السطر الجديد‪ .‬يمكنك إذن‬
‫التدرّب على كتابة ‪printf(”Good morning\nGood bye\n”); :‬‬

‫و سيتم ّ عرض ”‪ ”Good morning‬على السطر الأ ّول و ”‪ ”Good bye‬على السطر الثاني‪.‬‬

‫متلازمة ‪Gérard‬‬

‫مرحبا‪ ،‬اسمي ‪ Gérard‬و قد حاولت تعديل برنامجك ليقول ”‪ ،”Good morning Gérard‬و لـكن ّي ألاحظ‬
‫أ ّن حرف ‪ é‬لا يظهر بشكل جي ّد …مال ّذي عليّ فعله ؟‬

‫أ ّولا‪ ،‬مرحبا بك ‪ . Gérard‬هذا سؤال جي ّد‪ .‬لـكن لد ّي خبر س ّيء لك‪ .‬الـكونسول الخاصة بـ‪Windows‬‬
‫لا تم ّكن من عرض الحروف ال ّتي تحوي علامات النطق الصوتي مثل ‪ ، é‬خلافا لـكونسول ‪ GNU/Linux‬التي‬

‫تفعل‪ .‬لد ّي حل ّان لهذه المشكلة ‪:‬‬

‫‪37‬‬

‫الفصل ا‪ .3.‬برنامجك الأوّل‬

‫• استخدم ‪ . GNU/Linux‬هذا ح ّل جذر ّي بعض الشيء‪ .‬أحتاج إلى درس كامل لأعل ّمك كيف تعمل‬
‫على ‪ . GNU/Linux‬إذا لم يكن لديك المستوى‪ ،‬إنس هذا الخيار حالي ّا‪.‬‬

‫• لا تستخدم الحروف ال ّتي تحوي علامات النطق الصوتي‪ .‬للأسف إن ّه الحل ال ّذي قد يكون عليك اختياره‪.‬‬
‫الـكونسول الخاصة بـ‪ Windows‬لها عيوبها‪ .‬يجب عليك التعوّد على عدم كتابة مثل هذه الحروف‪ .‬لـكن‬
‫مستقبلا قد تنشئ برامج بنوافذ ولن تعاني من هذا المشكل‪ .‬لذلك أنصحك بالصبر على هذه المشكلة حالي ّا‪،‬‬

‫فبرامجك المستقبلية ”الاحترافية” لن يكون فيها هذا المشكل‪.‬‬

‫لكيلا تنزعج‪ ،‬يمكنك الكتابة دون استخدام الحروف التي تملك علامات النطق الصوتي ‪:‬‬
‫;)”‪1 printf(”Good morning Gerard\n‬‬

‫نشكر صديقنا ‪ Gérard‬لتنبيهنا على هذه المشكلة !‬

‫ا‪ 4.3.‬التعليقات‪ ،‬مهمّة جدا !‬

‫قبل ختم هذا الدرس الأوّل ”الحقيقي” في البرمجة‪ ،‬يجب أن أع ّرفك على التعليقات )‪ . (Comments‬أيّا‬
‫كانت لغة البرمجة ال ّتي تستخدمها‪ ،‬ستكون لديك القدرة على إضافة التعليقات للشفرة المصدر ية الخاصة بك‪.‬‬
‫ولـكن ما الذي يعنيه ”التعليق”؟‬

‫هذا يعني إمكانية وضع ن ّص في وسط برنامجك لشرح دوره‪ ،‬مثلا ً‪ :‬ما الذي يفعله هذا السطر‪ ،‬إلخ‪ .‬هذا بالفعل‬
‫أمر ضرور ّي‪ ،‬لأن ّه حت ّى لو كنت عبقر يا ً في البرمجة‪ ،‬ستكون بحاجة إلى وضع ملاحظات هنا وهناك‪ .‬هذا‬

‫يمكنك من ‪:‬‬
‫• العثور على ما تبحث عنه بسهولة في الشفرة المصدر ية عندما تعود إليه بعد م ّدة‪ .‬من الطبيعيّ أن ننسى كيف‬
‫تعمل البرامج ال ّتي كتبناها بعد م ّدة‪ .‬إن توق ّفت عن البرمجة لأيّام ثم ّ عدت فستكون بحاجة إلى التعليقات‬

‫لإيجاد ما تريد في شفرة كبيرة ج ّدا‪.‬‬
‫• إذا أعطيت مشروعك لأحد غيرك )وهو لا يعرف شيئا عن الشفرة المصدر ية الخاصة بك(‪ ،‬فالتعليقات‬

‫تم ّكنه من التآلف مع مشروعك بسرعة‪.‬‬
‫• وأخيرا‪ ،‬ستسمح لي بإضافة شروحات وملاحظات حول الشفرة المصدر ية في هذه الدروس‪ .‬وهذا‬

‫سيفيدك في فهم ما الذي يعنيه ك ّل سطر‪.‬‬

‫توجد طر يقتان لإضافة تعليق‪ .‬وهذا يعتمد على طول التعليق المراد إدراجه ‪:‬‬

‫• إذا كان تعليقك قصيرا ‪ :‬فيمكن كتابته على سطر واحد‪ ،‬ولا يحتوي سوى كلمات قليلة‪ .‬في هذه الحالة‪،‬‬
‫عليك كتابة شرطتين مائلتين ) ‪ ( //‬متبوعين بتعليقك‪ .‬على سبيل المثال ‪:‬‬

‫‪38‬‬

! ‫ مهمّة جدا‬،‫التعليقات‬

1 // This is a comment.

‫ لأ ّن بهذه الطر يقة‬،‫ وهذا أمر مه ّم ج ّدا‬.‫ أو على يمين تعليمة معينة‬،‫بإمكانك إضافة تعليق وحده على السطر‬
: ‫ مثال‬.‫يمكننا تحديد ما الذي يعنيه السطر ال ّذي ُكتب بجانبه‬

1 printf(”Hello”); // This instruction displays ’Hello’ on the

screen

‫ في هذه‬.‫ تريد كتابة الـكثير من الجمل على كثير من الأسطر‬،‫ لديك الـكثير لتقوله‬:‫• إذا كان تعليقك طو يلا‬
:”‫ يجب عليك كتابة شفرة تشير إلى ”بداية التعليق” وأخرى تشير إلى ”نهاية التعليق‬،‫الحالة‬

.( /* ) ‫ أكتب شرطة مائلة متبوعة بنجمة‬: ‫– لبدء التعليق‬
.( */ ) ‫ أكتب نجمة متبوعة بشرطة مائلة‬: ‫– لإنهاء التعليق‬

: ‫يمكنك كتابة هذا على سبيل المثال‬

1 /* This is
2
a comment

3 written on several lines */

: ‫” على الشاشة ونضيف إليها بعض التعليقات للتدرّب‬Good morning” ‫فلنعد إلى الشفرة المصدر ية التي ت ُظهر‬

1 /*
2 Below, the directives of preprocessor.
3 These lines allow you to add files to your program,
4 files that we call libraries. Thanks to these libraries, we are ready

to use functions for display.

5 for example, a message on screen.
6 */
7
8 #include <stdio.h>
9 #include <stdlib.h>
10
11 /*
12 Following, you have the principal function of the program, called

main.

13 All programs start with this function.
14 Here, all what does my function is displaying ”Good morning” on the

screen.

15 */
16

17 int main()

18 {

19 printf(”Hello”); // This instruction displays ’Hello’ on the screen

20 return 0; // The program returns 0 then it stops.

21 }

39

‫الفصل ا‪ .3.‬برنامجك الأ ّول‬
‫هذا هو برنامجنا مع إضافة بعض التعليقات‪ ،‬نعم هو يبدو أكبر نوعا ما‪ ،‬لـكن ّه في الحقيقة مكافئ للبرنامج‬
‫السابق‪ .‬عند الترجمة‪ ،‬ك ّل التعليقات يتم ّ تجاهلها من طرف المترجم‪ .‬هذه التعليقات لا تظهر في البرنامج النهائي‪،‬‬

‫فهي تصلح فقط للمبرمجـين‪.‬‬
‫عادة لا نقوم بوضع تعليق لك ّل سطر‪ .‬لقد قلت وأكرر أن ّه من المهم وضع التعليقات في الشفرة المصدر ية‪،‬‬
‫لـكن يجب عليك معرفة القدر اللازم من التعليقات الواجب وضعه‪ ،‬وضع تعليق في ك ّل سطر قد لا يفيد في‬
‫شيء‪ ،‬بل يضي ّع الوقت فقط‪ .‬مثلا‪ ،‬أنت تعرف أن وظيفة ‪ printf‬هي عرض ن ّص على الشاشة‪ ،‬فلا حاجة‬

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

‫ذلك‪.‬‬
‫تذكر إذن‪ :‬يجب أن تكون التعليقات لإرشاد المبرمج في شفرته المصدر ية‪ .‬حاول التعليق عن مجموعة من‬

‫الأسطر دفعة واحدة بدل التعليق عن ك ّل سطر على حدة‪.‬‬
‫وإليك هذه المقولة من ‪: IBM‬‬

‫’إذا قرأت التعليقات الموجودة في برنامج و لم تفهم مبدأ عمله‪ ،‬قم برميه !’‬

‫مل ّخص‬

‫• البرامج يمكنها التفاعل مع المستخدم عن طر يق الـكونسول أو عن طر يق النافذة‪.‬‬
‫• من السهل على المبرمج في برامجه الأولى استخدام الـكونسول‪ ،‬رغم أ ّن هذه قد تكون غير محبوبة لدى‬

‫المبتدئ‪ ،‬فهذا لا يمنع من استخدام النوافذ في الجزء الثالث من هذا الكتاب‪.‬‬
‫• البرنامج يتكوّن من تعليمات تنتهي دائما بفاصلة منقوطة‪.‬‬

‫• الدالة ‪) main‬التي تعني الرئيسي ّة( هي الدالة ال ّتي يبدأ بها تنفيذ البرنامج‪ .‬إ ّنها الدالة الوحيدة الإجبار ية‬
‫في البرنامج‪ ،‬لا يمكن لأي برنامج أن ي ُترجم بدونها‪.‬‬

‫• ‪ printf‬هي دالة تمكننا من عرض رسالة على الشاشة‪.‬‬
‫• ‪ printf‬موجودة في مكتبة تحتوي على كثير من الدوال الأخرى الجاهزة للاستخدام‪.‬‬

‫‪40‬‬

‫الفصل ا‪4.‬‬

‫عالم المتغيّرات‬

‫تعل ّمت كيفية إظهار ن ّص على الشاشة‪ .‬جيد‪ ،‬لـك ّن هذا ليس شيئا مهما ً‪ .‬هذا لأنك لا تعرف بعد ما يدعى‬
‫بـالمتغي ّرات )‪ (Variables‬في البرمجة‪.‬‬

‫فائدة هذه المتغيرات هي تمكين الحاسوب من حفظ أعداد في الذاكرة‪ .‬سنبدأ ببعض الشرح حول ذاكرة‬
‫الحاسوب وكيفي ّة عملها‪ .‬قد يبدو هذا بسيطا ج ّدا للبعض‪ ،‬لـكن ّي أفترض أن ّك لا تعرف شيئا عن ذاكرة‬

‫الحاسوب‪.‬‬

‫ا‪ 1.4.‬أمر متعلق بالذاكرة‬

‫ما سأعلمك في هذا الفصل هو أمر له علاقة مباشرة بذاكرة حاسوبك‪.‬‬
‫كل إنسان حيّ له ذاكرة‪ .‬الأمر عينه بالنسبة للحاسوب‪ ،‬لـكن الحاسوب له أنواع عديدة من الذاكرة‪.‬‬

‫لم يملك الحاسوب أنواع عديدة من الذاكرة‪ ،‬واحدة يمكنها أن تكفي‪ ،‬أليس الأمر كذلك ؟‬

‫كل ّا ‪ :‬المشكلة أننا نحتاج ذاكرة سر يعة )لاسترجاع المعلومات بسرعة( وفي نفس الوقت كبيرة )لحفظ‬
‫بيانات كثيرة( قد تضحك إن أخبرتك أننا حتى اليوم لم نتمكن من صنع ذاكرة بهذه المواصفات‪ .‬أو بالأحرى‬

‫الذاكرة السر يعة باهظة الثمن لذلك لا يتم إنتاج الـكثير منها‪.‬‬
‫لذلك نجد في الحواسيب الحديثة ذاكرة سر يعة جدا لـكنها ليس ذات سعة كبيرة‪ ،‬وأخرى ذات سعة كبيرة‬

‫ج ّدا لـكنها غير سر يعة‪.‬‬

‫الأنواع المختلفة من الذاكرة‬

‫كي أوضح لك الصورة أكثر‪ ،‬إليك أنواع الذاكرة الموجودة في الحاسوب‪ ،‬من الأسرع إلى الأبطأ ‪:‬‬

‫‪41‬‬

‫الفصل ا‪ .4.‬عالم المتغيّرات‬
‫‪ .1‬السجلات )‪ : (Registers‬ذاكرة سر يعة ج ّدا‪ ،‬موجودة داخل المعالج‪.‬‬
‫‪ .2‬ذاكرة التخبئة )‪ : (Cache memory‬تمثل همزة وصل بين السجلات والذاكرة الحية‪.‬‬
‫‪ .3‬ذاكرة الوصول العشوائي )‪ : (Random access memory‬و هي الذاكرة التي نستخدمها كثيرا‪ ،‬وتدعى‬

‫اختصارا ‪.RAM‬‬
‫‪ .4‬القرص الصلب )‪ : (Hard disk‬والذي تعرفه بالطبع‪ ،‬نستعمله لحفظ الملفات‪.‬‬

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

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

‫عندما أقول ذاكرة بطيئة فهذا بالنسبة لحاسوبك‪ ،‬ففي نظر الحاسوب استغراق ‪ 8‬ميلي ثانية للوصول إلى‬
‫القرص الصلب يعتبر زمنا طو يلا ج ّدا !‬

‫ما الذي يجب أن أتذكره من كل هذا ؟‬
‫أردت أن أخبرك أننا في الفصول القادمة سوف نستخدم ذاكرة الوصول العشوائي كثيرا‪ .‬سنتعلم أيضا كيفية‬
‫القراءة والكتابة في الملفات على القرص الصلب )ليس الآن‪ ،‬لا يزال الوقت مبكّرا على هذا(‪ .‬أمّا بخصوص‬

‫السجل ّات وذاكرة التخبئة فلن نتعامل معهما مطلقا‪ ،‬فالحاسوب هو من سيهتم بأمرهما‪.‬‬

‫في لغات البرمجة منخفضة المستوى‪ ،‬كلغة التجميع )‪ (Assembly language‬نتعامل مباشرة مع‬
‫السجل ّات‪ ،‬لقد درستها‪ ،‬ويمكنني أن أقول لك أن القيام بعملية ضرب بسيطة يتطلب مجهودا ! لحسن‬

‫الحظ ففي لغة ‪) C‬وفي أغلب اللغات الأخرى( الأمر أسهل من ذلك بكثير‪.‬‬

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

‫لحسن الحظ‪ ،‬عند إعادة تشغيل الحاسوب‪ ،‬يقوم القرص الصلب بتذكيرها بمحتواها‪.‬‬

‫صورة لذاكرة الوصول العشوائي‬

‫نظرا لأننا سنستعمل ذاكرة الوصول العشوائي خلال لحظات‪ ،‬فمن الأفضل أن أريها لك )مؤطرة بالأحمر(‪:‬‬

‫‪42‬‬

‫أمر متعلق بالذاكرة‬

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

‫و هي تدعى اختصارا ‪ ،RAM‬لذلك لا تحـتر إن سميتها هكذا لاحقا‪ .‬بالنسبة للذاكرات الأخرى )السجلات‬
‫والتخبئة( فهي صغيرة لدرجة أنه لا يمكن رؤيتها بالعين المجر ّدة‪.‬‬

‫مخطط ذاكرة الوصول العشوائي‬

‫عرض المزيد من الصور لن يفيدك كثيرا‪ ،‬لـكن يجب عليك فهم كيف تعمل من الداخل‪ ،‬لذلك سأقدم لك‬
‫هذا المخطط البسيط الذي يمثل هندسة ذاكرة الوصول العشوائي ‪:‬‬
‫‪43‬‬

‫الفصل ا‪ .4.‬عالم المتغيّرات‬

‫كما ترى‪ ،‬يمكننا أن نميز عمودين ‪:‬‬
‫• هناك العناوين ‪ :‬هي أعداد تسمح للحاسوب بتحديد موضع القيم في الـ‪ . RAM‬نبدأ بالعنوان ‪ 0‬وننتهي بالعنوان‬
‫‪ 3,448,765,900,126‬وبعض الأجزاء‪ .‬لا أعلم بالضبط كم عدد العناوين الموجودة في الـ‪ ، RAM‬لـكني‬
‫أعرف أنها كثيرة جدا‪ .‬إضافة إلى ذلك‪ ،‬هذا أمر يتعلق بكمية الذاكرة الموجودة في جهازك‪ ،‬فكلما‬

‫زادت الذاكرة زادت معها العناوين وصار بإمكاننا تخزين معلومات أكثر‪.‬‬
‫• عند كل عنوان يمكننا تخزين قيمة )عدد(‪ .‬حاسوبك يقوم بتخزين هذه الأعداد في ذاكرة الوصول العشوائي‬

‫لـكي يتمكن من تذكرها‪ .‬ولا يمكننا تخزين سوى عدد واحد عند كل عنوان‪.‬‬
‫لا يمكن للذاكرة الحية تخزين شيء سوى الأعداد‪.‬‬
‫لـكن كيف يمكننا تخزين الكلمات ؟‬

‫سؤال جيد‪ .‬في الواقع حتى الحروف ليست سوى أعدادا في نظر الحاسوب ! الجملة هي مجرد ٺتابع لأعداد‪.‬‬
‫يوجد جدول يوافق بين الأعداد والحروف‪ ،‬جدول يقول مثلا بأن العدد ‪ 67‬يوافق الحرف ‪ .Y‬لن أدخل في‬

‫التفاصيل أكثر‪ ،‬ستكون لنا فرصة للرجوع إلى هذا لاحقا‪.‬‬
‫‪44‬‬

‫التصريح عن متغير‬

‫فلنعد إلى مخططنا‪ ،‬الأمور بسيطة جدا ‪ :‬إذا أراد الحاسوب تذكر العدد ‪) 5‬الذي قد يمثل عدد الأرواح‬
‫المتبقية لشخصية في لعبة( فسوف يضعه في مكان ما في الذاكرة أين يتوفر مكان شاغر ويحفظ العنوان الموافق‬
‫)مثلا ‪ .(3,062,199,902‬لاحقا‪ ،‬عندما يريد معرفة هذا العدد فسيذهب إلى خانة الذاكرة التي تحمل العنوان‬

‫رقم ‪ 3,062,199,902‬وسيجد القيمة ‪.5‬‬
‫هذه آلية عمل الذاكرة بشكل عام‪ .‬قد يكون الأمر لا زال غامضا في ذهنك حاليا )ما فائدة تخزين عدد إن‬

‫كان علينا تذكر عنوانه بدلا من ذلك ؟( لـكن كل شيء سيتضح مع بقية الفصول‪ ،‬أنا أعدك !‬

‫ا‪ 2.4.‬التصريح عن متغير‬

‫ص ّدقني هذه المق ّدمة القصيرة عن الذاكرة ستكون مهمّة أكثر مما تعتقد‪ .‬الآن يمكننا العودة إلى البرمجة‪.‬‬
‫إذن‪ ،‬ما هو المتغير )‪ (Variable‬؟‬

‫إنه معلومة صغيرة نخزنها مؤقتا في الذاكرة الحية‪ .‬ببساطة يمكننا القول إن المتغير هو قيمة يمكن أن ٺتغير أثناء‬
‫اشتغال البرنامج‪ .‬مثلا عددنا ‪ 5‬الذي ذكرناه سابقا يمكن أن يتناقص بمرور الزمن‪ .‬إذا وصل إلى العدد ‪0‬‬

‫فسنعرف أن اللاعب قد خسر‪.‬‬
‫في برامجنا سيكون هناك الـكثير من المتغيرات‪ .‬ستراها في ك ّل مكان‪.‬‬

‫في لغة الـ‪ ،C‬المتغير يتميز بشيئين ‪:‬‬
‫• قيمة ‪ :‬هو العدد الذي يحو يه‪ 5 ،‬مثلا‪.‬‬
‫• اسم ‪ :‬وهو الذي يمكننا من معرفة المتغيّر‪ .‬في البرمجة لن يكون علينا تذكّر عناوين الذاكرة‪ .‬بدلا من ذلك‬
‫علينا فقط استخدام أسماء المتغيرات‪ .‬المترجم هو من سيقوم بتحو يل الأسماء إلى عناوين‪.‬‬

‫إعطاء اسم للمتغير‬

‫في لغة البرمجة ‪ C‬كل متغير يجب أن يملك اسما خاصا به‪ .‬ومن أجل متغيرنا الذي يحوي عدد الأرواح المتبقية‬
‫للاعب يمكننا أن نسميه ”‪ ”Number of lives‬أو شيء من هذا القبيل‪.‬‬

‫للأسف توجد بعض الشروط‪ ،‬لا يمكنك تسمية المتغير كيفما شئت ‪:‬‬

‫• لا يجب أن يحتوي الاسم سوى على الحروف الصغيرة والـكبيرة والأرقام ) ‪.( abcABC012‬‬
‫• يجب أن يبدأ الاسم بحرف‪.‬‬

‫• المسافات ممنوعة‪ .‬بدلا من ذلك يمكننا استخدام الحرف المعروف باسم ‪ .( _ ) underscore‬إنه الحرف‬
‫الخاص الوحيد غير الحروف والأرقام الذي يمكن استعماله في اسم متغير‪.‬‬

‫‪45‬‬

‫الفصل ا‪ .4.‬عالم المتغيّرات‬
‫• لا يمكنك استخدام حروف غير الحروف الإنجليز ية‪.‬‬

‫وأخيرا يجب أن تعرف أن لغة ‪ C‬تفر ّق بين الحروف الصغيرة والـكبيرة‪ .‬ولثقافتك‪ ،‬نقول إن ‪ C‬حساسة‬
‫لحالة الحروف )‪ .(Case sensitive‬كمثال‪ ،‬الأسماء ‪ width‬أو ‪ WIDTH‬أو ‪ WiDth‬تعتبر أسماء متغيرات‬

‫مختلفة‪ ،‬حتى لو كانت تعني لنا الأمر نفسه‪.‬‬
‫هذه أمثلة عن أسماء متغيرات صالحة ‪، phone_number ، surname ، name ، numberOfLives :‬‬

‫‪. phoneNumber‬‬
‫لكل مبرمج طر يقة خاصة في كتابة أسماء المتغيرات‪ .‬خلال هذا الفصل سأر يك طر يقتي ‪:‬‬

‫• أبدأ دائما بحرف صغير‪.‬‬
‫• إن كان في الاسم أكثر من كلمة أضع حرف كبيرا في بداية ك ّل كلمة‪.‬‬

‫أطلب منك كتابة أسماء متغيراتك بنفس الطر يقة التي أتبعها‪ ،‬هذا لـكي نكون على تفاهم‪.‬‬

‫أيّا كان اختيارك‪ ،‬فعليك دائما إعطاء أسماء واضحة لمتغيراتك‪ .‬كان بإمكاننا اختصار ‪numberOfLives‬‬
‫إلى ‪ nol‬مثلا‪ .‬هذا أقصر في الكتابة‪ ،‬لـكنه أقل وضوحا عندما تعيد قراءة الشفرة المصدر ية‪ .‬فأنصحك‬

‫بإعطاء أسماء أطول لمتغيراتك إن كان ذلك يح ّسن فهمها‪.‬‬

‫أنواع المتغيرات‬

‫حاسوبنا كما نعلم ليس سوى آلة كبيرة جدا للحساب‪ .‬لا يجيد التعامل سوى مع الأعداد‪ .‬لـكن يوجد أنواع‬
‫كثيرة من الأعداد ‪:‬‬

‫• الأعداد الصحيحة الموجبة )الطبيعية( مثل ‪.7650 ،398 ،45:‬‬
‫• الأعداد العشر ية‪ ،‬أي التي تحوي فاصلة عشر ية ‪.9810.7 ،1.7741 ،75.909 :‬‬

‫• الأعداد الصحيحة السالبة ‪.−916 ،−87 :‬‬
‫• الأعداد العشر ية السالبة ‪.−100.11 ،−76.9 :‬‬

‫حاسوبك المسكين بحاجة للمساعدة ! عندما تطلب منه تخزين عدد‪ ،‬يجب أن تذكر له نوعه‪ .‬هذا ليس لأن ّه‬
‫لا يمكنه التعرف عليه تلقائيّا‪ ،‬ولـكن للتنظيم ولعدم أخذ كميات كبيرة من الذاكرة بدون فائدة‪.‬‬

‫عندما تصرّح عن متغيّر فسيكون عليك تحديد نوعه‪ .‬إليك أنواع المتغيرات الأساسية في لغة ‪: C‬‬

‫‪46‬‬

‫التصريح عن متغير‬

‫الحد الأقصى‬ ‫الحد الأدنى‬ ‫النوع‬

‫‪127‬‬ ‫‪−128‬‬ ‫‪signed char‬‬
‫‪32, 767‬‬ ‫‪−32, 768‬‬ ‫‪int‬‬
‫‪2147483647‬‬ ‫‪−2147483648‬‬
‫‪1 × 1037 − 1‬‬ ‫‪−1 × 1037‬‬ ‫‪long‬‬
‫‪1 × 1037 − 1‬‬ ‫‪−1 × 1037‬‬ ‫‪float‬‬
‫‪double‬‬

‫القيم المعروضة هنا تمثل الحد الأدنى المضمون من طرف اللغة‪ .‬في الحقيقة قد تتمكن من تخزين أعداد‬
‫أكبر من هذه‪ .‬في ك ّل الأحوال من المستحسن تذكّر هذه القيم عندما تختار نوع متغيراتك‪.‬‬

‫للعلم أن ّي لم أعرض جميع الأنواع هنا‪ ،‬بل الأساسية منها فقط‪.‬‬

‫الأنواع الثلاثة الأولى ) ‪ ( long ، int ، char‬تسمح يتخزين الأعداد الصحيحة )‪.(… ،4 ،3 ،2 ،1‬‬
‫النوعان الأخيران ) ‪ ( double ، float‬يسمحان بتخزين الأعداد العشر ية )‪.(… 16.911 ،13.8‬‬
‫سترى أنّنا نتعامل من الأعداد الصحيحة معظم الوقت لأ ّنها سهلة الإستخدام‪.‬‬

‫احذر في الأعداد العشر ية من استخدام الفاصلة‪ ،‬حاسوبك لا يستخدم سوى النقطة‪ .‬لذلك لا تكتب‬
‫‪ 54, 9‬بدل ‪! 54.9‬‬

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

‫من ‪ 0‬إلى ‪255‬‬ ‫‪unsigned char‬‬
‫من ‪ 0‬إلى ‪65, 535‬‬ ‫‪unsigned int‬‬
‫من ‪ 0‬إلى ‪4, 294, 967, 295‬‬ ‫‪unsigned int‬‬

‫كما ترى‪ ،‬مشكلة الأنواع عديمة الإشارة هي عدم القدرة على تخزين الأعداد السالبة‪ ،‬لـكن الشيء الإيجابي‬
‫هي أ ّنها توف ّر لنا ضعف حجم التخزين لك ّل نوع موافق )مثلا ‪ signed char‬يتوق ّف عند ‪ ،127‬بينما‬

‫‪ unsigned char‬يمتد إلى ‪.(255‬‬

‫تلاحظ أ ّن النوع ‪ char‬قد تم ّ إدراجه إمّا مع الكلمة المفتاحية ‪ ، signed‬أو مع الكلمة المفتاحية‬
‫‪ unsigned‬لـكن لا يوضع وحده أبدا‪ .‬السبب بسيط ‪ :‬هذا النوع يمكن أن يكون بإشارة أو بدون‬
‫إشارة حسب الحواسيب‪ .‬لذلك أنصحكم بتحديد أي واحد منهما تريدون حسب نوع القيمة المراد تخزينها‪.‬‬

‫‪47‬‬

‫الفصل ا‪ .4.‬عالم المتغيّرات‬

‫لم ِ َاذا توجد ثلاثة أنواع من المتغيرات الصحيحة ؟ ألا يكفي نوع واحد ؟‬

‫بلى‪ ،‬و لـكن إنشاء أنواع متع ّددة هدفه الاقتصاد من استهلاك الذاكرة‪ .‬فعندما نطلب من الحاسوب حجز‬
‫مساحة لمتغيّر من نوع ‪ char‬فهذا سيكون أقل من المساحة المستهلـكة لو إخترنا متغيّرا من نوع ‪. int‬‬

‫كان هذا مهمّا ج ّدا عندما كانت الحواسيب محدودة الذاكرة‪ .‬أمّا اليوم فحواسيبنا بها ذاكرات كبيرة ج ّدا‬
‫فلم يعد هذا يمث ّل مشكلة‪ .‬إذا احترت أ ّي واحد من الأنواع تستخدم‪ ،‬فاختر ‪ int‬للأعداد الصحيحة )أو‬

‫‪ double‬للعشر ية(‪.‬‬
‫باختصار‪ ،‬نقوم بالتفر يق خا ّصة بين الأعداد الصحيحة و العشر ي ّة‬

‫• بالنسبة للأعداد الصحيحة‪ ،‬نستعمل عادة ‪. int‬‬
‫• بالنسبة للأعداد العشر ي ّة نستعمل عادة ‪. double‬‬

‫التصريح عن متغيّر‬

‫ها قد بدأنا‪ .‬الآن سنقوم بإنشاء برنامج كونسول نسميه ”‪.”variables‬‬
‫سنتعلم كيف نصرّح عن متغيّر‪ ،‬أي الطلب من الحاسوب إذنا باستخدام شيء من ذاكرة الوصول العشوائي‪.‬‬

‫التصريح سيكون سهلا الآن‪ ،‬يجب علينا فقط أن نت ّبع الترتيب التالي ‪:‬‬

‫‪ .1‬نح ّدد نوع المتغيّر المراد إنشائه‪.‬‬
‫‪ .2‬نترك فراغا‪.‬‬

‫‪ .3‬نحدد اسم المتغيّر‪.‬‬
‫‪ .4‬و أخيرا‪ ،‬يجب ألا ّ ننسى أبدا وضع الفاصلة المنقوطة‪.‬‬

‫مثلا‪ ،‬إذا أردنا إنشاء المتغيّر ‪ numberOfLives‬من نوع ‪ int‬سنكتب السطر التالي ‪:‬‬
‫;‪1 int numberOfLives‬‬

‫هذا كل ما في الأمر‪ ،‬وإليك بعض الأمثلة الغبي ّة لملاحظة الشكل ‪:‬‬
‫;‪1 int mathMark‬‬
‫;‪2 double moneySumReceived‬‬
‫;‪3 unsigned int numberOfReadersWhoAreReadingALongVariableName‬‬

‫‪48‬‬

‫التصريح عن متغير‬

‫حسنا‪ ،‬أعتقد أن ّك فهمت المبدأ الآن !‬
‫ما فعلناه للتو يسمّى تصريحا عن متغي ّر )‪) (Declaring a variable‬هذا مصطلح يجب حفظه(‪ .‬يمكنك‬
‫وضع التصريحات في بدايات الدوال‪ .‬و بما أن لدينا دال ّة وحيدة فقط )الدالة ‪ ( main‬فسنصرّح المتغيّر هكذا ‪:‬‬
‫>‪1 #include <stdio.h‬‬
‫>‪2 #include <stdlib.h‬‬
‫‪3‬‬
‫)(‪4 int main(int argc, char *argv[]) // Equivalent to int main‬‬
‫{‪5‬‬
‫;‪6 int numberOfLives‬‬
‫‪7‬‬
‫;‪8 return 0‬‬
‫}‪9‬‬

‫إن قمتم بتشغيل البرنامج فستلاحظ بدهشة …أن ّه لا يقوم بشيء‪.‬‬

‫بعض التوضيحات‬

‫في الواقع‪ ،‬هناك أشياء تحدث‪ ،‬لـكن ّك لا تراها‪ .‬عندما يصل البرنامج إلى سطر التصريح عن المتغيّر فإن ّه يطلب‬
‫من الحاسوب بهدوء أن يعطيه شيئا من ذاكرة الوصول العشوائي‪.‬‬

‫إن تم ك ّل شيء على أحسن حال )و هذا ما يقع في غالب الأحيان( فإن الحاسوب يوافق على هذا الطلب‪.‬‬
‫المشكل الوحيد الذي يمكن أن يقع هو امتلاء الذاكرة‪ ،‬لـك ّن هذا أمر نادر الحدوث‪ ،‬من الذي سيملؤ الذاكرة‬

‫بمتغيرات ‪ int‬؟‬

‫لذلك كن متيقنا ًأنه سوف يتم إنشاء المتغيرات بنجاح‪.‬‬

‫معلومة صغيرة ‪ :‬إن كان لديك عدد من المتغيّرات بنفس النوع تريد التصريح عنها‪ ،‬فمن غير الضروري‬
‫كتابة سطر لك ّل متغيّر‪ .‬يكفي فصل أسماء المتغيّرات عن بعضها بفواصل على نفس السطر‪ ،‬مثلا ‪:‬‬
‫;‪ . int numberOfLives, level, playerAge‬هذا ينشئ ثلاثة متغي ّرات أسماؤها على‬

‫التوالي ‪ level ، numberOfLives :‬و ‪. playerAge‬‬

‫و الآن يجب علينا إعطاء قيمة للمتغيّر الذي أنشأناه‪.‬‬

‫إسناد قيمة إلى متغيّر‬

‫هذا أمر سهل للغاية فإن أردنا أن نعطي قيمة لمتغيرنا ‪ numberOfLives‬فيكمننا ببساطة كتابة هذا ‪:‬‬
‫;‪1 numberOfLives = 5‬‬

‫‪49‬‬

‫الفصل ا‪ .4.‬عالم المتغيّرات‬

‫لن نفعل شيئا بعد هذا‪ .‬ستضع اسم المتغير‪ ،‬إشارة تساوي‪ ،‬بعدها القيمة التي تريد أن تضعها بالداخل‪ ،‬في‬

‫هذه الحالة سنعطي القيمة ‪ 5‬للمتغير ‪ . numberOfLives‬برنامجنا الكامل سيكون هكذا ‪:‬‬

‫>‪1 #include <stdio.h‬‬

‫>‪2 #include <stdlib.h‬‬

‫‪3‬‬

‫‪4‬‬ ‫)(‪int main(int argc, char *argv[]) // Equivalent to int main‬‬
‫‪5‬‬
‫{‬

‫;‪6 int numberOfLives‬‬

‫;‪7 numberOfLives = 5‬‬

‫‪8‬‬

‫;‪9 return 0‬‬

‫} ‪10‬‬

‫هنا أيضا لا شيء ي ُعرض على الشاشة‪ ،‬ك ّل شيء يحدث في الذاكرة‪.‬‬
‫في أعماق الحاسوب هناك خانة ذاكرة تأخذ القيمة ‪ .5‬أليس شيئا رائعا ؟‬

‫يمكننا أن نستمتع بتغيير القيمة ‪:‬‬

‫;‪1 int numberOfLives‬‬
‫;‪2 numberOfLives = 5‬‬
‫;‪3 numberOfLives = 4‬‬
‫;‪4 numberOfLives = 3‬‬

‫في هذا المثال‪ ،‬المتغير سيأخذ القيمة ‪ 5‬ثم ‪ 4‬ثم ‪ .3‬و بما أ ّن الحاسوب سر يع ج ّدا ففي أق ّل من رمشة عين‬
‫يأخذ المتغيّر القيم ‪ 5‬ثم ّ ‪ 4‬ثم ّ ‪ 3‬ثم ّ ينتهي البرنامج‪.‬‬

‫قيمة متغيّر جديد‬

‫هناك سؤال مه ّم يجب أن أطرحه عليك ‪:‬‬

‫عند التصريح عن متغيّر‪ ،‬أ ّي قيمة تكون فيه ؟‬

‫عندما يقرأ الحاسوب هذا السطر ‪:‬‬

‫;‪1 int numberOfLives‬‬

‫فسيحجز مكانا في الذاكرة لهذا المتغيّر‪ ،‬لـكن ما هي قيمته في هذه اللحظة ؟‬
‫هل يملك قيمة افتراضي ّة ؟ )‪ 0‬مثلا(‪.‬‬

‫الجواب هو لا‪ ،‬لا و لا ثم ّ لا ! لا توجد قيمة افتراضي ّة‪ .‬المكان محجوز لـك ّن القيمة لا ٺتغيّر‪ .‬لا يتم ّ حذف‬
‫ما يوجد في خانة الذاكرة‪ .‬ستكون قيمة متغيّرك هي نفس القيمة التي كانت موجودة من قبل في تلك الخانة‪،‬‬

‫و يمكن أن تكون أ ّي شيء !‬

‫‪50‬‬


Click to View FlipBook Version