مدونة علم البرمجة والحاسوب
من حقك ان تتعلم اكثر

المصفوفات سي بلس بلس - C++ Array

لمصفوفات من الادوات الهامة في لغات البرمجة لتخزين قيم عددية او حرفية تحت نفس الاسم بمعنى آخر دعنا نرى المثال التالي لتخزين عدد
int A;
 A=5;
في هذا المثال لم نستطع ان نخزن في المتغير المعلن عنه وهو عدد صحيح سوى قيمة واحدة فقط ولو حاولت (بالطبع تتفق معي في هذا ) تخزين قيمة اخرى فسوف تلغي القيمة الاولى لتحل محلها القيمة الجديده تقوم المصفوفات بعلاج هذه المشكلة مثال لذلك.
int A[50];
اعلن عن مصفوفة اعداد صحيحة تستطيع تخزين خمسون عدد صحيح كما يلي
 A[0] = 5;
A[1] = 10;
.
A[49] = 300;
مع ملاحظة ان التعبير التالي سوف يعتبر خطأ جسيم مع لغة سي++
A[50] = 200;
رغم ان المصفوفة تتسع ل 50 رقم الا ان المصفوفة تبدء من العنصر A[0] وتنتهي بالعنصر A[49]  وبذلك يكون مجموع العناصر 50 كما طلبت شاملا الرقم صفر وفي لغة سي++ دائما نبدء العد من صفر وليس من 1
  ويمكن ان تكون المصفوفة ذات اتجاهين مثل
15 65 33 44
1  0  11 22
33 52 11 17 
18 25 14 41
  لتمثل بلغة سي ++ كما يلي
 int A[4][4];
  حيث يكون العدد 44 المظلل بالاحمر هو
A[0][0] = 44;
 
ويكون العدد 18 المظلل بالاخضر هو
A[3][3] = 18;
  وافضل طريقة لتعبئة وتخصيص قيم لمصفوفة وللتعامل مع المصفوفات بصفة عامة هي عمل looping  باستخدام for  او غيرها كما سبق ووضحنا ذلك وكمثال  لملئ المصفوفة التالية بالقيمة صفر

int A[100];
int I;
for (I = 0 ; I < 100 ; I++)
{
A[I] = 0;
}
بالطبع الدوران السابق يغير قيمة العداد من صفر الى 99 ووضعنا داخل البلوك تخصيص لعناصر المصفوفة وبدلا من وضع قيمة عددية لتشير لعنصر بالمصفوفة وضعنا رمز العداد حيث انه سوف يتغير مع الدوران الذي يحدث وبالتالي تتخصص القيم حسب الترتيب
  ولتخصيص القيم صفر مثلا لمصفوفه ذات اتجاهين
int A[10][10] , I , J;
for (I = 0 ; I < 10 ; I++)
{
for (J = 0 ; J < 10 ; J++)
{
A[I][J] = 0;
}
}
بوضع دورتين واحدة تدور على الصفوف حتى تنهيها وتعود لتغير الصف وهكذا كما سبق وتعلمت
  ولنا في المصفوفات مآرب أخرى
  لاتحتوي لغة سي ++ على تعريف ثابت وداخلي للمتغيرات الحرفية ولذلك يتم تلافي ذلك باستخدام المصفوفات ربما يعترض واحد من المتابعين لهذه الدروس بأن الامر char يقوم بذلك نعم هو كذلك ولكنه يعرف المتغير على انه حرف واحد فقط ونحن سنتحايل عليه بالمصفوفات كما يلي
char  Q;
Q = ‘A’;
عرفنا المتغير Q على انه حرف وبالتالي لانستطيع تخزين فيه سوى القيمة A  فاءذا طلبت طباعة قيمة المتغير Q سيقوم البرنامج بطبع الحرف A  فماذا لو اننا نريد تخزين عدة حروف تمثل اسم شخص اذا علينا بمصفوفة حروف كما يلي
char Q[40];
Q = “Mohamad Hasan”;
هل رأيت كيف تغلبنا على ذلك اعتمد الصيغة السابقة مؤقتا حتى الوصول لدرس يعطيك مزايا اكثر وشرح اوضح للمتغيرات الحرفية اننا لن نتأخر كثيرا عليك فهو الدرس القادم
Read On

المصفوفات سي بلس بلس - C++ Array

لمصفوفات من الادوات الهامة في لغات البرمجة لتخزين قيم عددية او حرفية تحت نفس الاسم بمعنى آخر دعنا نرى المثال التالي لتخزين عدد
int A;
 A=5;
في هذا المثال لم نستطع ان نخزن في المتغير المعلن عنه وهو عدد صحيح سوى قيمة واحدة فقط ولو حاولت (بالطبع تتفق معي في هذا ) تخزين قيمة اخرى فسوف تلغي القيمة الاولى لتحل محلها القيمة الجديده تقوم المصفوفات بعلاج هذه المشكلة مثال لذلك.
int A[50];
اعلن عن مصفوفة اعداد صحيحة تستطيع تخزين خمسون عدد صحيح كما يلي
 A[0] = 5;
A[1] = 10;
.
A[49] = 300;
مع ملاحظة ان التعبير التالي سوف يعتبر خطأ جسيم مع لغة سي++
A[50] = 200;
رغم ان المصفوفة تتسع ل 50 رقم الا ان المصفوفة تبدء من العنصر A[0] وتنتهي بالعنصر A[49]  وبذلك يكون مجموع العناصر 50 كما طلبت شاملا الرقم صفر وفي لغة سي++ دائما نبدء العد من صفر وليس من 1
  ويمكن ان تكون المصفوفة ذات اتجاهين مثل
15 65 33 44
1  0  11 22
33 52 11 17 
18 25 14 41
  لتمثل بلغة سي ++ كما يلي
 int A[4][4];
  حيث يكون العدد 44 المظلل بالاحمر هو
A[0][0] = 44;
 
ويكون العدد 18 المظلل بالاخضر هو
A[3][3] = 18;
  وافضل طريقة لتعبئة وتخصيص قيم لمصفوفة وللتعامل مع المصفوفات بصفة عامة هي عمل looping  باستخدام for  او غيرها كما سبق ووضحنا ذلك وكمثال  لملئ المصفوفة التالية بالقيمة صفر

int A[100];
int I;
for (I = 0 ; I < 100 ; I++)
{
A[I] = 0;
}
بالطبع الدوران السابق يغير قيمة العداد من صفر الى 99 ووضعنا داخل البلوك تخصيص لعناصر المصفوفة وبدلا من وضع قيمة عددية لتشير لعنصر بالمصفوفة وضعنا رمز العداد حيث انه سوف يتغير مع الدوران الذي يحدث وبالتالي تتخصص القيم حسب الترتيب
  ولتخصيص القيم صفر مثلا لمصفوفه ذات اتجاهين
int A[10][10] , I , J;
for (I = 0 ; I < 10 ; I++)
{
for (J = 0 ; J < 10 ; J++)
{
A[I][J] = 0;
}
}
بوضع دورتين واحدة تدور على الصفوف حتى تنهيها وتعود لتغير الصف وهكذا كما سبق وتعلمت
  ولنا في المصفوفات مآرب أخرى
  لاتحتوي لغة سي ++ على تعريف ثابت وداخلي للمتغيرات الحرفية ولذلك يتم تلافي ذلك باستخدام المصفوفات ربما يعترض واحد من المتابعين لهذه الدروس بأن الامر char يقوم بذلك نعم هو كذلك ولكنه يعرف المتغير على انه حرف واحد فقط ونحن سنتحايل عليه بالمصفوفات كما يلي
char  Q;
Q = ‘A’;
عرفنا المتغير Q على انه حرف وبالتالي لانستطيع تخزين فيه سوى القيمة A  فاءذا طلبت طباعة قيمة المتغير Q سيقوم البرنامج بطبع الحرف A  فماذا لو اننا نريد تخزين عدة حروف تمثل اسم شخص اذا علينا بمصفوفة حروف كما يلي
char Q[40];
Q = “Mohamad Hasan”;
هل رأيت كيف تغلبنا على ذلك اعتمد الصيغة السابقة مؤقتا حتى الوصول لدرس يعطيك مزايا اكثر وشرح اوضح للمتغيرات الحرفية اننا لن نتأخر كثيرا عليك فهو الدرس القادم
Read On

هياكل البيانات سي بلس بلس - C++ Tutorial

نتناول اليوم موضوع رائع وقوي جدا من الناحية البرمجية- لقد تعلمت فيما سبق كيف تعلن عن بيانات حسب نوعها وقد كنت تعلن عنها بصورة منفصلة الآن وبنفس الطريقه سوف نعلن عنها ولكن في صورة مجمعة لتكون هيكل للبيانات وهذا الموضوع مفيد جدا في برمجه قواعد البيانات وسترى فوائد ذلك ولو اننا لم ندرس تخزين البيانات في ملفات على الاقراص حيث سنتناول ذلك في درس قادم ولكن عند تجميع البيانات في هياكل اذا قمت بتخزين الهيكل نفسه سيتم تخزين جميع عناصره دفعة واحدة دون ان تنسى اي عنصر وبالتالي يعطيك ميزة اضافيه عما لو كنت تعلن عن البيانات في صورة منفصلة كما سترى
ومثالنا اليوم عن قاعدة البيانات الافتراضية التالية سوف ندرسها بالطريقه العاديه وبطريقة هياكل البيانات لتعرف الفرق وتفهم الموضوع وفي نفس الوقت تدرك ميزات وفوائد هياكل البيانات
لنفرض ان هناك مصنع يعمل على فترتين ولكل عامل فيه سجل بيانات بالطبع لعامل الفترة الاولى والآخر لعامل الفترة الثانية ونفترض للتبسيط ان بيانات كل عامل تحتوي على اسمه ورقمه الوظيفي وراتبه اليومي حتى انه لوتغيب احدى الفترات وضع راتب يومه بالقيمة صفر حتى يتم حساب راتبه الشهري بصورة صحيحة وسيكون الاعلان عن البيانات بالصورة التاليه لنتفق عليها وفيها فائدة تكرار اشياء سبق الاشارة اليها في دروس سابقه
الصيغة
المتغير او وعاء البيانات
char [30]
اسم الموظف افترضنا انه متغير حرفي سعته 30 حرف
int
الرقم الوظيفي للموظف وهو عدد صحيح
float
الراتب اليومي للموظف وهو عدد عشري لان الراتب من المؤكد انه سيحتوي على كسور
 دعنا الآن نعلن عن هذه البيانات بالصورة العادية لنعرف الفرق
بيانات موظف الفترة الاولى
  char [30] Name1;
int  Code1;
float Wage1;
بيانات موظف الفترة الثانية

char [30] Name2;
int  Code2;
float Wage2;
  الصورة السابقه لتمثيل بيانات البرنامج مع اثنين من الموظفين يعملون لفترتين وكلما ادخلت بيانات اسم موظف الفترة الاولى سوف تستخدم المتغير Name1 وللفترة الثانية ستستخدم المتغير Name2 فماذا لو بدلت المتغيرين بالخطأ بالطبع سيحدث خلل كبير بالبرنامج دعنا نمثل ماسبق تماما بالطريقة الجديده عن طريق استخدام هياكل البيانات
استخدام هياكل البيانات
 
struct OurDataBase
{
char [30] Name;
int  Code;
float Wage;
}L1,L2;
 انظر الى الصورة السابقه كم هي مختصرة انها رائعة وانا ارى فيها اختصار مفيد ودعنا نرى كيف نصيغ ذلك بالجدول الذي تعودنا عليه للتوضيح
الصيغة
التفسير
struct
هو الامر الذي ندرسه الان ومعناه الاعلان عن هيكل بيانات
OurDataBase
اسم الهيكل سميه كما شئت
{
قوس بداية البلوك
ضع ما يحلو لك من انواع بيانات داخل البلوك
}
قوس نهاية البلوك – لاتنساه من فضلك
L1,L2;
متغيرات اختياريه ترمز لمن سيشارك في استخدام البيانات المعلنه للهيكل
 كما رأيت بالمثال لم نستخدم متغير اسم للموظف الاول وآخر للموظف الثاني بل استخدمنا متغير واحد وسوف يتشارك اي عدد حسب تصميم الهيكل في استخدام بيانات الهيكل ولنوضح ذلك
للتعبير عن اسم الموظف الاول او موظف الفترة الاولى
L1.Name
للتعبير عن اسم الموظف الثاني او موظف الفترة الثانية
L2.Name
 للتعبير عن رقم الموظف الاول او موظف الفترة الاولى
L1.Code
  للتعبير عن رقم الموظف الثاني او موظف الفترة الثانية
L2.Code
  للتعبير عن الراتب اليومي للموظف الاول او موظف الفترة الاولى
L1.Wage
 للتعبير عن الراتب اليومي للموظف الثاني او موظف الفترة الثانية
L2.Wage
 هل رأيت كم هي بسيطة ربما احتوى هيكل البيانات على مائة متغير مثلا سوف تخزنهم وتسترجعهم بمنتهى السرعة كما سترى فيما بعد ويمكن ايصبح تدوال البيانات السابقة داخل البرنامج سواء بالادخال من مستخدم البرنامج او بالتخصيص كما يلي
L1.Name = “Mohamad Hasan”;
L1.Code = 120;
L1.Wage = 13.50;

L2.Name = “Ahamd Ali”;
L2.Code = 270;
L2.Wage = 0;
بالطبع هذه فكرة برنامج ويمكن اضافة المزيد من التحسينات من خلال تحليل البيانات فمثلا جمع المتغير L1.Wage لمدة شهر سوف يعطيك راتبه الشهر وجمع القيم التي تساوي صفر للمتغير L1.Wage لمدة شهر سوف يعطيك عدد ايام غيابه خلال الشهر وهذا يبقى دور تحليل البيانات لاستخلاص نتائج ومخرجات – المثال السابق كان لتوضيح الفكرة فقط
Read On

هياكل البيانات سي بلس بلس - C++ Tutorial

نتناول اليوم موضوع رائع وقوي جدا من الناحية البرمجية- لقد تعلمت فيما سبق كيف تعلن عن بيانات حسب نوعها وقد كنت تعلن عنها بصورة منفصلة الآن وبنفس الطريقه سوف نعلن عنها ولكن في صورة مجمعة لتكون هيكل للبيانات وهذا الموضوع مفيد جدا في برمجه قواعد البيانات وسترى فوائد ذلك ولو اننا لم ندرس تخزين البيانات في ملفات على الاقراص حيث سنتناول ذلك في درس قادم ولكن عند تجميع البيانات في هياكل اذا قمت بتخزين الهيكل نفسه سيتم تخزين جميع عناصره دفعة واحدة دون ان تنسى اي عنصر وبالتالي يعطيك ميزة اضافيه عما لو كنت تعلن عن البيانات في صورة منفصلة كما سترى
ومثالنا اليوم عن قاعدة البيانات الافتراضية التالية سوف ندرسها بالطريقه العاديه وبطريقة هياكل البيانات لتعرف الفرق وتفهم الموضوع وفي نفس الوقت تدرك ميزات وفوائد هياكل البيانات
لنفرض ان هناك مصنع يعمل على فترتين ولكل عامل فيه سجل بيانات بالطبع لعامل الفترة الاولى والآخر لعامل الفترة الثانية ونفترض للتبسيط ان بيانات كل عامل تحتوي على اسمه ورقمه الوظيفي وراتبه اليومي حتى انه لوتغيب احدى الفترات وضع راتب يومه بالقيمة صفر حتى يتم حساب راتبه الشهري بصورة صحيحة وسيكون الاعلان عن البيانات بالصورة التاليه لنتفق عليها وفيها فائدة تكرار اشياء سبق الاشارة اليها في دروس سابقه
الصيغة
المتغير او وعاء البيانات
char [30]
اسم الموظف افترضنا انه متغير حرفي سعته 30 حرف
int
الرقم الوظيفي للموظف وهو عدد صحيح
float
الراتب اليومي للموظف وهو عدد عشري لان الراتب من المؤكد انه سيحتوي على كسور
 دعنا الآن نعلن عن هذه البيانات بالصورة العادية لنعرف الفرق
بيانات موظف الفترة الاولى
  char [30] Name1;
int  Code1;
float Wage1;
بيانات موظف الفترة الثانية

char [30] Name2;
int  Code2;
float Wage2;
  الصورة السابقه لتمثيل بيانات البرنامج مع اثنين من الموظفين يعملون لفترتين وكلما ادخلت بيانات اسم موظف الفترة الاولى سوف تستخدم المتغير Name1 وللفترة الثانية ستستخدم المتغير Name2 فماذا لو بدلت المتغيرين بالخطأ بالطبع سيحدث خلل كبير بالبرنامج دعنا نمثل ماسبق تماما بالطريقة الجديده عن طريق استخدام هياكل البيانات
استخدام هياكل البيانات
 
struct OurDataBase
{
char [30] Name;
int  Code;
float Wage;
}L1,L2;
 انظر الى الصورة السابقه كم هي مختصرة انها رائعة وانا ارى فيها اختصار مفيد ودعنا نرى كيف نصيغ ذلك بالجدول الذي تعودنا عليه للتوضيح
الصيغة
التفسير
struct
هو الامر الذي ندرسه الان ومعناه الاعلان عن هيكل بيانات
OurDataBase
اسم الهيكل سميه كما شئت
{
قوس بداية البلوك
ضع ما يحلو لك من انواع بيانات داخل البلوك
}
قوس نهاية البلوك – لاتنساه من فضلك
L1,L2;
متغيرات اختياريه ترمز لمن سيشارك في استخدام البيانات المعلنه للهيكل
 كما رأيت بالمثال لم نستخدم متغير اسم للموظف الاول وآخر للموظف الثاني بل استخدمنا متغير واحد وسوف يتشارك اي عدد حسب تصميم الهيكل في استخدام بيانات الهيكل ولنوضح ذلك
للتعبير عن اسم الموظف الاول او موظف الفترة الاولى
L1.Name
للتعبير عن اسم الموظف الثاني او موظف الفترة الثانية
L2.Name
 للتعبير عن رقم الموظف الاول او موظف الفترة الاولى
L1.Code
  للتعبير عن رقم الموظف الثاني او موظف الفترة الثانية
L2.Code
  للتعبير عن الراتب اليومي للموظف الاول او موظف الفترة الاولى
L1.Wage
 للتعبير عن الراتب اليومي للموظف الثاني او موظف الفترة الثانية
L2.Wage
 هل رأيت كم هي بسيطة ربما احتوى هيكل البيانات على مائة متغير مثلا سوف تخزنهم وتسترجعهم بمنتهى السرعة كما سترى فيما بعد ويمكن ايصبح تدوال البيانات السابقة داخل البرنامج سواء بالادخال من مستخدم البرنامج او بالتخصيص كما يلي
L1.Name = “Mohamad Hasan”;
L1.Code = 120;
L1.Wage = 13.50;

L2.Name = “Ahamd Ali”;
L2.Code = 270;
L2.Wage = 0;
بالطبع هذه فكرة برنامج ويمكن اضافة المزيد من التحسينات من خلال تحليل البيانات فمثلا جمع المتغير L1.Wage لمدة شهر سوف يعطيك راتبه الشهر وجمع القيم التي تساوي صفر للمتغير L1.Wage لمدة شهر سوف يعطيك عدد ايام غيابه خلال الشهر وهذا يبقى دور تحليل البيانات لاستخلاص نتائج ومخرجات – المثال السابق كان لتوضيح الفكرة فقط
Read On

الدوال سي بلس بلس - C++ Tutorial

موضوع اليوم عن الدوال او الروتينات الفرعية وهي اجزاء من البرنامج مثل الدالة الرئيسية تقوم بعمل مهمة معينة تتكرر في برنامجك او تستخدمها في برامج اخرى او حتى اذا كانت لا تتكرر من فوائدها
·        تقسيم البرنامج الى اجزاء صغيرة تستدعى وقت اللزوم
·        عدم ازدحام الدالة الرئيسية للبرنامج بأوامر كثيرة
·        تقسيم البرنامج الى اجزاء يمكن اختبارها منفصلة لسرعة تحديد الخلل بالبرنامج
·        توفير المجهود والوقت والتفكير بعمل مكتبة خاصة بك تعيد استخدام الدوال التي استخدمتها في برنامج وذلك في برنامج آخر عند اللزوم
·        تقسيم العمل بين المبرمجين عن العمل في مشروع جماعي لانتاج برنامج كبير
·        تبادل الخبرات بين مطوري البرامج بنشر اجزاء يستخدمها الآخرون في برامجهم
لتطبيق ذلك دعنا نحضر البرنامج الذي تناولناه في الدرس الثالث لاعطائه مزيدا من القوة والتطوير باستخدام الدوال
 
#include <iostream.h>            
int main()         
 {   
  int x , y , z;       
  for(x=1;x<13;x++)
  {          
  for(y=1;y<13;y++)
  { 
     z = x * y;        
    cout<<x<<”*”<<y<<”=”<<z<<endl;     
 }
 }
 
  return 0; 
 
}
لوكنت قد تذكرت الآن فان البرنامج كان يقوم بعمل جدول الضرب من جدول واحد الى جدول 12 واحتوى كامل التعليمات داخل الدالة الرئيسية دعنا نستخدم الدوال ولنسمي هذه الدالة DoiT
 
#include <iostream.h>
void DoiT (void);
         
int main()         
{
DoiT ();
}
 
// This is the new function
void DoiT (void)
 {   
  int x , y , z;       
  for(x=1;x<13;x++)
  {          
  for(y=1;y<13;y++)
  { 
     z = x * y;        
    cout<<x<<”*”<<y<<”=”<<z<<endl;     
 }
 }
 
  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 <iostream.h>
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<<x<<”*”<<y<<”=”<<z<<endl;     
 }
 }
 
  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 <iostream.h>
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 <iostream.h>
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<<R;
 
}
 
float Mul (float A , float B)
{
return A*B;
}
الدالة الجديدة اسميناها Mul وتعيد هذه الدالة قيمة عشرية وهي حاصل ضرب قيمتين عشريتين تم تمريرها اليها وكما ترى المثال بسيط ومعظم اجزائه سبق شرحها
Read On

من انا ؟