Tải bản đầy đủ (.doc) (27 trang)

Sử dụng ngôn ngữ lập trình Pascal để xây dựng chương trình minh họa cho các thuật toán trong sách giáo khoa Tin học 10

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (898.34 KB, 27 trang )

Sáng kiến – Kinh nghiệm

Người thực hiện: Nguyễn Thị Khuyên

Phần 1: ĐẶT VẤN ĐỀ
Kính thưa quý thầy cô giáo!
Nếu quý thầy cô đã và đang dạy bộ môn Tin học 10 thì hẳn thầy cô sẽ có
nhận xét ngay rằng: Trong học kỳ I, bài số 4 – Bài toán và thuật toán là một
bài khó dạy và học sinh khó có thể hiểu được các ví dụ mà sách giáo khoa
(SGK) đã đưa ra.
Với thời lượng là 6 tiết (5 tiết lý thuyết + 1 tiết bài tập), giáo viên rất khó
để truyền tải được toàn bộ các thuật toán ở trong SGK. Vậy thì có thể bỏ bớt
một vài thuật toán hay không? Tất nhiên là có thể, bởi vì bản thân người viết
sách cũng không yêu cầu phải truyền đạt hết tất cả những gì có trong sách.
Tuy nhiên, theo nhận định của cá nhân tác giả thì những thuật toán mà những
người viết sách đưa ra là rất hay, vấn đề còn lại là làm thế nào để học sinh có
thể hiểu được các thuật toán này? Có lẽ là quý thầy cô sẽ có cùng ý kiến với
tác giả là: Hãy minh họa thuật toán với thật nhiều bộ Test. Và ở trong SGK
cũng đã thực hiện theo cách này, nhưng chỉ với một vài bộ Test. Còn nếu thầy
cô minh họa trên bảng thì sẽ rất tốn thời gian. Ví dụ như ở thuật toán sắp xếp
bằng tráo đổi, ở mỗi bước, nếu có sự tráo đổi các phần tử thì ta cần phải viết
lại dãy số để thấy được sự tráo đổi này. Vậy thì đâu là giải pháp?
Xuất phát từ thực tế giảng dạy và từ trong nội dung chương trình Tin học
phổ thông: Toàn bộ chương trình Tin học 11 đều nghiên cứu về lập trình, là
kiến thức có liên quan mật thiết với các thuật toán, và sử dụng ngôn ngữ lập
trình (NNLT) Pascal để minh họa, bản thân tác giả nhận thấy rằng: chúng ta
hoàn toàn có thể sử dụng NNLT Pascal để xây dựng những chương trình minh
họa cho các thuật toán này. Đó cũng chính là lý do để tác giả viết đề tài “Sử
dụng ngôn ngữ lập trình Pascal để xây dựng chương trình minh họa cho
các thuật toán trong sách giáo khoa Tin học 10”.


Sử dụng ngôn ngữ lập trình Pascal …

Trang 1 / 27


Sáng kiến – Kinh nghiệm

Người thực hiện: Nguyễn Thị Khuyên

Ở đây, tác giả muốn đưa thêm một cách minh họa (mô phỏng) bộ Test
trực tiếp trên sơ đồ khối thuật toán Tìm giá trị lớn nhất của một dãy số nguyên
để thầy cô tham khảo.
Tác giả rất mong được sự góp ý của quý thầy cô để đề tài ngày càng
được hoàn thiện hơn. Xin chân thành cảm ơn!

Phần 2: NHỮNG BIỆN PHÁP GIẢI QUYẾT VẤN ĐỀ
Như ở phần 1 của đề tài này, tác giả đã trình bày giải pháp của mình để
minh họa cho các thuật toán được nêu ra trong SGK Tin học 10. Có thể thầy
cô sẽ đặt ra câu hỏi: Có thể minh họa như thế nào để đạt được hiệu quả cao
nhất?
Theo tác giả thì để có thể sử dụng cách minh họa này một cách hiệu quả,
điều cần thiết là phải có máy chiếu để học sinh có thể tiện theo dõi phần minh
họa. Kế tiếp là giáo viên cần phải có hình ảnh minh họa sơ đồ khối của thuật
toán (trên giấy khổ lớn hoặc trên bảng phụ), và cách minh họa để có hiệu quả
cao nhất là giáo viên cho chạy chương trình trên máy tính (học sinh theo dõi
trên màn chiếu), tại mỗi bước của chương trình cần chỉ rõ là chương trình
đang minh họa bước nào trên sơ đồ khối, và cần hỏi học sinh theo sơ đồ khối
thì kết quả của bước kế tiếp sẽ là gì? Sự tác động qua lại này sẽ giúp cho tiết
học sinh động hơn, và quan trọng là học sinh sẽ hiểu các thuật toán một cách
dễ dàng hơn.

Với hướng giải quyết này, tác giả đã xây dựng các chương trình minh
họa cho các thuật toán. Mỗi bài toán, tác giả trình bày qua 5 bước:
1. Xác định bài toán.
2. Mô tả thuật toán (bằng sơ đồ khối).
3. Viết chương trình chuẩn minh họa thuật toán. Với chương trình này,
khi chạy, ta chỉ có thể thấy được Output của bài toán mà không thấy được
từng bước của thuật toán.
Sử dụng ngôn ngữ lập trình Pascal …

Trang 2 / 27


Sáng kiến – Kinh nghiệm

Người thực hiện: Nguyễn Thị Khuyên

4. Giới thiệu chương trình minh họa chi tiết cho thuật toán. Đây chính là
chương trình tác giả sẽ dùng để minh họa, khi chạy, ta sẽ thấy từng bước của
thuật toán.
5. Minh họa chương trình khi chạy bằng một vài hình ảnh. Qua đây,
chúng ta có thể biết chương trình sẽ minh họa thuật toán như thế nào.
Trong thuật toán Tìm giá trị lớn nhất của một dãy số nguyên, tác giả đưa
thêm một cách mô phỏng thuật toán trên sơ đồ khối.
* Một số vấn đề cần lưu ý khi xây dựng chương trình minh họa:
1. Để minh họa thuật toán với nhiều bộ Test khác nhau, tác giả đã sử
dụng vòng lặp Repeat–Until để lặp lại quá trình sử dụng chương trình. Chỉ khi
nào người dùng nhấn phím ESC (sau mỗi lần minh họa với 1 bộ Test) thì
chương trình mới đóng lại (thể hiện ở điều kiện Readkey = #27).
2. Trong các chương trình minh họa chi tiết, bắt đầu chương trình luôn là
lệnh Textmode(C40); đây là lệnh chuyển chế độ hiển thị văn bản trên

màn hình (cần sử dụng thư viện DOS), mục đích của lệnh này là để cho văn
bản hiển thị với cỡ chữ lớn hơn (để phù hợp với việc minh họa trên máy
chiếu).
3. Trong các chương trình minh họa chi tiết, thầy cô sẽ thấy thủ tục
TextColor(u>) xuất hiện rất nhiều lần. Thủ tục này dùng để tô
màu chữ (cần sử dụng thư viện CRT) và được sử dụng để làm nổi bật các chi
tiết quan trọng của bước hiện tại trong thuật toán.
Sau đây là một số chương trình mà tác giả đã xây dựng để minh họa các
thuật toán trong SGK Tin học 10:
I. BÀI TOÁN THỨ NHẤT: TÌM GIÁ TRỊ LỚN NHẤT CỦA MỘT DÃY
SỐ NGUYÊN
1. Xác định bài toán
- Input: Số nguyên dương N và dãy N số nguyên a1, a2, ..., aN.
- Output: Giá trị lớn nhất Max của dãy số.
Sử dụng ngôn ngữ lập trình Pascal …

Trang 3 / 27


Sáng kiến – Kinh nghiệm

Người thực hiện: Nguyễn Thị Khuyên

2. Sơ đồ khối mô tả thuật toán
Nhập N và dãy a1, a2, ..., aN
Max ← a1; i← 2
i > N?

Đúng


Đưa ra Max
rồi kết thúc

Sai
ai > Max?

Sai

Đúng
Max ← ai
i←i+1

3. Chương trình chuẩn tương ứng với thuật toán
Với sơ đồ khối trên, chương trình chuẩn cài đặt thuật toán trên ngôn ngữ
lập trình Pascal sẽ là:
Program Tim_Max;
Const NMax = 200;
Var a: Array[1..NMax] of Integer;
N, i: Byte;
Max: Integer;
Begin
Write(' Nhap so nguyen duong N: '); Readln(N);
For i:=1 to N do
Begin
Write('
Nhap so hang thu ',i,': ');
Readln(a[i]);
End;
Max:=a[1];

For i:= 2 to N do
If a[i]>Max then Max:=a[i];
Writeln(' So lon nhat trong day vua nhap la: ',Max);
Readln
End.

4. Chương trình minh họa chi tiết
Chúng ta có thể thấy với chương trình trên thì sau khi chạy, trên màn
hình chỉ xuất hiện kết quả là số lớn nhất trong dãy mà không đi chi tiết từng

Sử dụng ngôn ngữ lập trình Pascal …

Trang 4 / 27


Sáng kiến – Kinh nghiệm

Người thực hiện: Nguyễn Thị Khuyên

bước trong thuật toán. Như vậy, học sinh sẽ không thấy rõ được từng bước
trong thuật toán. Chương trình sau sẽ khắc phục được điều này:
Program Tim_Max;
Uses Crt, Dos;
Const NMax = 200;
Var a: Array[1..NMax] of Integer;
N, i: Byte;
Max: Integer;
Procedure Xuat;
Var j: Integer;
Begin

For j:=1 to N do
Begin
If j=i then Textcolor(Yellow)
Else Textcolor(White);
Write(a[j]:4);
Textcolor(White);
End;
Readln;
End;
Begin
Textmode(C40);
Repeat
TextColor(White); Clrscr;
Write(' Nhap so nguyen duong N: '); Readln(N);
For i:=1 to N do
Begin
Write('
Nhap so hang thu ',i,': ');
Readln(a[i]);
End;
i:=N+1; Writeln(' Day so vua nhap:'); Xuat;
Max:=a[1];
TextColor(LightGreen);
Writeln(' Khoi tao: Max = a[1] = ',Max);
For i:= 2 to N do
Begin
TextColor(White); Writeln;
Writeln(' i = ',i,':');
Xuat;
Write(' a[',i,'] = ',a[i]);

If a[i]>Max then
Begin
Writeln(' > Max (= ',Max,')');
TextColor(LightGreen);
Max:=a[i];
Writeln('
==> Max = ',Max);
End
Else If a[i]=Max then Writeln(' = Max (=
',Max,')')

Sử dụng ngôn ngữ lập trình Pascal …

Trang 5 / 27


Sáng kiến – Kinh nghiệm

Người thực hiện: Nguyễn Thị Khuyên
Else Writeln(' < Max (= ',Max,')');

End;
Writeln;
TextColor(LightGreen);
Writeln(' Ket luan: Max = ',Max);
TextColor(LightCyan);
Writeln('Phim bat ky = Tiep tuc. ESC = Ket thuc');
Until Readkey = #27;
End.


5. Minh họa chương trình khi chạy
Dưới đây là hình ảnh minh họa chương trình khi chạy:

6. Mô phỏng thuật toán trên sơ đồ khối

Sử dụng ngôn ngữ lập trình Pascal …

Trang 6 / 27


Sáng kiến – Kinh nghiệm

Sử dụng ngôn ngữ lập trình Pascal …

Người thực hiện: Nguyễn Thị Khuyên

Trang 7 / 27


Sáng kiến – Kinh nghiệm

Sử dụng ngôn ngữ lập trình Pascal …

Người thực hiện: Nguyễn Thị Khuyên

Trang 8 / 27


Sáng kiến – Kinh nghiệm


Người thực hiện: Nguyễn Thị Khuyên

II. BÀI TOÁN THỨ HAI: KIỂM TRA TÍNH NGUYÊN TỐ
1. Xác định bài toán
- Input: Số nguyên dương N.
- Output: Kết luận: “N là số nguyên tố” hoặc “N không là số nguyên tố”.
2. Sơ đồ khối mô tả thuật toán
Nhập N
Đúng

N=1?
Sai
N<4?

Đúng

Sai
i← 2

Đúng

?

Thông báo N
là số nguyên tố
rồi kết thúc

Sai
i←i+1


Thông báo N
là số nguyên tố
rồi kết thúc

Sai

N chia hết
cho i?
Đúng

3. Chương trình chuẩn tương ứng với thuật toán
Program Nguyen_To;
Var N, i: Word;
TL: Boolean;
Begin
Write(' Nhap so nguyen duong N = ');
Readln(N);
If N = 1 then TL:= False
Else
If N < 4 then TL:= True
Else
Begin

Sử dụng ngôn ngữ lập trình Pascal …

Trang 9 / 27


Sáng kiến – Kinh nghiệm


Người thực hiện: Nguyễn Thị Khuyên
i:= 2;
While (i <= Trunc(Sqrt(N))) and (N mod
i <> 0) do i:=i+1;
If i > Trunc(Sqrt(N)) then TL:= True
Else TL:=False;

End;
If TL then Writeln(N,' la so nguyen to')
Else Writeln(N,' khong phai la so nguyen to');
Readln
End.

4. Chương trình minh họa chi tiết
Program Nguyen_To;
Uses Dos, Crt;
Var N, i: Word;
TL: Boolean;
Begin
Textmode(C40);
Repeat
Clrscr;
Textcolor(White);
Write('Nhap so nguyen duong N = ');
Readln(N);
Writeln; Writeln;
Textcolor(Yellow);
If N = 1 then
TL:= False
Else

If N < 4 then
TL:= True
Else
Begin
Write('[√',N,']=',Trunc(Sqrt(N)));
Readln;
i:= 2;
While i <= Trunc(Sqrt(N)) do
Begin
Write('i = ',i,': ');
If N mod i <> 0 then
Begin
Write(N,' khong
chia het cho ',i);
Readln;
i:= i+1;
End
Else
Begin
Write(N,' chia
het cho ',i);
TL:= False;
Readln;

Sử dụng ngôn ngữ lập trình Pascal …

Trang 10 / 27


Sáng kiến – Kinh nghiệm


Người thực hiện: Nguyễn Thị Khuyên
Break;
End;
End;
If i = Trunc(Sqrt(N))+1 then
Begin
TL:= True;
Writeln('i = ',i,' >
[√',N,']');
End;

End;
Textcolor(LightGreen);
Writeln; Write('Ket luan: ');
If TL then Writeln(N,' la so nguyen to')
Else Writeln(N,' khong phai la so nguyen to');
Writeln; Writeln;
Textcolor(White);
Write('Phim bat ky=tiep tuc. ESC=ket thuc');
Until Readkey = #27;
End.

5. Minh họa chương trình khi chạy








III. BÀI TOÁN THỨ BA: SẮP XẾP DÃY SỐ BẰNG THUẬT TOÁN
TRÁO ĐỔI
1. Xác định bài toán
- Input: Số nguyên dương N và dãy A gồm N số nguyên a1, a2, …, aN.
- Output: Dãy A đã được sắp xếp thành một dãy không giảm.

Sử dụng ngôn ngữ lập trình Pascal …

Trang 11 / 27


Sáng kiến – Kinh nghiệm

Người thực hiện: Nguyễn Thị Khuyên

2. Sơ đồ khối mô tả thuật toán
Nhập N và dãy a1, a2, ..., aN
M←N

M<
2?
Sai

Đúng

Đưa ra A
rồi kết thúc

M ← M – 1; i ← 0

i←i+1
Đúng

i > M?
Sai

Tráo đổi ai và ai+1

Đúng

ai > ai+1?
Sai

3. Chương trình chuẩn tương ứng với thuật toán
Program Sap_Xep;
Uses Crt;
Const Max = 50;
Type M1C = Array[1..Max] of Integer;
Var a: M1C; Tam, M: Integer;
N, i: Byte;
Procedure Xuat;
Var j: Integer;
Begin
For j:=1 to N do Write(a[j]:4);
Readln;
End;
Begin
Clrscr;
Write(' Nhap so phan tu N = ');
Readln(N);

For i:=1 to N do
Begin
Write('
Nhap phan tu thu ',i,': ');
Readln(a[i]);
End;
Writeln(' Day vua nhap:'); Xuat;
M:= N;
While M>=2 do

Sử dụng ngôn ngữ lập trình Pascal …

Trang 12 / 27


Sáng kiến – Kinh nghiệm

Người thực hiện: Nguyễn Thị Khuyên

Begin
M:=M-1;
For i:= 1 to M do
If a[i]>a[i+1] then
Begin
Tam:=a[i];
a[i]:=a[i+1];
a[i+1]:=Tam;
End;
End;
Writeln(' Day sau khi xep:'); Xuat;

End.

4. Chương trình minh họa chi tiết
Program Sap_Xep;
Uses Dos, Crt;
Const Max = 50;
Type M1C = Array[1..Max] of Integer;
Var a: M1C; Tam, M: Integer;
N, i, Dau: Byte;
Procedure Xuat;
Var j: Integer;
Begin
For j:=1 to N do
Begin
If (j=Dau)or(j=Dau+1) then Textcolor(Yellow)
Else
If j>M+1 then Textcolor(LightGreen)
Else Textcolor(White);
Write(a[j]:4);
End;
Textcolor(White);
Readln;
End;
Begin
Textmode(C40);
Repeat
Textcolor(White);
Clrscr;
Write(' Nhap so phan tu N = ');
Readln(N);

For i:=1 to N do
Begin
Write('
Nhap phan tu thu ',i,': ');
Readln(a[i]);
End;
Dau:=N+1;
M:= N;
Writeln(' Day vua nhap:'); Xuat;
Textcolor(LightGreen);
Write(' Gia tri khoi tao: M = ',M);

Sử dụng ngôn ngữ lập trình Pascal …

Trang 13 / 27


Sáng kiến – Kinh nghiệm

Người thực hiện: Nguyễn Thị Khuyên

If M<2 then Writeln(' < 2')
Else Writeln(' > 2');
While M>=2 do
Begin
Textcolor(Yellow);
Writeln(' M = ',M);
M:=M-1;
For i:= 1 to M do
Begin

If a[i]>a[i+1] then
Begin
Tam:=a[i];
a[i]:=a[i+1];
a[i+1]:=Tam;
Dau:=i;
Xuat;
End;
End;
End;
Dau:=N+1; Textcolor(White); M:=-1;
Writeln(' Day sau khi xep:'); Xuat;
Writeln;
Write('Phim bat ky=Tiep tuc. ESC=Ket thuc');
Until Readkey=#27;
End.

Trong chương trình này, biến M đóng vai trò là số phần tử cần sắp xếp
trong dãy, biến này có giá trị giảm dần từ N đến 1 (khi M=1 thì vòng lặp
While–do kết thúc và quá trình sắp xếp cũng kết thúc). Biến Dau dùng để
đánh dấu các phần tử được tráo đổi trong bước lặp hiện tại (phần tử thứ Dau
và Dau+1).
Trong thủ tục Xuat, các phần tử thứ Dau và thứ Dau+1 sẽ được tô màu
vàng (bởi câu lệnh If (j=Dau)or(j=Dau+1) then Textcolor(Yellow)),
các phần tử đã được sắp xếp sẽ được tô màu xanh lá cây (bởi câu lệnh If
j>M+1 then Textcolor(LightGreen) - Do trong vòng lặp While–do,

lệnh M:=M-1 được gọi đầu tiên nên thực tế, các phần tử chưa đã được sắp
xếp là các phần tử từ vị trí thứ M+2 trở đi), các phần tử còn lại sẽ được tô màu
trắng.

Trong quá trình sắp xếp, thủ tục Xuat chỉ được gọi khi tại bước lặp trong
vòng For–do có sự tráo đổi. Do đó, tùy thuộc vào dữ liệu nhập vào, có thể
Sử dụng ngôn ngữ lập trình Pascal …

Trang 14 / 27


Sáng kiến – Kinh nghiệm

Người thực hiện: Nguyễn Thị Khuyên

ứng với 1 hay nhiều giá trị của M (ở những bước lặp cuối), thủ tục này không
được gọi đến.
5. Minh họa chương trình khi chạy

IV. BÀI TOÁN THỨ TƯ: THUẬT TOÁN TÌM KIẾM TUẦN TỰ
1. Xác định bài toán
- Input: Số nguyên dương N, dãy N số nguyên khác nhau a 1, a2, …, aN và
số nguyên k.
- Output: Chỉ số i mà ai = k hoặc thông báo không có số hạng nào của
dãy A có giá trị bằng k.

Sử dụng ngôn ngữ lập trình Pascal …

Trang 15 / 27


Sáng kiến – Kinh nghiệm

Người thực hiện: Nguyễn Thị Khuyên


2. Sơ đồ khối mô tả thuật toán
Nhập N, a1, a2, ..., aN và k
i←1

ai = k?

Đúng

Đưa ra i
rồi kết thúc

Sai
i←i+1
Sai
i > N?
Đúng
Thông báo dãy A không có số hạng
nào có giá trị bằng k rồi kết thúc

3. Chương trình chuẩn tương ứng với thuật toán
Program Tim_Kiem_Tuan_Tu;
Uses Crt;
Const Max = 50;
Type M1C = Array[1..Max] of Integer;
Var a: M1C;
N, i: Byte;
k: Integer;
Procedure Xuat;
Begin

For i:=1 to N do Write(a[i]:4); Readln;
End;
Begin
Clrscr;
Write(' Nhap so phan tu cua day, N = ');
Readln(N);
For i:=1 to N do
Begin
Write(' Nhap phan tu thu ',i,': '); Readln(a[i]);
End;
i:=N+1; Writeln(' Day so vua nhap:'); Xuat;
Write(' Nhap so can tim, k = '); Readln(k);
i:=1;
While (i<=N)and(a[i]<>k) do i:=i+1;
If i<=N then Writeln('Tim thay ',k,' tai vi tri thu ',i)
Else
Writeln('Khong tim thay ',k,' trong day so vua nhap');
Readln
End.

Sử dụng ngôn ngữ lập trình Pascal …

Trang 16 / 27


Sáng kiến – Kinh nghiệm

Người thực hiện: Nguyễn Thị Khuyên

4. Chương trình minh họa chi tiết

Program Tim_Kiem_Tuan_Tu;
Uses Dos, Crt;
Const Max = 50;
Type M1C = Array[1..Max] of Integer;
Var a: M1C;
N, i: Byte;
k: Integer;
Procedure Xuat;
Var j: Integer;
Begin
For j:=1 to N do
Begin
If j=i then Textcolor(Yellow)
Else Textcolor(White);
Write(a[j]:4);
Textcolor(White);
End;
Readln;
End;
Begin
Textmode(C40);
Repeat
Textcolor(White); Clrscr;
Write(' Nhap so phan tu cua day, N = ');
Readln(N);
For i:=1 to N do
Begin
Write('
Nhap phan tu thu ',i,': ');
Readln(a[i]);

End;
i:=N+1; Writeln(' Day so vua nhap:'); Xuat;
Write(' Nhap so can tim, k = '); Readln(k);
i:=1;
While i<=N do
Begin
Writeln('
i = ',i,':');
Xuat;
Write('
a[',i,'] = ',a[i]);
If a[i]=k then Writeln(' = k')
Else Writeln(' <> k');
Writeln;
If a[i]=k then Break
Else i:=i+1;
End;
Textcolor(LightGreen);
If i<=N then Writeln(' Tim thay ',k,' tai vi tri
thu ',i)
Else Writeln(' Khong tim thay ',k,' trong day so
vua nhap');
Textcolor(White);
Write(' Phim bat ky = Tiep tuc. ESC = Ket thuc');
Until Readkey = #27;
End.

Sử dụng ngôn ngữ lập trình Pascal …

Trang 17 / 27



Sáng kiến – Kinh nghiệm

Người thực hiện: Nguyễn Thị Khuyên

5. Minh họa chương trình khi chạy

Trường hợp 1:
Tìm thấy k trong dãy
vừa nhập

Trường hợp 2:
Không tìm thấy k trong
dãy vừa nhập

V. BÀI TOÁN THỨ NĂM: THUẬT TOÁN TÌM KIẾM NHỊ PHÂN
1. Xác định bài toán
- Input: Số nguyên dương N, dãy A là dãy tăng gồm N số nguyên khác
nhau a1, a2, …, aN và một số nguyên k.
- Output: Chỉ số i mà ai = k hoặc thông báo không có số hạng nào của
dãy A có giá trị bằng k.
Sử dụng ngôn ngữ lập trình Pascal …

Trang 18 / 27


Sáng kiến – Kinh nghiệm

Người thực hiện: Nguyễn Thị Khuyên


2. Sơ đồ khối mô tả thuật toán
Nhập N, a1, a2, ..., aN và k
Dau ← 1; Cuoi ← N
Giua ← [(Dau + Cuoi )/2]

aGiua = k?

Đúng

Sai
Đúng

aGiua > k?

Cuoi ← Giua – 1

Sai

Sai

Dau ← Giua + 1
Đưa ra Giua
rồi kết thúc

aGiua = k?
Đúng

Thông báo dãy A không có số hạng
nào có giá trị bằng k rồi kết thúc


3. Chương trình chuẩn tương ứng với thuật toán
Program Tim_Kiem_Nhi_Phan;
Uses Crt;
Const Max = 50;
Type M1C = Array[1..Max] of Integer;
Var a: M1C;
N, i, Dau, Cuoi, Giua: Byte;
k: Integer;
Begin
Clrscr;
Write(' Nhap so phan tu cua day, N = '); Readln(N);
For i:=1 to N do
Begin
Write('
Nhap phan tu thu ',i,': ');
Readln(a[i]);
End;
Writeln(' Day so vua nhap:');
For i:=1 to N do Write(a[i]:4);
Readln;
Write(' Nhap so can tim, k = '); Readln(k);
Dau:=1; Cuoi:=N; Giua:=(Dau+Cuoi) div 2;
While (Dau<=Cuoi) and (a[Giua]<>k) do
Begin
If a[Giua]>k then Cuoi:=Giua-1
Else Dau:=Giua+1;
Giua:=(Dau+Cuoi) div 2;

Sử dụng ngôn ngữ lập trình Pascal …


Trang 19 / 27


Sáng kiến – Kinh nghiệm

Người thực hiện: Nguyễn Thị Khuyên

End;
If a[Giua]=k then
Write(' Tim thay ',k,' tai vi tri thu ',Giua)
Else Write(' Khong tim thay ',k,' trong day vua nhap');
Readln
End.

4. Chương trình minh họa chi tiết
Program Tim_Kiem_Nhi_Phan;
Uses Dos, Crt;
Const Max = 50;
Type M1C = Array[1..Max] of Integer;
Var a: M1C;
N, i, j, Dau, Cuoi, Giua: Byte;
k: Integer;
Procedure Xuat;
Begin
For j:=1 to N do
Begin
If (j>=Dau) and (j<=Cuoi) then
Textcolor(Lightgreen)
Else Textcolor(White);

If j=Giua then Textcolor(Yellow);
Write(a[j]:4);
Textcolor(White);
End;
Readln;
End;
Procedure Sap_Xep;
Begin
For i:=N-1 downto 1 do
For j:=1 to i do
If a[j]>a[j+1] then
Begin
k:=a[j]; a[j]:=a[j+1]; a[j+1]:=k;
End;
End;
Begin
Textmode(C40);
Repeat
Textcolor(White); Clrscr;
Write(' Nhap so phan tu cua day, N = '); Readln(N);
For i:=1 to N do
Begin
Write('
Nhap phan tu thu ',i,': ');
Readln(a[i]);
End;
Dau:=N; Cuoi:=1; Giua:= N+1;
Writeln(' Day so vua nhap:'); Xuat;
Sap_Xep;
Writeln(' Day so sau khi sap xep:'); Xuat;

Write(' Nhap so can tim, k = '); Readln(k);
Dau:=1; Cuoi:=N; Giua:=(Dau+Cuoi) div 2;
i:=1;
If a[Giua]=k then
Begin

Sử dụng ngôn ngữ lập trình Pascal …

Trang 20 / 27


Sáng kiến – Kinh nghiệm

Người thực hiện: Nguyễn Thị Khuyên
Textcolor(LightBlue);Writeln('Lan thu ',i);
Textcolor(White);
Writeln(' Dau = ',Dau,' ; Cuoi = ',Cuoi,' ;
Giua = ',Giua);
Xuat;
Writeln(' a[Giua] = ',a[Giua],' = k');

End
Else
While (Dau<=Cuoi) and (a[Giua]<>k) do
Begin
Giua:=(Dau+Cuoi) div 2;
Textcolor(LightCyan);
Writeln(' Lan thu ',i);
Textcolor(White);
Writeln(' Dau = ',Dau,' ; Cuoi

='
,Cuoi,'
;
Giua
=
',Giua);
Xuat;
Write(' a[Giua] = ',a[Giua]);
If a[Giua]>k then Write(' > ',k)
Else
If a[Giua]Else Write(' = ',k);
Readln;
If a[Giua]>k then Cuoi:=Giua-1
Else Dau:=Giua+1;
i:=i+1;
End;
If a[Giua]=k then
Begin
Textcolor(LightGreen);
Writeln(' Ket luan:');
Writeln('

Tim thay ',k,' tai vi tri thu ',Giua);

End
Else
Begin

Textcolor(LightCyan);

Writeln(' Lan thu ',i);
Textcolor(White);
Write(' Dau = ',Dau,', Cuoi = ',Cuoi);
Textcolor(LightRed);
Writeln(' ==> Dau > Cuoi');
Textcolor(LightGreen);
Writeln(' Ket luan:');
Writeln('
Khong tim thay ',k,' trong day
vua nhap');

End.

End;
Textcolor(Yellow);
Write(' Phim bat ky = Tiep tuc. ESC = Ket thuc');
Until Readkey = #27;

Trong chương trình này, trước hết, ta cần biết vì sao cần có thủ tục
Sap_Xep? Thực ra thì nếu với dữ liệu vào đúng như yêu cầu của bài toán thì
Sử dụng ngôn ngữ lập trình Pascal …

Trang 21 / 27


Sáng kiến – Kinh nghiệm

Người thực hiện: Nguyễn Thị Khuyên

không cần phải sắp xếp. Tuy nhiên, trong thực tế, điều này sẽ làm mất công

khi nhập dữ liệu, do đó, tác giả đưa thêm vào thủ tục này để giảm bớt gánh
nặng khi nhập dữ liệu và coi như dữ liệu vào là dãy số sau khi đã sắp xếp.
Chúng ta hoàn toàn có thể bỏ thủ tục này đi và yêu cầu khi nhập dữ liệu phải
đúng như yêu cầu của bài toán.
Điều cần quan tâm thứ hai trong chương trình là: Trong thủ tục Xuat, ta
có thể thấy rằng các phần tử ở trong phạm vi tìm kiếm (từ Dau tới Cuoi) sẽ
được tô màu xanh lá cây, phần tử thứ Giua sẽ được tô màu vàng để dễ nhận
biết, còn các phần tử khác sẽ được tô màu trắng. Việc tô màu này là rất cần
thiết khi chạy chương trình để minh họa cho học sinh. Cũng chính vì việc tô
màu này mà ở 2 lần xuất dãy số đầu tiên, ta thấy có dãy lệnh gán:
Dau:=N; Cuoi:=1; Giua:= N+1;

Thực chất dãy lệnh này chỉ để “đánh lừa” máy tính, coi tất cả các phần
tử đều là các “phần tử khác” (như trên đã nói) và tất cả đều được tô màu
trắng.
Một vấn đề nữa là, ở trong chương trình này, ta thấy có một số câu lệnh
bị lặp lại, cụ thể là các câu lệnh
Writeln(' Lan thu ',i);

Write(' Dau = ',Dau,', Cuoi = ',Cuoi);


Vậy liệu việc lặp lại này có phải là thừa không? Có thể chương trình
minh họa này chưa được thiết kế một cách tối ưu, nhưng theo ý tác giả thì các
câu lệnh này được đưa vào để xét các trường hợp riêng như ở phần minh họa,
đó là các trường hợp: Tìm thấy sau lần duyệt đầu tiên; Tìm thấy sau nhiều lần
duyệt; Không tìm thấy.

Sử dụng ngôn ngữ lập trình Pascal …


Trang 22 / 27


Sáng kiến – Kinh nghiệm

Người thực hiện: Nguyễn Thị Khuyên

5. Minh họa chương trình khi chạy

Trường hợp 1:
Tìm thấy sau lần
duyệt đầu tiên

Trường hợp 2:
Tìm thấy sau
nhiều lần duyệt

Sử dụng ngôn ngữ lập trình Pascal …

Trang 23 / 27


Sáng kiến – Kinh nghiệm

Người thực hiện: Nguyễn Thị Khuyên

Trường hợp 3:
Không tìm thấy

Sử dụng ngôn ngữ lập trình Pascal …


Trang 24 / 27


Sáng kiến – Kinh nghiệm

Người thực hiện: Nguyễn Thị Khuyên

Phần 3: KẾT QUẢ VÀ VIỆC PHỔ BIẾN ỨNG DỤNG
NỘI DUNG VÀO THỰC TIỄN
Với việc xây dựng các chương trình minh họa như trên, trong quá trình
giảng dạy Tin học 10, bản thân tác giả thấy rằng các tiết học về bài toán và
thuật toán không còn nhàm chán, khô cứng nữa mà trở nên sôi nổi hơn và học
sinh cũng có thể hiểu các thuật toán một cách dễ dàng hơn.
Hơn nữa, với mỗi thuật toán, giáo viên có thể minh họa bằng rất nhiều
bộ Test khác nhau mà không mất nhiều công sức, có thể nói đây là đặc điểm
nổi bật mà máy tính có thể trợ giúp cho con người.

Đề tài này ra đời từ kinh nghiệm của bản thân tác giả trong quá trình
giảng dạy và từ những kiến thức mà tác giả có được nên trong khi thiết kế
chương trình, có thể chương trình của tác giả còn chưa đạt tối ưu. Tác giả rất
mong sự góp ý chân thành của quý thầy cô để những chương trình minh họa
này có thể trợ giúp cho chúng ta một cách hiệu quả hơn.
Tác giả xin chân thành cảm ơn!
Ayun Pa, tháng 01 năm 2011
Tác giả

Nguyễn Thị Khuyên

Sử dụng ngôn ngữ lập trình Pascal …


Trang 25 / 27


×