Mà vấn đề đặt ra là chúng ta phải tích cực tìm tòi, sáng tạo trong việc đưa ra những bài toán đó để giúp học sinh có được sự hứng thú, sáng tạo trong học tập để giải quyết vấn đề đưa ra.
Trang 11 MỞ ĐẦU
1.1 Lý do chọn đề tài
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 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ì vậy đò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 gợi động cơ trong học tập bằng việc đổi mới phương pháp dạy học
Là một giáo viên giảng dạy bộ môn này, theo tôi không phải cứ tìm được nhiều bài toán khó, bài toán hay để giảng dạy cho học sinh Mà vấn đề đặt ra là chúng ta phải tích cực tìm tòi, sáng tạo trong việc đưa ra những bài toán đó để giúp học sinh có được sự hứng thú, sáng tạo trong học tập để giải quyết vấn đề đưa ra Xuất phát từ thực tiễn giảng dạy tại trường PT Nguyễn Mộng Tuân, tôi nhận thấy rằng để đạt hiệu quả cao trong mỗi phần học, tiết học cần có phương pháp, đưa ra được ý tưởng và đi xây dựng viết chương trình 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 và phương tiện dạy học cho từng học sinh Để qua mỗi phần học, tiết học, học sinh hứng thú với kiến thức mới, hiểu được kiến thức đã học trên lớp và vận dụng vào thực tiễn
Trong các môn học ở bậc THPT thì Tin học lớp 11 được các em cho là môn học khó hiểu nhất Các em được làm quen với ngôn ngữ lập trình mới Turbo Pascal Trong ngôn ngữ lập trình này các em được làm quen với nhiều kiểu dữ liệu mới, hiểu được các thuật toán cho một bài toán rồi mới đi xây dựng viết chương trình Quả thật đối với các em hết sức khó khăn, từ việc các em chỉ là người sử dụng phần mềm có sẵn như: soạn thảo văn bản, phần mềm Excel, các phần mềm học tập, giải trí … thì các em lạ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
Qua quá trình 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 là không 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 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 dữ liệu kiể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 Qua thực tế công tác hơn 10 năm ở trường, qua học hỏi kinh nghiệm từ đồng nghiệp, với mong muốn phần nào giúp cho học sinh cũng như giáo viên trong việc tìm ra lời giải cho
Trang 2một số bài toán liên quan tới kiểu dữ liệu xâu dễ dàng hơn Để học sinh được rèn luyện các bài tập cơ bản, và từ đó mở rộng các bài toán nâng cao về kiểu xâu dành cho học sinh khá giỏi sẽ cuốn hút học sinh, tạo hứng thú cho học sinh khi học lập trình Vì vậy, tôi xin mạnh dạn giới thiệu đề tài sáng kiến kinh nghiệm mà mình nghiên cứu là: “Mở rộng các bài tập cơ bản về kiểu xâu cho học sinh khá, giỏi ” trong Tin học 11 mà tôi đã áp dụng có hiệu quả trong quá trình giảng dạy
1.2 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 dữ liệu kiểu xâu, đồng thời cung cấp thêm
một số hàm, thủ tục chưa có trong bài 12 sách giáo khoa tin học 11
- 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 Đồng thời 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 đối với môn học được cho là khó và trừu tượng
1.3 Đối tượng nghiên cứu
Sử dụng ngôn ngữ lập trình Turbo Pascal và Free Pascal để tiến hành nghiên cứu các bài toán trên kiểu dữ liệu xâu với đối tượng nghiên cứu là học sinh khối 11 của trường PT Nguyễn Mộng Tuân
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 dạng bài tập lập trình nâng cao theo độ khó dần về bài tập dữ liệu kiêu xâu
1.4 Phương pháp nghiên cứu
Hình thành ở học sinh 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
Để trình bày sáng kiến kinh nghiệm này, tôi đã sử dụng phối kết hợp nhiều phương pháp như: nghiên cứu tài liệu, sách, báo, thuyết trình, quan sát, tham khảo ý kiến của cấp trên và đồng nghiệp, điều tra cơ bản, thực nghiệm so sánh, phân tích kết quả thực nghiệm phù hợp với môn học thuộc lĩnh vực Tin học
2 NỘI DUNG SÁNG KIẾN KINH NGHIỆM 2.1 Cơ sở lý luận của sáng kiến kinh nghiệm
Trong bối cảnh toàn ngành GD-ĐT đang đổ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 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ư
Trang 3vậy, có thể khẳng định đổ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ố dạng bài tập cụ thể và nâng cao
Căn cứ vào mục tiêu của môn Tin học, là phải cung cấp những tri thức cơ bản, làm nền tảng để học sinh có thể tiếp tục đi sâu vào tìm hiểu và xây dựng khoa học Tin học hoặc tiếp thu những tri thức của các lĩnh vực kĩ thuật công nghệ tiên tiến, nhất là các lĩnh vực công nghệ thông tin Môn Tin học, cũng như mọi môn học khác, căn cứ vào mục tiêu trên để xác định ra nhiệm vụ cụ thể của môn học, tổ chức hoạt động đào tạo góp phần thực hiện mục tiêu giáo dục mà Đảng và nhà nước đề ra
Nếu học sinh được rèn luyện các kỹ năng cơ bản về bài tập thì việc mở rộng các bài toán cơ bản về kiểu xâu dành cho học sinh khá giỏi sẽ cuốn hút học sinh, tạo hứng thú cho học sinh khi học lập trình
2.2 Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm
Trước đây khi chưa áp dụng phương pháp giảng dạy bằng giáo án điện tử, hệ thống các bài tập, bài thực hành có nội dung liên hệ được với thực tiễn, học sinh luôn phản ánh với giáo viên rằng những bài tập về kiểu xâu thường trừu tượng và khó hiểu
Tin học là môn học đặc thù có nhiều kiến thức khó như lập trình pascal ở lớp
11, đây là kiến thức thi học sinh giỏi tỉnh nhưng thường bị xem nhẹ, bị xem là “môn phụ” Học sinh và phụ huynh chưa mặn mà, chưa quan tâm đúng mực tới môn học nên việc lựa chọn và bồi dưỡng học sinh giỏi là vô cùng khó khăn Đứng trước một bài toán tin học, học sinh thường lúng túng và không biết tìm thuật toán của bài toán
từ đâu và tìm như thế nào? Một số học sinh khá, giỏi thì có thói quen là mò mẫm và thử nghiệm để tìm lời giải, điều đó có thể dẫn tới kết quả đúng hoặc sai hoặc chệch hướng giải quyết bài toán, hiệu suất để tìm thuật toán như thế là không cao, một số học sinh kém hơn thì không biết cách tìm thuật toán từ đâu và điều đó gây tâm lý chán nản cho các em Với tình hình ấy để giúp học sinh định hướng tốt hơn trong quá trình tìm thuật toán, trước khi có thể tự tìm được thuật toán tốt hơn thì người giáo viên cần tạo cho học sinh thói quen tìm thuật toán cho bài toán khó hơn từ các các bài toán cơ bản quen thuộc mà các em đã biết, khai thác các yếu tố đặc trưng của một số bài toán
cơ bản để tìm thuật toán cho các bài toán nâng cao
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 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 Và đó cũng là bước cơ bản
để tạo tiền đề trong việc lựa chọn học sinh để bồi dưỡng học sinh giỏi với chuyên đề
và bài tập kiểu xâu
2.3 Giải pháp đã sử dụng để giải quyết vấn đề
2.3.1 Giới thiệu kiến thức cơ bản về kiểu xâu
a Khai báo xâu:
Trang 4- Xâu là một dãy 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 xâu được gọi là độ dài xâu Xâu có độ dài bằng 0 gọi là xâu rỗng
- Để khai báo dữ liệu kiểu xâu ta sử dụng tên dành riêng String, tiếp theo là độ dài lớn nhất của xâu
Var <tên biến>:string [độ dài lớn nhất của xâu];
Ví dụ: Var hocsinh:string[28];
- 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
- 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
- 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
b 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 một
VD: ‘hoc ’ + ‘sinh’ cho kết quả ‘hocsinh’
- 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: ‘Ha Noi’ > ‘Ha Nam’
(111 kí tự) (97 kí tự)
+ Xâu B là đoạn đầu của xâu A
VD: ‘Xau ki tu’ > ‘Xau’
+ A=B nếu xâu A và B giống nhau hoàn toàn
VD: ‘tin’= ‘tin’, ‘tin’<> ‘TIN’
c Một số thủ tục xử lý xâu:
Delete(s,vt,n) Xóa n kí tự của xâu S bắt đầu
từ vị trí vt
S= ‘Song Hong’
Delete(S,1,5)= ‘Hong’
Insert(s1,s2,vt) Chèn xâu s1 vào s2, bắt đầu ở
vị trí vt
S1= ‘1’; S2= ‘Hinh 2’ Insert(S1,S2,6)= ‘Hinh 1.2’
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:=‘2019’
str(n,s)= ‘2019’
val(s,value,code) đổi xâu kí tự s sang dạng số và VD: val(‘198’,value,code)
Trang 5gá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
lúc này code=0 và value=198
d M t s h m: ột số hàm: ố hàm: àm:
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ị ch
2.3.2 Các dạng bài tập cơ bản về kiểu xâu
Bài tập 1: 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”
* GV gợi ý cho HS cách viết chương trình theo dàn ý sau:
{Phần khai báo}
BEGIN
{Nhập 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 xâu S kết quả
END
Trang 6Viết chương trình:
Program baitap1;
Var vt:byte;
S:string;
Begin
Write(‘Nhap vao mot xau: ’); readln(s);
While pos(‘anh’,s) <> 0 do Begin
Vt:=pos(‘anh’,s);
Delete(s,vt,3);
Inset(‘em’,s,vt);
End;
Write(s);
Readln End
Bài tập 2: Nhập 1 xâu S từ bàn phím (S<=100), đư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: ‘Tinhoc’
Output: ‘cohniT’
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?
* Ý tưởng:
- Để 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?
- GV gọi học sinh lên bảng viết chương trình, 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 100 kí tự)
* Viết chương trình:
Program xaunguoc;
Var S: String[100]; i:Byte;
Begin
Write(‘Nhap xau S: ‘); Readln(S);
For i:=length(S) downto 1 do write(S[i]);
Write(‘Xau nguoc cua xau la: ‘, S);
Readln;
End
Bài tập 3: Nhập 1 xâu S từ bàn phím (S<=50), đưa ra màn hình xâu S nhưng mỗi kí
tự viết trên 1 dòng ngược lại với xâu S
Trang 7VD: Input: ‘Tinhoc’
Output: c o
h
n i T
Đa số học sinh còn chưa nắm được dùng write và writeln khi nào, mục đích của bài tập này đưa ra nhằm củng cố cho học sinh sử dụng thành thạo write và writeln và sự khác biệt của nó
Chương trình mà em học sinh đã sửa như sau:
Program baitap3;
Uses Crt;
Var S: String[50];
i:Byte;
Begin
Clrscr;
Write(‘Nhap xau S: ’);
Readln(S);
Write(‘ketqua la:’);
For i:= length(S) downto 1 do writeln(S[i]:30);
Readln;
End
* GV đặt câu hỏi: Khi đưa ra màn hình xâu S nhưng mỗi kí tự viết trên 1 dòng
Chương trình viết giống trên chỉ khác lệnh:
For i:=1 to length(S) do write (S[i]:15);
Khi chạy chương trình 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ó
ít mà đã có kết quả rất thú vị, các em thấy được 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 3 mở rộng
Program baitap3;
Uses Crt;
Var St: String[25];
i:Byte;
Begin
Write(‘Nhap xau S: ‘);
Trang 8Write(‘ketqua la:’);
Textcolor(2);
For i:= length(S) downto 1 do writeln(S[i]:15);
Readln;
End
2.3.3 Dạng bài tập nâng cao về 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 tập 1: Tìm số
Cho trước một xâu kí tự, trong đó có ít nhất 5 chữ số Hãy thực hiện xóa các kí
tự chữ số sao cho 5 kí tự cuối cùng tạo thành số lớn nhất
Dữ liệu vào: Cho trong tệp timso.inp
Dữ liệu ra: Ghi ra tệp timso.out
* Ý tưởng:
- Xóa các kí tự chữ cái xuất hiện trong xâu
- Thực hiện xóa các kí tự số chỉ giữ lại 5 số để tạo thành số lớn nhất bằng cách lần lượt đi tìm 4 chữ số lớn nhất có trong xâu còn lại
* Chương trình Timso như sau:
Program baitap5;
Const fi=’timso.inp’;
fo=’timso.out’;
Procedure xuli;
Var i,j,k:byte;
Begin
i:=1;
Repeat
If s[i] in [‘0’ ‘9’] inc(i) else delete(s,i,1);
Until i>length(s);
For i:=1 to 5 do
Begin
k:=i;
for j:=i to length(s)+i-5 do
if s[k]<s[j] then k:=j;
if k>i then delete(s,i,k-i);
end;
writeln(copy(s,1,5));
Trang 9BEGIN
Assign(input,fi);reset(input);
Assign(output,fo);rewrite(output);
Read(s);
Xuli;
Close(input);
Close(output);
END
Bài tập 2: 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 :ụ:
* Ý tưởng:
- Duyệt từ đầu xâu đến cuối xâu, gặp hai kí tự liên tiếp khác nhau thì xóa đi một
kí tự
- Ban đầu gán:i:=1; j:=2; {so sánh hai phần tử liên tiếp trong xâu}
- Khi kí tự đầu giống kí tự thứ 2: ta thực hiện xóa và dịch chuyển kí tự thứ hai
- Khi kí tự đầu khác kí tự thứ hai thì: i:=j; j:=j+1;
- Ta được xâu p là xâu sau khi đã xóa các kí tự trùng
* Viết chương trình:
Program rutgon;
Const fi=’trung.inp’;
fo=’trung.out’;
Var s,p:string;
i,j,n:integer;
BEGIN
Assign(input,fi); reset(input);
Assign(output,fo);rewrite(output);
P:=’’;
Read(s);
i:=1;
j:=2;
n:=length(s);
while j<n do
begin
Trang 10while s[i]=s[j] do
begin
delete(s,j,1);
j:=j+1;
end;
while s[i]<>s[j] do
begin
p:=p+s[i];
i:=j;
j:=j+1;
end;
write(p);
close(input);
close(output);
END
Bài tập 3: Kí tự khác nhau
Cho xâu S (có độ dài vượt không quá 106) chỉ gồm các kí tự từ ‘a’ đến ‘z’ Cho biết có bao nhiêu loại kí tự xuất hiện trong s và đưa ra một kí tự xuất hiện nhiều nhất trong s cùng với số lần xuất hiện của kí tự đó
* Ý tưởng:
- Với xâu có độ dài tối đa 106 ta sẽ sử dụng khai báo kiểu xâu ansistring
- Sử dụng mảng đánh dấu B[‘a’ ’z’] of longint để đếm số lần xuất hiện các kí
tự trong xâu S với B[ch]=d có nghĩa là kí tự ch xuất hiện d lần
- Lần theo các kí tự của mảng B ta được số lượng các kí tự khác nhau (tức số lượng phần tử có giá trị khác 0 trong mảng B) và tìm giá trị lớn nhất của mảng B ta sẽ tìm được kí tự xuất hiện nhiều lần nhất
* Viết chương trình :
Program kitu;
Var s:ansistring;
B:array[‘a’ ’z’] of longint;
Procedure nhap;
Begin
Write(‘nhap xau s: ’);
Readln(s);
End;
Procedure xuli;
Var ch,kt:char;
i.max,dem:longint;
begin
for ch:=’a’ to ‘z’ do b[ch]:=0;
for i:=1 to length(s) do inc(b[s[i]]);