Kỹ thuật lập trình cơ bản Chương 4: Mảng một chiều

Trường Cao đẳng Công nghệ Thông Tin Khoa Công nghệ Thông Tin

CHƯƠNG 4 MẢNG MỘT CHIỀU

GV: ThS. TRẦN NGUYỄN ANH CHI

TpHCM, 02/2011

Đặt vấn đề

Ví dụ

 Chương trình cần lưu trữ 3 số nguyên?

=> Khai báo 3 biến int a1, a2, a3;

 Chương trình cần lưu trữ 100 số nguyên? => Khai báo 100 biến kiểu số nguyên!  Người dùng muốn nhập n số nguyên?

=> Không thực hiện được!

Giải pháp

 Kiểu dữ liệu mới cho phép lưu trữ một dãy các số

nguyên.

2

GV: ThS. Trần Nguyễn Anh Chi 1

Kỹ thuật lập trình cơ bản Chương 4: Mảng một chiều

Dữ liệu kiểu mảng

Khái niệm

 Là một kiểu dữ liệu có cấu trúc do người lập trình định

nghĩa.

 Biểu diễn một dãy các biến có cùng kiểu. Ví dụ: dãy

các số nguyên, dãy các ký tự…

 Kích thước được xác định ngay khi khai báo.  NNLT C luôn chỉ định một khối nhớ liên tục cho một

biến kiểu mảng.

3

Dữ liệu kiểu mảng (tt)

Khai báo

[];

Ví dụ 1

Chỉ số

int Mang1Chieu[10]; 1

0

2

3

4

5

6

7

8

9

1

3

-1

7

-2

9

0

4

5

-1

Giá trị

Mang1Chieu

Ví dụ 2

float a[7];

Chỉ số

0

1

2

3

4

5

6

1.2 -1 2.5 3.7 8.1 -9 5.2

a

Giá trị

4

GV: ThS. Trần Nguyễn Anh Chi 2

Kỹ thuật lập trình cơ bản Chương 4: Mảng một chiều

Số phần tử mảng

Phải xác định cụ thể số phần tử ngay lúc khai báo, không

được sử dụng biến chưa có giá trị

//sai int n1; int a[n1]; int n2 = 10; int a[n2];

Nên sử dụng chỉ thị tiền xử lý #define để định nghĩa số

phần tử mảng

5

#define n3 10 int a[n3]; //  int a[10];

Khởi tạo giá trị cho mảng

 Khởi tạo giá trị cho mọi phần tử của mảng

0

1

2

3

123

456

-789

100

a

 Khởi tạo giá trị cho một số phần tử đầu mảng

int a[4] = {123, 456, -789, 100};

0

1

2

3

123

-456

0

0

int a[4] = {123, -456};

6

a

GV: ThS. Trần Nguyễn Anh Chi 3

Kỹ thuật lập trình cơ bản Chương 4: Mảng một chiều

Khởi tạo giá trị cho mảng(tt)

 Khởi tạo giá trị 0 cho mọi phần tử của mảng

0

1

2

3

0

0

0

0

int a[4] = {0};

 Tự động xác định số lượng phần tử của mảng

a

0

1

2

3

123

-456

789

100

int a[] = {123, -456, 789, 100};

7

a

Truy xuất đến một phần tử trong mảng

 Truy xuất thông qua chỉ số

Ví dụ: cho mảng như sau:

0

1

2

3

11 22 33 44

Các truy xuất:

 Hợp lệ: a[0], a[1], a[2], a[3]  Không Hợp lệ: a[-2], a[-1], a[4], a[5]…

 Chỉ số không hợp lệ thường cho kết quả không mong

muốn

8

int a[4];

GV: ThS. Trần Nguyễn Anh Chi 4

Kỹ thuật lập trình cơ bản Chương 4: Mảng một chiều

Truy xuất đến một phần tử (tt)

9

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

Một số thao tác trên mảng

Nhập mảng Xuất mảng Đếm, tính tổng, tính trung bình Tìm kiếm Kiểm tra mảng thỏa điều kiện cho trước Sắp xếp Tách / ghép mảng Chèn / xóa

10

GV: ThS. Trần Nguyễn Anh Chi 5

Kỹ thuật lập trình cơ bản Chương 4: Mảng một chiều

Nhập mảng

Yêu cầu

 Cho phép nhập mảng a, số lượng phần tử n

Ý tưởng

 Cho trước một mảng có số lượng phần tử là MAX.  Nhập số lượng phần tử thực sự n của mảng.  Nhập từng phần tử cho mảng từ chỉ số 0 đến n – 1.

0

1

2

MAX - 1

3

4 n - 1

11

Nhập mảng (tt)

#define MAX 100

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

int i; for (i=0; i

cout<<“Phan tu thu: ”<>a[i];

12

} }

GV: ThS. Trần Nguyễn Anh Chi 6

Kỹ thuật lập trình cơ bản Chương 4: Mảng một chiều

Xuất mảng

Yêu cầu

 Cho trước mảng a, số lượng phần tử n. Hãy xuất nội dung

mảng a ra màn hình.

Ý tưởng

 Xuất giá trị từng phần tử của mảng từ chỉ số 0 đến n-1.

n - 1

0

1

2

MAX - 1

13

Xuất mảng (tt)

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

int i; for (i = 0; i < n; i++) cout<

void main() {

14

int n, a[MAX]; cout<<“Nhap so luong phan tu thuc su: “; cin>>n; NhapMang(a,n); XuatMang(a,n); }

GV: ThS. Trần Nguyễn Anh Chi 7

Kỹ thuật lập trình cơ bản Chương 4: Mảng một chiều

Liệt kê các phần tử thỏa điều kiện

Yêu cầu

 Cho trước mảng a, số lượng phần tử n. Hãy xuất các

phần tử thỏa điều kiện nào đó.

Ý tưởng

 Duyệt từ đầu đến cuối mảng (từ chỉ số 0 đến n-1)  Tại vị trí thứ i, nếu a[i] thỏa điều kiện → xuất giá trị

a[i]

 Nếu không có giá trị nào thỏa điều kiện → xuất thông

báo

15

Liệt kê các phần tử thỏa điều kiện (tt)

Ví dụ 1: Liệt kê các số chẵn trong mảng void XuatChan(int a[], int n) {

int i; for (i = 0; i < n; i++) if(a[i]%2==0) cout<

16

Main: XuatChan(a,n);

GV: ThS. Trần Nguyễn Anh Chi 8

Kỹ thuật lập trình cơ bản Chương 4: Mảng một chiều

Liệt kê các phần tử thỏa điều kiện (tt)

void XuatChan(int a[], int n) //co thong bao {

int i, flag=0; for (i = 0; i < n; i++) if(a[i]%2==0) {

flag = 1; cout<

17

} if(flag==0) cout<<“Khong co so chan trong mang”; }

Liệt kê các phần tử thỏa điều kiện (tt)

Ví dụ 2: Liệt kê các số nguyên tố

bool LaSNT(int x) {

if(x<2)

return false;

int i, demus=0; for (i = 1; i <= x; i++)

if(x%i==0)

demus++;

if(demus==2)

return true;

return false;

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

}

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

if(LaSNT(a[i])==true)

cout<

18

}

GV: ThS. Trần Nguyễn Anh Chi 9

Kỹ thuật lập trình cơ bản Chương 4: Mảng một chiều

Liệt kê các phần tử thỏa điều kiện (tt)

//co thong bao void XuatSNT(int a[], int n) {

int i, flag=0; for (i = 0; i < n; i++)

if(LaSNT(a[i])==true) {

flag = 1; cout<

19

} if(flag==0) cout<<“Khong co SNTtrong mang”; } Main:

Đếm số lượng các phần tử thỏa đk

Yêu cầu

 Cho trước mảng a, số lượng phần tử n. Hãy đếm các

phần tử thỏa điều kiện nào đó.

Ý tưởng

 Duyệt từ đầu đến cuối mảng  Tại vị trí thứ i, nếu a[i] thỏa điều kiện → tăng giá trị

biến đếm

 Trả về giá trị đếm được

20

GV: ThS. Trần Nguyễn Anh Chi 10

Kỹ thuật lập trình cơ bản Chương 4: Mảng một chiều

Đếm số lượng (tt)

Ví dụ 1: Đếm số lượng các số chẵn int DemChan(int a[], int n) {

int i, dem=0; for (i = 0; i < n; i++) if(a[i]%2==0) dem++; return dem; }

21

Main: int kq = DemChan(a,n); if(kq==0) cout<<“Khong co so chan”; else cout<<“SL so chan: “<

Đếm số lượng (tt)

Ví dụ 2: Đếm số lượng các số nguyên tố

int DemSNT(int a[], int n) {

22

int i, dem=0; for (i = 0; i < n; i++) if(LaSNT(a[i])==true) dem++; return dem; } Main:

GV: ThS. Trần Nguyễn Anh Chi 11

Kỹ thuật lập trình cơ bản Chương 4: Mảng một chiều

Tính tổng/tích các phần tử thỏa đk

Yêu cầu

 Cho trước mảng a, số lượng phần tử n. Hãy tính

tổng/tích các phần tử thỏa điều kiện nào đó.

Ý tưởng

 Duyệt từ đầu đến cuối mảng  Tại vị

trí

thứ i, nếu a[i] thỏa điều kiện → cộng

dồn/nhân dồn giá trị biến tổng/tích

 Trả về giá trị tính được

23

Tính tổng/tích (tt)

Ví dụ 1: Tính tổng các số chẵn int TongChan(int a[], int n) {

int i, tong=0, flag=0; for (i = 0; i < n; i++) if(a[i]%2==0) {

flag = 1; tong+=a[i];

Main:

24

} if(flag==1) return tong; return -1; }

GV: ThS. Trần Nguyễn Anh Chi 12

Kỹ thuật lập trình cơ bản Chương 4: Mảng một chiều

Tính tổng/tích (tt)

Ví dụ 2: Tính tích các số nguyên tố long TichSNT(int a[], int n) {

int i; long tich=1; for (i = 0; i < n; i++)

if(LaSNT(a[i])==true) tich*=a[i]; return tich; }

25

Main:

Tính trung bình các phần tử thỏa đk

Yêu cầu

 Cho trước mảng a, số lượng phần tử n. Hãy tính trung

bình cộng các phần tử thỏa điều kiện nào đó.

Ý tưởng

 Duyệt từ đầu đến cuối mảng  Tại vị trí thứ i, nếu a[i] thỏa điều kiện → tăng giá trị

biến đếm và cộng dồn

 Tính trung bình = tổng/đếm  Trả về giá trị trung bình tính được

26

GV: ThS. Trần Nguyễn Anh Chi 13

Kỹ thuật lập trình cơ bản Chương 4: Mảng một chiều

Tính trung bình (tt)

Ví dụ 1: Tính trung bình cộng các số chẵn float TrungBinhChan(int a[], int n) {

int i, dem=0, tong=0; for (i = 0; i < n; i++) if(a[i]%2==0) {

tong+=a[i]; dem++;

}

27

return (float)tong/dem; }

Tính trung bình (tt)

Ví dụ 2: Tính trung bình cộng các số nguyên tố

float TrungBinhSNT(int a[], int n) {

int i, dem=0, tong=0; for (i = 0; i < n; i++)

if(LaSNT(a[i])==true) {

tong+=a[i]; dem++;

28

} if(dem!=0) return (float)tong/dem; return 0; }

GV: ThS. Trần Nguyễn Anh Chi 14

Kỹ thuật lập trình cơ bản Chương 4: Mảng một chiều

Tìm kiếm giá trị thỏa đk

Yêu cầu

 Cho trước mảng a, số lượng phần tử n. Hãy tìm 1 phần

tử thỏa điều kiện nào đó.

Ý tưởng

 Duyệt từ đầu đến cuối mảng  Tại vị trí thứ i, nếu a[i] thỏa điều kiện → trả về giá trị

a[i], hoặc trả về vị trí thứ i

29

Tìm kiếm giá trị thỏa đk (tt)

Ví dụ 1: Tìm giá trị lớn nhất mảng

int TimMax(int a[], int n) {

30

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

GV: ThS. Trần Nguyễn Anh Chi 15

Kỹ thuật lập trình cơ bản Chương 4: Mảng một chiều

Tìm kiếm giá trị thỏa đk (tt)

Ví dụ 2: Tìm vị trí của giá trị lớn nhất mảng

int TimViTriMax(int a[], int n) {

int i, max = a[0], vtmax = 0; for (i = 1; i < n; i++) if(a[i] > max) {

31

max = a[i]; vtmax = i; } return vtmax; }

Tìm kiếm giá trị thỏa đk (tt)

Ví dụ 3: Tìm vị trí giá trị chẵn đầu tiên

int TimChanDau(int a[], int n) {

32

int i; for (i = 0; i < n; i++) if(a[i]%2==0) return i; return -1; }

GV: ThS. Trần Nguyễn Anh Chi 16

Kỹ thuật lập trình cơ bản Chương 4: Mảng một chiều

Kiểm tra tính chất mảng

TH1: kiểm tra xem trong mảng có tồn tại 1 phần tử thỏa điều kiện nào đó hay không → tìm phần tử thỏa điều kiện rồi kết luận

Ý tưởng:

 Duyệt từ đầu đến cuối mảng  Tại vị trí thứ i, nếu a[i] thỏa điều kiện → trả về true  Trả về false

33

Kiểm tra tính chất mảng (tt)

TH2: kiểm tra xem tất cả các phần tử trong mảng có thỏa điều kiện nào đó hay không → tìm phần tử không thỏa điều kiện rồi kết luận

Ý tưởng:

 Duyệt từ đầu đến cuối mảng  Tại vị trí thứ i, nếu a[i] không thỏa điều kiện → trả về

false

 Trả về true

34

GV: ThS. Trần Nguyễn Anh Chi 17

Kỹ thuật lập trình cơ bản Chương 4: Mảng một chiều

Kiểm tra tính chất mảng (tt)

Ví dụ 1: Kiểm tra xem trong mảng có tồn tại giá trị lẻ

hay không?

bool KiemTraTonTaiLe(int a[], int n) {

35

int i; for (i = 0; i < n; i++) if(a[i]%2!=0) return true; return false; }

Kiểm tra tính chất mảng (tt)

Ví dụ 2: Kiểm tra xem mảng có chứa toàn giá trị lẻ hay

không?

bool KiemTraToanLe(int a[], int n) {

36

int i; for (i = 0; i < n; i++) if(a[i]%2==0) return false; return true; }

GV: ThS. Trần Nguyễn Anh Chi 18

Kỹ thuật lập trình cơ bản Chương 4: Mảng một chiều

Sắp xếp

Có nhiều tiêu chí sắp xếp mảng: sắp tăng dần, sắp giảm dần,

sắp chẵn tăng lẻ giảm…

Có nhiều thuật toán sắp xếp mảng: chọn trực tiếp, chèn trực

tiếp, đổi chỗ trực tiếp…

Ý tưởng:

 Sử dụng 2 biến i và j để so sánh tất cả cặp phần tử với

nhau và hoán vị các cặp nghịch thế (sai thứ tự).

8 5

tạm

n – 1

0

1

MAX - 1

2

1 5

5 1

6 8

8 6

37

j

j

j

i

j

Sắp xếp (tt)

Ví dụ: Sắp xếp mảng tăng dần void HoanVi(int &x, int &y) {

int tam=x; x = y; y = tam; }

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

38

int i, j; for (i=0; ia[j]) HoanVi(a[i],a[j]); }

GV: ThS. Trần Nguyễn Anh Chi 19