الاثنين، 24 أغسطس 2015

الدوال Function في ++C

فوائد استخدام الدوال في البرمجة

1- تساعد الدوال المخزنة في ذاكرة الحاسب على اختصار البرنامج إذ يكتفي باستدعائها باسمها فقط لتقوم بالعمل المطلوب .
2- تساعد البرامج المخزنة في ذاكرة الحاسب أو التي يكتبها المستخدم على تلافى عمليات التكرار في خطوات البرنامج التي تتطلب عملاً مشابهاً لعمل تلك الدوال.
3- تساعد الدوال الجاهزة في تسهيل عملية البرمجة.
4-يوفر استعمال الدوال من المساحات المستخدمة في الذاكرة.
5-كتابة برنامج الـ ++C في شكل دوال واضحة المعالم يجعل البرنامج واضحاً لكل من المبرمج والقارئ على حد سواء.


مكتبة الدوال الرياضية
 ( Math Library Functions)
     تحتوى مكتبة الدوال الرياضية على العديد من الدوال التي تستخدم في تنفيذ العمليات الرياضية الحسابية. فمثلاً المبرمج الذي يرغب في حساب وطباعة الجذر التربيعي للعدد 900 قد يكتب عبارة كالتالية:

cout << sqrt ( 900);
عند تنفيذ هذه العبارة يتم استدعاء الدالة المكتبية sqrt لحساب الجذر التربيعي للعدد بين القوسين (900). يسمى العدد بين القوسين وسيطة الدالة argument وعليه فالعبارة السابقة تقوم بطباعة العدد 30 ، تأخذ الدالة sqrt وسيطة من النوع double وتكون النتيجة قيمة من نفس النوع وينطبق هذا على جميع الدوال الرياضية.
عند استعمال الدوال الرياضية في أي برنامج بلغة C++ يجب تضمين الملف math.h والذي يحتوى على هذه الدوال.

الجدول التالي يلخص بعض الدوال الرياضية:

Function

Description
Example
sqrt(x)
الجذر التربيعي لـ x
sqrt (9.0)  is 3
exp(x)
exp(1.0) is 2.718282      
ex
fabs(x)
القيمة المطلقة لـ x
if x > 0  fabs(x) = x
     = 0  fabs(x) = 0
     < 0  fabs(x) = -x
ceil(x)
تقرب x لأصغر عدد صحيح أكبر من x
ceil(9.2) is 10.0
ceil(-9.8) is 9.0
floor(x)
تقرب x لأكبر عدد صحيح أصغر من x
floor(9.2) is 9
floor(-9.8) is –10.0


الدوال المعرفة بواسطة المستخدم
 Programmer-defined Functions


الدوال تمكن المبرمج من تقسيم البرنامج إلى وحدات modules، كل دالة في البرنامج تمثل وحدة قائمة بذاتها، ولذا نجد أن المتغيرات المعرفة في الدالة تكون متغيرات محلية (Local) ونعنى بذلك أن المتغيرات تكون معروفة فقط داخل الدالة.
أغلب الدوال تمتلك لائحة من الوسائط (Parameters) والتي هي أيضاً متغيرات محلية.
هنالك عدة أسباب دعت إلى تقسيم البرنامج إلى دالات وتسمى هذه العملية
(Functionalizing a program) وهي:

1- تساعد الدوال المخزنة في ذاكرة الحاسب على اختصار البرنامج إذ يكتفي باستدعائها باسمها فقط لتقوم بالعمل المطلوب .
2- تساعد البرامج المخزنة في ذاكرة الحاسب أو التي يكتبها المستخدم على تلافى عمليات التكرار في خطوات البرنامج التي تتطلب عملاً مشابهاً لعمل تلك الدوال.
3- تساعد الدوال الجاهزة في تسهيل عملية البرمجة.
4- يوفر استعمال الدوال من المساحات المستخدمة في الذاكرة.
5-كتابة برنامج C+ + في شكل دوال واضحة المعالم يجعل البرنامج واضحاً لكل من المبرمج والقارئ على حد سواء.
كل البرامج التي رأيناها حتى الآن تحتوى على الدالة main وهي التي تنادى الدوال المكتبية لتنفيذ مهامها. سنرى الآن كيف يستطيع المبرمج بلغة الـ C++ كتابة دوال خاصة به.

نموذج الدالة
Function Prototype

عندما يولد المصرف تعليمات لاستدعاء دالة، ما فإنه يحتاج إلى معرفة اسم الدالة وعدد وسيطاتها وأنواعها ونوع قيمة الإعادة، لذا علينا كتابة نموذج أو (تصريح) للدالة قبل إجراء أي استدعاء لها وتصريح الدالة هو سطر واحد يبلغ المصرف عن اسم الدالة وعدد وسيطاتها وأنواعها ونوع القيمة المعادة بواسطة الدالة. يشبه تصريح الدالة، السطر الأول في تعريف الدالة، لكن تليه فاصلة منقوطة.
فمثلا في تصريح الدالة التالي:-

int anyfunc(int);

النوع int بين القوسين يخبر المصرف بأن الوسيط الذي سيتم تمريره إلى الدالة سيكون من النوع int و int التي تسبق اسم الدالة تشير إلى نوع القيمة المعادة بواسطة الدالة.
يأخذ تعريف الدوال في C++ الشكل العام التالي:
return-value-type  function-name (parameter list)
          {
                   declarations and statements
          }
حيث:
:return-value-type نوع القيمة المعادة بواسطة الدالة والذي يمكن أن يكون أي نوع من أنواع بيانات C++. وإذا كانت الدالة لا ترجع أي قيمة يكون نوع إعادتها void.
function-name: اسم الدالة والذي يتبع في تسميته قواعد تسمية المعرفات (identefiers).
parameter list: هي لائحة الوسيطات الممرة إلى الدالة وهي يمكن أن تكون خالية (void) أو تحتوى على وسيطة واحدة أو عدة وسائط تفصل بينها فاصلة ويجب ذكر كل وسيطة على حدة.
declarations and statements: تمثل جسم الدالة والذي يطلق عليه في بعض الأحيان block . يمكن أن يحتوى الـ block على إعلانات المتغيرات ولكن تحت أي ظرف لا يمكن أن يتم تعريف دالة داخل جسم دالة أخرى. السطر الأول في تعريف الدالة يدعى المصرح declarator والذي يحدد اسم الدالة ونوع البيانات التي تعيدها الدالة وأسماء وأنواع وسيطاتها.


إستدعاء الدالة 
Function Call

يتم استدعاء الدالة (التسبب بتنفيذها من جزء آخر من البرنامج، العبارة التي تفعل ذلك هي استدعاء الدالة) يؤدى استدعاء الدالة إلي انتقال التنفيذ إلي بداية الدالة. يمكن تمرير بعض الوسيطات إلى الدالة عند استدعائها وبعد تنفيذ الدالة يعود التنفيذ للعبارة التي تلي استدعاء الدالة.


قيم الإعادة

 Returned Values

بإمكان الدالة أن تعيد قيم إلي العبارة التي استدعتها. ويجب أن يسبق اسم الدالة في معرفها وإذا كانت الدالة لا تعيد شيئاً يجب استعمال الكلمة الأساسية void كنوع إعادة لها للإشارة إلي ذلك .
هنالك ثلاث طرق يمكن بها إرجاع التحكم إلى النقطة التي تم فيها استدعاء الدالة:
1 - إذا كانت الدالة لا ترجع قيمة يرجع التحكم تلقائياً عند الوصول إلى نهاية الدالة
2 - باستخدام العبارة return;
3 - إذا كانت الدالة ترجع قيمة فالعبارة return expression; تقوم بإرجاع قيمة التعبير expression إلى النقطة التي استدعتها .
خذ برنامجاً يستخدم دالة تدعى square لحساب مربعات الأعداد من 1 إلى 10.
مثال:
//Program :
#include<iostream.h>
int square(int);//function prototype
main()
{
          for(int x=1;x<=10;x++)
   cout<<square(x)<<" ";
   cout<<endl;
}
//now function definition
int square(int y)
{
          return y*y;
}
الخرج من البرنامج يكون كالآتي:

1      4      9      16      25      36      49      64      81      100



يتم استدعاء الدالة square داخل الدالة main وذلك بكتابة .square(x) تقوم الدالة square بنسخ قيمة x في الوسيط y . ثم تقوم بحساب y*y ويتم إرجاع النتيجة إلى الدالة main مكان استدعاء الدالة square، حيث يتم عرض النتيجة وتتكرر هذه العملية عشر مرات باستخدام حلقة التكرار for .
تعريف الدالة square( ) يدل على أنها تتوقع وسيطة من النوع int . و int التي تسبق اسم الدالة تدل على أن القيمة المعادة من الدالة square هي من النوع int أيضاً . العبارة return تقوم بإرجاع ناتج الدالة إلى الدالة main.
السطر:



int square (int)
هو نموذج أو تصريح الدالة (function prototype) .


يتبع...






الثلاثاء، 18 أغسطس 2015

تداخل الحلقات والتحكم بها ++c

تأخذ الحلقات FOR  المتداخلة الشكل العام التالي :-

for (..........)
              for (..........)
                            for (..........)                                                                                         
                                                statements;   
//Program 3-9:
// An Example of 2 nested loops
#include<iostream.h>
main( )
{
int i,j;
for (i=1 ; i<3;++i)
{ 
for (j=1 ; j<4;++j)
cout << i*j<<'  ' <<endl;
}
return 0;
}

الخرج :

1  2  3  4
2  4  6  8
     6  9  12

يمكننا وضع أي نوع من الحلقات ضمن أي نوع آخر، ويمكن مداخلة الحلقات في حلقات متداخلة في حلقات أخرى وهكذا.

التحكم بالحلقات

تعمل الحلقات عادة بشكل جيد إلا أننا في بعض الأوقات نحتاج للتحكم بعمل الحلقات ، العبارتين break و continue توفران هذه المرونة المطلوبة.
العبارة break :-
تتيح لنا العبارة break  الخروج من الحلقة في أي وقت.المثال التالي يبين لنا كيفية عمل العبارة break :

//Program :
//An Example on break as a loop exit
#include<iostream.h>
main( )
{
int isprime ,j ,n;
isprime = 1;
cin>>n;
for (j=2,j<n;++j)
{
if (n%j== 0)
{
isprime =0;
break;
}
}
}
هذا البرنامج يجعل قيمة المتغير isprime عند 1 إذا كان n  عدد أولى prime يجعل قيمته0 إذا لم يكن كذلك ( الرقم الأولي هو رقم يقبل القسمة على نفسه وعلى الرقم واحد فقط).لمعرفة ما إذا كان الرقم أولياً أم لا تتم قسمته على كل الأرقام وصولاً إلى n-1 ، إذا قبل الرقم n  القسمة على أحد هذه القيم من دون باقي فإنه لا يكون أولياً لكن إذا قبل الرقم n  القسمة على أحد هذه القيم بشكل صحيح لا داعي لإكمال الحلقة فحالما يجد البرنامج الرقم الأول الذي يقسم n  بشكل صحيح يجب أن يضبط قيمة المتغير isprime عند 0  ويخرج فوراً من الحلقة.

العبارة continue :-
تعيد العبارة continue  التنفيذ إلى أعلى الحلقة. المثال التالي يوضح كيفية عمل العبارة  continue:-

//Program :
//An Example on continue statement
#include<iostream.h>
main( )
{
int dividend , divisor;
do
//Continued
{
cout << ''Enter dividend:    '';
cin>>dividend;
cout<< ''Enter divisor:    '';
//Continued
cin>>divisor;
if( divisor == 0)
{
cout<<" divisor can't be zero\n" ;
continue;
}
cout <<"Quotient is "<< dividend/divisor;
cout<<" do another (y/n)?";
cin>>ch
}
while (ch! = 'n');
}

القسمة على 0 أمر غير مرغوب فيه لذا إذا كتب المستخدم 0 على أنه القاسم يعود التنفيذ إلى أعلى الحلقة ويطلب من البرنامج إدخال قاسم ومقسوم جديدين.

If ( divisor == 0)
{
cout << "divisor can't be zero\n”;
continue;
}
 يستمر تنفيذ الحلقة إلى أن يدخل المستخدم الحرف n .

while( ch ! ='n' ) ;


السبت، 15 أغسطس 2015

حلقة FOR


توفر ++C عدداً من أساليب التكرار (حلقات) التي تستخدم لتكرار أجزاء من البرنامج قدر ما تدعو الحاجة، لتحديد عدد مرات تكرار الحلقة تفحص كل حلقات ++C ما إذا كان تعبير ما يساوى صحيح (true) أو خطأ (false) يبلغها هذا ما إذا كان عليها التكرار مرة إضافية أخرى أو التوقف فوراً.هنالك ثلاثة أنواع من الحلقات في ++C :

حلقة FOR

عادة لا تعرف الحلقات do و while عدد مرات تكرار الحلقة. لكن في الحلقة for يكون عدد مرات تنفيذ الحلقة مذكوراً عادة في بدايتها.

     المثال التالي يقوم بطباعة قيم المتغير counter  من  1 إلى  10 .
//Program 3-5:
// using the for repetition structure
#include<iostream.h>
main( )
{
for ( int counter = 1; counter<= 10; counter++)
cout << counter <<endl ;
return 0;
}
الخرج من البرنامج

1
2
3
4
5
6
7
8
9
10
-------------------------------------------------------------------------
تحتوى الأقواس التي تلي الكلمة  الأساسية for  على ثلاثة تعابير مختلفة تفصلها فاصلة منقوطة. تعمل هذه التعابير الثلاثة في أغلب الأوقات على متغير يدعى متغير الحلقة ، وهو المتغير counter  في المثال السابق.
هذه التعابير هي:-
تعبير التمهيد، الذي يمهد قيمة متغير الحلقة عادة  int counter = 1; .
تعبير الاختبار، الذي يفحص عادة قيمة متغير الحلقة ليرى ما إذا كان يجب تكرار الحلقة مرة أخرى أو إيقافها  counter <= 10;.
تعبير التزايد، الذي يقوم عادة بزيادة (أو إنقاص) قيمة متغير الحلقة counter++ .
المثال التالي يقوم بإنقاص متغير الحلقة بـ 1 كلما تكررت الحلقة
//Program 3-6:
#include <iostream.h>
main ( )
{
for ( int j=10; j>0; -- j)
cout <<j<<'   ';
return 0;
}
ستعرض هذه الحلقة
1  2  3  4  5  6  7  8  9  10
------------------------------------------------------
ويمكن أيضاً زيادة أو إنقاص متغير الحلقة بقيمة أخرى  .
البرنامج التالي يوضح ذلك :
//Program 3-7:
#include<iostream.h>
main ( )
{

for (int j=10; j<100; j+=10)
cout <<j<<'   ';
return 0;
}
 ستعرض :-
10  20  30  40  50  60  70  80  90  100




الخميس، 13 أغسطس 2015

الحلقة DO

الحلقة do
توفر C++ عدداً من أساليب التكرار (حلقات) التي تستخدم لتكرار أجزاء من البرنامج قدر ما تدعو الحاجة، لتحديد عدد مرات تكرار الحلقة تفحص كل حلقات C++ ما إذا كان تعبير ما يساوى صحيح (true) أو خطأ (false) يبلغها هذا ما إذا كان عليها التكرار مرة إضافية أخرى أو التوقف فوراً.
هنالك ثلاثة أنواع من الحلقات في C+ +:- 
الحلقة DO
تعمل الحلقة do (غالباً تسمى (do…while… كالحلقة while، إلا أنها تفحص تعبير الاختبار بعد تنفيذ جسم الحلقة. وتستخدم أيضاً عندما نريد القيام بجزء من البرنامج  مرة واحدة على الأقل.
تبدأ الحلقة do بالكلمة الأساسية do  يليها جسم الحلقة بين أقواس حاصرة { } ثم الكلمة الأساسية while ثم تعبير اختبار بين أقواس ثم فاصلة منقوطة.
وتكون في الصورة التالية
Do statement While(condition);
مثال:-
البرنامج التالي يقوم بطباعة الأعداد من 1  إلى 10 .
//Program:
// using do repetition structure
#include<iostream.h>
 main  (  )
{ int counter = 1;
do
cout << counter <<''   '' ;
while (+ + counter <= 10);
//Continued
return 0;
               تقوم cout<< "    "; بطباعة مسافة خالية بين كل رقم والآخر وعليه الخرج من البرنامج يكون كالتالي:
1  2  3  4  5  6  7  8  9  10



مثال :دالة المضروب
//program:
#include<iostream.h>
 main  (  )
{
Int n,f=1;
Cout << "Enter a positive integer:";
Cin >>n;
Cout <<n<<"factorial is ";
Do{
F*=n;
n--;
}While (n>1)
Cout << f << endl;
}