كتب دوارت في البرمجيات الحاسبات الغير مطورة تعتتبر تاريخ الالكترونيات
اليوم سأرفع لكم كتب تقريبا شبه منقرظة في العالم ولكن تدرس في الجامعات العراقية للبرمجات وهي لغة قديمة صحيح هي الاساس في اللغة ولكن يجب ان يكون تتطور في مجموعة البرمج نحن الان نتستخدم ويندوز 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
التي تستخدم مع لغات السي ++ والجافا ++ وغيرها
ولكي تتعلم لغة برمجة عادية يجب ان تبحث في كيفية تعلم الآتي بصرف النظر عن مواضيع الكتاب
الذي تتعلم منه وسنشرح كل جزئية وليس شرح للغة معينة وان استعنا ببعض الامثلة من لغة السي
أولا : يجب ان تعرف كيف تعلن عن المتغيرات التي سوف تستخدمها في برنامجك
ماهي المتغيرات
لابد ان يحتوي اي برنامج على متغيرات اي أوعية لوضع البيانات فيها حسب نوع البيان فالاسماء هي متغيرات حرفية والاعداد هي اما اعداد صحيحة او عشرية مثلا فمثلا بيانات موظف يقوم احد البرامج بالعمل عليها اتخيل ان تكون كما يلي
اذا لابد من التفكير في كيفية المتغيرات المناسبة لكل بيان فمثلا لو اخطأت واخترت بيان الراتب عدد صحيح فاذا كان راتبه وهو شئ متوقع 355.5 فلن يقبل لان البرنامج سوف يحوله الى عدد صحيح مقرب وهو 356 وهو ليس خطأ البرنامج وانما خطئك انت لانك اعلنت ان متغير الراتب عدد صحيح فما ذنب بائع الفاكهه اذا طلبت منه شراء تفاح وانت تقصد برتقال انما قام البائع بتنفيذ ما سمعه منك مثل هذا الخطأ يسمى خطأ منطقي لان الكومبيوتر لا يعترض عليه
الخلاصة:
في كتب اللغة التي تريد تعلمها ابحث عن اوامر الاعلان عن المتغير وسأعطيك مثال بلغة السي
بقى ان تعرف ان معظم اللغات تقدم حيز تخزين مختلف لكل نوع من البيانات وسيتضح ذلك كما يلي
متغيرات الاعداد الصحيحة
فمثلا لتحديد رقم الموظف سوف نستخدم النوع الاول اذا كان اجمالي عدد الموظفين بالشركة لا يزيد عن
32767 ولانستخدم النوع الثاني مع انه مقبول والسبب ان النوع الثاني سوف يحجز اربعة بايتات للرقم
في حين انني احتاج الى اثنين فقط مع المتغير الاول وبالتالي تتضخم ملفات البيانات بلا داعي
المثال
int SerialNo;
long SerialNo;
unsigned long SeialNo;
بالطبع مع اللغة التي سوف تستخدمها ستختلف الصيغة لكن المنطق والفكرة واحدة
متغيرات الاعداد العشرية
ملاحظة:
E38 معناها 10 اوس 38 او 10 مرفوعة الى القوة 38 ولايهمك ذلك الآن
مثال
float Salary ;
double Salary;
long double Salry;
بالطبع يمكنك استخدام المتغير الاول لتخزين راتب الموظف ولكن استخدم الثاني لتخزين اجمالي رواتب الموظفين لاعطاء حيز تخزين اكبر
مثال
float Salary;
double TotalSalaries;
عند استخدام متغير ذو سعة تخزين اقل لاستيعاب رقم او بيان اكبر من سعته فلن يعترض البرنامج ولكن سوف
تحصل على نتائج خاطئة مثلما تريد سكب برميل من الماء في كأس صغير فلن يعترض الكأس ولكن سوف يأخذ
حاجته فقط والباقي سوف ينسكب على الارض
متغيرات الحروف
بفرض انك خصصت اقصى عدد لاسم الموظف بثلاثين حرف
مثال
char HisName [30];
وينصح بعدم الاسراف في استخدام حيز تخزين اكثر مما تحتاج
ألان وقد درست هذا الموضوع جيدا واقصد انواع المتغيرات حسب اللغة التي تتعلما عليك الانتقال للموضوع
التالي
ثانيا : يجب ان تعرف ماهي الاوامر في اللغة التي تستخدم لادخال البيانات
بعد ان خصصت متغيرات لكل نوع ابحث في كتب اللغة عن اوامر ادخال كل نوع من البيانات والصيغة التي
يجب ان تكتب بها
وكمثال من لغة سي
كل لغة برمجة تعطيك اماكانات خاصة افحص كتب اللغة في هذا الموضوع وكمثال
تعطي لغة سي القياسية اوامر للتحويل مابين انواع المتغيرات وبعضها وكما ذكرنا سابقا مثلا ان الامر او الدالة 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
ثم داخل العداد طلبنا منه ادخال الموظف رقم 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)
{
توضع اوامر التحميل من القرص هنا (ليس موضوعنا في هذه المرحلة)
}
|
ان شاء الله انقل لكم بقية الدروس يوم بعد يوم
|
|
هذا الامر جديد علينا ان معناه ادخل قيمة المتغير 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
}
|
| ||||||||||
| ||||||||||
|
}
return 0;
}
السطور ذات اللون الازرق تناولنا شرحها بالدرس الاول أما السطور ذات اللون الاحمر فهي موضوع دراستنا اليوم
تقوم الحلقات التكرارية بتنفيذ عدة اوامر موضوعة داخل بلوك ونقصد ببلوك مابين القوسين } مجموعة اوامر{ الى ان تنتهي الحلقات او عدد الحلقات المحددة منك وعددها في مثالنا السابق 100 حلقة تكرارية وبدقة تبدء الحلقات من رقم صفر الى رقم 99 ومعنى ذلك ان العدد الاجمالي 100 حلقة بعد حساب الصفر من ضمن الارقام انتبه لذلك وتذكر ان المتغير x يجب الاعلان عنه قبل استخدامه وذلك حسب نوع استخدامك له وهنا استخدمنا نوعه كعدد صحيح بالطبع يمكنك استخدامه كعدد عشري واليك صيغة الامر بالتفصيل
الصيغة
|
التفسير
|
for
|
امر اللغة لعملية التكرار
|
(
|
قوس مفتوح يوضح بداخله بارامترات الامر
|
x=0;
|
المتغير = رقم بداية الحلقات
|
x<100 span="">100>
|
شرط نهاية الحلقات
|
x++
|
المتغير يزيد بمقدار واحد مع بداية كل حلقة – لاتضع بعده فاصلة منقوطة
|
)
|
قوس نهاية بارامترات الامر – لاتضع بعده فاصلة منقوطة
|
{
|
قوس بداية بلوك الاوامر المطلوب تكرارها
|
بداخل اقواس البلوك توضع الاوامر المطلوب تكرارها
| |
}
|
قوس نهاية بلوك الاوامر المطلوب تكرارها
|
بداخل بلوك الاوامر تم تنفيذ الامر
cout<
وهو امر يقوم بطبع قيمة x التي تتغير في كل مرة ابتداء من صفر حسب ماذكرت ان
X=0 وتزيد في كل مرة بمقدار 1 حسبما ذكرت ان x++ وذلك حتى يصل الى 99 حسبما ذكرت ان x<100 span="" style="mso-spacerun: yes;"> 100>
و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="">13>
{
for(y=1;y<13 font="" y="">13>
{
z = x * y;
cout<<x<<”*”<<y<<”=”<
}
}
return 0;
}
كما تعلم ان السطور الزرقاء سبق دراستها ولكن ننوه فقط اننا اعلنا عن ثلاث متغيرات لاعداد صحيحة الاول للحلقة الاولى والثاني للحلقة الثانية والثالث لاحتواء حاصل الضرب وهو الهدف من البرنامج.
بنفس ماسبق شرحه وضعنا حلقة تكرارية تبدء من رقم واحد وتنتهي برقم 12 وتزيد بمقدار واحد واوامر هذه الحلقة مكتوبة للتوضيح بخلفية صفراء حيث بدأت الحلقة بالصيغة السابق شرحها ثم قوس بداية البلوك وقوس نهاية البلوك حيث يوضع مابين القوسين سلسلة اوامر لتنفيذها كما سبق واتفقنا عليه
for(x=1;x<13 font="" x="">13>
{
اوامر مطلوب تنفيذها
}
وبداخل اقواس البلوك للحلقة الاولى مطلوب وضع اوامر للتنفيذ فكانت اوامر التنفيذ داخل البلوك عبارة عن حلقة اخرى وما المانع فالحلقات وغيرها هي نفسها اوامر والحلقه الاخرى كانت عبارة عن عداد يعد من الرقم 1 الى الرقم 12 وهي ايضا تحتاج الى صيغة معينة واقواس بلوك للتنفيذ وهي موضوعة في البرنامج بخلفية خضراء كما يلي
for(y=1;y<13 font="" y="">13>
{
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;"> 100>
{
cout<
x++;
}
return 0;
}
سوف اشرحها لك في سطور قليلة لبساطتها الاوامر باللون الازرق سبق شرحها اما الحلقة موضع النقاش فهي باللون الاحمر وصيغتها
while(x<100 span=""> 100>
وبعد الاعلان عن المتغير اكس خلاصة شرح الامر السابق (أعد تنفيذ ما بداخل البلوك طالما اكس او المتغير اقل من 100 ثم اقواس بلوك تضع ماشئت بداخله من اوامر وقوس نهاية البلوك ويزيد معنا فقط عداد للمتغير ليزيده بالمقدار الذي تريده ويوضع في اي مكان داخل الحلقة او حسب افكارك عن البرنامج المهم لاتنساه والا سوف يدور البرنامج داخل الحلقة الى الابد حيث ان شرط نهايتها ان تزيد اكس عن 100 وطالما لم تضع عداد زياده للمتغير فلن يتحقق الشرط وبالتالى لن تنتهي الحلقه الى الابد ويظل يعمل الكومبيوتر بلا نهاية للبرنامج ويميز العداد بالخلفية الصفراء واليك جدول صياغة الامر الذي تعودنا عليه.
الصيغة
|
التفسير
|
while
|
امر اللغة لعملية التكرار
|
(
|
قوس مفتوح يوضح بداخله بارامترات الامر
|
X<100 span="">100>
|
المتغير مع شرط لنهاية الحلقة
|
)
|
قوس نهاية بارامترات الامر – لاتضع بعده فاصلة منقوطة
|
{
|
قوس بداية بلوك الاوامر المطلوب تكرارها
|
بداخل اقواس البلوك توضع الاوامر المطلوب تكرارها
| |
x++;
|
ولا تنسى عداد الزياده او النقصان ليتحقق الشرط لانهاء تنفيذ الحلقة
|
}
|
قوس نهاية بلوك الاوامر المطلوب تكرارها
|
لقد ذكرت لك كلمة عداد الزيادة او النقصان نعم يمكن ان يتناقص العداد اذا كانت صيغة البرنامج كما يلي وذلك لطبع قيمة المتغير تناقصيا من 99 الى صفر بعد ان كان في البرنامج السابق تصاعديا من صفر الى 99 ويكون التعديل كما يلي
#include
int main()
{
int x=99;
while(x>0)
{
cout<
x--;
}
return 0;
}
بدء هنا تخصيص المتغير مع الاعلان بالقيمة 99 ثم شرط التكرار ان يكون متى كانت قيمة المتغير اكبر من الصفر ثم عداد تناقصي يظل يطرح واحد من القيمة الى ان يصل الى الصفر ثم يطرح من الصفر 1 فتصبح قيمته –1 وبالتالي لايتحقق الشرط حيث ان قيمة –1 ليست اكبر من الصفر وتنتهي الحلقه كما نريد لاحظ العداد التناقصي بالخلفية الصفراء
|
| |||
|
|
|
}
}
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 وتعيد هذه الدالة قيمة عشرية وهي حاصل ضرب قيمتين عشريتين تم تمريرها اليها وكما ترى المثال بسيط ومعظم اجزائه سبق شرحها
|
| |||
|
|
|
| |||
|
ليست هناك تعليقات:
إرسال تعليق