كتبه: karwanpro / بتاريخ: 2013-08-29 , پێنج شه‌ممه‌
المصفوفة هو من العناصر الذي يختصر لنا كتابة اكواد كثيرة جدا بأكواد قليلة تعطي نتائج كبيرة فالمصفوفة array هى مجموعة من البيانات التى تتشابه فى النوع ولها اسم مشترك. تتشابه فى النوع بمعنى أن تكون البينات التى تخزنها فى المصفوفة كلها اعداد صحيحة int او اعداد ذات علامة عشرية float . فيمكن ان نضع المصفوفة من اى نوع من انواع البيانات.


الإعلان عن المصفوفة
للإعلان عن إحدى المصفوفات هناك ثلاثة أشياء يجب ان تحددها.
(1) اسم المصفوفة : وهو اسم تختاره مثلما تختار اسم أى متغير
(2) عدد العناصر داخلها
(3) نوع البيانات المستخدم فيها
مثلاً : نفرض أنك تريد تخزين مرتبات 120 موظفاً يعملون فى شركتك وكانت مرتبات هؤلاء الموظفين تحتوى على كسور عشرية. فى هذه الحالة شيكون نوع البيانات float ويتم الاعلان عن المصفوفة كما يلى : float salary[120]

تنقسم المصفوفة إلى المصفوفة ذات بعد واحد ومصفوفات ذات البعدين.

** المصفوفة ذات البعد الواحد :-
مثلا : A[ 2 5 9 12 15 ] وتسمى مصفوفة ذات بعد واحد لأنها تتكون من صف واحد أو عمود واحد وفيها حرف A هو اسم المصفوفة والأرقام هى عناصر المصفوفة ويتم الإشارة إلى كل عنصر برقم العنصر اى بترتيبه داخل المصفوفة

الإشارة إلى عناصر المصفوفة
- يتم ذلك بان تذكر اسم المصفوفة ثم رقم المصفوفة الذى تريد التعامل معه بين القوسين [ ]
- اى عندما ترغب فى ذكر رقم العنصر داخل المصفوفة يجب أن تبدأ العد داخل المصفوفة من صفر وليس من 1
- مثلاً : إذا كنت تريد وضع الرقم أو القيمة 75 فى العنصر 3 من المصفوفة المسماه student نكتب التالى : student[3] = 75
- وإذا كنت تريد ان تنقل القيمة الموجودة فى العنصر 38 من المصفوفة salary إلى أحد المتغيرات نكتب التالى : a = salary[37]
- كذلك يمكن ان تمرر القيمة الموجودة فى أحد عناصر المصفوفة الى اجراءات مكتبة التشغيل مثل
printf(“ The higest mark is %d “, student[45]);
** البرنامج التالى يعرض مثالاً عن كيفية الإعلان عن إحدى المصفوفات واستخدامها :-
Code

# include <stdio.h>
# define max 10
void main(void)
{
float salary[max];
float average;
int count;
average = 0.0;
for(coint=0; count<max ; count++)
{
printf(“ please enter salary for employee %d”, count+1);
scanf(“%f”, &salary[count]);
}
printf(“\n\n salary average is : %f”, average/max);
}


ملاحظات على البرنامج :-

- هذا البرنامج يطلب من المستخدم إدخال مرتبات 10 موظفين ثم يقوم بحساب وطباعة متوسط هذه الرواتب.
- فى بداية البرنامج نعلن عن المصفوفة float salary[max] هذه المصفوفة تستخدم لتخزين 10 اعداد ذات كسور عشرية وبالتالى فإن الإعلان السابق يساوى float salary[10]
- بعد ذلك نعلن عن المتغير average وهو تستخدم لتخزين مجموع الرواتب حتى نتمكن من استخراج متوسطها.
- لهذا نستخدم جملة التكرار for لادخال 10 موزفين لذلك نستخدم الإجراء scanf() لنطلب من المستخدم إدخال الرواتب scanf("%f ", &salary[count]
- وكلما ادخل المستخدم أحد الرواتب أضفنا قيمته الى المتغير average كما يلى
average += salary[count]

الملاحظة الهامة : هى كيف استخدمنا المتغير count كعداد لتكرار for وفى نفس الوقت استخدمناه للإشارة للعناصر المختلفة داخل المصفوفة. Scanf(“%f”, salary[couny]) ففى بداية التكرار سيكون المتغير count يساوى الصفر

تهيئة المصفوفة عند الإعلان عنها
- من الممكن ان تقوم بتهيئة المصفوفة عند الإعلان عنها إذا كنت تعرف مسبقا المحتويات التى ستضعها فيها int marks[5] = { 12 4 7 9 11} هنا نعلن عن مصفوفة مكونه من خمسه عناصر عددية صحيحة int

المصفوفة الغير محددة العدد
- إذا كنت ستهيئ مصفوفة عند الاعلان عنها يمكن ان تترك للمترجم مهمة حساب عدد العناصر فيها.
- مثلاً : int marks[ ] = { 5 9 4 10 7 }
- هنا أعلنا عن المصفوفة ولكن لم نحدد عدد العناصر فيها لأن المترجم سيقوم بِعـَـد القيم المذكورة بين القوسين { } ويحدد حجم المصفوفة تلقائيا .

انظر البرنامج التالي
Code

# include <stdio.h>
/* calculate the average of a numbers , the compute deviation of each number about the average */
main( )
{
int n , count ;
fliat avg, d , sum=0 ;
/* read in a value for n */
printf(“\n how many numbers will be average? “;
scanf(“%d”, &n);
printf(“\n”);
/* read in the numbers and calculate ther sum */
for(count = 0 ; count < n count++ )
{
printf(“i = %d x= “, count+1);
scanf(“%f”, &list[count]);
sum+= list[count];
}
/* calcuate and write out the average */
avg = sum/n;
printf(“\n the average is %5.2f\n\n “, avg);
/* calculate and write out the deviations about the average */
for(count = 0 ; count < n ; count++)
{
d=list[count] – avg ;
printf(“i = %d x%5.2f d=%5.2f \n” , count+1, list[count] , d);
}
}


ناتج هذا البرنامج :-

The average is 4.18
i = 1 x = 03.00 d = -1.18
i = 2 x = -2.00 d = -6.18
i = 3 x = 12.00 d = 7.82
i = 4 x = 4.40 d = 0.22
i = 5 x = 3.50 d = -0.68


برنامج إعادة ترتيب قائمة من الأعداد
Code

# include<stdio.h>
# define size 100
/* reorder a one-dimensinal, integer array from smallest to largest */
main( )
{
int i , n , x[size];
void reorder(int n , int x[ ]);
/* read in the a value for n */
printf(“\n how many number will be entered ? “ );
scanf(“%d”, &n );
printf(“\n”);
/* read in the list of number */
for(i = 0 ; i<n ; i++)
{
printf(“i = %d x = “, i+1);
scanf(“%d”, &x[ i ]);
}
/* reprder all array elements */
reorder(n , x )
/* display the reordered list of numbers */
print(“\n\reordered list of number :\n\n “);
for(i=0;i<n; i++)
printf(“i=%d x=%d\n”, i+1 , x[ i ] );
}
int i, item ,temp;
for(item = 0;item<n-1 ; item++ )
if(x[ i ] < x[item])
{
/* interchange twwo elements */
temp = x[item];
x[item] = x[ i ];
x[ i ] = temp ;
}
return;
}


المصفوفة ذات البعدين :
- هى المصفوفة التى ترتب عناصرها فى شكل صفوف وأعمدة
- ويتم الإعلان عنها بالشكل التالى int a[5] [10] ومعناه أن المصفوفة ش مصفوفة ذات بعدين 5 صفوف و10 أعمده ويتم الاشارة الى العنصر برقم الصف ورقم العمود
ملاحظة : عند استخدام مصفوفة ذات البعدين لابد من استعمال دوارة for
إعطاء قيمة ابتدائية للمصفوفة: يمكن إعطاء قيمة ابتدائية للمصفوفة ذات البعدين كمايلى
int a[3][4] =
{
{4,5,7,8 },
{3,2,4,5},
{7,8,9,6}
};

ملاحظة : فى هذا الشكل يأخذ العنصر رقم 0,0 القيمة 4 والعنصر رقم 0,1 القيمة 5
- تتحد القيم الأربع فى أول زوج أقواس { } داخلية لعناصر المنظومة فى الصف الأول وتتحدد القيم الموجودة فى زوج الأقواس { } التالى لعناصر المنظومة فى الصف الثانى000 وهكذا

شكل آخر للمصفوفة ذات البعدين :
int values[3][4] = {1,2,3,4,5,6,7,8,9,,10,11,12};
فى هذا الشكل يأخذ العنصر رقم 0,0 القيمة 1 أى values[0][0] ويـأخذ العنصر 0,1 القيمة 2 أى values[0][1]

مثال: على استخدام المصفوفات متعددة الأعمدة
Code

# include <stdio.h>
# define stud 3
# define marks 10
void main (void)
{
int student[stud][marks];
int c1 ,c1 ;
for(c1 = 0 ; c1 < stud ; c1++)
  for ( c2 = 0 ; c2 < marks ; c2++)
  {
  printf ( “ enter marks: %2d for student %2d : “ , c2+1 , c1+1 );
  scanf (“ %d “, &student[c1][c2]);
  }
for(c1 = 0 ; c1 < stud ; c1++ )
for(c2= 0 ; c2 < marks ; c2++)
printf(“ student [%2d] , marks[%2d] = %d\n “, c1+1, c2+1 , student[c1][c2]);
}


ملاحظات : فى بداية البرنامج نعلن عن المصفوفة student ذات البعدين
int student[stud][marks];
- وبعد ذلك نستخدم تكرارين for داخل بعضهم . نستخدم هذين التكرارين لطلب الدرجات من المستخدم. التكرار الأول يستمر بعــد الطلاب والتكرار الثانى بعد الدرجات.
كذلك نستخدم تكرارين لنطبع الدرجات التى أدخلها المستخدم.
برنامج : جمع جدولين من العداد اى نحسب مجموع العناصر المتناظرة فى الجدولين أى نحسب
c[i][j] = a[i][j] + b[i][j]


ثم نستخرج الجدول الجديد محتوياً على المجموع
Code

# include <stdio.h>
# define mrow 20
# define mcol 30
/* caluculates the sum of the elements in two tables of integers */
void main (void)
{
int mrow , mcol;
/* array definitions */
int a[mrow][mcol] , b[mcol][mcol] , c[mcol][mcol];
/* function protyotypes */
void readinput(int a[ ][mcol],int nrow , int ncol);
void computesum ( int a[ ][mcol], int b[ ][mcol] , int c[ ][mcol], int nrow , int ncol);
void writeoutput ( int c[ ][mcol], int nrow , int ncol );


Code

printf ( “ How many rows ?” );
scanf (“ %d “ , nrow);
printf ( “ How many columns ?” );
scanf (“ %d “ , ncol);
printf ( “ \n\n first table : \n” );
readinput( a, nrow , ncol );
printf ( “ \n\n second table : \n” );
readinput( b, nrow , ncol );
computsum(a, b, c, nrow, ncol);
printf ( “ \n\n sums of the elements : \n \n” );
writeoutput(c , nrow , ncol);
}
void readinput( int a[ ][mcol] , int m , int n )
/* read in a table of integers */
{
int row , col ;
for(row = 0 ; row < m ; row ++ )
{
printf\n enter data for row no. %2d \n “ , row+1 );
for( col = 0 ; col < n ; col++)
scanf(“ %d “, &a[row[col]):
}
return;
}
void computsum(int a[ ][mcol] , int b[ ][mcol] , int c[ ][mcol] , int m ,int n )
/* add the elements of two integer tables */
{
int row, col ;
for(row = 0 ; row < m ; row++)
for(col = 0 ; col < n ; col++)
c[row][col] = a[row][col] + b[row][col];
return;
}
void writeoutput(int a[ ] [mcol] , int m , int n )
/* write out a table of integers */
{
int roe , col ;
for (row = 0 ; row <m ; row ++)
{
for(col = 0 ; col < n ; col ++)
printf(“%4d “, a[row][col]):
printf(“\n”;
}
return;
}


ملاحظات :
- a ,b ,c مصفوفة ثنائية الأبعاد ولكل منها نفس عدد الصفوف ونفس عدد العمدة
- row متغير صحيح يحدد العدد الفعلى للصفوف فى كل جدول.
- ncol متغير صحيح يحدد العدد الفعلى للأعمدة فى كل جدول
- row عداد صحيح يحدد رقم الصف
- col عداد صحيح رقم العمود

والاتى تنفيذ البرنامج :-
how many rows? 3
how many columns? 4
first table :
enter data for row no. 1
1 2 3 4
enter data for row no. 2
5 6 7 8
enter data for rpw no. 3
9 10 11 12
second tables :
enter data for row no. 1
10 11 12 13
enter data for row no. 2
14 15 16 17
enter data for row no. 3
18 19 20 21
suns if the elements :
11 13 15 17
19 21 23 25
16 19 31 33


مصفوفة العبارة الحرفية array of string
تستخدم كلمة سلسلة حروف مقابل لكلمة string

الإعلان عن سلاسل الحروف
- عندما ترغب فى استخدام مصفوفة حروف فأنك تعلن عنها كما تعلن عن بقية المصفوفات الأخرى
وللأعلان عن نوع البيانات char نكتب التالى : char name[80]
- هنا نعلن عن المصفوفة name التى تتسع لـ 79 حرف ( لأن لغة c تفترض ان المصفوفة تنتهى بحرف الصفر (null)
شكل آخر للأعلان char name[ ] = "ali ahmed"
- هنا سوف يقوم المترجم بعــد الحروف وتحديد حجم المصفوفة وتهيئتها بالحروف المذكورة

استخدام مصفوفة الحروف :-
- بعد أن تنتهى من الإعلان عن مصفوفة الحروف . يمكنك البدء فى استخدامها
- كذلك يمكن ان تمرر اسم المصفوفة الى أحد اجراءات مكتبة التشغيل مثل الاجراء printf أو gets أو غيرها. ويمكنك أيضا الكتابة الى أى حرف داخلها أو قراءة الحرف فيها ووضعها فى متغيرات أخرى

والبرنامج التالى يوضح استخدام مصفوفات الحروف :-
Code

# include<stdio.h?
void main(void)
{
char namr[80]
printf(“place enter your name : “);
gets(name);
printf(“welcome , %s “, name);
}

ملاحظات :
- فى هذا البرنامج يعلن عن مصفوفة الحروف name ثم نستخدم الاجراء gets ليقرأ اسم المستخدم من لوحة المفاتيح ثم يخزن الحروف التى أدخلها المستخدم فى المصفوفة
- إذا رغبت أن تتعامل مع كل حرف من حروف المصفوفة على حدة اكتب التالى name[0] = 'a'
- إذا اردت ان تنقل القيمة الموجودة فى أحد الحروف فى المصفوفة الى أحــد المتغيرات الأخرى نكتب ss = name[15];

مصفوفة الحروف تنتهى بالرقم صفر
يجب ان تلاحظ ان مصفوفة الحروف يجب ان تنتهى بالرقم صفر ( null )
انظر البرنامج التالي
Code

# include <stdio.h>
void main(void)
{
char strin[ ] = “hello”;
printf(“character array = %s , its length = %d \n, strin , sizeof(string));
}

ملاحظات :
- فى هذا البرنامج نعلن عن مصفوفة باسم string
- نطلب من المترجم ان يهيئها بان يضع فيها كلمة hello كما يلى char string[ ] = "hello”
- بعد ذلك نستخدم الاجراء printf ليطبع محتويات هذه المصفوفة
- استخدام كلمة sizeof لنحصل على حجم هذه المصفوفة ونطبعه يكون الناتج
character array = hello its length = 6
- لاحظ ان حجم المصفوفة هو 6 حروف فى حين اننا وضعنا فيها 5 فقط وهى الحروف hello
لكى نتأكد من هذه النقطة انظر البرنامج التالى :-
Code

# include<stdio.h>
void main(void)
{
int count;
char string[ ] = “ hello “
for(count = 0 ; count < sizeof(string); count ++)
printf(“ string[%d] = =%d %c \n “, count, string[count], string[count]);
}

- فى هذا البرنامج نعلن عن مصفوفة الحروف string ثم نستخدم تكرار for لنطبع محتويات كل حرف فيها
- لاحظ شرط استمرار التكرار. Count < sizeof(string)
- سيؤدى هذا الشرط الى استمرار التكرار بعدد الحروف الموجود فى المصفوفة string وفى كل مرة يعمل فيها التكرار نطبع الحرف الموجود فى المصفوفة كحرف وكرقم فى جدول آسكى كما فى الشكل التالى :-
String[ 0 ] = 104 h String[ 1 ] = 101 e
String[ 2 ] = 108 l String[ 3 ] = 108 l
String[ 4 ] = 111 o String[ 5 ] = 0

لاحظ كيف يعرف البرنامج الحرف السادس فى المصفوفة على أنه = صفراً

بعض الاجراءات التى تتعامل مع مصفوفات الحروف
هناك العديد من اجراءات مكتبة التشغيل التى تسهل التعامل مع مصفوفات الحروف
(1) معرف عدد الحروف فى المصفوفة :-
- إذا اردت ان تعرف عدد الحروف الموجودة فى أى مصفوفة حروف استخدم الاجراء strlen يعود بعدد الحروف الفعلية الموجودة فى المصفوفة بدون عد اصفر الموجود فى نهايتها
- مثلا len = strlen("count this string " )
(2) نسخ مصفوفة حروف الى اخرى :-
- لا تسمح لك لغة الــc بنقل محتويات مصفوفة حروف الى اخرى مباشرة .
- هناك الاجراء strcpy يستخدم كما يلى : strcpy ( string1 , string2 ) سيقوم الاجراء بنسخ محتويات المصفوفة string2 الى المصفوفة string1
- ويمكن ان نستخدم الاجراء strcpy لنسخ مجموعة احرف الى مصفوفة اخرى .
- مثلاً strcpy( string , " hello my string "); هنا سيقوم المترجم بوضع الجملة المذكورة فى المصفوفة string
- كذلك يجب أن نتأكد أن المصفوفة التى ستنقل إليها الحروف تتسع لكل الحروف الموجودة فى المصفوفة الأخرى لأن الاجراء strcpy لا يتأكد من ذلك.
(3) دمج محتويات مصفوفتى حروف :-
- لعمل ذلك استخدم الاجراء strcat كما يلى: (strcat(string1 , string2 سيضيف الاجراء srcat محتويات المصفوفة string2 الى محتويات المصفوفة string1
- هنا يجب أن نتأكد أن المصفوفة string1 تتسع لكل الحروف الموجودة فى المصفوفة string2 بالإضافة الى الحروف التى كانت أصلا موجودة
Code

# include < stdio.h>
void main(void)
{
char string1[20] = “learning c “;
char string2[ ] = “ is easy “;
strcat(string1 , string2 );
printf(string1);
}


مقارنة محتويات مصفوفتين :
- من الممكن ايضا ان تقارن محتويات مصفوفتين من الحروف
- لعمل ذلك استخدم الاجراء strcmp وله الصيغة التالية:
result = strcmp(string1 , string2 );
- سيقارن الاجراء strcmp محتويات المصفوفتين ويضع ناتج المقارنة فى المتغير result
- إذا كانت المصفوفتان متطابقتين ( اى يحتويان على نفس مجموعة الحروف ) يكون المتغير result فى هذه الحالة يساوى صفراً
- وإذا كانت المصفوفتان مختلفتين فإن المتغير result يحتوى على نتيجة بخلاف الصفر

البرنامج التالى يعطى مثالاً على استخدام الاجراء strcmp :-
Code

# include < stdio.h>
# include <string.h>
void main(void)
{
char string1[80];
char string2[80];
int result;
printf(“ enter the first string “);
gets(string1);
printf(“ enter the second string : “);
gets(string2);
result = strcmp(string1,string2);
if(result == 0 )
printf(“the two string are identical : );
else
printf(“the two string are different : );
}

ملاحظات :
- فى هذا البرنامج سيطلب من المستخدم غدخال عبارتين ثم يستخدم الاجراء strcmp ليقلرن بينهما ويعرض نتيجة المقارنة
- ويمكن ايضا ان تستخدم الاجراء strcmp ليقارن بين محتويات مصفوفة حروف ومجموعة حروف مثل result = strcmp(string1,string2);
برنامج عام
لاستخدام الاجراءات المختلفة التى تتعامل معها مصفوفة الحروف
Code

# include < stdio.h>
# include < string.h>
void main(void)
{
char string1[80];
char string2[80];
int result , choice;
printf(“ enter the first string : “ );
gets(strig1);
printf(“enter the second string : “ );
gets(strung2);
printf(“\n enter the function you want: \n “
  “1- strcpy \n “
  “2- strcat \n “
  “3- strcmp \n”);
printf(“enter you choice : );
scanf(“%d “ , &choice);
switch(choice)
{
case 1:
printf(\n copy second string to first \n”);
strcpy(string1 , string2 );
printf(string1);
break;
case 2:
printf(\n merging the two string \n”);
strcat(string1 , string2 );
printf(string1);
break;
case 3:
printf(“\n comparing the two strings \n “);
result = strcmp(string1,string2);
if(result == 0 )
printf( “ the two strimg are identical “);
else
printf( “ the two strimg are different “);
break;
default :
printf(“plase enter a number 1-3 “ );
}
}


تمرير مصفوفة الى الاجراءات
- من الاستخدامات المفيدة للمصفوفات سواء المصفوفات العادية أو مصفوفات الحروف هو ان تتمكن من تمريرها الى بعض الاجراءات التى تكتبها
- عندما ترغب فى تمرير إحدى المصفوفات الى اجراء يجب ان تعلن عن الاجراء بحيث تخبر المترجم انه سيتلقى مصفوفة وليس متغيراً عادياً مثل void fn(int num[ ] ); هنا تخبر المترجم ان الاجراء fn سيتلقى مصفوفة من نوع int بعد ذلك عندما ترغب فى تمرير المصفوفة اى الاجراء أذكر اسم المفوفة فقط كما يلى fn(num);

البرنامج التالى :-
يعطى مثالاً على كيفية تمير مصفوفة حروف الى احد الاجراءات :-
Code

# include < stdio.h>
# include <ctype.h>
# include <string.h>
void changetoupper(char string[ ] );


Code

void main(void)
{
char string[80];
do
  {
  printf(“ enter a string to change to upper “ case \n enter \ “quit \ “to exit”);
  gets(string);
  changetoupper(string);
  }
  while(strcmp(string , “quit”));
}
void changetoupper(char string[ ] )
{
unsigned int count;
for(counr = 0 ; count < strlen(string); count++)
printf(“%c” , toupper(string[count]));
printf(“\n\n”);
}


ملاحظات :
- هذا البرنامج يطلب من المستخدم ان يدخل مجموعة حروف ثم يحولها الى حروف كبيرة
- عندما يبدا البرنامج يدخل فى تكرار do….while ويستمر فى طلب مجموعات الحروف حتى يدخل المستخدم كلمة quit وعندها يخرج من التكرار
- فى كل مرة يدخل المستخدم مجموعة حروف تستدعى الاجراء changetoupper ونمرر له مصفوفة الحروف التى أدخلها المستخدم ليطبعها بالحرف الكبيرة.
Share

rss facebooki twitter google plus
فیسبوك
نصيحة برمجية
أصحاب المواقع
مواضيع اخرى
آخر كتاب قرأته