SLIDE1

Tuesday, September 23, 2014

mảng nhiều chiều, đa chiều trong c


Mảng nhiều chiều có thể được coi như mảng của mảng, ví dụ, một mảng hai chiều có thể được tưởng tược như là một bảng hai chiều gồm các phần tử có kiểu dữ liệu cụ thể và giống nhau
0 1 2 3 4
0 1 2 3
4
Mảng nhiều chiều không bị giới hạn bởi hai chỉ số (hai chiều), Chúng có thể chứa bao nhiều chỉ số tùy thích mặc dù ít khí cần phải dùng đến mảng lớn hơn 3 chiều. Hãy thử xem xét lượng bộ nhớ mà một mảng có nhiều chỉ số cần đến.
char century [100][365][24][60][60]; 
Mảng nhiều chiều thực ra là một khái niệm trừu tượng vì chúng ta có thể có kết quả tương tự với mảng một chiều bằng một thao tác đơn giản giữa các chỉ số của nó: 
int jimmy [3][5];   tương đương với int jimmy [15];   (3 * 5 = 15)
ví dụ sau đây khai báo, nhập giá trị vào mảng và in ra màn hình mảng vừa nhập;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<stdio.h>
#include<conio.h>
int mang[5][5];
void main()
{

int i, j;
for (i = 0; i <= 4; i++)
for (j = 0; j <= 4; j++)
{
printf("mang[%d][%d]=", i, j);
scanf_s("%d", &mang[i][j]);
printf("\n");
}
printf("mang ban da nhap la:\n");
for (i = 0; i <= 4; i++)
{
for (j = 0; j <= 4; j++)
{
printf("%4d", mang[i][j]);
}
printf("\n");
}
_getch();
}
*dùng mảng làm tham số
Vào một lúc nào đó có thể chúng ta cần phải truyền một mảng tới một hàm như là một tham số. Trong C, việc truyền theo tham số giá trị một khối nhớ là không hợp lệ, ngay cả khi nó được tổ chức thành một mảng. Tuy nhiên chúng ta lại được phép truyền địa chỉ của nó, việc này cũng tạo ra kết quả thực tế giống thao tác ở trên nhưng lại nhanh hơn nhiều và hiệu quả hơn
Để có thể nhận mảng là tham số thì điều duy nhất chúng ta phải làm khi khai báo hàm là chỉ định trong phần tham số kiểu dữ liệu cơ bản của mảng, tên mảng và cặp ngoặc vuông trống. Ví dụ, hàm sau
void procedure (int arg[]) 
nhận vào một tham số có kiểu "mảng của char" và có tên arg. Để truyền tham số cho hàm này một mảng được khai báo
int myarray [40]; 
chỉ cần gọi hàm như sau: 
procedure (myarray); 
Dưới đây là một ví dụ cụ thể 
#include<stdio.h>
#include<conio.h>
void in_mang(int arg[])
{
for (int n = 0; n <= 4; n++)
{
printf("%3d", arg[n]);
}
}
int mang[5];
void main()
{
int i;
for (i = 0; i <= 4; i++)
{
printf("mang[%d]=",i);
scanf_s("%d", &mang[i]);
printf("\n");
}
in_mang(mang);
_getch();
}
Như bạn có thể thấy, tham số đầu tiên (int arg[]) chấp nhận mọi mảng có kiểu cơ bản là int
Trong phần khai báo hàm chúng ta cũng có thể dùng tham số là các mảng nhiều chiều
ví dụ, một hàm với tham số là mảng nhiều chiều có thể như sau:
void procedure (int myarray[][3][4]) 
chú ý rằng cặp ngoặc vuông đầu tiên để trống nhưng các cặp ngoặc sau thì không. Bạn luôn luôn phải làm vậy vì trình biên dịch C phải có khả năng xác định độ lớn của các chiều thêm vào của mảng.
Dưới đây là một ví dụ cụ thể
#include<stdio.h>
#include<conio.h>
void in_mang(int a[][5],int h)
{
for (int i = 0; i <= h-1; i++)
{
for (int j = 0; j <= 4;j++)
{
printf("%4d", a[i][j]);
}
printf("\n");
}
}
int mang1[3][5];
int mang2[4][5];
void main()
{
for (int i = 0; i <= 3; i++)
{
for (int j = 0; j <= 4; j++)
{
printf("mang1[%d][%d]=", i, j);
scanf_s("%d", &mang1[i][j]);
printf("\n");
}
}
for (int a = 0; a <= 3; a++)
{
for (int b = 0; b <= 4; b++)
{
printf("mang2[%d][%d]=", a, b);
scanf_s("%d", &mang2[a][b]);
printf("\n");
}
}
printf("mang 1 la:\n");
in_mang(mang1, 3);
printf("mang 2 la:\n");
in_mang(mang2, 4);
_getch();

}