:¦- (4) تعلّم لغة الـ:C من الصفر -¦:
آخر
الصفحة
EdyBel

  • المشاركات: 46565
    نقاط التميز: 15853
عضوة أساسية
EdyBel

عضوة أساسية
المشاركات: 46565
نقاط التميز: 15853
معدل المشاركات يوميا: 7.4
الأيام منذ الإنضمام: 6267
  • 14:23 - 2011/05/04

زخرف 
مواضيعك بهذه الفواصل الحلوة المميزة مجموعة خطوط عربية مبهرة [ضروري 
الدخول]

 ندخل الآن في درس مهم للغاية، و الذي سيفيدنا مستقبلا، و لا يمكنه تجاهله في أي ظرف من الظروف. اعطيكم ملخصا صغيرا للدروس السابقة :

تعلمتم كيف تبنون مشروعا جديدا لبرنامج كونسول بالـ:IDE الذي نسميه : Code :: Blocks ، قلت لكم بأنه من الصعب على مبتدئ أن يقوم ببرمجة برنامج من نوع نافذة، لهذا سنقتصر على الكونسول من نوع DOS . و سنرى أشياء مهمة جدا .
لقد قمتم بإظهار مسج على الشاشة، هذا رائع لكن ستقولون بأنه ليس كذلك لأنه ليس بالأمر الذي يضاهي برمجة لعبة، أجيبكم و أقول بأنكم مادمتم بمتدئين فلا تعرفون ماذا نعنيه بالمتغيرات في البرمجة .
لقد عرفنا إذا ما موضوع اليوم، و الذي لا مفرّ منه إلا إليه، و الذي يعتبر قاعدة اللغة .

- ماذا نعنى بالمتغيرة بالظبط ؟

هذا الدرس كله من أجل إفهامكم المعنى الخاص بها، لا أريد أن أفسد عليكم التحمس لكن سنتعلم اليوم أن نقوم بالمحافظة على الأرقام بالكومبيوتر . أي سنتعلم كيف نخزّن أرقاما في الذاكرة .أفضل أن نبدأ ببعض الشروحات في ذاكرة جهازكم la mémoire . فكيف تعمل الذاكرة يا ترى ؟ و كم من ذاكرة مختلفة نجدها في الأجهزة ؟
سيكون هذا سهلا للبعض منكم،  لكن هناك من بينكم من لا يعرف أبدا ما تعنيه الذاكرة.

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

ما سأعلمكم إيه في هذا الدرس له علاقة مباشرة بذاكرة جهازكم، من المفترض أن كل كائن حي وُلد بذاكرة، و الأمر عينه مع أجهزة الكومبيوتر، و لعلم فللجهاز الواحد أنماط عديدة من الذاكرة !

- لماذا يملك الجهاز أنواع متعددة من الذاكرة ؟ ألا تكفي واحدة فقط؟

لا هذا غير كافٍ، أساسا نحتاج ذاكرة سريعة جدا Rapid ( لاسترجاع المعلومات بطريقة سريعة ) وواحدة مهمة Importante ( لتخزن الكثير من الأشياء ) ، ستضحكون لكن هذا هو الواقع، للآن لم يتم اختراع واحدة تحمل الصفتين، كمعلومة فالسريعة هي الأغلى ثمنا و بالتالى ليست مسوّقة بشكل كبير مثل المهمة، نجد في غالب الأحيان في الجهاز الواحد ذاكرة سريعة جدا و غير مهمة، أو ذاكرة مهمة و غير سريعة .

- الأنماط المختلفة للذاكرة :

كي أوضح لكم الصورة بشكل أقرب، تفضوا أنماط الذاكرات في الحاسوب، مرتبة من الأسرع إلى الأبطئ :
1- الذاكرة السجلّة registre : سريعة بشكل رهيب، موجودة في الأساس مع الـ:processeur .
2- ذاكرة الوصول العشوائي vive : و التي سنستعملها دائما .
3- الذاكرة المخبأة cache :  و التي تربط بين الذاكرتين 1 و 2 .
4- القرص الصلب disque dur : نعرفه جميعا، مختص في تخزين الملفات.

كما قلت لكم، لقد رتبتها من الأسرع ( السجلة ) إلى الأبطئ ( القرص الصلب ) ، و كما تلاحظون فالذاكرة الأسرع كانت الأصغر حجما، و الأبطئ كانت هي الأكبر حجما، يمكن للسجلات بتخزين عدد كبير من الأرقام بينما القرص الصلب متخصص في تخزين الملفات الكثيرة .

عندما أقول ذاكرة بطيئة، طبعا ذلك بالنسبة لجهاز الكومبيوتر الخاص بك، فوصول المعلومة إليه بعد 8 ميلي ثانية مثلا يعتبره وقتا طويلا جدا !

- ماذا يجب أن نتذكر من كلّ هذا ؟

يجب أن تبقوا محتفظين بفكرة أننا سنستعمل ذاكرة الوصول العشوائي vive في البرمجة، سنتعلم أيضا كيف نكتب أو نقرأ من خلال القرص الصلب من أجل انشاء ملفات جديدة ( سنقوم بهذا لاحقا ) .. أما الذاكرتان السجلّة و المخبأة لن نلمسها أبدا ! سيهتم بأمرهما جهاز الكومبيوتر.

في اللغات من مستوى منخفض جدا، مثل : (abrégé "ASM")،  يتعامل المبرمج مباشرة مع الذاكرة السجلة ، و كمعلومة فإقامة عملية ضرب بهذه اللغة يمثل عقبة عالية وجب اجتيازها ! لكن الحمدلله في لغة الـ:C و معظم اللغات المتبقية يكون هذا أسهل شيء نقوم به .

أضيف شيئا أخيرا و مهما، القرص الصلب وحده من يحتفظ بكل المعلومات التي يتضمنها، أما الذاكرات الأخرى ( السجلة، المخبأة و ذاكرة الوصول العشوائي ) كلها عبارة عن ذاكرات مؤقتة: عندما تقوم بقفل جهازك تصبح هذه الذاكرات مفرّغة تماما !! ، الحمدلله فالقرص الصلب يذكّر الجهاز بما هو عليه ما إن تشغل الجهاز من جديد .

- ذاكرة الوصول العشوائي بالصور :

بما أننا سنعتمد اعتمادا كليّا في عملنا على ذاكرة الوصول العشوائي فمن المستحسن أن نتعرف عليها قليلا، و لكي نصل إليها سنقوم بالتقريب zoom تدريجيا :

هذا هو جهازكم xD

تعرفون مما يتكون عموما، الشاشة، الوحدة المركزية، الفأرة، لوحة المفاتيح .. إلخ
نهتم الآن فقط بالوحدة المركزية unité centrale ، قلب جهازكم الذي يحتوى على كلّ الذاكرات :

ما يهمنا أكثر هو محتوى الوحدة المركزية، بعدما نفتحها :

Image utilisateur

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

 

لقد خدعتكم نوعا ما، فكلكم يعرف ماهي ذاكرة الوصول العشوائي، ماذا هي برأيكم ؟ إنها الـ:RAM ، و بالتالى سأظل أنادى لها بهذا الاسم مادام أسهل للجميع .

- مخطط لذاكرة الوصول العشوائي:

لن أفتح لكم الرام لتعرفون كيف تعمل لكن نمذجت ذلك في مخطط بسيط و هو سهل جدا للفهم و هذا طبعا لأننا لا نعرف معلومات و تفاصيل أكثر فعالمها معقد في حد ذاته :

كما ترون، نفرق بين خانتين :
1- هناك العناوين : هي أرقام تسمح للجهاز بتحديد وضعه بالنسبة للرام، نبدأ بالعنوان 0 ( الأول في الذاكرة ) ، وننتهى بالعنوان 3 448 765 900 126  و أجزاء بسيطة، لا نعرف كم من عنوان متواجد بالرام لكننا نعرف بأنه هناك العديد منها . لأنه حسب مواصفة الرام الذي يحتويها الجهاز فإن زادت يزيد العنوان و هكذا .. و بالتالى يمكنك تخزين الكثير من الأشياء .

في كلّ عنوان يمكننا تخزين قيمة ( رقم ) : يقوم جهازك بتخزين هذه القيم في العناوين ليتذكرها لاحقا، و أذكركم انه لا يخزن سوى الأعداد في الرام!

- كيف يمكن للجهاز بالاحتفاظ بكل هذه الكلمات إذا ؟

حتى الأحرف التي نعرفها ليست بالنسبة للجهاز سوى أرقام ! و هو مبرمج بجدول يضع فيه دلالة كل حرف بعدد، كمثال : العدد 89 يعنى الحرف y .. لن أدخلكم أكثر في التفاصيل لأننى سأفهمكم كل هذا في وقت لاحق من الدروس .

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

- إطلاق متغير

صدقونى ، ما عرفتهم سابقا في الدرس سيساعدنا كثيرا على فهم ما سيحصل في بقية الدرس، و الآن إلى العمل :

- ماهو المتغير ؟
باختصار المتغير هو معلومة صغيرة نقوم بتخزينها في الـ:RAM ، و هو يدل على قيمة يمكن ان تتغير باستمرار أثناء تشغيل البرنامج، كمثال ذكرنا سابقا بأن الرقم 5 يدل على الصحة عند اللاعب، و طبعا إذا تراجع العدد إلى الصفر فسيموت اللاعب و تخسر الجولة .
في برنامجنا سيكون هناك الكثير من المتغيرات و هذا ما سترونه في وقت لاحق .
في لغة الـ:C ، المتغير يتميز بشيئين :
1- القيمة : و هو الرقم الذي نخزنه، مثلا 5
2- الإسم : و هي الشيء الذي يجب أن نعرفه، في السي ليس مهما أن نحفظ عنوان الذاكرة، يكفي أن نعطي أسماءا للقيم الخاصة بها و نحفظها و هذا في صالحنا طبعا، و طبعا المصنف Compilateur هو من يقوم بترجمة الإسم الذي اخترته إلى البرنامج على شكل عنوان.

- تسمية المتغير

كما قلت فلكل متغير اسم في لغة السي، فمثلا الرقم 5 الخاص بصحة اللاعب يمكننا إطلاق الإسم "Nombre de vies" عليه ، أو أي شيء يقارب ذلك المعنى . هذا يعطينا حرية كبيرة لكن هذا يقيدنا بشروط :
1- يجب أن يحتوى الإسم فقط على حروف minuscules أو  majuscules  أو أرقام (abcABC012...).
2- يجب أن يبدأ الإسم بحرف
2- لا يسمح بوضع الفراغ بين كلّ كلمتين و بهذا يسمح لكم باستخدام الرمز _ لأنه الوحيد المسموح به من غير باقيه من الرموز .
3- لا يمكنكم استخدام الحروف التي لها إضافات كحروف éàê .

يجب أن تعرفوا بأن لغة السي تفرق بين الحروف minuscules و الحروف majuscules  و يعتبرهما مختلفين جدا، فبهذا يمكننا اعتباره بأنه يحترم قواعد اللغة بالرغم من أننا نجدهما نفس الشيء . كمثال ، الإسم largeur أو LARGEUR أو  LArgEuR  يعتبرهما أسماء مختلفة لقيم مختلفة !

هذه بعض الأمثلة على أسماء قيم صحيحة : nombreDeVies و  nombre_de_vies و  prenom و  nom و  numero_de_telephone و  numeroDeTelephone.

لكل مبرمج طريقة خاصة في كتابة القيم، و أنا لي طريقتى الخاصة هي كالتالى :
1- أبدأ دائما اسم القيمة بحرف minuscule ،
2- إن كان في الاسم أكثر من كلمة أضع حرف majuscules في بداية كلّ كلمة.

تذكر بأنه مهما كان اسم القيمة طويلا لن يؤثر على الجهاز أو البرنامج في شيء ، المهم أن تجعله مفهوما كي تستطيع حفظه، لا تختصر مادمت في البداية فمثلا اسم القيمة nombreDeVies يمكننى أن أكتبه بالشكل ndv لكنه غير مفهوم ، و بهذا أنصحكم بعدم الإكتراث لطوله أو قصره .

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

كما سبق و عرفنا بأن الحاسب ماهو إلا عبارى عن آلة حاسبة ضخمة تتعامل مع الأرقام و الأعداد فحسب، لكن هناك أنواع كثيرة من الأرقام !

1- entiers positifs  هناك الأعداد الطبيعية : 45 و  398  و 7650.
2-   décimaux هناك أيضا الأعداد العشرية :   75,909 و 1,7741 و  9810,7 .
3- entiers négatifs  هناك الأعداد الطبيعية السالبة : -87 و  -916
4-négatifs décimaux  الأعداد العشرية السالبة :  -76,9  و -100,11

جهازكم المسكين بحاجة للمساعدة ! ، عندما تطلب منه تخزين عدد، يجب أن تشرح له نوعه، هذا ليس منطقيا صح ؟ طبعا بامكانه أن يقوم بذلك لكن إذا قدمت له نوع الرقم سيكون أكثر تنظيما و لا يأخذ مساحة كبيرة من الذاكرة !

مادمتم بتطلقوم قيمة فيجب أن تعطوا نوعها، هذه بعض الأنواع في لغة الـ:C ( هي أهمها، لكن توجد اخرى نستعملها أيضا في الـ:C++ ) 

إسم النمط  الأعداد المخزنة
char -128 إلى 127
int -2 147 483 648 إلى 2 147 483 647
long -2 147 483 648 إلى 2 147 483 647
float -3.4 x 10 puissance 38 إلى 3.4 x 10 puissance 38
double -1.7 x 10 puissance 308 إلى 1.7 x 10 puissance 308

( لقد قمت بوضع الأهم فقد فاللائحة تبقى طويلة جدا )

1-الأنماط الثلاث الأولى (char, int, long) تسمح يتخزين الأعداد الطبيعية .
2- النمطين الأخيرين (float, double) يسمحان بتخزين الأعداد العشرية.

ملاحظة : النمطين (float, double) يسمحان بتخزين الأعداد الكبيرة جدا، قد تفوق تصوركم لأنها من أسس العشرة و بالتالى قد تصادفون 500 صفر بعد الواحد كـ:1000000000000000000000000000000000000000000000000000 ( طبعا لا يمكننى كتابة كل الأصفار )

كما تلاحظون فنمطى int و long يبدوان متطابقين، لكن الـ:int أصغر من الـ:long، هذا كي تعرفوا الفرق بينهما. .... في التطبيقات استخدم شخصيا الـ:char, int و double .

ستجدون بأنه في معظم الأحيان نستخدم الاعداد الطبيعية فقط، على أي حال هي الأسهل من الأخرى . و هنا أنبهكم للأعداد العضوية فالجهاز لا يعرف الفاصلة بل يتعامل مع النقاط، لهذا عضو ان تكتبوا مثلا 54,9 أكتبوا 54.9 !

ليس هذا كل شيء، بالنسبة للأنماط التي تخزم الأعداد الطبيعية، هناك انماط أخرى نسميها  "unsigned"و التي تعني " غير الموقعة " ، و التي لا تسمح بتخزين إلا الأعداد الموجبة، و لكي نستخدمها يكفي أن نكتب الإسم  "unsigned" قبل النمط ، كالتالي :

unsigned char 0 à 255
unsigned int 0 إلى 4 294 967 295
unsigned long 0 إلى 4 294 967 295

كما ترون فـ: " غير الموقعة " تعنى الانماط التي ليس لها القدرة على تخزين الأعداد السالبة، ما يميزها عن باقيها أنه بامكانها تخزين مضاعف الأرقام التي تخزنه باقيها، مثلا النمط char يتوقف عند 182 ، فإن النمط unsigned char  يتوقف عند 255 .

- لماذا هناك ثلاث أنماط لتخزين الأعداد الطبيعية . ستكون واحدة كافية أليس كذلك ؟

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

بالإجمال ، نميز بين الأعداد الطبيعية و الأعداد العشرية كالتالي :
1- الأعداد الطبيعية : استخدموا فيها النمط int .
2- الاعداد العشرية : استخدموا فيها النمط  double.

- إطلاق المتغير :

هاقد وصلنا ، قوموا ببناء مشروع جديد و سمّوه  "variables". سنتعلم كيف ( نطلق متغيرة - نعلنها )، بمعنى آخر نسمح للكومبيوتر باتغلال الذاكرة قليلا، مادمتم تعرّفتم على معناها قليلا فسيكون الأمر سهلا بالنسبة لكم ، وجب فقط الحفاظ على الترتيب :
1- نكتب في المساحة المخصصة للكودسورس نمط المتغير الذي سنقوم باطلاقه.
2- نترك فراغ espace
3- اختيار الإسم الذي نريده أن يكون للمتغير .
4- طبعا انتهاء التعليمة ، أي إشارة نقطة-فاصلة
;

مثلا، إذا أردت إطلاق متغيرتي التي سميتها nombreDeVies بالنمط int  سيكون عليّ كتابة التالي :

int nombreDeVies;

 

هذا فقط ! ، يمكننى اختيار أي نمط و أي إسم كالتالي مثلا :

int noteDeMaths;
double sommeArgentRecue;
unsigned int nombreDeZerosEnTrainDeLireUnNomDeVariableUnPeuLong;

أعتقد بأنكم فهمتم المبدأ الآن ، ماقمنا به نسميه : إطلاق أو إعلان متغير . يجب عليكم من الآن وصاعدا إعلان متغيرات في بداية الدالة . و بما أننا في البداية فنحن نملك الدالة الرئيسية main فقط و هذا ما سيصبح عليه الكودسورس إذا :

#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[]) // Equivalent de int main()
{
  // Début de la fonction
  int nombreDeVies;  
    
  return 0;
  // Fin de la fonction
}

 

كما تلاحظون، ففي السطر الثالث كتبت التعليق Equivalent de int main() قصدت بها : معادل للدالة main
أما بداية الدالة Début de la fonction و نهاية الدالة Fin de la fonction واضحتان  .

طبعا سيأخذكم الفضول و ستقومون بالترجمة و التشغيل build & run لكن كما تلاحظون لا شيء يحدث، بالواقع لقد حدثت أشياء لكن لا يمكنكم أن تروها ، فعندما وصل الجهاز للسطر الخاص بإطلاق المتغير عرف بأنه واجب عليه تخزين بعض المعلومات في الذاكرة ذات الوصول العشوائي mémoire vive .

المشكل الوحيد الذي يمكن أن نصادفه هو ماذا يفعل الجهاز إذا كانت الذاكرة ممتلئة و لا يوجد بها فراغ، لكن لحسن الحظ  هذا ما يحصل نادرا فقط و متأكدة من أنه لن يصادفكم . و لهذا لا تهتموا بالأمر فالمتغيرات التي ستطلقونها ستعمل بشكل عادي .

أريد أن أشير لكم لشيء وجب أن تعرفوه و هو إن أردتم أن تطلقوا أكثر من متغيرة من نفس النوع، ليس من الواجب أن تضعوا كلّ متغير في سطر بل يكفي أن تفرقوا بينهم بفاصلة كالتالي :

int nombreDeVies, niveau, ageDuJoueur;

 

هذا ما سيطلق ثلاث متغيرات من نوع int و التي هي : nombreDeVies و niveau و ageDuJoueur .

و الآن ماذا سنفعل برأيكم ؟ طبعا سنقوم بإطلاق متغيرة من عندنا و بامكاننا أن نعطيها قيمة .

- تعيين قيمة متغير

هذا أمر سهل للغاية فإن أردنا أن نعطي قيمة لمتغيرنا الرئيسي nombreDeVies يكفي أن نفعل التالي :

nombreDeVies = 5;

 

لن نفعل شيئا بعد هذا، ستضعون إسم المتغير، إشارة تساوي ، بعدها القيمة التي تريدون أن تضعوها بالداخل، في هذه الحالة سنعطي القيمة 5 للمتغير nombreDeVies  . برنامجنا الكامل سيكون هكذا :

#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[])
{
  int nombreDeVies;
  nombreDeVies = 5;
      
  return 0;
}

 

و هنا كذلك لن يظهر شيئا بالجهاز فكل شيء سيتم داخل الذاكرة، فهنا لقد قمنا بإدخال قيمة معيّنة لأعماق جهانا و هو شيء جيد . يمكنكم الآن إطلاق أي قيم تريدون مثلا هكذا :

int nombreDeVies;
nombreDeVies = 5;
nombreDeVies = 4;
nombreDeVies = 3;

 

في هذا المثال، المتغير سيأخذ القيمة 5 ثم 4 ثم 3 ، و هذا ما سيقوم الجهاز بتخزينه أسرع من رمشة العين .. هنا ينتهي برنامجنا .

- قيمة متغير جديد

هناك سؤال وجيه يجب أن نسأله ، عند إطلاق متغير، أي قيمة تكون فيها ؟
لما يقوم الجهاز بقراءة هذا السطر :

int nombreDeVies;

 

- نحن نعرف بأنه سيخزن المتغير في الذاكرة لكن بأي قيمة يأخذه ؟ 0 مثلا ؟
الإجابة هي لا ، ثم لا ثم لا ، لا يمكن للجهاز وضع قيمة من عنده، طبعا سيشغل المساحة، لكن القيمة لا تتغير، لا يمكننا مسح ما يوجد في خلية الذاكرة، لأن المتغير حينها سيأخذ قيمة آخِرِ متغير خزّنته الذاكرة و قد يكون أي عدد كان !
إذا لم يتم تغيير هذه المنطقة من الذاكرة أبدا، يمكن أن تكون القيمة هي 0، لكن هذا ليس مؤكدا طبعا، يمكن له أن يأخذ القيمة 363 أو 18 مثلا، مما يدل أنه هناك برنامج قديم مرّ على هذه القيم من قبل ! و لهذا كي لا تعترضنا المشاكل لاحقا يجب تهيئة المتغير قبل إطلاقه، في لغة السي هذا أمر ممكن كلّ ما في الأمر هو القيام بالدمج بين الإطلاق و تعيين المتغير في نفس التعليمة  كالتالي :

int nombreDeVies = 5;

 

في هذه الحالة المتغير nombreDeVies تم إطلاقه متبوعا بالقيمة 5 . و هذا يضمن لكم بأن المتغير الذي ستطلقونه لاحقا ( و لو لم تعطوه قيمة محددة ) سيأخذ القيمة 5 فقط و ليس أي قيمة لا تعرفون وظيفتها .

- الثوابت

في بعض الأحيان نكون بحاجة إلى أن نحافظ على قيمة واحدة للمتغير طيلة برمجة البرنامج، و بالتالي فما إن نطلقها و يسجلها الجهاز ، لا يمكن لأي أحد أي يغيّر فيها، هذا النوعم النادر من المتغيرات نسميه بالثوابت  ، لإطلاق ثابت، الأمر سهل، يكفي أن نكتب اسم  "const" تماما قبل النمط الخاص بمتغيرتك . لكن كما تعرفون يجب أن نعطيه قيمة معينة ليحافظ عليها طيلة الوقت، و اذكروا بأنه ما إن تطلقوها لن يمكنكم التراجع في إعادة كتابتها ، هذا مثال لإطلاق ثابت  :

const int NOMBRE_DE_VIES_INITIALES = 5;

 

هذا ليس بالأمر الضروري و الحتمي، لكن لنتفق أن نكتب حروف الثابت كلّها majuscules لنفرق بين الثابت و المتغير، و لا تنسوا أن تجعلوا الرمز _ بدلا للفرغ espace ..

غير هذا، الثابت يستعمل بشكل عادي كالمتغير ، يمكنكم اختيار قيمته ثم إطلاقه، الشيء الوحيد و الذي ذكرته هو أنكم إذا حاولتم تغيير قيمته لاحقا سيقوم المصنف بإظهار خطأ لكم لعدم القدرة على تغييره . و كما تعرفون فأخطاء الترجمة تظهر لكم في منطقة الموت ( الفرغ في الأسفل ) ، فسيظهر لكم المصنف عبارة كهذه تقريبا :  [Warning] assignment of read-only variable ' NOMBRE_DE_VIES_INITIALES' بمعنى : تحذير أنت غبي فلماذا تحاول تغيير الثابت الذي لا يتغير ؟ ( أمزح فقط ) ، إنه يحذر بأنه غير قادر إلا على قراءة المتغير nombre de vies .

- إظهار محتوى متغير

نحن نعرف كيف نظهر مسج على الشاشة باستخدام الدالة printf . الآن سنتعلم كيف نظهر القيمة الخاصة بالمتغير باسخدام نفس الدالة،
سنكتب نفس عبارة الدالة لكننا سنعطيها إشارة تقوم فيها بإظهار قيمة المتغير لنا . مثلا :

printf("Il vous reste %d vies");

 

هذه الإشارة أو الرمز الذي تكلمت عنه هو إشارة % متبوعة بحرف d ، يشير % إلى ما يجب أن نقوم بإظهاره، أما d فيعني بأن العدد صحيح أو طبيعي .

هناك العديد من الرموز التي يمكن استخدامها ، هذين أسهل و أسبط إثنين منها :

الرمز المعنى
%d عدد صحيح (ex. : 4)
%f  عدد عشري (ex. : 5.18)

سأكلمكم عن مزيد من الرموز في الوقت المناسب لذلك، فقط إعلموا أنكم إذا أردتم أن تستخدموا نمط int عليكم باستخدام d% و إن أردتم أن تستخدموا نمط double فعليكم باستخدام الرمز f% ،

إقتربنا من النهاية، لقد قلنا بأننا نريد إظهار عدد صحيح لكننا لم نحدده بالظبط ما هو ! يجب أن نأمر الدالة printf قيمة أي متغير ندير أن نظهر على الشاشة .

لفعل ذلك، يجب أن  تفتحوا قوس  ثم  تكتبوا إسم المتغير  و تضعون فاصلة كالتالي :

printf("Il vous reste %d vies", nombreDeVies);

 
الـ:d% سيتم استبداله بالمتغير المشار إليه nombreDeVies ثم فاصلة من بعده .
لنجرب البرنامج الآن :
 

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int nombreDeVies = 5; // Au départ, le joueur a 5 vies
 
  printf("Vous avez %d vies\n", nombreDeVies);
  printf("**** B A M ****\n"); // Là il se prend un grand coup sur la tête
  nombreDeVies = 4; // Il vient de perdre une vie !
  printf("Ah desole, il ne vous reste plus que %d vies maintenant !\n\n", nombreDeVies);
 
  return 0;
}

 
هذا التمرين البسيط يشبه ما يحصل في ألعاب الفيديو مع إضافات أخرى بطبيعة الحال، هذا ما سيظهر لكم في الواجهة :
Vous avez 5 vies
**** B A M ****
Ah desole, il ne vous reste plus que 4 vies maintenant !
 
يجب أن تعرفوا ما يحصل في برنامجكم :
1- في البداية ينطلق اللاعب بصحة 5 hp . و هذا ما وضعناه في الدالة printf
2- اللاعب يتلقى ضربة و الذي يظهر BAM .
3- يبقى له في الصحة 4 و هذا ما توضحه كذلك الدالة printf.
 
كان هذا سهلا جدا .
 
- إظهار العديد من المتغيرات في نفس الدالة  printf

يمكن إظهار قيمة متغيرات عديدة تحت نفس الدالة printf ، يكفي أن تأمروا الـ:d% أو الـ:%f ما تريدون القيام به ، و طبعا تأمرون المتغير بنفس الأمر ، و تفصلونها بفواصل كالتالي :
 

printf("Vous avez %d vies et vous etes au niveau n°%d", nombreDeVies, niveau);

int main(int argc, char *argv[])
{
  int nombreDeVies = 5; // Au départ, le joueur a 5 vies
 
  printf("Vous avez %d vies\n", nombreDeVies);
  printf("**** B A M ****\n"); // Là il se prend un grand coup sur la tête
  nombreDeVies = 4; // Il vient de perdre une vie !
  printf("Ah desole, il ne vous reste plus que %d vies maintenant !\n\n", nombreDeVies);
 
  return 0;
}

 
 
 
يجب أن تأمروا متغيرتكم بالأمر الصحيح ، الـ:d% الأول يتم تغييره بالمتغيرة الأولى nombreDeVies و الـ:d% الثاني يتم تغييره بالمتغير الثانية niveau ، إن خلطتم في ترتيبهما لن يكون لجملتكم أي معنى .

لنقم بتجريب آخر الآن، كما ستلاحظون سأحذف الأصطر الأولى ( توجيهات المعالج التي تبتدأ بدياز # ) ، و هذا ما ستجدونه  :
 

int main(int argc, char *argv[])
{
  int nombreDeVies = 5, niveau = 1;
 
  printf("Vous avez %d vies et vous etes au niveau n°%d\n", nombreDeVies, niveau);
 
  return 0;
}

int main(int argc, char *argv[])
{
  int nombreDeVies = 5; // Au départ, le joueur a 5 vies
 
  printf("Vous avez %d vies\n", nombreDeVies);
  printf("**** B A M ****\n"); // Là il se prend un grand coup sur la tête
  nombreDeVies = 4; // Il vient de perdre une vie !
  printf("Ah desole, il ne vous reste plus que %d vies maintenant !\n\n", nombreDeVies);
 
  return 0;
}

 
 
و هذا ما سيظهر بالشاشة :
 
Vous avez 5 vies et vous etes au niveau n°1
 
- استرجاع قيمة:

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

لنطلب من المستخدم إدخال شيء في الكونسول، سنستخدم دالة أخرى جاهزة كذلك و هي الدالة scanf و هي دالة تشبه كثيرا الدالة printf ، ستكتبون على d% لتشروا لجهاز بأن المستخدم سيدخل رقما صحيحا ( للأرقام العشرية سأرجع لاحقا ) ، بعدها تكتبون اسم المتغير الذي سيتلقى القيمة .

هذا مثال بسيط : 

int age = 0;
scanf("%d", &age);

 

سنضع الـ:d% داخل القوسين، و كذا ستكتبون الرمز & مرفوق باسم المتغير الذي يتلقى القيمة.
 
حذاري ! : إذا كنتم ستستخدمون عددا عشريا فيجب أن ترفقوه بالرمز f% ، فهناك فرق فيه عند الدالة printf و هذا ما سنعود إليه لاحقا .
 

double poids = 0;
scanf("%lf", &poids);

 
 
لنرجع إلى برنامجنا الآن، عندما يصل هذا الأخير للدالة scanf، سيقوم بالتوقف قليلا في انتظار من المستخدم أن يدخل قيمة معينة، و هذا الرقم سيكون مخزنا في المتغير age . هذا برنامج صغير يطلب من المستخدم إدخال عمره :
 

int main(int argc, char *argv[])
{
  int age = 0; // On initialise la variable à 0
 
  printf("Quel age avez-vous ? ");
  scanf("%d", &age); // On demande d'entrer l'age avec scanf
  printf("Ah ! Vous avez donc %d ans !\n\n", age);
      
  return 0;
}

 
 
هذا هو الناتج :
 

Quel age avez-vous ? 20

Ah ! Vous avez donc 20 ans !

معناه أن هذا البرنامج يتوقف عندما يصل للسؤال و الذي يطرحه للمستخدم :  "Quel age avez-vous ?".  أي كم عمرك ؟  و عندما يظغط المستخدم رقما يدل على سنّه و يظغط على Entree للتأكيد،  يكمل بعدها البرنامج في التنفيذ و التشغيل و هنا تكون مهمة الجهاز فقط إرجاع السن و يجيبك ، آآه إذا أنت ذو العشرين سنة أو الخامس عشر حسب ما كتبت له .

و هنا تكونون قد فهمتم المبدأ ، بفضل الدالة scanf يمكننا التعامل مع المستخدم أو اللاعب إن كانت لعبة، إعرفوا بأنه لا يوجد شيء يمنعكم من كتابة عدد عشري :
1- عندما تدخلون رقم عضوي كـ:2.9 مثلا، سيتم أوتوماتيكيا قطعه و أخذ الجزء الصحيح منه و في هذه الحالة سيتم تخزين الرقم 2 فقط، عندما تدخلون قيما ملخبطة  ("éèydf"),  لا تتغير قيمة المتغير، و لحسن الحظ لقد نظّمنا متغيرتنا على القيمة 0 دائما ، يعني يقوم الجهاز باظهار : السن = 0 ، و بالتالي نتيجة تدل على وجود خطأ،  أما إن كنا لم ننظم متغيرتنا فتوقعوا أن تأتيكم أي نتيجة ، تظهر لكم قفيمة آخر متغير عملت به أي أي عدد كان !


ينتهى درسنا للمتغيرات اليوم هنا ، للعلم فالمتغيرات نعمل بها دائما في البرمجة، و إذا فهمتم مبدأ أن المتغير هو تخزين قيمة مؤقتا في الذاكرة، فقد فهمتم كلّ شيء، و لا يبقى سوى أن تحفظوا أنماط المتغيرات int - char ..إلخ .
قوموا بتجارب من عندكم بالدالة scanf و أجيبوا الجهاز بقيم و هي التي سيظهرها لكم ، المهم الدرس القادم سيكون حول كيفية القيام بالحساب بلغة السي، فكونوا على استعداد لاستخدام الدالتين scanf و printf .

 :¦- (4) تعلّم لغة الـ:C من الصفر -¦:
بداية
الصفحة