SKKN Một số dạng bài tập kiểu xâu dành cho đối tượng học sinh khối 11 trường THPT Lê Lai

SKKN Một số dạng bài tập kiểu xâu dành cho đối tượng học sinh khối 11 trường THPT Lê Lai

Trong chương trình dạy Tin học ở bậc THPT, đặc biệt là chương trình Tin học khối 11 rất khó cho Thầy Cô giáo cũng như học sinh, vì phải làm thế nào để học sinh có thể hiểu được ngôn ngữ lập trình, để từ đó có thể lựa chọn và thiết kế thuật toán. Đối với học sinh thì phải làm quen với lối suy nghĩ logic với sự hoạt động của máy tính, mà đây lại là một lối suy nghĩ hoàn toàn khác với các môn học khác.

Bộ môn Tin học đã từng được rất ít học sinh Lê Lai quan tâm, yêu thích vì nó không thuộc tổ hợp môn thi ĐH nào. Nhất là Tin học lớp 11, một nội dung kiến thức cần rất nhiều sự tư duy sâu và khả năng sáng tạo. Nhưng sau gần hai năm được điều động lên trường THPT Lê Lai, tôi tự hào rằng đã khích lệ được đại đa số học sinh có hứng thú học tập với bộ môn Tin học. Thu hút học sinh khối 11 có nhu cầu tìm hiểu sâu hơn các dạng bài tập của Tin học 11. Tôi đã xâu chuỗi được một vài dạng bài tập liên quan đến các nội dung để hướng dẫn cho nhóm học sinh khá này tìm hiểu và giải quyết như: Bài tập về sử dụng vòng lặp, Bài tập về kiểu mảng, bài tập với dãy số, bài tập về kiểu xâu

Khi hướng dẫn các em học sinh tìm hiểu sâu hơn về dữ liệu kiểu xâu, tôi nhận thấý các em có sự hứng thú đặc biệt hơn nhất. Các em đã dành rất nhiều thời gian để trăn trở cách giải quyết cho mỗi bài toán mà cô đưa ra. Khi bài toán được giải quyết xong, các em lại bừng lên ham muốn giải quyết các bài toán khác nữa. Điều đó chính là động lực để tôi yêu nghề hơn, yêu học sinh hơn.

Với sáng kiến kinh nghiệm “MỘT SỐ DẠNG BÀI TẬP KIỂU XÂU DÀNH CHO ĐỐI TƯỢNG HỌC SINH KHỐI 11 _TRƯỜNG THPT LÊ LAI” tôi muốn gửi tới các bạn đồng nghiệp một chút kinh nghiệm của bản thân về việc hệ thống lại các dạng bài tập kiểu xâu dành cho học sinh thực sự yêu thích lập trình.

 

doc 20 trang thuychi01 6634
Bạn đang xem tài liệu "SKKN Một số dạng bài tập kiểu xâu dành cho đối tượng học sinh khối 11 trường THPT Lê Lai", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
MỤC LỤC
1. PHẦN MỞ ĐẦU
1.1. LÝ DO CHỌN ĐỀ TÀI
Trong chương trình dạy Tin học ở bậc THPT, đặc biệt là chương trình Tin học khối 11 rất khó cho Thầy Cô giáo cũng như học sinh, vì phải làm thế nào để học sinh có thể hiểu được ngôn ngữ lập trình, để từ đó có thể lựa chọn và thiết kế thuật toán. Đối với học sinh thì phải làm quen với lối suy nghĩ logic với sự hoạt động của máy tính, mà đây lại là một lối suy nghĩ hoàn toàn khác với các môn học khác.
Bộ môn Tin học đã từng được rất ít học sinh Lê Lai quan tâm, yêu thích vì nó không thuộc tổ hợp môn thi ĐH nào. Nhất là Tin học lớp 11, một nội dung kiến thức cần rất nhiều sự tư duy sâu và khả năng sáng tạo. Nhưng sau gần hai năm được điều động lên trường THPT Lê Lai, tôi tự hào rằng đã khích lệ được đại đa số học sinh có hứng thú học tập với bộ môn Tin học. Thu hút học sinh khối 11 có nhu cầu tìm hiểu sâu hơn các dạng bài tập của Tin học 11. Tôi đã xâu chuỗi được một vài dạng bài tập liên quan đến các nội dung để hướng dẫn cho nhóm học sinh khá này tìm hiểu và giải quyết như: Bài tập về sử dụng vòng lặp, Bài tập về kiểu mảng, bài tập với dãy số, bài tập về kiểu xâu
Khi hướng dẫn các em học sinh tìm hiểu sâu hơn về dữ liệu kiểu xâu, tôi nhận thấý các em có sự hứng thú đặc biệt hơn nhất. Các em đã dành rất nhiều thời gian để trăn trở cách giải quyết cho mỗi bài toán mà cô đưa ra. Khi bài toán được giải quyết xong, các em lại bừng lên ham muốn giải quyết các bài toán khác nữa. Điều đó chính là động lực để tôi yêu nghề hơn, yêu học sinh hơn.
Với sáng kiến kinh nghiệm “MỘT SỐ DẠNG BÀI TẬP KIỂU XÂU DÀNH CHO ĐỐI TƯỢNG HỌC SINH KHỐI 11 _TRƯỜNG THPT LÊ LAI” tôi muốn gửi tới các bạn đồng nghiệp một chút kinh nghiệm của bản thân về việc hệ thống lại các dạng bài tập kiểu xâu dành cho học sinh thực sự yêu thích lập trình.
1.2. MỤC ĐÍCH NGHIÊN CỨU 
- Giới thiệu một số phép toán trên kiểu dữ liệu xâu, đặc biệt phần này có cung cấp thêm một số hàm, thủ tục chưa được giới thiệu trong bài 12 sách giáo khoa tin học 11, đồng thời đưa ra một số ví dụ tương ứng để học sinh dễ dàng vận dụng. 
- Hệ thống các bài toán dưới dạng một số dạng bài tập thường gặp giúp cho giáo viên và học sinh phần nào nhận dạng và giải một số bài tập liên quan. 
- Nâng cao chất lượng dạy và học môn Tin học trong trường phổ thông, đặc biệt là dạy học lập trình ở Tin học lớp 11.
- Góp phần đổi mới phương pháp dạy học trong trường phổ thông nói chung và môn Tin học nói riêng.
- Góp phần khơi dậy lòng đam mê, yêu thích và hứng thú khi học môn Tin học của học sinh. Đặc biệt là định hướng nghề nghiệp cho đối tượng học sinh có lòng đam mê Tin học thực sự. Giúp các em nhìn thấy và vận dụng được những kiến thức đã học ở các môn học vào tư duy giải quyết các bài toán thực tế, gần gũi, thiết thực trong môi trường học tập của bản thân.
1.3. ĐỐI TƯỢNG VÀ PHẠM VI NGHIÊN CỨU
- Học sinh khối 11 trường THPT Lê Lai năm học 2017-2018
- Học sinh khối 11 trường THPT Lê Lai năm học 2018-2019
- Sử dụng ngôn ngữ lập trình Turbo Pascal và Free Pascal để tiến hành lập trình các bài tập thực nghiệm.
- Hình thành được kỹ năng thực hành giải các bài tập cho học sinh và có được một hệ thống kiến thức với các bài tập về kiểu dữ liệu xâu. Phạm vi thực hiện trên kiểu dữ liệu xâu 
1.4. PHƯƠNG PHÁP NGHIÊN CỨU
- Dựa trên những bài toán thực tiễn của cuộc sống được giải quyết bằng ngôn ngữ lập trình Pascal. Nhất là các bài toán vận dụng lập trình có cấu trúc kiểu xâu.
- Dựa trên cơ sở lý thuyết của Ngôn ngữ lập trình Pascal. Cách khai báo và truy xuất đến kiểu dữ liệu xâu. Sự hoạt động tuần tự từng bước của máy tính khi thực hiện chương trình.
- Thu thập dữ liệu thông qua việc hỏi học sinh về mức độ biết, hiểu và vận dụng ngôn ngữ lập trình Pascal vào giải các bài toán trong các môn học khác.
- Phân tích đánh giá mức độ học sinh hứng thú với môn học. 
- Tổng kết rút kinh nghiệm
2. PHẦN NỘI DUNG
2.1. CƠ SỞ LÝ LUẬN
Tạo hứng thú cho người học luôn là một vấn đề quan trọng trong hoạt động dạy - học. Bởi vì, như chúng ta biết, dạy - học là một hoạt động phức tạp, trong đó chất lượng, hiệu quả cơ bản phụ thuộc vào người học. Và điều này lại phụ thuộc vào nhiều yếu tố, như: năng lực nhận thức, động cơ học tập, sự quyết tâm...; nó còn phụ thuộc vào: môi trường học tập, người tổ chức quá trình dạy học, sự hứng thú trong học tập.
 	Các nhà nghiên cứu tâm lý học cho rằng, hứng thú là thái độ đặc biệt của cá nhân đối với đối tượng nào đó, nó có ý nghĩa đối với cuộc sống và có khả năng mang lại khoái cảm cá nhân trong quá trình hoạt động. Sự hứng thú biểu hiện trước hết ở sự tập trung chú ý cao độ, sự say mê của chủ thể hoạt động. Sự hứng thú gắn liền với tình cảm con người. Trong bất cứ công việc gì, nếu có hứng thú làm việc, con người sẽ có cảm giác dễ chịu với hoạt động, làm nẩy sinh khát vọng hành động một cách có sáng tạo. Ngược lại, nếu không có hứng thú, dù là hoạt động gì cũng sẽ không đem lại hiệu quả cao. Đối với các hoạt động nhận thức, sáng tạo, hoạt động học tập, khi không có hứng thú, kết quả sẽ không là gì hết, thậm chí xuất hiện cảm xúc tiêu cực. [4]
Việc học có tính chất đối phó, miễn cưỡng, người học may lắm chỉ tiếp thu được một lượng kiến thức rất ít, không sâu, không bản chất. Vì thế dễ quên. 
Khi có hứng thú, say mê trong nghiên cứu, học tập thì thì việc lĩnh hội tri thức trở nên dễ dàng hơn; ngược lại, khi nắm bắt được vấn đề, tức là hiểu được bài thì người học lại có thêm hứng thú. Trên thực tế, những người không thích, không hứng thú khi học môn học nào đó thường là những người không học tốt môn học đó. Chính vì vậy, việc tạo hứng thú cho người học được xem là yêu cầu bắt buộc đối với bất cứ ai làm công tác giảng dạy, đối với bất cứ bộ môn khoa học nào. 
2.2. THỰC TRẠNG VẤN ĐỀ
Đặc điểm môn
Môn Tin học đến nay không còn là môn học mới mẻ đối với học sinh phổ thông, bởi học sinh đã được làm quen nó ngay ở các cấp học dưới. Đây là một thuận lợi cho học sinh, học sinh không phải học từ đầu để làm quen với môn học.
 Trong mục 2.1: Đoạn “các nhà nghiên cứu..cảm xúc tiêu cực” được trích dẫn trong TLTK số 4 	Sự liên quan của môn Tin học với các môn học khác là nhiều, vì vậy học sinh sẽ phải vất vả để xem lại, tìm kiếm lại tri thức ở các môn học khác. Đặc biệt nội dung lập trình trong môn học Tin học lại có liên quan rất nhiều đến kiến thức các môn khoa học tự nhiên, liên quan nhiều đến tư duy Toán học. Nếu học sinh yếu tư duy về Toán học thì sẽ rất là khó khăn khi lập trình. Nếu học sinh có tư duy Toán học nhưng không hứng thú với môn Tin học, học cho biết, học để đối phó, thì thường các em sẽ không nghiên cứu kĩ bài học dẫn đến sẽ gặp phải một số khó khăn trong lập trình. Nếu học sinh yếu tư duy và không hứng thú với môn học thì sẽ rất khó cho các thầy cô. Muốn giải quyết được việc này thì giáo viên cần phải dẫn dắt học sinh tiếp cận với môn học một cách tự nhiên, hào hứng thông qua những dạng bài tập thực tiễn liên quan đến các vấn đề mà các em yêu thích. 
Giáo viên
Nhiều giáo viên còn hạn chế về trình độ, khả năng cập nhật thông tin. Không chỉ vậy, một số giáo viên chưa hiểu rõ thuật toán để diễn đạt trong việc dạy lập trình. Đôi khi giáo viên còn thờ ơ, luôn cảm thấy chán nản khi học sinh của mình không có hứng thú học tập. Chính điều này đã làm cho giáo viên không chú trọng việc đổi mới phương pháp. Dẫn đến học sinh mất đi khả năng tìm hiểu và tư duy giải quyết bài toán, hứng thú trong việc học lập trình. Chưa kể, môn Tin học không thuộc nhóm các môn tổ hợp thi THPT Quốc gia, nên ngoài bồi dưỡng cho học sinh tham gia đội tuyển học sinh giỏi thì không chú trọng bồi dưỡng cho các đối tượng học sinh khác. Giáo viên cần phải biết nhóm đối tượng học sinh khá là nguồn nhân lực dồi dào cho ngành CNTT, là nhóm đối tượng cần được giáo viên THPT truyền lửa, truyền đam mê nhiều nhất.
Học sinh
Khi bước vào học phổ thông thì học sinh đã bắt đầu định hình học theo khối để thi đại học. Thời gian học chủ yếu dành cho các môn học chính như Toán, Lý, Hóa, Văn, Anh. Tin học là một môn phụ nên thời gian để học chỉ là những tiết học ở trên lớp. Đối với Tin học 10, 12 thì tính ứng dụng của môn học trong thực tế các em dễ dàng nhìn thấy và thực hiện được luôn. Còn với Tin học 11 thuộc về lĩnh vực lập trình, khó có sản phẩm để các em nhìn thấy. Hơn thế việc tư duy thuật toán cũng là một nội dung khó đối với các em. Điều này dẫn đến rất nhiều học sinh không thích và học kém môn học này. 
Từ thực tế trên tôi muốn minh chứng thật rõ nét cho các em thấy giải bài toán trên máy tính không hề khó, có chăng là sự đam mê, tích cực chủ động của các em mà thôi. Đặc biệt học sinh sẽ nhận ra việc học Tin học lập trình không quá khó và yêu thích môn học.
Lập trình có cấu trúc_kiểu xâu
	Qua việc giảng dạy học sinh học lập trình lớp 11, tôi nhận thấy học sinh còn nhiều bỡ ngỡ khi tiếp cận với lập trình có cấu trúc cũng như kiểu dữ liệu xâu. Với các thao tác duyệt xâu và các thao tác kiểm tra tính chất phần tử của xâu cần phải sử dụng cấu trúc lặp học sinh thường gặp nhiều khó khăn:
+ Sử dụng các biến điều khiển.
+ Tác động đến biến điều khiển ngay trong vòng lặp.
+ Thông báo kết quả trong vòng lặp dẫn đến tình trạng lặp lại việc thông báo kết quả khi thực hiện chương trình.
2.3. Một số dạng bài tập kiểu xâu dành cho đối tượng học sinh khá khối 11
Để xử lý các chuỗi văn bản, Pascal đưa ra một kiểu dữ liệu mới gọi là xâu ký tự (định nghĩa bằng từ khóa String). Tuy nhiên độ dài của String tối đa chỉ 255 mà thực tế thì ta thường gặp xâu có độ dài rất lớn, vậy có cách nào để có thể khắc phục được điều đó, nhiệm vụ của giáo viên phải giới thiệu thêm cho nhóm học sinh khá một số nội dung liên quan đến kiểu dữ liệu xâu.
Để hướng dẫn học sinh khá giải quyết các dạng bài tập lên quan đến kiểu xâu thì giáo viên hướng dẫn các em hệ thống lại các kiến thức cơ bản về dữ liệu kiểu xâu [1] như: 
Khái niệm, tham chiếu đến phần tử xâu
- Khái niệm: Xâu là dãy các kí tự thuộc bảng mã ASCII, mỗi kí tự được gọi là một phần tử của xâu. Số lượng kí tự trong một xâu được gọi là độ dài của xâu. Xâu có độ dài bằng 0 được gọi là xâu rỗng. Trong Turbo Pascal xâu rỗng được viết bởi hai dấu nháy đơn liền nhau ‘và’.
- Tham chiếu đến phần tử xâu: [chỉ số phần tử]
VD: s[1]=’T’, s[4]=’T’, s[6]=’L’. Lưu ý: - Kiểu xâu khác với kiểu char.
Khai báo: Var : string[độ dài lớn nhất của xâu];
- Nếu không khai báo độ dài lớn nhất của xâu thì xâu sẽ nhận giá trị ngầm định là 255. 
Trong mục 2.3: Các kiến thức cơ bản được trích dẫn trong TLTK số 1Xâu ký tự trong bộ nhớ chiếm số byte bằng số ký tự cực đại được khai báo cộng với byte đầu tiên chứa số ký tự hiện có của xâu.
- Ngoài ra có các kiểu khai báo khác của xâu như:
	+ Shortstring: Chính là String
	+ longstring: là mảng ký tự có kiểu char. Thông thường kiểu char có kích thước 16 bit nên mảng có kích thước tối đa 16 bit = 65535 ký tự
	+ ansistring (chỉ trong free pascal)có kích thước gần 2GB = 230 B 
Cách nhập/xuất: Cách đọc hay viết kiểu xâu tương tự như các kiểu dữ liệu khác, ta sử dụng các thủ tục READ, hoặc WRITE.
	Phép ghép xâu (phép cộng xâu): kí hiệu là dấu cộng (+), dùng để ghép nhiều xâu thành một.
Các phép so sánh =, >, có thứ tự thực hiện ưu tiên thấp hơn phép ghép xâu và thực hiện việc so sánh hai xâu theo các quy tắc sau:
- Xâu A > xâu B nếu kí tự đầu tiên khác nhau giữa chúng kể từ trái sang trong xâu A có mã ASCII lớn hơn.
Một số thủ tục xử lý xâu: 
- Thủ tục Delete(s,vt,n): Xóa n kí tự của xâu s, bắt đầu từ vị trí vt
- Thủ tục Insert(s1,s2,vt): Chèn xâu s1 vào s2, bắt đầu ở vị trí vt
- Thủ tục str(value,s): chuyển đổi giá trị kiểu số (value) sang dạng xâu kí tự và gán cho biến s.
- Thủ tục val(s,value,code): đổi xâu kí tự s sang dạng số và gán cho biến value, nếu đổi thành công thì code nhận giá trị bằng 0, ngược lại cho giá trị khác 0.
Một số hàm: 
TT
Hàm
Ý nghĩa
1
Copy(s,vt,n)
Tạo xâu mới gồm n kí tự liên tiếp bắt đầu từ vị trí vt của xâu s
2
Length(s)
Cho giá trị là độ dài xâu s
3
Pos(s1,s2)
Cho vị trí xuất hiện đầu tiên của xâu s1 trong xâu s2
4
Upcase(ch)
Cho chữ cái in hoa ứng với chữ cái trong ch
5
Ord(ch)
Cho mã của kí tự ch trong bảng mã ASCII
6
Chr(n)
Cho kí tự có mã là n
7
Concat(s1,s2,..,sn)
Cho xâu mới bằng cách nối đuôi các xâu s1,s2,..,sn lại.
Dạng bài tập kiểu xâu dùng phương pháp nhặt sỏi 
 Đây là dạng bài tập khá đơn giản. Thông thường, để giải quyết các bài toán này học sinh sẽ vận dụng một số thủ tục như Delete(s,vt,n), Insert(s1,s2,vt) và các hàm như: Copy(s,vt,n), Pos(s1,s2), Length(s) cùng với vòng lặp. Tuy nhiên, với cách giải quyết thông thường bài toán trở nên phức tạp, máy mất nhiều thời gian để thực hiện và không giải quyết được triệt để. Giáo viên có thể giới thiệu cho các em phương pháp nhặt sỏi khá đơn giản dễ hiểu và máy thực hiện trong thời gian ngắn và tối ưu. Đó là : Nếu phần tử của xâu thỏa mãn điều kiện nào đó (không thỏa mãn điều kiện nào đó) thì nhặt bỏ vào một xâu khác đã khởi tạo từ trước. Cụ thể:
Bài tập 1: Nhập vào một xâu bất kì. Hãy xóa bỏ các dấu cách có trong xâu. [1]
Bài tập giải quyết theo tư duy thông thường của học sinh:
var s:string;
i,n,vt:byte;
begin
write('nhap xau: '); readln(s);
 i:=1; n:=length(s);
 while i<=n do
 begin
 if s[i]=' ' then begin
 vt:= pos(' ',s);
 delete(s,vt,1);
 n:=n-1;
 end;
 i:=i+1;
 end;
write('xau ket qua: ',s);
readln;
end.
Thoáng nhìn có vẻ bài toán được giải quyết, hợp lí. Tuy nhiên khi chạy chương trình học sinh mới ngỡ ngàng khi kết quả không triệt để.
Trong mục 2.3.1: Bài tập 1 được trích dẫn trong TLTK số 1
	Học sinh khá khác có thể viết một chương trình tốt hơn sử dụng vòng lặp while...do, hàm pos(s1,s2) và hàm delete(s,vt,1) để tìm vị trí , xóa của các kí tự trống trong xâu như:
	Chương trình:
var s:string;
i,n:byte;
begin
write('nhap xau: '); readln(s);
 while pos(' ',s)0 do delete(s,pos(' ',s),1);
 write('xau ket qua: ',s);
readln;
end.
 	Kết quả thu được sau khi chạy chương trình khá ổn
	Với cách viết chương trình trên học sinh sẽ nhận thấy chương trình khá ngắn gọn dễ hiểu, tuy nhiên giáo viên cần giải thích cho học sinh thấy máy tính sẽ phải làm việc rất vất vả, vì phải vừa thực hiện vòng lặp vừa phải tìm vị trí của dấu cách trống để so sánh với 0. Và khi muốn xóa dấu cách trống nào cũng phải xác định vị trí dấu cách trống đó. Câu hỏi đặt ra là: có cách nào giải quyết bài toán này để viết chương trình vừa ngắn gọn dễ hiểu mà máy tính cũng không mất thời gian để thực hiện lệnh?
 Khi đó giáo viên hướng dẫn học sinh giải quyết bài toán này bằng phương pháp nhặt sỏi: [1]
var s,p:string;
i,nt:byte;
begin
write('nhap xau: '); readln(s);
 p:=’’;
 for i=1 to length(s) do
 if s[i]' ' then p:=p+s[i];
 write('xau ket qua: ',p); readln; end.
Khi chạy kết quả, các em sẽ khẳng định được hiệu quả tối ưu đối với những bài toán có thể sử dụng phương pháp nhặt sỏi, từ đó các em tin tưởng và biết vận dụng giải quyết các bài toán tương tự khác.
Bài tập 2: Nhập vào một xâu bất kì. Hãy đưa ra màn hình các kí tự số trong xâu.
Bài toán này các em học sinh có thể xóa hết tất cả các kí tự chữ cái trong xâu, còn lại trong xâu là các kí tự số. Tuy nhiên khi biết phương pháp nhặt sỏi rồi thì học sinh sẽ tin tưởng phương pháp này và vận dụng ngay.
Chương trình:
var s,p:string;
i:byte;
begin
write('nhap xau: '); readln(s);
 p:=’’;
 for i:=1 to length(s) do
 if (s[i] >= '0 ') and (s[i]<=‘9’) then p:=p+s[i];
 write('xau ket qua: ',p);
readln;
end.
Nhanh chóng thu được kết quả đúng:
	Giáo viên giới thiệu một số bài tập và yêu cầu học sinh nhận biết và vận dụng phương pháp nhặt sỏi để giải quyết.
Bài tập 3: Nhập vào một xâu bất kì. Hãy xóa hết các kí tự ‘a’ và ‘A’ trong xâu.
	Vận dụng: Thay vì phải đi tìm vị trí của kí tự ‘a’ và ‘A’ để xóa thì ta đi nhặt những kí tự khác ‘a’ và ‘A’ để bỏ vào xâu khác được khởi tạo từ trước.
Bài tập 4: Nhập vào một xâu bất kì. Hãy xóa các kí tự trùng lặp và đưa ra màn hình xâu mà các kí tự trong đó chỉ xuất hiện một lần.
 Vận dụng: dùng phương pháp đếm số lần xuất hiện của các kí tự trong xâu. Trong quá trình đếm kí tự, nếu đếm kí tự =1 thì nhặt kí tự đó vào xâu khác đã khởi tạo từ trước.
Bài tập 5: Nhập vào một xâu bất kì. Hãy kiểm tra xem xâu đó có đối xứng hay không.
	Vận dụng: duyệt từ cuối xâu và nhặt lần lượt các kí tự từ cuối xâu lại vào một xâu khác đã khởi tạo từ trước. Nếu xâu nhập vào bằng xâu vừa tạo thì xâu đó là đối xứng.
2.3.2. Dạng bài tập chuẩn hóa xâu
Một xâu chuẩn hóa là xâu mà các từ trong xâu chỉ cách nhau một cách trống và không kí tự trống ở đầu xâu và cuối xâu. Giáo viên hướng dẫn học sinh giải quyết các bài toán sau:
Bài tập 1: Nhập vào một xâu bất kì. Hãy chuẩn hóa xâu.
Học sinh có thể sử dụng thủ tục Delete(s,vt,n) và Pos(s1,s2) để xóa cách trống hai đầu xâu, và cách trống giữa các từ.
Chương trình
var s:string;
i:byte;
begin
write('nhap xau: '); readln(s);
 i:=1;
 while s[1]=' 'do delete(s,1,1);
 while s[length(s)]=' 'do delete(s,length(s),1);
 While pos(' ',s)0 do delete(s,pos(' ',s),1);
 write('xau ket qua: ',s);
readln;
end.
Kết quả thu được khi chạy chương trình :
Từ chương trình học sinh viết, giáo viên cần nhận xét rằng chương trình không hề sai. Nhưng khi sử dụng lệnh: While pos(' ',s)0 do delete(s,pos(' ',s),1); tương tự như bài tập 1 của dạng 1 đã nêu máy tính sẽ làm việc vất vả khi vừa phải sử dụng vòng lặp vừa phải xác định vị trí đầu tiên của hai dấu cách trong xâu, sau đó sử dụng thủ tục xóa thì hàm pos(‘ ‘,s) lại xuất hiện một lần nữa.
Giáo viên có thể gợi ý cho học sinh sử dụng phương pháp nhặt sỏi đã nêu ở dạng 1 để giải quyết bài toán giữa các từ chỉ cách nhau 1 dấu cách trống.
Chương trình
var s,p:string;
i:byte;
begin
write('nhap xau: '); readln(s);
 while s[1]=' 'do delete(s,1,1);
 while s[length(s)]=' 'do delete(s,length(s),1);
	p:= '';
 for i:=1 to length(s) do 
begin
 	 if (s[i]' ') then p:=p+s[i];
 	if (s[i]=' ') and (s[i+1] ' ') then p:=p+s[i]; 
end;
 write('xau ket qua: ',p);
readln;
end.
Kết quả thu được khi chạy chương trình sẽ giúp cho học sinh khẳng định lại một lần nữa, đối với những bài toán có thể dùng phương pháp nhăt sỏi để giải quyết thì bài toán sẽ tối ưu: gọn gàng, dễ hiểu, tốn ít thời gian để thực hiện.
Từ cách giải quyết bài toán chuẩn hóa xâu, giáo viên có thể nêu một số bài tập vận dụng như:
Bài tập 2: Nhập vào một xâu bất kì. Hãy đếm số từ có trong xâu.
Học sinh vận dụng: chuẩn hóa xâu rồi đếm số cách trống còn lại trong xâu số từ trong xâu bằng số cách trống cộng một.
Bài tập 3: Nhập vào một xâu họ tên của một người bất kì. Hãy đưa ra họ của người đó .
Học sinh vận dụng: chuẩn hóa xâu rồi duyệt lần lượt từ đầu xâu, nếu gặp cách trống thì dừng lại và đánh dấu vị trí của cách trống. Sau đó, in ra các kí tự kể từ đầu xâu đến vị trí đánh dấu của cách trống trừ đi một, ta được họ của xâu họ tên đó.
Bài tập 4: Nhập vào một xâu họ tên của một người bất kì. Hãy đưa ra tên của người đó .
Học sinh vận dụng: chuẩn hóa xâu rồi duyệt lần lượt từ cuối xâu, nếu gặp cách trống thì dừng lại và đánh dấu vị trí của cách trống. Sau đó, in ra các kí tự kể từ vị trí đánh dấu của cách trống cộng thêm một đến cuối xâu, ta được tên của xâu họ tên đó.
Dạng bài tập về liệt kê xâu con thỏa mãn điều kiện nào đó.
Đối với đối tượng học sinh khối 11 trường THPT Lê Lai thì dạng bài tập này giáo viên chỉ yêu cầu học sinh giải quyết bài toán với phạm vi dữ liệu không lớn. Bởi vì, đây là dạng bài tập phức tạp, khả năng của học sinh còn hạn chế. Cho nên tất cả các bài toán được nêu trong dạng này chỉ dừng lại ở phạm vi dữ liệu đủ nhỏ để học sinh dễ dàng hiểu và vận dụng dạng bài tập này.
Bài tập 1: Nhập vào một xâu bất kì. Hãy liệt kê tất cả các xâu con của xâu ban đầu.
	Đây là dạng bài tập mà khi nêu bài toán lên học sinh dễ dàng hình dung kết quả thu được sau khi giải quyết xong bài toán. Tuy nhiên để xây dựng thuật toán và viết chương trình thì học sinh đã gặp khó khăn. Nhiệm vụ của giáo viên là hướng dẫn các em phân tích một xâu cụ thể với số lượng kí tự <10 kí tự để tìm ra các xâu con. Từ đó các em đã hình thành được thuật toán giải quyết bài toán với đoạn lệnh sử dụng hai vòng lặp for..to..do lồng nhau. Mặc 

Tài liệu đính kèm:

  • docskkn_mot_so_dang_bai_tap_kieu_xau_danh_cho_doi_tuong_hoc_sin.doc
  • docbìaSKKN.doc