1. جداول أحادية البعد
1.1 التعريف
جدول أحادي البعد: هو عبارة عن متغير يتكون من عدة عناصر لها نفس النوع.
وبالتقريب الرياضي فإن الجدول أحادي البعد هو عبارة عن متجهة متكونة من عدة عناصر.
مثال للتعريف :
int MOIS[12]={31,28,31,30,31,30,31,31,30,31,30,31};
نلاحظ أن هذا الجدول اسمه MOIS وعدد عناصره هو 12 من نفس النوع.
1.2 التعريفات والحجز في الذاكرة
التعريف
الكتابة الخوارزمية |
في C |
<النوع> اسم_الجدول[البعد] |
<Type> <Table>[<Dimension>]; |
أمثلة :
|
الحجز :
قد تطرقنا سابقا إلى حجم كل نوع في الذاكرة، فمثلا يحجز متغير من نوع char ثمن واحد في الذاكرة، و short ثمنين وهكذا...
أما بالنسبة لجدول من نوع معين، فيجب أن نضرب عدد عناصره في حجم النوع ونحصل بذلك على حجم الجدول في الذاكرة.
مثال : نعتبر أنه لدينا جدول من نوع long وعدد عناصره هو 15، إذن المساحة التي يحجزها هذا الجدول هي 15×4 حيث 4 هي حجم النوع long، أي 60 ثمنا في الذاكرة.
1.3 تعاريف خاطئة وأخرى صحيحة
1.4 الدخول إلى عناصر الجدول أو استعمالها
نعتبر التعريف التالي :
short A[5];
كما نلاحظ بأن هذا الجدول يتكون من 5 عناصر، لنقم إذن بتهيئة عناصره في البداية كما يلي :

ليكن في العلم أن C يرمز في هذه الحالة لأول عنصر بـ [0]A وآخر عنصر بـ [4]A.
عموما: عندما نعرف جدولا T ذي البعد N (أي يتكون من N عنصر) فإن أول عنصر هو [0]T وآخر عنصر هوT[N-1]
أمثلة للاستعمال :
MAX = (A[0]>A[1]) ? A[0] : A[1]; A[4] *= 2; A[3] = MAX + A[2] - A[4]; |
1.5 كتابة عناصر الجدول على الشاشة
لإظهار عناصر الجدول على الشاشة نستعمل غالبا الدالة ()printf كما هو معتاد.
الكتابة الخوارزمية |
في C |
بداية_المشروع |
main() |
في هذا المثال ستكون النتيجة على الشاشة كالتالي :
10 20 30 40 50 |
ويمكن أن نفرق بين عناصر الجدول عند الإظهار باستعمال أدوات الجدولة مثلا :
printf("%i\t", A[I]); /* جدولة */ |
ملاحظة : إن استعمال i% شبيه باستعمال d% لتمثيل نوع العناصر int في الدالة printf
1.6 قراءة عناصر الجدول من لوحة المفاتيح
لقراءة عناصر الجدول من لوحة المفاتيح نستعمل غالبا الدالة ()scanf كما هو معتاد.
الكتابة الخوارزمية |
C |
بداية_المشروع |
main() |
ملاحظة 1 : scanf تحتاج بطبيعة الحال إلى عناوين عناصر الجدول في الذاكرة، لهذا نضع الرمز & أمام كل عنصر.
ملاحظة 2 : إن استعمال i% شبيه باستعمال d% لتمثيل نوع العناصر int في الدالة scanf.
تمارين تطبيقية 1
التمرين 7.1
أنجز شفرة تمكن من قراءة البعد N لجدول T من النوع int (البعد الأقصى هو 50)، أملئ الجدول من خلال لوحة المفاتيح ثم أظهره على الشاشة.
قم كذلك بحساب وإظهار حاصل الجمع لعناصر الجدول.
التمرين 7.2
أنجز شفرة تمكن من قراءة البعد N لجدول T من النوع int (البعد الأقصى هو 50)، أملئ الجدول من خلال لوحة المفاتيح ثم أظهره على الشاشة.
أزل من الجدول القيم التي تساوي 0 واحتفظ بالعناصر المتبقية. أظهر الجدول الناتج.
التمرين 7.3
أنجز شفرة تمكن من قراءة البعد N لجدول T من النوع int (البعد الأقصى هو 50)، أملئ الجدول من خلال لوحة المفاتيح ثم أظهره على الشاشة.
اقلب بعد ذلك بقلب عناصر الجدول بدون استعمال جدول آخر للمساعدة.أظهر الجدول الناتج.
التمرين 7.4
أنجز شفرة تمكن من قراءة البعد N لجدول T من النوع int (البعد الأقصى هو 50)، أملئ الجدول من خلال لوحة المفاتيح ثم أظهره على الشاشة.
قم بتحديد القيم الموجبة وضعها في جدول ثان سميه TPOS .
قم بتحديد القيم السالبة وضعها في جدول ثالث سميه TBEG .
أظهر الجدولين على الشاشة.
2. جداول ثنائية البعد (المصفوفات)
2.1 التعريف
جدول ثنائي البعد: هو عبارة عن متغير يتكون من عدة عناصر لها نفس النوع.
وبالتقريب الرياضي فإن الجدول ثنائي البعد هو عبارة عن مصفوفة لها بعدين L و C متكونة من عدة عناصر.
نقول أن الجدول أو المصفوفة مكعبة إذا كان عدد الأسطر L يساوي عدد الأعمدة C .
مثال 1: نعتبر جدولا NOTE أحادي البعد يمثل نقاط امتحان واحد لـ 20 تلميذا في قسم واحد:
إذن في هذه الحالة نكتب :
int NOTE[20] = {45, 34, ... , 50, 48}; |
مثال 2: لكن في حالة إذا ما كان لدينا 10 امتحانات لـ 20 تلميذا في قسم واحد:
إذن في هذه الحالة نكتب :
int NOTE[10][20] = {{45, 34, ... , 50, 48}, |
كل سطر يمثل جميع نقاط التلاميذ في امتحان واحد.
وكل عمود يمثل جميع نقاط الامتحانات لكل تلميذ.
2.2 التعريفات والحجز في الذاكرة
التعريف
الكتابة الخوارزمية | في C |
<نوع> اسم_الجدول[عدد_الأسطر،عدد_الأعمدة] |
<Type> <NomTabl>[<DimLigne>][<DimCol>]; |
أمثلة :
الحجز
int A[10][10]; float B[2][20]; int C[3][3]; char D[15][40]; |
بالنسبة لمصفوفة من نوع ما، فيجب أن نضرب عدد الأسطر L في عدد الأعمدة في حجم النوع ونحصل بذلك على حجم الجدول في الذاكرة.
مثال :
long A[3][2] = {{ 1, 2 }, |
إذن المساحة التي يحجزها هذا الجدول هي 3×2×4 حيث 4 هي حجم النوع long، أي 24 ثمنا في الذاكرة.
2.3 كتابات خاطئة وأخرى صحيحة
![]() |
![]() |
![]() |
![]() |
2.4 الحجز التلقائي
في حالة عدم تحديد عدد الأسطر أو عدد الأعمدة من طرف المستعمل يقوم C في هذه الحالة بالحجز التلقائي عوض المستعمل.
أمثلة :
int A[][10] = {{ 0,10,20,30,40,50,60,70,80,90}, |
يقوم C بحجز 3×10×2 أي 60 ثمن حيث 3 هي عدد الأسطر و 2 هو حجم النوع int في أغلب الأحيان.
float B[][2] = {{ -1.05, -1.10 }, |
2.5 الدخول إلى أو استعمال عناصر المصفوفة
أولا وقبل كل شيء، تمثل عناصر المصفوفة (لتكن هي A) ذات البعدين L و C كما يلي :
/ \ |
كما نلاحظ أن أول عنصر لهذه المصفوفة هو A[0][0] وآخر عنصر هو A[L-1][C-1] .
أمثلة :
نعتبر التعريف التالي :
int tab[3][2]={{10,20}, |
حيث :
tab[0][0] | يمثل القيمة | 10 |
tab[0][1] | يمثل القيمة | 20 |
tab[1][0] | يمثل القيمة | 30 |
tab[1][1] | يمثل القيمة | 40 |
tab[2][0] | يمثل القيمة | 50 |
tab[2][1] | يمثل القيمة | 60 |
أمثلة للاستعمال :
MAX = (tab[0][0]>tab[0][1]) ? tab[0][0] : tab[0][1]; |
2.6 كتابة عناصر المصفوفة على الشاشة
لإظهار عناصر المصفوفة على الشاشة نستعمل غالبا الدالة ()printf كما هو معتاد.
الكتابة الخوارزمية |
في C |
بداية_المشروع |
main() |
في هذا المثال ستكون النتيجة على الشاشة كالتالي :
10 20 30 40 50 60
|
وإذا أردنا أن يكون الإظهار بهذا الشكل :
10 20 |
نعوض الشفرة أعلاه بما يلي :
main() |
ويمكن أن نفرق بين عناصر الجدول عند الإظهار باستعمال أدوات الجدولة مثلا :
printf("%i\t", A[I][J]); /* جدولة */ |
ملاحظة : إن استعمال i% شبيه باستعمال d% لتمثيل نوع العناصر في الدالة printf
2.7 قراءة عناصر المصفوفة من لوحة المفاتيح
لقراءة عناصر المصفوفة من لوحة المفاتيح نستعمل غالبا الدالة ()scanf كما هو معتاد.
الكتابة الخوارزمية |
في C |
بداية_المشروع |
main() |
تمارين تطبيقية 2
التمرين 7.5
أنجز شفرة تمكن من قراءة البعدين L و C لجدول T من النوع int (البعد الأقصى للأعمدة والسطور هو 50)، أملئ الجدول من خلال لوحة المفاتيح ثم أظهره على الشاشة، وكذلك مجموع عناصره.
التمرين 7.6
أنجز شفرة تمكن من قراءة البعدين L و C لجدول T من النوع int (البعد الأقصى للأعمدة والسطور هو 50)، أملئ الجدول من خلال لوحة المفاتيح ثم أظهره على الشاشة، وكذلك مجموع عناصر كل سطر من سطوره وكل عمود من أعمدته باستعمال متغير واحد فقط للمساعدة لأجل الجمع.
التمرين 7.7
أنجز شفرة تمكن من تحويل جدول نسميه M ذي البعدين L و C (البعد الأقصى للأعمدة والسطور هو 10)،في جدول V ذي البعد L*C .
مثال :
/ \
| a b c d | / \
| e f g h | ==> | a b c d e f g h i j k l |
| i j k l | \ /
\ /
تمارين تطبيقية 3
جداول ذات بعد واحد
التمرين 7.8 :الجداء السلمي لمتجهتين
أكتب شفرة تمكن من حساب الجداء السلمي لمتجهتين U و V (لهما نفس الدرجة).
مثال :
/ \ / \
| 3 2 -4 | * | 2 -3 5 | = 3*2+2*(-3)+(-4)*5 = -20
\ / \ /
التمرين 7.9 : حساب حدودية ذات الدرجة n
أحسب قيمة الحدودية P ذي الدرجة n انطلاقا من العدد الحقيقي ذي النوع float :
P(X) = AnXn + An-1Xn-1 + ... + A1X + A0
المعاملات An ،....،A0 مطلوب إدخالها من طرف المستعمل يجب حفظها في جدول A
القيم n مطلوب إدخالها من طرف المستعمل.
-
استعمل الدالة (,)pow المنتمية إلى المكتبة <math.h> . مثال ( N=pow(X,10 تكافئ N=X10.
-
لتجاوز استعمال الأس أثناء الحساب استعمل طريقة Horner المعرفة كالتالي :
التمرين 7.10 : القيمة القصوية و الدنوية لجدول
أكتب شفرة تمكن من تحديد أكبر و أصغر قيمة في جدول A للأعداد الصحيحة.
أظهر على الشاشة القيمة والموقع للقيمة القصوية والدنوية. إذا كان الجدول يحتوي على كثير من مثيلات القيمة القصوية أو الدنوية ، يكفي اختيار أول قيمة موجودة.
التمرين 7.11 : إضافة قيمة إلى جدول مرتب
جدول ذي البعد N+1 يحتوي على N منالأعداد الصحيحة مرتبة تزايديا، القيمة (N+1) غير معرفة.
أضف قيمة جديدة VAL (مطلوب إدخالها من طرف المستعمل) إلى الجدول A ليكتمل بـ N+1 قيمة مرتبة.
التمرين 7.12 البحث عن قيمة داخل جدول
أنجز شفرة تمكن من البحت عن قيمة val ( مطلوب إدخالها من طرف المستعمل) داخل جدول A للأعداد الصحيحة.
أظهر على الشاشة موقع القيمة في الجدول إذا كانت موجودة فيه، وإلا فيجب إظهار جملة مناسبة لهذه الحالة.
يمكنك استعمال طريقتين :
- البحث المتتالي : تقارن قيم الجدول بالقيمة المبحوث عنها.
- البحث الثنائي : في هذه الحالة يجب أن يكون الجدول مرتبا.ما المميزات الحسنة للبحث الزوجي.
- قارن القيمة المبحوث عنها بالقيمة الموجودة في وسط الجدول،
- إذا كان التساوي بينهما يجب إيقاف البحث.
- إذا كانت القيمة المبحوث عنها أصغر من القيمة التي في الوسط، أكمل البحث في النصف الأول للجدول باستعمال القيمة التي في وسط هذا النصف.
- إذا كانت القيمة المبحوث عنها أكبر من القيمة التي في الوسط، أكمل البحث في النصف الثاني للجدول باستعمال القيمة التي في وسط هذا النصف.
- أنجز شفرة تمكن من البحت عن قيمة val لهذه الطريقة.
التمرين 7.13 اتحاد جدولين مرتبين
نعتبر جدولين A و B (ذي البعدين N و M على التوالي)، مرتبين تزايديا.
وحِّد عناصر الجدولين في جدول ثالث FUS لكن بالشكل التزايدي.
التمرين 7.14 الترتيب باستعمال القيمة القصوية.
صنف عناصر أو قيم الجدول A تناقصيا.
أظهر الجدول A بعد ترتيبه على الشاشة.
طريقة: استعمل الرمز I للمرور من أول الجدول إلى آخره. ولكل عنصر [A [i من الجدول، حدد الموقع PMAX لأول عدد تصادفه يكون أكبر من [A [i وبدل في هذه الحالة [A [i و [A [PMAX .
مثال :
التمرين 7.15 الترتيب بطريقة الفقاعات
صنف عناصر أو قيم الجدول A تزايديا.
أظهر الجدول A بعد ترتيبه على الشاشة.
طريقة: في كل مرة نبدأ من بداية الجدول، ونكرر هذه العمليات :
باستعمال التبديل المتتالي، نضع أكبر قيمة وجدناها في نهاية الجدول (كما يحدث لفقاعات البرك المائية).
مثال :
أكمل الخوارزم باعتبار أن :
* قد لا توجد أية تبديلة ، في هذه الحالة سيكون الجدول مرتبا.
* قد لا يوجد أي جزء من الجدول مرتبا.
أكتب شفرة تمكن من قراءة نقاط الامتحان لـ N تلميذ بقسم بحيث يتم تحفيظها في جدول يسمى POINTS ذي الرتبة N.
* ابحث وأظهر:
- أعلى نقطة في القسم.
- أدنى نقطة في القسم.
- المعدل العام يعني متوسط النقاط.
* من خلال جدول نقاط التلاميذ POINTS ، أنشئ جدول آخر يسمى NOTES ذي الرتبة 7 ومركب على الشكل التالي:
NOTES[6] |
تحتوي على العدد ذي النقطة 60 |
NOTES[5] |
تحتوي على العدد ذي النقاط من 50 إلى 59 |
NOTES[4] |
تحتوي على العدد ذي النقاط من 40 إلى 49 |
.... |
.... |
NOTES[0] |
تحتوي على العدد ذي النقاط من 0 إلى 9 |
أنجز إنشاء هندسيا للعوارض الممثلة للجدول NOTES. استعمل الرموز ####### لتمثيل العوارض وأظهرها في مجال النقاط .
مساعدة: حدد القيمة MAXN في الجدول NOTES و أظهر السطور على الشاشة بداية منه.
(في المثال الأسفل نعتبر MAXN = 6).
مثال :
La note maximale est 58
La note minimale est 13
La moyenne des notes est 37.250000
6 > #######
5 > ####### #######
4 > ####### ####### #######
3 > ####### ####### ####### #######
2 > ####### ####### ####### ####### #######
1 > ####### ####### ####### ####### #######
+-------+-------+-------+-------+-------+-------+-------+
I 0 - 9 I 10-19 I 20-29 I 30-39 I 40-49 I 50-59 I 60 I
جداول ذات بعدين "المصفوفات"
التمرين 7.17 : وضع العدد 0 في قطر مصفوفة.
أنجز شفرة تمكن من: | ملء مصفوفة مربعة . |
بعد ملئها ضع 0 مكان عناصر قطر المصفوفة. |
التمرين 7.18 : مصفوفة وحيدية.
أنجز شفرة تمكن من إنشاء مصفوفة مربعة وحيدية U ذات البعد N . المصفوفة الواحدية معرفة على الشكل التالي :
/ 1 , i=j |
|
| |
uij = |
\ 0 , i!=j |
التمرين 7.19 : مقلوب مصفوفة
أنجز شفرة تمكن من تحديد المقلوب tA لمصفوفة A ذات البعدين N و M على التوالي إلى مصفوفة ذات البعدين M و N على التوالي .
- بطبيعة الحال المصفوفة ذات البعدين M و N على التوالي (أي المصفوفة المقلوبة) تكون في جدول آخر B لإظهاره على الشاشة.
- المصفوفة المقلوبة B=tA معرفة على الشكل التالي :
/ \ / \
tA = t | a b c d | = | a e i |
| e f g h | | b f j |
| i j k l | | c g k |
\ / | d h l |
\ /
التمرين 7.20 : ضرب مصفوفة في عدد حقيقي
أنجز شفرة تقوم بضرب مصفوفةA في عدد حقيقي X.
مثال :
/ \ / \
| a b c d | | X*a X*b X*c X*d |
X * | e f g h | = | X*e X*f X*g X*h |
| i j k l | | X*i X*j X*k X*l |
\ / \ /
-
النتيجة المحصل عليها يجب أن تكون في جدول أو مصفوفة أخرى B لإظهارها على الشاشة.
-
جميع عناصر المصفوفة A يجب ضربها في X.
التمرين 7.21 : جمع مصفوفتين
أنجز شفرة تقوم بجمع مصفوفتين A و B لهما نفس البعدين N و M..
مثال :
/ \ / \ / \
| a b c d | | a' b' c' d' | | a+a' b+b' c+c' d+d' |
| e f g h | + | e' f' g' h' | = | e+e' f+f' g+g' h+h' |
| i j k l | | i' j' k' l' | | i+i' j+j' k+k' l+l' |
\ / \ / \ /
النتيجة المحصل عليها يجب أن تكون في مصفوفة أخرى C لإظهارها على الشاشة.
التمرين 7.22 : ضرب مصفوفتين
أنجز شفرة تقوم بضرب مصفوفة A ذات البعدين N و M في المصفوفة B ذات البعدين M و P للحصول على مصفوفة جديدة ذات البعدين N و P :
C(N,P) = A(N,M) * B(M,P)
ضرب مصفوفتين يتم بضرب سطر المصفوفة الأولى في عمود المصفوفة الثانية حسب العلاقة التالية:
تذكير :
/ \ / \ / \
| a b c | | p q | | a*p + b*r + c*t a*q + b*s + c*u |
| e f g | * | r s | = | e*p + f*r + g*t e*q + f*s + g*u |
| h i j | | t u | | h*p + i*r + j*t h*q + i*s + j*u |
| k l m | \ / | k*p + l*r + m*t k*q + l*s + m*u |
\ / \ /
التمرين 7.23 : مثلث الخوارزمي
أنجز شفرة تقوم بإنشاء مثلث الخوارزمي ذي الدرجة N وكذلك تقوم بحفظه في مصفوفة مربعة P ذات البعد N+1.
مثال : مثلث الخوارزمي ذي الدرجة 6.
1 |
n=0 |
||||||
1 |
1 |
n=1 |
|||||
1 |
2 |
1 |
n=2 |
||||
1 |
3 |
3 |
1 |
n=3 |
|||
1 |
4 |
6 |
4 |
1 |
n=4 |
||
|
1 |
5 |
10 |
10 |
5 |
1 |
n=5 |
1 |
6 |
15 |
20 |
15 |
6 |
1 |
n=6 |
الطريقة :
أحسب و أظهر فقط القيم كما هو واضح في المثال أعلاه .
حدد درجة المثلث للمستعمل بان لا تتجاوز 13.
أنشئ المثلث سطرا سطرا:
- هيئ الجدول بأن تكون العناصر الأولى للسطور وكذلك عناصر القطر تساوي 1.
- أحسب القيم المتبقية حسب العلاقة التالية : Pi,j = Pi-1,j + Pi-1,j-1
التمرين 7.24 : البحث عن النقاط السحرية
ابحث في مصفوفة A (تم إدخالها من طرف المستعمل) على الأعداد التي تكون في آن واحد هي الأكبر في سطرها والأصغر في عمودها. هذه الأعداد تسمى النقاط السحرية . أظهر على الشاشة مواقع وقيم جميع النقاط السحرية الموجودة .
مثال : القيم الملونة بالأحمر هي النقاط السحرية في هذه المصفوفات :
/ \ / \ / \ / \
| 1 8 3 4 0 | | 4 5 8 9 | | 3 5 6 7 7 | | 1 2 3 |
| | | 3 8 9 3 | | 4 2 2 8 9 | | 4 5 6 |
| 6 7 2 7 0 | | 3 4 9 3 | | 6 3 2 9 7 | | 7 8 9 |
\ / \ / \ / \ /
طريقة : استعمل مصفوفتين للمساعدة MAX و MIN لهما نفس بعد المصفوفة A ، بحيث :
/ 1 هي الأكبر A[i,j] إذا كانت) |
|
| ( i على السطر |
MAX[i,j] = |
\ 0 إذا كان عكس ذلك |
|
/ 1 هي الأصغر A[i,j] إذا كانت) |
|
| ( i على العمود |
MIN[i,j] = |
\ 0 إذا كان عكس ذلك |
تأليف
المؤلف الأصلي: فرديريك فابر (Frédéric FABER)
البريد الإلكتروني: عنوان البريد الإلكتروني هذا محمي من روبوتات السبام. يجب عليك تفعيل الجافاسكربت لرؤيته.
الموقع الإلكتروني: http://www.ltam.lu/cours-c
ترجمة بتصرف: محمد عبد الرحمان