تعلم لغة ++C الجزء الثاني
أنواع
البيانات الأساسية في لغة ++ C
هنالك سبعة أنواع بيانات أساسية في C++ ، واحد منها يمثل
الأحرف وثلاثة تمثل أرقاماً كاملة (أعداد صحيحة) وثلاثة تمثل أرقاماً حقيقية.
الجدول الآتي يلخص هذه الأنواع.
أمثلة
عن القيم المخزنة
|
يستعمل
لتخزين
|
اسم
النوع
|
''a''
|
أحرف
|
char
|
222
|
أرقام صحيحة قصيرة
|
short
|
153,406
|
أرقام صحيحة عادية
الحجم
|
int
|
123,456,789
|
أرقام صحيحة طويلة
|
long
|
3,7
|
أرقام حقيقية قصيرة
|
float
|
7,533,039,395
|
أرقام حقيقية مزدوجة
|
double
|
9,176,321,236,01202,6
|
أرقام حقيقية ضخمة
|
long double
|
1/ الأحرف char :-
يتم تخزين الأحرف في
متغيرات من النوع char العبارة:-
char
ch;
تنشئ مساحة من الذاكرة
لحرف وتسميه ch. لتخزين حرف ما في هذا المتغير نكتب
ch=’z’
ودائماً تكون الأحرف
الثابتة كـ ‘a’ و’b’ محصورة بعلامة اقتباس فردية.
يمكن استعمال المتغيرات
من النوع char لتخزين أرقام كاملة بدلاً من أحرف ، فمثلاً يمكننا كتابة:-
ch=2;
لكن نطاق القيم الرقمية التي يمكن تخزينها في النوع char
يتراوح بين
–128 إلى 127 لذا فإن هذه
الطريقة تعمل مع الأرقام الصغيرة فقط.
2/
الأعداد الصحيحة:
تمثل الأعداد الصحيحة أرقاماً كاملة أي
قيم يمكن تعدادها ، كعدد أشخاص أو أيام أو
عدد صفحات مثلاً ، ولا يمكن أن تكون الأعداد الصحيحة أرقاماً ذات نقطة عشرية
ولكنها يمكن أن تكون سالبة.
هنالك ثلاثة أنواع من الأعداد الصحيحة في C++
:short قصير، int
عدد صحيح، long طويل وهي تحتل مساحات مختلفة في الذاكرة. الجدول التالي
يبين هذه الأنواع والمساحة التي تأخذها في الذاكرة ونطاق الأرقام التي يمكن أن
تأخذها:
اسم
النوع
|
الحجم
|
النطاق
|
char
|
1byte
|
-128 إلى 127
|
short
|
2byte
|
-32,768 إلى 32,767
|
int
|
مثل short في أنظمة 16bit ومثل long في أنظمة 32bit
|
|
long
|
4byte
|
-2,147,483,648 إلى 2,147,483,647
|
3/
الأعداد الصحيحة غير المعلمة(Unsigned ):-
كل الأعداد الصحيحة لها إصدارات غير معلمة (unsigned) . لا تستطيع المتغيرات التي ليس لها علامة تخزين قيم سالبة، ونجد
أن نطاق قيمها الموجبة يساوى ضعف مثيلاتها التي لها علامة، الجدول التالي يبين
هذا:-
اسم
النوع
|
الحجم
|
النطاق
|
unsigned char
|
1byte
|
0 إلى 255
|
unsigned short
|
2byte
|
0 إلى 65,535
|
unsigned int
|
مثلshort unsigned في أنظمة 16bit
ومثل long unsigned
في أنظمة 32bit
|
|
unsigned long
|
4byte
|
0 إلى 4,294.967.295
|
4/
الأرقام العائمة (Float):
يتم استعمال الأرقام العائمة لتمثيل قيم يمكن قياسها
كالأطوال أو الأوزان. ويتم تمثيل الأرقام
العائمة عادة برقم كامل على اليسار مع نقطة عشرية وكسر على اليمين.
هنالك ثلاثة أنواع من الأرقام العائمة في
أنظمة التشغيل الشائعة الاستعمال. وأشهر نوع أرقام عائمة هو النوع double والذي يتم استعماله
لمعظم دالات C++ الرياضية. يتطلب النوع float ذاكرة أقل من النوع
double . الجدول التالي يوضح هذه الأنواع والحجم الذي تأخذه في الذاكرة.
اسم
النوع
|
الحجم
|
float
|
4byte
|
double
|
8byte
|
long double
|
10byte
|
تعريف المتغيرات
عند كتابة أي برنامج بلغة
C++، نحتاج لتخزين المعلومات الواردة للبرنامج في ذاكرة الحاسوب تحت
عناوين يطلق عليها أسماء المتغيرات، وبما أن أنواع المعلومات المراد تخزينها تكون
عادة مختلفة مثل القيم الحقيقية أو الصحيحة أو الرمزية فإننا نحتاج أن نعلم
المترجم في بداية البرنامج عن أنواع المتغيرات التي نريد استخدامها فمثلاً :-
الكلمات integer1 , ,integer2 sum هي أسماء لمتغيرات عبارة عن أعداد صحيحة(النوع int ) وهو أحد أنواع
البيانات المتوفرة في C++ .
يمكن تعريف المتغيرات في أي
مكان في البرنامج لكن يجب تعريفها قبل استعمالها، يمكن تعريف المتغيرات التي تنتمي
إلى نفس النوع في سطر واحد.
تسمية
المتغير:
يتم تعريف المتغير بذكر الاسم ونوع
البيانات التي يمكن أن يحملها هذا المتغير من أي سلسلة تحتوى على أحرف Letters أو أرقام Digits
أو خطاً تحتياً Under
score(_) ،
على أن لا يبدأ اسم المتغير برقم. ومن الجدير بالذكر أن لغة C++ تفرق بين الحروف
الأبجدية الصغيرة والكبيرة، فمثلاً الأسماء integer1 Integer1
,
تعامل كمتغيرات مختلفة.
الدخل
من لوحة المفاتيح:-
cin>>integer1
هذه العبارة تخزن الرقم الذي يكتبه المستخدم من لوحة
المفاتيح في متغير يدعي integer1 . يمثل الكائن cin -والذي يلفظ كـ C in- لوحة المفاتيح، ويأخذ عامل الحصول get
from (>>) الأشياء الموضوعة
على يساره ويضعها في المتغير الموجود على يمينه، عند تنفيذ هذه العبارة ينتظر
البرنامج أن يكتب المستخدم رقماً من النوع integer ويضغط على مفتاح Enter ، يتم تعيين القيمة
التي أدخلها المستخدم إلى المتغير integer1 .
يمكن استعمال عامل الحصول
عدة مرات في نفس العبارة:
cin >> integer1>>integer2
يضغط المستخدم هنا Enter
،
أو مفتاح المسافةSpace ، أو مفتاح Tab بعد كل قيمة، قبل
أن يكتب القيمة التالية، ولكنه من الأفضل عادة إدخال قيمة واحدة في كل مرة لتجنب
الخطأ.
الشكل(2-1)
يوضح الدخل بواسطة cin
المناور
endl:-
العبارة:
cout<<''sum=
''<<sum<<endl
تطبع النص sum= متبوعاً بقيمة sum ، نلاحظ أننا استخدمنا endl وهو وسيلة أخرى فيC++ للانتقال إلى سطر جديد، ويسمى مناورmanipulator وendl اختصاراً لـ end line، وهو يعمل تماماً كما يعمل تتابع الهروب \n
)العوامل الحسابية Math
Operators )
لقد استعملنا عامل الجمع
(+) لجمع integer1 إليinteger2
، تتضمن
C++ العوامل الحسابية الأربعة الاعتيادية
بالإضافة إلى عامل خامس كما مبين في الجدول التالي:
التعبير
في C++
|
التعبير
الجبري
|
الوظيفة
|
العامل
|
B+h
|
B+h
|
جمع
|
+
|
B-h
|
B-h
|
طرح
|
-
|
B*h
|
Bh
|
ضرب
|
*
|
B/h
|
B/h,
|
قسمة
|
/
|
B%h
|
B mod h
|
الباقي
|
%
|
العوامل الأربعة الأولى
تنجز أعمالاً مألوفة لدينا، أما عامل الباقي % المسمى أيضاً المعامل modulus
،
يتم استعماله لحساب باقي القسمة لعدد صحيح على عدد آخر، لذلك فالتعبير 20%3 يساوى 2 . تسمى هذه العوامل الحسابية بالعوامل الثنائية لأنها تعمل على قيمتين.
يمكن استعمال أكثر من
عامل في تعبير رياضي واحد، فمثلاً التعبير:
C=(f-32)*5/9;
يحول درجة الحرارة من
مئوية إلى فهرنهايت.( استعملت الأقواس لكي يتم تنفيذ الطرح أولاً بالرغم من
أولويته المتدنية، يشير المصطلح أولوية Precedence إلى ترتيب تنفيذ العوامل، العاملان * و / لهما أولوية أعلى من +و- ).وهذا ما سنراه لاحقاً بعد أن نتعرف
على بقية عوامل C++ .
العوامل
العلائقية
(Relational Operators)
تقارن العوامل العلائقية
قيمتين، وتؤدى إلى نتيجة صحيح/خطأ وفقاً لما إذا كانت المقارنة صحيح/خطأ. هنالك
ستة عوامل علائقية مبينة في الجدول أدناه:
مثال
|
المعنى
|
الرمز
|
a==b
|
يساوى
|
==
|
a!=b
|
لا يساوى
|
!=
|
a>b
|
أكبر من
|
>
|
a<b
|
أصغر من
|
<
|
a>=b
|
أكبر من أو يساوى
|
>=
|
a<=b
|
أصغر من أو يساوى
|
<=
|
تكون التعابير المبينة في
عمود المثال صحيحة أو خطأ وفقا لقيم المتغيرين a و b.
فلنفرض مثلاً أن:
q
a يساوى 9
q
وb يساوى 10.
التعبير a==b خطأ.
التعبير a!=b صحيح وكذلك
التعبيرينa<b و a<=b ،
والتعبيرين a>b و a>=b خطأ..
CONTROL STRUCTURE'S(1)
عادة يتم تنفيذ العبارات حسب تسلسل ورودها في البرنامج ويسمى
هذا بالتنفيذ التتابعي ( Sequential
Execution). لكننا سنتعرض لبعض عبارات C++ والتي
تجعل التنفيذ ينتقل لعبارة أخرى قد لا تكون التالية في تسلسل البرنامج، ويسمى هذا
بنقل التحكم Transfer
of control.
تنقسم بنيات التحكم في C++ إلى قسمين: بنيات التحكم
الشرطية وسنفرد هذه الوحدة لتوضيحها. والنوع الثاني وهو بنيات التحكم التكرارية
والتي سنفرد الوحدة التالية للحديث عنها
العبـارة if
أسهل طريقة لاتخاذ قرار في C++ هي
بواسطة العبارة if .
مثال:-
//Program
2-1:
#include
<iostream.h>
main
( )
{
int num1 , num2;
cout
<< " Enter two integers, and I will tell you\n"
<<" the relation
ships they satisfy: ";
cin >>
num1>> num2;
if
(num1== num2)
cout << num1 <<
" is equal to " << num2 << endl;
if
(num1!= num2)
cout << num1 <<
" is not equal to " << num2 << endl;
if
(num1< num2)
cout << num1 <<
" is less than " << num2 << endl;
if
(num1> num2)
cout << num1 <<
" is greater than " << num2 << endl;
if
(num1<= num2)
cout << num1 <<
" is less than or equal to " << num2 << endl;
if
(num1>= num2)
cout << num1 <<
" is greater than or equal to " << num2
<<
endl;
return
0;
}
الخرج من البرنامج بافتراض أن المستخدم قد
أدخل الأرقام num1
=3 ، num2= 7.
Enter
two integers , and I will tell you
The relation ships they satisfy: 3
7
3
is not equal to 7
3
is less than 7
3
is less than or equal to 7
|
تتألف العبارة if من الكلمة الأساسية if، يليها تعبير اختبار
بين قوسين، ويتألف جسم القرار الذي يلي ذلك إما من عبارة واحدة، أو من عدة عبارات
تحيطها أقواس حاصرة { }
الشكل(1-2) يبين طريقة عمل العبارة if.
العبـارة if…else
في العبارة if البسيطة يحدث شئ إذا كان الشرط صحيحاً، لكن إذا
لم يكن كذلك لا يحدث شئ على الإطلاق. لكن لنفترض أننا نريد حدوث شئ في
الحالتين إذا كان الشرط صحيحاً وآخر إذا
لم يكن كذلك، لتحقيق ذلك نستخدم العبارة if... else
مثال:-
//Program
2-2:
#include
<iostream.h>
main
( )
{
int
grade ;
cout
<< " Enter the grade";
cin
>>grade;
if(grade>=
50)
cout<<"pass"
<<endl;
else
cout
<<"fail"<<endl;
return
0;
}
الخرج من البرنامج بافتراض أن المستخدم قد
أدخل grade = 90
Enter
the grade 90
Pass
|
أيضاً هنا يمكن أن يتألف جسم if أو else من عدة عبارات
تحيطها أقواس حاصرة. الشكل(2-2) يبين طريقة عمل العبارة if…else.
هنالك طريقة أخرى للتعبير عن المثال السابق وذلك باستخدام ما
يسمى بالعامل المشروط:
cout<<(grade>= 50 ? ''pass''
:''fail'') << endl;
العامل المشروط هو العامل الوحيد في
C++ الذي يعمل على ثلاثة قيم ويتألف من رمزين علامة استفهام ونقطتين .
أولاً يأتي تعبير الاختبار، ثم علامة الاستفهام،
ثم قيمتان تفصلهما نقطتان. إذا كان تعبير الاختبار صحيحاً ينتج التعبير بأكمله
القيمة الموجودة قبل النقطتين وإذا كان تعبير
الاختبار خطأ ينتج التعبير بأكمله القيمة التي تلي النقطتين.
المثال
التالي يحسب القيمة المطلقة (Absolute value) وهي تساوي سالب العدد إذا كان العدد أقل من الصفر وتساوي موجب
العدد إذا كان العدد أكبر من الصفر.
Abs_value
=(n<0) ? -n:n.
else المتداخلة:-
يمكن وضع العبارات if ......else ضمن بعضها البعض ، البرنامج التالي يوضح ذلك:
//Program 2-3:
#include
<iostream.h>
main
( )
{
int
grade;
cout
<<"Enter the grade:" ;
cin
>> grade;
if(grade>=
75)
cout<<'A'<<
endl;
else
if(grade>=
65)
cout<<'B'<<
endl;
else
if(grade>=
55)
cout<<'C'<<
endl;
else
if(grade>=
40)
cout<<'D'<<
endl;
else
cout<<"fail"<<endl;
return
0;
}
تنتهي
العبارات المتداخلة في الجسم else وليس في الجسم if ، يمكن أن تحدث
مشكلة عندما نضع العبارات if ……else ضمن بعضها البعض.
فمثلاً المفروض من العبارات التالية أن تعرض الكلمة infant عندما يكون عمر الشخص أقل أو يساوى 2:-
if (age >2)
if (age<18)
cout <<"\n child”;
else
cout <<"\n infant";
ولكن هنا لن
يحدث ، ستظهر الكلمة infant كلما كان العمر أكبر أو يساوى 18 وذلك لأن الجزء else يتبع أقرب عبارة if إليه والتي ليس لها
جزء else خاص بها. لذا إذا كنا نريد
جزء else تابع لعبارة if غير موجودة قبله مباشرة علينا حصر العبارة if الموجودة بينهما بأقواس حاصرة .
if (age >2)
{
if (age<18)
cout <<"\n child”;
} else
cout
<<"\n infant"
العبـارة switch
تأخذ جملة switch فيC++ الشكل العام التالي:-
Switch (Variable name)
{
case constant1 : statement1; break;
case constant2 : statement2; break;
.
.
case constant n : statement n; break;
default : last statement;
}
تتألف العبارة switch من الكلمة الأساسية
switch يليها اسم متغير بين قوسين، ثم جسمها بين أقواس حاصرة ، تفحص
العبارة switch المتغير وتوجه البرنامج نحو أقسام مختلفة وفقاً لقيم ذلك المتغير.
يتضمن جسم العبارة switch عدداً من الوسوم وهي
أسماء تليها نقطتان. تتألف هذه الوسوم من الكلمة الأساسية case ثم
ثابت ثم نقطتين.
عندما تكون قيمة متغير العبارة switch مساوية للثابت
المذكور في أحد وسوم case ينتقل التنفيذ إلى العبارات التي تلي ذلك الوسم وتؤدى العبارة break إلى منع تنفيذ بقية العبارة switch، وإذا لم تتطابق
قيمة متغير العبارة switch مع أي وسم ينتقل التنفيذ إلى الوسم الافتراضي default .
سنقوم
بكتابة برنامج لحساب عدد حروف العلة (vowels letters) وهي (a, e, i, u, o) في نص مدخل من لوحة
المفاتيح . يقوم البرنامج بفحص الحرف المدخل فإذا كان الحرف a تتم إضافة 1 إلى acounter والذي تم تمهيده
عند 0 . أما إذا كان
الحرف المدخل e فتتم إضافة 1 إلى ecounter وهكذا بالنسبة لـ u و i و o ، إذا لم يكن الحرف
المدخل حرف علة يتم تنفيذ الوسم الافتراضي والذي يقوم بإضافة 1 لـ OtherLettersCounter.
//Program
2-4:
#include
<iostream.h>
enum
vowels{a='a',u='u',i='i',o='o',e='e'};
main(
)
{
char
ch ;
int
acounter=0,ecounter=0,icounter=0;
int
ucounter=0,ocounter=0,otherletterscounter=0;
while(cin>>ch)
switch(ch)
{
case
a:
++acounter;
break;
case
e:
++ecounter;
break;
case
i :
++icounter;
break;
case
o:
++ocounter;
break;
case
u:
++ucounter;
break;
default:
++
otherletterscounter;
};
cout<<endl;
cout<<endl;
cout<<endl;
cout
<<"acounter: \t"<<acounter<<"
\n";
cout<<
"ecounter: \t"<<ecounter<<" \n";
cout<<
"icounter: \t"<<icounter<<" \n";
cout<<
"ocounter: \t"<<ocounter<<" \n";
cout<<
"ucounter: \t"<<ucounter<<" \n";
cout<<"otherletterscounter:
\t"<<otherletterscounter
<<" \n";
return
0;
}
الخرج من البرنامج بافتراض أن النص المدخل "youareverypunctional"
acounter: 2
ecounter: 2
icounter: 1
ocounter: 2
ucounter: 2
OtherLettersCounter: 11
|
professional world1
0 التعليقات:
إرسال تعليق