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ể[r]
(1)MỤC LỤC Phần I: MỞ ĐẦU Lý chọn đề tài Mục đích nghiên cứu Phạm vi đề tài Đối tượng, kế hoạch và phạm vi nghiên cứu Đóng góp đề tài Phần II: NỘI DUNG CHƯƠNG I : TỔNG QUAN .9 Cơ sở lý luận 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 Phép ghép xâu ………………………….… 12 Phép so sánh .………………………… 12 Một số thủ tục xử lí xâu ………… ………………………… 13 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 (2) 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 Phương pháp nghiên cứu………………………………………… 33 Kết 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 (3) QUY ƯỚC VIẾT TẮT TT Từ viết tắt GV HS Nghĩa đầy đủ Giáo viên Học sinh (4) 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 liệu vào các bài toán liên quan đến các kiểu liệu khác nhau, để tiện cho việc lập trình và xử lý liệu chúng ta thường đưa liệu đó các dạng kiểu liệu chuẩn kiểu liệu có cấu trúc, kiểu 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 liệu kiểu xâu thường gặp nhiều 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 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 kiểu liệu có cấu trúc nói chung và kiểu liệu xâu nói riêng còn khá nhiều lúng túng Đặc biệt là liệu vào kiểu xâu và yêu cầu bài toán liên quan đến kiểu liệu xâu, học sinh thường không biết đâu để giải vấn đề mà bài toán đưa Kỹ làm việc với kiểu liệu xâu học sinh thường không đáp ứng yêu cầu đề Tin học là môn học các trường phổ thông nên học sinh còn nhiều bỡ ngỡ 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à nội dung lạ đa số học sinh với nhiều khái niệm, thuật ngữ, cấu trúc liệu mà học sinh tiếp xúc lần đầu Chính vì mà học sinh dễ mắc sai lầm lập trình giải các bài toán Nguyên nhân dẫn đến khó khăn mà học sinh thường gặp là: + Gặp khó khăn xác định bài toán đặc biệt là xác định dạng bài toán kiểu liệu xâu + Khó liên hệ phương pháp giải bài toán toán học với thuật toán tin học … (5) Trong việc giảng dạy cho HS, ngoài việc giúp học sinh lĩnh hội kiến thức bản, người thầy còn phải biết kích thích tính tích cực, sáng tạo say mê học hỏi học tập 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 mục tiêu đặt ra, tạo động lực bên thúc đẩy thân các em hoạt động để đạt các mục tiêu đó Điều này thực dạy học không đơn giản việc nêu rõ mục tiêu mà quan trọng còn gợi động Xuất phát từ thực tiễn giảng dạy trường THPT Lương Tài, tôi thấy để đạt hiệu cao 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 đối tượng học sinh Để qua phần học, tiết học, học sinh thích thú với kiến thức mới, hiểu kiến thức đã học trên lớp, đồng thời thấy tầm quan trọng vấn đề: trước là ứng dụng kiến thức để đáp ứng yêu cầu môn học, sau đó là ứng dụng vào thực tiễn đời sống xã hội (nếu có) Tuy nhiên, các môn học bậc học THPT thì môn Tin học lớp 11 các em học sinh cho là môn học “khó nhai” các môn học Từ việc các em 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 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 lời giải cho các bài toán, các bước cho máy tính thực và viết chương trình để tạo các sản phẩm phần mềm cho người khác sử dụng mặc dù là bước khởi đầu, Mọi thứ có điểm khởi đầu 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 đời, cấu tạo, hoạt động ích lợi các chương trình hoạt động máy tính, các máy tự động… Qua đó giúp các em có thêm định hướng, niềm đam mê tin học, 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ể trên yếu tố: Cấu trúc mặt liệu, cấu trúc mặt lệnh, cấu trúc mặt chương trình Turbo (6) Pascal dùng phổ biến nước ta 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à 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 liệu mà 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ì cùng là kiểu số nguyên mà lại chia làm nhiều kiểu byte, integer, word, … mà toán học gồm số nguyên âm và nguyên dương Hoặc các loại thông tin hình ảnh, âm thanh… xử lý nào Kiến thức và khó, HS sợ học môn Tin học 11, kết giảng dậy thấp, là các lớp học sinh yếu 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 điều này? Để khắc phục điều đó, theo tôi, chúng ta cần phải tìm tòi, nghiên cứu tìm bài toán phù hợp, kích thích tính độc lập, tích cực học sinh học tập Học sinh có thể tự mình tìm ý tưởng sáng tạo vận dụng thiết thực vào sống thực tế nhu cầu nảy sinh, đó các em có thể tự mình hoàn thành ý tưởng đó Với mong muốn phần nào giúp học sinh giáo viên việc tìm lời giải cho số bài toán liên quan tới kiểu liệu xâu dễ dàng hơn, là giúp cho các em học sinh có thể yêu thích nhiều 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á trình giảng dạy Chuyên đề trình bày dựa trên kinh nghiệm giảng dạy thân và tham khảo 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 liệu xâu - Giới thiệu số phép toán trên kiểu liệu xâu, đặc biệt phần này có cung cấp thêm số hàm, thủ tục chưa giới thiệu bài 12 sách giáo khoa tin học 11, đồng thời đưa số ví dụ tương ứng để học sinh dễ dàng sử dụng - Giới thiệu số bài tập áp dụng (7) - Hệ thống các bài toán dạng 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 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ú pháp, ý nghĩ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 số hàm, thủ tục xử lý xâu nhằm giúp các em học sinh xử lý số bài tập ứng dụng, tăng yêu thích với môn học mệnh danh là môn học khó các môn học lớp 11 III PHẠM VI ĐỀ TÀI - Kiểu liệu có cấu trúc “Kiểu xâu” là dãy kí tự liên tiếp bảng mã ASCII Tuy nhiên khuôn khổ đề tài hệ thống lại kiến thức kiểu xâu và đưa số dạng bài tập xứ lý xâu thường gặp và cách giải 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 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 kỹ thực hành giải các bài tập cho học sinh và có hệ thống kiến thức với các bài tập kiểu liệu xâu Phạm vi thực trên kiểu liệu xâu V ĐÓNG GÓP CỦA ĐỀ TÀI - Học sinh sau giới thiệu cách hệ thống các dạng bài tập xâu và quy trình giải dạng đã có thể nhận biết yêu cầu bài toán và cách thức giải chúng cách hiệu - Hình thành HS kỹ 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 số chương trình 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 cách viết chương trình có cấu trúc - Mở rộng số bài tập kiểu xâu để học sinh thấy ứng dụng quan trọng kiểu liệu xâu lập trình (8) - Sáng kiến kinh nghiệm “Bài tập kiểu xâu” áp dụng lần đầu tiên lớp 11A2 năm học 2011-2012 trường THPT Lương Tài, Bắc Ninh Sau đó ứng dụng mở rộng 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 mình lên trang http://giaoan.violet.vn từ tháng 6/2012 và các bạn đồng nghiệp tham khảo khá nhiều Sau thời gian ứng dụng việc giảng dậy, tôi đã mở rộng số dạng bài tập kiểu xâu, dậy thử nghiệm lớp 11A2, 11A3 năm học 2015-2016 khá hiệu tiết bài tập kiểu xâu (9) Phần II: NỘI DUNG Chương I TỔNG QUAN I CƠ SỞ LÍ LUẬN Ngày nay, trên giới diễn quá trình tin học hoá trên nhiều lĩnh vực hoạt động xã hội loài người và đem lại nhiều hiệu to lớn Việc sử dụng máy tính không còn bó hẹp 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 quan, tổ chức kinh tế và các gia đình Song song với quá trình trên, việc giảng dạy Tin học các trường đại học, THPT đẩy mạnh đô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 tầm quan trọng ngành Tin học và đã đưa môn học này vào trường phổ thông môn học khác năm học 2006-2007 Chỉ thị số 55/2008/CT- BGTĐT ngày 30/9/2008 Bộ trưởng Bộ GDĐT tăng cường giảng dạy, đào tạo và ứng dụng công nghệ thông tin ngành giáo dục giai đoạn 2008-2011 Trong bối cảnh toàn ngành GD-ĐT nỗ lực đổi phương pháp dạy học theo hướng phát huy tính tích cực chủ động học sinh hoạt động học tập Điều 24.2 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 học sinh, phù hợp với đặc điểm lớp học, môn học; bồi dưỡng phương pháp tự học, rèn luyện kỹ 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 phương pháp dạy học đã khẳng định, không còn là vấn đề tranh luận Cốt lõi việc đổ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 số nội dung đề tài này, học sinh có thể tự học, tự rèn luyện thông qua số bài tập, dạng bài tập cụ thể II CƠ SỞ THỰC TIỄN (10) - 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 học đến chương trình tin học lớp 11 đa số học sinh cho đây là môn học khó 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ó nhiều khó khăn, nhầm lẫn việc xử lý liệu vì các em quen với các bài toán xử lý liệu kiểu số, các bài toán quen thuộc tính tổng tích 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 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 liệu lớn thực cần thiết cho các em làm các bài toán lập trình chương trình Tin học phổ thông nói riêng và việc giải 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 hứng thú cho học sinh các ví dụ cụ thể, có thể làm các công việc mà các em đã gặp thực tế sống 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 thực tế, bước đầu viết số phần mềm ứng dụng nhỏ vào đời sống - Do đặc trưng môn nên học sinh muốn học tốt môn tin học cần có tư khái quát xác định hết các khả vấn đề (tư vét cạn tổng quát) - Phát triển nhân cách học sinh tham gia làm các bài tập 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 vấn đề cụ thể thông qua việc liệt kê các khả nó (11) 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ỡ tiếp cận với lập trình có cấu trúc kiểu 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ử 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 vòng lặp + Thông báo kết vòng lặp dẫn đến tình trạng lặp lại việc thông báo kết thực chương trình - Với cấu trúc lặp có số lần chưa biết trước HS gặp phải 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 kiểu liệu gọi là xâu ký tự (định nghĩa từ khóa String) Tuy nhiên độ dài String tối đa 255 mà thực tế thì ta thường gặp xâu có độ dài lớn, có cách nào để có thể khắc phục điều đó, chúng tôi xin trình bày số nội dung mà chúng tôi đã tìm hiểu và vận dụng có hiệu giảng dạy I KHAI BÁO VÀ TRUY XUẤT ĐẾN PHẦN TỬ XÂU 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, kí tự gọi là phần tử xâu Số lượng kí tự xâu gọi là độ dài xâu Xâu có độ dài gọi là xâu rỗng Trong Turbo Pascal xâu rỗng viết hai dấu nháy đơn liền ‘và’ VD: cho xâu s=‘THPT Luong Tai’, xâu S có số kí tự 14 =>độ dài xâu s 14 (12) - Có thể xem xâu là mảng chiều mà phần tử là kí tự Các kí tự xâu đánh số thứ tự thường - Tham chiếu đến phần tử xâu: <tên biến 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 Khai báo: Var <tên biến xâu>: string[độ dài lớn xâu]; VD: var hoten:string[30]; S:string; {xâu s có độ dài là 255} - Nếu không khai báo độ dài lớn xâu thì xâu nhận giá trị ngầm định là 255 Xâu ký tự nhớ chiếm số byte số ký tự cực đại khai báo cộng với byte đầu tiên chứa số ký tự có xâu - Ngoài có các kiểu khai báo khác 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ó 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ự các kiểu liệu khác, ta sử dụng các thủ tục READ, WRITE Ví dụ: Readln(s); Writeln(s); II CÁC THAO TÁC XỬ LÍ XÂU 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 VD: ‘Luong’ + ’Tai’ cho kết ‘LuongTai’ ‘Luong’ + ’ ‘ +’ Tai’ cho kết ‘Luong Tai’ Các phép so sánh <, <=, =, >=, >, <> có thứ tự thực ưu tiên thấp phép ghép xâu và thực việc so sánh hai xâu theo các quy tắc sau: - Xâu A > xâu B kí tự đầu tiên khác chúng kể từ trái sang xâu A có mã ASCII lớn VD: ‘an’>’An binh’, kí tự ‘a’ có mã ASCII là 97, kí tự ‘A’ có mã ASCII là 65 (13) - Nếu A và B là các xâu có độ dài khác và A là đoạn đầu B thì A< B VD: ‘an’ < ’an binh’, ‘Luong’ < ‘Luong Tai’ - A=B xâu A và B giống hoàn toàn VD: ‘hoa’=’hoa, ‘hoa’<>’Hoa’ Một số thủ tục xử lý xâu: - Thủ tục Delete(s,vt,n): Xóa n kí tự xâu s, vị trí vt VD: Giá trị S ‘Luong’ ‘Luong Tai’ Thao tác Delete(s,1,4) Delete(s,6,4) Kết ‘g’ ‘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 ‘Luong’ Giá trị s2 ‘Tai’ Thao tác Insert(s1,s2,1) Insert(s2,s1,1) Kết ‘LuongTai’ ‘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) cho kết 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, biến đổi thành công thì code nhận giá trị 0, ngược lại cho giá trị khác VD: val(‘195’,value,code) lúc này code=0 và value=195 Một số hàm: TT Hàm Copy(s,vt,n) Length(s) Pos(s1,s2) Upcase(ch) Ord(ch) Chr(n) Ý nghĩa Tạo xâu gồm n kí tự liên tiếp vị trí vt xâu s Cho giá trị là độ dài xâu s Cho vị trí xuất đầu tiên xâu s1 xâu s2 Cho chữ cái in hoa ứng với chữ cái ch Cho mã kí tự ch bảng mã ASCII Cho kí tự có mã là n (14) Concat(s1,s2, ,sn) Ví dụ: TT Giá trị s ‘Luong Tai’ ‘Hello’ ‘Luong Tai’ TT Giá trị ch Cho xâu cách nối đuôi các xâu s1,s2, ,sn lại với ‘a’ ‘a’ Biểu thức Copy(s,1,5) Length(s) Pos(‘T’,s) Kết ‘Luong’ Upcase(ch) Ord(ch) Chr(65) Concat(‘tin’,’hoc’) ‘A’ 97 ‘A’ ‘tinhoc’ 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 học sinh: Bài tập 1: Viết chương trình nhập vào xâu ký tự từ bàn phím Đổi xâu ký tự đó sang chữ in hoa in kết màn hình Ví dụ: Input: ‘nguyen van an’ Output: ‘NGUYEN VAN AN’ GV nêu câu hỏi: Ứng dụng viết chữ in hoa các em gặp trường hợp nào? HS: 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 nào để ta nhập họ tên vào máy là chữ thường thì 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) đổi kí tự thành ký tự in hoa, đây chúng ta đổi xâu kí tự? chúng ta xử lý vấn đề này nào? HS: đưa cách xử lý Giáo viên: Chúng ta đã biết có thể coi xâu là mảng chiều mà phần tử là kí tự Mỗi kí tự xâu đánh số thứ tự thường 1, số kí tự xâu chính là độ dài xâu Vậy để có thể chuyển xâu nhập từ bàn phím thành chữ in (15) hoa thì ta chuyển kí tự xâu thành kí tự in hoa: duyệt phần tử xâu và gán phần tử đó giá trị upcase(ch); Câu lệnh for i:=1 to length(s) S[i]:=upcase(S[i]); dùng để thực 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 có sai sót Chạy chương trình để HS theo dõi kết thực Chương trình: Program inhoa; Var S: String;i:Byte; Begin Write(‘Nhap xau S: ‘); Readln(S); For i:=1 to length(S) S[i]:=Upcase(S[i]); Write(‘Xau ket qua: ‘, S); Readln; End Bài tập 2: Nhập xâu S từ bàn phím (S<=80), đưa màn hình xâu đảo ngược 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 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 các kí tự xâu S từ đến hết (phần tử cuối cùng có số trùng với độ dài xâu) các ví dụ và bài tập chúng ta sử dụng vòng lặp biết trước for i:=1 to length(s) …Vậy chúng ta sử dụng vòng lặp lùi for i:=length(s) downto …thì có thể giải yêu cầu 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 thực chương trình trên màn hình máy chiếu (GV giải thích thêm vì xâu s bài tập này có độ dài tối đa 80 kí tự) (16) Chương trình: Program xaunguoc; Var S: String[80]; i:Byte; Begin Write(‘Nhap xau S: ‘); Readln(S); For i:=length(S) downto write(S[i]); Write(‘Xau nguoc cua xau s la: ‘, S); Readln; End Bài tập 3: Nhập xâu S từ bàn phím (S<=25), đưa màn hình xâu st kí tự viết trên dòng (GV giải thích thêm vì xâu s 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 chưa biết nào thì sử dụng write, nào dùng writeln Mục đích bài tập này tôi đưa để nhằm củng cố cho học sinh viêc sử dụng thành thạo thủ tục write và writeln, khác biệt thủ tục này GV gọi học sinh nhắc lại khác biệt 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 sửa chương trình bài tập 2, HS theo dõi kết thực trên màn hình hứng thú cho học sinh học bài kiểu xâu và kết hợp (17) với các thủ tục tưởng chừng đã quen thuộc vận dụng thì các em thấy kì diệu 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) writeln(S[i]:15); Readln; End Bài tập 4: Nhập xâu S từ bàn phím (S<=25), đưa màn hình xâu st kí tự viết trên 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 sau: Program baitap4; (18) Uses Crt; Var S: String[25]; i:Byte; Begin Clrscr; Write(‘Nhap xau S: ‘); Readln(S); Write(‘ketqua la:’); For i:= length(S) downto writeln(S[i]:15); Readln; End Khi GV chạy CT cho các em HS theo dõi kết trên màn hình máy chiếu mà mình đã sửa thì các em ngạc nhiên và hào hứng: đơn giản sửa chương trình có ít mà đã có kết thú vị, các em thấy tin học 11 không khó GV: Vậy chúng ta có thể tô màu cho chữ không? Chẳng hạn xâu S đưa có màu xanh đỏ kí tự có màu khác nhau? GV làm mẫu cho học sinh để các em thấy kết cho các kí tự có màu xanh lá Tất học sinh lớp thấy phấn chấn và hào hứng học tập Chương trình bài tập 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); (19) For i:= length(S) downto writeln(S[i]:15); Readln; End GV giới thiệu cho HS nhà tham khảo bài 19 ‘Thư viện chương trình chuẩn” – phần kiến thức giảm tải và nêu thêm số yêu cầu coi bài tập nhà GV: Vậy làm nào để chúng ta có thể tạo các dòng chữ chạy trên các biển hiệu quảng cáo, các em không sử dụng máy tính vài phút thì trên màn hình các dòng chữ chuyển động từ trái sang từ trên xuống, kiểu chữ, màu chữ… trông đẹp Khi nêu bài tập 5, tôi đã đặt câu hỏi trên sau đó tôi nêu bài toán: Bài tập 5: Nhập xâu từ bàn phím, đưa xâu đó màn hình, chuyển động dần bên trái, các ký tự đầu xâu lại xuất cuối xâu Tô màu cho xâu xuất trên màn hình GV chạy thử chương trình cho học sinh quan sát kết thực hiện, sau đó giáo viên hướng dẫn HS viết chương trình có sử dụng 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 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 s:=s+ ‘ ‘; end; Chương trình: (giáo viên đã cài sẵn trên máy): (20) 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 s:=s+ ‘ ‘; end; begin clrscr; write(‘Nhap xau s1: ‘); readln(s1); stop:=false; while not(stop) begin gotoxy(1,12); write(s1); delay(600); catdan(s1,s2); s1:=s2; (21) stop:=keypressed end; readln; end Ở bài này HS củng cố thêm hàm copy(s,vt,n) để tạo xâu Bài tập 6: Viết chương trình cho máy tính kiểm tra mật Mật là ‘tinhoc’ Nếu vào đúng mật thì cho dòng thông báo ‘Dang nhap cong’ Nếu gõ sai mật thì máy cho dòng thông báo ‘Nhap lai password’ GV: Các em thấy số máy 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, chúng ta không làm việc với máy tính sau khoảng thời gian định thì trên màn hình xuất cửa sổ yêu cầu người dùng phải nhập password Nếu nhập mật sai thì chúng ta không thể làm việc cùng máy tính nữa? Việc này để tăng cường tính bảo vệ máy tính, bảo mật thông tin Vậy chúng ta có thể làm đ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 việc so sánh 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 (22) Đây là chương trình đơn giản so sánh xâu s nhập vào với xâu ‘tinhoc’ thực chương trình đã tạo hiệu ứng tốt học sinh, các em thấy thú vị, thì lập trình thật đơn giản Giáo viên còn giới thiệu thêm cấu trúc lặp không biết trước số lần lặp repeat…until, và GV liên hệ với thực tế việc HS truy cập các trang mạng xã hội sử dụng số dịch vụ trên internet phải đăng nhập Dạng 2: Biến đổi xâu Việc biến đổi xâu thực trên ký tự xâu nên cần nắm rõ các hàm, thủ tục trên kiểu liệu xâu để vân dụng cách linh hoạt vào bài tập cụ thể Bài Rút gọn xâu Cho xâu S1 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 xâu S2 từ xâu S1 cách xóa các ký tự liên tiếp giống xâu S1 và để lại kí tự đại diện đoạn đó Input: Đọc từ file văn XAU.INP chứa xâu S1 gồm các chữ cái in thường Output: Ghi file văn XAU.OUT là xâu S2 tìm Ví dụ: XAU.INP LLLuuuuuooongggTTTaaaaiii XAU.OUT LuongTai - Ý tưởng: Duyệt từ đầu xâu đến cuối xâu, gặp ký tự liên tiếp khác giống thì xóa 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; (23) var ch,kt:char; i,max,dem:longint; begin assign(f,f2); rewrite(f); i:=1; while i<length(s) 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 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 gồm n (n>1) kí tự giống nhau, chẳng hạn gồm n kí tự "a" đợc ghi thành na Ví dụ xâu 'aaaabbcd' đợc nén thành 4a2bcd Hãy viết chơng trình nén và giải nén (Chú ý các xâu đợc nén phải không có chữ số) Input: Cho 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 đếm các ký tự giống liên tiếp xâu và sử dụng xâu kq để lưu kết tìm xét hết xâu (việc giải nén thực 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; (24) 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) if s1[i]=s1[i-1] then inc(d) else begin str(d,s); if d<>1 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'] begin so:=so+s2[i];inc(i); end; val(so,n,code); if n>1 then for j:=1 to n 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; (25) nen; giainen; close(g); end Dạng 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 xâu đọc các ký tự xâu từ trái sang phải giống từ phải sang trái thì xâu đó gọi là xâu Palinhdrome Với 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 xâu với độ phức tạp O(n), trên sở đó chúng ta giải bài tập khó Bài tập 1: Kiểm tra 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 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 Palindrome: Cho xâu S có độ dài không vượt quá 1000 kí tự; tìm xâu palindrome dài là xâu S - Ý tưởng: Sử dụng phương pháp quy hoạch động cách sử dụng mảng chiều F và giá trị F[i, j] = true/false đoạn gồm các kí tự từ i đến j S có/không là palindrome Ta có công thức là: (26) - F[i, i] = True - F[i, j] = F[i+1, j-1]; ( s[i] = s[j] ) - F[i, j] = False; ( s[i] <> s[j] ) - Đoạn chương trình tham khảo var s:ansistring; n,i,j,d,max,k,csd,csc:longint; {GV giới thiệu thêm kiểu ansistring } F: array[0 1001,0 1001] of boolean; {==========} Begin Write('nhap s:'); readln(s); FillChar( F, sizeof(F), false ); n:=length(s); max:=1; for i := to n F[i, i] := True; for k := to (n-1) for i := to (n-k) begin j := i + k; F[i, j] := ( F[i+1, j-1] ) and (s[i] = s[j] ); end; for i:=1 to n for j:=1 to n begin d:=j-i+1; if (f[i,j]=true) and (d>max) then begin max:=d; csd:=i; csc:=j; end; end; for i:=csd to csc write(s[i]); readln; End 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: (27) Bài tập 1: Viết chương trình nhập số tự nhiên a có n chữ số Hãy tạo số b từ số a cách viết ngược lại các chữ số xuất a Ví dụ: cho a=234 thì b=432 GV: Dựa vào kiến thức kiểu xâu, em nào có thể nêu ý tưởng giải bài toán này? HS: GV: Nhận xét câu trả lời hs, và nêu rõ: để tạo số b từ số a, cách viết ngược lại các chữ số a thì: + tạo xâu rỗng s + cần sử dụng vòng lặp biết trước lùi (giống bài tập phần a) + dùng thủ tục val để đổi xâu kí tự s sang dạng số và gán cho biến value GV yêu cầu hs viết chương trình, sau đó GV chạy chương trình cho học sinh quan sát trên màn hình máy chiếu Gv giải thích và giúp học sinh sửa các lỗi chương trình các em viết Chương trình: Program somoidaonguoc; Uses crt; Var a,bi,code: longint; S1,s2:string; Begin Write(‘nhap so a’); Readln(a); Str(a,s1); S2:=’’; {tạo xâu rỗng s2} For i:=length(s1) downto s2:=s2+s1[i]; Val(s2,b,code); Write(b); Readln; End (28) Bài tập 2: Số nhỏ nhất: Một số nguyên dương n lớn có thể cho P (P20) số nguyên dương A và P xâu ký tự s1, s2, ,sp (độ dài các xâu không vượt quá 255) gồm các số thập phân cách viết s1 liên tiếp A1 lần viết s2 liên tiếp A2 lần, , viết sp liên tiếp Ap lần Giả sử với số n cho trên và cho trước số nguyên dương k nhỏ số chữ số N Hãy tìm cách gạch k chữ số N để nhận số có giá trị nhỏ Ví dụ: Vào Kết p=3, k =11 a1=3, a2 = 4, a3 = s1 = 123, s2=0, s3 = 45 44 - Ý tưởng: Ở bài toán này N là số nguyên lớn nên ta sử dụng xâu để biểu diễn nó, giả sử số n lớn ghép lại m ký tự khác đó sau xóa ta còn lại m-k chữ số n Lần lượt tìm m chữ số nhỏ xâu còn lại ta kết cần tìm Chương trình tham khảo: {$MODE OBJFPC} Var A : array[1 20] of longint; S: array[1 20] of ansistring; {GV giới thiệu thêm kiểu ansistring (chỉ có free pascal mà không có turbo pascal) có kích thước gần 2GB =230 B nên t ường xem là vô hạn} st,kq : ansistring; k,i,p,m,j :longint; Procedure nhap; Begin st:=''; Write('Nhap p '); Readln(p); Write('Nhap k ');Readln(k); For i:=1 to p readln(a[i]); for i:=1 to p readln(s[i]); for i:=1 to p (29) For j:=1 to A[i] st:=st+S[i]; End; Procedure xuly; var m:longint; sm:ansistring; code:integer; Begin j:=0; m:=length(st)-k; Repeat sm:='9'; dec(m); For i:=j+1 to length(st)-m If sm>st[i] then Begin sm:=st[i]; j:=i; End; kq:=kq+sm; Until m=0; Val(kq,m,code); Write(m); End; Begin nhap; xuly; Readln End Bài tập 3: Cho số nguyên dương N, ta tạo số nguyên N1 cách viết liên tiếp các số nguyên từ đến N Ví dụ N = ta có N1 = 1234 Thực việc thu gọn N1 cách xóa tất các chữ số vị trí lẻ, sau đó xóa tất các số vị trí chẵn, lại xóa các chữ số vị trí lẻ, … còn lại chữ số Ví dụ: 1234 ->24-> Chương trình bài tập 3: (30) Program taosonguyen; var s,h:string; i,n:integer; Begin Write('Nhap n='); Readln(n); s:=''; for i:=1 to n begin str(i,h); s:=s+h; end; writeln(s); Repeat for i:=1 to length(s) if i mod 2<>0 then s[i]:=' '; while pos(' ',s)<>0 delete(s,pos(' ',s),1); for i:=1 to length(s) if i mod 2=0 then s[i]:=' '; while pos(' ',s)<>0 delete(s,pos(' ',s),1); Until length(s)<=1; Writeln('KET QUA LA:',S); Readln End Bài tập tự luyện: Bài Cho xâu st gồm các chữ cái Tính số lần xuất chữ cái xuất nhiều lần xâu (không phân biệt chữ hoa và chữ thường) Bài Chuẩn hóa văn Một văn gọi là văn chuẩn hóa nếu: (31) - Hai từ liền có dấu cách - Dấu ngắt câu (dấu chấm, dấu chấm phẩy, dấu chấm hỏi, dấu chấm than) đặt sát vào từ trước nó, sau đó đến dấu cách trống - Dấu mở ngoặc đặt sát vào phía bên trái từ bắt đầu mở ngoặc - Dấu đóng ngoặc đặt sát vào phía bên phải từ cuối cùng đóng ngoặc Hãy viết chương trình kiểm tra và đưa đoạn văn dạng chuẩn Input: vanban.inp Output: vanban.out văn đã chuẩn hóa Bài 3: Viết chương trình chuyển xâu kí tự in hoa thành kí tự thường Gợi ý: - Kí tự in hoa thành kí tự thường - Các kí tự khác các dấu ngoặc giữ nguyên for i:=1 to length(s) if (‘A’<=s[i]) and s[i]<=’Z’ then s[i]:=chr(ord(s[i]+32); else if (‘a’<=s[i]) and s[i]<=’z’ then s[i]:=chr(ord(s[i]-32); Bài 4: Viết chương trình đăng kí account, mật khẩu, sau đó kiểm tra mật và account mà người dùng nhập vào có đúng với đăng kí không - Một số dạng bài tập khác có thể tìm hiểu thêm: + Bài toán tách từ + Bài toán tách họ tên dánh sách + Xâu đối xừng dài + Tìm xâu palindrome dài là xâu S … CHƯƠNG IV: PHƯƠNG PHÁP VÀ KẾT QUẢ NGHIÊN CỨU I PHƯƠNG PHÁP NGHIÊN CỨU: - Phương pháp nghiên cứu + Kết hợp thực tiễn giáo dục trường THPT Lương Tài + Có tham khảo các tài liệu ngôn ngữ lập trình Pascal và tài liệu sáng kiến kinh nghiệm đồng nghiệp (32) - Phương pháp thuyết trình, quan sát, điều tra bản, phân tích kết thực nghiệm sư phạm,v.v… phù hợp với bài học và môn học II KẾT QUẢ NGHIÊN CỨU: - Bảng số liệu kết đạt học sinh lớp 11 năm học 2013-2014 chưa thực đề tài: STT Lớp Sĩ số Đạt yêu cầu Không đạt yêu cầu 11A2 45 73% 27% 11A3 45 65% 35% - Bảng số liệu kết đạt học sinh lớp 11 năm học 2014-2015 sau thực đề tài: STT Lớp 11A2 Sĩ số 45 Đạt yêu cầu 90% Không đạt yêu cầu 10% 11A3 45 88% 12% Trong quá trình trao đổi, thảo luận, trình bày, các em HS thể khả vận dụng, hiểu biết mình nên các em tỏ hăng hái việc giơ tay phát biểu tranh luận Đồng thời tiết học trở nên sinh động và GV không đóng vai trò là người xây dựng lý luận mà học sinh là người chủ động để giải các vấn đề (33) PHẦN III KẾT LUẬN Ngôn ngữ lập trình nói chung đóng vai trò quan trọng việc xây dựng các chương trình ứng dụng để phục vụ cho sống Nhờ phát triển tin học đó các nhà lập trình chuyên nghiệp đóng vai trò không nhỏ mà hầu hết các lĩnh vực xã hội đã ứng dụng tin học để giải công viêc nhanh, hiệu và chính xác Hiện nay, ngôn ngữ lập trình Pascal đã trở thành ngôn ngữ lập trình phổ biến trên giới sử dụng lĩnh vực giảng dạy Trong quá trình giảng dạy các thầy cô có thể đưa các vấn đề lập trình các game nhỏ…để các em có thể chứng tỏ khả mình làm cho HS yêu thích môn học, ham học hỏi và tìm tòi sáng tạo Đề tài này mang tính thực tiễn cao, cụ thể là: tiết học các em học sinh đã chủ động tìm tòi lại kiến thức đã học qua đó giải vấn đề giáo viên đặt Trong quá trình giải vấn đề, giáo viên lỗi mà các em học sinh mắc phải, giúp cho các em hiểu rõ và vận dụng tốt các kiến thức đã học vào giải các bài toán giáo viên đặt Trên đây là toàn kinh nghiệm tôi qua nhiều năm liền dạy Tin học khối 11 tham khảo qua nhiều nguồn thông tin, tư liệu khác nhau, mong đóng góp các đồng nghiệp nhằm giúp đề tài tôi hoàn thiện thêm Tôi xin chân thành cảm ơn! KIẾN NGHỊ: Sau thực đề tài SKKN “Bài tập kiểu xâu”, tôi có số ý kiến sau: - Tăng cường sở vật chất cho phòng thực hành: bổ sung máy tính (tối đa 2hs/máy), phòng thực hành có máy chiếu - Thêm tiết bài tập và thực hành sau bài 12 Kiểu xâu (34) DANH MỤC TÀI LIỆU THAM KHẢO Sách giáo khoa tin học 11 Hồ Sĩ Đàm chủ biên Sách giáo viên tin học 11 Hồ Sĩ Đàm chủ biên Lý thuyết và Bài tập lập trình Pascal 5.5-6.0 Nguyễn Thị Kiều Duyên Ngôn ngữ lập trình Pascal Quách Tuấn Ngọc Turbo Pascal 7.0 PGS-TS Bùi Thế Tâm – Võ Văn Tuấn Dũng Giải bài toán trên máy tính nào 101 thuật toán và chương trình GS-TS Hoàng Kiếm Lê Văn Dũng – Trần khắc Tuấn (NXB Khoa Học Và Kĩ Thuật) Một số sáng kiến kinh nghiệm và ý kiến đồng nghiệp Một số bài tập tham khảo trên Internet (35)