SỞ GIÁO DỤC VÀ ĐÀO TẠO HÀ NỘI
TRƯỜNG THPT BA VÌ
ĐỀ TÀI SÁNG KIẾN KINH NGHIỆM
TÊN ĐỀ TÀI:
MỘT SỐ CẢI TIẾN VỀ PHƯƠNG PHÁP GIẢI BÀI TOÁN
TRÊN MÁY TÍNH
Người thực hiện: Nguyễn Thị Tuân.
Chức vụ: Giáo Viên.
Tổ: Toán - Tin.
Đơn Vị: Trường THPT Ba Vì.
HÀ NỘI - 2014
SỞ GIÁO DỤC & ĐÀO TẠO HÀ NỘI
TRƯỜNG THPT BA VÌ
CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc lập – Tự do – Hạnh phúc
ĐỀ TÀI SÁNG KIẾN KINH NGHIỆM
SƠ YẾU LÝ LỊCH
- Họ và tên: Nguyễn Thị Tuân.
- Ngày tháng năm sinh: 11 – 05 – 1982.
- Năm vào ngành: 2009.
- Chức vụ: Giáo Viên.
- Đơn vị công tác: Trường THPT Ba Vì
- Trình độ chuyên môn: Kỹ sư tin học.
- Bộ môn giảng dạy: Tin Học.
- Ngoại ngữ: Tiếng Anh.
- Trình độ chính trị: Sơ cấp.
2
I. ĐẶT VẤN ĐỀ
1. Tên đề tài
MỘT SỐ CẢI TIẾN VỀ PHƯƠNG PHÁP
toán, khi viết chương trình thì không khai báo được biến hoặc khai báo được
biến nhưng còn thiếu…
Xuất phát từ cơ sở trên, tôi đã chọn đề tài “Một số cải tiến về phương pháp
giải bài toán trên máy tính”, nhằm giúp các em học sinh khối 11 có thể thực hiện
giải các bài toán trên máy tính để hạn chế sai sót cũng như tăng tính hiệu quả,
tính đúng đắn của bài toán. Quá đó hình thành tích cách, thói quen và cách tư
duy hệ thống khi lập trình trên máy tính cho các em.
3. Cơ sở khoa học của đề tài:
3.1. Cơ sở lí luận:
Các bước giải bài toán trên máy tính là một khâu rất quan trọng có thể được
sử dụng hầu hết trong các tiết học đối với học sinh khối 11. Nó được áp dụng
trong các bài tập và giúp cho học sinh có cơ hội thực hành nhiều hơn.
Để giải dược một bài toán trên máy tính đối với ngôn ngữ lập trình là bài
toán khó với nhiều học sinh, kể cả học sinh khá, giỏi. Với mong muốn giúp các
em học sinh hiểu được những bài cơ bản và thấy yêu thích ngôn ngữ lập trình
hơn, bản thân người giáo viên luôn cố gắng tìm tòi những phương pháp dạy học
phù hợp với nội dung kiến thức, với từng đối tượng học sinh, đặc biệt là những
đối tượng học sinh trung bình, yếu, kém. Đồng thời giáo dục tư tưởng, ý thức,
thái độ và lòng ham muốn học ngôn ngữ lập trình nói riêng và môn tin học nói
chung của các em.
3.2. Cơ sở thực tiễn
Khi làm các bài toán về lập trình học sinh phải nắm vững được những
kiến thức cơ bản về các bước giải bài toán trên máy tính. Tuy nhiên trong quá
trình giảng dạy và trao đổi với các đồng nghiệp khác trong tổ chuyên môn khi
dạy phần kiến thức này, tôi nhận thấy rất nhiều các học sinh ở những lớp khác
4
nhau thường mắc những sai lầm giống nhau khi giải các bài toán liên quan tới
lập trình thậm chí có cả học sinh khá, giỏi.
Những lỗi mà học sinh thường gặp phải như :
- Không xác định được bài toán: ví dụ như không xác định được bài toán
46
46
4. Phương pháp nghiên cứu:
5
- Đọc kỹ tài liệu sách giáo khoa, sách giáo viên Tin Học 11 và một số tài
liệu tham khảo khác.
- Dạy học và trắc nghiệm trên các đối tượng: Giỏi - Khá - Trung bình,
yếu, kém trong đó nội dung dạy học, phương pháp thực hiện và kết quả thu được
đánh giá chủ yếu đối với đối tượng học sinh khá, trung bình, yếu, kém.
- Đưa ra bàn luận trước tổ, nhóm chuyên môn để tham khảo ý kiến và
cùng thực hiện.
- Tham khảo ý kiến các trường bạn, ý kiến đóng góp của các thầy cô dạy
lâu năm đã có nhiều kinh nghiệm.
- Dự giờ, kiểm tra, đánh giá chất lượng của học sinh.
- Dạy thực nghiệm trên 2 lớp 11 của trường là: 11A3, 11A4.
5. Phạm vi nghiên cứu và thời gian nghiên cứu:
- Nghiên cứu về chương trình Tin học 11.
- Thời gian làm trắc nghiệm trong thời gian hai năm.
- Kinh nghiệm của bản thân trong quá trình giảng dạy.
6
II. QUÁ TRÌNH THỰC HIỆN ĐỀ TÀI.
1. Tình trạng thực tế khi chưa thực hiện đề tài.
Đa số học sinh trong các lớp này khi thực hiện việc lập trình giải các bài
toán trên máy tính đều thực hiện không đúng phương pháp, không có trình tự
lôgíc hệ thống của chương trình. Đây lại là điều rất cần thiết trong lập trình điều
đó dẫn tới các em hiểu không đúng về bài toán, tư duy sai về thuật toán như:
không xác định Input và Output bài toán, sử dụng thuật toán không phù hợp với
bài toán…, cũng như việc các em sử dụng ngôn ngữ lập trình chưa phù hợp để
diễn đạt thuật toán. Điều đó thường dẫn tới nhiều khả năng chương trình bị lỗi
bị “treo”. Số liệu trên cũng đã phản ánh phần nào tình trạng chung đó.
3. Nội dung của đề tài.
Nội dung chủ yếu của đề tài là giới thiệu cho học sinh một cải tiến mới về
phương pháp giải bài toán trên máy tính. Phương pháp này thể hiện tính khoa
học hệ thống, tính lôgíc chặt chẽ khi giải các bài toán trên máy tính, giúp học
sinh có tư duy hệ thống, sáng tạo hơn và kết quả sẽ tốt hơn khi lập trình thực
hiện giải các bài toán trên máy tính.
3.1. Xác định Input và Output của bài toán.
Mỗi bài toán được đặc tả bởi hai thành phần: Input và Output, việc xác
định bài toán chính là xác định rõ hai thành phần này và mỗi quan hệ giữa
chúng. Các thông tin đó cần được nghiên cứu cẩn thận để có thể lựa chọn thuật
toán, cách thể hiện các đại lượng đã cho, các đại lượng phát sinh trong quá trình
giải bài toán và ngôn ngữ lập trình thích hợp.
Việc định hướng cho học sinh xác định được Input và Output của bài toán
là bước hết sức quan trọng. Vì thông qua việc xác định hai thành phần này giáo
viên cũng nên yêu cầu học sinh xác định luôn số lượng biến và kiểu dữ liệu cần
sử dụng trong bài toán khi lập trình, cũng như các biến cần sử dụng phát sinh
trong quá trình thực hiện bài toán, đây là vấn đề các em hầu như chưa bao giờ
thực hiện nên gặp rất nhiều khó khăn khi khai báo biến cho chương trình, có thể
hiểu đơn giản rằng.
Input chính là dữ liệu đầu vào của bài toán (giả thiết).
Output là dữ liệu đầu ra của bài toán (kết luận).
Ví dụ 1:
Lập chương trình tìm ước chung lớn nhất của hai số nguyên dương M, N.
Qua bài toán này có thể xác định được ngay dữ liệu đầu vào của bài toán đã
cho là M, N nguyên dương, và dữ liệu đầu ra là ước chung lớn nhất (ƯCLN) của
hai số đã cho.
- Input: M, N nguyên dương.
8
- Output: ƯCLN(M, N).
Tóm lại bài toán tính tổng các số dương trong dãy số cần có các biến sau.
Biến N: xác định số lượng số hạng.
Biến mảng: chứa số hạng.
Biến đếm: dùng cho vòng lặp (biến phát sinh).
Biến tổng: dùng để chứa tổng các số dương trong dãy số.
Như vậy xác định bài toán chính là khâu giúp học sinh biết được bài toán
cho cái gì? Và cần tìn cái gì? để từ đó khai báo các biến trong chương trình.
3.2. Thiết kế thuật toán.
Có thể nói khi lập trình giải một bài toán trên máy tính thì đây là bước quan
trọng nhất. Mỗi thuật toán chỉ giải một bài toán nào đó, nhưng có thể có nhiều
9
thuật toán khác nhau cùng giải một bài toán vì vậy cần thiết kế hoặc chọn một
thuật toán tối ưu để giải bài toán.
Khi thực hiện thiết kế hoặc lựa chọn thuật toán người lập trình thường quan
tâm đến các tài nguyên như: thời gian thực hiện chương trình (chương trình thực
hiện nhanh hay chậm), số lượng ô nhớ (chương trình chiếm dụng bao nhiêu bộ
nhớ trên máy tính)…
Trong các loại tài nguyên thì thường người ta quan tâm nhiều nhất đến tài
nguyên thời gian vì đó là dạng tài nguyên không tái tạo được.
Khi thiết kế thuật toán để giải một bài toán cụ thể cần căn cứ vào lượng tài
nguyên mà thuật toán đòi hỏi và lượng tài nguyên thực tế cho phép.
Để mô tả được thuật toán trước tiên học sinh phải đưa ra được ý tưởng của
thuật toán, rồi mới mô tả, thiết kế thuật toán theo ý tưởng đó. Trong khi mô tả
thuật toán cần chú ý về áp dụng số lượng biến cho chương trình.
Như ví dụ trên: Tìm ước chung lớn nhất của hai số nguyên dương M, N.
Để giải được bài toán này có nhiều thuật toán có thể thực hiện được, ở đây
tôi sử dụng thuật toán tìm ƯCLN bằng phương pháp hiệu.
* Ý tưởng thuật toán:
- Nếu M = N thì giá trị chung đó là ƯCLN của M và N;
- Nếu M >N thì ƯCLN(M, N) = ƯCLN(M-N, N);
chương trình vẫn chạy.
3.3 Viết chương trình.
Việc viết chương trình là tổng hợp giữa việc lựa chọn cách tổ chức dữ liệu
và sử dụng ngôn ngữ lập trình để diễn đạt đúng thuật toán.
Khi viết chương trình ta nên chọn một ngôn ngữ lập trình hoặc một phần
mềm chuyên dụng với thuật toán. Viết chương trình trong ngôn ngữ nào thì cần
phải tuân theo đúng qui định ngữ pháp của ngôn ngữ đó.
Chương trình dịch chỉ có thể phát hiện và thống báo các lỗi cú pháp, còn lỗi
ngữ nghĩa thì được phát hiện khi thực hiện chương trình.
Khi viết chương trình cần chú ý về bố cục chương trình, trang trí trình bày
chương trình phải gọn gàng tạo điều kiện thuận lợi cho quá trình sửa chữa và
phát triển chương trình sau này. Một thao tác quan trọng khi viết chương trình
11
đó là các em phải lưu chương trình, học sinh rất hay quên thao tác này nên dẫn
đến mất chương trình không khôi phục được.
* Chương trình bài toán tìm UCLN của hai số nguyên dương M và N.
- Phân tích chương trình: Học sinh cần bám sát vào phần Input và Output
của bài toán cũng như thuật toán đã thiết kế để thực hiện. Với chương trình cần
phải khai báo 2 biến đơn: M và N. Biến M và N dùng để lưu trữ 2 số hạng được
nhập vào từ bàn phím. Hai biến đơn này đều thuộc kiểu dữ liệu số nguyên.
- Về thuật toán: Mục đích của thuật toán là biến đổi M và N bằng hiệu của
số lớn trừ số bé, trừ cho đến khi nào M =N thì dừng, đây cũng chính là kết quả
ƯCLN của bài toán. Như vậy thuật toán này có sử dụng cấu trúc lặp với số lần
chưa biết trước để mô tả hành động lặp M - N hoặc N - M đến khi nào M = N thì
dừng. Các câu lệnh trong vòng lặp thường được lặp lại nhiều lần, vì vậy để tăng
hiệu quả của chương trình thì những thao tác không cần lặp lại nên đưa ra ngoài
vòng lặp.
- Phương pháp thực hiện:
+ Mở chương trình ngôn ngữ lập trình Pascal.
+ Lưu chương trình với tên UCLN.
Input tiêu biểu phụ thuộc vào đặc thù của bài toán và bằng cách nào đó ta biết
trước được Output. Tức là khi ta đưa bộ Input để thử bài toán thì bộ Input đó ta
có thể nhẩm tính hoặc tính nhanh được kết quả của bài toán rồi cho máy thực
hiện chương trình với bộ Input đó để thử kết quả. Quá trình này người ta gọi là
chạy thử chương trình (Test). Nếu có sai sót, phải chỉnh sửa chương trình rồi thử
lại, nếu kết quả thử nghiệm vẫn chưa đúng thì cho thấy thuật toán không phù
hợp với bài toán, phải hiệu chỉnh lại.
Thực chất thao tác này chúng ta chạy thử chương trình bằng các bộ Input.
Đây là bước rất quan trọng để kiểm định lại các thao tác mình làm đã chính xác
chưa đặc biệt là về thuật toán. Ngoài những việc như chỉnh sửa câu lệnh, thuật
toán còn thao tác không kém phần quan trọng nữa là định dạng chương trình về
thẩm mỹ cho đẹp mắt, cách bố trí nội dung của chương trình làm sao ngắn gọn
tạo cảm giác gần gũi và thân thiện với người sử dụng. Với bài toán tìm ƯCLN
13
của hai số nguyên dương M và N thì ta có thể đưa vào một số bộ Input sau để
kiểm tra các điều kiện xảy ra của bài toán.
Bộ Input kiểm tra khả năng điều kiện M = N; M > N; N > M :
- Với M = N: M= 10; N = 10 Ước chung lớn nhất là 10.
- Với M > N: M = 4; N = 2 Ước chung lớn nhất là 2.
- Với N > M: M= 6 ; N = 12 Ước chung lớn nhất là 6.
Chúng ta có thể sử dụng các bộ Input này để thử chương trình (test) và xác
định kết quả hiện trên màn hình. Nếu kết quả máy tính hiển thị là đúng thì chắc
chắn rằng thuật toán trong bài toán là chính xác. Nếu một kết quả nào bị sai thì
quay lại sửa chương trình và chạy thử lại với bộ Input đó. Ngoài ra học sinh có
thể cung cấp thêm nhiều bộ Input khác nữa nhưng phải đảm bảo tiêu chí kiểm
tra các khả năng có thể xảy ra của bài toán và các bộ Input đó phải nhẩm tính
được kết quả trước khi mang thử chương trình, đồng thời có những phương án
để hoàn thiện chương trình hơn.
Nếu kết quả chạy thử chương trình cho thấy ngôn ngữ lập trình hoặc thuật
toán không phù hợp thì phải kiểm tra lại, đôi khi quá trình này có thể lặp đi lặp
* Xác định Input, Output của bài toán.
Input: Dãy A gồm N số nguyên khác nhau a
1
, a
2
,…,a
N
.
Output: Đếm các số chẵn trong dãy.
Ngay tại bước này chúng ta có thể xác định được kiểu dữ liệu của một số
biến trong chương trình sẽ có như: Các biến đơn N, i, biến mảng để chứa dãy số
và một biến (d) để chứa các số chẵn. Kiểu dữ liệu các biến này là kiểu số
nguyên.
* Thiết kế thuật toán.
- Ý tưởng thuật toán.
Đếm là bài toán thường xảy ra trong cuộc sống, chẳng hạn muốn biết một
cuốn vở có bao nhiêu trang, muốn biết trong lớp có bao nhiêu bạn, có bao nhiêu
bạn nữ trong tổng số học sinh của cả lớp.
Với thuật toán đếm có thể có rất nhiều yêu cầu mà mỗi yêu cầu chính là
điều kiện của thuật toán.
Khi đó chỉ xảy ra một trong hai trường hợp sau:
+ Nếu a
i
chia hết cho 2 thì cộng vào biến đếm 1 đơn vị.
+ Nếu a
i
không chia hết cho 2 thì không công vào biến đếm.
Quá trình trên sẽ được lặp lại một số lần cho đến cuối dãy thì dừng.
15
- Thuật toán.
readln(A[i]);
end;
d:=0;
For i:=1 to N do
If a[i] mod 2 = 0 then
D:= d+1;
If d>0 then
writeln(‘so lưong so chan trong day la:’ , d)
else
writeln(‘trong day khong co so chan nao:’);
Readln
End.
Sau khi cài đặt chương trình xong thực hiện.
- Nhấp phím F9 để dịch chương trình.
- Nhấn tổ hợp phím Ctrl + F9 dịch và thực hiện chương trình.
* Chạy thử chương trình (Test).
Sau khi chương trình dịch thực hiện biên dịch thành công chương trình ta
bắt đầu chạy thử chương trình bằng các bộ Input tiêu biểu để kiểm tra tính đúng
đắn của chương trình. Với bài này ta có thể Test bằng bộ Input sau:
Cho n = 9 và dãy A gồm các số: 11, 4, 25, 17, 8, 19, 1, 20, 50.
- Với 1 = 1: Ta có A
i
= 11 d = 0.
- Với 1 = 2: Ta có A
i
= 4 d = 1.
- Với 1 = 3: Ta có A
i
= 25 d = 1.
- Với 1 = 4: Ta có A
dụng và vận dụng một phương pháp mới là một việc làm không dễ, không thể
trong ngày một, ngày hai mà thực hiện được, đặc biết với đối tượng học sinh là
các em học sinh dân tộc miền núi khả năng kiến thức còn hạn chế. Đó là một
quá trình lâu dài trong đó có sự kế thừa và cách tân mạnh mẽ. Chỉ có thế, việc
cải tiến phương pháp dạy học mới có thể đạt được chất lượng và hiệu quả.
Trong năm học 2011 - 2012, tôi đã vận dụng sáng kiến kinh nghiệm này
vào các tiết dạy và thu được những kết quả phần nào như mong đợi. Bản thân tôi
nhận thấy những kinh nghiệm này phù hợp với chương trình sách giáo khoa Tin
học 11 với những tiết dạy theo hướng đổi mới. Đa số học sinh không còn bỡ ngỡ
với việc lập trình một bài toán. Các em hiểu rõ bản chất thế nào là giải bài toán
trên máy tính đặc biệt với ngôn ngữ lập trình Pascal. Học sinh thấy hứng thú hơn
trong học tập, tích cực, chủ động hơn để mở rộng vốn hiểu biết của mình đồng
thời cũng linh hoạt trong việc lĩnh hội kiến thức, không khí học tập trở nên sôi
nổi hơn. Các em đã cảm thấy yêu thích ngôn ngữ lập trình hơn, tỷ lệ học sinh
khá, giỏi tăng lên, tỷ lệ học sinh yếu kém giảm đi.
Cụ thể, qua kiểm tra đánh giá tôi đã thu được kết quả như sau:
NĂM
HỌC
LỚP
SĨ
SỐ
GIỎI KHÁ TB YẾU KÉM
SL % SL % SL % SL % SL %
2010 11A3 45 5 11 16 36 22 49 2 4 0 0
11A4 44 4 9 14 32 23 52 3 7 0 0
2011 11A3 46 7 15 31 67 8 48 0 0 0 0
11A4 46 5 11 19 41 22 46 0 0 0 0
18
IV. KẾT LUẬN VÀ KIẾN NGHỊ
1. Kết luận
và học tập của giáo viên và học sinh.
2. Kiến nghị và đề nghị
Đối với nhà trường: Kính mong sự quan tâm giúp đỡ của nhà truờng tiếp
tục qua tâm tạo điều kiện về tài liệu giảng dạy, trang thiết bị máy móc thực hành
cho học sinh. Để học sinh càng ngày càng có điều kiện học tập thuận lợi hơn.
Đối với giáo viên: Tôi thấy đây là nhân tố quan trọng nhất, quyết định đến
sự thành công của đề tài với vai trò là đầu tàu hướng dẫn học sinh vận dung
phương pháp đúng cách, không ai có thể làm thay cho chúng ta được. Mỗi giáo
viên phải có kế hoạch dự giờ đồng nghiệp, tự rút kinh nghiệm cho bản thân. Với
tổ chuyên môn thường xuyên kiểm tra đôn đốc và tổ chức rút kinh nghiệm một
cách nghiêm túc sau mỗi tiết dạy của giáo viên. Chỉ có thế, chúng ta mới có thể
tạo sự chuyển biến mạnh mẽ trong đổi mới phương pháp dạy học tích cực nhằm
phát huy tính sáng tạo của học sinh
Trên thực tế, việc ứng dụng sáng kiến này mới chỉ trong một phạm vi hẹp,
vì thế cũng chưa thể đánh giá được toàn diện và chính xác nhất những ưu điểm
và hạn chế của đề tài. Vì vậy, tôi rất mong nhận được sự ủng hộ động viên cùng
những lời góp ý chân thành từ quý thầy cô đồng nghiệp để sáng kiến ngày một
hoàn thiện hơn.
Cuối cùng tôi xin chân thành cảm ơn!
XÁC NHẬN CỦA THỦ TRƯỞNG ĐƠN VỊ
Hà Nội, ngày 26 tháng 05 năm 2012
Tôi xin cam đoan đây là SKKN của
mình viết, không sao chép nội dung
của người khác.
Người viết
Nguyễn Thị Tuân
20