tư duy máy tính (computational thinking) -...
TRANSCRIPT
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
Đổ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
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
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
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]
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);
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);
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
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
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)?
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
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?)
- 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)