Professional Documents
Culture Documents
i 1 2 3 4 5 6 7 8 9
ai < SMIN Đúng Sai Sai Sai Đúng Sai Sai Sai
SMIN 5 4 4 4 4 3 3 3 3
Thuật toán tìm giá trị lớn nhất, nhỏ nhất trong dãy số nguyên rất đơn giản, không khó hiểu với HS.
Nhưng HS lại có thể khó hiểu là do các em chưa biết tại sao máy tính lại phải sử dụng thuật toán
này mới tìm ra được số lớn nhất. Thực tế, nếu GV viết một dãy số nguyên lên bảng (ví dụ, 1, 4, 23,
6, 8, 9) HS có thể thấy ngay được 23 là giá trị lớn nhất mà không nhận thấy sự cần thiết phải thực
hiện thuật toán nêu trên.
Trong trường hợp này, có sự khác biệt giữa con người và máy tính khi giải quyết công việc.
Con người có thể đã nhìn nhiều số đồng thời, với dãy số ngắn như trên con người có thể nhìn cả dãy
số cùng một lúc. Con người có thể nhận diện ra số lớn nhất không chỉ dựa vào giá trị mà có thể còn
qua một số dấu hiệu bổ trợ khác, ví dụ như: độ dài của số (có một số duy nhất có hai chữ số) chẳng
hạn. Với những dấu hiệu bổ trợ, khả năng quan sát và tư duy, con người nhanh chóng "khoanh
vùng" được đáp án và nhanh chóng tìm ra đáp án. Tức là phương án giải của con người không tuần
tự mà có thể bỏ qua một số bước khi cần thiết. Do vậy, trong trong nhiều tình huống con người giải
các bài toán hiệu quả hơn nhiều máy tính.
Tuy nhiên, khả năng này con người lại bị hạn chế trong tình huống dãy số rất lớn (hàng ngàn, hàng
triệu, hàng tỉ số chẳng hạn). Khi đó máy tính lại thể hiện được sức mạnh của mình bởi ưu thế về tốc
độ xử lí.
Để HS hiểu được máy tính làm việc như thế nào, GV có thể yêu cầu các em thực hiện như sau: Viết
10 số nguyên, mỗi số vào một mảnh giấy. Gấp 10 mảnh giấy này lại và bỏ vào một hộp A. Đặt một
hộp B rỗng bên cạnh. Yêu cầu HS chuyển lần lượt đến hết từng mảnh giấy ở hộp A sang hộp B. Sau
khi chuyển xong HS cho biết số số lớn nhất trong các số được ghi trên các mảnh giấy. HS được
phép xem số trên mảnh giấy khi chuyển mảnh giấy đó từ hộp A sang hộp B. Yêu cầu HS không ghi
chép ra giấy. Mục đích của việc không cho học sinh ghi chép là để HS mô phỏng hoạt động của
máy tính: Chỉ cần nhớ số lớn nhất tại thời điểm hiện tại, so sánh với số vừa lấy ra từ hộp A (đang
cầm trên tay) và nhớ lấy số lớn hơn và cứ tiếp tục như vậy đến khi hết các số trong hộp, số được
nhớ cuối cùng là số lớn nhất.
Để thực hiện công việc này cần hướng dẫn HS thực hiện mô phỏng theo giải thuật tìm dãy số
lớn nhất của dãy số nguyên. Nhặt mảnh giấy đầu tiên ở hộp A, mở ra nhớ giá trị của mảnh giấy này
(coi là số lớn nhất tạm thời), gấp lại và bỏ vào hộp B. Nhặt mảnh giấy thứ hai, mở ra và so sánh với
giá trị lớn nhất tạm thời, và nhớ giá trị lớn nhất mới nếu thấy lớn hơn. Lặp lại công việc này đến khi
hết các mảnh giấy của hộp A.
GV có thể thêm, bớt các mảnh giấy để HS làm lại. Sau khi HS làm đề nghị các em mô tả lại
cách các em đã thực hiện để tìm ra số lớn nhất. Cách mà HS làm giống với cách máy tính tính thực
hiện theo thuật toán ở trên. Máy tính chỉ có thể tham chiếu đến từng số trong dãy số, máy tính
không có khả năng quan sát cả dãy số vì vậy máy tính phải thực hiện theo thuật toán như trên. Máy
tính thực hiện tuần tự theo đúng chỉ dẫn của con người, máy tính không có trí thông minh. Tất
nhiên, ngược lại máy tính lại có ưu điểm vượt trội đó là tốc độ xử lí.
Có thể cải biến nội dung dạy học trên đây thành nhiều trò chơi khác nhau. Ví dụ, yêu cầu các em
không sử dụng giấy, bút, GV lần lượt viết từng số lên bảng, rồi xoá đi luôn, HS quan sát để tìm ra số
lớn nhất (hoặc nhỏ nhất). Hoặc mời một nhóm HS đứng lên phía trên lớp. Mời một em đi qua từng
bạn một, khi em này đến bên bạn nào đó thì bạn này phải đưa ra một số nào đó (có thể là nói thầm
hoặc viết ra một mảnh giấy). Đi hết lượt HS phải nói được bạn nào đã đưa ra số lớn nhất (hoặc nhỏ
nhất). Kết quả này được kiểm chứng công khai bởi các bạn đã đưa ra các số.
Thuật toán tìm Max của dãy số nguyên nhập từ bàn phím như sau:
Bước 1. Nhập N và dãy A1,..., An
Bước 2. Max ← A1
Bước 3. Lần lượt gán giá trị từ 2 đến N cho i. Với mỗi giá trị của i thì thực hiện: Nếu Max <Ai
thì Max←Ai
Bước 4. Đưa ra màn hình giá trị Max rồi kết thúc.
Sau khi giới thiệu xong thuật toán tìm Max giáo viên hướng dẫn HS xác định các biến, kiểu biến và
viết khai báo biến; viết câu lệnh thực hiện các bước nhập N, nhập các phần tử của mảng, tìm Max,
in Max ra màn hình. Chương trình có thể được xây dựng dần từng phần và cuối cùng có được một
chương trình như dưới đây.
program P_Max;
Var
i, N, Max : integer;
A: array[1..100] of integer;
Begin
{Nhap N}
write('Hay nhap do dai cua day so, N = '); readln(N);
{Nhap day so}
writeln('Nhap cac phan tu cua day so:');
For i:=1 to N do
Begin
write('a[',i,']='); readln(a[i]);
End;
{Tim Max}
Max:=a[1];
for i:=2 to n do if Max<a[i] then Max:=a[i];
{Hien thi Max ra man hinh}
write('So lon nhat la Max = ',Max);
readln;
End.
Yêu cầu HS chỉnh sửa chương trình trên để tìm giá trị nhỏ nhất của dãy số nguyên, tính tổng
dãy số. Sau khi đã hiểu -rõ thuật toán và chương trình tìm Max, Min có thể yêu cầu HS kết hợp tìm
Max, Min trong cùng một chương trình như trong SGK.
uses crt;
var i, Max: integer;
A: array[1..5] of integer;
begin
clrscr;
for i:=1 to 5 do
begin write('Nhap so thu ',i,':'); readln(A[i]) end;
Max:=a[1];
for i:=2 to 5 do If Max<a[i] then Max:=a[i];
writeln('So lon nhat: ',Max);
end.
Lưu ý. Xem cách viết chương trình ngắn gọn hơn và không sử dụng biến mảng trong bài tập
9, bài 7. Tuy nhiên, cách viết đó sẽ không cho kết quả mong muốn nếu sau khi nhập giá trị
của các biến còn cần thực hiện các thao tác dữ liệu khác với các giá trị đó.
Bài 8. Viết chương trình sử dụng biến mảng để tính giá trị trung bình của tổng N số nguyên được
nhập vào từ bàn phím.
uses crt;
var N, i: integer;
TB: real;
A: array[1..100] of real;
begin
clrscr;
write('Nhap so phan tu cua mang, n= '); read(n);
for i:=1 to n do
begin
write('Nhap gia tri ',i,'cua mang, a[',i,']= ');
readln(a[i])
end;
TB:=0;
for i:=1 to n do TB:=TB+a[i];
TB:=TB/n;
write('Trung binh bang ',TB);
end.
Bài 9. Chương trình nhập n số nguyên từ bàn phím và tính tổng các số dương:
uses crt;
var n,k,S: integer;
X: array[1..1000] of integer;
begin
clrscr;
write('Nhap so tu nhien n: '); readln(n);
for k:=1 to n do
begin write('Nhap X[',k,']='); readln(X[k]) end;
S:=0;
for k:=1 to n do
if X[k]>0 then S:=S+X[k];
writeln('Tong cac duong S=',S);
readln;
end.
Bài 10. Nội dung bài 2 của bài thực hành 6 là viết chương trình nhận biết mộtĐể có thể liệt kê,
chương trình cần phải ghi lại chúng. ý tưởng chính là sử dụng một biến mảng phục vụ cho điều
này. Chương trình tương tự như trong bài tập 9, Bài 8:
uses crt;
var n,i,k,S: integer;
X: array[1..10000] of integer;
begin
clrscr;
i:=2; S:=0;
for k:=1 to (n-1) do X[k]:=0; {Dat lai = 0}
write('Cho so tu nhien n>2: n= '); readln(n);
while i<=(n-1) do {Ghi lai uoc so vao X[i]}
begin if (n mod i)=0 then begin X[i]:=i; S:=S+X[i] end;
i:=i+1;
end;
writeln('Tong cac uoc so thuc su cua ',n,' la: ',S);
if S<>0 then begin write('Cac uoc so cua ',n,' la: ');
for i:=1 to (n-1) do if X[i]<>0 then write(X[i],' ') end
else writeln(n,' la so nguyen to.');
readln;
end.