Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các...

31
Tin học sở 4 Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017

Transcript of Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các...

Page 1: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Tin học cơ sở 4

Buổi 6. Các thao tác với mảng

Bộ môn Khoa học máy tính - 2017

Page 2: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Nội dung buổi học

1. Tìm kiếm, sửa các phần tử

2. Chèn, xóa một, nhiều phần tử

3. Sắp xếp

4. Mảng 2 chiều

2

Page 3: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Quản lý dữ liệu

Nảy sinh nhu cầu khi có nhiều dữ liệu

Tìm kiếm (search)

Sửa, cập nhật (update)

Chèn thêm, xóa đi (insert, delete)

Sắp xếp (sort)

3

Page 4: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Tìm kiếm

Tìm phần tử thỏa mãn điều kiện

Tìm các số lớn hơn 4

Tìm vị trí các số nguyên tố

Đếm số lượng số chẵn

4

4

7

0

6

8

1

Page 5: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Tìm kiếm

Đoạn mã tìm kiếm mẫu

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

if ( isConditionSatisfied(a[i]) ) {

// đoạn mã xử lý khi

// a[i] thỏa mãn điều kiện

...

}

}

5

4

7

0

6

8

1

Page 6: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

CT1. Tìm các số lớn hơn 4

6

4

7

0

6

8

1

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

if ( a[i] > 4 ) {

cout << "a[" << i << "] = "

<< a[i] << endl;

}

}

Page 7: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

CT2. Tìm các số nguyên tố

7

4

7

0

6

8

1

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

if ( isPrime(a[i]) ) {

cout << "a[" << i << "] = "

<< a[i] << endl;

}

}

bool isPrime(int num) {

if (n <= 1) return false;

for (int i = 2; i < num; i++) {

if (num % i == 0)

return false;

}

return true;

}

Page 8: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

CT3. Đếm số lượng số chẵn

8

4

7

0

6

8

1

int count = 0;

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

if (a[i] % 2 == 0)

count++;

}

cout << count << endl;

Page 9: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Sửa, cập nhật phần tử

Cập nhật phần tử

Khi phần tử thỏa mãn điều kiện

Bằng hàm, công thức tính từ các

phần tử khác

9

4

7

0

6

8

1

Page 10: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Sửa, cập nhật các phần tử

10

4

7

0

6

8

1

Đoạn mã cập nhật mẫu

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

if ( isConditionSatisfied(a[i]) ) {

// đoạn mã cập nhật khi

// a[i] thỏa mãn điều kiện

...

}

}

Page 11: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

CT4. Sửa các số lớn hơn 4 thành 4

11

4

7

0

6

8

1

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

if ( a[i] > 4 ) {

a[i] = 4;

}

}

Page 12: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

CT4. Sửa các số lớn hơn 4 thành 4

12

4

4

0

4

4

1

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

if ( a[i] > 4 ) {

a[i] = 4;

}

}

Page 13: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

CT5. Sửa các số thành tổng của

nó và phần tử phía trước

13

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

a[i] += a[i-1];

}

4

7

0

6

8

1

Chỉ số không

hợp lệ khi i = 0

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

a[i] += (i > 0 ? a[i-1] : 0);

}

Biểu thức lựa

chọn ? :

Page 14: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

CT5. Sửa các số thành tổng của

nó và phần tử phía trước

14

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

a[i] += (i > 0 ? a[i-1] : 0);

}

4

11

11

17

25

26 Do vòng lặp for: các phần

tử bị sửa trước khi cộng

Page 15: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

CT5. Sửa các số thành tổng của

nó và phần tử phía trước

Kỹ thuật lặp ngược lại

15

for (int i = n-1; i >= 0; i--) {

a[i] += (i > 0 ? a[i-1] : 0);

}

4

7

0

6

8

1

Luôn cộng các phần tử

chưa bị sửa

Page 16: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

CT5. Sửa các số thành tổng của

nó và phần tử phía trước

Kỹ thuật lặp ngược lại

16

for (int i = n-1; i >= 0; i--) {

a[i] += (i > 0 ? a[i-1] : 0);

}

4

11

7

6

14

9

Luôn cộng các phần tử

chưa bị sửa

Page 17: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

CT6. Sửa các số thành tổng

hai phần tử bên cạnh

Kỹ thuật lưu phần tử trước khi thao tác

17

int prev = 0;

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

int realPrev = prev;

prev = a[i];

a[i] = (i > 0 ? realPrev : 0)

+ (i < n-1 ? a[i+1] : 0);

}

Lưu trữ a[i-1]

Page 18: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Chèn thêm phần tử

1. Đẩy các phần tử sang phải

2. Đưa phần tử cần chèn vào chỗ trống

18

4 7 0 4 7 0

9

4 7 0 4 7 0 9

4 7 0 4 7 0

Page 19: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Chèn thêm phần tử

19

4 7 0 4 7 0

9

4 7 0 4 7 0 9

4 7 0 4 7 0

int insert(int arr[], int n, int pos, int value)

{

for (int i = n; i > pos; i--) {

arr[i] = arr[i-1];

}

arr[pos] = value;

return n+1;

}

Trả về số phần tử mới

for ngược

Page 20: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Chèn mảng vào mảng

20

4 7 0 4 7 0

9

4 7 0 4 7 0

5

4 7 0 4 7 0 9 5

1. Đẩy các phần tử sang phải cho đủ chỗ

2. Đưa phần tử cần chèn vào chỗ trống

Page 21: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Chèn mảng vào mảng

21

4 7 0 4 7 0

9

4 7 0 4 7 0

5

4 7 0 4 7 0 9 5

1. Đẩy các phần tử sang phải cho đủ chỗ

2. Đưa phần tử cần chèn vào chỗ trống

int insertArrayToArray(int a[], int b[],

int na, int nb,

int pos)

{

for (int i=na+nb-1; i>=nb+pos; i--)

a[i]=a[i-nb];

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

a[i+pos]=b[i];

return na+nb;

}

Page 22: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Xóa một phần tử

22

4 7 0 4 7 0

4 7 0 7 0

1. Đẩy các phần tử sang trái

2. Sửa lại số phần tử

Page 23: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Xóa một phần tử

23

4 7 0 4 7 0

4 7 0 7 0

1. Đẩy các phần tử sang trái

2. Sửa lại số phần tử

int remove(int arr[], int n, int pos)

{

if (n == 0)

return 0;

for (int i = pos; i < n-1; i++) {

arr[i] = arr[i+1];

}

return n-1;

}

for xuôi

Page 24: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Sắp xếp mảng

24

4 7 0 4 7 0

Tăng dần

Giảm dần

Thứ tự từ điển

0 0 4 4 7 7

Page 25: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Thuật toán Sắp xếp chọn (selection sort)

1. Cho i đi từ 0 đến n-1 (trái qua phải)

2. Tìm vị trí phần tử nhỏ nhất trong

a[i], a[i+1], …, a[n-1]

3. Tráo đổi phần tử đó với a[i]

Sắp xếp mảng tăng dần

25

4 7 0 4 7 0

0 0 4 4 7 7

Page 26: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Sắp xếp chọn

26

4 7 0 4 7 0

0 7 4 4 7 0

0 7 4 4 7 0

0 0 4 4 7 7

0 0 4 4 7 7

tìm min

tìm min

được sắp

tráo đổi

tráo đổi

Page 27: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Sắp xếp chọn

27

4 7 0 4 7 0

0 7 4 4 7 0

0 7 4 4 7 0

0 0 4 4 7 7

0 0 4 4 7 7

tìm min

tìm min

được sắp

tráo đổi

tráo đổi

void sort(int arr[], int n)

{

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

int minIndex = i;

for (int j = i; j < n; j++) {

if (a[j] < a[minIndex])

minIndex = j;

}

int tmp = a[i];

a[i] = a[minIndex];

a[minIndex] = tmp;

}

}

Page 28: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Biến thể của sắp xếp chọn

28

4 7 0 4 7 0

0 7 4 4 7 0

0 7 4 4 7 0

0 0 4 4 7 7

0 0 4 4 7 7

tìm min

tìm min

được sắp

tráo đổi

tráo đổi

void sort(int arr[], int n)

{

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

for (int j = i; j < n; j++) {

if (a[j] < a[i]) {

int tmp = a[i];

a[i] = a[j];

a[j] = tmp;

}

}

}

}

Page 29: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Mảng nhiều chiều

Khai báo bảng 100 dòng 1000 cột

int num[100][1000];

Khai báo khối 3 chiều

int num3[10][10][10];

29

Page 30: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Mảng nhiều chiều

Truy xuất sử dụng nhiều chỉ số

num[1][10] // dòng 1, cột 10

num[i][j] // dòng i, cột j

num3[2][5][8] //

num3[i][j][k] // 3 chỉ số

30

Page 31: Tin học cơ sở 4 - Buổi 6uet.vnu.edu.vn/~tqlong/2017thcs4/lec06_array_2.pdf · Buổi 6. Các thao tác với mảng Bộ môn Khoa học máy tính - 2017 . Nội dung buổi

Câu hỏi

Về nội dung buổi học ?

Về nội dung khóa học ?

Về cách tổ chức ?

31