المتغيرات (Les variables) في C

المتغيرات (Les variables) في C

المتغيرات (Les variables) في C

   إلى الان تمكنت من معرفة كيفية عرض نصوص على الشاشة، بواسطة الدالة printf. قد لا يبدو الامر بالشيء المهم، كما انك لايمكنك فعل الشيء الكثير بهذه الدالة. لكن سرعان ما ستتغير الامور عند اكتشافك لما يسمى بالمتغيرات (Les variables).

   المبدأ هو حفظ الأعداد أو المعطيات على ذاكرة الكمبيوتر. سنتعلم كيفية تخزين الأرقام في الذاكرة.

   في الأول أفضل البدأ عبر شرح الذاكرة وكيفية تخزين الاعداد والمعطيات.

مسألة الذاكرة

   الذاكرة الرئيسية هي مجموعة من الخانات، كل خانة تسمى البِيت (bit). كل 8 بِيت تسمى  بالبَايِت (byte) ، ويتم ربط كل بايت بعنوان خاص به.

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

  1. السجلات (les registres) : ذاكرة فائقة السرعة تقع مباشرة في المعالج ؛
  2. ذاكرة التخزين المؤقت (la mémoire cache) : تربط بين السجلات والذاكرة العشوائية؛
  3. الذاكرة العشوائية (La ram) : هذه هي الذاكرة التي سنعمل بها في أغلب الأحيان؛
  4. القرص الصلب (Le disque dure) : الذي تعرفه بالتأكيد، حيث يتم حفظ الملفات.
   لقد صنفت أنواع الذاكرة الأربعة، من الأسرع (السجلات) إلى الأبطأ (القرص الصلب). إذا اتبعت بشكل صحيح، فإنك تفهم أيضًا أن أسرع ذاكرة كانت الأصغر حجما والأبطأ كانت الأكبر حجما.
   وبالتالي، فإن السجلات لا تتجاوز سعتها بضعت أرقام، بينما يمكن للأقراص الصلبة تخزين ملفات كبيرة جدًا.
   عندما أقول أن الذاكرة "بطيئة"، فهي على مقياس الحاسوب بالطبع. بالنسبة للكمبيوتر، فإن 8 مللي ثانية للوصول إلى محرك الأقراص الثابتة فهي مدة طويلة جدًا!
   هناك شيء أخير مهم للغاية يجب معرفته: فقط القرص الصلب يحتفظ بالمعلومات التي يحتوي عليها طوال الوقت. جميع انواع الذاكرة  الأخرى (السجلات ، ذاكرة التخزين المؤقت ، ذاكرة الوصول العشوائي) هي ذاكرات مؤقتة: عند إيقاف تشغيل الكمبيوتر، تصبح فارغة!

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

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

رسم بياني للذاكرة العشوائية la ram

   كما ترى ، هناك عمودين.
  • العناوين (Adress): العنوان هو رقم يسمح للكمبيوتر بتحديد موقع المعلومة وسط ذاكرة الوصول العشوائي. تبدأ من العنوان 0 (في بداية الذاكرة). أما عنوان نهايتها فهو غير معروف. كل ما اعرفه هو وجود عدد ضخم من العناوين. كما انه كلما كانت الذاكرة كبيرة كلما زاد عدد العناوين.
  • القيمة (Valeur):  يقوم الكمبيوتر بتخزين هذه الأرقام في ذاكرة الوصول العشوائي (RAM) حتى يتذكرها لاحقًا. يمكنك تخزين عدد واحد فقط لكل عنوان.
ذاكرة الوصول العشوائي الخاصة بنا يمكنها تخزين الأرقام فقط. أما الحروف فهي أيضا أرقام بالنسبة للحاسوب. هناك جدول خاص يعطي لكل حرف رقم خاص به.

إذن ما هو المتغير؟

   يمكن تلخيصه في كونه عبارة عن معلومة تخزن في الذاكرة العشوائية (La RAM). نسميه متغير لأن قيمته قد تتغير طوال وقت تنفيد البرنامج.
في لغة C ، يتكون المتغير من شيئين:
  • القيمة: هذا هو الرقم الذي نخزنه في المتغير، على سبيل المثال 7؛
  • الاسم: هذا ما يجعله معروفًا. في لغة C، لن نضطر إلى تذكر عنوان الذاكرة: بدلاً من ذلك، سنكتب فقط أسماء المتغيرات.  المترجم هو الذي يحول بين الاسم والعنوان.

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

      كما قلنا في C لكل متغير له اسم يميزه. لذا علينا اعطاء اسم لكل متغير. وللقيام بذلك علينا احترام مجموعة من القوانين الإلزامية:
  • في التسمية الرموز المسموح بعا هي أحرف صغيرة وكبيرة وأرقام مثل: redCAR12.
  • دائما المتغير يبدأ بحرف وليس برقم أو شيء اخر.
  • يمنع استخدام المسافات البيضاء espace. بدلاً من ذلك، يمكنك استخدام الرمز "_" (التسطير السفلي). هو الرمز الوحيد غير الحروف والأرقام الممكن استعماله؛
  • لا يسمح لك باستخدام الحركات (éàê الخ.).
   وأخيرًا، ومن المهم جدًا معرفة أن لغة C تفرق بين الأحرف الكبيرة والصغيرة. اذن فهي لغة حساسة لحالة الأحرف « respecte la casse ». مثال: redcar12 تخالف redCar12  و تخالف أيضا REDCAR12.

   لكل مبرمج طريقته الخاصة في تسمية المتغيرات. سأريكم كيف اسمي المتغيرات:
  • أبدأ جميع أسماء المتغيرات بحرف صغير؛
  • إذا كان هناك عدة كلمات في اسم المتغير، أضع حرفًا كبيرًا في بداية كل كلمة جديدة.
مهما فعلت ، تأكد من إعطاء المتغيرات الخاصة بك أسماء واضحة. كان بإمكاننا اختصار nombreDeVies عن طريق كتابتها على سبيل المثال ndv قد يكون أقصر، لكنه أقل وضوحًا بكثير.

اسماء محجوزة

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

auto      default  float  register  struct    volatile
break     do       for    return    switch    while
case      double   goto   short     typedef
char      else     if     signed    union
const     enum     int    sizeof    unsigned
continue  extern   long   static    void

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

   يمكننا اعتبار جهاز الكمبيوتر الخاص بنا ليس الا آلة حاسبة (كبيرة جدًا). يمكنه فقط التعامل مع الأرقام. وكما نعلم ان الاعداد يوجد منها انواع متعددة مثل:
  • أعداد صحيحة موجبة مثل: 0، 1، 2، ... 124، .....
  • أعداد صحيحة نسبية تضم اعداد سالبة وموجبة مثل: 8ـ ، 67ـ ، 0، 45، 687 ...
  • أعداد عشرية مثل: 56.67، 45.67، 2.45 ...
  • أعداد عشرية سالبة مثل:  56.67ـ ، 45.67ـ ، 2.45ـ ...
   عند إنشاء متغير، سيتعين عليك تحديد نوعه. في C و++C يتعين على المبرمج تحديد نوع المتغير، وليس المترجم من سيتكلف بذلك, كما هو الشأن بالنسبة للغات اخرى كجافا سكريبت.
   الجدول أسفله يحدد أهم أنواع المتغيرات في C.

 أنواع المتغير القيمة الدنيا  القيمة القصوى
 unsigned char  -127 127
 int  -32767  32767
 long
 -2 147 483 647
 2 147 483 647
 float 1x10puissance37-  1x10puissance37
 double  1x10puissance37-  1x10puissance37

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

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

 أنواع المتغير القيمة الدنيا  القيمة القصوى
 unsigned char  0 255
unsigned int  0 65  535 
  unsigned long  0  4 294 967 295

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

انشاء متغير

   الآن قم بإنشاء مشروع وحدة تحكم (console) جديد ستطلق عليه اسم  "les variables".
   لإنشاء متغير بسيط للغاية الآن يجب اتباع الخطوات التالية:           
  • نختار نوع المتغير.
  • نكتب فراغ أو مساحة بيضاء.
  • نكتب اسم المتغير من اختيارنا.
  • لا ننسى الفاصلة المنقوطة.
على سبيل المثال:

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

int main()
{
    int nombreDeVies;
    double sommeArgent; 
    unsigned int UnNomDeVariableUnPeuLong;
    return 0;
}

نصيحة صغيرة يجب معرفتها: إذا كان لديك العديد من المتغيرات من نفس النوع للإعلان، فلا حاجة إلى إنشاء سطر لكل متغير. تحتاج فقط إلى فصل أسماء المتغيرات المختلفة بفواصل على نفس السطر: ;int nombreDeVies, niveau, ageDuJoueur 

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

    لإعطاء قيمة للمتغير nombreDeVies فقط تابع المثال التالي:

nombreDeVies = 5;
  الامرسهل للغاية يكفي كتابة اسم المتغير ثم رمز تساوي تليها القيمة المراد تخزينها في المتغير.
  يمكننا إذا أردنا تغيير القيمة كما يلي:

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

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

إليك سؤال مهم للغاية أود أن أطرحه عليك:
عند انشاء متغير جديد، ما هي قيمته في البداية؟
  عند انشاء متغير جديد، يقوم الحاسوب بحجز مساحة ذاكرة على الذاكرة العشوائية. ولكن ماهي القيمة التي خزنها الحاسوب فيه؟ هل هناك قيمة تلقائية كالعدد 0 مثلا؟
   الجواب لا. لا ، لا ولا ، لا توجد قيمة تخزن فيه تلقائيا. الحيز محجوز ولكن لا تتغير قيمته. نحن لا نمحو ما هو موجود في "الذاكرة". فالمتغير يأخذ القيمة التي كانت موجودة من قبل، ويمكن أن تكون هذه القيمة أي شيء!
   إذا لم يتم شغل حيز الذاكرة هذا مطلقًا، فقد تكون القيمة 0. ولكن لا تكن متأكدًا، يمكن أن يكون عدد ما بدلاً من ذلك، بقايا برنامج قديم كان موجودًا من قبل!
  إذن لتجاوز بعض المشاكل التي من الممكن ان تظهر لاحقا. من الافضل اعطاء قيمة للمتغير عند انشائه، كما يوضحه المثال التالي:

int nombreDeVies = 5; 

الثوابت

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


const int NOMBRE_DE_VIES_INITIALES = 5; 

هذا ليس الزامًا، ولكن وفقًا لما هو متفق عليه، نكتب أسماء الثوابت بالكامل بأحرف كبيرة كما فعلت للتو. هذا يسمح لنا بالتمييز بسهولة بين الثوابت والمتغيرات. لاحظ أننا نستخدم التسطير السفلي _ بدلاً من espace.

عرض محتوى متغير

   نحن نعرف كيفية عرض النص على الشاشة باستخدام دالة printf. سنرى الآن كيفية عرض قيمة متغير بنفس الدالة.
   نستخدم في الواقع printf بنفس الطريقة، باستثناء أننا نضيف رمزًا خاصًا في المكان الذي نريد عرض قيمة المتغير. مثلا :

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

  هذا الرمز الخاص يتكون من رمز % وحرف 'd'، الذي يبين محتوى المتغير الذي نريد عرضه على الشاشة. لكل نوع حرفه الخاص.


نوع المتغير حرفه الخاص
 Char  c%
 Int  d%
 long  ld%
 float  f%
 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);
  return 0;
}

   يعرض هذا البرنامج على الشاشة:

Afficher un nombre en C

اعرض عدة متغيرات في نفس printf

   من الممكن عرض قيمة عدة متغيرات في دالة واحدة. تحتاج فقط إضافة d٪ أو f٪ حيث تريد، ثم الإشارة إلى المتغيرات المقابلة بنفس الترتيب، مفصولة بفواصل.
   على سبيل المثال: 

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

تأكد من الإشارة إلى المتغيرات الخاصة بك بالترتيب الصحيح. سيتم استبدال d٪ الأول بالمتغير الأول (nombreDeVies) ، والثاني d٪ بالمتغير الثاني (niveau). إذا كان ترتيبك خاطئًا، فإن جملتك لن تعني شيئًا.

استرجاع قيمة مدخلة بلوحة المفاتيح

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

int age = 0;
scanf("%d", &age);
يجب أن نضع 'd%' بين علامتي الاقتباس("").

يرجى الانتباه أن هناك اختلاف طفيف في التنسيق بين printf و scanf! لاسترداد عدد float، يجب استخدام التنسيق " f٪"، ولكن بالنسبة للنوع double فهو التنسيق " lf٪".

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

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

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

Utilisation de la fonction scanf en C

    توقف البرنامج مؤقتًا بعد عرض السؤال "كم عمرك؟" ثم يظهر المؤشر على الشاشة، يجب عليك حينها كتابة رقم صحيح (عمرك). ثم اضغط على "أدخل" للتحقق، ثم يستمر البرنامج في العمل.
   هنا، كل ما يفعله بعد ذلك هو عرض قيمة المتغير على الشاشة.
لاحظ أنه لا يوجد شيء يمنعك من كتابة شيء آخر غير عدد صحيح. ماذا لو قام الشخص بإدخال شيء اخر غير المطلوب؟
    الجواب:
  • اذا أدخل المستخدم قيمة لا توافق نوع المتغير، مثلا قام بإدخال عدد عشري  float مثلا 3.6 لتخزينه في متغير نوعه عدد صحيح int. عندها سيقوم البرنامج بتخزين الجزء الصحيح فقط في المتغير وهو 3. بينما سيهمل الجزء العشري.
  • إذا قمت بكتابة أحرف بشكل عشوائي ("éèdfgh") ، فلن تتغير قيمة المتغير. الشيء الجيد هنا هو أننا قمنا بإعطاء المتغير الخاص بنا قيمة 0 في البداية. نتيجة لذلك، سيعرض البرنامج " 0 ans". إذا لم نقم بتهيئة المتغير، لكان البرنامج قد عرض أي شيء!

    خلاصة:

  • تحتوي أجهزة الكمبيوتر على عدة أنواع من الذاكرة. من الأسرع إلى الأبطأ: السجلات وذاكرة التخزين المؤقتة وذاكرة الوصول العشوائي والقرص الصلب.
  • من أجل "حفظ" المعلومات، يحتاج برنامجنا إلى تخزين البيانات في الذاكرة.لذلك يستخدم ذاكرة الوصول العشوائي. يتم استخدام السجلات وذاكرة التخزين المؤقتة أيضًا لتحسين الأداء، ولكنها تعمل تلقائيًا، فلا داعي للقلق بشأن ذلك.
  • في شفرة المصدر الخاصة بنا، تكون المتغيرات بيانات مخزنة مؤقتًا في ذاكرة الوصول العشوائي. قد تتغير قيمة هذه البيانات أثناء اشتغال البرنامج.
  • في المقابل، نتحدث عن الثوابت للبيانات المخزنة في ذاكرة الوصول العشوائي. لا يمكن تغيير قيمتها.
  • هناك عدة أنواع من المتغيرات التي تشغل مساحة أكبر أو أقل في الذاكرة. الغرض من بعض الأنواع كـ: int هو تخزين الأعداد الصحيحة، بينما البعض الآخر مثل: double هو تخزين الأعداد العشرية .
  • تتيح لك دالة scanf مطالبة المستخدم بإدخال عدد من اختياره.

< الدرس الموالي

الجزء 1: أساسيات البرمجة في C.
  1. تهيئة الحاسوب من أجل البرمجة 
  2. أول برنامج بـ : C
  3. المتغيرات (Les variables).
  4. العمليات الحسابية. عما قريب
  5. الشروط (Les conditions). عما قريب
  6. الحلقات المتكررة (Les boucle). عما قريب
  7. الدوال (Les fonctions). عما قريب
  8. تمارين تطبيقية. عما قريب

الجزء 2: تقنيات متقدمة في C.
  1. البرمجة المعيارية عما قريب
  2. المؤشرات (Les pointeurs) عما قريب
  3. الجداول (Les tableaux). عما قريب
  4. الحروف والنصوص عما قريب
  5. المعالج القبلي (Le préprocesseur). عما قريب
  6. إنشاء أنواع المتغيرات الخاصة بك عما قريب
  7. القراءة والكتابة في الملفات. عما قريب
  8. التخصيص الديناميكي عما قريب
  9. دخال نص بشكل آمن عما قريب
  10. تعلم شرح المؤشرات (Les pointeurs) عما قريب
  11. تمارين تطبيقية. عما قريب

الجزء 3: هيكلة البيانات في C.
  1. القوائم المتسلسلة عما قريب
  2. الأكوام والصفوف (Les piles et les files) عما قريب
  3. جداول التجزئة (Les tables de hachage). عما قريب

إرسال تعليق

0 تعليقات