أنماط المعطيات سي بلس بلس

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

شجرة أنماط المعطيات C++.png

الأنماط البسيطة

لمحة عن الأنماط البسيطة ( Simple )

  • تمثل الأنماط short و int و long الأعداد الصحيحة، فهي لا تتعامل مع الفاصلة العشرية، وتختلف فيما بينها بالمجال الذي تغطيه.
  • تمثل الأنماط float و double و long double الأعداد الحقيقية، فهي تتعامل مع الفاصلة العشرية، وتختلف كذلك بالمجال الذي تغطيه، وغالباً ما يكون متعلقاً بالآلة التي يتم العمل عليها، والحد الأقصى لعدد الخانات بعد الفاصلة هو 6 أو 7 بالنسبة للـ float، و15 بالنسبة للـ double.
  • النمط bool هو النمط المنطقي الذي يأخذ القيمتين true و false.
  • النمط char هو أبسط الأنماط الصحيحة، ويستخدم عادة لتمثيل محارف الـ ASCII.
  • يمكن للأنماط int و long و short أن تغطي مجالاً من الأعداد الموجبة فقط، وتسبق عندئذ بـ unsigned.

الجدول الموجود في سلايدات الدكتور يوضح مجال كل من الأنماط البسيطة وحجم الذاكرة الذي يستهلكه.

المتحولات Variables

هي أماكن في الذاكرة تخزن فيها القيم، ولكل متحول 1 اسم، 2 نمط تعريف، 3 حجم (في الذاكرة)، و4 قيمة.

قواعد تسمية المتحولات (والثوابت والتوابع أيضاً)

  • يمكن أن يتكون اسم المتحول من أحرف وأرقام و (_) فقط.
  • إلا أنه لا يجوز أن يبدأ بأرقام.
  • وفي معظم المترجمات يكون الحد الأقصى لاسم المتحول هو 32 محرفاً.
  • ولا بد هنا من الإشارة إلى أن لغة C++ هي لغة حساسة لحالة الأحرف ( يوجد فرق بين الأحرف الإنكليزية الكبيرة والصغيرة في أسماء المتحولات أو أي كلمات أخرى).
  • ويُفترض باسم المتحول أن يكون معبراً عن وظيفته.
  • لا يجوز أن يكون اسم المتحول من الكلمات المحجوزة (غالباً ما يلونها المترجم بالأزرق).

كيفية تعريف المتحولات وإسناد قيم لها

يمكن في لغة C++ تعريف متحول وإسناد قيمة له بشكل مباشر، ومن المستحسن إسناد قيمة ابتدائية للمتحول فور تعريفه.

الشرح الكود

لنعرف متحولاً J نمطه int

int J;

لنعرف متحولاً J نمطه int ونسند له القيمة 4 مثلاً

int J = 4;

والآن لنعرف ثلاث متحولات من النمط int، يمكن تعريفها سوياً أو بشكل منفصل (كل لوحده)

int J,K,L;

لاحظ أن هذه العبارة تعني إسناد القيمة 4 للمتحول L فقط وليس لكل المتحولات.

Int J,K,L = 4;

أما إسناد قيم لجميع المتحولات في العبارة السابقة فهو :

int J = 1, K=2, L=3;

يمكن إسناد قيمة من النظام السداسي عشر بأن نضع قبل العدد السداسي عشر المحرفين 0x كما هو مبين

int J = 0x3A; ( J = 58 Decimal )

أو بالنظام الثماني بأن نضع قبل العدد الثماني المحرف 0

int J = 077 ( J = 63 Decimal )

لاحظ أن إسناد قيمة لمتحول من نمط char تتم إما بإسناد رقم المحرف في جدول ASCII أو بالمحرف نفسه محصوراً بعلامتي اقتباس مفردتين (‘)

char C = ‘A’;
or 
char C = 65;

وبالنسبة لنمط bool، فيمكن إسناد إحدى القيمتين true أو false (كلمتان محجوزتان) أو أي قيمة عددية، فإذا كانت 0 فهو false وإلا فهو true.

bool B = true; or bool B = 23 (0 )
 
bool B = false; or bool B = 0;

ويمكن إسناد قيمة لمتحول float (أو أي نمط حقيقي) إما بواسطة الفاصلة فقط أو بالفاصلة مع الأس

double D = 474.56;
or 
double D = 4.7456E+2;

أما بالنسبة للـ string، فيتم الإسناد بحصر سلسلة المحارف بعلامتي اقتباس مزدوجتين (")

string S = “Hello World!;
  • ولابد من الإشارة إلى أنه عند إسناد قيمة جديدة إلى المتحول، فإن القيمة القديمة سوف تُلغى.
  • أما عند قراءة قيمة المتحول، فإن القيمة ستبقى موجودة ولن تتغير.

الثوابت Constants

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

عددية صحيحة : نظام عشري (437) أو ثماني (021) أو سداسي عشر (0x5A)، أو عددية حقيقية، أو محارف ( ‘a’ )، محارف تحكم أيضاً ( ‘\n’ ، ‘\t’ ..... )، ويمكن أيضاً أن تكون سلاسل محرفية (string) مثل “hello world”

كيفية تعريف الثوابت

يمكن تعريفها بطريقتين:


  • الطريقة الأولى:
#define  Name  Value

أمثلة:

#define Decimal90   90                              // الرقم 90 بالنظام العشري       
#define Octal90        0132                          // الرقم 90 بالنظام الثماني         
#define Hex90          0x5A                          //  الرقم 90 بالنظام السداسي عشر 
#define NEWLINE   ‘\n’
#define PI                3.14159
#define ITE_URL     “www.ite-sy.net”


  • الطريقة الثانية:
const  Type  Name = Value;

نفس الأمثلة السابقة بالطريقة الجديدة:

const int Decimal90 = 90;
const int Octal90 = 0132;
const int Hex90    = 0x5A;
const char NEWLINE = ‘\n’;
const double PI = 3.14159;
const string ITE_URL = “www.ite-sy.net;
const Test = 10;                             /* في حال لم يتم تحديد نمط، فإن أسندنا عددا صحيحاً يقبله وإلا يرد قيمة عشوائية وهذا في 
visual C ++6 
أما في 2010 فيجب تحديد نمط والا يعتبره
 compile error */

النمط التعدادي Enumeration Data Type

هو عبارة عن مجموعة من الثوابت (تمثل بأسمائها) التي تحل محل قيم صحيحة (ليس تعريفاً للحفظ  ). ويستخدم عادة لتسهيل قراءة البرنامج وحماية القيم الصحيحة الهامة من التغيير.

يتم تعريف النمط التعدادي بالشكل التالي:

enum TypeName { Value1, Value2, Value3 ….. };
  • الثوابت لها أسماء منفردة unique (كل اسم يختلف عن باقي الأسماء).
  • كل ثابت يقابل قيمة صحيحة (Integral). في الوضع الطبيعي يبدأ الترقيم بـ 0، ويزداد كل ثابت عن سابقه بـ 1 أي : Value1 = 0 و Value2 = 1 و Value3 = 2 وهكذا.......
  • يمكن إسناد أي قيمة صحيحة لأي ثابت عند التعريف حصراً، وتبقى القاعدة ثابتة (كل ثابت بعده يزيد على سابقه بـ 1 ).

مثال: لنعرف النمط التعدادي التالي:

enum Days { Sat, Sun, Mon, Tues, Wed, Thur, Fri };

في هذه الحالة، تكون القيم المقابلة للأسماء (الثوابت) كالتالي:

Sat = 0, Sun = 1, Mon = 2, Tues = 3, Wed = 4, Thur = 5, Fri = 6

والآن لنجرب التعديلات التالية:

الشرح الكود

في هذه الحالة تكون القيم : Sat = -1, Sun = 0, Mon=1, ……, Fri = 5

enum Days { Sat = -1, Sun, Mon, Tues, Wed, Thur, Fri };

هنا يكون : Sat =1, Sun =2, Mon=3, Tues = 1, Wed = 2, Thur = 3, Fri = 4

أي يمكن أن يكون لثابتين (أو أكثر) نفس القيمة

enum Days { Sat = 1, Sun, Mon, Tues =1, Wed, Thur, Fri };

هنا يكون : Sat = 1, Sun =2, Mon =3, Tues=-1, Wed =0, Thur =1, Fri =2

enum Days { Sat = 1, Sun, Mon, Tues =-1, Wed, Thur, Fri };

هنا يكون : Sat = 1, Sun =2, Mon = 6, Tues = -1, Wed = 0, Thur = 1, Fri = 2 يمكن أن تكون قيمة ثابت متعلقة بثابت سابق له

enum Days { Sat = 1, Sun, Mon = Sat + 5, Tues =-1, Wed, Thur, Fri };

هنا يظهر الـ Complier خطأ :

‘Wed’ undeclared identifier

لا يمكن أن تكون قيمة ثابت متعلقة بثابت بعده

enum Days { Sat = 1, Sun, Mon = Sat + 5, Tues =-1, Wed, Thur, Fri };

هنا يكون : Sat = 1, Sun = 2, Mon = 3, Tues = 4, Wed = 5, Thur = 3, Fri = 10

يمكن أن تساوي قيمة ثابت تركيباً من أرقام و ثوابت سابقة له.

enum Days { Sat =1, Sun=Sat*2, Mon, Tues, Wed, Thur= Sat+Sun, Fri= Wed*Sun };

هنا يكون : Sat = 1, Sun = 2, Mon = 3, Tues = 4, Wed = 0, Thur = 1, Fri = 2

enum Days { Sat = true , Sun, Mon , Tues, Wed = false, Thur, Fri };

هنا يكون : Sat = 65, Sun = 66, Mon = 67,

Tues = 37, Wed = 38, Thur = 39, Fri = 40

عند إسناد محارف، تكون قيمة الثابت هي رقم المحرف في جدول الـ ASCII

enum Days { Sat = ‘A’, Sun, Mon, Tues =%’ , Wed, Thur, Fri };