المصفوفات ARRAYS
مقدمة *
تنقسم البيانات الى بيانات حرفية char وبيانات رقمية int وبيانات حقيقة float وتسمى هذه الأنواع ( int , float , char ) بالأنواع الرئيسية للبيانات حيث لا يمكن تجزئتها أقل من ذلك.
وهناك انواع أخرى من البينات تسمى بالأنواع المشتقة ( Type dived data ) من هذه النواع المصفوفات arrays .
** المصفوفة **
المصفوفة 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]);
** البرنامج التالى يعرض مثالاً عن كيفية الإعلان عن إحدى المصفوفات واستخدامها :-
# 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 }
- هنا أعلنا عن المصفوفة ولكن لم نحدد عدد العناصر فيها لأن المترجم سيقوم بِعـَـد القيم المذكورة بين القوسين { } ويحدد حجم المصفوفة تلقائيا .
** برنامج **
# 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
** برنامج إعادة ترتيب قائمة من الأعداد **
# 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]
مثال: على استخدام المصفوفات متعددة الأعمدة
# 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]
ثم نستخرج الجدول الجديد محتوياً على المجموع
# 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 );
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 عداد صحيح رقم العمود
* أفرض ان البرنامج استخدم فى جمع الجدولين الاتى :-
الجدول الثانى الجدول الأول
10 11 12 13 1 2 3 4
14 15 16 17 5 6 7 8
18 19 20 21 9 10 11 12
والاتى تنفيذ البرنامج :-
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