Bài 9: Mảng trong C

Trước khi tìm hiểu về mảng trong C, chúng ta thử làm ví dụ mở đầu.

Bạn đang đọc: Bài 9: Mảng trong C

1. Ví dụ khởi đầu

Xét ví dụ nhập 5 số nguyên, xuất ra màn hình hiển thị 5 số đó trên một dòng và tổng 5 số đó .

// e.g about array - code by nguyenvanquan7826
#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 \n", a, b, c, d, e, tong);

    return 0;
}

Kết quả :

Nhap a = 3
Nhap b = 5
Nhap c = 3
Nhap d = 6
Nhap e = 1
Tong cua 3 + 5 + 3 + 6 + 1 = 18

Như ví dụ ta thấy nhập hết 5 số và xuất chúng ta màn hình hiển thị có vẻ như rất khó khăn vất vả và ta đã phải sử dụng quá nhiều biến, nếu số biến của tất cả 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 vất vả. Để khắc phục điều này tất cả chúng ta hãy sử dụng kiểu mảng .
Mảng Là tập hợp những thành phần có cùng kiểu tài liệu. Mảng có mảng 1 chiều, 2 chiều, … và mỗi kiểu tài 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 hầu hết xét về mảng 1 chiều và mảng 2 chiều .
Bây giờ tất cả chúng ta sẽ xử lý lại ví dụ trên bằng cách sử dụng mảng 1 chiều .

2. Mảng 1 chiều

2.1 Ví dụ tổng quan

Các bạn thử đọc và chạy chương trình này, sau đó hãy xem chi tiết cụ thể ở dưới .

// e.g about array - code by nguyenvanquan7826
#include 

int main() 
{
    // khai bao mang a co n phan tu
    int n = 5, i, s = 0;
    int a[n];

    // 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;
}

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

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

KieuDuLieu TenMang [SoPhanTu];

VD: int a[10];

Mảng 1 chiều a gồm 10 thành phần thuộc kiểu nguyên. Sau khi khai báo ta có 1 mảng có dạng như sau :
Mảng 1 chiều
Khai báo mảng a có 10 phần tử

2.3 Cách truy xuất đến những thành phần 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: TenMang[ChiSo]

Mảng 1 chiều
Truy xuất mảng trong C

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

Để nhập tài liệu cho những thành phần trong mảng ta cần duyệt tới từng thành phần trong mảng và thực thi nhập bằng một vòng for

for (i = 0; i < n; i++) 
{
    printf("Nhap a[%d] = ", i);
    scanf("%d", &a[i]);
}

Việc xuất những thành phần trong mảng cũng được triển khai tựa như :

for (i = 0; i < n; i++) 
{
    printf ("%d \t", a[i]);
}

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

Trong nhiều bài toán, tất cả 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 .

// e.g about array - code by nguyenvanquan7826
#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.

2.6 Một vài quan tâm 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] = 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.

3. Mảng 2 chiều

Chúng ta hoàn toàn có thể coi nó như một ma trận. Các đặc thù, cách khai báo, nhập xuất, … cũng tựa như như mảng 1 chiều .

KieuDuLieu TenMang [SoHang][SoCot];

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 1 chiều
Mảng 2 chiều trong C

// e.g about array - code by nguyenvanquan7826
#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.

chap9-luu-tru-mang-2-chieu-trong-c.png
Mảng 1 chiều

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

Bài tập

  1. Nhập vào một mảng, tìm số lớn nhất và nhỏ nhất trong mảng đã nhập.
  2. Nhập vào một dãy số, in ra các vị trí số lớn nhất (có thể có nhiều vị trí).
  3. Nhập vào một dãy số là lượng mưa của các tháng liên tiếp trong năm. Thông báo ra các tháng có lượng mưa lớn hơn lượng mưa trung bình của các tháng đó.
  4. Nhập vào một dãy số, sắp xếp và in ra dãy số theo chiều tăng dần.
  5. Nhập vào một ma trận (mảng 2 chiều). In ra tổng của mỗi hàng trong ma trận đó.

Bạn hoàn toàn có thể sẽ thích :

BẠN CÓ THỂ QUAN TÂM