مق ّدمة
إن التحر ّر الفكري في بداية القرن العشرين أدّى إلى تو ّسع في البحوث العلمية التي شملت كل الميادين لاس ّيما
التكنولوجية منها كعلوم الحاسوب .هذه الأخيرة أعقبتها ثورة في لغات البرمجة التي تعتبر ركيزة أساسية تقوم عليها
البرامج .من بين هذه اللغات نجد لغة الـ ،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