1-9-3 المصفوفات متعددة الأبعاد Multidimensional Arrays :
لغة السى تدعم المصفوفات متعددة الأبعادا . عندما يتم إعلان مصفوفة متعددة الأبعاد , يجب أن نفكر فى أنها "كمصفوفة لمصفوفات " . يمكن بناء المصفوفات متعددة الأبعاد ليكون لها بعدين أو ثلاثة أو أربعة أو أكثر .
فيما يلى الشكل النموذجى لإعلان مصفوفة ذات بعدين :
فى الذاكرة يتم تخزين عناصر المصفوفة فى شكل صفوف متتابعة كما يلى :
كود:
two_d[0][0] , two_d[0][1] , two_d[0][2] , …. two_d[0][9] ,
two_d[1][0] , two_d[1][1] , two_d[1][2] , …. two_d[1][9] ,
two_d[2][0] , two_d[2][1] , two_d[2][2] , …. two_d[2][9] ,
two_d[3][0] , two_d[3][1] , two_d[3][2] , …. two_d[3][9] ,
two_d[4][0] , two_d[4][1] , two_d[4][2] , …. two_d[4][9] ,
عندما يتم تهيئة مصفوفة ذات بعدين تكون بنفس الشكل , تتابع الصفوف:
كود:
int matrix[3][4] = { 0,1,2,3,
4,5,6,7,
8,9,10,11 } ;
المصفوفات متعددة الأبعاد تكون مفيدة فى عمليات مثل حساب المصفوفات , والمرشحات , وجداول البحث .
لنفترض أن لدينا لوحة مفاتيح تليفون والتى تولد بيان بصفوف وأعمدة , أو "شفرة – مسح" , حينما يتم الضغط على مفتاح . يمكن استخدام مصفوفة ذات بعدين كجدول بحث kook–up-table لتحويل شفرة المسح لحروف أسكى ASCII الفعلية للمفتاح . سوف نفترض فى هذا المثال أن روتين الدالة getkeycode( ) يمسح المفاتيح ويحدد قيم الصف والعامود لبيان موقع المفتاح المضغوط . كود إجراء عملية التحويل قد يكون بالشكل التالى :
كود:
#include <16F877.h> //register definition file for
#fuses HS,NOWDT //a Microchip PIC16F877
#use delay(clock=10000000 //setup the RS232 port for standard output
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stream=RS232,bits=8)
#include <stdio>
#define TRUE 1
#define FALSE 0
char getkeycode(char *row , char *col);
// the getkeycode routine gets the key press and
// returns TRUE if a key is pressed , FALSE if not
/* look up table for ASCII values */
const char keys[4][3] = { '1' , '2' , '3' ,
'4' , '5' , '6' ,
'7' , '8' , '9' ,
'*' , '0' , '#' } ;
void main(void}
{
char row , col ;
char I ;
while(1) // while forever…
{
i = getkeycode( &row , &col);
// TRUE , if there was a key pressed
// and row and col contain whitch key
if( i == TRUE)
// only print the key value that is preassed
putchar( keys[row][col] ) ;
}
}
شكل آخر ,أكثر شيوعا, للمصفوفة ثنائية الأبعاد هو السلاسل النصية strings . المثال التالى يعلن عن مصفوفة سلاسل نصية مهيئة بأيام الإسبوع :
كود:
char day_of_week[7][10] = {
"Sunday" ,
"Monday" ,
"Tuesday" ,
"Wednesday" ,
"Ttursday" ,
"Friday" ,
"Saturday" } ;
فى المصفوفة المبينة أعلاه , السلاسل النصية بأطوال مختلفة . يضع المترجم صفر النهاية بعد آخر حرف فى السلسلة النصية بغض النظر عما يكون عليه مدى طول السلسلة النصية . الدوال مثل printf( ) تطبع السلسلة النصية حتى تقابل حرف صفر النهاية , لذلك فهى قادرة على السلاسل النصية للأطوال المختلفة بشكل صحيح .
للوصول إلى اليوم الرابع من الإسبوع وطباعة السلسلة النصية المصاحبة له , سوف نستخدم الدالة prinf( ) . الدالة printf( ) تتطلب عنوان الحرف الأول من السلسلة النصية :
كود:
prtntf("%s" , day_of_the_week[3][0] ) ; // prints Wednesday
اسم السلسلة النصية يعتبر عنوان أول حرف لهذه السلسة النصية . فقط ذكر أول بعد يشير بكفاءة لكامل السلسلة النصية مثل البعد الثانى . لذلك , يمكن الوصول لنفس السلسلة النصية بداخل المصفوفة كما يلى :
كود:
prtntf("%s" , day_of_the_week[3] ) ; // prints Wednesday
1-9-4 المؤشرات إلى الدوال :