Đề tài Kiểu xâu – Bài tập kiểu xâu

doc 35 trang Người đăng phongnguyet00 Lượt xem 16037Lượt tải 2 Download
Bạn đang xem 20 trang mẫu của tài liệu "Đề tài Kiểu xâu – Bài tập kiểu xâu", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Đề tài Kiểu xâu – Bài tập kiểu xâu
MỤC LỤC
 Phần I: MỞ ĐẦU
Lý do chọn đề tài....................................................................................	4
Mục đích nghiên cứu..............................................................................	7
Phạm vi đề tài	7
Đối tượng, kế hoạch và phạm vi nghiên cứu	7
Đóng góp của đề tài................................................................................	7
 Phần II: NỘI DUNG
CHƯƠNG I : TỔNG QUAN	9
Cơ sở lý luận	9
Cơ sở thực tiễn	10
CHƯƠNG II: THỰC TRẠNG VẤN ĐỀ NGHIÊN CỨU..........................11
CHƯƠNG III: NỘI DUNG VẤN ĐỀ NGHIÊN CỨU...............................11
I. Khái báo và truy xuất đến phần tử xâu....................................................11
Khái niệm, tham chiếu đến phần tử xâu ...............................................11
Khai báo ....12
Cách nhập/xuất ................................ 12
II. Các thao tác xử lí xâu
1. Phép ghép xâu ...........................................12
2. Phép so sánh .................................................12
3. Một số thủ tục xử lí xâu ............... 13
4. Một số hàm .. 14
III. CÁC DẠNG BÀI TẬP THƯỜNG GẶP
Dạng 1: Một số bài tập củng cố kiến thức, tạo hứng thú cho HS .....14
Dạng 2: Biến đổi xâu ........................................................................... 23
Dạng 3: Một số bài tập xâu Palindrome .............................................26
Dạng 4: Ứng dụng kiểu xâu vào giải các bài toán kiểu số nguyên .28
Bài tập tự luyện ..32
Chương IV: PHƯƠNG PHÁP VÀ KẾT QUẢ NGHIÊN CỨU.33
1. Phương pháp nghiên cứu........33
2. Kết quả nghiên cứu.33
Phần III: KẾT LUẬN 35
Kiến nghị.35
DANH MỤC TÀI LIỆU THAM KHẢO  ..36
QUY ƯỚC VIẾT TẮT
TT
Từ viết tắt
Nghĩa đầy đủ
1
GV
Giáo viên
2
HS
Học sinh
KIỂU XÂU - BÀI TẬP KIỂU XÂU
Phần 1: MỞ ĐẦU
I. LÍ DO CHỌN ĐỀ TÀI.
Trong thực tiễn dữ liệu vào của các bài toán đều liên quan đến các kiểu dữ liệu khác nhau, để tiện cho việc lập trình và xử lý dữ liệu chúng ta thường đưa dữ liệu đó về các dạng kiểu dữ liệu chuẩn hoặc kiểu dữ liệu có cấu trúc, một trong những kiểu dữ liệu có cấu trúc đó là kiểu xâu. 
	Qua quá trình tham gia giảng dạy Tin học khối 11, tôi nhận thấy dữ liệu kiểu xâu thường gặp rất nhiều trong các bài toán và vận dụng linh hoạt các thao tác xử lý trên kiểu dữ liệu này vào bài toán không phải là dễ. Việc học sinh tìm hiểu về kiểu dữ liệu có cấu trúc nói chung và kiểu dữ liệu xâu nói riêng còn khá nhiều lúng túng. Đặc biệt là dữ liệu vào kiểu xâu và những yêu cầu của bài toán liên quan đến kiểu dữ liệu xâu, học sinh thường không biết bắt đầu từ đâu để giải quyết vấn đề mà bài toán đưa ra. Kỹ năng khi làm việc với kiểu dữ liệu xâu của học sinh thường không đáp ứng được yêu cầu đề ra.
Tin học là một môn học mới ở các trường phổ thông nên học sinh 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 lạ đố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 toán. Nguyên nhân dẫn đến những khó khăn mà học sinh thường gặp là:
+ Gặp khó khăn khi xác định bài toán đặc biệt là xác định dạng bài toán về kiểu dữ liệu xâu.
+ Khó liên hệ phương pháp giải một bài toán trong toán học với thuật toán trong tin học. 
 Trong việc giảng dạy cho HS, 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 trong học tập của các em. Vì việc học tập tự giác, tích cực, chủ động, sáng tạo đòi hỏi học sinh phải có ý thức về những mục tiêu đặt ra, tạo được động lực bên trong thúc đẩy bản thân các em hoạt động để đạt các mục tiêu đó. Điều này được thực hiện trong dạy học không chỉ đơn giản bằng việc nêu rõ mục tiêu mà quan trọng hơn còn do gợi động cơ.
Xuất phát từ thực tiễn giảng dạy tại trường THPT Lương Tài, tôi thấy rằng để đạt hiệu quả cao trong mỗi phần học, tiết học cần có cách thiết kế bài giảng cho phù hợp với nội dung kiến thức, phương pháp, phương tiện dạy học phải phù hợp với từng đối tượng học sinh. Để qua mỗi phần học, tiết học, học sinh thích thú với kiến thức mới, hiểu được kiến thức đã học trên lớp, đồng thời thấy được tầm quan trọng của vấn đề: trước là ứng dụng của kiến thức để đáp ứng những yêu cầu của môn học, sau đó là ứng dụng vào thực tiễn trong đời sống xã hội (nếu có). Tuy nhiên, trong các môn học ở bậc học THPT thì môn Tin học lớp 11 được các em học sinh cho là môn học “khó nhai” nhất trong các môn học. Từ việc các em chỉ là người sử dụng các phần mềm sẵn có như: hệ điều hành, sọan thảo văn bản Word, bảng tính Excel, các phần mềm học tập, nghe nhạc hay chơi game thì các em lại là người phải tìm ra lời giải cho các bài toán, chỉ ra các bước cho máy tính thực hiện và viết chương trình để tạo ra các sản phẩm phần mềm cho người khác sử dụng mặc dù mới chỉ là bước khởi đầu, cơ bản. 
Mọi thứ đều có điểm khởi đầu của nó, học sinh học ngôn ngữ lập trình Turbo Pascal là khởi đầu cho việc tiếp cận ngôn ngữ lập trình bậc cao, 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. 
Turbo Pascal là ngôn ngữ lập trình có cấu trúc thể hiện trên 3 yếu tố: Cấu trúc về mặt dữ liệu, cấu trúc về mặt lệnh, cấu trúc về mặt chương trình. Turbo Pascal được dùng phổ biến ở nước ta hiện nay trong công tác giảng dạy ở hầu hết các trường đại học, cao đẳng, trung học phổ thông và được mệnh danh là “Ngôn ngữ học đường”.
Các em HS phải làm quen với nhiều kiểu dữ liệu mới mà trong các môn học khác không có, nhiều học sinh còn bỡ ngỡ không hiểu vì sao cùng là kiểu số nguyên mà lại chia làm nhiều kiểu như byte, integer, word,  mà trong toán học chỉ gồm số nguyên âm và nguyên dương. Hoặc các loại thông tin như hình ảnh, âm thanh được xử lý như thế nào. Kiến thức mới và khó, HS sợ học môn Tin học 11, kết quả giảng dậy thấp, nhất là ở các lớp học sinh yếu về môn tự nhiên, ít có điều kiện sử dụng máy tính. Người thầy phải làm gì để khắc phục được điều này?
Để khắc phục đượ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 tính độc lập, tích cực của học sinh trong học tập. Học sinh có thể tự mình tìm ra được những ý tưởng sáng tạo vậ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 đó. 
 Với mong muốn phần nào giúp học sinh cũng như giáo viên trong việc tìm ra lời giải cho một số bài toán liên quan tới kiểu dữ liệu xâu dễ dàng hơn, nhất là giúp cho các em học sinh có thể yêu thích nhiều hơn nữa ngôn ngữ lập trình Pascal, tôi xin giới thiệu chuyên đề “Kiểu xâu – Bài tập kiểu xâu” (Chương IV, bài 12, tin học 11) mà tôi đã áp dụng có hiệu quả trong quá trình giảng dạy. Chuyên đề được trình bày dựa trên kinh nghiệm giảng dạy của bản thân và tham khảo một số tài liệu liên quan.
II. MỤC ĐÍCH NGHIÊN CỨU
- Giới thiệu cách khai báo và truy xuất đến kiểu dữ liệu xâ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 sử dụng.
- Giới thiệu một số bài tập áp 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. 
- Sử dụng các ví dụ cụ thể trước hết để học sinh nắm được cú pháp, ý nghĩa của kiểu xâu và thông qua các ví dụ đó để củng cố phần kiến thức này, đồng thời giáo viên giới thiệu thêm một số hàm, thủ tục xử lý xâu nhằm giúp các em học sinh xử lý được một số bài tập ứng dụng, tăng sự yêu thích với môn học được mệnh danh là môn học khó nhất trong các môn học ở lớp 11.
III. PHẠM VI ĐỀ TÀI
- Kiểu dữ liệu có cấu trúc “Kiểu xâu” là dãy kí tự liên tiếp trong bảng mã ASCII. Tuy nhiên trong khuôn khổ đề tài chỉ hệ thống lại kiến thức về kiểu xâu và đưa ra một số dạng bài tập xứ lý xâu thường gặp và cách giải quyết.
IV. ĐỐI TƯỢNG, KẾ HOẠCH VÀ PHẠM VI NGHIÊN CỨU
- Đối tượng khảo sát:	Học sinh khối 11 của lớp: 11A2, 11A3.
- 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.
V. ĐÓNG GÓP CỦA ĐỀ TÀI
- Học sinh sau khi được giới thiệu một cách hệ thống các dạng bài tập về xâu và quy trình giải quyết từng dạng đã có thể nhận biết yêu cầu của bài toán và cách thức giải quyết chúng một cách hiệu quả.
- Hình thành ở HS kỹ năng phân tích, xử lý các vấn đề liên quan đến bài tập kiểu xâu, sử dụng thành thạo vòng lặp biết trước, thủ tục chuẩn vào/ra đơn giản, bước đầu làm quen với 1 số chương trình con dạng thủ tục tạo điều kiện thuận lợi cho việc tiếp thu kiến thức về cách viết chương trình có cấu trúc.
- Mở rộng một số bài tập kiểu xâu để học sinh thấy được ứng dụng quan trọng của kiểu dữ liệu xâu trong lập trình.
 - Sáng kiến kinh nghiệm “Bài tập kiểu xâu” được áp dụng lần đầu tiên tại lớp 11A2 năm học 2011-2012 trường THPT Lương Tài, Bắc Ninh. Sau đó được ứng dụng mở rộng trong việc giảng dạy Tin học khối 11 từ 11A2, 11A3, 11A4, 11D3, 11D4 năm học 2012-2013. Tôi đã đưa SKKN của mình lên trang  từ tháng 6/2012 và được các bạn đồng nghiệp tham khảo khá nhiều. Sau một thời gian ứng dụng trong việc giảng dậy, tôi đã mở rộng một số dạng bài tập kiểu xâu, dậy thử nghiệm tại lớp 11A2, 11A3 năm học 2015-2016 khá hiệu quả trong tiết bài tập về kiểu xâu. 
Phần II: NỘI DUNG
Chương I. TỔNG QUAN
I. CƠ SỞ LÍ LUẬN
Ngày nay, trên thế giới đang diễn ra quá trình tin học hoá trên nhiều lĩnh vực hoạt động của xã hội loài người và đem lại nhiều hiệu quả to lớn. Việc sử dụng máy tính không còn chỉ bó hẹp trong viện nghiên cứu, các trường đại học, các trung tâm máy tính mà còn mở rộng ra mọi cơ quan, tổ chức kinh tế... và trong các gia đình. Song song với quá trình trên, việc giảng dạy Tin học trong các trường đại học, THPT cũng được đẩy mạnh đi đôi với việc tăng cường trang bị máy vi tính. Đảng và Nhà nước ta đã nhận thấy được tầm quan trọng của ngành Tin học và đã đưa môn học này vào trường phổ thông như những môn học khác bắt đầu từ năm học 2006-2007.
Chỉ thị số 55/2008/CT- BGTĐT ngày 30/9/2008 của Bộ trưởng Bộ GDĐT về tăng cường giảng dạy, đào tạo và ứng dụng công nghệ thông tin trong ngành giáo dục giai đoạn 2008-2011.
Trong bối cảnh toàn ngành GD-ĐT đ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ụ độ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ể.
II. CƠ SỞ THỰC TIỄN
- Qua thực tế giảng dạy ở trường THPT Lương Tài nhiều năm, 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 cho rằng đây là môn học khó nhất trong các môn học, nhiều em còn sợ môn học này. 
- Khi học sinh học bài học Bài 12 “Kiểu xâu”, học sinh đã có rất nhiều khó khăn, nhầm lẫn trong việc xử lý dữ liệu vì các em đang quen với các bài toán xử lý dữ liệu kiểu số, các bài toán quen thuộc như tính tổng hoặc tích của 1 dãy số thoả mãn điều kiện nào đó
- Khi gặp các bài toán phải sử dụng kiểu dữ liệu lớn nhiều em lúng lúng. Việc giải các bài toán với kiểu dữ liệu lớn thực sự cần thiết cho các em khi làm các bài toán lập trình trong chương trình Tin học phổ thông nói riêng và việc giải quyết các bài toán thực tế nói chung.
- Ở bài tập kiểu xâu giáo viên có thể tạo sự hứng thú cho học sinh bằng các ví dụ cụ thể, có thể làm được các công việc mà các em đã gặp trong thực tế cuộc sống như các biển hiệu quảng cáo, chế độ nghỉ màn hình,. ..qua đó các em có thể giải các các bài toán trong thực tế, bước đầu viết được một số phần mềm ứng dụng nhỏ vào đời sống.
- Do đặc trưng của bộ môn nên học sinh muốn học được tốt môn tin học cần có được tư duy khái quát xác định được hết các khả năng của một vấn đề (tư duy vét cạn tổng quát).
- Phát triển nhân cách học sinh khi tham gia làm các bài tập về kiểu xâu có thể rèn luyện tính tích cực chủ động sáng tạo trang việc chọn hướng giải quyết một vấn đề cụ thể thông qua việc liệt kê các khả năng của nó.
CHƯƠNG II: THỰC TRẠNG CỦA VẤN ĐỀ NGHIÊN CỨ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 khá 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 có cấu trúc. 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.
- Với cấu trúc lặp có số lần chưa biết trước HS cũng gặp phải những khó khăn như: 
+ Xác định điều kiện để kết thúc vòng lặp.
+ Khó xác định cấu trúc lặp để triển khai.
+ Thường bỏ quên việc tác động đến điều kiện để kết thúc vòng lặp.
CHƯƠNG III: NỘI DUNG VẤN ĐỀ NGHIÊN CỨU
Để 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 đó, chúng tôi xin trình bày một số nội dung mà chúng tôi đã tìm hiểu và vận dụng có hiệu quả trong khi giảng dạy.
I. KHAI BÁO VÀ TRUY XUẤT ĐẾN PHẦN TỬ XÂU
1. 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à’.
VD: cho xâu s=‘THPT Luong Tai’, xâu S có số kí tự 14 =>độ dài xâu s bằng 14.
- 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.
- Tham chiếu đến phần tử xâu: [chỉ số phần tử]
VD; s[1]=’T’, s[4]=’T’, s[6]=’L’, s[10]=’g’
Lưu ý: - Kiểu xâu khác với kiểu char
2. Khai báo: Var : string[độ dài lớn nhất của xâu];
VD: var hoten:string[30];
S:string; {xâu s sẽ có độ dài là 255}
- 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. 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ỉ có trong free pascal)có kích thước gần 2GB = 230 B 
3. 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.
	Ví dụ: Readln(s); Writeln(s);
II. CÁC THAO TÁC XỬ LÍ XÂU
1. 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.
VD: ‘Luong’ + ’Tai’ cho kết quả ‘LuongTai’
 ‘Luong’ + ’ ‘ +’ Tai’ cho kết quả ‘Luong Tai’
2. 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.
 VD: ‘an’>’An binh’, kí tự ‘a’ có mã ASCII là 97, kí tự ‘A’ có mã ASCII là 65.
- Nếu A và B là các xâu có độ dài khác nhau và A là đoạn đầu của B thì A< B.
 VD: ‘an’ < ’an binh’, ‘Luong’ < ‘Luong Tai’
- A=B nếu xâu A và B giống nhau hoàn toàn
 VD: ‘hoa’=’hoa, ‘hoa’’Hoa’
3. 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
VD: 
Giá trị S
Thao tác
Kết quả
‘Luong’
Delete(s,1,4)
‘g’
‘Luong Tai’
Delete(s,6,4)
‘Luong’
- Thủ tục Insert(s1,s2,vt): Chèn xâu s1 vào s2, bắt đầu ở vị trí vt
VD: 
Giá trị s1
Giá trị s2
Thao tác
Kết quả
‘Luong’
‘Tai’
Insert(s1,s2,1)
‘LuongTai’
Insert(s2,s1,1)
‘TaiLuong’
- 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.
VD: n:=195; 
str(n,s) sẽ cho kết quả xâu s là s=’195’
- 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 biến đổi thành công thì code nhận giá trị bằng 0, ngược lại cho giá trị khác 0.
VD: val(‘195’,value,code) lúc này code=0 và value=195
4. 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 với nhau
Ví dụ: 
TT
Giá trị s
Biểu thức
Kết quả
1
‘Luong Tai’
Copy(s,1,5)
‘Luong’
2
‘Hello’
Length(s)
5
3
‘Luong Tai’
Pos(‘T’,s)
7
TT
Giá trị ch
4
‘a’
Upcase(ch)
‘A’
5
‘a’
Ord(ch)
97
6
Chr(65)
‘A’
7
Concat(‘tin’,’hoc’)
‘tinhoc’
III. CÁC DẠNG BÀI TẬP THƯỜNG GẶP. 
1. Dạng 1: Một số bài tập củng cố kiến thức, tạo hứng thú cho học sinh: 
Bài tập 1: Viết chương trình nhập vào một xâu ký tự từ bàn phím. Đổi xâu ký tự đó sang chữ in hoa rồi in kết quả ra màn hình.
	Ví dụ: Input: ‘nguyen van an’ 
 Output: ‘NGUYEN VAN AN’
 GV nêu câu hỏi: Ứng dụng của viết chữ in hoa các em gặp trong những trường hợp nào? 
 HS: khi đi làm giấy khai sinh, kê khai lý lịch, làm hồ sơ thi tốt nghiệp, ĐH-CĐ
GV: Làm thế nào để khi ta nhập họ tên vào máy là chữ thường thì khi hiện lên trên màn hình là chữ in hoa có dấu?
 HS: sử dụng hàm upcase(ch)
 Giáo viên: Nhưng hàm upcase(ch) chỉ đổi được 1 kí tự thành ký tự in hoa, ở đây chúng ta đổi cả 1 xâu kí tự? vậy chúng ta xử lý vấn đề này như thế nào?
 HS: đưa ra cách xử lý.
 Giáo viên: Chúng ta đã biết có thể coi xâu là mảng 1 chiều mà mỗi phần tử là một kí tự. Mỗi kí tự của xâu được đánh số thứ tự thường bắt đầu từ 1, số kí tự của xâu chính là độ dài của xâu. Vậy để có thể chuyển 1 xâu nhập từ bàn phím thành chữ in hoa thì ta sẽ chuyển từng kí tự trong xâu thành kí tự in hoa: duyệt lần lượt từng phần tử trong xâu và gán phần tử đó bằng giá trị mới upcase(ch);
Câu lệnh for i:=1 to length(s) do S[i]:=upcase(S[i]); dùng để thực hiện yêu cầu đó.
 GV gọi học sinh lên bảng viết chương trình. HS viết chương trình, sau đó GV nhận xét, sửa chữa nếu có sai sót. Chạy chương trình để HS theo dõi kết quả thực hiện.
Chương trình:
Program inhoa;
Var	S: String;i:Byte;
Begin
	Write(‘Nhap xau S: ‘); Readln(S);
	For i:=1 to length(S) do S[i]:=Upcase(S[i]);
	Write(‘Xau ket qua: ‘, S); 
	Readln;
End.
Bài tập 2: Nhập 1 xâu S từ bàn phím (S<=80), đưa ra màn hình xâu đảo ngược của xâu đó (viết theo chiều ngược lại).
VD: Input: ‘Hello’
	Output: ‘olleH’
 GV nêu câu hỏi: làm thế nào để chúng ta có thể viết ngược lại xâu nhập vào?
 Học sinh trả lời:
 GV: Để duyệt lần lượt các kí tự trong xâu S từ 1 đến hết (phần tử cuối cùng có chỉ số trùng với độ dài của xâu) ở các ví dụ và bài tập 1 chúng ta sử dụng vòng lặp biết trước for i:=1 to length(s) do Vậy nếu chúng ta sử dụng vòng lặp lùi for i:=length(s) downto 1 do thì có thể giải quyết được yêu cầu của bài toán không? 
 HS: trả lời
 GV gọi học sinh lên bảng viết CT, sau đó nhận xét và chạy thử chương trình học sinh viết, HS quan sát kết quả thực hiện chương trình trên màn hình máy chiếu. (GV giải thích thêm vì sao xâu s trong bài tập này có độ dài tối đa 80 kí tự)
Chương trình: 
Program xaunguoc;
Var	S: String[80]; i:Byte;
Begin
	Write(‘Nhap xau S: ‘); Readln(S);
	For i:=length(S) downto 1 do write(S[i]);
	Write(‘Xau nguoc cua xau s la: ‘, S); 
	Readln;
End.
Bài tập 3: Nhập 1 xâu S từ bàn phím (S<=25), đưa ra màn hình xâu st nhưng mỗi kí tự viết trên 1 dòng. (GV giải thích thêm vì sao xâu s trong bài tập này có độ dài tối đa 25 kí tự).
VD: Input: ‘LuongTai’
	Output: L
	 u
 o
 	 n
 g
 T
 a
 i
Phần lớn HS vẫn chưa biết khi nào thì sử dụng write, khi nào dùng writeln. Mục đích của bài tập này tôi đưa ra để nhằm củng cố cho học sinh viêc sử dụng thành thạo thủ tục write và writeln, sự khác biệt giữa 2 thủ tục này. 
 GV gọi học sinh nhắc lại sự khác biệt giữa 2 thủ tục, sau đó gọi học sinh lên bảng viết chương trình. 
 GV chạy chương trình hoặc sửa chương trình của bài tập 2, HS theo dõi kết quả thực hiện trên màn hình à sự hứng thú cho học sinh khi học bài kiểu xâu và kết hợp với các thủ tục tưởng chừng như đã rất quen thuộc nhưng khi vận dụng thì các em thấy được sự kì diệu của tin học.
Chương trình: 
Program baitap3;
Var	S: String[25];
	i:Byte;
Begin
	Write(‘Nhap xau S: ‘); Readln(S);
	Write(‘ket qua la: ‘);
	For i:=1 to length(S) do writeln(S[i]:15);
	Readln;
End.
Bài tập 4: Nhập 1 xâu S từ bàn phím (S<=25), đưa ra màn hình xâu st nhưng mỗi kí tự viết trên 1 dòng ngược lại với xâu S.
VD: Input: ‘LuongTai’
	Output: i
	 a
 T
 	 g
 n
 o
 u
 L
Khi tôi nêu bài toán và hỏi hs: bạn nào xung phong lên bảng viết chương trình thì đã có khá nhiều cách tay giơ lên.
Chương trình mà em học sinh đã sửa như sau: 
Program baitap4;
Uses Crt;
Var	S: String[25];
	i:Byte;
Begin
	Clrscr;
	Write(‘Nhap xau S: ‘); 
Readln(S);
Write(‘ketqua la:’);
	For i:= length(S) downto 1 do writeln(S[i]:15);
	 Readln;
End.
 Khi GV chạy CT cho các em HS theo dõi kết quả trên màn hình máy chiếu mà mình đã sửa thì các em ngạc nhiên và rất hào hứng: đơn giản chỉ sửa chương trình có 1 ít mà đã có kết quả rất thú vị, các em thấy tin học 11 không khó lắm.
 GV: Vậy chúng ta có thể tô màu cho chữ được không? Chẳng hạn xâu S đưa ra có màu xanh hoặc đỏ hoặc mỗi kí tự có một màu khác nhau?
 GV làm mẫu cho học sinh để các em thấy được kết quả cho các kí tự hiện ra có màu xanh lá. Tất cả học sinh trong lớp đều thấy phấn chấn và hào hứng học tập.
Chương trình bài tập 4 mở rộng
Program baitap4;
Uses Crt;
Var	S: String[25];
	i:Byte;
Begin
	Write(‘Nhap xau S: ‘); 
Readln(S);
Write(‘ketqua la:’);
Textcolor(2);
	For i:= length(S) downto 1 do writeln(S[i]:15);
	 Readln;
End.
 GV giới thiệu cho HS về nhà tham khảo bài 19 ‘Thư viện chương trình con chuẩn” – phần kiến thức giảm tải và nêu thêm 1 số yêu cầu coi như bài tập ở nhà.
 GV: Vậy làm thế nào để chúng ta có thể tạo ra được các dòng chữ chạy trên các biển hiệu quảng cáo, hoặc khi các em không sử dụng máy tính vài phút thì trên màn hình hiện ra các dòng chữ chuyển động từ trái sang hoặc từ trên xuống, kiểu chữ, màu chữ trông rất đẹp. 
Khi nêu bài tập 5, tôi đã đặt câu hỏi như trên sau đó tôi mới nêu bài toán:
Bài tập 5: Nhập 1 xâu từ bàn phím, đưa xâu đó ra giữa màn hình, chuyển động dần về bên trái, các ký tự đầu xâu sẽ lần lượt mất đi nhưng lại xuất hiện lần lượt ở cuối xâu. Tô màu cho xâu xuất hiện trên màn hình.
GV chạy thử chương trình cho học sinh quan sát kết quả thực hiện, sau đó giáo viên hướng dẫn HS viết chương trình có sử dụng 2 thủ tục chuchay và catdan ở bài tập và thực hành số 6, giải thích các câu lệnh trong 2 thủ tục.
Procedure catdan(s1:st79; var s2:st79);
	begin
s2:=copy(s1,2,length(s1)-1)+s1[1];
	end;
Procedure cangiua(var s:st79);
	var i,n:integer;
	begin
	n:=length(s);
	n:=(80-n) div 2;
	for i:=1 to n do s:=s+ ‘ ‘;
	end;
Chương trình: (giáo viên đã cài sẵn trên máy):
Program chuchay;
uses Crt;
type st79=string[79];
var	s1,s2: st79;
	stop:bolean;
Procedure catdan(s1:st79; var s2:st79);
	begin
s2:=copy(s1,2,length(s1)-1)+s1[1];
	end;
Procedure cangiua(var s:st79);
	var i,n:integer;
	begin
	n:=length(s);
	n:=(80-n) div 2;
	for i:=1 to n do s:=s+ ‘ ‘;
	end;
begin
clrscr;
	write(‘Nhap xau s1: ‘); 
readln(s1);
stop:=false;
while not(stop) do
	begin
	gotoxy(1,12);
	write(s1);
	delay(600);
	catdan(s1,s2);
s1:=s2;
stop:=keypressed
	end;
	readln;
end.
Ở bài này HS được củng cố thêm về hàm copy(s,vt,n) để tạo ra 1 xâu mới.
Bài tập 6: Viết chương trình cho máy tính kiểm tra mật khẩu. Mật khẩu là ‘tinhoc’. Nếu vào đúng mật khẩu thì cho hiện dòng thông báo ‘Dang nhap thanh cong’. Nếu gõ sai mật khẩu thì máy cho hiện dòng thông báo ‘Nhap lai password’.
 GV: Các em thấy ở một số máy khi khởi động vào Windows thì máy tính yêu cầu chúng ta phải gõ mật khẩu, hoặc khi chúng ta không làm việc với máy tính sau một khoảng thời gian nhất định thì trên màn hình cũng xuất hiện cửa sổ yêu cầu người dùng phải nhập password. Nếu nhập mật khẩu sai thì chúng ta không thể làm việc cùng máy tính được nữa? Việc này để tăng cường tính năng bảo vệ máy tính, bảo mật thông tin. Vậy chúng ta có thể làm được điều đó hay không? Bài tập này giúp các em củng cố lại phần kiến thức về việc so sánh 2 xâu. 
 GV: Gợi ý học sinh viết chương trình
Chương trình:
Program ktmatkhau;
Uses crt;
Var s: string;
Begin
Clrscr;
repeat
Write(‘hay nhap password:’);
Readln(s);
Until s=’tinhoc’;
Readln
End.
Đây là chương trình đơn giản so sánh xâu s nhập vào với xâu ‘tinhoc’ nhưng khi thực hiện chương trình đã tạo được hiệu ứng tốt đối với học sinh, các em thấy rất thú vị, thì ra lập trình cũng thật đơn giản. Giáo viên còn giới thiệu thêm được cấu trúc lặp không biết trước số lần lặp repeatuntil, và GV liên hệ với thực tế việc HS khi truy cập các trang mạng xã hội hoặc sử dụng một số dịch vụ trên internet đều phải đăng nhập. 
2. Dạng 2: Biến đổi xâu 
Việc biến đổi xâu được thực hiện trên mỗi ký tự trong xâu nên cần nắm rõ các hàm, thủ tục trên kiểu dữ liệu xâu để vân dụng một cách linh hoạt vào từng bài tập cụ thể.
Bài 1. Rút gọn xâu
Cho xâu S1 chỉ gồm các chữ cái in thường với độ dài tối đa 250 ký tự. Hãy viết chương trình để tạo ra xâu S2 từ xâu S1 bằng cách xóa các ký tự liên tiếp giống nhau trong xâu S1 và chỉ để lại một kí tự đại diện trong đoạn đó.
Input: Đọc từ file văn bản XAU.INP chứa xâu S1 chỉ gồm các chữ cái in thường. 
Output: Ghi ra file văn bản XAU.OUT là xâu S2 tìm được.
Ví dụ:
XAU.INP
XAU.OUT
LLLuuuuuooongggTTTaaaaiii
LuongTai
- Ý tưởng: Duyệt từ đầu xâu đến cuối xâu, gặp 2 ký tự liên tiếp khác giống nhau thì xóa đi một ký tự.
- Chương trình Rút gọn xâu
Program rutgonxau;
const f1='xau.inp'; f2='xau.out';
Var s:string;f:text;
{========}
procedure doc;
begin
 	assign(f,f1); reset(f);
 	readln(f,s);
end;
{========}
Procedure xuly;
var ch,kt:char; i,max,dem:longint;
 begin
 	 assign(f,f2); rewrite(f);
 	 i:=1;
 	 while i<length(s) do
 	begin
 	 if s[i]=s[i+1] then delete(s,i,1)
 	else inc(i);
 	end;
 	writeln(f,s);
 	 close(f);
 end;
{=========}
Begin
 doc;
 xuly;
 readln;
End.
Bài 2. Nén và giải nén: 	Mét x©u kÝ tù cã thÓ "nÐn" theo c¸ch sau: Mét x©u con gåm n (n>1) kÝ tù gièng nhau, ch¼ng h¹n gåm n kÝ tù "a" sÏ ®­îc ghi thµnh na. VÝ dô x©u 'aaaabbcd' sÏ ®­îc nÐn thµnh 4a2bcd. H·y viÕt ch­¬ng tr×nh nÐn vµ gi¶i nÐn. (Chó ý trong c¸c x©u ®­îc nÐn ph¶i kh«ng cã ch÷ sè).
Input: Cho trong tÖp string.INP
Output: Ghi vµo tÖp String.Out
string.inp
string.out
aaaabbcd
3a2b
4a2bcd
aaabb
- Ý tưởng: Với việc nén xâu ta lần lượt đi đếm các ký tự giống nhau liên tiếp trong xâu và sử dụng một xâu kq để lưu kết quả tìm được cho đến khi xét hết xâu (việc giải nén được thực hiện ngược lại)
- Chương trình tham khảo
const fi='string.inp';
 fo='string.out';
var f,g:text; s1,s2:string;
{================}
procedure doc;
begin
 assign(f,fi); reset(f);
 readln(f,s1);
 readln(f,s2);
 close(f);
end;
{================}
procedure nen;
var s,kq:string; i,d:integer; ch:char;
begin
 d:=1; s1:=s1+#32;ch:=s1[1]; kq:='';
 for i:=2 to length(s1) do
 if s1[i]=s1[i-1] then inc(d)
 else
 	begin
 	 str(d,s);
 	 if d1 then kq:=kq+s+ch else kq:=kq+ch;
 	 d:=1;
 	 ch:=s1[i];
 	 end;
 writeln(g,kq);
end;
{================}
procedure giainen;
var s,kq,so:string; i,j,code,n:integer; ch:char;
begin
 i:=1; kq:='';
 repeat
 so:='0';
 while s2[i] in ['1'..'9'] do begin so:=so+s2[i];inc(i); end;
 val(so,n,code);
 if n>1 then
 for j:=1 to n do kq:=kq+s2[i]
 else kq:=kq+s2[i];
 inc(i);
 until i> length(s2);
 writeln(g,kq);
end;
{================}
begin
 assign(g,fo); rewrite(g);
 doc;
 nen;
 giainen;
 close(g);
end.
3. Dạng 3. Một số bài tập xâu Palindrome 
	Xâu Palindrome hay còn gọi là xâu đối xứng, có nghĩa một xâu khi đọc các ký tự trong xâu từ trái sang phải cũng giống từ phải sang trái thì xâu đó được gọi là xâu Palinhdrome.
	Với những bài tập kiểm tra xâu Palindrome hay tìm kiếm xâu có tính chất Palindrome thì trước hết nên xây dựng hàm kiểm tra tính chất đối xứng của một xâu với độ phức tạp O(n), trên cơ sở đó chúng ta giải quyết những bài tập khó hơn. 
Bài tập 1: Kiểm tra một xâu có phải là xâu Palindrome không
Program kiemtra;
Var i,x:byte;
S1,s2:string;
Begin
Write(‘nhap xau s1’);
Readln(s1);
X:=length(s1);
S2:=’’;
For i:=x downto 1 do s2:=s2+s1[i];
If s1=s2 then write(‘xau s1 la xau palindrome’)
	Else write(‘xau s1 không la xau palindrome’);
Readln
End.
Bài tập 2: Xâu con Palindrome: Cho một xâu S có độ dài không vượt quá 1000 kí tự; tìm xâu palindrome dài nhất là xâu con của S.
- Ý tưởng: Sử dụng phương pháp quy hoạch động bằng cách sử dụng mảng 2 chiều F và giá trị F[i, j] = true/false nếu

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

  • docSKKN_Kieu_xau.doc