1. تقسيم المشروع
1.1 الدالة main
حتى الآن كل مشاريعنا تم إنجازها داخل الدالة الأساسية ()main . وكما رأيت أنه عند إنجازنا لمشاريع معقدة يصعب علينا تحليلها فيما بعد (أي عند رجوعنا إليها)، كما أننا نحتاج في بعض الأحيان لتكرار أوامر معينة حسب الطلب داخل المشروع، ومن تم فإن المشروع يصبح أطول وأعقد.
1.2 مثال 1 لتقسيم المشروع
نريد إنجاز مشروع يقوم بإظهار مربع متكون من النجوم '*'، حيث نستعمل دالة نسميها rectangle وهي بذاتها تستعمل دالة أخرى نسميها ligne.
![]() |
#include <stdio.h> main() |
والدالة rectangle تتكون من :
void RECTANGLE(int L, int H) |
والدالة ligne تتكون من :
void LIGNE(int L) |
خطاطيا، يكون المشروع كالتالي:
1.3 مثال 2 لتقسيم المشروع
لتكن الدالة F المعرفة كالتالي :F(X) = X3-2X+1 ، نريد إنشاء جدول لقيم الدالة F. العدد N الذي يمثل عدد القيم يجب إدخاله من لوحة المفاتيح من طرف المستعمل.
مثال للتنفيذ:
Write an integer between 1 and 100 : 9
Write 9 real nombers : -4 -3 -2 -1 0 1 2 3 4
X -4.0 -3.0 -2.0 -1.0 0.0 1.0 2.0 3.0 4.0
F(X) -55.0 -20.0 -3.0 2.0 1.0 0.0 5.0 22.0 57.0
|
نقوم بإنشاء مشروع مقسم بدوال مطلوب إنشاءها :
#include <stdio.h>
|
خطاطيا :
2. كيف نعرف الدوال وأين نضعها
2.1 كيف نعرف الدوال
الشكل العام للدالة في C على الشكل التالي :
<type> name_function(type1 var1,type2 var2,...) |
ملاحظة :
- قد لا يوجد أي نوع (أي <type>) للدالة ، في هذه الحالة نكتب : (... void name_function(type1
- قد لا تستعمل الدالة أي متغير ، في هذه الحالة نكتب : ( <type> name_function(void
- قد تكون الحالتين السابقتين معا ، في هذه الحالة نكتب: void name_function(void)
- void تعني فارغ أو لا شيء.
2.2 أين نضع الدوال
إما قبل الدالة الرئيسية main : في هذه الحالة نستدعي مباشرة الدالة التي نريدها دون أن نقوم بتعريفها.
#include.... |
أو بعد الدالة الرئيسية main : في هذه الحالة نعرف الدوال للدالة main ثم نستدعيها متى نشاء.
#include.... main() |
2.3 أنواع الدوال
تنقسم الدوال إلى نوعين محددين :
دوال رجعية : وهي الدوال الرياضية حيث تعتبر كقيمة نستخدمها في مشروعنا لأنها تقبل نتيجة عند استدعائها (تتميز بكلمة return يعني أن هناك قيمة للرجوع).
دوال لارجعية : وهي دوال تقوم بتطبيق أمر معين دون أن تكون لها نتيجة، أي أننا لا نستخدمها كقيمة معينة (تتميز بكلمة void يعني أن الرجوع يكون لا شيء).
3.2.1 الدوال الرجعية
مثال : أنجز مشروعا يقوم بحساب مجموع عددين
الحل : بدون استعمال الدوال
#include<stdio.h> main() |
الحل : باستعمال الدوال
#include<stdio.h> int sum(int x,int y) main() |
أمثلة أخر للدوال الرجعية:
float PI(void) /*float PI() يمكن أن نكتب أيضا*/
|
3.2.2 الدوال اللارجعية
مثال : نأخذ نفس المثال السابق لكن نضيف دالة تقوم بإظهار قيمة معينة فقط.
#include<stdio.h> int somme(int x,int y) void affiche(int x) main() |
3.2.3 مثال عام
تحديد أكبر عدد
#include <stdio.h>
|
3. معايير الدوال
معايير الدالة هي عموما المتغيرات المحلية للدالة
3.1 المرور باستعمال القيمة
هذه الطريقة هي التي تعتبر عادية وتتمثل في إعطاء الدالة متغيرات تقوم بمعالجة قيمها.
أمثلة :
void ETOILES(int N) /*N نعطي لهذه الدلة قيمة يأخذها */
|
تذكر هذه الفقرة جيدا فهي مهمة أكثر من اللازم!!!!!!!!!!!
3.2 المرور باستعمال عنوان المتغير
خير مثال لشرح المرور باستعمال عنوان المتغير هي الدالة التي تقوم بإبدال قيمتي متغيرين.
مثال : قم بإنجاز مشروع يقوم بإبدال قيمتي متغيرين.
3.2.1 الحل 1 : بدون استعمال الدوال
#include <stdio.h> |
3.2.2 الحل 2 : باستعمال الدوال "المرور باستعمال القيم"
#include <stdio.h> void PERMUTER (int A, int B) main() |
في الحقيقة إن استعمالنا للحل 2 لن يقوم أبدا بتبديل قيمتي المتغيرين a و b لأنه سيكون لدينا" مرور باستعمال قيم المتغيرات" فقط.
والحل الأنجع لمثل هاته المسائل هو"استعمال المرور عن طريق عنوان المتغيرات" أي يجب علينا أن نستعمل المؤشرات في هذه الحالة.
وبالتالي يصبح المشروع كالتالي:
#include <stdio.h>
|
نستدعي الدالة في هذه الحالة :PERMUTER(&a,&b); عوض PERMUTER(a,b);
تذكر : أن هذا العمل تقوم به الدالة scanf
تذكر هذه الفقرة جيدا فهي مهمة أكثر من اللازم!!!!!!!!!!!
3.4 المرور باستعمال عنوان الجدول
وأيضا بالنسبة للجداول عوض أن نمر بـ <type> <tab>[] نستعمل <type> *<tab>
مثال 1 : حساب طول متسلسلة
int strlen(char *S) ...../* استدعاء الدالة*/
|
مثال 2 : ملء جدول من خلال استدعاء دالة
void LIRE_TAB(int N, int *PTAB) LIRE_TAB(4, T); |
3.5 المرور باستعمال عنوان المصفوفة
لنقم بإنشاء دالة تقوم بجمع عناصر مصفوفة.
(راجع كيف نحصل على عنوان المصفوفة في فقرة المؤشرات)
#include <stdio.h>
|
4. المتغيرات العامة والمحلية
4.1 المتغيرات العامة
وهي التي يتم تعريفها مباشرة بعد استدعاء المكتبات، وتكون معرفة لدى جميع الدوال والدالة الرئيسية main
تمارين تطبيقية
المرور باستعمال القيم
التمرين 10.2
قم بترجمة الخوارزم التالي إلى اللغة C:
المشروع صحيح A ،B 0 = A 0 = B P(A,B) اكتب A،B نهاية_المشروع الدالة اللارجعية P(Xصحيح ,Yصحيح ) 1+X = X 1+Y = Y اكتب Y،X نهاية_الدالة |
التمرين 10.3
قم بترجمة الخوارزم التالي إلى اللغة C:
المشروع
الدالة اللارجعيةMACHIN(Xصحيح ) |
التمرين 10.4
قم بترجمة الخوارزم التالي إلى اللغة C:
المشروع صحيح A ,B,C 2 = A -8 = B 12 = C اكتب A,B,C MODIFIER(A,B,C) اكتب A,B,C نهاية_المشروع الدالة اللارجعيةMODIFIER(Xصحيح ,Yصحيح ,Zصحيح ) صحيح T X = T Y = X Z = Y T = Z نهاية_الدالة |
التمرين 10.5
قم بترجمة الخوارزم التالي إلى اللغة C:
المشروع الدالة اللارجعيةMANIPULER(Xصحيح ,Yصحيح ,Zصحيح ) |
الأنواع البسيطة
التمرين 10.6
أنجز دالة MOYENNE من النوع float تقوم بإظهار متوسط عددين حقيقيين مطلوب إدخالهما من طرف المستعمل.
التمرين 10.7
أنجز دالتين لحساب القيمة XN حيث X من النوع double و N من النوع int :
أ) الدالة EXP1 تكون نتيجتها هي القيمة XN
ب) الدالة EXP2 تقوم بإعطاء القيمة XN إلى X
أنجز مشروعا لتجربة عمل الدالتين.
التمرين 10.8
أنجز دالة MAX ودالة MIN تقومان بتحديد القيمة القصوية والدنوية لعددين حقيقيين مطلوب إدخالهما من طرف المستعمل.
أنجز مشروعا لتجربة عمل الدالتين.
التمرين 10.9
أنجز مشروعا يحتوي على الدالة F من أجل إظهار جدول قيم الدالة المعرفة كالتالي:
f(x) = sin(x) + ln(x) - ![]() |
بحيث x بين 1 و 10.
التمرين 10.10
أنجز دالة NCHIFFRES من نوع int تقوم بأخذ القيمة الصحيحة N (موجبة أو سالبة) من النوع long ، وتكون نتيجتها هي عدد الأرقام المكونة للعدد N.
أنجز مشروعا يقوم بتجربة هذه الدالة.
مثال:
Integer Number : 6457392
التمرين 10.11
في الرياضيات، نعرف عامل عدد كالتالي :
0! = 1 n! = n*(n-1)*(n-2)* ... * 1 (pour n>0) |
أنجز دالة FACT من نوع double تقوم بأخذ القيمة الصحيحة N من النوع int، وتكون نتيجتها هي عامل N.
أنجز مشروعا يقوم تجريب هذه الدالة.
التمرين 10.12
أنجز مشروعا يقوم بإنشاء وإظهار مثلث الخوارزمي :
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 . . .
لا تقم باستعمال الجدول : لكن استعمل العلاقة التالية :
الجداول أحادية البعد
التمرين 10.13
أنشئ الدالة LIRE_TAB لها 3 معايير أو مداخيل TAB وN و NMAX تقوم بقراءة البعد أو الرتبة N وكذلك عناصر جدول نسميه TAB من النوع int . الرتبة N يجب أن تكون أصغر من NMAX . (يجب أن تقوم أنت بتحديد نوع المداخيل)
مثال :
لاستدعاء الدالة نكتب: LIRE_TAB(T, &N, 10);
تقوم هذه الدالة بإظهار ما يلي ولقراءة الأعداد من لوحة المفاتيح :
Dimension of array (max.10): 11
التمرين 10.14
أنشئ الدالة ECRIRE_TAB لها معيارين أو مدخلين TAB وN تقوم بإظهار عناصر الجدول TAB ذي النوع int.
مثال :
لاستدعاء الدالة نكتب: ECRIRE_TAB(T, N);
تقوم هذه الدالة بإظهار ما يلي :
43 55 67 79
التمرين 10.15
أنشئ الدالة SOMME_TAB التي تقوم بحساب مجموع عناصر الجدول TAB ذي النوع int والرتبة N، معياري أو مداخيل الدالة هما N و TAB. هذه الدالة رجعية حيث تكون نتيجتها هي حاصل المجموع من النوع long.
التمرين 10.16
باستعمال دالة التمرين السابق، أنجز مشروعا يمكن من قراءة عناصر جدول A ذي الرتبة أصغر من أو تساوي 100 ، أظهر الجدول ومجموع عناصره، وكل ذلك باستعمال الدوال.
تريب عناصر الجدول
التمرين 10.17
أعد كتابة الدالة TRI_SHELL المكتوبة بالخوارزم باللغة C . استعمل الدالة PERMUTER المعرفة في الدرس.
الدالة_اللارجعية TRI_SHELL(T جدول,N صحيح) |
التمرين 10.18
حدد القيمة القصوى من بين عناصر جدول TAB ذي الرتبة N من أوجه ثلاثة :
-
الدالة MAX1 ترجع القيمة القصوى.
-
الدالة MAX2 ترجع موقع القيمة القصوى في الجدول.
-
الدالة MAX3 ترجع عنوان القيمة القصوى.
أنجز شفرة تقوم بتجربة عمل هذه الدوال.
التمرين 10.19
أنجز الدالة TRI_SELECTION التي تقوم بترتيب جدول (انظر التمرين 7.14)، استعمل الدالة PERMUTER التي تقوم بإبدال قيمتي متغيرين. أنجز شفرة تقوم بتجربة عمل هذه الدالة.
التمرين 10.20
أنجز الدالة INSERER لترتيب جدول ، حيث تقوم بوضع قيمة X في داخل الجدول الذي يحتوي على N عنصر مرتب تزايديا، فنحصل في النهاية على جدول مرتب تزايديا ذي الرتبة N+1 . رتبة الجدول تتزايد عند إدخال كل قيمة جديدة في الدالة INSERER. أنجز شفرة تقوم بتجربة عمل هذه الدالة.
التمرين 10.21
أنجز الدالة TRI_INSERTION التي تستعمل الدالة INSERER لترتيب جدول تزايديا. أنجز شفرة تقوم بتجربة عمل هذه الدالة.
الطريقة :
![]() |
التمرين 10.22
أنجز الدالة RANGER التي تقوم بترتيب قيمتين X و Y بحيث تكون X أصغر من Y حيث(X و Y معيارين للدالة RANGER).
الدالة RANGER تكون نتيجتها القيمة 1 إذا تم الإبدال أو 0 إذا كان عكس ذلك.
التمرين 10.23
أنجز الدالة TRI_BULLE التي تقوم بترتيب جدول (انظر التمرين 7.15)، وتستعمل الدالة RANGER للمساعدة.
أنجز شفرة تقوم بتجربة عمل هذه الدالة.
التمرين 10.24
أنجز الدالة FUSION التي تقوم بإنشاء جدول FUS مرتب تزايديا الذي يوحد جدولين A و B مرتبين تزايديا ذي الرتبتين N و M فتصبح رتبته هي N+M (انظر التمرين 7.13).
استعن بالدالة TRI_BULLE المعرفة في التمرين السابق.
-
المتسلسلات الحرفية
التمرين 10.25
أنجز الدالة LONG_CH التي ترجع بطول متسلسلة. لا تستعمل داخلها أي متغير للمساعدة.
التمرين 10.26
أنجز الدالة MAJ_CH التي تحول جميع حروف متسلسلة إلى حروف صغيرة. لا تستعمل داخلها أي متغير للمساعدة.
التمرين 10.27
أنجز الدالة AJOUTE_CH (ذات المدخلين أو المعيارين CH1 و CH2) حيث تقوم بإضافة المتسلسلة CH2 في نهاية المتسلسلة CH1. لا تستعمل داخلها أي متغير للمساعدة.
التمرين 10.28
أنجز الدالة INVERSER_CH تقوم بعكس حروف متسلسلة CH. استعمل الدالة LONG_CH (انظر أعلاه) وكذلك دالة PERMUTER_CH التي تقوم بإبدال متغيرين من نوع char.
التمرين 10.29
التمرين 10.30
أنجز دالة MOT_CH ترجع عنوان (المؤشر) كلمة مطلوب البحث عنها داخل جملة إذا كانت موجودة، وإلا فسيكون الرجوع هو رمز نهاية الجملة '0\'.
التمرين 10.31
أنجز دالة EGAL_N_CH تقوم بمقارنة متسلسلتين CH1 و CH2 حيث تكون نتيجتها : 1 إذا كان التساوي و 0 إذا كان عكس ذلك.
(إذا كانت إحداهما أطول من الأخرى تكون النتيجة إما 0 أو 1 ).
التمرين 10.32
أنجز دالة CHERCHE_CH ترجع عنوان (المؤشر) CH1 داخل CH2، (بمساعدة الدالتين EGAL_N_CH و LONG_CH) وإلا فسيكون الرجوع هو رمز نهاية الجملة '0\'.
التمرين 10.33
أنجز دالة CH_ENTIER ترجع القيمة العددية من النوع long لمتسلسلة حرفية تحتوي على أرقام (موجبة أو سالبة ). إذا كانت المتسلسلة لا تحتوي على أرقام، تتوقف الدالة في هذه الحالة عن التحويل.
التمرين 10.34
أنجز دالة CH_DOUBLE ترجع القيمة العددية من النوع double لمتسلسلة حرفية تحتوي على أرقام (موجبة أو سالبة ). إذا كانت المتسلسلة لا تحتوي على أرقام، تتوقف الدالة في هذه الحالة عن التحويل (انظر الطريقة في التمرين 8.18).
التمرين 10.35
أنجز دالة ENTIER_CH تحول قيمة صحيحة من النوع long إلى متسلسلة CH (عكس التمرين 10.33). (استعمل الدالة INVERSER_CH المعرفة أعلاه للمساعدة).
التمرين 10.36
أنجز دالة DOUBLE_CH تحول قيمة صحيحة من النوع double إلى متسلسلة CH (عكس التمرين 10.34). يتوقف التحويل عند الرقم الرابع بعد الفاصلة.
طريقة : اضرب N في 104 واستعمل الدالة ENTIER_CH.
-
المصفوفات
التمرين 10.37
-
أنجز دالة LIRE_DIM ذات 4 مداخيل أو معايير L و LMAX و C و CMAX التي تقوم بقراءة الرتبتين L و C لمصفوفة. الرتبتين L و C يجب أن تكونا أصغر من LMAX و CMAX على التوالي.
-
أنجز دالة LIRE_MATRICE ذات 4 مداخيل أو معايير MAT و L وC و CMAX التي تقوم بقراءة عناصر المصفوفة MAT ذات النوع int و الرتبتين L و C.
(قم باختيار أنواع المتغيرات المناسبة).
التمرين 10.38
أنجز دالة ECRIRE_MATRICE ذات 4 مداخيل أو معايير MAT و L وC و CMAX التي تقوم بإظهار عناصر المصفوفة MAT.
التمرين 10.39
أنجز دالة SOMME_MATRICE ذاتالنوع long التي تمكن من حساب عناصر مصفوفة MAT.
(قم باختيار أنواع المتغيرات المناسبة).
التمرين 10.40
أنجز دالة ADDITION_MATRICE التي تمكن من حساب مصفوفتين MAT1 و MAT2 .
(قم باختيار أنواع المتغيرات المناسبة).
MAT1 = MAT1 + MAT2
التمرين 10.41
أنجز دالة MULTI_MATRICE التي تمكن من ضرب عدد X في مصفوفة MAT1.
(قم باختيار أنواع المتغيرات المناسبة).
MAT1 = X * MAT1
التمرين 10.42
أنجز دالة TRANSPO_MATRICE ذات 5 مداخيل أو معايير MAT و L وC و CMAX و LMAX التي تقوم بحساب مقلوب المصفوفة MAT باستعمال الدالة PERMUTER. نتيجة الدالة TRANSPO_MATRICE هي متغير منطقي الذي يرمز إذا ما كان رتبتي المصفوفة يساويان رتبتي المصفوفة المقلوبة (عدد الأسطر وعدد الأعمدة).
أنجز مشروعا يقوم بتجريب هذه الدالة.
التمرين 10.43
أنجز دالة MULTI_2_MATRICES التي تمكن من ضرب المصفوفة MAT1 ذات الرتبتين N و M في المصفوفة MAT2 ذات الرتبتين M و P .وتكون النتيجة في مصفوفة ثالثة ذات الرتبتين N و P.
(قم باختيار أنواع المتغيرات المناسبة).
MAT1 = MAT1 + MAT2
أنجز مشروعا يقوم بتجريب هذه الدالة.
تأليف
المؤلف الأصلي: فرديريك فابر (Frédéric FABER)
البريد الإلكتروني: عنوان البريد الإلكتروني هذا محمي من روبوتات السبام. يجب عليك تفعيل الجافاسكربت لرؤيته.
الموقع الإلكتروني: http://www.ltam.lu/cours-c
ترجمة بتصرف: محمد عبد الرحمان
التعليقات
احييك اخي على اتقانك بايصال المعلومه والترجمه
فشهادة حق تستحقها هذا الشرح من افضل واروع مارايت امل منك فضلا لاامرا اذا كان لديك ملف دروس سي الموضوع هنا كاملا التكرم بارساله الى بريدي الموجود مع جزيل الشكر لما تبذله