មេរៀនទី៧: Array & Pointer

មេរៀនទី៨: Array & Pointer

I. Array : អថេរមួយអាចផ្ទុកបានតំលៃតែមួយគត់ នាំអោយ ដើម្បី ផ្ទុកតំលៃរបស់ស្វ៊ីតមួយ ឬតារាង មួយបានលុះត្រាតែយើង ប្រើច្រើន អថេរ ក៏ប៉ុន្ដែនៅពេលនោះវាមានលក្ខណៈសμុគសμាញខ្លាំង ណាស់។ ដូច្នេះដើម្បីជៀសវាងការ ប្រកាសអថេរច្រើន ដូចករណី ខាងលើ នោះគេប្រើ Array វិញ។
I.1. អ្វីទៅជា Array : Array   គីជាឈេμាះនៃសំនុំមួយដែល មាន ច្រើនធាតុ   និងធាតុនីមួយៗរបស់វាមាន ប្រភេទទិន្នន័យដូចគ្នា និងអាច ផ្ទុកបានតំលៃមួយរៀងៗខ្លួន។ ការប្រកាស Array ដើម្បីប្រើ ក៏មាន លក្ខណៈដូចការប្រកាសអថេរធមμតាដែរ តែត្រូវចាំថា  ប្រភេទ ទិន្នន័យរបស់ Array គឺជាប្រភេទទិន្នន័យរបស់ធាតុនីមួយៗនៃ Array។ Array ត្រូវបានប្រកាសតាមទំរង់ដូចខាងក្រោម ៖

ប្រភេទទិន្នន័យ   ឈេμាះរបស់ Array [ចំនួនធាតុរបស់ Array]; Datatype        VariableName[size of array];

ការប្រកាស Array អាចមានច្រើនវិមាត្រ អាស្រ័យទៅតាមដំរូវការ។ ដើម្បីស្វែង យល់អំពីវិមាត្ររបស់ Array ចូរពិនិត្យមើលឧទាហរណ៍ ខាងក្រោម ៖

int  a[10],  b[4][2];
float  x[5],  y[3][3];

ខាងលើនេះជាការប្រកាស Array ចំនួន  4 គឺ a, b, x, y ដែលមាន អត្ថន័យដូចខាង ក្រោម ៖

–     ចំពោះ  Array ទី 1 មានប្រភេទទិន្នន័យជា int, ឈេμាះ a, ចំនួនវិមាត្រគឺ 1, ចំនួនធាតុគឺ 10។

Array a មានធាតុ  10 គឺ a[0], a[1], a[2],…, a[9] ដែលធាតុ នីមួយៗនេះ នឹងត្រូវបានគេប្រើសំរាប់ផ្ទុកតំលៃមួយដែលមានប្រភេទ ជា int។ ដូច្នេះ  Array a ពេលនេះអាចផ្ទុកបាន 10 តំលៃប្រភេទ int។

–     ចំពោះ  Array ទី 2 មានប្រភេទទិន្នន័យជា int, ឈេμាះ  b, ចំនួនវិមាត្រគឺ 2, ចំនួនធាតុគឺ 4

គុណនិង   2   សេμី    8   (វិមាត្រទីមួយគុណជាមួយវិមាត្រទីពីរ)។   Array   b   មាន    8

ធាតុដូចខាងក្រោមគឺ ៖

b[0][0] b[0][1] b[1][0] b[1][1] b[2][0] b[2][1] b[3][0]         b[3][1]

ដែលធាតុនីមួយៗរបស់ b គឺ b[i][j] អាចផ្ទុកបានតំលៃមួយមាន ប្រភេទជា int។ ដូច្នេះ  Array b

អាចផ្ទុកចំនួនគត់ int បានចំនួន 4 ជួរដេក  និង 2 ជួរឈរ។

–     ចំពោះ    Array   ទី   3   មានប្រភេទទិន្នន័យជា    float,   ឈេμាះ        x,   ចំនួនវិមាត្រគឺ   1,

និងចំនួនធាតុមាន   5   គឺ    x[0],   x[1]…,x[4]។   ធាតុនីមួយៗ     x[i]   អាចប្រើសំរាប់ ផ្ទុកតំលៃប្រភេទទិន្នន័យជា    float    ដូច្នេះ     Array    x    ពេលនេះអាចផ្ទុកបានចំនួន   5

តំលៃចំនួនពិត float។

–    ចំពោះ    Array   ទី   4   មានប្រភេទទិន្នន័យជា    float,   ឈេμាះ        y,   ចំនួនវិមាត្រគឺ   2,

និងចំនួនធាតុមាន 9 គឺ ៖

y[0][0]    y[0][1]     y[0][2] y[1][0]     y[1][1]     y[1][2] y[2][0]   y[2][1]      y[2][2]

ពេលនេះ ធាតុនីមួយៗរបស់ y គឺ y[i][j] អាចផ្ទុកបានមួយតំលៃប្រភេទ float ដូច្នេះ  Array

y ទាំងមូលអាចផ្ទុកបានចំនួន 9 តំលៃចំនួនពិត float។

I.2. ការប្រើប្រាស់ Array :ដើម្បីយល់អោយបានច្បាស់អំពីការប្រើប្រាស់ Array យើងពិនិត្យ មើលឧទាហរណ៍ ខាងក្រោម  ៖
I.2.1. បញ្ចូលតំលៃ និង   អានតំលៃពី Array : Ex1:  Read បណ្ដាតំលៃទៅអោយ Array x ពី Keyboard

# include <stdio.h>

# include <conio.h>

# define SIZE 5 main ( )

{ int x [SIZE];

int i ;

for ( i = 0; i <=SIZE – 1; i ++ )

{ printf ( “x[%d] =”, i ); scanf (“%d”,&x[i]);

}

/* display Array on screen */ printf (“\n Display Array x : ”); for ( i =0; i <= SIZE –1; i ++)

printf ( “\n x[%d] = %d”, i, x[i]);

getch ( );

return (0);

}

x[0] = 12 x[1] = 34 x[2] = 56

Display Array x: x[0] = 12 x[1] = 34 x[2] = 56

ចំណាំ ៖ ការសរសេរកន្សោម <= SIZE – 1 និង < SIZE ក្នុង Loop for នោះមានន័យដូចគ្នា ។ យើងអាចសរសេរ Access data ទៅអោយ x នៅលើបន្ទាត់តែមួយបាន ៖

# include <stdio.h>

# include <conio.h>

# define SIZE 5 main ( )

{     int x[SIZE];

int i;

printf (“\n Enter Value into Array on the one line :”);

for ( i = 0; i <SIZE ; i ++)

{ scanf (“%d”, &x[i]); }
printf (“\n Display Array on screen : ”);

for ( i = 0; i <SIZE; i ++ )

printf (“\n x[%d] = %d”; i, x[i]);

getch ( );

retune (0);

}

Enter Value into Array on one line :

12         34         56

Display Array on screen :

x[0] = 12 x[1] = 34 x[2] = 56

Ex2: បូក One dimensional Array : C = A + B

# include <conio.h>

# include <stdio.h>

# define SIZE 5 main ( )

{     int A[SIZE], B[SIZE], C[SIZE];

int i; clrscr ( );

for ( i = 0 ; i <= SIZE – 1 ; i ++ )

{   printf (“A[%d] =”, i);

scanf (“%d”, &A[i]);

}

for ( i = 0; i <SIZE; i ++ )

{   printf (“\n B[%d] =”, i);

scanf (“%d”, &B[i]);

}

for ( i = 0; i <SIZE ; i ++ )

{ C[i] =A[i] + B[i] }

getch ( );

return (0);

}

I.2.2. កំណត់តំលៃអោយ  Array ជាមុន ៉

Array អាច Create Value អោយវាបាននៅពេលយើង Declaration :

int x[3] = { 7, 4, 5 } ;

មានន័យថាពេលយើង Declaration, នោះយើងតាងបណ្ដាតំលៃ អោយ Array តែម្ដង

x[0] = 7; x[1] = 4; x[2] = 5 ;

I.2.3. Array នៃ  Characters : បីប្រភេទ Declaration ខាងក្រោមនេះសមមូលនឹងគ្នា ។

char     text1 [5] = { ‘D’, ‘C’, ‘f’, ‘s’, ‘p’ };

char     text2 [5] = DCfsp”;

char     text3 [  ] = DCfsp”;

text[0] = ‘D’; text[1] = ‘C’; text[2] = ‘f’; text[3] = ‘s’; text[4] = ‘p’;

តែ Tucbo C ក៏ប្រើ Declaration Array of character ដូចគ្នានិង array of string  ។  string ក្នុង turbo C ត្រូវបាន បញ្ចប់ដោយ ធាតុចុងក្រោយមានតំលៃសេμី Character NULL, ជា character ដំបូងមាន Code = 0 in ASCII Table, ត្រូវតាងក្នុង Turbo C ដោយ សញ្ញា ‘\0’ ។ ដូច្នេះ text1, text2 មានគ្រប់លμម  ៥កន្លែងសំរាប់ 5 characters, ដូច្នេះនៅខ្វះមួយកន្លែងទៀតអោយ ‘\0’,

ដូច្នេះត្រូវ សរសេរឡើងវិញ

char     text1 [6] = { ‘D’, ‘C’, ‘f’, ‘s’, ‘p’ };

char     text2 [6] = DCfsp”; បើមិនចង់រាប់ទេចូល Declaration: char text3[ ] = “DCfsp”

Computer ផ្ដល់អោយយើង ៦ន្លែង, ៥កន្លែងសំរាប់ Characters និង ១កន្លែងសំរាប់សញ្ញា ‘\0’ ។

Ex3: Convert string ពីអក្សរតូចទៅអក្សរធំ ៖

# include <stdio.h>

# include <conio.h>

# include <ctype.h>

# define SIZE 80 main ( )

{

char text [SIZE];

int count;

for (count = 0; count <= SIZE –1; count ++ )

text[count] = getchar ( );

for (count = 0; count < SIZE; count ++ )

putchar (toupper (text[count]));

getch ( );

return (0);

}

 Ex4: រាប់ Characters:

ឧបមាយើងចង់រាប់ក្នុង  ១០០ដងនៃការចុចបញ្ចូល Character  ពី  Keyboard, ចំនួនលេចចេញនៃបណ្ដា character ពី ‘A’ ដល់ ‘Z’ មានប៉ុន្នាន ? Variable count ត្រូវបាន Declaration ខាងក្រោមនេះ

# include <stdio.h>

# include <conio.h>

# include <ctype.h>

# define SIZE 80 main ( )

{     char text[SIZE];

int i, count[‘Z’ – ‘A’ + 1];

clrscr ( );

for ( i = 0; i <SIZE; i ++ )

text [i] = toupper (getchar ( ) );

for ( count = 0; count <SIZE, count ++ )

putchar (text [count] );

for ( i = 0; i < ‘Z’ – ‘A’ + 1; i ++)

count [i] = 0;

for (i = 0; i < SIZE; i ++)

{ printf (“%d”, count [text [i] – ‘A’] );

count [text [i] – ‘A’] ++;

printf (“%d”, count [text [i] – ‘A’]); }

for ( i = ‘A’; i <= ‘Z’; i ++)

if (count [i – ‘A’] )

printf (“\n number of characters %c = %d”, i, count[i – ‘A’]);

getch ( );

return (0);

}

Note:   កមμវិធីខាងលើបើយើង  Run  កមμវិធីនោះយើងត្រូវ  Input  character រហូតដល់ 80  character

ទើបឈប់។ ដូចេμះ យើងគប្បីសរសេរកមμវិធីដោយអោយ Read character រហូតដល់ជួប Enter ទើបឈប់ ។

I.3. តំរៀប   Arrayការ Sort ធាតុ Array តាមលំដាប់កើន ឬចុះ មានសារៈសំខាន់ ក្នុង ការគណនា Array   ។   នេះជា Algorithm ដែលត្រូវរៀន ។ ខាង ក្រោមនេះនឹងអធិប្បាយពីរបៀបរៀបបណ្ដាធាតុរបស់ Array តាមឧទាហរណ៍ ៖

Ex5: Sort Array

# include <stdio.h>

# include <conio.h>

# include <math.h>

# define SIZE 5 main ( )

{     int x[SIZE];

int i, j, temp;

for ( i = 0; i <= SIZE –1; i ++ )

{   printf (“x[%d] = ”, i);

scanf (“%d”, &x[i]);

}

/* sort Array */

for ( i = 0; i < SIZE –1; i++)

for ( j = i +1; j < SIZE; j++ )

{   if (x [i] > x [j])

{   temp = x[i]; x [i] = x [j]; x [j] = temp

}

}

printf (“\n The Array After Sort: ”);

for (i =0; i < SIZE – 1; i++)

printf (“%7d”, x[i]);

getch ( );

return (0);

 

}

លទ្ឋផល Run program :

x[0] = -1 x[1] = 456 x[2] = 34 x[3] = -312 x[4] = -56

The Array After Sort :

ខាងក្រោមនេះជាកមμវិធី Sort Array ត្រូវបានសរសេរក្រោមរាង Function :

Ex6:

# include <stdio.h>

# include <conio.h>

# include <math.h>

# define SIZE 5

void Sort_Array ( int n, int x [ ] );

main ( )

{     int x[SIZE]

int i;

for ( i =0; i <SIZE; i++)

{   printf (“x[%d] = ”, i);

scanf (“%d”, &x[i] );

}

Sort_Array (size, x);

printf (“\n Array x : ” ); for ( i =0; i <Size; i++ ) printf (“%7d”, x[i] );

getch ( );

return (0);

}

void Sort_Array (int n, int x [ ] )

{     int temp, i, j;

for ( i =0; i < n – 1; i++)

for (j = i + 1; j < n; j++ )

{   if (x[i] > x[j] )

{      temp = x[i]; x[i] = x[j]; x[j] = temp;

}

}

return ;

}

ក្នុងឧទាហរណ៍ខាងលើយើងឃើញរបៀបបញ្ជូន Parameter ជា Array អោយទៅ Function ។ នៅពេល Declaration Function, យើងគ្រាន់តែបញ្ជូន Declaration Array ដែលមាន [ ] ដើម្បីបញ្ចូល Address ។ បើយើងបញ្ជូន Array មាន Index នោះមិនមែនជា Address គឺជា Value .

void Sort_Array (int n, int x[ ]) ;

នឹងពេល Call Function, យើងគ្រាន់តែបញ្ជូនឈេμាះ Array ប៉ុណ្ណោះ Sort_Array (size, x);

II. Pointer និង Linking with Array :

–   ចំនុចដែលត្រូវយកចិត្ដទុកដាក់ក្នុងឧទាហរណ៍ខាងលើគឺ ក្រោយពី Call Function Sort_Array, statement ដែល print លទ្ឋផល មកលើ Screen ស្ថិតនៅខាងក្រៅ Function Sort_Array   (ក្នុង main Function) តែនៅតែ print ត្រូវ ។  យើងដឹងថា parameter ដែលបញ្ជូនអោយ Function Sort_Array ជា Value parameter ។ តាមពិតចង់ print ត្រូវ យើងត្រូវតែសរសេរ statement ដែល print លទ្ឋផលនោះនៅក្នុង Function Sort_Array តែម្ដង ។នោះគឺដោយ សារតែឈេμាះ  Array ជា Address, បានន័យថា pointer point ទៅធាតុតំបូងរបស់ Array ។ ការយល់ពី អត្ថន័យរបស់ Array ក្នុង C ទាមទាអោយយើង ត្រូវមានគំនិតមូលដ្ឋានអំពី Pointer ។ យើងប្រើ បណ្ដាសញ្ញា Operator pointer និង Address ដូចខាងក្រោម ៖

* p ជាទិន្នន័យដែលផ្ទុកក្នុង Address p, និយាយមួយរបៀបទៀត p ជា memory ផ្ទុក address របស់ *p ឬជា Pointer point ទៅ Variable ផ្ទុកតំលៃ *p ។ &x ជា Address របស់ Variable x ។ pointer ជា Variable ផ្ទុក Address, គμានផ្ទុកតំលៃទេ ។ ឧបមាយើង Declaration variable x, p និង assignment ដូចខាងក្រោម ៖

int x = 15;     /* x ជា Variable មានតំលៃ = 15 */

int *p;          /* Declaration ទិន្នន័យជាចំនួនគត់មាន address គឺ p */

p = &x ;       /* p ទទួលតំលៃ address របស់ x */

ដំបូង pointer p គμាន Value ទេ, តែក្រោយពេលមាន assignment   p = &x នោះ p និង point ទៅ x ។ ពេលនោះ Pointer ជា Variable ផ្ទុក តំលៃ Address នៃ memory របស់ x ។ ហើយ p ខ្លួនឯងក៏មាន address   ផ្ទាល់របស់ខ្លួន   ដែរគឺ    &p  ។   តែ    address   របស់   p    យើងមិនយកចិត្ដទុកដាក់ទេ, តែយើងគិតទៅដល់ អត្ថន័យ memory គឺ address p ។ ចូរពិនិត្យរូបខាងក្រោម ៖ ។ ចូរយក ចិត្ដទុកដាក់អត្ថន័យ F0F4, គឺជាតំលៃសរសេរក្រោមរាង Hexa, សមមូលនិង  2 bytes ។ អ្នកមិនចាំបាច់ខ្វល់គិតថា តំលៃនោះ ប៉ុណ្ណា ទេក្នុងលេខគោលដប់ ។ ចំពោះ variable  p នោះ F0F4 ជាតំលៃ របស់ p ។ ចំពោះ x, វាជា address គឺ &x ។
C C++បើចង់ p ជា pointer point to variable x, ក្នុង program យើងត្រូវ Assignment p = &x; រំលឹកឡើងវិញបណ្ដាបញ្ហាដែល មានទំនាក់ ទំនងជាមួយ Array : ជាមួយ Declaration :

int x[SIZE];

នោះតាមពិត x ជា address នៃធាតុតំបូងរបស់ Array ។ យើងអាច សរសេរ x សមមូល នឹង &x[0]

Note : ចូលចំណាំចំនុចមួយគឺ មានតែឈេμាះរបស់  Array ទេដែលមានតំលៃ address, ពោលគឺ pointer ។ ចំណែកពេល  សរសេរធាតុរបស់  Array,  នោះឈេμាះរបស់  Array  ជាមួយ សញ្ញា  [  ]  ដែលមាន  Index, នោះវាជា Variable មួយ, មានន័យថា x ឬ x[ ] ជា variable pointer ចំណែក x[0], x[1] ជា Variable

ធមμតាវិញ ។

Ex: ពិនិត្យតំលៃបណ្ដា pointer

# include <stdio.h>

# include <conio.h>

main ( )

{     int  number ; int *pointer ; number = 10;

printf (“\n Address of number : %p”, &number );

printf (“\n value of number : %d”, number);

pointer = &number;     /* pointer point to number */

printf (“\n Address of pointer : %p”, &pointer );

printf (“\n value of pointer : %p”, pointer );

printf (“\n value have point to is : %d”, *pointer);

getch ( );

return (0);

}

The Result on screen :
Address of number : 8 EEA : OFFE Value of number :  10
Address of pointer : 8EEA : OFFA Value of pointer : 8EEA : OFFE Value have point to is : 10

&number number &pointer pointer

* pointer

+ format សំរាប់ print pointer គឺ %p ។

Ex : របៀប Declaration និងប្រើប្រាស់ pointer :

static char  *msg = “rose”;

C នឹងផ្ទុក String នៅក្នុង Array រួមមាន៥ធាតុ ។ ជាមួយនោះ C ក៏រៀបចំ memory ដើម្បីផ្ទុក pointer msg ។ pointer នេះនឹងត្រូវបានចាត់ទុកដូចជា Variable មួយ, ដូច្នេះវាក៏អាចប្រែប្រួលតំលៃបាន ។ ចូលពិនិត្យ Looping ខាងក្រោម ៖

while ( *(msg) != ‘\0’)

putchar (* (msg++));

ជាមួយ Declaration

Void Sort_Array (int n, int x[ ]);

យើងយល់ថា  parameter x[ ] ជា Address របស់ Array x, គឺជា Address នៃធាតុតំបូងរបស់  Array ។ Address នេះមុននិងក្រោយ Function Sort_Array ( ) អនុវត្ដន៍, វាមិនប្រែប្រួល ។   Function នឹងធ្វើអោយប្រែ ប្រួល អត្ថន័យផ្ទុកត្រង់ Address   x, មិនមែន ធ្វើ អោយ ប្រែប្រួល Address x ទេ ។ ចូរពិនិត្យបណ្ដាឧទាហរណ៍ ខាង ក្រោម ៖

Ex 10:

# include <stdio.h>

# include <conio.h>

main ( )

{     int Array [4], *ptr1, index;

float Value [4], *ptr2;

ptr1 = Array;

ptr2 = Value;

for (index = 0; index < 4; index ++ )

printf (“base + %d : %10d %10d \n”, index, ptr1 + index, ptr2 +index );

getch ( );

return (0);

}

លទ្ឋផលនឹង print មកពី Screen ដូចខាងក្រោម ៖

base + 0 : ^^^^^ 12345 ^^^^^ 31890

base + 1 : 346 913
base + 2 : 36 345
base + 3 : 28934 12891

ជាមួយ Declaration :

float value[4] , *ptr2;

Note:   យើងដឹងថា Value (array ផ្ទុក Value ) ជា Array មាន ៤ធាតុហើយ Value ជា Address របស់ធាតុតំបូង ។  *ptr2 មាន ន័យ ថា ptr2 ជា pointer point ទៅ float, *ptr2 ជា Variable មាន ប្រភេទ float, ត្រូវបានផ្ទុកក្នុង memory, មាន Address គឺ ptr2 ។ ឈេμាះ Array អាចសរសេរដោយគμានសញ្ញា [ ]

បាន, នោះគឺ Address នៃធាតុតំបូង ។

ptr1 = Array;    /*ptr1 point to Array */

+ មានចំនុចមួយដែលត្រូវយកចិត្ដទុកដាក់, គឺ ក្នុង Turbo C, Variable pointer ត្រូវកើនឡើង ១ និងមិន កើនតំលៃ Address ឡើង១ទេ, តែវា កើនឡើងទំហំសមមូលនឹងទំហំទិន្ឋន័យដែលវា point ទៅនោះ។ បើ យើង សរសេរ ptr2++ នោះវានិងកើនឡើង ៤ ព្រោះប្រភេទ float មាន ទំហំ 4 byte ។ ក្នុងឧទាហរណ៍ខាងលើ ៖

Array + 2 = = &Array[2]

*(Array +2) = = Array[2]

 ប្រមាណវិធីអនុវត្ដន៍ជាមួយ pointer :

មានតែប្រមាណវិធីខាងក្រោមទេដែលអនុវត្ដន៍ជាមួយ pointer បាន ៖

– ប្រមាណវិធី Assignment (=)

–     ប្រមាណវិធីប្រៀបធៀប (= =) ឬ ( != )

+  ប្រមាណវិធីកើនថែម Address : ដូចក្នុងឧទាហរណ៍ខាងលើ យើងមានប្រមាណវិធីគណនា Array + 2 នោះគឺ យើងត្រូវ យល់ ថាប្រមាណវិធីកើនថែម Address, ឡើង២ធាតុទៀត, គឺមិនមែនកើន Value ឡើង 2ទេ។

+   បណ្ដាតំលៃរបស់ Variable pointer, មិនអាច Read   from Keyboard បានទេ ។ តែយើងអាច Print វាមក លើ Screen ដោយត្រូវ Format %p ។

Constant NULL : NULL ជាតំលៃ Const ពិសេសមួយប្រើអោយ បណ្ដា Variable pointer ហើយវាត្រូវបានប្រើដើម្បីបញ្ជាក់ថា គμាន point ទៅណាទាំងអស់  ។ NULL អាចតាងអោយគ្រប់ Variable ប្រភេទ pointer បានទាំងអស់ ។ NULL ជា pointer ពិសេសមួយ ផ្ទុកតំលៃ ០ ។ ឧទាហណ៍ Declaration NULL ដូចខាងក្រោម ៖

int n = 0, *pn = NULL;

 III. Array  ច្រើនវិមាត្រ  (Multidimensional Array) :

Multidimensional Array, ជា Array ដែលមានបណ្ដាធាតុច្រើន Rows, ច្រើន Columns។ Ex:   int x[3] [5]; បានន័យថា Array ផ្ទុកបណ្ដាចំនួនគត់, មាន 3 Rows, 5Colunm ។ បណ្ដាធាតុ Array ត្រូវបានកំណត់

Index ដូចរូបខាងក្រោម ៖
C C++Ex: Access ធាតុ Array x[1,3]; x[i +1, J +3] … Ex: Declaration Array ផ្សេង

float x [3] [5];

char x [3] [5];

 បង្កើនតំលៃអោយ Multidimensional Array : Multidimensional Array អាចបង្កើតតំលៃដំបូងបាន ។ Ex:  int x[3,2] = {(1,2), (3,4), (5,6) };

int x[3,2] = {1, 2, 3, 4, 5, 6};

បណ្ដាឧទាហរណ៍ ៖

Ex1: program គុណ matrix ការ៉េពីជាមួយគμា ៖

C = A * B

បណ្ដាធាតុនៃ Array C, ត្រូវគណនាតាមរូបមន្ដ ៖

n

Cij  = ∑ Aik  * Bkj

k =1

# include <stdio.h>

# include <conio.h>

# include <math.h>

# define N 3 main ( )

{     int i, j, k;

int A[N][N],B[N][N], C[N][N];    /* Matrix */

/* Read data into Array A */

for (i = 0; i <N; ++i)

for ( j = 0; j < N; j++)

{   printf (“A[%d, %d] =”, i, j );

scanf (“%d”, &A[i][j]);

}

/* Read data into Array B */

for ( i = 0; i < N; i++)

for ( j = 0; j < N; j++)

{   printf (“B[%d, %d] =”, i, j );

scanf (“%d”, &B[i][j]);

}

/* C = A * B */

for ( i = 0; i < N; i++ )

for ( j = 0; j < N; j++)

{   C [i][j] = 0;

for ( k = 0; k < N; k++ )

C [i][j] = C [i][j] + A[i][k] * B[k][j];

}

/* Display Result on screen */

for ( i = 0; i < N; i++ )

{   for ( j = 0; j < N; j++ ) printf (“%4d”, C [i][j]); printf (“\n”);

} getch ( ); return (0);

}

Note:  របៀបម្យ៉ាងទៀតយើងមិនចាំបាច់ Read data into matrix ទេ, ចូរពិនិត្យកំណាត់កមμវិធីខាងក្រោម យើង បង្កើតចំនួន Random ហើយតាងចំនួន Random ទាំងនោះទៅអោយធាតុ Matrix :

for ( i = 0; i < N; i++ )

for ( j = 0; j < N; j++ ) A[i] [j] = rand ( );

ក្នុងនោះ Function rand ( ) ជា Function បង្កើតចំនួន Random ។

Ö     កមμវិធីខាងលើយើង Declaration N = 3, យើងអាចប្រែប្រួលតំលៃរបស់ N បាន ។

Ex 2: បូកពីរ Matrix ជាមួយគ្នា ៖

C = A + B

យើងប្រើរូបមន្ដ ៖  C[i][j] = A[i][j] + B[i][j]

ឧទាហរណ៍នេះអធិប្បាយរបៀបផ្សេងក្នុងពេលសរសរេកមμវិធី, គឺរបៀបដែលមានលក្ខណៈគ្រប់គ្រាន់ជាងមុន ។

ដោយរបៀបខាងក្រោម ៖

–     Matrix A និង B ត្រូវមានធាតុដូចគ្នា ៖ (Rows <= 20, Column <= 30 )

–     Read Value into Array

–     Display the Result on screen

# include <stdio.h>

# include <conio.h>

# define Max_Row 20

# define Max_Column 30

void read_input ( int a[ ][Max_Column], int num_Row, int num_Col );

void Sum (int a[ ][Max_Column], int b[ ][Max_Column], int c[ ][Max_Column], int num_Row, int num_Col );

main ( )

{     int numRow , numCol ;

int   a[Max_Row][Max_Column],b[Max_Row][Max_Column], c[Max_Row][Max_Column];   printf   (“Number   of   Rows   :”);   scanf   (“%d”,

&num_Row );

printf (“Number of Column :”); scanf (“%d”, &num_Col);

printf (“\n\n Array A :\n”);

read_input (a, num_Row, num_Col );

printf (“\n\n Array B :\n”);

read_input (b, num_Row, num_Col ); sum (a, b, c, num_Row, num_Col ); printf (“\n\n sum of 2 matrix : \n\n”);

write_output ( c, num_Row , num_Col); getch();

}

*/ Function Read Array integer */

void read_input (int a[ ][Max_Col], int m, int n)

{     int i, j;

for (i = 0; i <m; i++)

{   printf (“\n please input data %2d \n”, i + 1);

for ( j = 0; j <n; ++j)

scanf (“%d”, &a[i][j] );

}

return ;

}

/* Calculate sum of to Array intege */

void sum ( int a[ ][Max_Column], int b[ ][Max_Column], int c[ ][Max_Column], int  m, int n)

{     int i, j;

for ( i = 0; i , m; i++)

for (j = 0; j < n; ++j )

c[i][j] = a[i][j] + b[i][j];

return ;

}

/* Display the Result on screen */

void write_output ( int a[ ][Max_column], int m, int n)

{     int i, j;

for ( i = 0; i <m; i++ )

{     for ( j = 0; j <n; ++j ) printf (“%4d”, a[i][j] ); printf (“\n”);

}

return ;

}

ឧបមាយើងត្រូវបូក 2 Matrix :

Matrix A                                         Matrix B

1 2 3 4

10

11 12 13
5 6 7 8

14

15 16 17
9 10 11 12

18

19 20 21

នោះវានិង Display the result on screen

លំហាត់

បណ្ដាលំហាត់ខាងក្រោមគប្បីសរសេរជា Function :

1)  សរសេរកមμវិធី ដោះស្រាយប្រព័ន្ឋសមីការខាងក្រោមៈ

a11 . x + a12 . y = C1

a21 . x + a22 . y = C2

2) សរសេរកមμវិធី បង្កើតតារាងមេលេខគុណ

3)  បង្កើត Matrix X[1..10] [a..10]

a.   សរសេរកមμវិធីបង្កើត 1០០ តំលៃ Random ស្ថិតនៅបន្លោះតំលៃពី 1..10 ។

b.   គណនាផលបូកនៃបណ្ដាធាតុស្ថិតនៅលើអង្កត់ទ្រូង

c.   គណនាផលបូកការេនៃបណ្ដាលេខនៅលើ Column គូ

d.   គណនាផលបូក រឺសការ៉េនៃបណ្ដាលេខនៅលើ Column សេស

e.   តើមានប៉ុនμានធាតុនៃ Array, ដែលមានតំលៃស្ថិតនៅចន្លោះ 4..6

4) សរសេរកមμវិធីគណនាផលបូកការ៉េនៃបណ្ដាចំនួនអវិជ្ជមានក្នុង Array Integer ។

5) សរសេរកមμវិធីរកចំនួនធំបំផុត និងចំនួនតូចបំផុតនៃ Array R ដែលមានចំនួន ១៥ចំនួនពិត ។

6 )   សរសេរកមμវិធីដោះស្រាយប្រព័ន្ឋសមីការខាងក្រោម ៖

A11 . X + A12 . Y + A13 .Z = U1 ; A21 . X + A22 . Y + A23 .Z = U2 ; A31 . X + A32 . Y + A33 .Z = U3 ;

7 ) សរសេរកមμវិធីដោយប្រើ Sub-program, គុណ Matrix និង Matrix

–     Matrix A មានធាតុ ៖ N * L

–     Matrix B មានធាតុ ៖ L * M

–     Matrix C មានធាតុ ៖ N * M

8) សរសេរកមμវិធីធ្វើការងារខាងក្រោម ៖

a.   Read បញ្ចូល N ចំនួនគត់ពី Keyboard, N>5  ។ មាន Path ច្បាស់លាស់ក្នុងពេល Read ។

b.   រៀបបណ្ដាលេខដែលមានតំលៃធំជាង ១០ទៅខាងដើម ។

c.   ចូរលុបធាតុទី៣ របស់ Array និងធាតុទី n ។ សរសេរលទ្ឋផលមកលើ Screen

9) សំនួរបន្ថែម ៖

1) តើត្រូវការប៉ុនμាន byte សំរាប់ប្រើអោយការ Declaration ដូចខាងក្រោម ៖

char ch [ ] = “A”;

a. 0
b. 1
c. 2
d. 3

10) តើត្រូវការប៉ុនμាន byte សំរាប់ប្រើអោយការ Declaration ដូចខាងក្រោម ៖

char ch [ ] = “A”;

a. 0 b. 1 c. 2 d. 3

11) បន្ទាត់ទីពីរនៃលទ្ឋផលក្រោយពីយើង Run program :

# include <stdio.h>

main ( )

{     static char msg [ ] = “Hello!” ;

char * msgptr; msgptr = msg; puts (++msg); puts (msg);

msg [3] = ‘\0’;

puts (msg);

}

a.   Hello

b.   Welcome c.   ch

d.   គμាន  a, b, c. កមμវិធីមានកំហុស

12) បន្ទាត់តំបូងនៃលទ្ឋផលរបស់មμវិធីខាងក្រោម ៖

# include <stdio.h>

main ( )

{     static char msg [ ] = “Hello!”

char * msgptr;

msgptr = msg + strlen (msg);

while ( – – msgptr >= msg )

puts (msgptr );

}

a.   0 b.  lo c.       H

d.   គμាន  a, b, c. កមμវិធីមានកំហុស

13) ក្នុងកមμវិធីខាងក្រោម, តើមានប៉ុនμាន byte ប្រើអោយការ Declaration ខាងក្រោម ៖

char  *ptr = “C”;

a. 0 b. 1

c. 3 ( 1សំរាប់ pointer, 2 សំរាប់ data )

d. 4( 2 សំរាប់ pointer, 2 សំរាប់ data )

 14) តើតំលៃរបស់ *ptr ក្នុងឧទាហរណ៍ខាងក្រោម ៖

char *ptr;

static char msg[ ] = “Test”;

ptr = msg [0];

a.   មិនកំណត់បាន

b.   T

c.   Address របស់ character ដំបូង

d.   គμានចំលើយណាត្រឹមត្រូវទេ

15) តើតំលៃរបស់ *(ptr + 2) ក្នុងឧទាហរណ៍ខាងលើ

a.   មិនកំណត់បាន

b.   T

c.   Address របស់ character ដំបូង

d.   s

16) Declaration ptr ជា pointer នៃ Array 20 character

a.    char ptr[20];

b.    char (*ptr) [20];

c.    *(ptr[20]);

d.    គμានចំលើយណាត្រឹមត្រូវទេ

17) Declaration ជា Array នៃ 20 pointer point to Array

a.    char ptr [20];

b.    char (*ptr)[20];

c.    *(ptr [20]);

d.    គμានចំលើយណាត្រឹមត្រូវទេ
18)   សញ្ញាណាជាធាតុទី៣ របស់ Array msg ដែលមាន 4 characters a.        msg [3]

b.   msg [2] c.       *msg [3] d.   msg [4]

19) សញ្ញាណាជា pointer របស់ធាតុទី៣ របស់ Array msg មាន 4 characters a.        *(msg + 3)

b.   *(msg + 2)

c.   *msg + 3 d.   *msg + 2

20)  បើមាន Declaration ដូចខាងក្រោម ៖

char msg [10];

char value;

តើឃ្លាខាងក្រោមណាមួយដែលត្រឹមត្រូវ ?

a.   msg [2] = Value;

b.   msg = Value;

c.   ឃ្លាទាំងពីរខាងលើត្រឹមត្រូវ

d.   គμានចំលើយណាត្រឹមត្រូវ

21) បើមាន Declaration ដូចខាងក្រោម ៖

char *ptr; char [10]; char Value;

ឃ្លាខាងក្រោមនេះត្រឹមត្រូវ ៖

a.   ptr = Value;

b.   ptr = msg;

c.   ឃ្លាទាំងពីរខាងលើមិនត្រឹមត្រូវ

22) Pointer point to array មាន 3 character គឺ ៖

a.   (*ptr) [4]; b.   (*ptr) [3]; c.    (*ptr [4]); d.   (*ptr [3]);

 

23) តំលៃលទ្ឋផលជាមួយ

static char msg [ ] = “Test”;

printf (“%d”, strlen (msg) );

គឺ ៖

a. 0
b. 6
c. 5
d. 4