الأحد، 3 يوليو، 2016

كتب دوارت في البرمجيات الحاسبات الغير مطورة  تعتتبر تاريخ الالكترونيات

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


تعلم سي ++
الدرس الاول

 اساسيات سي بلس بلس
مساء الخير
انا اقول مساء الخير لانني لا افتح الانترنت الا في المساء واظنكم جميعا كذلك سنبدء اليوم سلسلة دروس عن لغة سي بلس بلس انها لغة صعبة ولكنها قوية جدا اريدك ان تعرف معلومة هامة كلمة كانت لغة البرمجة صعبة كلما كانت قوية واذا كنت تتعلم لغة الآن واحسست بسهولتها فيجب ان تعلم انها لغة ليست قوية هذا رأيي الخاص واظنه شئ صحيح احب ان تعرف معلومة اخرى ان لغة سي بلس بلس ليست هي لغة سي مع التشابه الكبير لاوامر ودوال اللغتين المهم معنا الآن اننا نتعامل مع لغة سي بلس بلس واضيف شئ اخير انك اذا لم تفهم هذه الدروس فمعنى ذلك انني اخفقت في الشرح والتوضيح وتأكد حينها ان العيب عندي انا وليس عندك ولكي نبدء دروسنا يجب عمل الآتي.
2-  ارجو ان تغفر لي اي اخطاء املائيه فأنا اكتب بسرعة
3-  ارجو ألا تعتبر كتابتي لمصطلحات انجليزية بحروف عربية جهل او غباء مني ولكن فقط لاسباب خاصة بتحرير الصفحة فالسهل عندي كتابة كل شئ باللغة الانجليزيه ولكن لن تكون هذه الدروس مفيد – ألست معي في ذلك – ارجو ذلك
 
متطلبات العمل
1-  كومبايلر للغة ودعني اقول لك ماهو الكومبايلر حتى وان كنت تعرفه انه البرنامج الذي يحول البرنامج الذي تكتبه الى برنامج تنفيذي قابل للتشغيل والتوزيع والبيع الى آخر ذلك وهناك انواع كثيرة مثل
 
Borland C++
Microsoft Visual C++
Watcom C/386
DJGPP.
انا انصح بالكومبايلر الاول او الثاني أما الثالث والرابع فلم اجربهم ولست في حاجة اليهم ولست اقصد بذلك الا تستعملهم ولكن فقط لم اجربهم
استعد انت الآن لبداية التعلم اما انا من ناحيتي فسوف اطفئ سيجارتي (ادعو لي بالاقلاع عن التدخين) لكي نبدء فورا
عند تعلم لغة كومبيوتر جديده اصبحت عادة ان تقوم بطبع رسالة هالو ورلد
Hello World
بالطبع هم يخاطبون العالم ولهم الحق في ذلك ولكن انا سوف اطبع رسالة هالو آراب
Hello Arab
مع عدم وجود اي عنصرية مني فأنا لست كذلك ولن أكون ولكن اسمحو لي بتحية من اكتب لهم لا تنزعج معي دائما قد اكون رغاي بعض الوقت ولكن ليس كل الوقت 

 

// This is the 1st lesson
#include
 
int main()
{
  cout<<"HEY, Hello ِArabs";
  return 0;   
}
 
دعونا نشرح ما كتبنا لقد بدأت بالعبارة الآتية
 
// This is the 1st lesson
عند كتابة // معناها انني اكتب ملاحظات وبالتالي كل ما يليها لايهم الكومبايلر عند الترجمة وفائدة الملاحظات عظيمة فكلما كتبت جزء من البرنامج وضحت هاتين العلامتين وبعدها ماتريد ان تقوله لنفسك او لمن يراجعون بعدك ماذا تفعل فاءذا عدت لتعديل البرنامج بعد فترة من الزمن سيكون ذلك رائع ان تتذكر افكارك في البرنامج موضع التعديل والآن الى التعليمة التالية لقد كتبنا
#include
 
العلامة # يليها امر include هي من تعليمات المعالج المبدئي
Preprocessor directive

لاحظ ان اوامر اللغة تكتب بالحروف الانجليزية الصغيرة
 
يلي ذلك مابين القوسين <> اسم ملف ينتهي بالامتداد h
هذا النوع من الملفات يسمى header files
وهي ملفات تأتي مع كومبايلر اللغة وان كنت ستتعلم في مرحلة متقدمة من هذه الدروس عملية انشاء ملفاتك الخاصة وهي عبارة عن ملفات يوجد بها تعريف لاوامر اللغة المستخدمة داخل برنامجك وبالتالي لكل مجموعة اوامر ملفاتها الخاصة لا تقلق سوف تعرف كل ذلك قريبا
اذا الاوامر المستخدمة في مثالنا السابق يحتاج الملف iostream.h
وهذا الملف هام جدا ورئيسي دائما ضم هذا الملف باستخدام الامر
#include
 
ملخص


#include

من اوامر لغة سي ++ (المعالج المبدئي)

iostream.h

ملف او هدير فايل لتعريف الاوامر المستخدمة

<>

اقواس لوضع الملف المطلوب ضمه او تحميله بينهما
ببساطة شديدة الامر cout  الذي سيلي شرحة يحتاج الملف
iostream.h
 
ننتقل الآن لشرح التعليمة التالية
 

int main()

ومعناها الاعلان عن الدالة او جسم البرنامج الرئيسي الذي من خلاله نستدعي كل شئ ونعمل كل شئ وسوف نضع بداخله الاوامر كلها
ولكن ما هو الامر int
انه من اوامر الاعلان عن نوع المتغيرات ودعني اوضح ذلك
 


امر اللغة الذي يعلن عن المتغير

نوع المتغير

int

الاعلان عن اعداد صحيحة

float

الاعلان عن اعداد عشرية

char

الاعلان عن حروف

void

لاشئ
 
وسوف نتعرض للانواع الاخرى فيما بعد وكمثال
 
 int  x = 5;
 int y = 65;
 float z = 4.677777;
 float q = 77.5443;
 char *b = “Mohamad Hasan”;
 char *c = "My Home Page”;
لقد اعلنا ان الدالة الرئيسية للبرنامج نوعها او ستعيد في نهاية عملياتها عدد صحيح فقد تحتاج مثلا لعمل دالة لضرب عددين في بعضهما والنتيجة تعيدها الدالة حسب نوع الاعلان
ويحدد ذلك الامر return  وكما ترى اعاد الامر القيمة صفر وهو بالطبع عدد صحيح نتيجة الاعلان عن دالة تعيد اعداد صحيحة
فمثلا لو انشأنا دالة لاعادة اعداد عشرية يجب ان تعيد في نهايتها اعداد عشرية مثلا
 
 float  NewFunc ()
{
float x , y , z;
x = 10.5;
y = 11.67887;
z = x * y;
return z;
}
لقد اعادت الدالة حاصل ضرب 10.5 * 11.67887 وحاصل الضرب هو عدد عشري لان نوع الدالة اعداد عشرية وهكذا دعنا نعود لبرنامجنا الاصلي
 


int

نوع الدالة تعيد اعداد صحيحة

main

اسم الدالة الرئيسية اساسي وهام

()

قوسين مغلقين لايوجد داخلهم شئ في هذه المرحلة
 
الى التعليمة التالية القوس  {
يجب ان يفتح به الدالة وتنتهي به ايضا لاحظ الاتجاه الى اليسار في بداية الدالة والى اليمين في نهايتها لتحديد بلوك الاوامر
والآن الى التعليمة التالية
 
 
  cout<<"HEY, Hello ِArabs";
 
الامر cout  يليه القوسين <<  مفتوحين الى اليمين معناها اخراج ما بين علامتي الاقتباس
 


Cout <<

امر طباعة على الشاشة

"   "

علامات اقتباس لطبع الرسالة التي بينهما كما هي
 
الى الامر الاخير
 
 
  return 0;   
 
وقد شرحناه اثناء تناولنا لموضوع انواع البيانات اخيرا ينتهي البلوك الرئيسي للبرنامج باعادة قيمة صفر وهو العدد الصحيح حسب الاعلان مع الدالة الرئيسيه بالامر int
وتتفق معى انه لايجب ان يكون صفر دائما ولكن كيفما تريد وحسب العمليات ولكن المهم ان يكون عدد صحيح 1 او 2 او غيرها لاننا اعلنا عن ذلك وعلينا الالتزام به والا سوف يعطي الكومبايلر رسالة خطأ
  والى الامر الاخير  }
انه قوس نهاية البلوك ولاحظ انه الى اليسار ليغلق البلوك الذي فتح بمثله ولكن الى اتجاه اليمين والآن انتهى برنامجنا الافتتاحي والى ملاحظاتنا
 
تذكر أن
 
1-  اوامر اللغة تكتب بحروف صغيرة small letters
2-  البرنامج يبدء بأوامر المعالج المبدئي لضم الملفات # include
3-  الدالة الرئيسية main  يجب ان تكون موجودة
4-  يفتتح البرنامج بالقوس}  ويغلق بالقوس{
5-  الملف الذي انشأته سيقوم برنامج التحرير بحفظه باسم ينتهي بالامتداد cpp
6-  جميع سطور البرنامج وبعد نهاية الاوامر والاعلانات نضع الفاصلة المنقوطة ;
بعد اقواس افتتاح البرنامج وبعد اوامر المعالج المبدئي وبعد اسم الدالة حاليا اقول لك نضعها فقط بعد الاوامر داخل بلوك الدالة ومعناها نهاية الامر اهتم بذلك
ماذا لو اعلنا عن نوع الدالة الرئيسية بالامر void  ومعناه غير مطلوب منها اعادة شئ سيكون الامر return  بدون قيم بالطبع او كما يلي
 
// This a modification no. 1
#include
 
void main()
{
  cout<<"HEY, Hello ِArabs";
  return ;   
}
لاحظ الامر return  لم يوضع بعده قيم
وتذكر ان مايلي // هي عبارة عن ملاحظات لسطر واحد فقط وكلما وضعت سطر ملاحظات ضع هاتين العلامتين في بداية السطر
// This is a remark no. 1
// And this is the remark no. 2
// It is no. 3
 
وهناك اسلوب اخر لكتابة الملاحظات في عدة سطور بأن تبدء بالعلامة /*
ثم تكتب ما شئت من ملاحظات في اي عدد من السطور ثم تنهيها بالعلامة */
مع ملاحظة الاتجاهات وتكون الملاحظات السابقة بالاسلوب الذي شرحناه كما يلي
 
/*
 This is a remark no. 1
 And this is the remark no. 2
 It is no. 3
*/
لاحظ الفرق لكي يتضح لك الشرح استخدم ايهما او ما تراه اسهل لك منهم اقصد من الاسلوبين السابقين    

 الدرس الثاني 






 

انا اقصد بكلمة البرمجة العادية التمييز بينها وبين البرمجة بالاهداف أو Object oriented languages
التي تستخدم مع لغات السي ++ والجافا ++ وغيرها
ولكي تتعلم لغة برمجة عادية يجب ان تبحث في كيفية تعلم الآتي بصرف النظر عن مواضيع الكتاب
الذي تتعلم منه وسنشرح كل جزئية وليس شرح للغة معينة وان استعنا ببعض الامثلة من لغة السي
أولا : يجب ان تعرف كيف تعلن عن المتغيرات التي سوف تستخدمها في برنامجك
ماهي المتغيرات
لابد ان يحتوي اي برنامج على متغيرات اي أوعية لوضع البيانات فيها حسب نوع البيان فالاسماء هي متغيرات حرفية والاعداد هي اما اعداد صحيحة او عشرية مثلا فمثلا بيانات موظف يقوم احد البرامج  بالعمل عليها اتخيل ان تكون كما يلي
 



المتغير

(الوعاء الذي سيستقبل البيانات)

النوع المفترض ان يكون (منطقيا)  

اسم الموظف

متوقع ان يكون مجموعة حروف

رقمة الوظيفي

متوقع ان يكون عدد صحيح لانه لايوجد رقم موظف مثلا 3555.256

الراتب الشهري

متوقع ان يكون عدد عشري به كسور مثل 355.5

اذا لابد من التفكير في كيفية المتغيرات المناسبة لكل بيان فمثلا لو اخطأت واخترت بيان الراتب عدد صحيح فاذا كان راتبه وهو شئ متوقع 355.5 فلن يقبل لان البرنامج سوف يحوله الى عدد صحيح مقرب وهو 356 وهو ليس خطأ البرنامج وانما خطئك انت لانك اعلنت ان متغير الراتب عدد صحيح فما ذنب بائع الفاكهه اذا طلبت منه شراء تفاح وانت تقصد برتقال انما قام البائع بتنفيذ ما سمعه منك مثل هذا الخطأ يسمى خطأ منطقي لان الكومبيوتر لا يعترض عليه

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


ألامر حسب اللغة

نطاق التخزين

السعة بالبايت

int

0-32767

2

long

32768-2147483647

4

 unsigned long

2147483648-4294967295

8
 
فمثلا لتحديد رقم الموظف سوف نستخدم النوع الاول اذا كان اجمالي عدد الموظفين بالشركة لا يزيد عن

32767 ولانستخدم النوع الثاني مع انه مقبول والسبب ان النوع الثاني سوف يحجز اربعة بايتات للرقم

في حين انني احتاج الى اثنين فقط مع المتغير الاول وبالتالي تتضخم ملفات البيانات بلا داعي
المثال
  int  SerialNo;
 long SerialNo;
 unsigned long SeialNo;

بالطبع مع اللغة التي سوف تستخدمها ستختلف الصيغة لكن المنطق والفكرة واحدة
 
متغيرات الاعداد العشرية
 


ألامر حسب اللغة

نطاق التخزين

السعة بالبايت

float

3.4*E-38  to 3.4E38

2

double

1.7*E-308 to 1.7*308

4

long double

3.4*E-4932 to 1.1*E4932

8
 
ملاحظة:

E38  معناها 10 اوس 38 او 10 مرفوعة الى القوة 38 ولايهمك ذلك الآن

مثال
 float  Salary ;
 double Salary;
 long double Salry;
بالطبع يمكنك استخدام المتغير الاول لتخزين راتب الموظف ولكن استخدم الثاني لتخزين اجمالي رواتب الموظفين  لاعطاء حيز تخزين اكبر
مثال
  float Salary;
  double TotalSalaries;
  
عند استخدام متغير ذو سعة تخزين اقل لاستيعاب رقم او بيان اكبر من سعته فلن يعترض البرنامج ولكن سوف
تحصل على نتائج خاطئة مثلما تريد سكب برميل من الماء في كأس صغير فلن يعترض الكأس ولكن سوف يأخذ
حاجته فقط والباقي سوف ينسكب على الارض
 
متغيرات الحروف

 


ألامر حسب اللغة

نطاق التخزين

السعة بالبايت

char

حسب التحديد

حسب التحديد
 
بفرض انك خصصت اقصى عدد لاسم الموظف بثلاثين حرف

مثال

 
  char  HisName [30];

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


المتغير المفترض

نوعه

الامر حسب قواعد اللغة

HisName

حروف

gets  (HisName)

HisSalary

اعداد عشرية وكسور

scanf  (“%.2f” , HisSalry)

HisNumber

اعداد صحيحة

scanf  (%d,HisNumber)
 
 
كل لغة برمجة تعطيك اماكانات خاصة افحص كتب اللغة في هذا الموضوع وكمثال
تعطي لغة سي القياسية اوامر للتحويل مابين انواع المتغيرات وبعضها وكما ذكرنا سابقا مثلا ان الامر او الدالة gets   تقوم بادخال المتغيرات الحرفية فيمكن استخدامها لاستقبال الارقام كأنها حروف وتقوم داله اخرى بتحويل هذه الحروف الى ارقام
 
مثال

 

 char  buf [20];
 int HisNumber;
 
gets (buf);
HisNumber = atoi (buf);
اعلنا هنا عن متغير حروف فقط لاستقبال الارقام وبالطبع الدالة gets
سوف تتعامل معها على انها حروف اي لا يمكن استخدامها في العمليات الحسابية تم استقبال البيانات اي الرقم المسلسل وتم وضعه في المتغير buf
خاصة وهو كما تعرف سبق الاعلان عنه كمتغير حرفي يستقبل حروف ولكنك ادخلت ارقام لان البرنامج يسألك عن الرقم المسلسل للموظف وقد استقبلت الدلة gets  الرقم المسلسل ووضعته في المتغير buf  كحروف ميتة مع انه رقم اخيرا قامت الدالة atoi  بتحويل المتغير الحرفي buf
الى متغير عدد صحيح ووضعته في المتغير HisNumber
والذي اعلن عنه كعدد صحيح
 
الخلاصة:
ابحث في كتاب اللغة التي تتعلما عن دوال التحويل وادرسها جيدا
 
ثالثا : يجب ان تعرف كيف تكتب المعادلات لانجاز الحسابات
 
هذا الموضوع بالذات تتفق فيه جميع لغات الكومبيوتر بلا استثناء وهناك بعض القواعد البسيطة التي يجب ان تعرفها
 
·        لابد ان تحتوي المعادلة في طرفها الايسر على متغير واحد فقط واي عدد في الطرف الايمن
  مثال
 A = B + C * 5 –3
·        جميع القيم الموجودة في الطرف الايمن تكون معلومة القيمة اي تم حسابها مثلا في معادلة سابقة
مثال
B = 5
C =  10
A = B + C * 5 –3
فقد تم تخصيص قيمة للمتغير B  و للمتغير C
ثم دخل البرنامج الى المعادلة الاخيرة لحساب قيمة A  وقد علم تماما قيم الطرف الايسر
اي قيم B   و C
فاءذا كتبت مايلي سيكود خطأ قاتل
B = 5
A = B + C * 5 –3
C = 10
لان البرنامج عرف قيمة المتغير بي ثم دخل الى المعادله ليحسب ايه وهو لا يعرف قيمة المتغير سي حيث سيعلمها فيما بعد فرتب خطواتك لتون منطقية
 
· كل من درس مبادئ الرياضيات يعلم ان القسمة على الصفر خطأ فادح واذا حدثت  سيتعطل البرنامج ويعطيك نظام التشغيل الرسالة المعروفة هذا البرنامج قام بعملية ممنوعة
 
مثال
B = 7
C = 7
D = B-C
A = B/D
قام البرنامج بالقسمة على صفر حيث ان قيمة بي = 7 وسي = 7 ودي = بي – سي اي 7-7 وتساوي بذلك صفر ثم تأتي مرحلة انهيار البرنامج عندما يقسم بي على دي وقيمتها صفر بعد الحسابات السابقة (احذر ذلك )
  كل ماهو خطأ رياضي سيكون خطأ في البرنامج مثل حساب الجذر التربيعي لعدد اقل من الصفر وهكذا
·        حافظ دائما على ان يكون عدد الاقواس المفتوحة يساوي عدد الاقواس المغلقه
·        اقصد عدد الاقواس ذات الاتجاه اليمين = عدد الاقواس ذات الاتجاه اليسار
·        لان الكوميوتر عندما تفتح له قوس ايسر معناها بدء عملية حسابية منفصلة
·        حتى لوكانت داخل معادلة واحدة فاءذا لم تغلق بالقوس الايمن فمعنى ذلك عملية
·        لم تغلق وتنهار المعادلة وبالتالي البرنامج.
مثال لاحظ فيه ان عدد الاقواس متساوي
A = (A+B) * ( C – D) – (Q * M)
 
 
 
رابعا  : يجب ان تعرف اوامر القفز داخل اللغة التي تتعلمها
 
عمليات القفز المقصود بها ان البرنامج  سيقوم بالقفز على مجموعة من الامر دون تنفيذها
ليتجه الى اجزاء اخرى داخل البرنامج لها أولوية حسب فكر المبرمج
مثال
 
A = (A+B) * ( C – D) – (Q * M);
    goto         final;
    Z = 3 * m;
   U = Z + 4;
 final :
      I = A * 10;
اوامر القفز مثل goto   يليها عنوان لايتكرر حتى لايضل البرنامج طريقه وهو في مثالنا العنوان final   جعلت البرنامج يقفز فوق المعادلتين
 
      Z = 3 * m;
U = Z + 4;
 
ولا ينفذهم او يجري حساباتهم وقفز مباشرة حيث يوجد العنوان final
ليستكمل عمله من هناك وسوف تعرف فوائد ذلك في ختام هذا الشرح مع التطبيق الكامل
 
 
خامسا  : يجب ان تعرف اوامر الدوران داخل اللغة التي تتعلمها
 
الدوران او عمل looping   من الاوامر الاساسية في جميع لغات البرمجة فمثلا اذا كان البرنامج سيدخل اسماء الف موظف هل تعتقد انك ستكتب الف امر لادخال هذه الاسماء بالطبع ستكون حماقه ولكن لو وضعنا امر واحد فقط لادخال اسم الموظف وطلبنا من البرنامج  الدوران الف مرة حول هذا الامر بالطبع سيكون شئ جميل ان يدخل الف بيان بمجهود بسيط نتيجة تسهيل اعطته لغة البرمجة مثال لبرنامج غبي جدا جدا
 gets  (employer1);
gets  (employer2);
gets  (employer3);
gets  (employer4);
gets  (employer5);
gets  (employer6);
gets  (employer7);
:
اكتب نفس الاوامر حتى تصل للعدد الف شئ استفزازي بالفعل
:
:
gets  (employer1000);
 
ولكن مع الدوران
 
 
 for  (I = 0 ; I < 1000 ; I++){
gets (employer [I]);
}
ياله من شئ جميل فعلا حسب صيغة اللغة التي تستخدمها طلبنا من الكومبيوتر انشاء عداد يعد من صفر الى الف ورمزنا لها بالرمز
ثم داخل العداد طلبنا منه ادخال الموظف رقم I  وهو عداد متغير حتى يكتمل العداد بوصوله للالف ويكون قد تم تنفيذ الامر معه الف مرة بأدنى مجهود  وكلما تغير العد من 1 الى 2 الى 1000 تغير معه رقم الموظف بنفس الطريقة
 
الخلاصة
لاتلتفت الى صيغة الكود المكتوب فهو بلغة سي ونحن نتحدث عن اللغات عموما
فقط افهم الفكرة وابحث في كتب اللغة التي تتعلمها عن الصيغة المعتمدة لهذه اللغة
 
 
سادسا  : يجب ان تعرف اوامر الشروط  داخل اللغة التي تتعلمها
 
الشرط هو افتراض معين يتوقف عليه عمليات اخرى فمثلا تريد ان تضع شرط الا يدخل رقم موظف اكبر من الف لان عدد موظفين الشركة لايزيدون عن الف وبالتالي اذا ادخل من يعمل على البرنامج رقم موظف اكبر من الف
يقوم البرنامج باصدار رسالة تفيد بذلك وهكذا لها حالات كثيرة حسب فكرة  البرنامج
مثال
  scanf  (“%d”,EmployerNumber);
if (EmployerNumber > 1000 )
cprintf (“ثكلتك امك لايوجد موظف بهذا الرقم الا تعرف عدد زملائك  اعد الادخال “);
وتستخدم الشروط ايضا في عمليات القفز اي عند شرط معين يتم القفز بالطبع تعلم شكل اكبر من واصغر من ويساوي وصيغة كتابتها حسب اللغة التي تتعلمها
 
 
سابعا  : يجب ان تعرف كيف تبني دوال فرعية  داخل اللغة التي تتعلمها
 
الدوال الفرعية subroutines  هي شبه برنامج صغير اذا كان عندك سلسله عمليات متشابهه سوف تجريها داخل البرنامج كثيرا وتكررها كثيرا فلا داعي لاعادة كتابتها كل مرة بل يكفيك ان تكتبها مرة واحدة وتطلق عليها اسم وكلما ذكرت هذا الاسم داخل البرنامج تتم تلك العمليات ويصبح هذا الاسم كأنه من اوامر اللغة ايضا مثال اخر
لنفرض ان هناك اوامر لرسم جدوال بأبعاد ومساحة معينة وتحتاج الى رسمة كثيرا فليس معنى هذا انك كل مرة تريد رسم الجدول ستعيد كتابة اوامره الكثيرة في كل مكان داخل البرنامج فقط جمع اوامر رسمه في روتين فرعي وسميه اسم وكلما ذكرت الاسم يتم رسم الجدول انه شئ رائع اليس كذلك انا اظن ذلك
كل ماعليك ان تبحث في تعليمات اللغة التي تتعلمها عن اسلوب وشكل بناء
هذه الروتينات في الابواب المخصصة لذلك
 
 
ثامنا  : يجب ان تعرف  أوامر التخزين على الاقراص داخل اللغة التي تتعلمها
 
بعد ان قمت بتخزين بيانات الموظفين عليك الآن بتخزينها على القرص حتى لاتفقد وتقوم باسترجاعها وقتما تشاء وكذلك اوامر الاسترجاع راجع هذه الجزئية في  كتب اللغة التي تتعلمها وافضل وانصح بجعلها في مرحلة متأخرة من التعليم
 
 
تاسعا  : يجب ان  اوامر اخراج البيانات على الشاشة او الطابعة داخل اللغة التي تتعلمها
 
بالطبع هي المرحلة الاخيرة فأنت تريد ان ترى ثمرة عملك لكي يكون البرنامج مفيدا فما فائدة البرنامج اذا لم تظهر نتائجه
مثال
 cprintf ( “The employer’s name is “,HisName);
البرنامج يقوم بطبع القيمة المخزنة في المتغير السابق ان عرفناه سابقا 
كمتغير حرفي يحمل اسم الموظف ليقوم بطبع محتوياته
 
عاشرا  : يجب ان  تتعلم استخدام كومبايلر اللغة التي تستخدمها وهو الذي يقوم بعمل الملف القابل للتنفيذ من الكود الذي
كتبته وكذلك اوامر الحذف والتحرير واستخدام قوائم المساعدة ومرعاة كتابة اوامر اللغة بصيغة سليمة
  ألان لنطبق كل المراحل السابقه في برنامج واحد لنتعرف على الفكرة وكما ذكرت لك سابقا لاتهتم بالاوامر المكتوبة هنا فهي خاصة بلغة سي كمثال ولكن تختلف البرمجة من لغة لاخرى
 
 
// This is a remark
// This code fragment has been written by Eng. Mohamad hasan
الآن نعلن عن المتغيرات
 Struct MyData{
Int EmployerNumber;
Float HisSalry;
Char [40] HisName , buf [40];
 
}D;
 
int I;
double TotalSalries;
الآن نبدء ادخال البيانات بعمل دوران الف دورة
For (I = 0 ; I < 1000;I++){
ادخال الاسم
Gets (D.HisName);
ادخال الرقم المسلسل
AgainBaby:
Gets (buf);
D.EmployerNumber = atoi (buf);
 
If (D.EmployerNumber > 1000 ){
هنا نضع شرط عدم الزيادة عن الف كرقم لموظف
Printf (“Number is greater than 1000 , Please repeat again”);
Goto AgainBaby;
}
ادخال الراتب الشهري
Gets (buf);
HisSalry = atof (buf);
استدعاء روتين فرعي لتخزين البيانات
HaySaveMyData ();
}
 
هنا سنقوم بعمل دوران الف مرة لاستدعاء الالف بيان المخزنه لعرضهم
For (I = 0 ; I < 1000;I++){
والان سوف نضع روتين لاستدعاء البيانات من القرص
HayLoadThisRecord (I)
وهنا سوف نضع اوامر لعرض كل بيان تم تحميله من القرص
Printf (“\n Employer No.   %d“, D.EmployerNumber );
Printf (“\n Employer Name   %s“, D.HisName );
Printf (“\n Salary             .   %.2f“, D.HisSalary );
}
والآن الى الدوال الفرعية للتخزين
 
Void HaySaveMyData (void)
{
توضع اوامر الكتابة على القرص هنا (ليس موضوعنا في هذه المرحلة)
}
 
Void HayLoadThisRecord (int i)
{
توضع اوامر التحميل من القرص هنا (ليس موضوعنا في هذه المرحلة)
}
   
 


ان شاء الله انقل لكم بقية الدروس يوم بعد يوم    

   










 
تعلم سي بلس بلس
الدرس الثاني
 
أوامر الاشتراطات
 
مساء الخير
من انتقلوا معنا الى الدرس الثاني يبدو انهم سوف يكملون المسيرة الى اخرها واتمنى انا ان اكملها معهم .
كما تحدثنا عن اللغات بصفة عامة وقلنا ان الاشتراطات من الامور الهامة في اي لغة والآن لانريد ان نعيد ما قلناه سابقا لندخل مباشرة في موضوع اليوم
المعنى البسيط والقريب لموضوع اليوم انك تريد من برنامجك ان يفعل اشياء معينه عند تحقق شروط معينه ولكن كيف نصيغ هذه الاوامر هذا هو موضوع اليوم
انك ترى الشروط دائما وربما بدون ان تدري فأول شئ فعلته اليوم عند اتصالك بالانترنت هو ادخال كلمة السر – أليس كذلك – نعم هو كذلك ولا شئ غيره – ان برنامج الاتصال قد وضع شرط صحة كلمة السر لكي يمكنك من الدخول وربما اشياء اخرى مثل عدم انتهاء مدة الاشتراك وصحة اسم المستخدم وهكذا كلها شروط انها ايضا موضوعنا هذا اليوم ومعظم الشروط المستخدمه لقيمتين هي هل هما متساويتان ام احدهما اكبر او اصغر بالاضافة الى المعاملات البولينية Boolean operators
ومن درس منكم علم الجبر سوف يتذكرها بسرعة ام من نسى او لم يدرسها اصلا فالموضوع بسيط جدا لانك تمارسه في حياتك اليومية ربما دون ان تدري وهي
AND , OR , NOT
كمثال من الحياة اليومية
Ask  Mohamad AND Ali
يجب ان تسأل محمد وعلى وليس واحد منهم فقط بل يجب ان يكون السؤال للاثنين
Ask Mohamad OR ALI
اي يجب ان تسأل محمد او على يكفي فقط واحد منهم
Ask Mohamad NOT Ali
اي يجب ان تسأل محمد وليس على فلو سألت على فان الشرط غير متحقق
 
الجدول التالي يعبر عن طريقة صياغة المعاملات البولينية في لغة سي++
 



التعبير أو الصيغة

التفسير

||

OR

&&

AND

 
 
والجدول التالي يعبر عن العلاقات الشرطية وكيف تصاغ في لغة سي++
 



التعبير أو الصيغة

التفسير

>

اكبر من فتحة القوس في اتجاه الاكبر

<

اصغر من

==

يساوي (تذكر انهم علامتين متجاورتين

>=

اكبر من او يساوي

<=

اصغر من او يساوي

!=

لا يساوي

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

A=5;
B=A;
C=18;

اما في صياغة شرط فاءنك لابد ان تضع علامتين اذا اشترطت التساوي مثل
if (A==B)
if (A==18)
ارجو ان تنتبه لذلك
 
ولنأخذ مثال اليوم فقد تأخرنا كثيرا
 
// This is a remark do you remember ?
// It has no effection , just for you , is it?
 
 
#include             
 
int main()                  
{
  int Num;                  
  cout<<"Please input a Number : ";  
 
  cin>>Num;                 
  if(Num < 50)              
  {
     cout<<"The Number is less than 50";    
  }
 
if(Num == 50)     
  {
     cout<<"The Number is equal to 50";        
  }
 
if(Num > 50)
  {
    cout<<"The Number is bigger than 50"; 
  }
  return 0;
}
 
 
لقد بدأت السطور الحمراء بالامر
cin<
 
هذا الامر جديد علينا ان معناه ادخل قيمة المتغير Num والذي اعلن عنه في بداية البرنامج على انه عدد صحيح فسوف يتوقف البرنامج عند هذا الامر ليطلب منك ادخال قيمة يخزنها في المتغير Num  ليجري عليها العمليات التي تلي السطر المذكور سابقا
وألآن الى الاوامر التالية موضع شرحنا اليوم
 
  if(Num < 50)              
  {
     cout<<"The Number is less than 50";     
  }
والقاعدة هي  الامر if  ويفتح قوسين عاديين بينهما شروط حسب القاعدة السابق شرحها في اول الموضوع ثم قوس لبداية بلوك تعليمات واحد لفتح بداية بلوك والاخر للتحديد نهاية بلوك ومابداخل القوسين عدة تعليمات ينفذها البرنامج اذا تحقق الشرط
 
وهنا الشرط هو انك اذا ادخلت قيمة اصغر من 50 فمعنى ذلك تحقق الشرط وعليه سوف يطبع البرنامج الرسالة
 
cout<<"The Number is less than 50";    
 
واذا لم يتحقق الشرط فلن يطبع الرسالة السابقه بل سيتحول الى السطور التالية
 
if(Num == 50)     
  {
     cout<<"The Number is equal to 50";        
  }
بنفس الاسلوب السابق يختبر الامر if  ماذا كان الرقم الذي ادخله المستخدم يساوي 50 فاذا كان ذلك صحيحا فسوف يقوم بتنفيذ الامر او الاوامر التي بداخل بلوك الشروط وهي
 
     cout<<"The Number is equal to 50";        
 
فاءذا لم يتحقق الشرط فسوف لن ينفذ البرنامج مابداخل بلوك الشروط وينتقل الى السطور التالية
 
if(Num > 50)
  {
    cout<<"The Number is bigger than 50"; 
  }
فاذا تحقق الشرط هو ان العدد المدخل اكبر من خمسون فسوف ينفذ البرنامج الامر او الاوامر التي بداخل بلوك الشرط وهو الامر
 
    cout<<"The Number is bigger than 50"; 
 
والا فسوف ينتقل البرنامج الى السطور التالية
  return 0;
}
حيث ينتهي البرنامج ويخرج وتذكر قوس اغلاق البلوك وهو البلوك الرئيسي للدالة main
 
 
البرنامج السابق هو برنامج بسيط يقوم باستقبال رقم منك ليتعرف عليه ما اذا كان هذا الرقم اصغر من او يساوي او اكبر من 50 وفي كل حالة حسب ماتدخل من ارقام سوف يطبع لك الرسائل
 
·        الرقم اصغر من 50
·        الرقم يساوي 50
·        الرقم اكبر من 50
بالطبع سوف تحصل على اجابة واحدة من الثلاثه حسب المدخلات
 
لنأخذ عدة اوامر شرطية في صورة فردية للشرح لدمج كل ماسبق شرحة في دالة واحدة
 
if (A == 5 && B == 7)
{
نفذ هذه الاوامر عند تحقق الشرط
}
الشرط هو ان تكون قيمة المتغير A  تساوي خمسة وقيمة المتغير B  تساوي 7 لتنفيذ ما بداخل بلوك الشروط فاءذا كانت مدخلاتك كما يلي
 

A

B

مدى تحقق الشرط

3

2

لايتحقق الشرط

5

3

لايتحقق الشرط

3

7

لايتحقق الشرط

5

7

يتحقق الشرط

7

5

لايتحقق الشرط

1

2

لايتحقق الشرط
 
ولمثال آخر بلوك الشروط التالية
 
if (A > 5 || B <= 7)
{
نفذ هذه الاوامر عند تحقق الشرط
}
وقد كان الشرط السابق ان تكون قيمة A  اكبر من 5 أو قيمة B  اصغر من او تساوي
7 فلو كانت ادخالاتك كمايلي
 


A

B

مدى تحقق الشرط

3

2

لايتحقق الشرط

5

3

لايتحقق الشرط

3

7

لايتحقق الشرط

7

2

يتحقق الشرط

10

8

لايتحقق الشرط

10

7

يتحقق الشرط
 
دائما يكون امامك حالة من اثنين مهما كانت الشروط التي تضعها
·        الحالة الاولى تحقق الشرط او بمعنى آخر TRUE
·        الحالة البديلة عدم تحقق الشرط او بمعنى FALSE
 
ان مابداخل اقواس الشروط ولا اقصد بلوك الشروط هو عملية حسابية – دائما كل شئ بالنسبة للكومبيوتر هي عمليات حسابية كل شي في الدنيا يمكن ان يعبر عنه بارقام من اسمك الى صورتك مرورا بخريطة بلدك او نوع الفاكهة التي تحبها – كل شئ نعم كل شئ هو عمليات حسابية – ربما نتطرق الى ذلك لااحقا – لاادري قد يجبرنا احد الامثلة على شرح ذلك – وناتج العملية الشرطية بالنسبة للكومبيوتر هو اما TRUE  لينفذ مابداخل بلوك الشروط او FALSE  لينفذ شروط اخرى داخل بلوك else اذا كان موجودا او يستكمل باقي سطور البرنامج كما حدث مع المثال السابق هذا يقودنا الى امر آخر من اوامر الشروط وهو في لغة c++  ودائما يكون تابع للامر if  وهو الامر 

else
 
انت لاتحتاج الآن لان اقول لك ان اوامر لغة سي في مجملها تكتب بحروف صغيرة ودعني اكمل شرح الامر السابق انه امر غير مستقل انه تابع بالطبع انت توافقني على ذلك انك لايمكن ان تسمع شخص يقول والا – الا اذا كان قد ذكر اشياء قبلها اذا هذا الامر تابع فاذا كنت تكره الاشخاص التابعين من ذوي الشخصيات الضعيفة فارجو الا يمتد بغضك هذا الى الامر else  لانه امر هام ويسهل خطوات كثيرة وان كان يسهل الاستغناء عنه ودعنا نعبر عن ذلك بعدة سطور
 
if(GiveMe >= 50)                 
  {
     cout<<"Thank you – I like to take more than or equal 50 Rayals";    
  }
else
{
   cout<<"I am very angry – I don’t like to take less than 50 Rayals";    
}
 
جزء البرنامج السابق يعبر عن رد فعل احد الشحاذين فاذا اعطيته مبلغ اكبر من او يساوي 50 ريالا سوف يتحقق الشرط والنتيجة تكون TRUE  لينفذ مابداخل بلوك الشروط لينفذ الامر الخاص بطبع رسالة شكر ليخبرك بأنه (الشحاذ ولست انا بالطبع) يقول لك شكرا انا دائما احب ان تعطيني مبلغ خمسون ريالا او اكثر واذا لم يتحقق الشرط اي ان نتيجة العملية الحسابية FALSE  كأن تكون قد اعطيته اقل من 50 ريالا فسوف ينتقل التنفيذ مباشرا الى البلوك التابع else  لينفذ مابداخل بلوكه وهي هنا رسالة ضيق وتبرم بأنه لايحب ان يأخذ اقل من خمسون ريالا حتى لوكانت المبلغ يقل بهللة واحدة فقط عن الخمسون ريالا انها عمليات حسابية ياصديقي العزيز وانا انصح من يمتهنون هذه المهنه ببرمجة روبوت بجزء البرنامج السابق مع مزيد من الشكر والادعية في حالة تحقق الشرط وتبرم وضيق ولامانع من سيل من الشتائم في حالة عدم تحقق الشرط . ياله من روبوت رائع وسوف يختزن بداخله مبالغ مالية كثيرة سواء لخفة دمه في حالة تحقق الشرط او لقلة ادبه في حالة عدم تحقق الشرط.
سوف نتختتم هذا الدرس بهذا الملخص الذي قد يقود الى قاعدة هامة
 
if(FALSE)
{
  Not executed if its false
 }
else
{
  do all of this
}
 

























 
 
تعلم سي بلس بلس
الدرس الثالث
 
الحلقات والتكرارات
 
مساء الخير
سندخل في الموضوع مباشرة بدون لف أو دوران مع ان الموضوع يتعلق بالدوران والتكرار لقد تحدثنا عن فكرة الحلقات التكرارية او Loops في المقال العام عن البرمجة اذا لم تكن قد قرأته من فضلك راجعه الآن
طريقتين لعمل هذه الحلقات الاسلوب الاول بلامر for  والثاني بالامر while
لنأخذ جزئية البرنامج التالي  
 
#include             
int main()         
 {   
  int x;       
  for(x=0;x<100 font="" x="">
  {          
             
    cout<   
  
 }
    return 0; 
  }
 
 
السطور ذات اللون الازرق تناولنا شرحها بالدرس الاول أما السطور ذات اللون الاحمر فهي موضوع دراستنا اليوم
تقوم الحلقات التكرارية بتنفيذ عدة اوامر موضوعة داخل بلوك ونقصد ببلوك مابين القوسين } مجموعة اوامر{ الى ان تنتهي الحلقات او عدد الحلقات المحددة منك وعددها في مثالنا السابق 100 حلقة تكرارية وبدقة تبدء الحلقات من رقم صفر الى رقم 99 ومعنى ذلك ان العدد الاجمالي 100 حلقة بعد حساب الصفر من ضمن الارقام انتبه لذلك وتذكر ان المتغير x  يجب الاعلان عنه قبل استخدامه وذلك حسب نوع استخدامك له وهنا استخدمنا نوعه كعدد صحيح بالطبع يمكنك استخدامه كعدد عشري واليك صيغة الامر بالتفصيل
 
   
الصيغة
التفسير
for
امر اللغة لعملية التكرار
(
قوس مفتوح يوضح بداخله بارامترات الامر
x=0;
المتغير = رقم بداية الحلقات
x<100 span="">
شرط نهاية الحلقات
x++
المتغير يزيد بمقدار واحد مع بداية كل حلقة – لاتضع بعده فاصلة منقوطة
)
قوس نهاية بارامترات الامر – لاتضع بعده فاصلة منقوطة
{
قوس بداية بلوك الاوامر المطلوب تكرارها
بداخل اقواس البلوك توضع الاوامر المطلوب تكرارها
}
قوس نهاية بلوك الاوامر المطلوب تكرارها
 
بداخل بلوك الاوامر تم تنفيذ الامر
    cout<
 
وهو امر يقوم بطبع قيمة x  التي تتغير في كل مرة ابتداء من صفر حسب ماذكرت ان
X=0  وتزيد في كل مرة بمقدار 1 حسبما ذكرت ان x++  وذلك حتى يصل الى 99 حسبما ذكرت ان x<100 span="" style="mso-spacerun: yes;"> 
وendl  تعني end of line  اي انتقل الى سطر جديد كلما طبعت قيمة حتى لا يسرد طبع الارقام متجاورة بل يطبع على كل سطر قيمة المتغير وبالتالي ستكون مخراجات البرنامج كما يلي
0
1
2
3
4
.
.
.
99
 
لنستفيد اكثر من قوة الحلقات التكرارية وايضا نرى امكانات اخرى لها بوضع حلقة داخل حلقة كما يلى   في البرنامج الذي يطبع جدول الضرب  من جدول واحد حتى جدول 12
   
#include             
int main()         
 {   
  int x , y , z;       
  for(x=1;x<13 font="" x="">
  {          
  for(y=1;y<13 font="" y="">
  { 
     z = x * y;        
    cout<<x<<”*”<<y<<”=”<     
 }
 }
 
  return 0; 
 
}
كما تعلم ان السطور الزرقاء سبق دراستها ولكن ننوه فقط اننا اعلنا عن ثلاث متغيرات لاعداد صحيحة الاول للحلقة الاولى والثاني للحلقة الثانية والثالث لاحتواء حاصل الضرب وهو الهدف من البرنامج.
بنفس ماسبق شرحه وضعنا حلقة تكرارية تبدء من رقم واحد وتنتهي برقم 12 وتزيد بمقدار واحد واوامر هذه الحلقة مكتوبة للتوضيح بخلفية صفراء حيث بدأت الحلقة بالصيغة السابق شرحها ثم قوس بداية البلوك وقوس نهاية البلوك حيث يوضع مابين القوسين سلسلة اوامر لتنفيذها كما سبق واتفقنا عليه
 
  for(x=1;x<13 font="" x="">
  {          
 
اوامر مطلوب تنفيذها

}
 
وبداخل اقواس البلوك للحلقة الاولى مطلوب وضع اوامر للتنفيذ فكانت اوامر التنفيذ داخل البلوك عبارة عن حلقة اخرى وما المانع فالحلقات وغيرها هي نفسها اوامر والحلقه الاخرى كانت عبارة عن عداد يعد من الرقم 1 الى الرقم 12 وهي ايضا تحتاج الى صيغة معينة واقواس بلوك للتنفيذ وهي موضوعة في البرنامج بخلفية خضراء كما يلي
for(y=1;y<13 font="" y="">
  { 
     z = x * y;        
    cout<<x<<"*"<<y<<"="< 
    
 }
وبداخل بلوك الاوامر للحلقة الثانية وضعنا عدة اوامر لتفى بالغرض الذي من اجله تم عمل البرنامج وهو جدول الضرب – عبارة عن معادلة لحساب حاصل ضرب المتغيرين x و y
ويوضع الناتج في المتغير z  كما يلي
 
z = x * y;   
بالطبع تلى ذلك صيغة لطبع مخرجات البرنامج والا ما الفائدة منه اذا لم ارى نتيجة عملى وهذه الصيغة سأشرح لك فيما بعد وفي هذا الدرس لماذا اخترت هذه الصيغة بالتحديد فهو ليس موضوعنا الآن ودعني اشرح لك الاهم من ذلك وهو ميكانيكية عمل الحلقتين
 
·        يبدء البرنامج بالدخول الى الحلقه الاولى ويخصص للمتغير اكس القيمة واحد حيث انها قيمة عداد البداية ثم يدخل الى داخل اقواس بلوكه لتنفيذ ما بداخله فيجد حلقه اخرى فيبدء بتنفيذها وطلبت الحلقة ان يكون متغيرها واي يبدء بالقيمة واحد وينتهي بالقيمة 12 ثم تدخل الحلقة الثانية الى بلوك اوامرها فتجد معادلة يضرب فيها قيمة اكس التي هي واحد الآن وتتغير قيمة واي فيها ثم طبع النتائج وتظل الحلقة الداخلية تنفذ بتغير واي مع ثبات اكس بالطبع وتكون النتائج كما يلى
 
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
.
.
.
1 * 12 = 12
وعند وصول نهاية عداد الحلقة الداخلية الى 12 وهو نهاية الحلقة ينتهي تنفيذ الحلقة فيستمر البرنامج فيجد امامه قوس نهاية الحلقه الخارجية ذو الخلفية الصفراء فيعود الى الحلقة الخارجيه حيث تزيد قيمة اكس بمقدار واحد وتصبح قيمتها = 2 فيدخل الى بلوك اوامره كما سبق فيجد حلقة اخرى تبدء من واحد وتنتهي ب 12 وبداخلها معادلة وامر طبع فيكون التنفيذ كما يلي
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
.
.
.
2 * 12 = 24
 
وهكذا يستمر التنفيذ الى ان تصل الحلقة الخارجية الى نهايتها بالرقم 12 واثناء ذلك تنفذ الحلقة الداخلية من بدايتها الى نهايتها اي من 1 الى 12 وتطبق المعادلة وامر الطبع ليكون اخر تنفيذ كما يلي
12 * 1 = 12
12 * 2 = 24
12 * 3 = 36
.
.
.
12 * 12 = 144
 
شرح صياغة امر الطبع بالصورة التالية
 
 
cout<"*"<"="<endl;
 
مابداخل علامات الاقتباس دائما يطبع كما هو وهو مميز اعلاه بالخلفية الخضراء وكل مايوضع داخل علامة الاقتباس يطبع نصه كما هو اما ماهو خارج علامات الاقتباس بين ازواج الاقواس >>متغير>> فيطبع قيمة المتغير وليس اسم المتغير فمثلا x  لاتطبع x  ولكن تطبع قيمتها فمثلا 1 – 2 – 3    ----- 12 حيث انها متغيرات وتميز اعلاه بالخلفية الصفراء وذلك للحصول على شكل مقبول يوضح العملية المطلوبة لتظهر النتائج بالصورة
 
12 * 12 = 144
 
والآن الى النوع الثاني من الحلقات وهو ابسط من السابق ولكن السابق اكثر استخداما واكثر قوة
 
While
 
#include   
 
int main()              
{
 int x=0;           
 while(x<100 span="" style="mso-tab-count: 2;">     
 {
    cout<
    x++;     
               
  }            
 return 0;
}
 
سوف اشرحها لك في سطور قليلة لبساطتها الاوامر باللون الازرق سبق شرحها اما الحلقة موضع النقاش فهي باللون الاحمر وصيغتها
 
while(x<100 span="">
 
وبعد الاعلان عن المتغير اكس خلاصة شرح الامر السابق (أعد تنفيذ ما بداخل البلوك طالما اكس او المتغير اقل من 100 ثم اقواس بلوك تضع ماشئت بداخله من اوامر وقوس نهاية البلوك ويزيد معنا فقط عداد للمتغير ليزيده بالمقدار الذي تريده ويوضع في اي مكان داخل الحلقة او حسب افكارك عن البرنامج المهم لاتنساه والا سوف يدور البرنامج داخل الحلقة الى الابد حيث ان شرط نهايتها ان تزيد اكس عن 100 وطالما لم تضع عداد زياده للمتغير فلن يتحقق الشرط وبالتالى لن تنتهي الحلقه الى الابد ويظل يعمل الكومبيوتر بلا نهاية للبرنامج ويميز العداد بالخلفية الصفراء واليك جدول صياغة الامر الذي تعودنا عليه.
 
الصيغة
التفسير
while
امر اللغة لعملية التكرار
(
قوس مفتوح يوضح بداخله بارامترات الامر
X<100 span="">
المتغير مع شرط لنهاية الحلقة
)
قوس نهاية بارامترات الامر – لاتضع بعده فاصلة منقوطة
{
قوس بداية بلوك الاوامر المطلوب تكرارها
بداخل اقواس البلوك توضع الاوامر المطلوب تكرارها
x++;
ولا تنسى عداد الزياده او النقصان ليتحقق الشرط لانهاء تنفيذ الحلقة
}
قوس نهاية بلوك الاوامر المطلوب تكرارها
 
 
لقد ذكرت لك كلمة عداد الزيادة او النقصان نعم يمكن ان يتناقص العداد اذا كانت صيغة البرنامج كما يلي وذلك لطبع قيمة المتغير تناقصيا من 99 الى صفر بعد ان كان في البرنامج السابق تصاعديا من صفر الى 99 ويكون التعديل كما يلي
 
#include   
 
int main()              
{
 int x=99;          
 while(x>0)       
 {
    cout<
    x--;     
               
  }            
 return 0;
}
 
بدء هنا تخصيص المتغير مع الاعلان بالقيمة 99 ثم شرط التكرار ان يكون متى كانت قيمة المتغير اكبر من الصفر ثم عداد تناقصي يظل يطرح واحد من القيمة الى ان يصل الى الصفر ثم يطرح من الصفر 1 فتصبح قيمته –1 وبالتالي لايتحقق الشرط حيث ان قيمة –1 ليست اكبر من الصفر وتنتهي الحلقه كما نريد لاحظ العداد التناقصي بالخلفية الصفراء
 
 
  
 

 


 
 
تعلم سي بلس بلس
الدرس الرابع
 
الدوال
 
مساء الخير
موضوع اليوم عن الدوال او الروتينات الفرعية وهي اجزاء من البرنامج مثل الدالة الرئيسية تقوم بعمل مهمة معينة تتكرر في برنامجك او تستخدمها في برامج اخرى او حتى اذا كانت لا تتكرر من فوائدها
·        تقسيم البرنامج الى اجزاء صغيرة تستدعى وقت اللزوم
·        عدم ازدحام الدالة الرئيسية للبرنامج بأوامر كثيرة
·        تقسيم البرنامج الى اجزاء يمكن اختبارها منفصلة لسرعة تحديد الخلل بالبرنامج
·        توفير المجهود والوقت والتفكير بعمل مكتبة خاصة بك تعيد استخدام الدوال التي استخدمتها في برنامج وذلك في برنامج آخر عند اللزوم
·        تقسيم العمل بين المبرمجين عن العمل في مشروع جماعي لانتاج برنامج كبير
·        تبادل الخبرات بين مطوري البرامج بنشر اجزاء يستخدمها الآخرون في برامجهم
لتطبيق ذلك دعنا نحضر البرنامج الذي تناولناه في الدرس الثالث لاعطائه مزيدا من القوة والتطوير باستخدام الدوال
 
#include             
int main()         
 {   
  int x , y , z;       
  for(x=1;x<13 font="" x="">
  {          
  for(y=1;y<13 font="" y="">
  { 
     z = x * y;        
    cout<<x<<”*”<<y<<”=”<     
 }
 }
 
  return 0; 
 
}
لوكنت قد تذكرت الآن فان البرنامج كان يقوم بعمل جدول الضرب من جدول واحد الى جدول 12 واحتوى كامل التعليمات داخل الدالة الرئيسية دعنا نستخدم الدوال ولنسمي هذه الدالة DoiT
 
#include
void DoiT (void);
         
int main()         
{
DoiT ();
}
 
// This is the new function
void DoiT (void)
 {   
  int x , y , z;       
  for(x=1;x<13 font="" x="">
  {          
  for(y=1;y<13 font="" y="">
  { 
     z = x * y;        
    cout<     
 }
 }
 
  return ; 
 
}
مايخص الدالة الجديدة مكتوب باللون الاحمر فقبل الدالة الرئيسة main تم الاعلان عن نموذج الدالة او ما يسمى prototype  بهذا الشكل
 
void DoiT (void);
 
وفيه نخبر الكومبايلر بشكل وما ستكون عليه الدالة كما يلي
 
الصيغة
التفسير
void
ماهي القيمة التي سوف تعيدها الدالة للدالة التي استدعيت منها وذلك بالامر return هنا استخدمنا void  بمعنى لاشئ وبالتالي علينا استبدال return 0 التي استخدمناها في الدرس الثالث الى الامر return  فقط حيث اننا اعلنا ان الدالة غير مطلوب منها اعادة شئ
DoiT
اسم تختاره لدالتك بحيث يكون معبرا قليلا عما ستفعل انا هنا لم اختر اسم معبر
(
قوس لاحتواء البارامترات التي ستمرر للدالة
void
البارامترات التي ستمرر للدالة وهنا اخترنا void بمعنى لن نمرر لها شئ
);
قوس اغلاق لمجموعة البارامترات يليها فاصلة منقوطة
 
 
والآن الى باقي سطور البرنامج لاستكمال الشرح
int main()         
{
DoiT ();
}
كما سبق ولابد ان نعلن عن الدالة الرئيسية للبرنامج وهو الزام ثم داخل بلوك الدالة الرئيسية قمنا بالنداء على الدالة للتنفيذ وذلك بكتابة اسمها ثم قوسين لايوجد بينهما شئ هل تتذكر لماذا لان البارامترات المطلوب تمريرها للدالة لم تعطى اي void  ولكن بالطبع لاتكتب void  ولكن يكون ذلك في الاعلان عن الدالة فقط وهو على الصورة التالية
 
DoiT();
 
تلى ذلك قوس نهاية البلوك للدالة الرئيسة ثم جسم او هيكل الدالة نفسها ويبدء بنفس الاعلان عن اسم الدالة او البروتوتايب ولكن بدون فاصلة منقوطة في النهاية وكما تلاحظ وسبق ان قلنا ان الفاصلة المنقوطة لاتأتي بعد main() وبنفس الطريقة لاتأتي في مقدمة بلوك الدالة
void DoiT (void)
 {   
ضع اوامر الدالة هنا
 
}
ثم قوس بداية بلوك الدالة ثم مابداخلها من اوامر وقوس النهاية ودعنا ننتهز فرصة الدوال لاعطاءمزيد من التحسينات على البرنامج حيث ان البرنامج ينتج فقط جدول الضرب من جدول 1 الى جدول 12 فلماذا لانجعلها دالة عامة تنتج مايحلو لنا من جداول ضرب من المؤكد انك تتفق معي في ذلك وبذلك نستفيد من قوة الدوال وتصبح دالة عامة غير موجهه لمهمة ثابته فنحن نريد ان نحدد نحن بداية الجداول ونهايتها فتارة تطبع من جدول 7 الى جدول 20 وتارة تطبع من جدول 17 الى 40 وهكذا اليس هذا افضل سوف نمرر للدالة قيمة البداية وقيمة النهاية مع اجراء التعديلات اللازمة لذلك.
 
#include
void DoiT (int Start , int End);
         
int main()         
{
int Start , End;
cout<<"Please input start value ?: ";
  cin>>Start;
cout<<"Please input end   value ?: ";
  cin>>End;
DoiT (Start , End);
}
 
// This is the new function
void DoiT (int Start , int End)
 {   
  int x , y , z;       
  for(x=Start;x<End+1;x++)
  {          
  for(y=Start;y<End+1;y++)
  { 
     z = x * y;        
    cout<     
 }
 }
 
  return ; 
 
}
 
لتسهيل الامر عليك وضعت لك لون اصفر على التعديلات التي اجريتها للوصول الى الهدف المنشود لقد وضعنا في اقواس البروتوتايب اعلان عن تمرير متغيرين صحيحين الى الدالة
 
void DoiT (int Start , int End);
ثم داخل الدالة الرئيسية اعلنا عن استخدام متغيرين جديدين من نوع الاعداد الصحيحة هما
int Start , End;
 
تلى ذلك امر بطبع رسالة تطلب منك ادخال قيمة بداية الجدول وبعده امر بعملية الادخال نفسها ليعرف البرنامج القيمة المبدئية لبداية الجدول
 
cout<<"Please input start value ?: ";
  cin>>Start;
 
مثلهما تماما للمتغير الثاني ليعرف البرنامج قيمة النهاية والتي كانت ثابتة سابقا على القيمة 12 ونحن نريد برنامج اكثر مرونة ومطوع لكل الحالات
 
cout<<"Please input end   value ?: ";
  cin>>End;
بعد ان ادخلت قيمة البداية والنهاية فكما ذكرنا تم تعديل الدالة لتمرير متغيرين لها يتغيران مع كل ادخال والآن لننادي الدالة ممرين لها القيمتين الذين ادخلهما مستخدم البرنامج
 
DoiT (Start , End);
 
ثم اجرينا تعديل على اسم الدالة نفسها ليوافق البروتوتايب او اعلان الدالة الجديد في مقدمة البرنامج طبعا بدون فاصلة منقوطة
// This is the new function
void DoiT (int Start , int End)
 {   
ثم تلى ذلك وضع القيمة Start  الممررة للدالة كبداية عداد للحلقتين بدلا من القيمة 1 وكذلك المتغير End  الممرر الى الدالة كنهاية لعداد الحلقتين بدلا من القيمة 13 في مثال الدرس الماضي
 
ويجب دائما ان تفكر في احتمالات خطأ مدخل البيانات فمثلا ماذا لو أخطأ وادخل قيمة البداية اكبر من قيمة النهاية بالطبع سيحدث خطأ بالبرنامج وسيحدث نفس الخطأ اذا ادخلهم كقيمتين متساويتين وعليه يجب وضع شرط لذلك كما سيلي توضيحه كتحسين للبرنامج
 
#include
void DoiT (int Start , int End);
         
int main()         
{
int Start , End;
A1:
cout<<"Please input start value ?: ";
  cin>>Start;
cout<<"Please input end   value ?: ";
  cin>>End;
 
if (Start >= End) goto A1;
 
DoiT (Start , End);
}
لقد وضعت الاضافة الجديدة بخلفية حمراء للتوضيح وهي عبارة عن عنوان اختياري قبل عملية الادخال ثم بعد الادخال شرط انه اذا كانت قيمة البداية اكبر من اوتساوي قيمة النهاية فعليك بالذهاب الى العنوان المحدد A1 اي اعادة الادخال ولامانع من اضافة رسالة تحذير لتوضيح فيما اخطأ مدخل البيانات
 
الى مثالنا الاخير وهو دالة تعيد قيمة ويممر اليها بيانات
 
#include
float Mul (float A , float B);
 
int main()         
{
float A , B , R;
cout<<"Please input A ?: ";
  cin>>A;
cout<<"Please input end  B ?: ";
  cin>>B;
 
 
R = Mul (A , B);
 
cout<
 
}
 
float Mul (float A , float B)
{
return A*B;
}
الدالة الجديدة اسميناها Mul وتعيد هذه الدالة قيمة عشرية وهي حاصل ضرب قيمتين عشريتين تم تمريرها اليها وكما ترى المثال بسيط ومعظم اجزائه سبق شرحها
 
 
 
   

 

 



 
 
تعلم سي بلس بلس
الدرس الخامس
 حالات التبديل وأوامر القفز
مساء الخير
قد تحتاج في برنامجك الى قائمة (او حالة تشابه ذلك) تطلب من المستخدم ادخال رقم الاختيار او الضغط على زر معين لانجاز مهمة ومما سبق دراسته يمكن وضع عدة شروط لتنفيذ دالة معينة حسب الاختيار ولكننا سنعرض اليوم امر يقوم بتسهيل مثل هذه العمليات ولندخل في الموضوع مباشرة
#include <iostream.h>
#include
  
void Input   (void);
void Display (void);
void Modify  (void);
  
int main()
{     
  char input;
 
StartMenu;
 
cout<<"1. Enter   Data";    
cout<<"2. Display Data";    
cout<<"3. Modify  Data";    
cout<<"4. Exit";  
  cin>>input;
 
 
  switch (input)  
  {
       
      case 1: Input();    break; 
 
      case 2: Display();  break; 
 
      case 3: Modify();   break; 
 
      case 4: return 0;   break; 
 
  default:      
        cout<<"Error, bad input, quitting";
        goto StartMenu;
  }
 
  return 0;
 
}
 
void Input (void)
{
//This the input function
;
;
;
}
 
void Display (void)
{
//This the display function
;
;
;
}
void Modify (void)
{
//This the modify function
;
;
;
}
 
الاوامر ذات اللون الازرق سبق شرحها اما الاوامر والتعليمات ذات الخلفية الصفراء فهي موضوعنا اليوم – بدء البرنامج بأمر من اوامر المعالج المبدئي وذلك بضم الملف
وهو لازم للامر switch موضع دراستنا اليوم
 
تلى ذلك تعريف لمتغير input  ثم رسائل طبع على الشاشة تخبر مستخدم البرنامج بقائمة البرنامج والازرار التي ينبغي ان يضغطها لتحقيق عنصر القائمة الموجود ثم يتوقف ليطلب ادخال قيمة الاختيار ما بين الارقام من 1 الى 4 ولندخل الآن الى الامر
 
 
  switch (input)  
  {
       
 
 
    
  }
 
وتتضح صيغته كما تعودنا من الجدول التالي
 
 
الصيغة
التفسير
switch
هو الامر الذي ندرسه الان ومعناه اختبار ما بداخل القوسين
(
قوس مفتوح لاحتواء متغير
input
متغير سبق الاعلان عنه وادخل من المستخدم او تم حسابه حسب فكرة البرنامج
)
اغلاق القوس الذي يحتوي المتغير المطلوب اختباره
{
قوس بداية البلوك
هنا توضع الاوامر بالصيغة التي سيلي شرحها
}
قوس نهاية البلوك – لاتنساه من فضلك
 
 
وبداخل بلوك الامر switch  توضع الاوامر بالصيغة التاليه
 
الصيغة
التفسير
case
الامر التابع للامر الرئيسي switch
1
حالة الادخال المطلوب دراستها كأن يكون الادخال 1 أو 2 وهكذا او حسب نوع المدخل وفكرة البرنامج
:
نقطتين تلى قيمة المتغير للتنفيذ في حالة تطابقها مع الادخال او الحسابات
ضع هنا مايحلو لك من معادلات او استدعاء لدالة او اوامر حسب فكرة البرنامج وقد وضعت انا استدعاء لدالة
break;
انتهاء الاوامر ليعرف نهاية الحالة
 
تكرر الاوامر السابقة لجميع الحالات المطلوب اختيارها حتى نصل الى جزئية هامة وهي ماذا يجب على البرنامج ان ينفذ اذا كان الادخال لايتطابق مع كل الحالات السابقة فالبرنامج طلب ادخال اي رقم من 1 الى 4 فماذا لو ادخل المستخدم غير ذلك لابد ان يكون للبرنامج قرار في هذه الحالة وعليك اضافة الحالة الخاصة التالية قبل قوس اغلاق بلوك switch بالصيغة التالية
 
 
الصيغة
التفسير
default
الامر التابع للامر الرئيسي switch للحالة الخاصة بعدم تطابق الادخال مع الحالات التي سبق دراستها
:
نقطتين تلى الامر السابق
ضع هنا مايحلو لك من معادلات او استدعاء لدالة او اوامر حسب فكرة البرنامج وقد وضعت انا امر بطبع رسالة خطأ وامر آخر بالقفز لبداية البرنامج لاعادة العملية لان الادخال خطأ
break;
انتهاء الاوامر ليعرف نهاية الحالة وهو اخياري هنا لعدم وجود اوامر بعده بل يوجد قوس نهاية البلوك switch  
 
 
ملاحظة هامة:
لم نتعرض لامر القفز goto  في درس منفصل لبساطته ولكن سنشرحه هنا بسرعة هذا الامر عبارة عن الامر نفسه يليه عنوان لايهم اين يكون هذا العنوان ولكن كل مايهم عدم تكرار نفس العنوان بنفس الاسم في نفس الدالة ولامانع من تكرار او استخدام نفس الاسم ولكن في دوال اخرى حيث تعمل الدوال بصفة منفصلة وانا اخترت العنوان StartMenu
يليه نقتطين ولامانع ان تختار ما يحلو لك من اسماء شرط عدم تكرارها كما سبق وذكرنا وهذه هي صيغة كتابة الامر
 
 
 
الصيغة
التفسير
goto
امر القفز المطلوب دراسته
StartMenu
العنوان الذي اخترته
;
الفاصلة المنقوطة التي تلي جميع الاوامر
StartMenu:
العنوان ويليه نقتطين لتعريف البرنامج بأنه عنوان وهو اختياري ولايهم اين يوضع بل يوضع في اي مكان حسب فكرة البرنامج والمهم ان يكون ضمن نفس الدالة
 
ملاحظة اخرى
لو لاحظت انني وضعت العنوان StartMenu  قبل بدايه اوامر طبع القائمة ليعاد طبعها وادخال المتغيرات متى كان الادخال خطأ وبتوجيه من الامر goto ولكني وضعته بعد الامر
 
char input;
لانه اعلان ولا يهم البرنامج اعادة الاعلان بل قد يعترض الكومبايلر نفسه اذا فعلت ذلك