أنت هنا:برمجها»اللغة س»الدرس 10: الدوال
الدرس 10: الدوال الدرس 10: الدوال
قيم الموضوع
(1 تصويت)

تعتبر الدوال بالنسبة لأي مبرمج أداة لتسهيل عمل المشروع لكونها تقوم بتقسيم أجزاءه بشكل مفهوم وواضح... والدوال كما هو معتاد هي الدوال الرياضية، لذا فهي ليست غريبة عن أحد.. كما أننا استعملنا في الفقرات السابقة دوال معرفة سابقا كـ printf و scanf و .... في هذه الفقرة سنتعرف كيف سننشأ دوالا خاصة بنا...


1. تقسيم المشروع


1.1 الدالة
main

حتى الآن كل مشاريعنا تم إنجازها داخل الدالة الأساسية ()main . وكما رأيت أنه عند إنجازنا لمشاريع معقدة يصعب علينا تحليلها فيما بعد (أي عند رجوعنا إليها)، كما أننا نحتاج في بعض الأحيان لتكرار أوامر معينة حسب الطلب داخل المشروع، ومن تم فإن المشروع يصبح أطول وأعقد.


1.2 مثال 1 لتقسيم المشروع

نريد إنجاز مشروع يقوم بإظهار مربع متكون من النجوم '*'، حيث نستعمل دالة نسميها rectangle وهي بذاتها تستعمل دالة أخرى نسميها ligne.

 

#include <stdio.h>

main()
{ /* نعرف الدالة التي سننشئها */
 void RECTANGLE(int L, int H); /* تعريف المتغيرات المحلية المتعلقة بالدالة main */
 int L, H; /* معالجة */
 printf("Write the length (>= 1): ");
 scanf("%d", &L);
 printf("Write the hight (>= 1): ");
 scanf("%d", &H); /* إظهار مربع متكون من النجوم*/
 RECTANGLE(L,H);
return 0;
}

والدالة rectangle  تتكون من :

void RECTANGLE(int L, int H)
{/* تعريف الدالة التي سنستدعيها */
 void LIGNE(int L);/*RECTANGLE تعريف المتغيرات المحلية المتعلقة بالدالة */
 int I;/* إظهار سطرا من النجوم */
 for (I=0; I<H; I++)
   LIGNE(L);
}

والدالة ligne  تتكون من :

void LIGNE(int L)
{
 int I; /* تعريف المتغيرات المحلية *//* معالجة */
 for (I=0; I<L; I++)
  printf("*");
 printf("\n");
}

خطاطيا، يكون المشروع كالتالي:

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>

main()
{/* نعرف الدالة التي سنستخدمها */
void ACQUERIR(int *N); /*main تعريف المتغيرات المحلية المتعلقة بالدالة */
void LIRE_VECTEUR(float T[], int N);
void CALCULER_VALEURS(float X[], float V[], int N);
void AFFICHER_TABLE(float X[], float V[], int N);
float X[100]; /* X قيم */
float V[100]; /* F(X)قيم */
int N;/* معالجة */
ACQUERIR(&N); /* 1 <= N <= 100 */
LIRE_VECTEUR(X, N);
CALCULER_VALEURS(X, V, N);
AFFICHER_TABLE(X, V, N);
return 0;
}

void ACQUERIR(int *N)
{
 do
 {
  printf("Write an integer between 1 and 100 : ");
  scanf("%d", N);
 }
 while (*N<1 || *N>100);
}


void LIRE_VECTEUR(float T[], int N)
{
 int I;
 printf("Write %d real numbers :\n", N);
 for (I=0; I<N; I++)
 scanf("%f", &T[I]);
}

void CALCULER_VALEURS(float X[], float V[], int N)
{
 float F(float X);
 int I;
 for (I=0; I<N; I++)
  V[I] = F(X[I]);
}


float F(float X)
{/* F(X) = X^3-2X+1 هذه الدالة تقوم بحساب ثم إرجاع القيمة*/
 return (X*X*X - 2*X + 1);
}

void AFFICHER_TABLE(float X[], float V[], int N)
{
 int I;
 printf("\n X : ");
 for (I=0; I<N; I++) printf("%.1f", X[I]);
 printf("\n F(X): ");
 for (I=0; I<N; I++) printf("%.1f", V[I]);
 printf("\n");
}

خطاطيا :


2. كيف نعرف الدوال وأين نضعها

2.1 كيف نعرف الدوال

الشكل العام للدالة في C على الشكل التالي :

<type> name_function(type1 var1,type2 var2,...)
/*المتغيرات المحلية*/
   .....
}

ملاحظة :

  1. قد لا يوجد أي نوع (أي <type>) للدالة ، في هذه الحالة نكتب : (... void name_function(type1
  2. قد لا تستعمل الدالة أي متغير ، في هذه الحالة نكتب :                 ( <type> name_function(void
  3. قد تكون الحالتين السابقتين معا ، في هذه الحالة نكتب:                void  name_function(void)
  4. void تعني فارغ أو لا شيء.

 

2.2 أين نضع الدوال

إما قبل الدالة الرئيسية main : في هذه الحالة نستدعي مباشرة الدالة التي نريدها دون أن نقوم بتعريفها.

#include....

<type> name_function(type1 var1,type2 var2,...)
/*المتغيرات المحلية*/
   .....
}

main()
/*المتغيرات المحلية*/
   name_function(var1,var2,...);
}

أو بعد الدالة الرئيسية main : في هذه الحالة نعرف الدوال للدالة main ثم نستدعيها متى نشاء.

#include....

main()
/*المتغيرات المحلية*/
<type> name_function(type1 var1,type2 var2,...);

   name_function(var1,var2,...);
}

<type> name_function(type1 var1,type2 var2,...)
/*المتغيرات المحلية*/
   .....
}

2.3 أنواع الدوال

تنقسم الدوال إلى نوعين محددين :

دوال رجعية : وهي الدوال الرياضية حيث تعتبر كقيمة نستخدمها في مشروعنا لأنها تقبل نتيجة عند استدعائها  (تتميز بكلمة return يعني أن هناك قيمة للرجوع).

دوال لارجعية : وهي دوال تقوم بتطبيق أمر معين دون أن تكون لها نتيجة، أي أننا لا نستخدمها كقيمة معينة (تتميز بكلمة void يعني أن الرجوع يكون لا شيء).

 

3.2.1 الدوال الرجعية

مثال : أنجز مشروعا يقوم بحساب مجموع عددين

الحل : بدون استعمال الدوال

#include<stdio.h>

main()
{
   int a,b,c;
   printf("a = ");scanf("%d",&a);
   printf("b = ");scanf("%d",&b);
   c=a+b;
   printf("a + b ",c);

   return 0;
}

الحل : باستعمال الدوال

#include<stdio.h>

int sum(int x,int y)
{/* بعد أن تأخذ x قيمة a و y قيمة b نحسب x+y ثم نرجعها كنتيجة إلى هذه الدالة*/
  return (x+y);
 }

main()
{  int a,b,c;
   printf("a = ");scanf("%d",&a);
   printf("b = ");scanf("%d",&b);
   c=sum(a,b);
   printf("a + b ",c);
   return 0;
}

أمثلة أخر للدوال الرجعية:

float PI(void) /*float PI() يمكن أن نكتب أيضا*/
{
  return 3.1415927;
}


int MAX(int N1, int N2) /*لتحديد القيمة القصوية*/
{
 if (N1>N2)  return N1;
 else           return N2;
}


double CARRE(double X) /*x حساب مربع */
{
  return X*X;
}


double TAN(double X)
{
  if (cos(X) != 0)  return sin(X)/cos(X);
 else                  printf("Error !\n");
}

3.2.2 الدوال اللارجعية

مثال : نأخذ نفس المثال السابق لكن نضيف دالة تقوم بإظهار قيمة معينة فقط.

#include<stdio.h>

int somme(int x,int y)
{ /* بعد أن تأخذ x قيمة a و y قيمة b نحسب x+y ثم نرجعها كنتيجة إلى هذه الدالة*/
  return (x+y);
 }

void affiche(int x)
{
 printf("a + b ",x);
 }

main()
{  int a,b,c;
   printf("a = "); scanf("%d",&a);
   printf("b = "); scanf("%d",&b);
   c=somme(a,b);
   affiche(c);
   return 0;
}

3.2.3 مثال عام

تحديد أكبر عدد

#include <stdio.h>

main()
{/* نعرف الدوال التي سنستعملها */
 int ENTREE(void);
 int MAX(int N1, int N2);
 void affiche(int x); /* تعريف المتغيرات الخاصة بالدالة main */
 int A, B;/* استعمال الدوال */
 A = ENTREE();
 B = ENTREE();
 affiche(MAX(A,B));
 return 0;
}


/* ENTREE تعريف الدالة*/
int ENTREE(void)
{
 int NOMBRE;
 printf("Write an integer number : ");
 scanf("%d", &NOMBRE);
 return NOMBRE;
}


/* MAX تعريف الدالة*/
int MAX(int N1, int N2)
{
 if (N1>N2) return N1;
 else return N2;
}


/* affiche تعريف الدالة*/
void affiche(int x)
{
 printf("Maximum = %d\n", x);
}


3. معايير الدوال

 

معايير الدالة هي عموما المتغيرات المحلية للدالة

3.1 المرور باستعمال القيمة

هذه الطريقة هي التي تعتبر عادية وتتمثل في إعطاء الدالة متغيرات تقوم بمعالجة قيمها.

أمثلة :

void ETOILES(int N) /*N نعطي لهذه الدلة قيمة يأخذها */
{
  while (N>0)
  {
   printf("*");
   N--;
   }
  printf("\n");
}


void TRIANGLE(void)
{
  int L;/*تعتبر قيمة محلية تقوم من خلالها هذه الدالة بمعالجة معينة L*/
  for (L=1; L<10; L++)
    ETOILES(L);
}


تذكر هذه الفقرة جيدا فهي مهمة أكثر من اللازم!!!!!!!!!!!

3.2 المرور باستعمال عنوان المتغير

خير مثال لشرح المرور باستعمال عنوان المتغير هي الدالة التي تقوم بإبدال قيمتي متغيرين.

مثال : قم بإنجاز مشروع يقوم بإبدال قيمتي متغيرين.

3.2.1  الحل 1 : بدون استعمال الدوال

#include <stdio.h>
main()
{
 int a=2,b=3,c;
 printf("a = %d b = %d\n",a,b); 
 c=a;
 a=b;
 b=c;
 printf("a = %d b = %d\n",a,b); 
 return 0;
}

3.2.2 الحل 2 : باستعمال الدوال "المرور باستعمال القيم"

#include <stdio.h>

void PERMUTER (int A, int B)
{
 int AIDE;
 AIDE = A;
 A = B;
 B = AIDE;
}

main()
{
 int a=2,b=3,c;
 printf("a = %d b = %d\n",a,b)
 PERMUTER(a,b);
 printf("a = %d b = %d\n",a,b)
 return 0;
}

في الحقيقة إن استعمالنا للحل 2 لن يقوم أبدا بتبديل قيمتي المتغيرين a و b لأنه سيكون  لدينا" مرور باستعمال قيم المتغيرات" فقط.

والحل الأنجع لمثل هاته المسائل هو"استعمال المرور عن طريق عنوان المتغيرات" أي يجب علينا أن نستعمل المؤشرات في هذه الحالة.

وبالتالي يصبح المشروع كالتالي:

#include <stdio.h>
void PERMUTER (int *A, int *B)
{
 int AIDE;
 AIDE = *A;
 *A = *B;
 *B = AIDE;
}


main()
{
 int a=2,b=3,c;
 printf("a = %d b = %d\n",a,b)
 PERMUTER(&a,&b);
 printf("a = %d b = %d\n",a,b)
 return 0;
}

نستدعي الدالة في هذه الحالة :PERMUTER(&a,&b); عوض PERMUTER(a,b);

تذكر : أن هذا العمل تقوم به الدالة scanf


تذكر هذه الفقرة جيدا فهي مهمة أكثر من اللازم!!!!!!!!!!!

3.4 المرور باستعمال عنوان الجدول

وأيضا بالنسبة للجداول عوض أن نمر بـ   <type> <tab>[]  نستعمل   <type> *<tab>

مثال 1 : حساب طول متسلسلة

int strlen(char *S)
{
 int N;
 for (N=0; *S != '\0'; S++)
  N++;
 return N;
}

...../* استدعاء الدالة*/

strlen(CH) /* 9 النتيجة هي*/
strlen(P) /* 9  النتيجة هي*/
strlen(&CH[4]) /* 5  النتيجة هي*/
strlen(P+2) /* 7  النتيجة هي*/
strlen(CH+2) /* 7  النتيجة هي*/

مثال 2 : ملء جدول من خلال استدعاء دالة

void LIRE_TAB(int N, int *PTAB)
{
  printf("Write %d values : \n", N);
  while(N)
  {
   scanf("%d", PTAB++);
   N--
  }
}

...../* استدعاء الدالة*/

LIRE_TAB(4, T);


3.5 المرور باستعمال عنوان المصفوفة

لنقم بإنشاء دالة تقوم بجمع عناصر مصفوفة.

(راجع كيف نحصل على عنوان المصفوفة في فقرة المؤشرات)

#include <stdio.h>
main()
{
 /* تعريف الدالة */
 float SOMME(float *A, int N, int M);
 /* تعريف المصفوفة*/
 float T[3][4] = {{1, 2, 3, 4},
                  {5, 6, 7, 8},
                  {9,10,11,12}};
 /* SOMME استدعاء الدالة*/
 printf("Sum of elements : %f \n",SOMME((float*)T, 3, 4) );
 /*printf("Sum of elements : %f \n",SOMME(&T[0][0], 3, 4)); أو نستعمل*/
 return 0;
}


/*SOMME الدالة*/

float SOMME(float *A, int N, int M)
{
 int I;
 float S;
 for (I=0; I<N*M; I++)
  S += A[I];
 return S;
}


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:

المشروع
    صحيح A 
    2 = A
   اكتب A
 MACHIN(A)   
    اكتب A
نهاية_المشروع

 

الدالة اللارجعيةMACHIN(Xصحيح )
   اكتب X
     1000 = X
   اكتب 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:

المشروع
     صحيح A ,B,C
     208 = A
     5 = B
     -34 = C
    اكتب 
A,B,C
MANIPULER(A,B,C)    
    اكتب 
A,B,C
نهاية_المشروع

الدالة اللارجعيةMANIPULER(Xصحيح ,Yصحيح ,Zصحيح )
    صحيح T
    X = X
    2× Y = Y
     Y+X = Z
    اكتب 
X,Y,Z
نهاية_الدالة


الأنواع البسيطة

 


التمرين 10.6

أنجز دالة MOYENNE من النوع float تقوم بإظهار متوسط عددين حقيقيين مطلوب إدخالهما من طرف المستعمل.


التمرين 10.7

أنجز دالتين لحساب القيمة XN  حيث من النوع double  و من النوع int :

أ)  الدالة EXP1  تكون نتيجتها هي القيمة  XN

ب)  الدالة EXP2  تقوم بإعطاء القيمة XN  إلى X

أنجز مشروعا لتجربة عمل الدالتين.


التمرين 10.8

أنجز دالة MAX ودالة MIN تقومان بتحديد القيمة القصوية والدنوية لعددين حقيقيين مطلوب إدخالهما من طرف المستعمل.

أنجز مشروعا لتجربة عمل الدالتين.


التمرين 10.9

أنجز مشروعا يحتوي على الدالة من أجل إظهار جدول قيم الدالة المعرفة كالتالي:

f(x) = sin(x) + ln(x) - 

بحيث بين 1 و 10.


التمرين 10.10

أنجز دالة NCHIFFRES من نوع int  تقوم بأخذ القيمة الصحيحة (موجبة أو سالبة) من النوع long ، وتكون نتيجتها هي عدد الأرقام المكونة للعدد N.

 أنجز مشروعا يقوم بتجربة هذه الدالة.

مثال:

Integer Number : 6457392 

                  The number 6457392 ==> 7 numero.

التمرين 10.11

في الرياضيات، نعرف عامل عدد كالتالي :

0! = 1

n! = n*(n-1)*(n-2)* ... * 1 (pour n>0)

أنجز دالة FACT من نوع double تقوم بأخذ القيمة الصحيحة من النوع 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 تقوم بقراءة البعد أو الرتبة وكذلك عناصر جدول نسميه TAB من النوع int . الرتبة يجب أن تكون أصغر من NMAX . (يجب أن تقوم أنت بتحديد نوع المداخيل)

مثال :

لاستدعاء الدالة نكتب:         LIRE_TAB(T, &N, 10);

تقوم هذه الدالة بإظهار ما يلي ولقراءة الأعداد من لوحة المفاتيح :

Dimension of array (max.10): 11

Dimension of array (max.10): 4
Element[0] : 43
Element[1] : 55
Element[2] : 67
Element[3] : 79

التمرين 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 صحيح)
| (*تقوم هذه الدالة بترتيب عناصر جدول بطريقة SHELL *)
| النتيجة : تكون في الجدول T نفسه
| (*التعريفات*)
| صحيح SAUT, M, K
| منطقي TERMINE
| نضع N في SAUT
| طالما (SAUT>1) نفذ
| |نضع 2÷SAUT في SAUT
| |نفذ
| | |نضع صح في TERMINE
| | |من M=1 إلى (N-SAUT) نفذ
| | | |نضع M+SAUT في K
| | | |إذاكانت (T[M]>T[K]) إذن
PERMUTER(T[M],T[K]) || | | |
| | | | | نضع خطأ في TERMINE
| | | | نهاية_إذاكانت
| | | نهاية_من
| | طالما(TERMINE<>خطأ)
| نهاية_طالما
نهاية_الدالة


التمرين 10.18

حدد القيمة القصوى من بين عناصر جدول TAB ذي الرتبة N من أوجه ثلاثة :

  1. الدالة MAX1 ترجع القيمة القصوى.

  2. الدالة MAX2 ترجع موقع القيمة القصوى في الجدول.

  3. الدالة 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

أنجز دالة NMOTS_CH  تقوم بحساب عدد الكلمات الموجودة في جملة (دالة رجعية). استعمل متغير منطقي للمساعدة وكذلك الدالة isspace  ومتغير N للمساعدة.

التمرين 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

  1. أنجز دالة LIRE_DIM ذات 4 مداخيل أو معايير L و LMAX و C و CMAX التي تقوم بقراءة الرتبتين L و C لمصفوفة. الرتبتين  L و C يجب أن تكونا أصغر من LMAX و CMAX على التوالي.

 

  1. أنجز دالة 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

ترجمة بتصرف: محمد عبد الرحمان


 

التعليقات  

ابو سعود
+2 # ابو سعود 2014-12-22 07:43
السلام عليكم:
احييك اخي على اتقانك بايصال المعلومه والترجمه
فشهادة حق تستحقها هذا الشرح من افضل واروع مارايت امل منك فضلا لاامرا اذا كان لديك ملف دروس سي الموضوع هنا كاملا التكرم بارساله الى بريدي الموجود مع جزيل الشكر لما تبذله
رد | رد مع اقتباس | اقتباس | تقرير إلى المدير

أضف تعليقا


إصنعها يريد أن يتأكد أنك لست روبوتا، لذلك أحسب ما يلي:

كود امني
تحديث