الجمعة، 10 يناير 2014

تعلم لغة ++C الجزء الثاني




تعلم لغة ++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.

الشكل (3-2) يقوم بتوضيح طريقة عمل العبارة switch.




 

//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 التعليقات:

إرسال تعليق

شارك

Twitter Delicious Facebook Digg Stumbleupon Favorites