SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HÓATRƯỜNG THPT TRẦN PHÚ NGA SƠN ---***---SÁNG KIẾN KINH NGHIỆM MỘT SỐ PHƯƠNG PHÁP RÈN LUYỆN TƯ DUY LẬP TRÌNH PASCAL CHO HỌC SINH QUA CÁC DẠNG BÀI TẬP KIỂU X
Trang 1SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HÓA
TRƯỜNG THPT TRẦN PHÚ NGA SƠN
-*** -SÁNG KIẾN KINH NGHIỆM
MỘT SỐ PHƯƠNG PHÁP RÈN LUYỆN TƯ DUY LẬP TRÌNH PASCAL CHO HỌC SINH QUA CÁC DẠNG
BÀI TẬP KIỂU XÂU
Trang 2MỤC LỤC
1 MỞ ĐẦU 2
1.1 LÍ DO CHỌN ĐỀ TÀI 2
1.2 MỤC ĐÍCH NGHIÊN CỨU 3
1.3 ĐỐI TƯỢNG NGHIÊN CỨU 3
1.4 PHƯƠNG PHÁP NGHIÊN CỨU 3
2 NỘI DUNG SÁNG KIẾN KINH NGHIỆM 3
2.1 CƠ SỞ LÝ LUẬN CỦA SÁNG KIẾN KINH NGHIỆM 3
2.2 THỰC TRẠNG CỦA VẤN ĐỀ 3
2.3 CÁC GIẢI PHÁP ĐÃ SỬ DỤNG ĐỂ GIẢI QUYẾT VẤN ĐỀ 4
2.3.1 Chính xác hóa nhận thức của học sinh về “Kiểu xâu” 4
2.3.2 Khắc phục sai lầm của học sinh trong lập trình kiểu xâu 7
2.3.3 Rèn luyện kỹ năng cho học sinh qua một số bài tập đặc trưng 8
2.4 HIỆU QUẢ CỦA SÁNG KIẾN KINH NGHIỆM 18
3 KẾT LUẬN VÀ KIẾN NGHỊ 19
Trang 31 MỞ ĐẦU1.1 LÍ DO CHỌN ĐỀ TÀI
Cùng với quá trình Tin học hóa trên nhiều lĩnh vực hoạt động của xã hội loàingười và đem lại nhiều hiệu quả to lớn thì việc đưa bộ môn Tin học vào giảng dạytrong các trường trung học phổ thông cũng được đẩy mạnh và không kém tầm quantrọng Môn Tin học đã được đưa vào giảng dạy ở trường phổ thông như những mônhọc khác bắt đầu từ năm 2006-2007
Nhận thức được tầm quan trọng, sự ảnh hưởng to lớn của bộ môn Tin học nóiriêng và của lĩnh vực công nghệ thông tin nói chung đối với các lĩnh vực khác cũngnhư sự phát triển của xã hội Tôi nghĩ bản thân là một giáo viên dạy môn Tin họcphải có trách nhiệm làm sao cho học sinh hiểu và yêu thích bộ môn này, tạo cho họcsinh sự hứng khởi, niềm đam mê học hỏi, sáng tạo để phát triển ngành Tin học ngàycàng cao hơn, xa hơn, mang lại nhiều ứng dụng thiết thực
Trong quá trình giảng dạy, tôi nghĩ không phải cứ tìm được nhiều bài toánkhó, bài toán hay để giảng dạy cho học sinh Mà vấn đề đặt ra là chúng ta cần phảitích cực tìm tòi, sáng tạo trong việc đưa ra cách giải quyết những bài toán đó đểgiúp cho học sinh có sự hứng thú, tìm tòi sáng tạo trong quá trình giải quyết họctập, từ đó biết vận dụng linh hoạt trong các tình huống cụ thể ngoài thực tế
Để thực hiện được điều đó, theo tôi chúng ta cần phải tìm tòi, nghiên cứu tìm
ra những bài toán phù hợp, kích thích được sự độc lập, tích cực của học sinh tronghọc tập Trên cơ sở đó, học sinh có thể tự mình tìm ra được những ý tưởng sáng tạovận dụng thiết thực vào cuộc sống thực tế khi nhu cầu nảy sinh, khi đó các em cóthể tự mình hoàn thành được ý tưởng đó
Trong các vấn đề về Tin học được đưa vào giảng dạy ở chương trình bậc họcphổ thông hiện nay Khi nói đến vấn đề dạy học lập trình pascal cho học sinh, cáckiểu dữ liệu chuẩn không đủ biểu diễn dữ liệu của các bài toán trong thực tế Cácngôn ngữ lập trình có quy tắc, cách thức cho phép người lập trình xây dựng nhữngkiểu dữ liệu phức tạp từ những kiểu đã có Một trong số đó là kiểu xâu là kiểu dữliệu có cấu trúc, dữ liệu kiểu phi số - dạng kí tự; Là kiểu dữ liệu không kém phầnquan trọng trong lập trình Pascal
Vấn đề đặt ra là: Dạy học sinh kiểu xâu như thế nào để đạt hiệu quả? Đó
chính là lí do tôi quyết định chọn đề tài: “Một số phương pháp rèn luyện tư duy
lập trình Pascal cho học sinh qua các dạng bài tập kiểu xâu”.
Trang 41.2 MỤC ĐÍCH NGHIÊN CỨU
- Giúp học sinh có cái nhìn đúng đắn hơn về lập trình và tự tin hơn, chủ độnghơn khi giải các bài tập kiểu xâu một cách hiệu quả để hoàn thành chương trình mộtcách tốt nhất
1.3 ĐỐI TƯỢNG NGHIÊN CỨU
- Học sinh khối 11 Trường THPT Trần Phú và đặc biệt là các đối tượng họcsinh ôn luyện học sinh giỏi
1.4 PHƯƠNG PHÁP NGHIÊN CỨU
- Thực tiễn giảng dạy học sinh khối 11;
- Tham khảo SGK, SGV Tin học 11 và tài liệu về ngôn ngữ lập trình Pascal;
2 NỘI DUNG SÁNG KIẾN KINH NGHIỆM2.1 CƠ SỞ LÝ LUẬN CỦA SÁNG KIẾN KINH NGHIỆM
Bản thân là một giáo viên giảng dạy môn Tin học tại trường THPT Trần Phú,Với chất lượng học sinh đầu vào thấp, khi dạy học sinh về lập trình Pascal, đặc biệt
là các bài toán “Kiểu xâu”, nếu chỉ truyền thụ kiến thức một cách đơn thuần thìphần đông các em sẽ không nắm rõ kiến thức cơ bản về “Kiểu xâu”, cách sử dụngkiểu xâu và nhất là khả năng vận dụng linh hoạt các bài toán “Kiểu xâu” vào thựctiễn Đa số các em chỉ hiểu một cách thụ động và không có tính tư duy, sáng tạotrong việc xây dựng và hình thành thuật toán cho từng bài toán cụ thể dẫn đếnnhững sai lầm trong lập trình Khi trình bày vấn đề này cho học sinh, tôi đã thựchiện như sau:
Trước hết, tôi nhắc lại một số điểm quan trọng trong kiểu xâu; sau đó chỉ ranhững sai lầm mà các em hay mắc phải trong một số dạng bài tập Đồng thời đưa racách khắc phục những sai lầm đó Chỉ ra các cách tiếp cận khác nhau đối với từngbài toán cụ thể để nâng cao khả năng tư duy cho các em Sau cùng cho các em một
số bài tập tự rèn luyện kỹ năng Đặc biệt, là các bài toán “Kiểu xâu” ứng dụng đểgiải quyết các vấn đề trong thực tiễn Làm như vậy tôi thấy có hiệu quả Học sinhhiểu rõ được về bản chất của từng bài toán cụ thể, các em dễ dàng tiếp cận đượcnhững yêu cầu khó khăn hơn trong các bài toán khác nhau Đó chính là những căn
cứ để tôi viết đề tài này
2.2 THỰC TRẠNG CỦA VẤN ĐỀ
Thực tế vẫn còn số đông giáo viên chưa từ bỏ được kiểu dạy học truyềnthống đó là giáo viên chỉ biết say sưa truyền thụ kiến thức, còn học sinh thì tiếp thubài học một cách rất thụ động, mô tuýp Và phần lớn học sinh vẫn theo lối mòn từxưa chờ đợi vào kiến thức sẵn có mà giáo viên đưa ra để từ đó sử dụng làm bài tậpnhư một công thức Hầu hết các em không biết vận dụng linh hoạt các kiến thứctổng hợp để giải quyết các bài toán một cách chủ động, sáng tạo
Trang 5Đứng trước thực trạng như vậy, tôi thiết nghĩ phải làm thế nào để trong việcgiảng dạy cho học sinh, ngoài việc giúp học sinh lĩnh hội những kiến thức cơ bản,người thầy còn phải biết kích thích tính tích cực, sự sáng tạo say mê học hỏi củahọc sinh trong việc học tập, đòi hỏi học sinh phải có ý thức về những mục tiêu đặt
ra và tạo được động lực bên trong thúc đẩy bản thân họ hoạt động để đạt các mụctiêu đó
Trên cơ sở những kiến thức mà học sinh được học về lập trình để viếtchương trình bằng ngôn ngữ lập trình Pascal, học sinh có thể chủ động vận dụngkiến thức về “Kiểu xâu” để giải quyết bài toán trong thực tế Bởi vì, ngôn ngữPascal có tính cấu trúc mạnh, có cơ sở và nó đòi hỏi chương trình phải chặt chẽ,logic Đặc biệt, khi được trang bị kiến thức vững vàng học sinh có thể có kỹ năngviết chương trình tốt hơn, nhìn nhận vấn đề một cách sáng sủa hơn, chặt chẽ hơn vànhất là xây dựng được thuật toán tối ưu có thể giúp cho các em hoàn thành nhữngchương trình lớn hơn vượt ra những bài toán bình thường mà nội bộ môn học đòihỏi Chính vì vậy, bản thân tôi cần phải nỗ lực tìm tòi, sáng tạo giúp cho học sinhnhìn nhận vấn đề một cách tích cực hơn, sáng tạo hơn và nhất là giúp cho các em cóthể yêu thích nhiều hơn nữa ngôn ngữ lập trình Pascal thông qua các bài toán cụ thể
2.3 CÁC GIẢI PHÁP ĐÃ SỬ DỤNG ĐỂ GIẢI QUYẾT VẤN ĐỀ
Bằng những kiến thức về Tin học và những kinh nghiệm của bản thân trongcông tác giảng dạy bộ môn Tin học, để phát triển khả năng tư duy sáng tạo cho họcsinh trong quá trình viết chương trình tôi đã sử dụng phương pháp gợi động cơ kíchthích tính tích cực, khả năng tư duy, sự sáng tạo, say mê, tìm tòi, học hỏi của họcsinh qua cách giảng dạy thực tiễn về “Kiểu xâu”, được trình bày qua các giải phápdưới đây:
- Chính xác hóa nhận thức của học sinh về “Kiểu xâu”;
- Khắc phục sai lầm của học sinh trong lập trình kiểu xâu;
-Rèn luyện kỹ năng cho học sinh qua một số bài tập đặc trưng;
Để thực hiện được ý tưởng đã nêu trong đề tài, tôi đã áp dụng các giải pháptrên chủ yếu vào giảng dạy học sinh khối 11 và làm nền tảng ôn luyện học sinh giỏi.Tôi đã đưa ra các ví dụ từ dễ đến khó, từ đơn giản đến phức tạp tương ứng với từnggiải pháp và hướng dẫn học sinh xác định được trọng tâm bài toán Sau đó tôi cùngvới học sinh hoàn thiện bằng cách gợi ý và chỉ ra những vấn đề nảy sinh cụ thểtrong yêu cầu của bài toán Tôi đã tổ chức thực hiện các giải pháp như sau:
2.3.1 Chính xác hóa nhận thức của học sinh về “Kiểu xâu”
2.3.1.1 Có thể xem xâu là mảng một chiều mà mỗi phần tử là một kí tự Các kí
tự của xâu được đánh số thứ tự, thường bắt đầu từ 1;
Xét ví dụ: Cho khai báo sau:
Type Hoten = String[30];
Trang 6b Name là………… có tối đa………… kí tự.
c Line là……….có tối đa………… kí tự.
d St là……….có tối đa………… kí tự.
Nếu chỉ dạy như sách giáo khoa đã trình bày trong phần khai báo biến xâu.Sách giáo khoa chỉ đưa ra một cách khai báo trực tiếp Mặc dù, ta vẫn hiểu “xâu làmảng một chiều”, và cách khai báo biến kiểu xâu cũng tương tự kiểu mảng có haicách: khai báo trực tiếp và khai báo gián tiếp Nhưng sách giáo khoa đã không trìnhbày lại, nếu giáo viên không chú ý mà cứ trình bày như sách giáo khoa thì vô hìnhdung học sinh sẽ không biết cách khai báo gián tiếp đối với kiểu xâu Như vậy, vớimột bài toán tưởng như đơn giản nhưng học sinh lại rất lúng túng khi xác địnhthành phần trong khai báo nêu trong ví dụ 1 trên đây Vậy nên, trong khi dạy cáchkhai báo biến xâu, tôi vẫn trình bày rõ hai cách khai báo cho học sinh
Cách 1 Khai báo trực tiếp biến xâu:
Var <tên biến xâu>: string[độ dài lớn nhất của xâu];
Var <tên biến xâu>: string; {Khi đó độ dài lớn nhất của xâu sẽ nhận giá trịngầm định là 255}
Ví dụ: Var hoten : string[26];
Var chugiai: string;
Cách 2 Khai báo gián tiếp biến xâu qua kiểu xâu:
Type <tên kiểu xâu> = string[độ dài lớn nhất của xâu];
Var <tên biến xâu>: <tên kiểu xâu>;
Ví dụ: Type Hoten = String[30];
Var name: Hoten;
Như vậy, học sinh có thể nắm rõ cách khai báo biến xâu, giải quyết ví dụ 1một cách dễ dàng
a Hoten và St80 là các kiểu xâu kí tự.
b Name là biến kiểu xâu kí tự;có tối đa 30 kí tự.
c Line là biến kiểu xâu kí tự ;có tối đa 80 kí tự.
d St là biến kiểu xâu kí tự; có tối đa 255 kí tự.
2.3.1.2 Tuy có thể hình dung xâu như mảng một chiều nhưng kiểu mảng một
chiều với phần tử thuộc kiểu char khác với kiểu xâu (khai báo bằng từ khóa
string).
* Điểm giống và khác nhau cơ bản giữa mảng 1 chiều và xâu:
- Giống nhau: Cùng là kiểu dữ liệu có cấu trúc, có thể truy cập vào từng phần tử
riêng biệt
- Khác nhau:
Trang 7+ Xâu vừa là kiểu dữ liệu có cấu trúc vừa là kiểu dữ liệu vô hướng, vì vậy có thểtruy cập vào toàn bộ xâu như một dữ liệu đơn;
Ví dụ: - Length(s), pos(s1,s2) cho kết quả là số nguyên không âm.
- Copy (s,vt,n) cho kết quả là một xâu.
- Upcase(c) cho kết quả là một kí tự, chú ý c phải là một phần tử của xâu
hay một kí tự
* Một số thủ tục và hàm chuẩn dùng để xử lí xâu
Ngoài các hàm và thủ tục chuẩn đã được trình bày trong sách giáo khoa, tôicung cấp thêm cho học sinh một số hàm và tục nữa để học sinh có thể áp dụnggiải các bài toán kiểu xâu tốt hơn Nhất là các đối tượng ôn luyện học sinhgiỏi
- Thủ tục STR(N,st): Thủ tục này thực hiện việc chuyển đổi giá trị số N thànhkiểu xâu và đưa kết quả vào biến st
Ví dụ:
‘1500’ val(st,N,code) Code=0, N=1500
’14.2A+02’ val(st,N,code) Code=5
- Hàm CONCAT(s1,s2,…,sn): trả về xâu thu được từ việc ghép các xâu s1,s2,
…,sn
Ví dụ:
concat(‘Toi’, ‘hoc’, ‘bai’) ‘Toi hoc bai’
- Hàm CHR(X): Cho kí tự có mã X trong bảng mã ASCII
Ví dụ: chr(65)= ‘A’; chr(97)= ‘a’
Trang 8- Hàm ORD(ch): cho mã của kí tự ch trong bảng mã ASCII.
Ví dụ: ord(‘A’) = 65; ord(‘a’) = 97
2.3.1.4 Xâu được tạo thành bởi các kí tự, trong đó có thể có dấu cách Dấu cách thể hiện trong các văn bản là phần trống ngăn cách giữa hai từ viết liên tiếp;
2.3.1.5 Khi sử dụng lệnh gán, ta có thể gán trị là một xâu kí tự cho một biến xâu kí tự nhưng việc gán trị là một xâu kí tự cho một biến kiểu kí tự là không hợp lệ dù xâu đó có độ dài bằng 1;
2.3.1.6 Tham số của các hàm và thủ tục chuẩn phải hợp lí,.
Chẳng hạn không thể dùng insert(s1,s2,10) khi length(s2)<10.[1].
2.3.2 Khắc phục sai lầm của học sinh trong lập trình kiểu xâu
Xét bài toán: Nhập vào từ bàn phím một xâu Thay thế tất cả các cụm kí tự
‘anh’ bằng cụm kí tự ‘em’ (Bài 3.sách giáo khoa trang 73 Tin học 11).[2].
Tôi thấy rằng một số học sinh đã có tư duy như sau:
Duyệt các kí tự của xâu, cho đến khi gặp kí tự ‘anh’ thì thay thế bằng kí tự ’em’ Dẫn đến chương trình được viết là:
for i:=1 to length(s) do
if (s[i]='a') and (s[i+1]='n')and(s[i+2]='h') then
Như vậy, cách tư duy này không đúng vì kí tự ‘h’ đã không bị loại bỏ, mặc
dù từ ‘anh’ đã được thay thế thành từ ‘em’ nhưng chữ h đã không bị xóa đi trongxâu Mà theo yêu cầu của đề bài là phải xóa cả chữ ‘anh’ đi Tuy nhiên đây là tưduy của học sinh khi mới học về xâu, đó là tư duy hết sức bình thường Nhưngchúng ta cũng cần định hướng đúng đắn để học sinh không tư duy lệch lạc
*Tôi đã chỉ ra lỗi sai đồng thời khắc phục lỗi đó như sau:
Trang 9Trước hết tìm vị trí xâu con ‘anh’ trong xâu s đã cho, xóa xâu con này đi rồichèn xâu ‘em’ vào vị trí đó Lặp đi lặp lại điều này cho đến khi không tìm thấy xâu
‘anh’ cần thay thế trong xâu s nữa
Tôi đã gợi mở cho học sinh bằng cách đặt câu hỏi: Với các hàm và thủ tụcchuẩn đã biết khi học về kiểu xâu, liệu có tìm được vị trí xuất hiện một xâu con,thực hiện xóa một xâu con, chèn một xâu con hay không? Câu hỏi này sẽ gợi chohọc sinh nhớ lại và vận dụng hàm pos, các thủ tục chuẩn delete, insert
Tôi đã xây dựng một dàn ý chương trình như sau:
{Phần khai báo};
Begin
{Nhập vào xâu s};
{Chừng nào còn tìm thấy xâu con ‘anh’ trong xâu s còn làm ba việc sau:
- Tìm vị trí bắt đầu của xâu ‘anh’;
- Xóa xâu ‘anh’ vừa tìm thấy;
- Chèn xâu ‘em’ vào xâu s tại vị trí trước đây xuất hiện xâu ‘anh’};
- {in kết quả xâu s};
2.3.3 Rèn luyện kỹ năng cho học sinh qua một số bài tập đặc trưng
2.3.3.1 Bài toán kiểm tra tính đối xứng của một xâu
Bài 1 Nhập vào từ bàn phím một xâu Kiểm tra xâu đó có phải là xâu đốixứng hay không Xâu đối xứng có tính chất: đọc nó từ phải sang trái cũng thu đượckết quả giống như đọc từ trái sang phải(còn được gọi là xâu palindrome) (Bài 1sách giáo khoa Tin học 11 trang 73).[2]
Trang 10Với bài toán này, trước tiên tôi giới thiệu một vài xâu đối xứng và xâu khôngđối xứng cho học sinh Xâu đối xứng: 12321; RADAR Xâu không đối xứng:12345; TOMATO…
Khi làm việc với chương trình có sẵn trong sách giáo khoa, học sinh dễ dàngtiếp cận hơn Hơn nữa các em cũng đã được làm quen với cách tạo xâu mới từ mộtxâu ban đầu trong hai ví dụ đã được trình bày trong tiết lý thuyết về kiểu xâu.Chương trình này linh hoạt duyệt xâu ban đầu theo thứ tự ngược lại (từ cuối xâuquay ngược về đầu xâu) nên tạo được xâu đảo ngược của xâu ban đầu và giải quyếtđược bài toán đặt ra (kiểm tra xâu có đối xứng hay không)
Với yêu cầu viết lại chương trình không dùng biến xâu p, tôi đã gợi ý cho họcsinh khai thác khả năng tham chiếu đến từng kí tự trong xâu thông qua vị trí của kí
tự này Sau đó chỉ cần so sánh các cặp kí tự ở vị trí đối xứng nhau để kết luận xâu
đó có là palindrome hay không Chỉ cần phát hiện được một cặp kí tự ở vị trí đốixứng nhau nhưng khác nhau là đủ kết luận xâu đó không là palindrome Có hai cách
để học sinh có thể tư duy:
- Cách thứ nhất là dựa trên tư duy phản chứng:
Giả sử như lúc đầu xâu đó là xâu đối xứng, nếu có một tính chất nào đó khiến xâu
đó không là xâu đối xứng, thì giả sử sẽ sai và ta kết thúc việc kiểm tra Còn khôngthì xâu đó vẫn là xâu đối xứng Tôi đã xây dựng dàn ý như sau:
{Phần khai báo};
Begin
{Nhập vào xâu s};
{Xác định độ dài của xâu};
{Khởi tạo kt, tạm coi xâu s vừa nhập là palindrome};