Thứ Năm, 21 tháng 1, 2016

MẢNG TRONG C

Lập trình C: Bài 7 – Mảng trong C

Ví dụ mở đầu

Xét ví dụ nhập 5 số nguyên, xuất ra màn hình 5 số và tính tổng 5 số đó.
code by nguyenvanquan7826
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include
 
int main() {
    int a, b, c, d, e; // 5 bien
     
    printf("Nhap a = ");
    scanf("%d", &a);
     
    printf("Nhap b = ");
    scanf("%d", &b);
     
    printf("Nhap c = ");
    scanf("%d", &c);
     
    printf("Nhap d = ");
    scanf("%d", &d);
     
    printf("Nhap e = ");
    scanf("%d", &e);
 
    int tong  = a + b + c + d + e;
    printf("Tong cua %d + %d + %d + %d + %d = %d", a, b, c, d, e, tong);
     
    return 0;
}
Như ví dụ ta thấy nhập hết 5 số và xuất chúng ta màn hình có vẻ rất vất vả và ta đã phải sử dụng quá nhiều biến, nếu số biến của chúng ta không phải là 5 mà là 50, 500,… thì việc này quả là rất khó khăn. Để khắc phục điều này chúng ta hãy sử dụng kiểu mảng.
Mảng Là tập hợp các phần tử có cùng kiểu dữ liệu. Mảng có mảng 1 chiều, 2 chiều,… và mỗi kiểu dữ liệu thì có 1 kiểu mảng tương ứng (mảng nguyên, mảng thực, mảng ký tự (chuỗi)),… Ta chủ yếu xét về mảng 1 chiều và mảng 2 chiều.
Bây giờ chúng ta sẽ giải quyết lại ví dụ trên bằng cách sử dụng mảng 1 chiều.

1. Mảng 1 chiều

Các bạn thử đọc và chạy chương trình này, sau đó hãy xem chi tiết ở dưới.
code by nguyenvanquan7826
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include
 
int main() {
    // khai bao mang a co n phan tu
    int n = 5;
    int a[n], i, s = 0;
     
    // thuc hien nhap tung phan tu mang
    for (i = 0; i < n; i++) {
        printf("Nhap a[%d] = ", i);
        scanf("%d", &a[i]);
    }
     
    // thuc hien in cac phan tu cua mang ra man hinh
    printf("\nMang da nhap \n");
    for (i = 0; i < n; i++) {
        printf ("%d \t", a[i]);
    }
     
    // tinh tong cac so trong mang
     
    for (i = 0; i < n; i++) {
        s += a[i]; // s = s + a[i]
    }
    printf("\nTong cac so trong mang: %d\n", s);
 
    return 0;
}
Kết quả:
Nhap a[0] = 3
Nhap a[1] = 4
Nhap a[2] = 6
Nhap a[3] = 2
Nhap a[4] = 7
Mang da nhap
3 4 6 2 7
Tong cac so trong mang: 22

a. Cách khai báo mảng 1 chiều

<[số phần tử tối đa trong mảng]>;
VD: int a[10]; mảng 1 chiều a gồm 10 phần tử thuộc kiểu nguyên. Sau khi khai báo ta có 1 mảng có dạng như sau:
Khai báo mảng a có 10 phần tử
Khai báo mảng a có 10 phần tử

b. Cách truy xuất đến các phần tử trong mảng.

Sau khi mảng được khai báo, mỗi phần tử trong mảng đều có chỉ số để tham chiếu. Chỉ số bắt đầu từ 0 đến n-1 (với n là kích thước mảng). Trong ví dụ trên, ta khai báo mảng 10 phần tử thì chỉ số bắt đầu từ 0 đến 9.
Và ta truy xuất qua cú pháp: <[chỉ số]>
Truy xuất mảng trong C
Truy xuất mảng trong C

c. Cách nhập và xuất các phần tử của mảng

Để nhập dữ liệu cho các phần tử trong mảng ta cần duyệt tới từng phần tử trong mảng và tiến hành nhập bằng một vòng for
1
2
3
4
for (i = 0; i < n; i++) {
    printf("Nhap a[%d] = ", i);
    scanf("%d", &a[i]);
}
Việc xuất các phần tử trong mảng cũng được tiến hành tương tự:
1
2
3
for (i = 0; i < n; i++) {
    printf ("%d \t", a[i]);
}
Ngoài ra chúng ta cũng có thể sử dụng các vòng lặp khác nhứ while, do while,…

d. Nhập xuất mảng sử dụng hàm

Trong nhiều bài toán, chúng ta phải nhập nhiều mảng, và xuất nhiều lần, khi đó hãy đưa nhập xuất vào hàm cho dễ dùng.
code by nguyenvanquan7826
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include
 
void nhapMang(int a[], int n) {
    int i;
    // thuc hien nhap tung phan tu mang
    for (i = 0; i < n; i++) {
        printf("Nhap a[%d] = ", i);
        scanf("%d", &a[i]);
    }
}
 
void xuatMang(int a[], int n) {
    int i;
    for (i = 0; i < n; i++) {
        printf ("%d \t", a[i]);
    }
}
 
int main() {
    // khai bao mang a co n phan tu
    int n = 5;
    int a[n];
    nhapMang(a, n);
    xuatMang(a, n);
     
    return 0;
}
Lưu ý: Một mảng có mối quan hệ với 1 con trỏ, mảng có thế coi như 1 con trỏ nên khi truyền mảng vào hàm thì các phần tử của mảng sẽ bị ảnh hưởng nếu có sự thay đổi nào trong mảng.

e. Một vài lưu ý khác

Khởi tạo mảng: Chúng ta có thể khởi tạo mảng trong quá trình khai báo ngay. VD: float a [5] = {3.4, 5, 6, 7, 4,2}
Với cách khởi tạo này nếu ta khởi tạo vượt quá 5 phần tử máy sẽ báo lỗi, nếu thiếu phần tử nào thì phần tử đó nhận giá trị là 0.
VD: float a [5] = {3.4, 5, 7} => a[4] = a[5] = 0.
VD: float a [5] = {3.4, 5, 7, 1, 2, 3} => máy báo lỗi.
Ngoài ra chúng ta có cách khai báo và khởi tạo mảng chưa biết trước số lượng.
VD: int a[] = {3,6,2,5} => Mảng có 4 phần tử nhận giá trị tương ứng.
Hoặc: int a[]; => Thường sử dụng khi dùng mảng làm tham số hình thức trong hàm.

2. Mảng 2 chiều

Chúng ta có thể coi nó như một ma trận. Các tính chất, cách khai báo, nhập xuất,… cũng tương tự như mảng 1 chiều.
Khai báo: <[số hàng][số cột]>;
VD khai báo: int a[5][10]; //Mảng a gồm 5 hàng và 10 cột (mỗi hàng có 10 phần tử).
Mảng 2 chiều trong C
Mảng 2 chiều trong C
code by nguyenvanquan7826
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include
#define MAX 10
 
// nhap mang n hang, m cot
void nhapMang(int a[MAX][MAX], int n, int m) {
    int i, j;
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            printf("Nhap a[%d][%d] = ", i, j);
            scanf("%d", &a[i][j]);
        }
    }
}
 
// xuat mang n hang, m cot
void xuatMang(int a[MAX][MAX], int n, int m) {
    int i, j;
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            printf ("%-3d", a[i][j]);
        }
        printf("\n"); // xuong dong khi het 1 dong
    }
}
 
int main() {
    // khai bao mang a co n phan tu
    int n = 2, m = 3;
    int a[MAX][MAX];
    nhapMang(a, n, m);
    xuatMang(a, n, m);
     
    return 0;
}
Chú ý: Thực chất trong bộ nhớ, các phần tử của mảng 2 chiều (và mảng nhiều chiều) được tổ chức như là nhiều mảng 1 chiều liên tiếp nhau, vì vậy ta có thể quy mảng 2 chiều thành mảng 1 chiều.

Cách tổ chức, lưu trữ mảng 2 chiều trong C
Cách tổ chức, lưu trữ mảng 2 chiều trong C

0 nhận xét: