تعلم البرمجة بلغة C للمبتدئين 5 الجزء الاول : المتغيرات و RAM الذاكرة الحية في الكمبيوتر

Header Ads

تعلم البرمجة بلغة C للمبتدئين 5 الجزء الاول : المتغيرات و RAM الذاكرة الحية في الكمبيوتر

عالم المتغيرات Variables

من الدروس السابقة الان صار بامكانك بث او اظهار رسالة على الشاشة , جيد جدا رغم اننا لا نقوم باشياء خارقة للعادة او مثيرة للدهشة الا انها تقدم كبير في مشوارك نحو تعلم البرمجة بلغة C او اي لغة اخرى , لكن كما قلت الامر ليس كافي , و هذا راجع الى انك لست على اطلاع بما يسمى المتغيرات في البرمجة , فهي عالم جديد سوف تكتشفه في هذا الشرح او الدرس من الدورة .

-  باختصار شديد هي تتمثل في اعطاء ارقام للحاسوب لكي يعمل بها او يتذكرها , سوف نتعلم طريقة تخزين ارقام في الذاكرة .
- اولا سوف نبداء بشرح و تفسير الذاكرة الموجودة داخل جهازك .

تعلم البرمجة بلغة C للمبتدئين 5 الجزء الاول : المتغيرات و RAM الذاكرة الحية في الكمبيوتر
اقراء ايضا 
تعلم البرمجة بلغة C للمبتدئين : 3 انشاء اول برنامج لك

سؤال : كيف تعمل الذاكرة ؟ كم من انواع مختلفة يملك الكمبيوتر ؟ .

يمكن ان يبدو الامر سهل على البعض , لكن نحن نُعمم الدورة و الشرح لكي يمكن اتباع الدروس و الشروحات لا يقتصر على المطلعين بل للجميع بدون استثناء , بما فيها الاشخاص التي لا تعرف شئ عن الكمبيورت و الذاكرة بداخله .

تعرف عن كل ما يتعلق بذاكرة الحاسوب 

سوف نخصص هذا الشطر للذاكرة و يمكن ان يكون في درسين متتاليين على حسب طوله و قدرتي على التوضيح , لانني اكتب الدروس و اعالج كل شئ مباشرة بدون وضع تخطيط او عمل مسبق .

كل انسان طبيعي التشكيل لديه ذاكرة , نفس الشئ بالنسبة للكمبيوتر او الحاسوب , لكن هو يتفوق على الانسان بحيث ان له عدة انواع من الذاكرة .

سؤال : لماذا الحاسوب لديه عدة انواع من الذاكرة ؟

المشكلة اننا بحاجة الى ذاكرة سريعة جدا ( للحصول على معلومة او رقم بشكل فائق السرعة ) و اخرى كبيرة في الحجم للتخزين , و الى اليوم لم نتمكن من اختراع الاثنين في نوع واحد , حتى SSD ليست سريعة بدرجة كبيرة تسمح بالاستغناء عن RAM , ايضا الذاكرة السريعة جدا يكون سعرها مرتفع لذالك يتم وضعها بقدر قليل .

- لتفادي الاشكالية , فقد اطررنا الى وضع ذاكرة سريعة جدا لكن بقدر قليل و اخرى بطيئة لكن بحجم كبير .

الفرق بين انواع الذكرة 

لاعطائك فكرة عن القضية . اليك مختلف انواع الذاكرة الموجودة داخل الكمبيوتر :

The registers السجلات : ذاكرة فائقة السرعة متواجدة مباشرة في المعالج .
The cache memory ذاكرة التخزين المؤقت : تقوم بالوصل بين register و الذاكرة الحية
The RAM ذاكرة الوصول العشوائي : هذا هو النوع الذي سوف نعمل به كثيرا في الدورة , و يطلق عليها اسم الذاكرة الحية .
The hard drive القرص الصلب : اعتقد ان الجميع يعرفها و هي تستعمل في تخزين الملفات .

- تم ترتيب  الانواع على حسب سرعتها من ال registers الى الابطاء و هي المتواجدة في القرص الصلب , لو انكم تابعتم جيدا الشرح اعلاه انت على اطلاع ان الاسرع هي الاقل تواجد من ناحية الكمية و الابطاء هي الاكثر حجم و كمية .
- السجلات هي بالكاد قادرة على تخزين كمية قليلة من الاعداد و الارقام , العكس تماما مع القرص الصلب الذي يمكنه تخزين ملفات باحجام معتبرة .

ملاحظة : حين نقول ان الذاكرة بطيئة , هي بالمقارنة و على سُلم سرعة الكمبيوتر , لان 8 اجزاء من الثانية بالنسبة للحاسوب هي بطئية رغم انها سرعة رهيبة للانسان .

ما يجب حفظه من كل هذا ؟

نحن نريد توجيهك و اطلاعك الى اشياء مُعينة , و الان انت تعلم ان في البرمجة سوف نعمل خصيصا بالذاكرة الحية , سوف نرى ايضا كيف نقراء و نكتب على القرص الصلب , لكي نقوم بقراءة و انشاء ملفات ( هذا ما سوف نتعلمه في ما بعد ) , اما في ما يخص ذاكرة السجل و ذاكرة التخزين المؤقت لن نلمس فيها ابدا في هذه الدورة على الاقل .

ملاحظة : في لغات منخفظة المستوى ( مثل ما تعلمناه من قبل عن درجة لغات البرمجة ) ان نسيت يمكنك مراجعت الدرس الاول تعلم البرمجة بلغة C للمبتدئين : 1 مقدمة و شرح المفاهيم الاولية , لغة مثل Assembly المختصرة في رمز asm , المبرمجين يتعاملون مباشرة مع ذاكرة السجل , و يمكن القول ان عمل برنامج بسيط بهذا النوع من لغة البرمجة هو عمل جبار , لكن في منتهى الدقة , الحمد لله في لغة C و العديد من لغات البرمجة الامر اسهل بكثير .

- يجب عليك تعلم شئ اخر , وحده القرص الصلب يمسك او يبقي على الدوام المعلومات و البيانات المخزنة عليه , كل باقي الذاكرات هي مؤقتة , حين تُعطل عمل الكمبيوتر و توقفه , بانهاء التشغيل او ما شبه سوف تختفي و تَزول , حمدا لله ان القرص الصلب موجود ليذكر الحاسوب من هو , و ما هي المعلومات المتواجدة عليه , و كيف يجب ان يشتغل  اصلا 😔 .

الذاكرة الحية بالصور 

ما دمنا سوف نعمل كثيرا بالذاكرة الحية , من الافضل ان نريكم اياها بالصور , و نعرفكم عليها في الواقع , سوف نقربها لكم تدريجيا

1- نبداء بصورة للكمبيوتر العادي
طبعا انت تعرف مختلف الاجزاء التي يتكون منها جهاز الكمبيوتر , الفارة , لوحة المفاتيح , الشاشة و ما يهمنا هو وحدة المعالجة المركزية central unity .

2- وحدة المعالجة المركزية central unity
نركز على وحدة المعالجة المركزية central unity , هي القلب النابض للحاسوب و هو الجزء الذي يحتوي على جميع مكونات الذاكرة و مختلف القطع المهمة جدا لتشغيل الحاسوب .

3- الذاكرة الحية هي على شكل قطع ايليكترونية , ما يهمنا هو الموجود بداخل central unity .


نعم اعلم ان كل هذا بالنسبة لك فوضى عارمة , لكن لا عليك لن نطلب منك تعلم كيف يعمل كل هاذا , فقط نريدك ان تعلم اين تتمركز الذاكرة الحية في الكمبيوتر العادي ( المشار لها بالسهم المتعدد الالوان للفت و جلب انتباهك )

4- شريط ذاكرة الوصول العشوائي RAM memory module
هذا هو شكل الشريط لوحده
هذا النوع من الذاكرة تسمى في اللغة الشائعة RAM , لا تتعجب ان استعملنا هاذه العبارة في ما يتلو من الشروحات .

رسم تخطيكي لل RAM

حين النظر الى شريط ال RAM و تصويره عن قرب لا نرى الكثير , لكن من الضروري علينا معرفة طريقة عمله من الداخل , و بالتلي نكون قد وصلنا الى المبتغى من كل هذا التدريج في الصور و الشرح . 

الان اقترح عليكم رسم تخطيطي عملي من ذاكرة الوصول العشوائي RAM , الرسم مبسط جدا , لاننا لا نحتاج الى العديد من المعارف و لا الى التدقيق في كل شئ بالتفصيل , حين تتمكن من فهم و تذكر هذا الرسم سوف تكون قد تعلمت الكثير .


مثل ما هو مبين , يجب التعرف و التفريق بين عمودين اثنين :

1 . العناوين : العنوان يسمح للكمبيوتر بالتفريق و تحديد البيانات في RAM , نبداء بالعنوان رقم 0 و ننتهي الى اعداد مهولة مثل ما وضعت 3448765900126 .... و اكثر , لانني لا اعلم عدد العناوين الموجودة على الذاكرة الحية ... ( نعم انا لا اعلم كل شئ ) , العدد يختلف مع حجم ال RAM الموجودة , كل ما كان حجم الرام كبير كل ما صار عندك عدد عناوين اكثر , ومنها نستنتج انه يمكن التخزين اكثر .

2 . القيمة : في كل عنوان نخزن قيمة ( على شكل رقم او عدد ) , جهازك يقوم بتخزين هذه الارقام و الاعداد لكي يتذكرها لاحقا , لا يمكنه تخزين الا رقم او عدد واحد في كل عنوان .

ال RAM لا يمكنها تخزن الا الارقام ...

سؤال : كيف يفعل الحاسوب لتخزين الكلمات و ما شبه ان كان يخزن الا الارقام و الاعداد ؟

سؤال وجيه... , للعلم ان حتى الحروف هي عبارة عن ارقام بالنسبة للحاسوب , فمثلا عبارة كاملة او كلمة , هي مجرد اعداد متتالية بالنسبة له , يوجد جدول يقوم بتحديد كل عدد و ما يقابله من حرف موجود , هذا الجدول يقول مثلا ان العدد 67 يقابله حرف Y , لن ندخل في تفاصيل اكثر سوف نتطرق الى مثل هذه الامور لاحقا في الدروس .

نرجع الى الرسم التخطيطي , الامر بسيط جدا , حين الكمبيوتر يريد ان يحفظ "مؤقتا " الرقم 5 مثلا ( يمكن ان يكون عدد المحاولات المتبقية في لعبة مثل ماريو ) يضعه في مكان فارغ حيث توجد مساحة للتخزين على عنوان خالي من الارقام , مثلا في العنوان 3448765900126 , بعدها حين يريد معرفة هذا الرقم ليتذكره , يذهب مباشرة الى العنوان 3448765900126 , ليجد الرقم 5 , هكذا تعمل الذاكرة الحية .

قد يكون الامر غير واضح للكثيرين لكن سوف نوضح اكثر في بقية الشرح , وكل شئ سوف ياخذ معناه من كل ما قدمناه لك من البداية في هذه التدوينة المخصصة للذاكرة .

الاعلان عن متغير

صدقني ان كل ما قمنا به الى حد الان هو مفيد جدا لفهم ما سوف نشرحه الان و في بقية الدروس , الان و قد تعلمت و عرفت كل ما ينبغي عليك معرفته سوف نرجع الى البرمجة .

ما هو المتغيير ؟ 

هو معلومة مؤقة نخزنها في RAM , نسميها بالمتغير لانه قيمة يمكن ان تتغير حين تَشغيل البرنامج , مثلا رقم 5 الذي استعملناه لعدد المحاولات ( عدد الرؤوس او الحياة المتبقية في لعبة مثل ماريو Mario ... ان كنت لا تعرف لعبة ماريو يرجى مغادرة الشرح فورا 😆 ) يفترض ان تنخفظ مع مرور الوقت حين تَعثر اللاعب , ان وصل الرقم الى 0 ... نعلم ان اللاعب قد خسر game over , برامجنا مثل ما سوف تلاحظه سريعا , متكونة بشكل كبير من المتغيرات .

في لغة البرمجة C المتغيرات متكونة من شيئين اثنين :
قيمة : و هي العدد الذي تخزنه ( مثل ما استعملنا رقم 5 للمثال )
اسم : هي ما يسمح بالتعرف عليها , في لغة البرمجة C , لن نحتاج الى العنوان , في المقابل سوف نقوم فقط بالتَعريف على اسماء المتغيرات للمترجم compiler , هو من سوف يقوم بعملية conversion "تحويل" بالنيابة عنا نحن ليسهل لنا العمل .

اعطاء اسامي للمتغيرات 

في لغة البرمجة C كل متغير يجب ان يحتوي على اسم , بالنسبة الى المتغير الذي يكشف لنا عدد المحاولات في اللعبة ( نعم المثال السابق دائما رقم 5 ... عليك ان تلعب لعبة ماريو و الا لن تستطبع البرمجة ابدا 👀 ) , سوف تُريد تسميتها مثلا عدد المحاولات .

هنا نصل الى الحدود المفروضة في التسميات و هي كالتالي :

- لا يمكن استعمال الا ارقام و حروف (لاتينية) الكبيرة و الصغيرة ( Lowercase, Uppercase ) مثل abcABC012 .
- اسم المتغير يجب ان يبداء بحرف .
- الفراغات بين الاحرف و الارقام ممنوعة , في مكان الفراغ يمكن استعمال هذا الشكل _  ( underscore ) , هذا هو الرمز الوحيد المسموح بعد الارقام و الحروف .
- لا يمكن استعمال هذا النوع من الاحرف éàê , التي تكون بها اشكال خاصة تستعمل في لغات مثل الفرنسية و ما شبه .

عليك بمعرفة ان في البرمجة بلغة C , يوجد فرق بين الاحرف الكبيرة مثل ABCD و الصغيرة abcd , هي لغة تحترم اختلاف الحركات , و مثل هذا المتغيرات width و WIDTH او حتى WidHt , هي 3 متغيرات مختلفة تماما عن بعضها البعض في لغة البرمجة C , حتى و ان كانت بالنسبة لنا هي تعني نفس الشئ ( width  العَرض ) .

هذه امثلة عن اسماء متغيرات صحيحة للشرح فقط : NumberOFlives , firstname , phone_number , PhoneNumber

كل مبرمج له طريقته الخاصة في تسمية المتغيرات , سوف نتبع الطريقة التالية التي اعتمدها في الشروحات لكي لا يختلط عليكم الامر في ما يلي و طريقتي الخاصة , لا يتوجب عليك العمل بها , انما اشرحها لكي تتبعني جيدا في ما هو اتي :

- ابداء جميع اسماء المتغيرات بحرف صغير ( abcde ... ) .
- ان وجدت العديد من الكلمات في متغير ( بمعنى استعمل جملة ) افصل مابينها بحرف كبير ( ABCD ... الخ ) , في بداية كل كلمة جديدة .

في البداية سوف اطلب منكم استعمال نفس الطريقة لكي لا نختلف كثيرا و يكون عليك من السهل اتباعي .

ملاحظة مهمة : لا يهم ان تستعمل اي طريقة في كتابة اسم المتغير , لكن عليك ان تكون واضح "جدا" في الكتابة و ان لا تستعمل مختصرات مثلا عدد المحاولات ( او الحيات المتبقية )  في لعبة ماريو نعطبها اسم numberOfLives او number_of_lives , و لا نستعمل nol ( اختصار متكون من كل حرف اول في كل كلمة ) , سوف تكون اقصر و اسرع للكتابة لكن غير واضحة تماما , حين تبرمج الكود code الخاص ببرنامجك سوف تختلط عليك الامور سريعا , لا تخشى من طول الكلمة او الاسم و ركز على الوضوح و سرعة الفهم .

انواع المتغيرات 

الكمبيوتر مثل ما شرحناه و لاحظته انت بنفسك لا يقوم الا بعمليات حسابية , و لهذا يسمى بالحاسوب , لا يعرف التعامل الا مع الارقام و لا اي شئ اخر مهما كان بسيط .
نعم لكن في نفس الوقت توجد العديد من انواع الاعداد , مثلا توجد الاعداد الاجابية الكاملة : 
45 ;
398 

7650 

و توجد ايضا أرقام او اعداد عشرية ( الارقام هي من 0 الى 9 و الاعداد هي من 11 الى مالا نهاية ) , العشرية هي التي تحتوي على فواصل مثل : 
75,909 ;
1,7741 ;
9810,7 


مثل ما هو موجود في الاعداد و الارقام الصحيحة , نجد نفس الشئ في السلبية التي تكون مسبوقة بالرمز سالب - مثل : 
-87 ;
-916;


و العشرية منها مثل :
-76,9 ; 
-100,11;

الكمبيوتر بحاجة الى مساعدتك 😪 , حين تطلب منه تخزين عدد يتوجب عليك اطلاعه على اي نوع يتعلق به الامر , لا لانه لا يمكنه التعرف عليه لوحده , لكن انت تساعده كثيرا على تنضيم نفسه , و ان لا تجعله يستعمل الذاكرة في اشياء تافهة .

ادا حين تقوم بانشاء متغيرة في لغة البرمجة C سوف تحدد صنفها او نوعها , و هذا جدول لاهم اصناف المتغايرات في هذه اللغة 

هذه المتغيرات هي اقل شئ مضمون في اللغة C , يمكن حين البرمجة استعمال او بالاصح تخزين قيم اكبر لكن عليك بترك هذه القيم في راسك حين تختار نوع او صنف منها , و هو امر مهم و يجب حفظه عن ظاهر القلب .

طبعا لم نعرض الا اهم الانواع ( type ) , يوجد عدد منها لم نعرضه بعد لكي لا تظهر لكم الامور معقدة .

الاصناف الثلاثة الاولة التي عرضنها و هي (signed char, int, long) , تستعمل في تخزين الاعداد و الارقام الكاملة 1,2,3 ... الى ما لا نهاية .
المتبقية التي في الجدول و هي (float, double) تستعمل في تخزين الاعداد العشرية التي يطلق عليها اسم ( Floating numbers
 الترجمة الحرفية بالعربية هي : الاعداد العائمة ) مثل  13.8 و 16.911… الخ

سوف ترون اننا في اغلب الاحيان نستعمل الاعداد الكاملة .... ارى ان اغلبكم بعد هذه العبارة استرخى 😄 ... نعم هي اسهل للعمل ما سوف يجعلك لا تغوص في حسابات معقدة .

ملاحظة مهمة  تحدير !! حاسوبك لا يعرف الفاصلة في الارقام العشرية , هو يتعرف عليها بالنقطة و ليس بالفاصلة اذا عليك استعمال النقظة بدلا من الفاصلة ليكون كالتالي : بدل من كتابة 13,8 تكتب 13.8 

مثل ما قلنا توجد العديد من اصناف المتغيرات , و سوف نضيف الى قاموسينا نوع مميز في هذا الشرح و السهل للحفظ و هو unsigned , ميزته هي انه يقوم بتخزين  الاعداد الموجبة , قد تعتبرها نقصان لكن سعت تخزينه اكبر حين تستعمله , لتستعمل هذا الصنف "type" تكتبه في الاول لتكون النتيجة كالتالي :
نعم نوع unsigned لا يمكنه تخزين الاعداد السلبية , لكنه يتمتع بسعة تقريبا الضعف من التي عرضنها اعلاه مثل signed char تتوقف في 127 , بينما unsigned char تصل الى 255 .

ملاحظة : نجد ان كلمة char لا تاتي وحدها مثل signed char او unsigned char و هذا راجع الى شئ نسميه التوقيع , يوجد منها اثنان المُوقع و الغير مُوقع ( signed و not signed ) , هذا الاختلاف يكون باختلاف الجهاز , سوف تختار اي نوع تريد استعماله على حسب القيمة التي تريد تخزينها , سوف نرجع الى هذا لاحقا . 

سؤال : لمذا تم اختراع 3 انواع من اجل الارقام الكاملة , type واحد كان ليكون كافي و اسهل  ؟

نعم , لكن في الاصل تم اختراع عدد كبير منها للحفاظ على الذاكرة , و بهذا حين نطلب التخزين من type char , سوف نستعمل قدر اقل من type int .
عليك معرفة انها كانت تستعمل في البداية لتقليص اكبر عدد ممكن من استعمال الذاكرة التي كانت محدودة في احجام صغيرة جدا , في وقتنا الحالي الاجهزة لها ما يكفي من الذاكرة RAM لجعل الامر اسهل لنا , ليس عليك ان تقضي ساعات في التفكير في اي type تستعمل , ان كنت غير متاكد من القيمة التي سوف ياخدها المتغير ضع مثلا int مباشرة للاعداد الكاملة او double للاعداد العشرية .

للعلم ان في بداية سنة 2000 كانت 120 ميجا من RAM تعتبر كمية ضخمة , الان اقل شئ متوفر على الاجهزة هو 4 جيجا و كمبيوتر للالعاب يصل الى 32 جيجا , فرق شاسع .

خلاصة :

علينا فقط التمييز بين الاعداد الصحيحة ( الموجبة ) و الاعداد العشرية ( العائمة) , سوف نستعمل غالبا int للاعداد الصحيحة , و double للعائمة , هذا في اغلب الاحيان و ليست قاعدة , الامر يتعلق بالقيمة .

نرجع الان الى عنواننا الاصلي و هو الاعلان عن متغير , تتجه الى المترجم CodeBlocks قم بانشاء مشروع جديد project على شكل consol ( وحدة التحكم ) , قم باعطائه اسم متغايرات ( الترجمة بالانجليزية Variables ) , سوف نتعلم طريقة استعمالها , بمعنى نطلب من الحاسوب استغلال القليل من ال RAM في برنامجنا .


الاعلان عن متغير سهل جدا , بعد اطلاعك على كل ما يلزمك , يتبقى عليك اعطاء الامر .

1 . تضع نوع Variable الذي سوف تقوم بانشائها .
2 . إدراج مسافة ( فراغ ) .
3 . تكتب الاسم الذي تريد اعطائه لل Variable .
4 . و في الاخير تضع منقوطة  ; ( لا تنسى المنقوطة ابدا )

مثال : لو اريد انشاء Variable لعدد المحاولات في لعبة numberOfLives من type : int علي بكتابة السطر التالي :


نعم بكل بساطة , ما نقوم به هنا يسمى في البرمجة ( a variable declaration ) الترجمة الحرفية هي الاعلان عن متغير , يجب الاعلان عن المتغيرات في بداية الدوال ( Functions ) , لاننا الى حد الان لا نستعمل الى الدالة main سوف تقوم بالاعلان عليها مثل ما هو مبين في التالي :


لو انك تقوم بتشغيل البرنامج مثل ما هو مكتوب حاليا , سوف تلاحظ و بوضوح انه ... لا يفعل شئ !!! .
اذا قبل البداية في التهجم علي ( محاولة الاعتداء في التعليقات بانه درس فاشل و شرح لا يُجدي بنفع 😖) دعوني ابرر لكم .

- في حقيقة الامر هنالك امور تحدث حين تشغيل البرنامج , لكنك لا ترى شئ على سطح المكتب , حين يصل البرنامج الى سطر الاعلان عن المتغير , سوف يطلب من الحاسوب ( بادب ) ان يستعمل القليل من ال RAM , ان لم تقع اخطاء سوف يتجاوب الحاسوب مع الامر بطريقة تلقائية ( يقول للبرنامج تفضل خذ من الذاكرة الحية , البيت بيتك ) , غالبا لا تكون هنالك اي مشاكل , المشكلة الوحيدة التي يمكن ان تقع , هي عدم توفر المكان , اي لا يمكن للحاسوب ان يعطيه من الذاكرة لانه يستعملها كليا و هذا لا يحدث الا نادرا , لانه اخذ كل الذاكرة الا عن طريق نوع int ... يجب ان تكون متعمد لتخريب المشروع كليا 😀 .

حيلة صغيرة يمكنك تعلمها , ان كان لديك الكثير من المتغايرات للاعلان عنها من نفس النوع , لا تقوم بانشاء سطر لكل واحدة منها , يمكنك الفصل بينها جميعا بفاصلة على نفس السطر مثال :


بهذه الطريقة سوف يتم انشاء 3 متغيرات int باسماء numberOfLives و level و ageOfThePlayer 

- الى هنا نكون قد وصلنا الى نهاية الجزء الاول من الدرس الخامس , اتمنى ان ينال اعجابكم و لا تتردوا في المشاركة بالتعليقات لدعمي معنويا في مواصلة الدورة .
- في الجزء الثاني من المتغايرات سوف نتعلم طريقة اعطائها قيم و تحديد عملها في استخدام ال RAM .