SKKN Rèn luyện tư duy thuật toán trong học lập trình Pascal Tin học 8 tại trường Phổ thông thực hành chất lượng cao Nguyễn Tất Thành

SỞ GIÁO DỤC ĐÀO TẠO TỈNH HÒA BÌNH  
TRƯỜNG CĐSP HÒA BÌNH  
Tác giả: Nguyễn Văn Hào  
SÁNG KIẾN KINH NGHIỆM  
RÈN LUYỆN TƯ DUY THUẬT TOÁN TRONG HỌC LẬP TRÌNH  
PASCAL - TIN HỌC 8 TẠI TRƯỜNG PT THỰC HÀNH CHẤT  
LƯỢNG CAO NGUYỄN TÁT THÀNH  
Năm học 2019-2020  
MỤC LỤC  
Chương 1. TỔNG QUAN  
1.1. Lý do chọn sáng kiến kinh nghiệm  
Tin học đang phát triển ngày ngày càng nhanh và trở thành nhân tố vô cùng cần  
thiết trong mọi lĩnh vực. Trong đó tin học được sử dụng phổ biến đặc biệt quan  
trọng trong giáo dục. Tin học được đưa vào chương trình tin học nhà trường cũng  
như hỗ trợ giảng dạy. Cùng với đó, Trong những năm học gần đây Bộ GD&ĐT đang  
tiến hành đổi mới phương pháp dạy học một trong những phương pháp đó là phát  
triển khả năng duy, sáng tạo của học sinh; lấy học sinh làm trung tâm; tránh tình  
trạng thầy đọc trò chép một cách thụ động; hướng học sinh đến việc tự làm chủ kiến  
thức của mình, tự tìm tòi khám pkiến thức cho bản thân mình.  
Theo phương pháp trên thì ngoài việc cung cấp kiến thức cho học sinh người  
thầy còn phải biết phát huy khả năng tư duy cho học sinh. Trong quá trình dạy học  
tôi nhận thấy một điểm hạn chế của học sinh là khi các em tiếp xúc với ngôn ngữ  
lập trình pascal thì hầu hết các em đều thấy nó khó, khó nhớ, khó áp dụng. Chính vì  
lí do đó mà khi học nội dung này các em chỉ học cho xong, học đối phó với thầy cô,  
các em cố tìm những đoạn lệnh rồi gõ theo và chạy chương trình cho có kết quả  
cũng không cần biết những đoạn lệnh đó làm việc như thế nào. Đôi với những  
học sinh khá hơn thì khi các em có tìm ra lời giải cho một bài toán thì các em đã vội  
hài lòng với kết quả mình đạt được mà không tìm hiểu thêm liệu có cách giải nào  
hay hơn không? Có thể cải tiến chương trình cho hiệu quả, ngắn học hơn không?  
Từ những thắc mắc đó, và sau một thời gian giảng dạy nội dung lập trình pascal  
cho đối tượng học sinh lớp 8 tôi đã rất băn khoăn. Phải làm gì để học sinh của tôi  
thể thay đổi cách nhìn nhận với môn học và cách học với môn lập trình này. Sau  
một thời gian suy nghĩ tôi cho rằng muốn thay đổi được các em thì trước tiên người  
thầy phải thay đổi, thay đổi cách tiếp cận nội dung, thay đổi phương pháp. Phải làm  
thế nào để các em có thể yêu thích môn học này, có yêu thích hứng thú thì các em  
mới thể tập trung học tập nghiêm túc được, các em sẽ không còn học đối phó nữa.  
Khi các em yêu thích thì hãy hướng các em đi từ việc đơn gian tới phức tạp, nhìn  
nhận vấn đhay giải các bài toán bằng nhiều cách để từ đó các em lĩnh hội được đầy  
đủ chủ động kiến thức môn học. Từ những lí do trên tôi quyết định nghiên cứu  
thực hiện sáng kiến RÈN LUYỆN TƯ DUY THUẬT TOÁN TRONG HỌC LẬP  
TRÌNH PASCAL - TIN HỌC 8 TẠI TRƯỜNG PT THỰC HÀNH CHẤT LƯỢNG CAO  
NGUYỄN TÁT THÀNH” nhằm giúp học sinh lớp 8 khắc phục được những hạn chế  
nêu trên và tạo sự ham mê yêu thích của học sinh với môn học lập trình này.  
   
1.2. Cơ sở luận  
1.2.1. Khái niệm thuật toán  
Trong bài viết này tôi không đi sâu vào lí thuyết thuật toán, do vậy không đề  
cập đến khái niệm hình thức chính xác của thuật toán. Chúng ta hãy xem xét một số  
định nghĩa (không hình thức) ít nhiều khác nhau của khái niệm thuật toán nhưng  
cùng nêu bản chất tả một cách thức một nhiệm vụ hay một tiến trình được  
thực hiện như thế nào của thuật toán. Xét một số định nghĩa về thuật toán sau:  
Định nghĩa 1 (K.Rosen): Một thuật toán là một thủ tục xác định để giải một  
bài toán, sử dụng một số hữu hạn bước. Mỗi bước thể gồm một hoặc một số thao  
tác/phép toán.  
Định nghĩa 2 (G.Brookshear): Một thuật toán là một tập hợp thứ tự các  
bước không nhập nhằng, thực hiện được, xác định một tiến trình có kết thúc.  
Định nghĩa 3 (A.V. Aho, J.E.Hopcroft,J.D.Ullman): Thuật toán là một dãy  
hữu hạn các câu lệnh, mỗi câu lệnh đều một ý nghĩa rằng và có thể được thực  
hiện với một lượng công sức hữu hạn trong một thời gian hữu hạn.  
Qua một số định nghĩa nêu trên, có thể thấy các thuật toán có các tính chất  
chung như sau:  
Đầu vào: Một thuật toán có các giá trị đầu vào được lấy từ một tập xác định.  
Đầu ra: Từ một tập các giá trị đầu vào, thuật toán sản sinh ra các giá trị đầu  
ra thuộc một tập xác định. Các gía trị đầu ra chứa lời giải của bài toán.  
Tính xác định: Các bước trong thuật toán phải được định nghĩa chính xác.  
Tính hữu hạn: Một thuật toán phải cho kết quả mong đợi sau một số hữu  
hạn bước với mọi đầu vào thuộc tập các dữ liệu vào hợp lệ.  
Tính hiệu quả: Phải khả năng thực hiện mỗi bước của thuật toán một cách  
đúng đắn và trong một thời gian chấp nhận được.  
Tính tổng quát (Phổ dụng): Thuật toán phải được áp dụng cho mọi bài toán  
có chung một dạng mà không phải chỉ cho riêng một tập các dữ liệu vào đặc biệt.  
1.2.2. Đánh giá thuật toán  
Một bài toán có thể nhiều thuật toán khác nhau để giải. Có các câu hỏi nảy  
sinh một cách tự nhiên: “Thuật toán nào tốt hơn trong số các thuật toán cùng giải  
quyết một bài toán đó?.” hoặc “Thuật toán nào là chấp nhận được”. Những câu hỏi  
như vậy liên quan đến việc ước lượng tài nguyên máy tính cần thiết để thực hiện một  
     
thuật toán. Các tài nguyên máy tính được quan tâm là thời gian, dung lượng nhớ,  
phần cứng.  
Đứng trước một bài toán cho máy tính thì thuật toán cần phải được thiết kế  
hay xây dựng như thế nào để thực hiện nhiệm vụ. Việc xây dựng một thuật toán là  
một công việc khó khăn không chỉ đối với học sinh mà đôi khi ngay cả với giáo viên  
cũng khó xây dựng được một thuật toán tối ưu. Công việc này đòi hỏi phải có sáng  
tạo, sự am hiểu lĩnh vực của bài toán và không thể đưa ra một tập các quy tắc chung.  
Nói cách khác, không có thuật toán nào cho việc thiết kế thuật toán. Do đó việc rèn  
luyện tư duy thuật toán cho học sinh là hết sức cần thiết. Ở cấp học trung học cơ sở  
thì việc các em tự thiết kế một thuật toán để giải quyết bài toán mới mẻ là khó khăn,  
chúng ta chỉ thể hướng dẫn các em làm quen với các bài toán mẫu với thuật toán  
sẵn để hình thành duy thuật toán, từ đó hình thành thói quen lập trình giải quyết  
bài toán khi đã xây dựng được thuật toán.  
1.3. Phương pháp tiếp cận để tạo ra sáng kiến  
- Nghiên cứu thuyết : Tìm hiểu các tài liệu, giáo trình liên quan tới nhiệm vụ  
nghiên cứu.  
- Nghiên cứu thực tiễn: Thông qua việc trực tiếp giảng dạy, trao đổi, phóng vấn trực  
tiếp với học sinh qua từng bài dạy để nắm được mức độ nhận thức của các em, biết  
được vấn đề khó khăn mà các em đang gặp phải từ đó tìm cách giải quyết vấn đề.  
1.4. Mục tiêu của sáng kiến kinh nghiệm  
Thông qua việc trình bày về thuật toán, cách xác định bài toán để hình thành  
thói quen duy lập trình cho mỗi học sinh. Từ việc học sinh rất khó xác định bài  
toàn, bỡ ngỡ khi gặp một bài toán hoặc khi đã thuật toán thì học sinh cũng không  
biết ngôn ngữ hóa thuật toán thế nào để thành một bài toán trên ngôn ngữ lập trình  
Pascal, Thì học sinh có thể hình thành duy thuật toán, biết cách xác định một  
bài toán trước khi chuyển hóa bài toán thành ngôn ngữ lập trình. Mong muốn của  
tác giả là sau khi hướng dẫn các em học sinh cách xác định một bài toán. Cụ thể là  
thông qua một số dụ cụ thể thì các em từng bước hình thành được kỹ năng lập  
trình với ngôn ngữ lập trình pascal.  
   
Chương 2. MÔ TẢ SÁNG KIẾN  
2.1. Vấn đề của sáng kiến  
Tin học một môn học mới do đó học sinh còn bỡ ngỡ, chưa thấy hết tầm  
quan trọng của môn học. Nội dung học lập trình tin học 8 lại nội dung mới lạ đối  
với hầu hết học sinh với nhiều khái niệm, thuật ngữ, cấu trúc dữ liệu đối với học sinh  
mới tiếp cận lần đầu. Chính vì vậy khi gặp một bài toán học sinh không biết phải  
giải quyết bài toán thế nào. Học sinh hoàn toàn xa lạ với những khái niệm như “xác  
định bài toán” hay “Xây dựng thuật toán”. Học sinh hoàn toàn bỡ ngỡ với việc  
chuyển hóa các bước giải bài toán thông thường trong toán học sang ngôn ngữ lập  
trình Pascal trong tin học. Bên cạnh những khó khăn đó thì cũng nhiều mặt thuận  
lợi như đối tượng học sinh ngoan, nhiều em ham học hỏi. Nhà trường cũng đầu tư  
trang thiết bị dạy học hiện đại, phòng máy đáp ứng được nhu cầu thực hành của các  
em học sinh.  
Đối với giáo viên: Tính tới năm nay thì mới là khóa học thứ 2 của trường học  
nội dung lập trình pascal. Do đó, bản thân tôi cũng còn thiếu kinh nghiệm trong quá  
trình giảng dạy, đôi khi còn phụ thuộc nhiều vào sách giáo khoa và giáo án, chính vì  
thế mà khi tiếp cận một bài toán nào đó thì thường hướng dẫn cho học sinh lời  
giải bài toán đó theo một phương pháp nhất định, cơ bản nhất để các em có thể hiểu  
giải được bằng ngôn ngữ lập trình Pascal. Tuy nhiên với cách làm đó tôi nhận  
thấy học sinh bị phụ thuộc nhiều vào lời giải của thầy và không phát huy được khả  
năng tư duy và sáng tạo. Các em cố gắng học thuộc cấu trúc một số câu lệnh và các  
dụ áp dụng mà không tự tìm hiểu thêm các dạng bài khác, hoặc cách giải khác  
hiệu quả hơn, thú vị hơn.  
Trong tiết thực hành một số em gõ chương trình một cách máy móc các nội  
dung của bài thực hành từ sách giáo khoa chứ không thực sự tìm hiểu xem tại sao  
lại viết câu lệnh này, câu lệnh này mục đích để làm gì, câu lệnh này sẽ cho chúng ta  
kết quả gì, các học sinh hầu như chưa ý thức việc học của mình, hay nói cách khác  
học sinh chưa động cơ, thái độ học tập đúng đắn. Để dẫn tới điều này có thể do  
các em chưa tìm thấy niềm vui và sự đam đối với môn học, các em nghĩ môn tin  
học là môn phụ. Mặt khác nội dung môn tin học 8 lại đòi hỏi khá cao. Nếu học sinh  
chỉ dừng lại ở nội dung kiến thức trong chương trình sách giáo khoa thì sẽ không  
đáp ứng được yêu cầu đặt ra như thi học sinh giỏi văn hóa lớp 9, thi tin học trẻ, thi  
vào trường chuyên tin lớp 10.  
2.2. Các biện pháp nâng cao hiệu quả  
     
2.2.1. Thay đổi cách nhìn và tạo niềm đam mêm của học sinh với môn học.  
- Vì sao môn Pascal lại khó?  
Một thói quen khó thay đổi của học sinh đó là cách nhìn nhận về môn tin học,  
theo các em thì môn tin học học những thao tác sử dụng đơn giản như: cách sử  
dụng internet, sử dụng hệ điều hành window, chương trình soạn thảo văn bản MS  
Word, chương trình soạn thảo trình diễn MS PowerPoint … Đây những phần học  
ít đòi hỏi ở học sinh duy, mà chỉ cần học nhớ thao tác, thực hành nhiều lần  
thì sẽ thành kỹ năng và thành thạo.  
Nhưng khi học bộ môn lập trình Passal chương trình lớp 8 THCS thì hầu  
như các em bị “choáng” vì bộ môn rất “mới”, và cách học cũng “mới”. Học những  
thao tác và thực hành nhiều dường như không còn phù hợp nữa. Học thuộc bài theo  
kiểu thuộc lòng chỉ phù hợp với nội dung là các cấu trúc câu lệnh chứ không thể áp  
dụng điều đó vào từng bài toán được. Lúc này các em cần phải học cách duy logic,  
tìm hiểu thuật toán, và viết những dòng lệnh máy tính trên cơ sở thuật toán đã xây  
dựng hơn thế nữa các câu lệnh cần phải độ chính xác tuyệt đối đến từng đấu  
chấm, dấu phẩy.  
Với tâm lí thông thường các em học sinh coi tin học là môn phụ không quan  
trọng nên nhiều em chủ quan không dành đủ thời gian để học nên không hiểu bài  
dần bị mất căn bản. Đây cũng là lí do mà nhiều em luôn kêu học lập trình pascal  
khó quá.  
- Tại sao lại học Pascal?  
Pascal là một ngôn ngữ lập trình cấp cao do Niklaus Wirth, giáo sư điện toán  
trường đại học Kỹ thuật Zurich (Thụy sĩ) thiết kế và công bố vào năm 1971 và đặt  
tên là Pascal để tưởng niệm nhà Toán học Triết học nổi tiếng Blaise Pascal. Đây  
một ngôn ngữ lập trình có cấu trúc đơn giản, rõ ràng, cấu trúc chặt chẽ, dễ viết, dễ  
hiểu cũng như dễ sửa chữa, cải tiến. Do đó Pascal được nhiều quốc gia trong đó có  
Việt Nam đưa vào chương trình giảng dạy tin học ở các trường phổ thông và đại học  
như một môn học cơ sở, đại cương.  
Ở cấp học phổ thông chúng ta không chú trọng học chuyên sâu về ngôn ngữ  
lập trình để tạo ra các phần mềm máy tính mà tập trung rèn luyện kĩ năng tư duy  
logic, duy hệ thống và sáng tạo không chỉ để giải quyết những vấn đề trong tin  
học đây còn là những kĩ năng vô cùng quan trọng để giải quyết nhiều vấn đề  
trong cuộc sống.  
 
Học Pascal giúp cho ta hiểu được cách làm việc của máy tính, cách giao tiếp  
để ra lệnh cho máy tính làm việc theo sự điều khiển của con người thông qua ngôn  
ngữ lập trình. Các em có thể tạo ra các chương trình thú vị bằng cách sử dụng các  
câu lệnh Pascal. Cũng giống như những môn học khác như toán học, vật lý, hóa học  
… khi các em đã thực sự hiểu và yêu thích bộ môn tin học các em sẽ tìm thấy nhiều  
niềm vui, sự đam mê khi tìm hiểu và khám phá những điều mới mẻ nhưng đầy hấp  
dẫn trong bộ môn tưởng chừng như khô khan này.  
- Tạo sự yêu thích khi học lập trình Pascal  
Lập trình là môn học đòi hỏi học sinh phải giải các bài toán bằng cách viết  
chương trình trên máy tính. Đây là môn học mới đối với học sinh nên phần đông các  
em không nắm bắt được kiến thức để vận dụng vào giải bài tập. Về ngôn ngữ lập  
trình Pascal đang gây khó khăn cho các học sinh mới bắt đầu tìm hiểu học lập trình.  
Vì Pascal có nhiều hạn chế về mặt hình thức như: Giao diện là dòng lệnh, khó nhớ  
và không thân thiện, dễ gây sự nhàm chán cho học sinh, về cú pháp thì chặt chẽ chỉ  
cần thiếu một dấu cũng báo lỗi sai trong chương trình, toàn bộ thông báo lại bằng  
ngôn ngữ tiếng anh đó cũng hạn chế và khó khăn cho học sinh.  
Qua một thời gian giảng dạy ở bộ môn này, tôi nhận thấy khi học Pascal học  
sinh thường không thích thú với môn học này vì nhiều lý do như khó hiểu, đòi hỏi  
duy, … nên việc viết được một chương trình chạy được trên máy tính đối với các  
em rất khó khăn. Do đó để học tốt đòi hỏi học sinh phải hứng thú. Cốt lõi của  
việc đổi mới phương pháp dạy học là giúp học sinh yêu thích, hứng thú với môn  
học, hướng tới việc học tập chủ động, chống lại thói quen học tập thụ động. Để khắc  
phục điều này thì chúng ta cần giải quyết được các vấn đề sau:  
* Vấn đề 1: Học sinh chúng ta vừa đọc xong đề bài là kêu khó, không chịu tìm hiểu  
xem đề bài yêu cầu gì. Nói cụ thể hơn là sau khi đọc xong bài toán thì học sinh không  
định hướng được phải bắt đầu từ đâu, phải sử dụng cấu trúc dữ liệu nào hay cấu  
trúc lệnh nào để giải quyết. Để giúp học sinh vấn đề này thì sau khi đọc đề bài xong  
giáo viên hướng dẫn các em xác định rõ bài toán (xác định thành phần Input và  
Output của bài toán). Từ Inphut và Output của bài toán giáo viên yêu cầu học sinh  
gạch ra giấy chỉ ra từng bước để giải quyết bài toán rồi từ đó đưa ra các thuật toán,  
từng bước tinh chỉnh thuật toán tìm được thuật toán đúng đắn nhất cuối cùng là viết  
chương trình hoàn chỉnh.  
VD: Khi yêu cầu học sinh lập trình tính chu vi và diện tích hình tròn với bán kính  
nhập vào từ bàn phím.  
- Để giải bài này giáo viên yêu cầu học sinh nêu rõ Input vào Output bài toán.  
Input: Bán kính hình tròn  
Output: Diện tích và chu vi của hình tròn  
- GV yêu cầu HS gạch ra các công việc cần làm để giải quyết bài tập này ?  
Các công việc cần làm để giải quyết bài tập này :  
+ Nhập bán kính R, + Tính diện tích hình tròn + Tính chu vi hình tròn  
+ In ra diện tích và chu vi hình tròn  
– Gv gợi ý yêu cầu HS nêu công thức tính diện tích và chu vi hình tròn?  
Diện tích S = Pi*R^2  
Chu vi Cv = 2*Pi*R  
Với những yêu cầu cụ thể đó, giáo viên yêu cầu học sinh gõ các câu lệnh để hoàn  
thành bài toán. Có thể gợi ý cụ thể trong bài toán này: Cần thực hiện lệnh nhập dữ  
liệu như thế nào? Dùng lệnh gán để tính chu vi và diện tích với các công thức toán  
học đã có. Sau khi tính toán xong thì dùng lệnh in kết quả ra màn hình.  
* Vấn đề 2: Hầu như các em học sinh khi thực hành lập trình đều đùn đẩy cho nhau  
thiếu tự tin và không biết phải gõ gì vào máy, sợ gõ sai lỗi chính tả các câu lệnh  
hay từ khóa. Để giúp các em vấn đề này thì giáo viên nên khuyến khích các em cứ  
mạnh dạn gõ, một lần sai, hai lần sai,… rồi từ từ các em sẽ đúng câu lệnh, như  
vậy các em mới nhớ được câu lệnh, từ khóa và chủ động hơn trong việc gõ các câu  
lệnh giải quyết bài toán. Lúc đầu giám sát quá trình làm việc của các em, sửa các lỗi  
sai, về sau để các em tự làm việc chỉ sửa lỗi khi các em gặp khó khăn thực sự, không  
giải quyết được bắt buộc cần hướng dẫn của giáo viên. Khi các em tự chương  
trình các em mới thực sự hiểu chương trình đó hoạt động thế nào chứ không thể nhìn  
hiểu được. Chỉ tự gõ các lệnh thì mới nhớ được hiểu từ đó sẽ tự tin khi  
ngồi lập trình trước máy tính. Khi tự tin làm việc với máy tính thì các em mới say  
mê và yêu thích môn học.  
* Vấn đề 3: Khi thực hành các em chỉ gõ cho xong nội dung của bài thực hành, hoặc  
tìm kiếm những bài mẫu sẵn và gõ theo, sau đó các em kiểm soát lỗi chính tả rồi  
chạy thử, hiện kết là coi như xong bài tập. Học như vậy các em hoàn toàn thụ động,  
chứ không thực sự tìm hiểu xem tại sao lại có câu lệnh đó, tại sao phải dùng cấu trúc  
điều khiển này mà không dùng cấu trúc điều khiển kia, tới câu lệnh này thì kết quả  
sẽ như thế nào, … Chính vì vậy mà các em không hiểu bài và không thể tự sửa lỗi  
nếu gõ sai. Hướng dẫn các em cách chạy chương trình từng bước và cách quan sát  
giá trị các tham số cần thiết. Hướng dẫn các em “Biến mình thành cái máy tính” để  
thực hiện lần lượt các câu lệnh từ trên xuống dưới xem nếu là máy thì tại bước này  
sẽ thực hiện công việc gì, kết quả sẽ là gì? Có như vậy học sinh mới thực sự hiểu  
vấn đề, hiểu cách làm việc của ngôn ngữ lập trình pascal.  
2.2.2. Các cách tiếp cận bài toán  
2.2.2.1. Rèn luyện kỹ năng lập trình với câu lệnh điều kiện  
Đối vi hc sinh, khi làm quen vi bt kmt cu trúc lnh nào cũng đều bỡ  
ngvì các em chưa quen và biết cách sdng cu trúc đó. Để hc sinh có thhiu và  
vn dng các cu trúc lnh vào tng bài toán cththì điu đầu tiên giáo viên phi  
giúp các em hiu rõ cu trúc lnh, thuc cu trúc lnh sau đó sẽ đưa ra các dng bài tp  
áp dng cu trúc lnh để cng ckiến thc cho các em. Phi thc hin chi tiết cvề  
mt cu trúc ngôn nglp trình và phân tích bài toán từ đó xác định rõ bài toán scho  
kết qulà gì? Chúng ta sly ví dbài toán sdng câu lnh điu kin sau:  
Ví d: Viết chương trình nhập vào 3 số nguyên dương a, b, c khác nhau. In ra  
màn hình số lớn nhất nhỏ nhất trong 3 số trên.  
* Phương pháp 1:  
- Xác định bài toán:  
. Input: Nhập vào máy tính 3 số tự nhiên a, b, c  
. Output: In ra màn hình số lớn nhất, nhỏ nhất trong 3 số a, b, c  
- Ý tưởng:  
+ Tìm số lớn nhất: (a>b) và (a>c) thì a lớn nhất; (b>a) và (b>c) thì b lớn nhất; (c>a)  
và (c>b) thì c lớn nhất;  
+ Tìm số nhnhất: (a<b) và (a<c) thì a nhnhất; (b<a) và (b<c) thì b nhỏ nhất; (c<a)  
và (c<b) thì c nhỏ nht;  
- Từ ý tưởng trên chúng ta sẽ xây dựng chương trình:  
Var a,b,c:Integer;  
Begin  
Writeln(‘Nhap a, b, c:’);  
Readln(a,b,c);  
If (a>b) and (a>c) Then Writeln(a,’ lon nhat’)  
Else If (b>a) and (b>c) Then Writeln(b,’ lon nhat’)  
Else Writeln(c,’ lon nhat’) ;  
If (a<b) and (a<c) Then Writeln(a,’ nho nhat’)  
Else If (b<a) and (b<c) Then Writeln(b,’ nho nhat’)  
Else Writeln(c,’ nho nhat’) ; Readln; End.  
   
* Phương pháp 2:  
- Ý tưởng: Cũng một bài toán như trên, chúng ta cũng xác định cho học sinh thấy  
rõ yêu cầu bài toán tức là xác định Input và output, những thể giải quyết bài toán  
theo một cách khác như sau:  
+ Nếu a>b thì ta gán a cho Max, b cho Min, ngược lại thì ta gán Max cho  
b, Min cho a {Tìm số lớn nhất nhỏ nhất trong hai số a, b. Sau khi thực hiện  
dòng lệnh trên Max sẽ nhận được giá trị lớn nhất, Min sẽ nhận được giá trị nhỏ  
nht}.  
+ Nếu c>Max thì ta gán c cho Max, ngược lại nếu c<Min thì ta gán c cho  
Min {So sánh c với giá trị lớn nhất (Max) và nhỏ nhất (Min)}.  
- Chương trình:  
Var a,b,c,Max,Min:Integer;  
Begin  
Write(‘Nhap lan luoc 3 so a, b, c:’);Readln(a,b,c);  
If (a>b) Then Begin Max:=a; Min:=b; End  
Else Begin Max:=b; Min:=a; End;  
If (c>Max) Then Max:=c Else If (c<Min) Then Min:=c;  
Write(‘So lon la:’,Max,’ So nho la:’,Min);  
Readln;  
End.  
* Phương pháp 3:  
- Ý tưởng:  
+ So sánh gtrị a và b, nếu a>b thì đổi giá trị a và b. {Sau khi đổi giá trị  
thì sẽ cho kết quả a <b}.  
+ So sánh gtrị b và c, nếu b>c thì đổi giá trị b và c. {Sau khi đổi giá trị  
thì sẽ cho kết quả a, b <c, tuy nhiên lại chưa xác định được a>b hay b>a }.  
+ Lại so sánh giá trị a và b, nếu a>b thì đổi giá trị a và b. {Sau khi đổi giá  
trthì sẽ cho kết quả a < b và b < c}.  
- Chương trình:  
Var a,b,c,tam:Integer;  
Begin  
Write('Nhap gia tri a, b, c tuong ung: '); Readln(a,b,c);  
If a>b Then  
begin  
Tam:=a; a:=b; b:=tam  
end;  
If b>c Then  
begin  
Tam:=b; b:=c; c:=tam  
end;  
If a>b Then  
begin  
Tam:=a; a:=b;b:=tam  
end;  
Write('So nho la:’,a,’ so lon la’,c);  
Readln;  
End.  
=> Nhận xét: Trong 3 phương pháp trên thì mỗi phương pháp đều một ưu điểm  
hạn chế riêng:  
- Phương pháp 1: Giúp học sinh làm quen với câu lệnh điều kiện dạng đủ lồng nhau  
điều kiện ghép ((a>b) and (a>c)) trong câu lệnh điều kiện thông qua phép  
toán and.  
- Phương pháp 2: Giúp học sinh làm quen với lệnh gán, sử dụng biến trung gian  
Max, Min và câu lệnh ghép (Begin Max:=a; Min:=b; End) trong câu lệnh điều kin.  
- Phương pháp 3: Giúp học sinh làm quen với câu lệnh điều kiện dạng thiếu và ôn  
lại kiến thức sắp xếp giá trị hai biến theo thứ tự tăng hoặc giảm dần  
begin Tam:=a; a:=b; b:=tam end;  
Tóm lại: Với mỗi bài toán nếu thể hãy tìm ra nhiều cách tiếp cận khác nhau,  
các cách viết chương trình khác nhau để học sinh có thể mở rộng khả năng tư duy  
cũng như tạo sự yêu thích khi tìm thấy niềm vui ở mỗi cách xây dựng bài toán. Qua  
đó học sinh sẽ có cách nhìn linh hoạt hơn với mỗi cấu trúc câu lệnh, phát huy tính  
tích cực và sáng tạo cho học sinh.  
2.2.2.2. Rèn luyện kỹ năng lập trình với câu lệnh lặp  
Cấu trúc lệnh lặp cấu trúc cơ bản trong ngôn ngữ lập trình pascal và cấu  
trúc này cũng cấu trúc giúp học sinh giải quyết một lượng lớn các dạng bài tập.  
Tuy nhiên khi tiếp cận câu lệnh lặp này thì học sinh lại khó hình dung ra cách hoạt  
động của từng cấu trúc, đặc biệt học sinh khó phân biệt cấu trúc lặp xác định và  
lặp với số lần lặp không xác định. Một lỗi học sinh thường gặp khi làm việc với  
 
cấu trúc lặp đó là không xác định được điều kiện để dừng vòng lặp. Chính vì những  
lý do trên mà khi dạy cho học sinh cấu trúc lặp giáo viên cần xây dựng các ví dụ sử  
dụng cấu trúc này cụ thể để học sinh hiểu rõ và ghi nhớ sau đó các em mới hình  
thành phản xạ kĩ năng lập trình có xử dụng cấu trúc lặp.  
Để học sinh có thể hiểu rõ và phân biệt được cấu trúc lặp chúng ta có thể giao  
cho học sinh bài toán sau:  
dụ 1: Viết chương trình tính tổng số nguyên từ 1 tới n, n là số nguyên nhập  
từ bàn phím bằng cách sử dụng cấu trúc lặp For..do, While..do cấu trúc Repeat  
..until.  
Với bài toán này cho dù dùng cấu trúc lệnh lặp nào thì cũng cần xác định rõ  
bài toán với Input: Nhập vào số tự nhiên n, Output: in ra màn hình tổng của các chữ  
số từ 1 tới n vừa nhập vào.  
+ Cấu trúc For..do ta thể xây dựng chương trình như sau:  
var i, n: integer; s: real;  
Begin  
writeln('nhap so n de tinh tong'); readln(n);  
s:=0;  
for i:=1 to n do s:=s+i;  
writeln('tong tu 1-n la: =',s:2:0);  
readln;  
end.  
+ Cấu trúc While ..do ta có chương trình như sau:  
var i: integer; s: real;  
begin  
writeln('nhap so n de tinh tong tu 1-n'); readln(n);  
s:=0;i:=0;  
while i<=n do  
begin  
i:=i+1; s:=s+i;  
end;  
writeln('tong tu 1- ' , n , ' la= ' ,s:5:2); readln;  
end.  
+ Cấu trúc lệnh lặp Repeat ..until ta có chương trình như sau:  
var i:integer; s:real;  
begin  
write('n= '); readln(n);  
s:=0; i:=0;  
repeat  
i:=i+1; s:=s+i;  
until i=n;  
writeln('tong 1- ' , n, '=',s:0:2); readln;  
end.  
Trong bài toán nêu trên về cơ bản thì cả 3 cách viết đều cho một kết quả nhưng  
khi dạy làm quen với cấu trúc lặp thì chúng ta cần khuyên khích học sinh viết chương  
trình giải quyết cùng một bài toán nhưng dùng cả 3 cấu trúc lặp. Đối với câu lệnh  
lặp For .. do thì đại đa số học tiếp cận nhanh hơn và không bị nhầm lẫn, chỉ khi các  
em chuyển bài toán từ dùng Ror..do sang dùng while ..do và Repeat ..until thì hầu  
hết các em đều không hiểu vẫn đề điều kiện để vòng lặp thể dừng. Chính  
vì lý do đó mà khi giúp các em xây dựng bài toán theo hướng While..do và  
Repeat..until giáo viên nên nhấn mạnh điểm này. Có thể cho học sinh rơi vào vòng  
lặp không dừng như ta có thể bỏ qua lệnh làm thay đổi giá trị của biến i (i:=i+1).  
Khi học sinh chạy thử chương trình sẽ bị lặp dẫn tới không thoát được, khi đó  
mới phân tích điều kiện dừng vòng lặp và yêu cầu học sinh gõ lại chương trình, khi  
đó học sinh mới hiểu được bản chất của hai câu lệnh dạng này đồng thời đó cũng  
một kinh nghiệm cho các em khi lập trình mà sử dụng cấu trúc lặp không xác định  
này.  
Mặt khác của vấn đề là khi dạy cho học sinh các cấu trúc lệnh lặp thì ngoài  
việc dạy các em cấu trúc còn phải giúp các em nhận diện bài toán để thể áp dụng  
được tốt các cấu trúc lệnh sao cho phù hợp. Khi các em nhận diện được cấu trúc lệnh  
để giải quyết bài toán thì vấn đề đặt ra là các bài toán đó các em đã giải quyết tốt  
chưa? Tức chương trình các em xây dựng đã hoàn hảo chưa? Đến lúc này giáo  
viên cần giúp các em tinh chỉnh bài toán của các em sao cho tối ưu nhất. Chúng ta  
sẽ xem xét vấn đề này qua một số dụ sau:  
dụ 2: Số nguyên tố số tự nhiên lớn hơn 1, chỉ có hai ước là 1 và chính nó.  
Yêu cầu: Nhập vào số nguyên dương N. Kiểm tra xem N có phải số nguyên  
tố hay không, thông báo kết quả sau khi kiểm tra.  
Xác định bài toán:  
Input: Nhập vào một số tnhiên N, Output: N có phải số nguyên tố hay không.  
* Phương pháp 1:  
- Ý tưởng:  
+ Cho biến i chạy từ 2 đến n-1 {Ta xét trường hợp n có chia hết cho i hay không},  
nếu n chia hết cho i thì ta tăng biến đếm lên một đơn vị {ban đầu biến đếm nhận  
giá trị bằng 0}.  
+ Kiểm tra biến đếm, nếu biến đếm nhận giá trị bằng không {tức n không chia hết  
cho số nào trong khoảng từ 2 đến n-1} vậy n là số nguyên tố, ngược lại biến đếm  
nhận giá trị lớn hơn 0{tức n chia hết cho cho một hoặc nhiều giá trị trong khoảng  
[2..n-1]} vậy n không phải số nguyên tố.  
Chương trình:  
Var n,i,dem:Integer;  
Begin  
Write('Nhap gia tri N: ');Readln(n);  
If n<2 Then Write(n, Khong phai la so nguyen to') Else  
Begin  
dem:=0;  
For i:=2 To n-1 Do  
If n Mod i = 0 Then Inc(dem);  
If dem=0 Then Writeln(n, ' La so nguyen to')  
Else Writeln(n, ' Khong phai So nguyen to');  
End; Readln;  
End.  
* Phương pháp 2:  
- Bổ sung kiến thức:  
+ N là số Nguyên tố khi n>=2 và n không chia hết cho số nào có giá trị trong khoảng  
từ 2 đến n – 1. Tuy nhiên trên thực tế thì chỉ cần n không chia hết cho số nào có giá  
trị trong khoản từ 2 đến số nguyên gần với căn n nhất nhưng nhỏ hơn n  
{Trunc(Sqrt(n))}.  
- Ý tưởng:  
+ Giống như phương pháp 1 tuy nhiên ở đây chúng ta không đếm sử dụng phương  
pháp đánh dấu của kiểu boolean. Tức ta xét trường hợp n có chia hết cho i hay không,  
nếu n chia hết cho i thì ta đánh dấu là False {Giả sử biến KT có biểu dữ liệu là  
Boolean thì nếu n chia hết cho i thì KT:=False, ban đầu ta gán KT:=True}.  
+ Kiểm tra biến KT, nếu KT là True {tức biến KT nhận tất cả là True} thì n là số  
nguyên tố, ngược lại n không phải số nguyên tố {tức biến KT có nhận lớn hơn hoặc  
bằng một giá trị False}.  
- Chương trình:  
Var i,n:Integer; Kt:Boolean;  
Begin  
Write('Nhap gia tri N: ');Readln(n);  
Kt:=True; If n < 2 Then Kt:=False Else  
For i:=2 To Trunc(Sqrt(n)) Do  
If n Mod i = 0 Then Kt:=False;  
If Kt Then Write(n,' la so nguyen to')  
Else Write(n,' Khong la so nguyen to'); Readln;  
End.  
=> Nhận xét:  
- Phương pháp 1: Giúp cho học sinh có cái nhìn tổng quan hơn khi xác định n có  
phải số nguyên tố hay không thông qua phương thức đếm số lần n có chia hết cho  
giá trị nào trong khoảng từ [2..n-1] hay không, theo định nghĩa thì số nguyên tố là  
số chỉ chia hết cho 1 và chính nó {tức nếu N là số nguyên tố chỉ khi n chia hết cho  
1 và n}. Vậy nếu n còn chia hết cho số nào trong khoảng [2..n-1] thì n không phải  
nguyên tố.  
- Phương pháp 2: Phương giáp này giúp học sinh tìm hiểu được nhiều kiến thức hơn  
trên nền kiến thức của phương pháp 1. Khi cho i chạy từ 2 đến trunc(sqrt(n))  
thì số lần thực hiện vòng lặp được giảm đi một nữa, sẽ tiết kiệm được thời gian khi  
chạy chương trình; mặt khác giúp học sinh ôn lại kiến thức lấy kết quả phép so sánh  
của kiểu dữ liệu Boolean, một kiểu dữ liệu mà chúng ta cũng rất hay sử dụng trong  
các bài tạo vòng lặp.  
dụ 3: Viết chương trình nhập vào 2 số nguyên dương a, b khác nhau. Tìm ước  
chung lớn nhất bội chung nhỏ nhất của 2 số trên.  
- Xác định bài toán:  
Input: Nhập vào hai số nguyên dương a, b  
Output: In ra màn hình UCLN(a,b) và BCNN(a,b)  
* Phương pháp 1:  
- Ý tưởng:  
Đầu tiên, là cách cơ bản nhất. Đó là dùng vòng lặp WHILE, rồi lấy số lớn trừ  
nhỏ cho đến khi chúng bằng nhau. Cách này dành cho những bạn học yếu, đỡ phải  
suy nghĩ nhiều. Tuy nhiên cách này có hạn chế nếu mà 2 số chênh nhau quá lớn  
thì nó sẽ lặp rất nhiều lần, điều này không quan trọng đối với các bạn học sinh, nhưng  
nếu đi sâu vào chuyên ngành thì việc làm này sẽ tốn dung lượng bộ nhớ thuật  
toán này cũng được đánh giá là kém tối ưu.  
dụ tìm UCLN và BCNN của 17 và 3 (bằng phương pháp đoán nhận ta thấy được  
UCLN của 2 số này là 1 và BCNN là 51).  
Giáo viên có thể phỏng thuật toán cho học sinh hiểu như sau:  
- UCLN : ta sẽ lấy 17 - 3 = 14, 14 - 3 =11, 11- 3 = 8; 8 - 3 = 5; 5 - 3 = 2; 3-2=1; 2-1  
=1; Lúc này chúng đã bằng nhau và bằng 1. Và 1 cũng chính là UCLN.  
- BCNN : bằng tích của 2 số chia cho UCLN lấy phần nguyên.  
+ Tích của 2 số là 17x3 = 51  
+ Chia 1 lấy phần nguyên là bằng 51.  
var x,y,UCLN,BCNN:integer;  
Begin  
readln(x,y);  
BCNN:=x*y;  
While x<>y do  
If x>y then x:=x-y else y:=y-x;  
UCLN:=x;  
BCNN:=BCNN div UCLN;  
write(UCLN,' ',BCNN);  
end.  
Lưu ý: Sau khi test chương trình xong giáo viên cho học sinh test cặp giá trị a, b  
bằng nhau. Yêu cầu học sinh nhận xét, nêu thuật toán và viết lại chương trình trên  
với điều kiện a, b là hai số nguyên.  
* Phương pháp 2:  
- Ý tưởng:  
+ Nếu a chia b có phần dư bằng 0 thì b là UCLN của a và b. Từ khái niệm này ta xây  
dựng thuật toán như sau: du:= a mod b, a:=b; b:=du, chương trình kết thúc khi b=0  
và UCLN là a.  
+ Viết ra UCLN, BCNN  
- Chương trình:  
Var a,b,p,du:Integer;  
Begin  
Write('Nhap gia tri a, b tuong uong : ');Readln(a, b);  
P:=a*b;  
While b<>0 Do  
Begin Du:=a mod b; a:=b:b:=du; End;  
Writeln('UCLN la: ',a,' BCNN la: ',P Div a); Readln;  
End.  
* Phương pháp 3:  
- Ý tưởng:  
+ Ta cho biến i chạy từ 1 đến a, nếu thỏa mãn đồng thời 2 điều kiện (a  
mod i =0) và (b mod i =0) thì i là UCLN của a và b.  
+ Viết ra UCLN, BCNN  
- Chương trình:  
Var a,b,p,d:Integer;  
Begin  
Write('Nhap gia tri a, b tuong uong : ');Readln(a, b);  
P:=a*b;  
For i:=1 To a Do if (a mod i=0) and (b mod i=0) then d:=i  
Writeln('UCLN la: ',d, ‘BCNN la: ',p Div d);  
Readln;  
End.  
* Phương pháp 4:  
- Ý tưởng:  
+ Ta cho biến i chạy downto từ a đến 1, nếu thỏa mãn đồng thời 2 điều kiện (a mod  
i =0) và (b mod i =0) thì i là UCLN của a và b đồng thời kết thúc việc tìm kiếm  
{kết thúc vòng lặp}.  
+ Viết ra UCLN, BCNN  
- Bổ sung kiến thức: Lệnh break  
+ Cú pháp: Break  
+ Hoạt động: Lệnh break hoạt động khi được đặt trong thân các vòng lặp for,  
while, repeat. Khi gặp lệnh break thì máy sẽ thoát khỏi chu trình của vòng lặp,  
nếucó nhiều vòng lặp lồng nhau sẽ thoát vòng lặp trong nhất chứa lệnh break;  
- Chương trình:  
Var a,b,p,d:Integer;  
Begin  
Write('Nhap gia tri a, b tuong uong : '); Readln(a, b);  
P:=a*b;  
For i:=a Downto 1 Do  
if (a mod i=0) and (b mod i=0) then d:=i;  
Writeln('UCLN la: ',d, ‘BCNN la: ',p Div d);  
Readln;  
End.  
=> Nhận xét:  
- Phương pháp 1, 2: Nếu chúng ta cho học sinh thực hiện vòng While .. Do  
hoặc Repeat .. Until để viết chương trình cho hai phương pháp trên thì cơ bản thuật  
toán không thay đổi chỉ khác nhau là sử dụng phương pháp chia liên tiếp hay trừ liên  
tiếp. Tuy nhiên ở đây chúng ta sử dụng While .. Do cho phương pháp 1 và Repeat ..  
Until cho phương pháp 2 với mục đích giúp các em tìm hiểu thêm sự khác nhau  
trong điều kiện lặp kết thúc hai câu lệnh trên, từ đó yêu cầu các em chỉnh sửa câu  
lệnh, thuật toán chia, trừ liên tiếp ngược lại trong hai phương pháp để khắc sâu kiến  
thức hơn.  
- Phương pháp 3, 4: Phương pháp này giúp các em ôn lại 2 nội dung kiến thức,  
một điều kiện ghép trong câu lệnh điều kiện, hai là vòng lặp với số lần biết trước.  
Khi thực hiện vòng lặp dạng tiến For i:=1 To a thì có thể nhiều giá trị thỏa mãn  
nhưng chương trình sẽ nhận được giá trị cuối cùng khi kết thúc lặp, giá trị này là giá  
trị ta cần tìm trong bài toán. Trong phương pháp 4 các em còn tìm hiểu thêm được  
kiến thức mới về câu lệnh Break. Lệnh này thường được áp dụng để tìm giá trị nhỏ  
nhất, lớn nhất thỏa mãn các điều kiện nào đó. dụ Viết chương trình tìm số nguyên  
dương T nhỏ nhất có N chữ số, biết rằng khi chia T cho 19 thì 13 và khi chia T  
cho 31 thì 12.  
2.2.2.3. Rèn luyện kỹ năng lập trình với mảng một chiều.  
Trong quá trình học lập trình, khi học sinh học bài: Kiểu mảng học sinh gặp  
rất nhiều khó khăn với kiểu dữ liệu này. Qua quá trình giảng dạy tôi nhận thấy học  
sinh gặp khó khăn như vậy học sinh khó hình dung ra kiểu dữ liễu mới này, không  
hiểu được cấu trúc lưu trữ kiểu mảng cũng như các cách làm việc với các phần tử  
trong mảng. Để học sinh hiểu lập trình được các bài toán đơn giản, giáo viên phải  
hướng dẫn học sinh các công việc liên quan đến mảng một chiều như: khai báo mảng  
 
một chiều, nhập mảng một chiều gồm các phần tử theo ý muốn, xử mảng một  
chiều đơn giản như: tính tổng các phần tử của mảng, đếm các phần tử của mảng, tìm  
kiếm các phần tử của mảng hay xuất các phần tử của mảng thỏa điều kiện nào đó.  
Từ đó học sinh có thể lập trình giải bài toán sắp xếp dãy số nguyên (tăng dần hoặc  
giảm dần), tìm phần tử lớn nhất (hoặc nhỏ nhất) của dãy số nguyên một cách đơn  
giản.  
Để tạo hứng thú cho học sinh, giúp các em gạt bỏ những khó khăn kể trên thì  
khi dạy phần mảng một chiều giáo viên cần bóc tách riêng từng phần công việc một.  
Chẳng hạn, trước tiên cần phải ghi nhớ cho học sinh việc ghi nhớ đầu tiên đó việc  
khai báo mảng. Khai báo mảng một công việc gần như cố định với tất cả các bài  
toán làm việc với dãy số hay còn gọi mảng một chiều:  
+ Để khai báo ta thực hiện như sau:  
Var <tên biến mảng> : array [kiểu chỉ số] of <kiểu phần tử>;  
+ Sau khi đã khai báo kiểu dữ liệu mảng thì cần hướng dẫn học sinh cụ thể  
công việc nhập các phần tử của mảng:  
Write(‘Nhap so phan tu cua mang n =’); Readln(n);  
For i:= 1 to n do  
Begin  
Write(‘ Phan tu a[’,i,‘]=’); Readln(a[i]);  
End;  
Đây đoạn lệnh thực hiện việc nhập vào từ bàn phím số phần tử của mảng và sau  
đó nhập từng giá trị của mảng.  
+ Việc tiếp sau mà giáo viên yêu cầu học sinh ghi nhớ việc in các phần tử  
của mảng vừa nhập được ra màn hình để học sinh quan sát dãy số vừa nhập qua câu  
lệnh:  
For i := 1 to n do write(a[i]:10);  
Sau khi học sinh đã nắm vững được 3 công việc tạm gọi cố định của việc lập trình  
với mảng một chiều thì giáo viên mới mở rộng một số bài toán liên quan tới mảng  
một chiều theo từng cấp độ từ dễ tới khó để học sinh dần từng bước giải quyết.  
Chẳng hạn một số bài tập liên quan dạng:  
+ In ra các phần tử chẵn của mảng:  
For i:=1 to do If a[i] mod 2 =0 then write(a[i]);  
+ Tính tổng các phần tử của mảng:  
S:=0;  
Tải về để xem bản đầy đủ
docx 24 trang Thùy Anh 04/05/2022 4000
Bạn đang xem 20 trang mẫu của tài liệu "SKKN Rèn luyện tư duy thuật toán trong học lập trình Pascal Tin học 8 tại trường Phổ thông thực hành chất lượng cao Nguyễn Tất Thành", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • docxskkn_ren_luyen_tu_duy_thuat_toan_trong_hoc_lap_trinh_pascal.docx