Menu-ngang

☰ MENU

20/03/2022

Chương 5: Mảng

 

5.1. Khái niệm mảng

- Mảng là một tập hợp các phần tử cố định có cùng một kiểu, gọi là kiểu phần tử. Kiểu phần tử có thể là có các kiểu bất kỳ: ký tự, số, chuỗi ký tự…;

- Mảng có 2 loại: mảng 1 chiều và mảng đa chiều.

   + Mảng 1 chiều là một nhóm các phần tử có cùng kích thước, cùng kiểu dữ liệu. Những phần tử này được lưu liên tiếp với nhau trong bộ nhớ. Số phần tử của mảng gọi là kích thước của mảng.

    + Mảng đa chiều là mảng có từ 2 chiều trở lên. Điều đó có nghĩa là mỗi phần tử của mảng là một mảng khác.

 Ví dụ: Để quản lý một danh sách họ và tên của khoảng 100 sinh viên trong một lớp. Ta nhận thấy rằng mỗi họ và tên để lưu trữ ta cần 1 biến kiểu chuỗi, như vậy 100 họ và tên thì cần khai báo 100 biến kiểu chuỗi. Nếu khai báo như thế này thì đoạn khai báo cũng như các thao tác trên các họ tên sẽ rất dài dòng và rắc rối. Vì thế, kiểu dữ liệu mảng giúp ích ta trong trường hợp này; chỉ cần khai báo 1 biến, biến này có thể coi như là tương đương với 100 biến chuỗi ký tự; đó là 1 mảng mà các phần tử của nó là chuỗi ký tự.

 

5.2. Khai báo mảng

5.2.1. Khai báo mảng 1 chiều

Cú pháp :  <Tên kiểu dữ liệu>  <Tên mảng> [ <số phần tử>];

Trong đó:

- Tên kiểu dữ liệu: là kiểu dữ liệu của mỗi phần tử trong mảng.

- Tên mảng: là tên được đặt theo qui tắc đặt tên trong C

- Số phần tử: là 1 hằng số nguyên, cho biết số lượng phần tử tối đa trong mảng.

Ví dụ 5.1:

//Khai báo mảng 1 chiều tên a có 20 phần tử kiểu số

nguyên int.

int a[20];

//Khai báo mảng 1 chiều tên b có 10 phần tử kiểu ký

tự char.

char b[10];

- Mỗi phần tử của mảng 1 chiều được truy nhập giá trị thông qua chỉ số (index) của nó.

Ví dụ 5.2:

int a[5];

Chỉ số và phần tử của mảng 1 chiều a được biểu diễn như sau:

 

Phần tử trong mảng

a[0]

a[1]

a[2]

a[3]

a[4]

Chỉ số mảng

0

1

2

3

4

 

Phần tử và chỉ số của mảng bắt đầu từ 0 cho nên chỉ số để truy xuất phần tử cuối cùng của mảng là 4. Như vậy, nếu một mảng có n phần tử thì chỉ số cuối cùng của mảng là (n-1).

 Khởi tạo mảng 1 chiều:

- Khởi tạo giá trị các phần tử mảng ngay khi mảng được khai báo. Các giá trị hằng được đặt giữa một cặp ngoặc nhọn ({}), các phần tử cách nhau bằng dấu phẩy (,).

Ví dụ 5.7:

int a[5] = {5, 15, 20, 25, 30};

- Khởi tạo mảng với kích thước của mảng không cần xác định, chương trình C sẽ đếm số phần tử được khởi động và lấy đó làm kích thước.

Ví dụ 5.8: Ta khai báo

double b[] = {4.5, 7.5, 8.2, 4.32};

- Nếu ta khai báo :

int a[10] = {2, 5, 6, 1, 0, 6, 7};

 

5.2.2. Khai báo mảng 2 chiều

Mảng 2 chiều m dòng n cột được xem như là 1 bảng hình chữ nhật chứa m*n phần tử cùng kiểu dữ liệu (còn gọi là ma trận m*n). Nó sự mở rộng trực tiếp của 1 chiều.

Cú pháp: <tên kiểu dữ liệu> <tên mảng> [<số dòng>] [<số cột>];

 

Ví dụ 5.3: Ta xét bảng điểm 3 môn học của các sinh viên như sau:

Tên

Toán

Hóa

Minh

7

8

10

Lan

4

6

8

Nhật

9

10

10

Ngọc

3

5

7

 

Chúng ta có thể khai báo mảng hai chiều diem để lưu trữ bảng thông tin về điểm các sinh viên như sau: int diem[4][3];

Khởi tạo mảng 2 chiều của ví dụ 5.3:

int diem[4][3]=

{{7,8,10},{4,6,8},{9,10,10}, {3,5,7}};


v    Bài tập:

Câu 1. Nêu cú pháp khia bao mảng 1 chiều. Cho ví dụ?

Câu 2. Hãy khởi tạo mảng số nguyên gồm 10 phần tử?

 

5.3. Truy xuất mảng

5.3.1. Truy xuất mảng 1 chiều

- Khi muốn lấy giá trị một phần tử trong mảng ta tại vị trí chỉ số phần tử có cú pháp như sau:

<tên mảng>[<chỉ số phần tử>]

Ví dụ 5.4: Muốn truy xuất phần tử thứ i trong mảng a, ta ghi là a[i]

 

Ví dụ 5.5: Giả sử có mảng 1 chiều a có 5 phần tử là số nguyên như sau:

Giá trị phần tử trong mảng

20

30

10

4

6

Chỉ số mảng

0

1

2

3

4

 int i;

i = a[4]; // i nhận giá trị 6

Lệnh trên sẽ lấy giá trị của phần tử thứ 5 của mảng, và giá trị này sẽ được chứa trong biến i.

5.3.2. Truy xuất mảng 2 chiều

Cú pháp:

<Tên mảng> [<chỉ số dòng phần tử>] [<chỉ số cột phần tử>]

Chẳng hạn muốn truy xuất một phần tử tại dòng thứ i, cột thứ j của mảng a, ta ghi là a[i][j]. Giá trị i, j được tính từ 0 trở đi.

Ví dụ 5.6: Muốn truy xuất điểm môn Toán của bạn Lan ở Ví dụ 5.3 ta ghi diem[1][0].

v    Bài tập:

Câu 1. Nêu cú pháp truy xuất mảng 1 chiều. Cho ví dụ?

Câu 2. Nêu cú pháp truy xuất mảng 2 chiều. Cho ví dụ?

 5.4. Duyệt mảng

for (int i=0;i<4;i++)

{

printf("\nPhan tu thu %d co gia tri: %d",i+1,a[i]);

}

v    Bài tập thực hành:

Bài 1. Viết chương trình nhập vào mảng a gồm n phần tử nhập từ bàn phím. Sau đó xuất ra màn hình mảng vừa nhập.

Bài 2. Viết hàm nhập, xuất một mảng a gồm n số nguyên.

Bài 3. Cho mảng a gốm có 5 phần tử {5,10,15,20,25}. Viết chương trình tính tổng các phần tử số lẻ.

Bài 4. Viết chương trình sắp xếp một mảng n phần tử theo thứ tự tăng dần.

Bài 5. Viết chương trình nhập vào một mảng, hãy xuất ra màn hình:

- Phần tử lớn nhất của mảng.

- Phần tử nhỏ nhất của mảng.

- Tính tổng của các phần tử trong mảng .

Bài 6. Viết chương trình nhập vào một mảng số tự nhiên n phần tử. Hãy xuất ra màn hình:

- Dòng 1 : gồm các số lẻ, tổng cộng có bao nhiêu số lẻ.

- Dòng 2 : gồm các số chẵn, tổng cộng có bao nhiêu số chẵn.

- Dòng 3 : gồm các số nguyên tố.

- Dòng 4 : gồm các số không phải là số nguyên tố.

Bài 7. Viết chương trình tính tổng bình phương của các số âm trong một mảng các số nguyên.

Bài 8. Nhập vào một mảng, tìm số lớn nhất và nhỏ nhất trong mảng đã nhập.

Bài 9. 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í).

Bài 10. 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 đó.

 

v    Bài tập:

Bài 1. 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.

Bài 2. 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 đó.