الدوال فى لغة الــ Cنوعين :-
(1) دوال اللغة Built in Function وهى الدوال القياسية مثل دالة printf( ) أو دالة scanf( ) وهى دوال عامة يستطيع اى مبرمج استخدامها
(2) دوال المستخدم المبتكرة User Function :-
- وهى الدوال التى من وضع المبرمج
- والهدف منها : انه عند تكرار مجموعة من سطور الأوامر اكثر من مرة فى مواضع مختلفة فإن أوامر التكرار لن تكون ذات منفعة . ولذلك يتم كتابة هذه السطور منفصلة عن البرنامج الأساسى

مزايا استخدام الدوال
1- عدم تكرار التعليمات داخل البرنامج : حيث يتم إنشاء الدالة مرو واحدة ثم يتم استدعائها أكثر من مرة عند الحاجة إليها
2- باستخدام الدوال يصبح البرنامج أكثر وضوحاً
الصور العامة:
كود:
# include < filename>
function declarations;
main( )
{
 function1
 function2
}
كود:
function1 { ------ ------ }
function2 { ------ ------ }
أذن تتكون الدالة من :-
(1) الإعلان عن الدالة (2) جسم الدالة

مثال : دالة بدون دليل
كود:
#include <stdio.h>
#include<conio.h>
void line2(void);
main( )
{
clrscr( )
line2( )
printf(“ ** Allah the god of all world ** \n “);
line2( )
/* end of main( ) function */
}
void line2(void)
{
int j;
for(j=0;j<=40;j++);
printf( “ * “);
printf(“\n “);
}
فى البرنامج السابق أنشأنا دالة بالاسم line2( ) وقد ظهرت كلمة line2( ) فى ثلاث مواضع :-
الموضع الأول : يسمى الأعلان عن الدالة function declaration يكون ذلك قبل الدالة الرئيسية main( ) كما فى السطر رقـــم 3 ونلاحظ الفاصلة المنقوطة فى نهاية الجزء لأنه أعلان.
الموضع الثانى : داخل الدالة الرئيسية main( ) ويظهر فى أى مكان داخل الدالة الرئيسية ويسمى function coling أى استدعاء الدالة ويكون بالشكل line2( ) كما فى السطر 7و9 وفيه يتم كتابة اسم الدالة فقط بدون نوع وإذا كان لها معاملات نكتب المعاملات.
الموضع الثالث : يكتب بعد انتهاء الدالة الرئيسية main( ). وهذا الجزء يسمى تعريف الدالة function definition وفيه يتم كتابة محتويات الدالة . وتبدأ فى البرنامج من السطر رقم 11 باسم الدالة ثم بالقوس { وكانها برنامج ونبدأ كتابة تعليمات الدالة بعد القوس ثم ننتهى بالقوس }
** أنواع الدوال Function Type **
تمرين :
كود:
# include <stdion.h>
int sum(int a, int b )   الاعلان عن الدالة  
main( )
{
int z , x = 10 , y = 40;
z = sum(x,y);
printf(“\n\n z = %d “ , z );
}
/*  الدالة   */
int sum(int a , int b )
{
int s;
s = a + b ;
return s;
}
** ملاحظات على البرنامج **
- فى السطر رقم 2 تم الاعلان عن دالة بالاسم sum( ) وسبقت بالكلمة int وهى نوع الدوال وتقابل كلمة void مع ملاحظة وجود متغيرين بين الأقواس وهما معاملات الدالة.
- فى السطر رقم 6 يتم استدعاء الدالة وبين أقواسها المتغيرات x ,y ويستخدمان كمعاملات للدالة (لابد من كتابة معاملات الدالة لأننا أعلنا عنها بهذه الصورة )
- تشمل السطور من 9 الى 14 على جمل الدالة نفسها :-
· السطر رقم 9 نعوض عن المتغير a بالقيمة الموجودة فى المتغير x وهى القيمة 10. كذلك نعوض عن المتغير b بالقيمة الموجودة فى المتغير y وهى 40.
· السطر رقم12 نجمع محتويات كلا من المتغير a والمتغير b ونضع النتيجة فى متغير جديد هو s
· السطر رقم 13 نطلب اعادة محتويات المتغير s الى مكان استدعاء الدالة باستخدام كلمة return
· نفهم ان جملة z = sum(x,y) الموجودة بالسطر رقم 6 تعادل الجملة z = s .
ملاحظة هامة: معنى الدالة يتضح من القاعدة التى تقول أن نوع الدالة يتوقف على القيمة المرتجعة من الدالة.
فإذا كانت القيمة المرتجعة int كان نوع الدالة int
وإذا كانت القيمة المرتجعة float كان نوع الدالة float
أما الدالة التى لا تعيد قيمة(الدالة لا تشتمل على جملة return ) فتكون من نوعvoid

** استدعاء الدالة **
- يتم استدعاء الدوال اما بمعاملات او بدون معاملات
- تكون الدالة بدون معاملات مثل الدالة void line2(void) اى عدم كتابة قيم بين أقواس الدالة

* برنامج يوضح كيفية استدعاء الدالة بمعاملات *
كود:
# include < stdio.h>
# include <conio.h>
void line3(int no)
main( )
{
clrscr( )
line3(30);
printf(“ ** Allah the god of all world ** \n “);
line3(70);
}
/*   الدالة  */
void line3(int no)
{
int j , no;
for(j = 0 ; j <= no ; j++ )
printf(“ * “ );
printf(“\n”);
}
** ملاحظة : الدالة هنا لها معامل واحد من نوع صحيح وهو no. وفى كل مرة يتم ارسال قيمة مختلفة للمعامل وذلك عند استدعاء الدالة.

** استدعاء الدالة بمتغيرات **
- ممكن استدعاء الدالة بمعاملات من نوع قيم ثابتة موجودة بالبرنامج نفسه
- وأيضا يمكن ان تكون هذه المعاملات متغيرات تستقبل قيمها من المستخدم او من داخل البرنامج وهذا يفيد فى حالة تغير واختلاف المتغيرات فى كل مرة ( إعطاء مرونة فى التعامل مع البرنامج )

* برنامج لتحديد الكمية الأكبر من ثلاث كميات صحيحة
كود:
# include <stdio.h>
/* determine the largest of three integer quantities */
main( )
{
int a, b, c, d;
/* read the integer quantities */
printf(“\n a = “);
scanf( % d “ , &a );
printf(“\n b = “);
scanf( % d “ , &b );
printf(“\n c = “);
scanf( % d “ , &c );
/* calculate and display the maximum value */
d = maximum( a, b );
printf(“\n \n maximum = % d , maximum(c ,d ));
}
/* determine the larger of two integer quatities */
maximum(x ,y )
int x ,y;
{
int z;
z = (x >= y ) ? x | y;
return(z);
}
ملاحظة هامة : من ضمن أوامر التحكم ( علامة الاستفهام الشرطية ?| ) حيث :-
- (x > = y ) عبارةtest اختبار
- ؟ عبارة عن سؤال if
- | عبارة عن Else
بمعنى إذا كان الاختبار (x >= y ) صحيحا يأخذ القيمة x وإذا كانت القيمة غير صحيحة يأخذ القيمة y