Tải bản đầy đủ (.docx) (35 trang)

BỒI DƯỠNG NĂNG lực GIẢI bài tập PASCAL CHO học SINH lớp 11”

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 (184.3 KB, 35 trang )

MỤC LỤC
1. Lời giới thiệu....................................................................................................1
2. Tên sáng kiến:..................................................................................................2
3. Tác giả sáng kiến.............................................................................................2
4. Chủ đầu tư tạo ra sáng kiến:..........................................................................2
5. Lĩnh vực áp dụng sáng kiến...........................................................................2
6. Ngày sáng kiến được áp dụng lần đầu hoặc áp dụng thử............................2
7. Mô tả bản chất của sáng kiến.........................................................................2
7.1. Cở sở lý luận..............................................................................................2
7.2. Cơ sở thực tiễn........................................................................................... 3
7.3. Về nội dung của sáng kiến.........................................................................3
7.3.1. Một số kỹ năng lập trình.....................................................................3
7.3.2 Một số bài tập tham khảo cho học sinh khá, giỏi (chương trình viết kiểu
dữ liệu tệp).................................................................................................. 23

7.3.3. Khả năng áp dụng của sáng kiến.......................................................31
8. Những thông tin cần được bảo mật :...........................................................31
9. Các điều kiện cần thiết để áp dụng sáng kiến.............................................31
10.

Đánh giá lợi ích thu được hoặc dự kiến có thể thu được do áp dụng sáng kiến
theo ý kiến của tác giả và theo ý kiến của tổ chức, cá nhân đã tham gia áp
dụng sáng kiến lần đầu, kể cả áp dụng thử (nếu có) theo các nội dung sau
31

10.1. Đánh giá lợi ích thu được hoặc dự kiến có thể thu được do áp dụng
sáng
kiến theo ý kiến của tác giả.............................................................................31
10.2. Đánh giá lợi ích thu được hoặc dự kiến có thể thu được do áp dụng
sáng
kiến theo ý kiến của tổ chức, cá nhân............................................................. 32


11. Danh sách những tổ chức/cá nhân đã tham gia áp dụng thử hoặc áp dụng
sáng kiến lần đầu (nếu có)................................................................................33

TÀI LIỆU THAM KHẢO................................................................................34


BÁO CÁO KẾT QUẢ
NGHIÊN CỨU, ỨNG DỤNG SÁNG KIẾN
1. Lời giới thiệu
Chúng ta đang sống trong thời đại công nghệ 4.0. Với sự phát triển mạnh
mẽ như vũ bão của tin học đã làm cho xã hội có nhiều nhận thức mới về cách tổ
chức các hoạt động. Nhiều quốc gia trên thế giới ý thức được rất rõ tầm quan
trọng của tin học và có những đầu tư lớn cho lĩnh vực này, đặc biệt trong giáo
dục nâng cao dân trí về tin học và đào tạo nguồn nhân lực có chất lượng cao.
Người Việt Nam có nhiều tố chất thích hợp với ngành khoa học này, vì thế
chúng ta hy vọng có thể sớm hồ nhập với khu vực và trên thế giới.
Công nghệ thông tin được ứng dụng trong hầu hết các lĩnh vực của xã hội.
Nhận thấy tầm quan trọng đó, trong vài năm trở lại đây bộ môn tin học trong nhà
trường nhận được sự quan tâm và đầu tư rất lớn của ngành giáo dục.
Trong thời đại thông tin bùng nổ ngày nay, việc lập được các chương trình
tự hoạt động cho máy tính, máy gia dụng là cần thiết. Và để làm được việc đó
cần có một q trình nghiên cứu, học tập về ngơn ngữ lập trình lâu dài, qua đó
nhà lập trình có thể chọn một ngơn ngữ lập trình thích hợp.
Tin học là một mơn học khơng cịn mới ở các trường phổ nhưng các em học
sinh vẫn còn nhiều bỡ ngỡ khi tiếp cận với môn học này. Nội dung tin học lập
trình lớp 11 là một nội dung mới đối với đa số học sinh với nhiều khái niệm,
thuật ngữ, cấu trúc dữ liệu mà học sinh mới được tiếp xúc lần đầu. Chính vì vậy
mà học sinh dễ mắc sai lầm khi lập trình giải quyết các bài tốn. Ngun nhân
dẫn đến những khó khăn mà học sinh thường gặp là rất phong phú nhưng có thể
thấy một số nguyên nhân chính sau đây:


+

+

Học sinh thường gặp khó khăn khi xác định bài tốn.

+

Học sinh chưa biết cách sử dụng biến để đưa dữ liệu vào cho bài tốn.

Khó liên hệ phương pháp giải một bài tốn trong toán học với thuật giải trong tin
học.
+

Học sinh chưa biết cách hiệu chỉnh chương trình khi có lỗi.

Tuy nhiên mọi thứ đều có điểm khởi đầu của nó, với học sinh việc học
ngơn ngữ lập trình Pascal là khởi đầu cho việc tiếp cận ngơn ngữ lập trình bậc
cao, qua đó giúp các em hình dung được sự ra đời, cấu tạo, hoạt động cũng như
ích lợi của các chương trình hoạt động trong máy tính, các máy tự động…. Qua
đó giúp các em có thêm một định hướng, một niềm đam mê về tin học, về nghề
nghiệp mà các em chọn sau này.
Xuất phát từ cơ sở trên, tôi đã chọn đề tài “BỒI DƯỠNG NĂNG LỰC
GIẢI BÀI TẬP PASCAL CHO HỌC SINH LỚP 11”. Hy vọng rằng kinh
1


nghiệm này của tơi có thể góp phần giúp các em học sinh hiểu bài hơn và có
hứng thú hơn với môn Tin học.

2.

Tên sáng kiến: BỒI DƯỠNG NĂNG LỰC GIẢI BÀI TẬP PASCAL CHO HỌC
SINH LỚP 11.
3.

Tác giả sáng kiến

Họ và tên:
4.

Chủ đầu tư tạo ra sáng kiến:

5.

Lĩnh vực áp dụng sáng kiến

Đề tài này được đưa vào nhằm áp dụng giảng dạy lập trình cho học sinh khối
11. Với mục tiêu đưa ra một số kinh nghiệm dạy lập trình, giúp các em biết cách
viết chương trình giải bài toán tin, biết cách sửa các lỗi phổ biến trong quá trình
chạy chương trình mà các em thường mắc phải. Từ đó giúp các em u thích
hơn bộ mơn tin học lập trình khối 11.

6. Ngày sáng kiến được áp dụng lần đầu hoặc áp dụng thử
Lần đầu áp dụng vào tháng 10 năm 2018 và đang tiếp tục thực hiện.
7.

Mô tả bản chất của sáng kiến

7.1.


Cở sở lý luận

Đặc điểm của học sinh là muốn tự mình khám phá, tìm hiểu trong q trình
nhận thức. Các em có khả năng điều chỉnh hoạt động học tập, sẵn sàng tham gia
các hoạt động học tập khác nhau nhưng cần phải có sự hướng dẫn, điều hành
một cách khoa học và nghệ thuật của thầy cơ giáo. Hình thành tính tích cực, tự
giác, chủ động và đồng thời phát triển năng lực tự học của học sinh là một quá
trình lâu dài, kiên nhẫn và phải có phương pháp.
Trong bối cảnh toàn ngành Giáo dục và Đào tạo đang nỗ lực đổi mới phương
pháp dạy học theo hướng phát huy tính tích cực chủ động của học sinh trong hoạt
động học tập. Điều 24.2 của Luật giáo dục đã nêu rõ : “Phương pháp giáo dục phổ
thông phải phát huy tính tích cực, tự giác, chủ động, sáng tạo của học sinh, phù
hợp với đặc điểm của từng lớp học, môn học; bồi dưỡng phương pháp tự học, rèn
luyện kỹ năng vận dụng kiến thức vào thực tiễn, tác động đến tình cảm, đem lại
niềm vui, hứng thú học tập cho học sinh”. Như vậy, chúng ta có thể thấy định
hướng đổi mới phương pháp dạy học đã được khẳng định, khơng cịn là vấn đề
tranh luận. Cốt lõi của việc đổi mới phương pháp dạy học ở trường phổ thông là
giúp học sinh hướng tới việc học tập chủ động, chống lại thói quen học tập thụ

2


động. Với một số nội dung trong đề tài này, học sinh có thể tự học, tự rèn luyện
thơng qua một số bài tập, dạng bài tập cụ thể.
7.2. Cơ sở thực tiễn
Qua thực tế giảng dạy bộ môn tin học ở các năm qua, tôi nhận thấy khi học
đến chương trình tin học lớp 11 đa số học sinh đều nhận xét bộ mơn này rất khó.
Khi dạy lập trình nói chung và Pascal nói riêng, nhiều khi người dạy chỉ chú
ý tới việc dạy ngơn ngữ lập trình mà khơng nghĩ rằng, ngồi việc học ngơn ngữ lập

trình người dạy cần rèn cho học sinh các kỹ năng: Xác định bài toán, phân biệt
được biến, hằng trong bài, viết thuật tốn, đọc hiểu chương trình, sửa lỗi chương
trình,…

Nhiều học sinh nhớ được các câu lệnh, từ khóa khi khai báo của ngơn ngữ
lập trình pascal. Nhưng lại khơng biết viết một chương trình giải một bài tốn
bằng ngơn ngữ pascal. Nguyên nhân là do các em không biết cách phân tích bài
tốn, khơng biết cần đưa dữ liệu gì vào và cũng chưa biết cách xác định các biến
cần sử dụng trong chương trình. Ngồi ra các em học sinh cũng gặp khá nhiều
lỗi khi viết một chương trình trong ngơn ngữ lập trình Pascal, thậm chí có những
lỗi các em mắc phải nhiều lần do không hiểu nguyên nhân xuất hiện lỗi. Vì vậy
trong nội dung đề tài này tôi nêu ra các phương pháp cơ bản giúp các em có thể
giải một bài tốn bất kì bằng ngơn ngữ lập trình nói chung hay ngơn ngữ pascal
nói riêng. Tơi cũng chỉ ra một số lỗi phổ biến các em thường mắc phải khi chạy
chương trình pascal và cách sửa các lỗi này trên phần mềm free pascal. Đối với
đối tượng học sinh khá giỏi, đa phần các em rất hào hứng với việc học lập trình,
cụ thể là ngơn ngữ lập trình Pascal. Do đó trong đề tài này tơi cũng trình bày
thêm một số ví dụ mở rộng, nâng cao với đối tượng học sinh này.
Các chú ý khi dạy ngơn ngữ lập trình nói chung, ngơn ngữ lập trình free
Pascal nói riêng là rất nhiều, rât phong phú. Tuy nhiên trong phạm vi sáng kiến
kinh nghiệm này tơi khơng trình bày lại cấu trúc chương trình pascal, và các câu
lệnh pascal trong sách giáo khoa, tơi xin trình bày một số lưu ý, kinh nghiệm của
cá nhân tôi qua các nội dung cụ thể sau:
 Một số kỹ năng lập trình (minh họa bằng ngôn ngữ free pascal).
 Một số bài tập làm thêm với đối tượng học sinh khá, giỏi.

7.3. Về nội dung của sáng kiến
7.3.1. Một số kỹ năng lập trình
Qua việc dạy bộ mơn lập trình tin học lớp 11 nhiều năm. Tôi nhận thấy các
em học sinh rất dễ nhớ câu lệnh và cấu trúc chương trình pascal, nhưng lại

khơng biết vận dụng các câu lệnh đó vào bài tốn cụ thể, có thể các em vẫn bị
nhầm lẫn việc lập trình cho máy tính giải với việc trình bày lời giải trên giấy như
các em vẫn hay làm.
3


Để các em học sinh có thể viết được chương trình giải một bài tốn tin bằng
ngơn ngữ lập trình nói chung hay ngơn ngữ pascal nói riêng thì ngồi việc các
em nhớ các câu lệnh và cấu trúc chương trình của ngơn ngữ lập trình. Các em
cần phải có các kỹ năng sau:
1. Xác định bài tốn
Để có thể viết chương trình giải một bài tốn bất kì nào đó, các em cần phải
xác định được hai thành phần input và output của bài tốn, qua đó chỉ ra được
các biến cần sử dụng trong bài.
Xác định bài toán
Input: Là những thông tin đã biết cần đưa vào (giả thiết bài toán). Để từ
những dữ liệu đưa vào này người lập trình đưa ra các thao tác xử lí (phép tính
tốn) giúp tìm ra kết quả của bài tốn.
Output: Là kết quả cần thông báo ra sau khi chạy xong chương trình. Kết
quả có thể ghi ra màn hình hoặc ghi ra tệp tùy vào yêu cầu của từng bài.
Ví dụ 1: Viết chương trình tính và thơng báo ra màn hình diện tích và chu vi của
tam giác có 3 cạnh lần lượt a, b, c (với a, b,c là các số nguyên dương, 11 Hướng dẫn:

Với bài toán trên giả thiết của bài toán (dữ liệu đề bài đã cho) là: Bộ giá trị
3 cạnh tam giác lần lượt là a, b, c, và giới hạn của từng cạnh trong khoảng từ 1
4
đến 10 , 3 giá trị đó tương ứng với 3 cạnh a, b, c của tam giác (luôn đảm bảo tổng
2 cạnh bất kì ln lớn hơn cạnh cịn lại).

Kết quả cần thơng báo ra là diện tích và chu vi của tam giác. Vậy ta xác
định được input và output như sau:
Input: Giá trị 3 cạnh a, b, c (thỏa mãn độ dài 3 cạnh của tam giác).
Output: Chu vi, diện tích tam giác đó.
Ví dụ 2: Viết chương trình giải phương trình ax +b =0? (với |a|<=106, |b|<=106)
 Hướng dẫn:

Với bài toán trên với mỗi bộ hệ số a, b của phương trình sẽ cho kết quả
nghiệm x riêng. Vậy giá trị cần đưa vào là hệ số a, b với phạm vi giá trị |a|<=10 6,
|b|<=106. Kết quả cần thông báo ra là nghiệm x tương ứng với từng bộ hệ số a, b
mà ta đưa vào. Đây là dạng bài biện luận nghiệm phương trình bậc nhất 1 ẩn ở
dạng tổng quát.
Ta xác định input và output như sau:
Input: Giá trị hệ số a,b.
4


Output: Giá trị nghiệm x thỏa mãn phương trình.
Ví dụ 3. Cho N và dãy số a1, a2,…, an. Hãy cho biết có bao nhiêu số hạng trong
dãy có giá trị bằng 0.
 Hướng dẫn:
Input là những thông tin đã biết cần đưa vào (giả thiết của bài toán): N, dãy
a1, a2,…,an.
Output là kết quả cần thông báo ra: Số số hạng có giá trị bằng 0.
Ta xác định được input và output như sau:
Input: Giá trị N, dãy giá trị a1, a2,…, an.
Output: Số số hạng có giá trị bằng 0.
2. Xác định các biến, hằng, kiểu dữ liệu phù hợp cho biến
 Khái niệm biến: Là đại lượng được đặt tên, dùng để lưu trữ giá trị và giá trị có thể


được thay đổi trong q trình thực hiện chương trình.

Trước khi giải một bài tốn tin bằng bất kì một ngơn ngữ lập trình nào, thì
các em cần phải xác định được bài toán cần sử dụng đến biến nào và kiểu dữ liệu
của từng biến là gì cho phù hợp. Nếu cơng việc này học sinh làm tốt sẽ giúp tối
ưu bài tốn, tránh lãng phí bộ nhớ hoặc thiếu bộ nhớ.
 Phân biệt biến và hằng
Biến: Là những đại lượng để đưa input vào chương trình là những giá trị
ngẫu nhiên đưa vào từ bàn phím, hoặc là đại lượng lưu giá trị ngẫu nhiên trong
quá trình thực hiện chương trình.
Hằng: Là đại lượng cần đưa vào chương trình, nhưng giá trị đã xác định cụ
thể, giá trị của hằng là không đổi trong quá trình thực hiện chương trình.
 Kiểu dữ liệu của biến
Dựa vào giới hạn vào của biến trong từng bài để chọn kiểu dữ liệu cho phù hợp.
Tránh việc chọn kiểu dữ liệu không lưu được hết giá trị vào của biến, hay chọn kiểu
dữ liệu quá lớn so với giá trị cần đưa vào cho biến gây lãng phí bộ nhớ.

Ví dụ 1: Viết chương trình giải phương trình: 2x2 + 5x + 2 =0.
 Xác định bài toán.

Input: Giá trị các hệ số a=2, b=5, c=2
Output: Nghiệm x thỏa mãn phương trình.
Biến và hằng cần sử dụng khi viết chương trình. 5


Thông thường để xác định các biến cần sử dụng trong chương trình, chúng
ta nên dựa vào input và output của bài toán. Thật vậy input là những dữ liệu cần
đưa vào, nếu dữ liệu đưa vào đã có giá trị cụ thể thì chúng ta sẽ đưa vào ở dạng
hằng, trong ví dụ 1 các hệ số 2, 5, 2 là các hằng số cần đưa vào.
Ta có:

- Hằng

số: Là hệ số 2, 5, 2 (do a, b, c có giá trị xác định khơng đổi là: a=2, b=5,
c=2)
-

Biến

Để xác định biến chúng ta dựa vào input và output. Nếu input cần đưa vào
là các giá trị ngẫu nhiên chưa xác định cụ thể thì chúng ta sử dụng biến để lưu
các giá trị đó nhập vào từ bàn phím, nhưng trong ví dụ 1 input là các hằng đã
xác định giá trị cụ thể nên không cần sử dụng biến.
Dựa vào output ta thấy cần thông báo ra nghiệm x thỏa mãn phương trình,
nên ta sẽ sử dụng biến tên x1, x2 để lưu nghiệm trong trường hợp nếu có cả 2
nghiệm xẩy ra. Để tính 2 nghiệm của phương trình trên chúng ta phải tính giá trị
delta vậy để thuận tiện chúng ta khai báo thêm biến delta để lưu giá trị biểu thức
b2 -4ac.
Ta có:
Biến tên x1, x2, để lưu lần lượt 2 giá trị nghiệm của phương trình.
Biến tên delta để lưu giá trị biểu thức delta:= b*b -4*a*c= 5*54*2*2;
 Kiểu dữ liệu biến

Tên biến

Kiểu giá trị

Kiểu dữ liệu

delta


Nguyên (do a, b, c nguyên)

Integer, longint,int64.

x1, x2

Thực (do thực hiện phép /)

real

Code tham khảo
Var
x1, x2: real;
delta: integer;
BEGIN
delta:= 5*5 -4*2*2;
6


X1:= (-5- sqrt(delta))/(2*2);
X2:= (-5 +sqrt(delta))/(2*2);
If delta > 0 then begin writeln (‘nghiem x1=’, x1);
Write(‘nghiem x2=’,x2);
End;
If delta =0 then write(‘phuong trinh co nghiem kep x=’,x1); {do x1=x2}
If delta <0 then write(‘phuong trinh vo nghiem’);
Readln;
END.
Ví dụ 2: Viết chương trình giải phương trình: ax2 + bx + c =0 ( với a≠ 0).


 Xác định bài toán.

Input: Giá trị hệ số a, b, c.


Output: Nghiệm x thỏa mãn phương trình.
Biến cần sử dụng khi viết chương trình.

- Biến
Tên a, b, c để nhập vào giá trị ngẫu nhiên các hệ số a, b, c (do hệ số a, b, c
không cho giá trị cụ thể)
Tên x1, x2, để lưu lần lượt 2 giá trị nghiệm của phương trình.
Biến tên delta để lưu giá trị biểu thức delta:= b*b -4*a*c;
 Kiểu dữ liệu biến

Tên biến

Kiểu giá trị

Kiểu dữ liệu

a, b, c

Thực (tổng quát)

real

delta

Thực (do a, b, c thực)


real

x1, x2

Thực (do a, b, c thực và do
thực hiện phép /)

real

Code tham khảo
Var a, b, c, delta, x1, x2: real;
BEGIN
7


delta:= b*b-4*a*c;
X1:= (-b- sqrt(delta))/(2*a);
X2:= (-b +sqrt(delta))/(2*a);
If delta > 0 then begin writeln (‘nghiem x1=’, x1);
Write(‘nghiem x2=’,x2);
End;
If delta =0 then write(‘phuong trinh co nghiem kep x=’,x1); {do x1=x2}
If delta <0 then write(‘phuong trinh vo nghiem’);
Readln;
END.
Ví dụ 3 Viết chương trình tính và thơng báo ra màn hình diện tích và chu vi của
tam giác có 3 cạnh lần lượt a, b, c (với a, b,c là các số nguyên dương, 11 Xác định bài toán


Input: Giá trị 3 cạnh a, b, c (thỏa mãn độ dài 3 cạnh của tam giác).
Output: Chu vi, diện tích tam giác đó.
 Các biến cần phải sử dụng
- Tên

biến a, b, c để lưu giá trị độ dài 3 cạnh tam giác (do giá trị của 3 cạnh a, b, c
của tam giác là bất kì khơng phải giá trị cố định nên a, b, c sẽ là 3 biến của bài
toán).
-

Tên biến p lưu chu vi tam giác: p:= a+b+c;

-

Tên biến s lưu diện tích tam giác s:=sqrt(p/2*(p/2-a)*(p/2-b)*(p/2-c));

 Kiểu dữ liêu của biến

Kiểu dữ liệu 3 biến a, b, c: Dựa vào giới hạn giá trị của 3 biến a, b, c trong
để bài, a, b,c là các số nguyên dương, 1thể nghĩ đến các kiểu dữ liệu sau:
Tên biến

Phạm vi giá trị

Kiểu dữ liệu

a, b, c


1..104 ( nguyên dương)

word

p

3..30000

word

8
s

Khoảng 2..200000000
(giá trị kiểu thực do có phép /)

real


Code tham khảo
Var a,b,c,p: word;
S:real;
BEGIN
Writeln(‘nhap vao gia tri 3 canh a, b, c’);
Read(a,b,c);
P:= a+b+c;
S:= sqrt(p/2*(p/2-a)*(p/2-b)*(p/2-c));
Writeln(‘chu vi tam giac p=’,p);
Writeln(‘dien tich tam gia s=’, s);
Readln;

END.
3. Viết thuật toán
Theo định nghĩa trong sách giáo khoa Tin học 10, thuật toán là một dãy hữu
hạn các thao tác được sắp xếp theo một trình tự xác định, sao cho sau khi thực
hiện dãy thao tác ấy từ INPUT ta nhận được OUTPUT. Nói cách khác, trình bày
thuật tốn tức là chỉ ra các bước cần thực hiện để đi đến kết quả.

11

Việc trình bày thuật tốn trước khi viết chương trình là hết sức quan trọng.
Thuật tốn đúng thì chương trình mới có khả năng đúng, cịn một thuật tốn sai
chắc chắn là cho một chương trình sai. Tuy nhiên đối với phần lớn học sinh lớp
thường bỏ qua bước này do tâm lý học sinh khơng thích các loại bài tập như thế.
Trong nhiều trường hợp tưởng như khơng cần thuật tốn cụ thể học sinh
vẫn viết được chương trình. Thực tế thuật tốn đó khơng được viết ra nhưng đã
hình thành sẵn trong đầu người viết.
Với đa số học sinh hiện nay, cần phải dành một lượng thời gian thích hợp
để rèn luỵên loại bài tập này. Phải làm sao cho việc viết thuật toán trở thành kỹ
năng để khi các em lập trình trên máy, tuy khơng cần viết thuật tốn ra song các
em có thể hình dung được thuật tốn đó trong đầu. Cần phải tạo cho các em có ý
thức khi viết một chương trình Pascal là phải tn thủ theo trình tự sau:
Bài tốn







Xác định bài tốn Xây dựng thuật tốn Viết chương trình

9


Một bài tốn có thể có nhiều thuật tốn đề giải, người lập trình cần phải lựa
chọn thuật tốn tối ưu nhất. Thuật toán tối ưu là thuật toán đảm bảo các yếu tố
sau:
+

Chương trình ngắn gọn, ít câu lệnh.

+

Thời gian chạy nhanh nhất.

+

Tốn ít tài nguyên bộ nhớ nhất.

+

Đưa ra được output đúng.

Để viết được thuật toán trước hết các em cần có ý tưởng (cách giải) giải bài
tốn đó, từ ý tưởng đó chúng ta trình bày thành thuật toán.
Thực chất việc viết thuật toán tương tự như việc các em trình bày lời giải tìm
ra kết quả cho bài toán ở trên giấy như các em vẫn thường làm. Chỉ khác 1 chút là
các em cần tách các bước rõ ràng, với mỗi bước cần thực hiện một thao tác cụ thể.
Khi lập trình thì chúng ta sẽ thay các thao tác trong mỗi bước bằng câu lệnh tương
ứng trong ngơn ngữ lập trình pascal, trình tự máy thực hiện các thao tác đó lần lượt
từ bước đầu cho đến bước cuối là đưa ra kết quả rồi kết thúc thuật tốn.


Có 2 cách viết thuật tốn:
Cách 1: Viết thuật toán bằng cách liệt kê các bước.
Cách 2: Viết thuật toán bằng sơ đồ khối.
Tùy vào tư duy các em có thể chọn 1 trong 2 cách để trình bày thuật tốn
đều được. Trong phạm vi sáng kiến tơi xin trình bày theo cách liệt kê các bước.
Ví dụ 1: Có m hộp có khối lượng khác nhau và một cái cân dĩa. Hãy chỉ ra cách
cân để tìm được hộp nặng nhất.
 Hướng dẫn

Với bài tốn trong thực tế như trên ta có thể phát biểu lại dưới dạng bài
toán trong toán học như sau:
Cho tập hợp A có số phần tử hữu hạn. Tìm phần tử lớn nhất trong tập A nói
trên.
Xây dựng ý tưởng giải bài toán: Ta thực hiện cần lần lượt các hộp từ 1 đến m
hộp, mỗi lần cân 2 hộp giữ lại hộp nặng hơn bỏ hộp nhẹ đi, hộp giữ lại sau cùng
là hộp nặng nhất.
Ta có thể trình bày thuật toán theo cách liệt kê các bước như sau:
Bước 1. Nhập vào giá trị số hộp m.
Bước 2. Nếu m= 1 hộp thì đó chính là hộp nặng nhất và kết thúc.
10


Bước 3. Nếu số hộp m>1 thì
Chọn 2 hộp bất kì và đặt lên bàn cân.
Giữ lại hộp nặng hơn và cất hộp nhẹ đi chỗ khác.
Bước 4. Nếu không cịn hộp chưa được cân thì chuyển sang bước 5, ngồi ra:
Chọn một hộp bất kì và để lên dĩa cân còn trống
Giữ lại hộp nặng hơn, cất hộp nhẹ sang chỗ khác
Bước 5. Trở lại bước 3

Bước 6. Hộp còn lại trên cân là hộp nặng nhất và kết thúc.
Mơ phỏng cho thuật tốn trên với m=8
Dãy số

5

I (thứ tự hộp)
Max (giá trị lớn
nhất)

5

1

4

7

6

3 15 8

4

9

12

2


3

4

5

6 7

9

10

11 12

5

5

7

7

7 15 15 15 15

8

15

Ví dụ 2: Viết thuật tốn tính tổng sau:
T = 1 + 3+ 5+…+ n (với n là số nguyên dương lẻ, 1

 Hướng dẫn

Bài toán trên thực chất là bài tốn tính tổng các số tự nhiên lẻ từ 1 đến n.
Xây dựng ý tưởng giải
1.

Cách 1: Sử dụng biến t lưu giá trị tổng cần tìm, t ban đầu nhận giá trị bằng
Cho giá trị i chạy từ 1 đến n, nếu i mod 2 <> 0 thì cộng vào tổng t giá trị i đó tức
t:= t + i; -> Cách này phải kiểm tra n lần giá trị i mod 2 <>0 hay không n lớn
nhất bằng 109 nên thời gian chạy lâu, không tối ưu.
Cách 2: Do chỉ cộng các số lẻ trong dãy số tự nhiên từ 1 đến n nên ta có
cơng thức.
(N+1)*số số hạng/2;
Số số lẻ từ 1 đến n (n lẻ) là: (n-1)/2 +1 hay (n-1) div 2 +1, do n lẻ nên n-1
chẵn luôn chia hết cho 2.
Vậy tổng t:= (n+1)*((n-1) div 2 +1) div 2 (do n+1 luôn là số chẵn luôn chia
hết cho 2). Vậy với cách 2 này khơng phải sử dụng vịng lặp, thuật toán chạy
nhanh hơn, tối ưu hơn.
11


Ta có thể trình bày thuật tốn cách 2 theo cách liệt kê các bước như sau
Bước 1. Nhập giá trị n lẻ.
Bước 2. T:= (n+1)*((n-1) div 2 +1) div 2
Bước 3. Thông báo ra t rồi kết thúc.
4. Đọc hiểu chương trình
Kỹ năng này rất quan trọng, nó giúp các em hiểu rõ quá trình chạy 1
chương trình bất kì là: Các lệnh ln được thực hiện lần lượt từ đầu chương
trình đến cuối chương trình, câu lệnh viết trước được thực hiện trước.
Loại bài tập này sẽ giúp phát triển tư duy, giúp học sinh hiểu bài, nhất là

khi dạy các cấu trúc lệnh. Đối với dạng bài tập này, giáo viên nên hướng dẫn các
em thực hiện tuần tự từng lệnh theo từng câu lệnh cụ thể.
Ví dụ: Cho biết kết quả khi thực hiện chương trình sau:
Program vd2;
Uses crt;
Var i:integer;
Begin
Clrscr;
I:=7;
While i>1 do
Begin
If (i mod 2)<>0 then i:=i*3+1
Else i:=i div 2;
Writeln(i);
End;
Readln;
End.



Hướng dẫn
Dãy câu lệnh

Program vd2;

Ý nghĩa của câu lệnh
Tên chương trình là vd2
12



Uses crt;

Tên thư viện crt

Var i:integer;

Khai báo biến i kiểu số ngun

Begin

Bắt đầu thân chương trình

Clrscr;

Lệnh xóa màn hình

I:=3;

I =3

While i< 11 do

Lặp

Begin

Lần 1: i=3 < 11

If (i mod 2)<>0 then i:=i*3+1


3 mod 2 =1 thì i:= 3*3+1=10

Else i:=i div 2;

In ra màn hình 10

Writeln(i);

Lần 2: i=10<11

End;

10 mod 2 =0 thì i:=10 div 2=5
In ra màn hình 5
Lần 3: i=5<11
5 mod 2 =1 thì i:= 5*3+1=16
In ra màn hình 16
Lần 4: i=16 >11
Câu lệnh sau do không được thực
hiện-> kết thúc vịng lặp

Readln;

Dừng màn hình xem kết quả khi chạy
chương trình

End.

Kết thúc chương trình


Kết quả sau khi chạy chương trình trên sẽ in ra màn hình 3 lần giá trị của I
mỗi giá trị ghi trên 1 dòng
10
5
16
5.

Sửa lỗi chương trình
13


Để làm tốt việc này thì chúng ta cần thử chạy chương trình với các bộ dữ
liệu vào tiêu biểu. Chúng ta có thể mơ phỏng q trình chạy chương trình với
các bộ dữ liệu vào đó để phát hiện lỗi.
Ví dụ: Để tìm số lớn nhất trong 3 số a,b,c được nhập vào từ bàn phím, có người
đã viết chương trình như sau:
Program vd3;
Uses crt;
Var a,b,c:integer;
Begin
Clrscr;
Write(‘nhap vao 3 so:’);
Readln(a,b,c);
If aElse
If aWrite(‘So lon nhat la:’,a);
Readln;
End.
Chương trình trên cho đáp số lúc đúng, lúc sai tuỳ thuộc vào a,b,c. Hãy giải

thích tại sao và sửa lại cho đúng.
Ta thực hiện chương trình trên với 2 bộ input sau đây:
Test 1: a=3, b=4, c =5
a

b

c

a
3

4

5

3<4 -> true

a
Ghi ra số lớn nhất là 4



Vậy số lớn nhất là 4 Kết quả sai.
Test 2: a=5, b=4, c=7
a

b


5

14
4

c

a
7

a
False (5<4) True (5<7)


Ghi ra màn hình số lớn
nhất là 7



Vậy số lớn nhất là 7 Kết quả đúng.
Chương trình trên thực hiện lúc đúng lúc sai do chương trình mới chỉ so
sánh 2 số a và b thôi đã đưa ra kết luận.
Ta có thể sửa lại chương trình như sau:
Program vd3_1;
Uses crt;
Var a,b,c:integer;
Begin

Clrscr;
Write(‘nhap vao 3 so:’);
Readln(a,b,c);
If aBegin
If bEnd
Else
If aWrite(‘So lon nhat la:’,a);
Readln;
End.
6.

Kiểm soát các biến trong chương trình

Giúp học sinh quan sát hết các biến cần dùng trong chương trình, tránh việc
sử dụng biến mà chưa được khai báo.
Ví dụ: Trong một chương trình đã chạy tốt, khi thực hiện khơng có lỗi có một số
lệnh như sau:
…..
15


Ok:= ‘n’;
J:=round(sqr(n));
If ch= ‘Ok’ then ch:= ‘It is’ + ch;
…..
While kt and (i<=j) do
Begin

Kt:=Not(n mod i=0);
X:=1.5*j+i;
End;
Hãy viết phần khai báo biến cho đoạn chương trình trên?
 Hướng dẫn

Với dạng bài tập này, ta căn cứ vào các câu lệnh, kiểu dữ liệu mà biến nhận
trong chương trình để viết phần khai báo biến cho chương trình trên như sau:
Var n,i,j:integer;
X:real;
Kt:boolean;
ok:char;
ch:string;
Tuy nhiên ta cũng có nhiều cách để khai báo biến ví dụ biến ok có thể
thuộc kiểu string, j có thể thuộc kiểu real,…
7.

Viết chương trình theo đúng thuật tốn đã đưa ra

Một bài tốn có thể có nhiều cách giải khác nhau ứng với mỗi cách giải ta
có một thuật tốn. Để giúp học sinh có khả năng nhanh chóng nắm được ý tưởng
của người khác cần luyện cho các em biết giải bài toán theo một thuật toán đã
được trao đổi. Khả năng hiểu được nhanh ý tưởng của người khác cũng chính là
yêu cầu trong hoạt động nhóm. Phát triển khả năng này là phát triển một phẩm
chất tư duy quý báu để các em biết hợp tác trong công việc, một trong những
yêu cầu của người lao động, sáng tạo trong thời đại mới, thời đại mà một sản
phẩm là sự kết tinh lao động của nhiều người.
Ví dụ: Lập chương trình cắt bỏ các kí tự trống thừa của một xâu cho trước. Hãy
viết chương trình theo thuật tốn sau:


16


Bước 1: i:=1;Tword:= ‘’;XauM:= ‘’;
Bước 2: Kiểm tra xau[i]<> ‘ ’. nếu đúng thì đến bước 3, sai đến bước 5.
Bước 3: Tword:=Tword+xau[i]
Bước 4: Kiểm tra i<=length(xau). Đúng thì tăng i lên 1 và quay lại bước 2; sai
thì đến bước 8.
Bước 5: Kiểm tra Tword<> ‘’. Đúng thì xauM:=xauM+Tword+ ‘ ’ ; gán Tword=
‘’ và quay lại bước 4. Sai thì chuyển đến bước 6.
Bước 6: Kiểm tra Tword<> ‘’. Đúng thì gán xauM:=xauM+Tword; sai thì xố kí
tự trống ở vị trí length(xauM) của xauM.
Bước 7: Gán xau:=xauM;
Bước 8: Kết thúc.
Chương trình có thể được viết như sau:
Program vd5;
Uses crt;
Var xau, xauM,Tword:string;
I:byte;
BEGIN
Write('nhap vao mot xau ki tu'); readln(xau);
xauM:= ''; Tword:= '';
for i:=1 to length(xau) do
if xau[i]<> ' ' then Tword:=Tword+xau[i]
else
begin
if Tword<> '' then xauM:=xauM+Tword+ ' ';
Tword:= '';
End;
If Tword <> '' then xauM:=xauM+Tword

Else delete(xauM,length(xauM),1);
Xau:=xauM;
Write('Xau sau khi xoa cac ki tu trong thua la:',xau);
17


Readln;
End.
Tuy nhiên bài tốn trên ngồi cách giải trên ta có thể sử dụng thuật tốn
khác để giải.
Thuật tốn như sau:
Bước 1: Xố các kí tự trống thừa ở đầu.
Sử dụng vòng lặp while: while xau[1]= ‘ ’ do delete(xau,1,1);
Bước 2: Xố các kí tự trống ở cuối.
Sử dụng vịng lặp while: while xau[length(xau)]= ‘ ’ do delete(xau,length(xau),1);

Bước 3: xoá các kí tự trống thừa giữa các từ.
I:=1; Bước 4:
Kiểm tra 2 kí tự liền kề nhau có hơn 1 kí tự trống thì xố kí tự trống.
Nếu i< =length(xau) nếu sai đến bước 6. Nếu đúng thì
Nếu (xau[i] =’ ‘) và (xau[i+1]=’ ‘) thì delete(xau,i+1,1)
Bước 5: Tăng i lên 1 đơn vị quay lại bước 4
Bước 6. In ra xâu kết quả xau kết thúc.
Học sinh có thể viết chương trình theo thuật tốn 2.
8.

Phát hiện thiếu sót trong chương trình mẫu, để từ đó hồn thiện chương
trình
Ví dụ: Viết chương trình đếm và in ra các số trong 1 xâu đã cho.
Cho đoạn chương trình giải quyết cơng việc trên như sau:

I:=1; dem:=0;
While i<=length(xau) do
Begin
If (xau[i]>= ‘0’) and (xau[i]<= ‘9’) then
Begin
xauM:= ‘’;
while (xau[i]>= ‘0’) and (xau[i]<= ‘9’) do
begin
18


xauM:=xauM+xau[i];
i:=i+1;
end;
dem:=dem+1;
val(xauM,a[dem],n);
i:=i-1;
End;
I:=i+1;
End;
Write(‘xau co ’,dem, ‘ so la:’);
For i:=1 to dem-1 do write(a[i], ‘,’);
Write(a[dem]);
Đối với bài tập này, giáo viên yêu cầu nhận xét chương trình đã thực hiện
đúng hay chưa, có đúng đối với tất cả các trường hợp hay không?
Học sinh có thể phát hiện chương trình chỉ đúng với xâu chứa các số thơng
thường, cịn nếu xâu chứa số thực thì chương trình chưa cho kết quả đúng. Từ
nhận xét đó giáo viên hướng dẫn các em bổ sung và chỉnh sửa lại chương trình.
9. Sửa các lỗi sai thường gặp trong lập trình Pascal
 Khai báo sai miền chỉ số cho dữ liệu kiểu mảng


Ví dụ: Nhập vào một mảng gồm 100 số nguyên gồm các số lớn hơn 3 và nhỏ
hơn 100. In mảng vừa nhập.
Học sinh khai báo mảng như sau:
Var a: array[3..100] of integer;
Vậy khai báo miền chỉ số như trên thì chỉ lưu được tối đa 100-3+1=98 số
nguyên, mà đề yêu cầu 100 số.
Khai báo lại như sau
Var a:array[1..100] of integer;
 Giá trị biến điều khiển vượt quá miền chỉ số của mảng

Ví dụ: Nhập vào một dãy số gồm 7 phần tử và cho biết dãy vừa nhập có tạo
thành cấp số cộng khơng?
Học sinh lập trình giải bài tốn trên như sau:
19


Var a: array[1..7] of integer;
i,d:integer;
kt:boolean;
BEGIN
Write(‘nhap day so:’);
For i:=1 to 7 do
Begin
Write(‘a[’ ,i, ‘]’);
Readln(a[i]);
End;
d:=a[2]-a[1]; kt:=true; i:=1;
while (kt) and (i<=7) do
if (a[i]-a[i-1]<>d) then kt:=false

else i:=i+1;
if kt then writeln(‘Day so tao thanh cap so cong!’)
else writeln(‘Day so khong tao thanh cap so cong!’);
readln
END.
Khi thực hiện chương trình trên, chương trình dịch khơng báo lỗi nhưng kết
quả khi thực hiện chương trình sẽ bị lỗi 201 tràn chỉ số mảng do:
I:=1; đến câu lệnh if (a[i]-a[i-1]<>d) then kt:=false else i:=i+1;
Câu lệnh kiểm tra a[1] –a[0] <> d mà chỉ số mảng a ta khai báo 1..7 khơng
có chỉ số 0.
Ta có thể khắc phục lỗi trên bằng cách gán lại giá trị ban đầu cho biến đếm
i=2.
 Dùng cùng tên biến điều khiển cho các vịng lặp for lồng nhau Ví dụ:

Tính tổng S=1k+2k+….+nk

Học sinh lập trình giải bài tốn trên như sau:
S:=0;
For i:=1 to n do
20


Begin
T:=1;
For i:=1 to k do
T:=T*i;
S:=S+T;
End;
Đoạn chương trình trên có thể lặp vơ tận khi kết thúc vịng lặp con i luôn
nhận giá trị bằng k.

Để khắc phục lỗi này, chỉ cần chú ý các vòng lặp lồng nhau phải sử dụng
biến điều khiển khác nhau.
 Sử dụng dấu ; sai vị trí

Trước Else khơng có dấu chấm phẩy.


Sử dụng dấu chấm phẩy sau từ khoá do trong các câu lệnh lặp câu lệnh lặp rỗng
khơng làm việc gì cả.
 Khơng phân biệt được hằng xâu và biến: Học sinh cần phải chú ý hằng xâu

đặt trong cặp nháy đơn còn biến thì khơng cần đặt trong cặp nháy đơn.
 Tràn số do kết quả tính tốn vượt q giới hạn của biến lưu giá trị

ví dụ: Chương trình sau
Function GT(n:integer): integer;
Var i,t:integer;
Begin
T:=1;
For i:=2 to n do t:=t*i;
Gt:=t;
End;
Begin
Write(‘GT(8)=’, GT(8));
Readln;
End.

21



Khi thực hiện chương trình GT(8) máy báo lỗi 201 là sai vì thực tế 8!=40320

Lỗi này do khai báo hàm GT trả về số nguyên kiểu integer và biến t lưu giá
trị 8! cũng có kiểu integer nên miền giá trị tối đa là 32767 trong khi giá trị 8!
=40320.
Để khắc phục lỗi này khai báo kiểu dữ liệu hàm GT là word, và kiểu dữ
liệu biến t là word.
 Sử dụng tên hàm làm biến cục bộ

Do lệnh trả kết quả cho tên hàm rất giống một lệnh gán bình thường nên
học sinh thường nhầm tên hàm là biến cục bộ. Vì vậy khi viết chương trình để
tiết kiệm biến cục bộ học sinh đã sử dụng tên hàm làm biến cục bộ.
Function GT(n:integer):Longint;
Var i:integer;
Begin
For i:=2 to n do GT:=GT*i;
End;
Trong thân hàm đã sử dụng tên hàm làm biến cục bộ nên khi biên dịch sẽ
báo lỗi gọi hàm nhưng thiếu tham số do chương trình hiểu GT:=GT*i là lời gọi
đệ quy.
Để tránh lỗi này cần lưu ý với học sinh: để trả kết quả cho hàm (không đệ
quy), tốt nhất nên tính kết quả hàm vào một biến cục bộ, trước khi kết thúc ta
mới gán tên hàm bằng giá trị biến này để trả giá trị về cho hàm.
 Chưa hiểu thứ tự ưu tiên phép tốn

Thứ tự ưu tiên các phép tốn trong ngơn ngữ lập trình Pascal như sau:
Lời gọi hàm
Biểu thức trong ngoặc
Tốn tử NOT
Toán tử đổi dấu: * / div mod

+- or
>=,>,<=,<,
=,<>
 Khơng hiểu ngun tắc làm trịn số đối với số thực

Trong toán học:
2

3=

1+1+1
2

2

2

22


Tuy nhiên trong Pascal biểu thức sau sẽ cho kết quả sai:
If 3/sqrt(2)=1/sqrt(2)+1/sqrt(2)+1/sqrt(2) then write(‘Dung!’) else write(‘sai!’);
Khi thực hiện vế trái máy tính chỉ tính sai số 1 lần, cịn vế phải chịu sai số 3
lần. Do đó kết quả khi thực hiện là không giống nhau. Đây chỉ là 1 ngun nhân
khiến cho q trình tính tốn gần đúng trên máy tính thành tính tốn sai. Để
tránh điều này bạn nên tuân thủ theo các quy tắc dưới đây:
So sánh bằng nên dùng biểu thức

a−b<ε


Const e=0.0001;
….
If abs(a-b)Q trình tối ưu tính tốn biểu thức của ngơn ngữ có thể làm ảnh hưởng
đến kết quả của phép toán. Trong Pascal chỉ ép được qua lại các kiểu nguyên mà
không cho ép từ kiểu thực sang kiểu nguyên và ngược lại. Để chuyển từ kiểu
thực sang kiểu nguyên ta dùng hàm Round hoặc Trunc
Tránh tràn số (đã trình bày ở mục 6)
7.3.2 Một số bài tập tham khảo cho học sinh khá, giỏi (chương trình viết
kiểu dữ liệu tệp)
Bài 1. Cho xâu s có độ dài khơng quá 255 kí tự chỉ gồm các chữ cái thường. Hãy
tìm trong s có bao nhiêu từ ‘ong’ thì thay bằng bấy nhiêu xâu ‘con ong ngoan’.
Dữ liệu: Vào file conong.inp
Dịng 1: Xâu s ( s độ dài <=255 kí tự).
Kết quả: Ghi ra file conong.out
Dòng 1: Là xâu kết quả.
Ví dụ:
Conong.inp
bo ong me ong

Conong.out
bo con ong ngoan me con ong ngoan

 Hướng dẫn

Xác định bài toán
Input: xâu s.
Output: xâu nhận được sau khi đổi.
Ý tưởng
23



Tìm ví trí xuất hiện từ ‘ong’ trong xâu s. Sau đó xóa từ ‘ong’ thay từ ‘con
ong ngoan’ vao vi trí đó. Sau đó bắt đầu tìm tiếp từ ‘ong’ từ vị trí sau vi trí vừa
chèn ‘con ong ngoan’ vào xâu s.
Thuật toán
Bước 1. Nhập xâu s.
Bước 2. I:=0;
Bước 3. Tăng i:=i+1;
Bước 4. Nếu i<= length(s)-2 thì nếu copy(s,i,3)=’ong’
thì xóa ‘ong’, chèn xâu ‘con ong ngoan’
i:=i+13; quay lại bước 3
Bước 5. Ghi ra xâu s, kết thúc.
Code tham khảo
var

f,g:text;

s,st:string;
t,i:integer;
BEGIN
assign(f,'conong.inp');reset(f);
assign(g,'conong.out');rewrite(g);
readln(f,s);
st:='con ong ngoan';
i:=0;
while ibegin
i:=i+1;
if copy(s,i,3)='ong' then

begin
t:=i;
delete(s,t,3);
insert(st,s,t);
24