You are on page 1of 19

Module 04

MẢNG VÀ KỸ THUẬT XỬ LÝ MẢNG

Design by Minh An Email: anvanminh.haui@gmail.com

Nội dung

1. Mảng một chiều

2. Mảng hai chiều

3. Bài tập

Design by Minh An

1
1. Mảng một chiều

1. Khái niệm mảng một chiều

2. Sử dụng mảng trong C/C++

3. Xử lý mảng một chiều trong C/C++

Design by Minh An

1.1. Khái niệm mảng một chiều

• Khái niệm:
– Mảng một chiều là một dãy liên tiếp các biến có cùng kiểu
dữ liệu.

• Khai báo:
<Kiểu_dữ_liệu> <Tên_mảng><[Kích_thước]>;
– Kiểu dữ liệu: có thể là các kiểu cơ sở, cấu trúc
– Tên mảng: Một tên phù hợp với quy tắc
– Kích thước: Số nguyên dương

• Lưu ý: Kích thước của mảng không thay đổi được


khi chương trình đang chạy.

Design by Minh An

2
Khái niệm mảng một chiều (tt)
• Ví dụ:
int a[10];
0 1 2 3 4 5 6 7 8 9
Mảng a

• Các phần tử mảng


– Các phần tử được xác định bởi tên mảng và chỉ số.
– Chỉ số của phần tử bắt đầu từ 0 đến N - 1 với N là kích thước
mảng.
– Ký hiệu phần tử: tên_mảng[chỉ_số]

– Ví dụ: a[0], a[1], a[2], a[3], …, a[9] lần lượt


là các phần tử của mảng a.

Design by Minh An

1.2. Sử dụng mảng một chiều

• Mảng một chiều được sử dụng để lưu trữ danh sách.


• Hai mảng có cùng kiểu và cùng kích thước cũng
không được xem là tương đương nhau, vì thế không
thể gán trực tiếp một mảng cho một mảng khác.
• Không thể thực hiện lệnh gán trị cho toàn bộ mảng,
chỉ được gán trị cho từng phần tử của mảng.
• Các thao tác xử lý mảng cần được thiết kế thuật toán
chi tiết.

Design by Minh An

3
2.1. Đưa dữ liệu vào mảng

• Cho một danh sách số nguyên


d = {3, -5, 1, 9, 2, 8, 6};

• Ta cần lưu (đưa) các phần tử dữ liệu (element) của


danh sách d vào mảng a.

0 1 2 3 4 5 6 7 8 9
Mảng a
8

• Khi đó mỗi phần tử của mảng a (item) lưu một phần tử


dữ liệu của danh sách d.

Design by Minh An

Đưa dữ liệu vào mảng (tt)

• Cách 1: Khởi tạo trong lệnh khai báo


int a[10] = {3, -5, 1, 9, 2, 8, 6};

• Cách 2: Gán lần lượt từng phần tử

void khoiTao(int a[]){


a[0] = 3; a[1] = -5;
a[2] = 1; a[3] = 9;
a[4] = 2; a[5] = 8;
a[6] = 6;
}

0 1 2 3 4 5 6 7 8 9
Mảng a
3 -5 1 9 2 8 6

Design by Minh An

4
Đưa dữ liệu vào mảng (tt)

• Cách 3: Gán bằng vòng lặp

void khoiTao(int a[], int n) {


int i;
for (i = 0; i < n; i++)
{
a[i] = i * i;
}
}
i
0 1 2 3 4 5 6 7 8 9
Mảng a
n=7 0 1 4 9 16 25 36

Design by Minh An

Đưa dữ liệu vào mảng (tt)

• Cách 4: Nhập mảng từ bàn phím.


void nhapMang(int a[], int n)
{
int i;
for (i = 0; i < n; i++)
{
printf("\ta[%d] = ",i);
scanf("%d", &a[i]);
}
}
i
0 1 2 3 4 5 6 7 8 9
Mảng a
n=7 3 -5 1 9 2 8 6

Design by Minh An

5
2.2. Hiển thị mảng lên màn hình

void hienThiMang(int a[], int n)


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

Design by Minh An

1.3. Xử lý mảng một chiều

1. Tìm kiếm

2. Tính toán và thống kê

3. Xóa dữ liệu trong mảng

4. Chèn dữ liệu vào mảng

5. Sắp xếp mảng

Design by Minh An

6
3.1. Kỹ thuật tìm kiếm
i
0 1 2 3 4 5 6 7 8 9
Mảng a
n=7 3 -5 1 9 2 8 6

/* Tìm giá trị lớn nhất trong mảng*/


int max_value(int a[], int n){
int i, max = a[0];
for (i = 1; i < n; i++) {
if (max < a[i])
max = a[i];
}
return max;
}

Design by Minh An

3.2. Tính toán và thống kê số liệu


i
0 1 2 3 4 5 6 7 8 9
Mảng a
n=7 3 -5 1 9 2 8 6

/*Tính giá trị trung bình cộng của các phần


tử mảng*/
float tb_cong(int a[],int n) {
int i, tong = 0;
for (i = 0; i < n; i++) {
tong = tong + a[i];
}
return (float)tong/n;
}

Design by Minh An

7
Tính toán và thống kê số liệu (tt)
i
0 1 2 3 4 5 6 7 8 9
Mảng a
n=7 3 -5 1 9 2 8 6

/*Tính giá trị tb cộng của các phần tử dương*/


void tbcSoDuong(int a[],int n) {
int t = 0, d = 0, i;
for (i = 0; i < n; i++)
if (a[i] > 0) {
t = t + a[i];
d++;
}
if (d > 0)
printf("\nTBC so duong: %f", (float)t/d);
else printf("\nMang khong co so duong nao");
}
Design by Minh An

Tính toán và thống kê số liệu (tt)


/* Hoặc */
void tbc_so_duong(int a[], int n,
int &tong, int &dem, float &tbc){
tong = dem = 0;
for (int i = 0; i < n; i++){
if (a[i] > 0) {
tong = tong + a[i];
dem++;
}
}

if (dem > 0){


tbc = (float)tong / dem;
}
}

Design by Minh An

8
3.3. Xóa một phần tử dữ liệu trong mảng

• Xóa phần tử thứ k = 3 trong mảng a đang có n phần tử dữ liệu.

Vị trí thứ k = 3 i
0 1 2 3 4 5 6 7 8 9
Mảng a
n=7 3 -5 1 9 2 8 6

0 1 2 3 4 5 6 7 8 9
Mảng a
n=6 3 -5 9 2 8 6

Design by Minh An

3.3. Xóa một phần tử dữ liệu trong mảng

void xoa_dl(int a[], int &n, int k) {


int i;
for (i = k; i < n; i++){
a[i-1] = a[i];
}
n = n - 1;
}

Design by Minh An

9
3.4. Chèn một phần tử dữ liệu vào mảng
• Chèn phần tử x = 12 vào vị trí thứ k = 3 trong mảng a.

Vị trí thứ k = 3 i
0 1 2 3 4 5 6 7 8 9
Mảng a
n=7 3 -5 1 9 2 8 6

x
12
0 1 2 3 4 5 6 7 8 9
Mảng a
n=7 3 -5 1 9 2 8 6

0 1 2 3 4 5 6 7 8 9
Mảng a
n=8 3 -5 12 1 9 2 8 6

Design by Minh An

Chèn một phần tử dữ liệu vào mảng (tt)

/*Chèn số x vào vị trí thứ k trong mảng a đang


có n phần tử*/
void chen_dl(int a[],int &n,int k,int x)
{
int i;
for (i = n-1; i >= k-1; i--){
a[i+1] = a[i];
}
a[k-1] = x;
n = n + 1;
}

Design by Minh An

10
3.5. Sắp xếp dữ liệu trong mảng

i=0 i=1 i=2 i=3


j j j j
0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
3 1 4 0 2 0 3 4 1 2 0 1 4 3 2 0 1 2 4 3

1 3 4 0 2 0 3 4 1 2 0 1 3 4 2 0 1 2 3 4

1 3 4 0 2 0 1 4 3 2 0 1 2 4 3

0 3 4 1 2 0 1 4 3 2

0 3 4 1 2

Design by Minh An

Sắp xếp dữ liệu trong mảng (tt)

/*Sắp xếp mảng theo chiều tăng dần*/


void sap_xep(int a[], int n) {
int i, j, tg;
for (i = 0; i < n-1; i++)
for (j = i+1; j < n; j++)
if (a[i] > a[j]) {
tg = a[i];
a[i] = a[j];
a[j] = tg;
}
}

Design by Minh An

11
4. Bài tập
1. Một hiệu thuốc mỗi ngày bán được n đơn thuốc. Đơn thuốc
thứ i bán được số tiền là mi. Cài đặt chương trình cho chủ
hiệu thuốc thực hiện các yêu cầu:
• Nhập số lượng đơn thuốc (n) bán được trong ngày (1 ≤ n ≤ 30).
• Nhập vào danh sách gồm số tiền của n đơn thuốc.
• Sau khi nhập chủ hiệu thuốc có thể chọn thực hiện các yêu cầu sau
thông qua một menu bằng cách bấm phím.
– Hiển thị danh sách số tiền lên màn hình gồm 2 cột như sau:
Số TT Số tiền (vnđ)
1 540000
… …
Tổng cộng: … vnđ
– Xem đơn thuốc thứ bao nhiêu có số tiền ít nhất.
– Xóa số tiền của đơn thuốc thứ k trong DS (do nhập thừa).

Design by Minh An

Bài tập
2. Lớp 8A1 có n HS (1 ≤ n ≤ 30) sẽ TK năm học vào ngày mai.
Cài đặt chương trình cho GVCN lớp thực hiện các yêu cầu:
• Nhập số lượng học sinh (n) của lớp.
• Nhập vào danh sách gồm điểm của n học sinh.
• Sau khi nhập GVCN có thể chọn thực hiện các yêu cầu sau thông
qua một menu bằng cách bấm phím.
– Hiển thị danh sách điểm lên màn hình gồm 3 cột như sau:
Số TT Điểm TK Xếp loại
1 7.5 Khá
… … …
Trung bình chung: … vnđ
– Xem điểm thấp nhất lớp, cao nhất lớp.
– Chèn thêm điểm HS thứ k vào DS (do GVCN nhập thiếu).
– Sắp xếp danh sách theo thứ tự điểm giảm dần.

Design by Minh An

12
Bài tập mảng 1 chiều
3. Có n HS khối lớp 6 (1 ≤ n ≤ 100) dự thi kiểm tra chất lượng.
Cài đặt chương trình cho giáo vụ thực hiện các yêu cầu:
• Nhập số lượng học sinh (n) của khối.
• Nhập vào danh sách gồm điểm hai môn toán và văn của n học sinh.
• Sau khi nhập GVCN có thể chọn thực hiện các yêu cầu sau thông qua
một menu bằng cách bấm phím.
– Hiển thị danh sách điểm lên màn hình gồm 5 cột như sau:
Số TT Toán Văn TB Kết quả
1 7.5 6.5 7.0 Đạt
… … …
(Kết quả là đạt nếu điểm TB ≥ 5.0 và không có môn nào dưới 4.0)
– Xem danh sách HS không đạt và số lượng HS không đạt.
– Xem DS 10 HS có điểm trung bình cao nhất.
– Xóa các HS bỏ thi (điểm cả hai môn đều = 0).
Ghi chú: Sử dụng hai mảng 1 chiều để lưu điểm 2 môn)
Design by Minh An

2. Mảng hai chiều

1. Khái niệm mảng hai chiều

2. Sử dụng mảng hai chiều trong C/C++

3. Xử lý mảng hai chiều trong C/C++

Design by Minh An

13
2.1. Khái niệm mảng hai chiều
❖ Mảng đa chiều đơn giản nhất và thường được dùng nhất
là mảng hai chiều gồm các dòng và các cột.

Cột
Chỉ số
cột
0 1 2
Chỉ số
dòng 0 0 1 0
1 0 1 0
2 1 0 1 Dòng
Dữ liệu
3 1 1 1

❖ Mảng hai chiều gồm 4 dòng và 3 cột.

Design by Minh An

Khái niệm mảng hai chiều (tt)

❖ Khai báo mảng hai chiều:

<Kiểu_Dữ_Liệu> <tên_mảng><[M][N]>;
Trong đó M là số dòng, N là số cột của mảng.
❖ Ví dụ:

int b[4][3]; 0 1 2

0
Dòng b[0]
1

2
Mảng b
3

Dòng b[0] (hay b[i] nói chung) là 1 mảng 1 chiều với các
phần tử là b[0][0], b[0][1], b[0][2]

Design by Minh An

14
Khái niệm mảng hai chiều (tt)
❖ Về logic, một mảng hai chiều giống như một BẢNG
THÀNH TÍCH của các vận động viên cử tạ, gồm các
dòng và các cột.
❖ Bảng thành tích của 4 vận động viên cử tạ, mỗi vận
động viên cử 3 lần.

Lần 1 Lần 2 Lần 3


Can 134 kg 136 kg 140 kg

Bình 134 kg 135 kg 137 kg

Dũng 135 kg 137 kg 143 kg

Sỹ 132 kg 135 kg 136 kg

Design by Minh An

Khái niệm mảng hai chiều (tt)

❖ Mảng hai chiều b lưu trữ BẢNG THÀNH TÍCH của các
vận động viên cử tạ.

0 1 2

0 134 136 140

1 134 135 137

2 135 137 143

3 132 135 136

Design by Minh An

15
2. Khởi tạo mảng hai chiều
❖ Khởi tạo mảng trong lệnh khai báo.
int b[4][3] = {
{134, 136, 140},
{134, 135, 137},
{135, 137, 143},
{123, 135, 136}
};

❖ Kết quả sau lệnh khởi tạo trên như sau:


b[0][0]=134; b[0][1]=136; b[0][2]=140;
b[1][0]=134; b[1][1]=135; b[1][2]=137;
b[2][0]=135; b[2][1]=137; b[2][2]=143;
b[3][0]=123; b[3][1]=135; b[3][2]=136;

Design by Minh An

Khởi tạo mảng hai chiều (tt)

❖ Nhập mảng từ bàn phím:


− Nhập theo từng dòng.
− Sử dụng hai vòng lặp lồng nhau.

//Nhập mảng hai chiều m dòng, n cột dữ liệu


void nhap_mang(int b[4][3], int m, int n){
int i, j;
for (i = 0; i < m; i++){
for (j = 0; j < n; j++){
printf("b[%d][%d] = ", i, j);
scanf("%d", &b[i][j]);
}
}
}

Design by Minh An

16
3. Xử lý mảng hai chiều

❖ Hiển thị mảng ra màn hình.


− Hiển thị theo dạng bảng.
− Sử dụng 2 vòng lặp lồng nhau.

//Hiển thị mảng hai chiều m dòng, n cột dữ liệu


void hien_thi_mang(int b[4][3], int m, int n){
int i, j;
for (i = 0; i < m; i++){
for (j = 0; j < n; j++){
printf("%6d", b[i][j]);
}
printf("\n\n");
}
}

Design by Minh An

Xử lý mảng hai chiều (tt)

1) Cài đặt chương trình quản lý các vận động viên cử tạ


thi đấu trong trận chung kết, gồm m (m <= 7) vận
động viên, mỗi vận động viên cử tạ n lần (n <= 3).
− Nhập bảng thành tích của các vận động viên.
− Hiển thị bảng thành tích lên màn hình.
− Vận động viên nào có thành tích cử tạ cao nhất
trong một lần cử tạ.
− Vận động viên nào đoạt chức vô địch (có tổng 3 lần
cử tạ tốt nhất).

Design by Minh An

17
Xử lý mảng hai chiều (tt)

2) Chương trình xử lý ma trận:

− Nhập ma trận vuông cấp n (1 ≤ n ≤ 10, n nhập từ bàn


phím), mỗi phần tử là một số thực.
− Hiển thị ma trận ra màn hình.
− Tính và in ra màn hình tổng các phần tử trên đường
chéo chính của ma trận.
− Tính và in ra màn hình tổng của các phần tử trên hàng
chẵn, cột lẻ của ma trận.
− Cho biết ma trận có phải là ma trận tam giác trên hay
không?

Design by Minh An

Xử lý mảng hai chiều (tt)

3) Chương trình xử lý ma trận:

− Tạo một ma trận xoắn ốc cấp mxn (1 ≤ m, n ≤ 20, m, n


nhập từ bàn phím).
− Hiển thị ma trận ra màn hình.

0 1 2 3 4 5

0 0 1 2 3 4 5

1 17 18 19 20 21 6

2 16 27 28 29 22 7

3 15 26 25 24 23 8

4 14 13 12 11 10 9

Design by Minh An

18
Xử lý mảng hai chiều (tt)
4) Chương trình quản lý kết quả bóng đá:
− Có n (n ≤ 20, n nhập từ bàn phím) đội bóng thi đấu vòng
tròn một lượt theo thể lệ: Đội thắng được 3 điểm, đội thua
được 0 điểm, hòa mỗi đội 1 điểm.
− Cài đặt chương trình:
✓ Nhập vào kết quả chính xác của các trận đấu.
✓ Lập bảng ghi điểm số của mỗi đội trong mỗi trận đấu.
✓ Hiển thị bảng điểm số ra màn hình.
✓ Lập bảng tổng sắp gồm các cột: Số thứ tự đội, số trận
thắng, thua, hòa, hiệu số bàn thắng – thua, tổng điểm,
xếp hạng.
✓ Cho biết đội vô địch (có tổng điểm cao nhất, hiệu số bàn
thắng – thua cao nhất, nhiều trận thắng nhất, số bàn
thắng nhiều nhất, trận thua ít nhất, số bàn thua ít nhất).

Design by Minh An

Thank you…!

Design by Minh An

19

You might also like