tư duy máy tính (computational thinking) -...

14
Tng quan Tư duy máy tính (Computational thinking) - Tư duy máy tính là mt quá trình nhn thc hoc thc hin các thao tác trí tu(thought) liên quan đến lp lun logic (logical reasoning) để gii quyét vấn đề được đặt ra. Tư duy máy tính bao gồm 5 tư duy thành phần (hoc 5 khnăng tư duy) sau đây: o (1) Tư duy thuật toán (algorithmic thinking), o (2) Tư duy phân rã (decomposition), o (3) Tư duy khái quát khóa dựa trên mu (patterns based generalisations), o (4) Tư duy trừu tượng (abstractions), và o (5) Tư duy lượng giá/định giá (evaluation) (Xem Simon Humphreys (2015), “Computational thinking – A guide for teacher”, @Copyright 2015 Computing At School, UK) - CT GDPT môn Tin hc (26/12/2018) gii thích: Tư duy máy tính sdụng phương pháp trừu tượng hoá, cách phân rã mt nhim v, mt thiết kế ln và phc tp thành nhng vấn đề nhỏ, đơn giản hơn để có thđưa ra các thuật toán gii quyết chúng. Tư duy máy tính bóc tách các mi quan hđể trích chọn các đặc trưng, biểu đạt ngn gn vấn đề hoc mô hình hoá các khía cnh quan trng ca vấn đề, làm cho vấn đề đó dễ khai báo và có thxlí được. - Riêng tư duy thuật toán tư duy trừu tượng nhng mức độ khác nhau. Tư duy thuật toán gm 3 mc: Mc thc hin (performing level), mc chuyn giao (transferring level) và mc thiết kế (design level). - Tư duy trừu tượng trong khoa hc máy tính gm 4 mc: 1- Mc thc hin (execution level), 2- Mc chương trình (program level), 3- mức đối tượng (object level), và 4- mc vấn đề (problem level) (Xem Jacob C. Perrenet (2009), “Levels of thinking in computer science: Development in bachelor students‟ conceptualiztion of algorithm”, Educ Inf (2010) 15:87 -107, DOI 10.1007/s10639-009-9098- 8) 1. Làm rõ mt khái nim 1.1. Tư duy phân rã VD 1: Dy hc thut toán SX Vùng phát tri n hi n tại: HS đã học thut toán tìm phn tbé nht ca dãy (a) Vùng phát tri n gn nhất: T = SX tăng dầ n mng (a) = {a 1 , a 2 , …,a n } TOP-DOWN Ví d, n = 5 i 1 2 3 4 5 a i 9 8 5 7 2 T‟ là thuật toán gii quyết T Ý tưởng thuật toán T’ Ln 1: Xét dãy n phn t{a 1 , a 2 , …,a n }, đầu dãy có vtrí i = 1 Tìm vtrí k ca phn tbé nht trong dãy trên k = 5

Upload: others

Post on 07-Sep-2019

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Tư duy máy tính (Computational thinking) - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/Phat trien tu duy thuat... · - Tư duy trừu tượng trong khoa học

Tổng quan

Tư duy máy tính (Computational thinking)

- Tư duy máy tính là một quá trình nhận thức hoặc thực hiện các thao tác trí tuệ (thought) liên quan đến lập luận logic (logical reasoning) để giải quyét vấn đề được đặt ra. Tư duy máy tính bao gồm 5 tư duy thành phần (hoặc 5 khả năng tư duy) sau đây:

o (1) Tư duy thuật toán (algorithmic thinking), o (2) Tư duy phân rã (decomposition), o (3) Tư duy khái quát khóa dựa trên mẫu (patterns based generalisations),

o (4) Tư duy trừu tượng (abstractions), và o (5) Tư duy lượng giá/định giá (evaluation) (Xem Simon Humphreys (2015), “Computational thinking – A guide for teacher”, @Copyright 2015 Computing At School, UK)

- CT GDPT môn Tin học (26/12/2018) giải thích: Tư duy máy tính sử dụng phương pháp trừu tượng hoá, cách phân rã một nhiệm vụ, một thiết kế lớn và phức tạp thành những vấn đề nhỏ, đơn giản hơn để có thể đưa ra các thuật toán giải quyết chúng. Tư duy máy tính bóc tách các mối quan hệ để trích chọn các đặc trưng, biểu đạt ngắn gọn vấn đề hoặc mô hình hoá các khía cạnh quan trọng của vấn đề,

làm cho vấn đề đó dễ khai báo và có thể xử lí được. - Riêng tư duy thuật toán và tư duy trừu tượng những mức độ khác nhau. Tư duy thuật toán gồm 3

mức: Mức thực hiện (performing level), mức chuyển giao (transferring level) và mức thiết kế (design level).

- Tư duy trừu tượng trong khoa học máy tính gồm 4 mức: 1- Mức thực hiện (execution level), 2- Mức chương trình (program level), 3- mức đối tượng (object level), và 4- mức vấn đề (problem level) (Xem Jacob C. Perrenet (2009), “Levels of thinking in computer science: Development in bachelor

students‟ conceptualiztion of algorithm”, Educ Inf (2010) 15:87-107, DOI 10.1007/s10639-009-9098-8)

1. Làm rõ một khái niệm

1.1. Tư duy phân rã

VD 1: Dạy học thuật toán SX

Vùng phát triển hiện tại: HS đã học thuật toán tìm phần tử bé nhất của dãy (a)

Vùng phát triển gần nhất: T = SX tăng dần mảng (a) = {a1, a2, …,an}

TOP-DOWN

Ví dụ, n = 5

i 1 2 3 4 5

ai 9 8 5 7 2

T‟ là thuật toán giải quyết T

Ý tưởng thuật toán T’

Lần 1:

Xét dãy n phần tử {a1, a2, …,an}, đầu dãy có vị trí i = 1

Tìm vị trí k của phần tử bé nhất trong dãy trên k = 5

Page 2: Tư duy máy tính (Computational thinking) - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/Phat trien tu duy thuat... · - Tư duy trừu tượng trong khoa học

Đổi giá trị ai và ak (2, 8, 5, 7, 9) Dãy có 1 phần tử được SX (phần tử bé

nhất ở đầu dãy)

Lần 2:

Xét dãy n-1 phần tử còn lại {a1, a2, …,an}, đầu dãy có vị trí i = 2

Tìm vị trí k của phần tử bé nhất trong dãy trên k = 3

Đổi giá trị ai và ak (2, 5, 8, 7, 9) Dãy có 2 phần tử được SX (phần tử bé

nhì về vị trí 2)

Tương tự, được kết quả

Lần 3: i = 3, k = 4 (2, 5, 7, 8, 9) Dãy có 3 phần tử được SX

Lần 4: i = 4, k = 4 k = i không có sự đổi chỗ (2, 5, 7, 8, 9) Dãy có 3 phần

tử được SX, phần tử cuối là lớn nhất

Tổng quát i = 1, 2, …, n – 1

Ý tưởng thuật toán T’ dùng “gói thuật toán” (Làm mịn dần)

Gọi T1 = T1(a, i, k) là thuật toán tìm vị trí k là vị trí của phần tử bé nhất trong dãy (ai,

ai+1, …, an).

Gọi T2 = T2(i, k) là thuật toán đổi giá trị của ai và ak cho nhau

T1 và T2 gọi là các gói thuật toán

Ta có ý tưởng thuật toán T‟ như sau:

Lần 1: T1(a, 1, k); nếu k <> 1 thì T2(1, k) (9, 8, 5, 7, 2) (2, 8, 5, 7, 9)

Lần 2: T1(a, 2, k); nếu k <> 2 thì T2(2, k) (2, 8, 5, 7, 9) (2, 5, 8, 7, 9)

Lần 4: …

Thuật toán T’

Phiên bản mô tả 1:

Với mỗi i = 1, 2, …, n – 1 thực hiện T1(a, i, k) và nếu i <> k thì thực hiện T2(i, k)

Phiên bản mô tả 2:

Bước 1: i 1;

Bước 2: T1(a, i, k);

Bước 3: Nếu i <> k thì T2(i, k);

Bước 4: Nếu i ≤ n-1 thì tăng i i + 1 và quay về Bước 2;

Bước 5: Đưa ra dãy (a)

Phân rã

T = T‟ T1 T2

Page 3: Tư duy máy tính (Computational thinking) - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/Phat trien tu duy thuat... · - Tư duy trừu tượng trong khoa học

T1, T2 là bài toán sơ cấp; Bài toán sơ cấp là bài toán dễ giải hoặc đã biết cách giải quyết (cho dù

khó)

Định nghĩa: Phân rã là quá trình giải quyết vấn đề bằng cách qui nó về các vấn đề con đơn giản

hơn, và tiếp tục qui các vấn đề con thành các vấn con đơn giản hơn nữa, tiếp tục quá trình đến

nhận được các vấn đề con là các bài toán sơ cấp

Phép qui chia thành mức

Phổ thông: 1 đến 2 mức

hoặc

Cấp học cao hơn: ĐH 1 đến 5 mức ….

HSG PT?

1.2. Khái quát hóa dựa trên mẫu

Vấn đề liên quan: Tất cả các môn học đều phải có trách nhiệm phát triển tư duy cho HS, cụ thể là

phát triển các hoạt động tư duy (thao tác trí tuệ) chung sau (tự tìm hiểu)

- So sánh, tương tự

- Phân tích và Tổng hợp

- Khái quát hóa và đặc biệt hóa (tổng quát hóa)

- Trừu tượng hóa cụ thể hóa (abstraction thinking)

- Đánh giá (assessment/evaluation)

- Phản biện (critical thinking)

- Sáng tạo (create thinking)

Liên quan đến thang đo nhận thức của bloom

HSPT: Nhận biết Thông hiểu Vận dụng (Vận dụng thấp & Vận dụng cao)

Khái quát hóa (Generalisation):

1.3. Tư duy trừu tượng trong KHMT

Có 4 mức độ trừu tượng

1.3.1. Mức thực hiện (Excution level)

- HS hiểu thuật toán

- HS thực hiện được thuật toán, cụ thể HS mô phỏng được thuật toán

T

T1 T2

T

T1

T3

T2

T4

T5

Page 4: Tư duy máy tính (Computational thinking) - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/Phat trien tu duy thuat... · - Tư duy trừu tượng trong khoa học

Algorithm = Input Proccessing Output

Kernel Algorithm = proccessing

Ví dụ: DH SX chèn trực tiếp

Ý tưởng: Dãy cần SX được chia thành 2 nửa, nửa trái gồm những phần tử được SX, nửa phải

gồm những phần tử được SX (lần đầu tiên nửa trái đã có 1 phần tử được SX). Ý tưởng của thuật

toán là tìm cách mỗi lần đưa một phần tử của đầu dãy phải để chèn vào vị trí thích hợp của dãy

trái sao cho sau khi chèn thì dãy trái vẫn được SX. Khi chèn phần tử cuối cùng của dãy phải (dãy

phải còn 1 phần tử) thì toàn bộ dãy được SX:{9},{ 8, 5, 7, 2} {2, 5, 7, 8, 9},{}

n = 5, (a) = {a1, a2, …,an} = {9, 8, 5, 7, 2}

Lần 0: {9},{8, 5, 7, 2}

Lần 1: Tìm cách chèn phần tử x = ai ; i = 2 vào dãy trái

Phải so sánh nếu x < aj (j = i -1, i-1, …+ j > 0) thì “tịnh tiến” aj sang phải 1 vị trí để có cơ hội có

vị trí trống có thể chèn sẽ chèn x , tức là aj+1 = aj

{9},{8, 5, 7, 2} & j = 1 {9},{9, 5, 7, 2} và sau đó j = j – 1 j = 0 dừng

Sau quá trình tịnh tiến trên: chèn x vào vị trí trống: aj+1 = x {8},{9, 5, 7, 2} {8,9}, {5, 7, 2}

Lần 2: Tương tự: chèn x = ai, i = 3 vào dãy trái

Với mỗi j = i – 1, i – 2 …+ j > 0:

Nếu x < aj thì aj+1 = aj & j = j – 1 ; nếu j = 0 thì dừng

{8,9}, {5, 7, 2} {8, 8}, {9, 7, 2}

Sau quá trình trên: aj+1 = x {5, 8}, {9, 7, 2} {5, 8, 9}, {7, 2}

Lần 3: Gọi HS lên làm

chèn x = ai, i = ?1 vào dãy trái

Với mỗi j = ?2

Nếu ?3 thì ?4 & j = j – 1 ; nếu j = 0 thì dừng

?5

Sau quá trình trên: aj+1 = x ? 6 ? 7

Nếu HS làm được thì tức là HS hiểu ý tưởng thuật toán và mô phỏng được thuật toán

Thuật toán

Nếu HS giải thích được thuật toán ở các cách khác nhau thì tức là HS hiểu thuật toán ở mức thực

hiện.

Cách 1:

Với mỗi i =2 , 3, …, n thì

1) x ai; j = i - 1

2) Lặp quá trình sau khi (j > 0) và (x < aj)

a. aj+1 aj

Page 5: Tư duy máy tính (Computational thinking) - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/Phat trien tu duy thuat... · - Tư duy trừu tượng trong khoa học

b. j j – 1

3) aj+1 = x

Cách 2:

Bước 0: Nhập n và dãy (a);

Bước 1: i = 2;

Bước 2: x ai; j = i – 1;

Bước 3: Nếu x < aj Thì aj+1 aj;

Bước 4: Nếu j > 0 thì j j – 1 và Quay về Bước 3;

Bước 5: aj+1 x;

Bước 6: Nếu i ≤ n thì i i + 1 và Quay về Bước 2;

Bước 7: In ra dãy (a)

1.3.2. Mức chương trình (Program level)

- HS chuyển thuật toán từ ngôn ngữ tự nhiên (ý tưởng thuật toán) hoặc từ ngôn ngữ phỏng

trình (ngôn ngữ tự nhiên nhưng gần với ngôn ngữ lập trình nào đó) sang ngôn ngữ lập trình

cụ thể nào đó.

- (algorithm in Natural language, pseo-code, source code khác target code)

- Lưu ý: Thuật toán có những hình thức thể hiện sau: Ngôn ngữ tự nhiên Sơ đồ khối hoặc

Liệt kê từng bước Ngôn ngữ phỏng trình Ngôn ngữ lập trình; Hai hình thức đầu tiên

có nhiều cách diễn đạt

Phiên bản thuật toán (KH cơ bản) khác với phiên bản mô tả thuật toán (KH sư phạm)

Ví dụ

STT Thuật toán ở hình thức phỏng trình Thuật toán ở hình thức ngôn ngữ lập trình

1 Bước 1: i 1;

Bước 2: T1(a, i, k);

Bước 3: Nếu i k thì T2(i, k);

Bước 4: Nếu i ≤ n-1 thì tăng i i + 1

và quay về Bước 2;

Bước 5: Đưa ra dãy (a)

In Pascal Programming Language

for i := 1 to n – 1 do

begin

{T1(a, i, k)}

k := i;

for j := i + 1 to n do

if a[j] < a[k] then k := j;

{Nếu i <> k thì T2(i, k);}

if i <> k then

begin tg := a[i]; a[i] := a[k]; a[k]:=tg;

end;

end;

In Pyhton Programming Language

for i in (1, n):

k = i

for j in (i+1, n+1):

if a[j] < a[k]:

k = j

if i != k:

tg = a[i]

Page 6: Tư duy máy tính (Computational thinking) - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/Phat trien tu duy thuat... · - Tư duy trừu tượng trong khoa học

a[i] = a[k]

a[k] = tg

2

Với mỗi i =2 , 3, …, n thì

1) x ai; j = i - 1

2) Lặp quá trình sau khi (j > 0) và

(x < aj)

a. aj+1 aj

b. j j – 1

3) aj+1 = x

In Pascal Programming Language

for i:=2 to n do

begin

x := a[i]; j:= i-1;

while (j> 0) and (x < a[j]) do

begin a[j+1] := a[j];

j := j – 1;

end;

a[j + 1] := x;

end;

In C/C++ Programming Language

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

x = a[i]; j = i-1;

while (j>=0 && x < a[j]) {

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

}

a[j + 1] = x;

}

1.3.3. Mức đối tượng (Object level)

- Mức đối tượng là việc phân tích vấn đề cần giải quyết để tìm ra các đối tượng xuất hiện

trong vấn đề (bài toán) đó, sau đó đặc tả được đối tượng thông qua chỉ rõ 2 thành phần

thuộc tính & hành vi. Trong ngôn ngữ lập trình (thuộc tính, hành vi) = (dữ liệu, phương thức)

- Nếu HS chỉ ra được các đối tượng của vấn đề tức là các em đạt mức “trừu tượng của tư duy

KHMT/Tư duy máy tính). Khi học một ngôn ngữ lập trình cụ thể HS đạt mức này nghĩa là

các em xây dựng được lớp đối tượng có bài toán.

Ví dụ: Ngôn ngữ C/C++ không có kiểu phân số (Fraction Data). Hãy xây dựng một kiểu dữ liệu

mới là phân số để sử dụng nó như các kiểu dữ liệu tiền định của C/C++, tức là để viết các phép

toán +, -, *, /, >>, << phân số.

HS đạt được cấp độ trừu tượng sẽ xây dựng được lớp đối tượng là phân số như sau:

class FRAC{

private:

int t, m;

public:

friend istream& operator >> (istream & din, FRAC &a);

friend ostream& operator << (ostream & dout, FRAC &a);

friend FRAC operator + (FRAC a, FRAC b);

friend FRAC operator - (FRAC a, FRAC b);

friend FRAC operator * (FRAC a, FRAC b);

friend FRAC operator / (FRAC a, FRAC b);

};

istream& operator >> (istream & din, FRAC &a) {

cout<< “Nhap tu so: ”; din>>a.t;

do {cout<< “Nhap mau so: ”; din>>a.m; } while (a.m==0);

Page 7: Tư duy máy tính (Computational thinking) - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/Phat trien tu duy thuat... · - Tư duy trừu tượng trong khoa học

return din;

}

ostream& operator << (ostream & dout, FRAC &a){

dout<<a.t;

if (a.m !=1) dcout << “/”<<a.m;

return dout;

}

int GCD(int a; int b){

int a1 = fabs(a); b1 = fabs(b);

while(a1 !=b1) if (a1>b1) a1-=1b; else b1-=a1;

return b1;

}

void reduce(FRAC &a){

int u = GCD(a.t, a.m);

a.t /= u; a.m /= u;

}

FRAC operator + (FRAC a, FRAC b){

FRAC c;

c.t = a.t*b.m + b.t*a.m;

c.m = a.m*b.m;

reduce(c);

return (c);

}

FRAC operator - (FRAC a, FRAC b) {…;}

FRAC operator * (FRAC a, FRAC b) {…;}

FRAC operator / (FRAC a, FRAC b) {…;}

//Tinh c = a + b & d = a^2 – b^2

int main(){

FRAC a, b, c, d;

cout<< “Nhap phan so a: ”; cin>>a;

cout<< “Nhap phan so a: ”; cin>>b;

c = a + b;

cout<<a << “ + ” <<b<< “ = ” <<c << endl;

return 0;

}

1.3.4. Mức vấn đề (Problem level)

- Mức vấn đề nghĩa là thuật toán được xem như một hộp đen và ta chỉ quan tâm đến tác dụng và

cách dùng nó mà không quan tâm bên trong nó như thế nào. Việc quan tâm này chỉ thực ở pha

phía sau. HS đạt được “mức vấn đề” nếu trong giải quyết bài toán đã nêu HS sử dụng các “gói

thuật toán” và xem nó như các thuật toán có sẵn để sử dụng. Sau đó HS mới quan đến việc xây

dựng các gói thuật toán này như thế nào.

Ví dụ 1: Tác dụng và cách sử dụng Lioa

Ví dụ 2: Xây dựng thuật toán SX tăng dần

Pha 1: Thuật toán T‟ giải bài toán T trong đó sử dụng T1(a,i,k) và T2(i,k);

Page 8: Tư duy máy tính (Computational thinking) - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/Phat trien tu duy thuat... · - Tư duy trừu tượng trong khoa học

T = T‟ T1(a, i, k) T2(i, k)

Pha 2: Xây dựng các gói thuật toán

2.1. Xây dựng T(a, i, k)

2.2. Xây dựng T2(i, k)

Ví dụ 3:

Một người định treo băng rôn quảng cáo của mình lên

trên một cái cổng hình parabol rất cao. Người này muốn

biết chiều cao của cái cổng nên đã làm như sau:

đo khoảng cách giữa hai chân cổng

đứng cạnh chân cổng sao cho đỉnh đầu chạm vào

cổng rồi đo khoảng cách từ điểm chạm đó tới một

cây cột được dựng tại chân cổng ở ngay bên cạnh.

đo chiều cao của chính mình

Trong hình: d, x, y là các khoảng cách đã đo trên đây.

T là bài toán tính h?

Input: d, x, y

Output: h

T‟ = ?

Ý tưởng thuật toán (Lời giải toán học)

Cổng parabol: Y = Ax2 + Bx + C; đỉnh là (-B/2A; -/4A); => h = -/4A

Cần tính được A, B, C => 3 phương trình => cần 3 điểm nằm trên Parabol

Chọn hệ tọa độ Oxy với O trùng với A.

3 điểm đó là : A(0, 0), B(d, 0), M(x, y)

PT1: C = 0;

PT2: Ad2 + Bd + C = 0

PT3: Ax2 + Bx + C = y

Tính được C = 0; B = -Ad; A = y/(x2 – dx);

Ý tưởng thuật toán ở mức vấn đề

Pha 1: T = T‟ T1(d, x, y, A, B, C );

T‟ là: = B*B – 4*A*C; h = -/4A

Pha 2: T1(d, x, y, A, B, C ) ?

C = 0; A = A = y/(x2 – dx); B = -Ad;

h = ? M

A B d

y

x

Page 9: Tư duy máy tính (Computational thinking) - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/Phat trien tu duy thuat... · - Tư duy trừu tượng trong khoa học

2. Các chuyên đề nghiên cứu

CĐ 1: Thuật toán và những cách tiếp cận dạy học thuật toán trên thế giới

CĐ 2: Cơ sở lí luận của dạy học phát triển tư duy thuật toán

CĐ 3: Các cách tiếp cận dạy học phát triển tư duy thuật toán

CĐ 4: Biện pháp bồi dưỡng HSG môn Tin học

CĐ 5: Rèn luyện và phát triển khả năng tư duy trừu tượng trong KHMT (Theo các mức trừu

tượng của tư duy máy tính)

CĐ 6: Rèn luyện và phát triển tư duy máy tính cho HS THPT

3. Một số gợi ý về phát hiện và bồi dưỡng HSG Tin học

Hãy lập trình giải quyết các bài toán sau

Bài 1: Tỉa mảng

Cho mảng a gồm n phần tử có kiểu dữ liệu xác định. Trong số các phần tử giống nhau hãy giữ lại

một phần tử làm đại diện. Giữ lại thứ tự các phần tử được giữ lại.

Ví dụ

TIAMANG.INP TIAMANG.OUT

9

4 8 8 4 6 8 7 4 6

4

4 8 6 7

Hướng giải quyết

Knowledge Teaching Methods

Cách 1: Dùng mảng đánh dấu

Giả sử mảng đánh dấu là d, đánh dấu bằng cách sau:

d[i] = 1 nếu i đã có trong dãy cần giữ lại

d[i] = 0 nếu i chưa có trong dãy cần giữ lại

Khởi tạo mảng d = 0

Duyệt mảng từ trái sang phải, gặp a[i] mà d[a[i]] = 0 thì

+ Giữ lại a[i] đưa vào mảng lưu trữ b

+ Đánh dấu d[a[i]] = 1

Câu hỏi phát sinh

1) Đưa vào mảng lưu trữ b ntn?

2) Hiểu thuật toán không?

3) In kết quả ntn?

Câu 1: Biến m dùng để đếm các phần khác nhau trong dãy

Khởi tạo m = 0

Giữ lại bằng cách m++ và b[m] = a[i] (hoặc b[++m] = a[i])

Cách 1: Dùng 3 mảng

4) Có cần giữ nguyên mảng a

không? (Có thể dùng mảng a để

lưu)

Dùng 2 mảng trong thuật toán

Thay mảng b bằng mảng a

Khởi tạo m = 0

Giữ lại bằng cách m++ và a[m] = a[i]

5) Có cần dùng mảng d không?

Mô phỏng thuật toán

i 1 2 3 4 5 6 7 8 9

a 4 8 8 4 6 8 7 4 6

d 0 0 0 1 0 1 1 1 0

Lưu

Page 10: Tư duy máy tính (Computational thinking) - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/Phat trien tu duy thuat... · - Tư duy trừu tượng trong khoa học

m 1 2 3 4

b 4 8 6 7

In kq: In mảng b

Có thể dùng mảng a để lưu

Mô phỏng thuật toán

m 1 2 3 4

i 1 2 3 4 5 6 7 8 9

a 4 8 6 7 6 8 7 4 6

d 0 0 0 1 0 1 1 1 0

LÀM MỊN DẦN (Gói thuật toán)

Knowledge Teaching Methods

Cách 2: (Tỉa mảng)

Pha 1: Thực hiện thuật toán trong đó sử dụng gói thuật toán

TimThay(x, m)

B1: Giữ lại phần tử đầu tiên: m = 1

B2: Duyệt từ trái sang phải trên dãy a và giữ lại các phần tử

phân biệt (giữ lại một phần tử làm đại diện)

Với mỗi i = 2, …, n

Nếu not TimThay(a[i], m) thì

(i) m = m + 1

(ii) a[m] = a[i]

Làm mịn dần sử dụng gói thuật

toán

TimThay(x, m) là hàm cho biết

x có mặt trong dãy từ a[1] đến

a[m]

6) Làm thế nào để hàm

TimThay có thể sử dụng trong

các chương trình khác

Để hàm TimThay(x, m) có thể

sử dụng trong các CT khác thì ta

viết là TimThay(x, a, m)

Pha 2: Tìm cách xây dựng hàm TimThay(x, m)

B1: found := false;

B2: For i = 1, …, m

if x = a[i] then {found = true; break;}

7) Hãy so sánh hai cách

C1: Có độ phức tạp O(n); Nhiều

dữ liệu (tốn bộ nhớ);

Không thực hiện được khi dữ

liệu của mảng quá lớn hoặc

không phải kiểu nguyên; Khó

hiểu

C2: Có độ phức tạp O(n2); Tiết

kiệm bộ nhớ; Thực hiện được

với mọi kiểu DL của mảng a;

Dễ hiểu;

Mô phỏng

m 1 2 3 4

i 1 2 3 4 5 6 7 8 9

a 4 8 6 7 6 8 7 4 6

Bài 2: Tỉa mảng bậc k

Cho mảng a gồm n phần tử có kiểu dữ liệu xác định. Trong số các phần tử giống nhau hãy giữ lại

không quá k phần tử làm đại diện. Giữ lại thứ tự các phần tử được giữ lại.

Knowledge Teaching Methods

Tỉa mảng bậc k

Pha 1: Thực hiện thuật toán trong đó sử dụng gói thuật toán

Dem(x, a, m): Đếm số lần x xuất hiện bao nhiêu lần trong dãy

8) Hãy chuyển đoạn phỏng trình

sau đây sang cách nói thông

thường (ngôn ngữ tự nhiên)?

Page 11: Tư duy máy tính (Computational thinking) - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/Phat trien tu duy thuat... · - Tư duy trừu tượng trong khoa học

từ a[1] đến a[m]

B1: Giữ lại phần tử đầu tiên: m = 1

B2: Duyệt từ trái sang phải trên dãy a và giữ lại các phần tử

phân biệt (giữ lại một phần tử làm đại diện)

Với mỗi i = 2, …, n

Nếu Dem(a[i], a, m) < k thì

(i) m = m + 1

(ii) a[m] = a[i]

Với mỗi i = 1, 2, …, n

Nếu Dem(a[i], a, m) < k thì

(i) m = m + 1

(ii) a[m] = a[i]

8‟) Hãy chuyển đoạn chương

trình trình sau đây sang cách nói

thông thường (ngôn ngữ tự

nhiên)?

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

if (Dem(a[i], a, m) < k)

a[++m] = a[i]

Pha 2: Tìm cách xây dựng hàm TimThay(x, m)

B1: d = 0;

B2: For i = 1, …, m

if x = a[i] then d ++;

Mô phỏng, k = 2

m 1 2 3 4 5 6 7

i 1 2 3 4 5 6 7 8 9

a 4 8 8 4 6 7 6 4 6

Bài 3: Đếm số lần xuất hiện từng phần tử trong dãy dữ liệu

Bài 3a. Cho mảng a gồm n phần tử có kiểu dữ liệu nguyên. Hãy thống kê tần số của từng phần tử

(cho biết mỗi phần tử xuất hiện bao nhiêu lần).

Dữ liệu vào

Dòng 1: n

Từ dòng 2, mỗi dòng có m phần tử, trừ dòng cuối cùng.

Ví dụ

DAYSO.INP DAYSO.OUT

4 5 6

5 6 7

5 4

4 2

5 3

6 2

7 1

Cách giải quyết: Cách 1 của bài 1

Điều kiện để giải quyết được:

- Dữ liệu kiểu nguyên

- Giá trị của các phần tử của mảng a đã cho phải không vượt quá độ dài cho phép của một

mảng nguyên trong môi trường của ngôn ngữ lập trình được sử dụng

o Pascal (DOS): 32.000 (vì tổng bộ nhớ được dùng không quá 64k bytes)

o Free Pascal: 1.000.000

INPUT OUTPUT TEMPORARY

n,

a

(đọc từ tệp

m,

a

(ghi ra tệp

d

Page 12: Tư duy máy tính (Computational thinking) - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/Phat trien tu duy thuat... · - Tư duy trừu tượng trong khoa học

DAYSO.INP)

DAYSO.OUT)

Bài 3b. Cho mảng a gồm n phần tử có kiểu dữ liệu nguyên. Hãy thống kê tần số của từng

phần tử. Giá trị mỗi phần tử của mảng a không vượt quá 106 và số lượng phần tử không quá 2 tỉ.

INPUT OUTPUT

các phần tử, mỗi

dòng m phần tử

trừ dòng cuối

cùng (đọc từ tệp

DAYSO.INP)

các dòng dữ liệu, mỗi dòng ghi 2 số i k

trong i là giá trị phần trong tệp và k số lần xuất hiện của i

(ghi ra tệp DAYSO.OUT)

Ví dụ: m = 3

DAYSO.INP DAYSO.OUT

4 5 6

5 6 7

5 4

4 2

5 3

6 2

7 1

Vì a[i] ≤ 106 nên với maxn = 10

6 mảng d có dài maxn.

Và d[i] = số lần xuất hiện của i trong dãy

n = 0;

fillchar(d, sizeof(d), 0);

assign(f, „DAYSO.INP‟); reset(f);

while not eof(f) do

begin n := n + 1; read(f, x); inc(d[x]);

end;

close(f);

Làm thế nào để in kết quả?

Sinh test như thế nào?

In kết quả

Cách 1

assign(f, „DAYSO.OUT‟); rewrite(f);

for i := 1 to maxn do

if d[i] > 0 then writeln(f, i, „ ‟, d[i]);

close(f);

Câu hỏi nghiên cứu chính

- Mục đích của việc dạy các bài tập này là gì? (Dạy bài tập này nhằm rèn luyện và phát triển

cho HS kiến thức gì?, tư duy gì?)

- Phương pháp dạy các bài tập này ntn? (cách đặt câu hỏi? cách tổ chức HS hoạt động học?)

Page 13: Tư duy máy tính (Computational thinking) - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/Phat trien tu duy thuat... · - Tư duy trừu tượng trong khoa học
Page 14: Tư duy máy tính (Computational thinking) - fit.hnue.edu.vnfit.hnue.edu.vn/~trungnc/TextBookAndLectureNote/Phat trien tu duy thuat... · - Tư duy trừu tượng trong khoa học

- Riêng tư duy thuật toán và tư duy trừu tượng những mức độ khác nhau. Tư duy thuật toán gồm 3 mức: Mức thực hiện (performing level), mức chuyển giao (transferring level) và mức thiết kế (design level).

- Tư duy trừu tượng trong khoa học máy tính gồm 4 mức: 1- Mức thực hiện (execution level), 2- mức chương trình (program level), 3- mức đối tượng (object level), và 4- mức vấn đề (problem level) (Xem Jacob C. Perrenet (2009), “Levels of thinking in computer science: Development in bachelor students‟ conceptualiztion of algorithm”, Educ Inf (2010) 15:87-107, DOI 10.1007/s10639-009-9098-

8)