chuyên đề thống kế kiến thức căn bản về dữ liểu kiểu xâu. Một số bài tập về dữ liệu kiểu xâu được lập trình trên ngôn ngữ TP. Chuyên đề hệ thống các thao tác xử lý xâu. Giải quyết một số bài tập từ đơn giản đến nâng cao về dữ liệu kiểu xâu, tệp. Chuyên đề sử dụng tốt cho giáo viên Tin học THPT tham khảo để giảng dạy cũng như học tập.
Trang 1PHẦN 1: MỞ ĐẦU
1.1 Lí do chọn đề tài 3
1.2 Mục đích nghiên cứu 3
1.3 Phạm vi nghiên cứu 4
PHẦN 2: KIỂU XÂU – MỘT SỐ BÀI TẬP LIÊN QUAN ĐẾN XÂU 2.1 Kiến thức cơ bản về kiểu xâu 5
2.1.1 Khái niệm xâu 5
2.1.2 Khai báo biến xâu 5
2.1.3 Một số thao tác xử lí xâu 6
2.2 Một số bài tập liên quan đến kiểu xâu 10
2.2.1 Bài tập xử lí xâu trong sách giáo khoa Tin học 11 10
2.2.2 Bài tập xử lí xâu trong sách bài tập Tin học 11 13
2.2.3 Một số bài tập nâng cao về xâu 17
2.3 Áp dụng vào thực tế giảng dạy tại trường THPT Chu Văn An 24
PHẦN 3: KẾT LUẬN VÀ KHUYẾN NGHỊ 26
PHẦN 4: TÀI LIỆU THAM KHẢO 27
Trang 2PHẦN 1: MỞ ĐẦU 1.1 Lí do chọn đề tài:
Chương trình tin học phổ thông nói chung và chương trình tin học lớp 11 nói riêng có mục tiêu nhằm cung cấp cho học sinh những kiến thức cơ bản về lập trình, hình thành và phát triển khả năng tư duy thuật toán, năng lực sử dụng các thành tựu của ngành khoa học này trong học tập và trong các lĩnh vực hoạt động khác Trang bị cho học sinh một cách tương đối có hệ thống các khái niệm cơ bản nhất ở mức phổ thông về Tin học - một ngành khoa học với những đặc thù riêng - các kiến thức về khai báo, về câu lệnh, về cấu trúc
dữ liệu, của ngôn ngữ lập trình nói chung và ngôn ngữ lập trình Turbo Pascal - ngôn ngữ lập trình học đường nói riêng
Mặc dù chỉ là các kiến thức cơ bản, tuy nhiên chương trình tin học 11 là khó đối với học sinh Hơn nữa đây không phải là môn thi tốt nghiệm và thi đại học Điều này phần nào gây khó khăn cho giáo viên khi truyền đạt kiến thức và học sinh khi xác định mục tiêu đối với môn học Với học sinh, học lập trình có thể được xem như là học một “ngoại ngữ” giúp giao tiếp với “máy tính” Trong nội dung chương trình, bài kiểu xâu là một nội dung hay nhưng lại khó giảng cho học sinh Chính vì vậy, qua một số năm giảng dạy, tôi đã sưu tầm được một số bài tập liên quan đến kiểu xâu từ mức độ đơn giản đến phức tạp Hệ thống bài tập này sẽ giúp giáo viên giảng dạy tốt hơn khi dạy cho học sinh về kiểu xâu
1.2 Mục đích nghiên cứu:
Qua thực tế giảng dạy, tôi nhận thấy khi tới bài kiểu xâu, người giáo viên rất khó dạy còn học sinh thì khó tiếp thu Với bản thân tôi, tôi luôn phải tìm tòi các bài tập sao cho từ đó học sinh tự nhận ra được kiến thức và hơn hết là giúp cho các em thực sự say mê đối với bộ môn Tin học Từ đó hiệu quả giảng dạy và học tập sẽ tốt hơn rất nhiều
Từ thực tế trải qua gần mười năm công tác tại trường THPT Chu Văn
An, Thái Nguyên tôi đã sưu tầm và hệ thống được một số bài tập liên quan đến kiểu xâu Hi vọng với hệ thống bài tập liên quan đến kiểu xâu này, phần
Trang 3nào giúp cho người giáo viên khi giảng dạy, cho học sinh khi học tập về lập trình với kiểu xâu.
1.3 Phạm vi nghiên cứu:
Với những suy nghĩ và nhận xét như trên tôi mạnh dạn viết chuyên đề
sáng kiến kinh nghiệm: “Kiểu xâu và một số bài tập liên quan đến xâu”
Chuyên đề này của tôi gồm hai nội dung chính:
- Nội dung thứ nhất: Kiến thức cơ bản về kiểu xâu
- Nội dung thứ hai: Một số bài tập liên quan đến kiểu xâu
+ Nhóm bài tập 1: Các bài toán xử lí xâu trong sách giáo khoa+ Nhóm bài tập 2: Các bài toán xử lí xâu trong sách bài tập+ Nhóm bài tập 3: Một số bài tập xử lí xâu nâng cao
Trang 4PHẦN 2 : NỘI DUNG
KIỂU XÂU – MỘT SỐ BÀI TẬP LIÊN QUAN ĐẾN XÂU
Chuyên đề sử dụng ngôn ngữ lập trình Pascal để tìm hiểu về kiểu xâu
và giải quyết các bài toán về xâu
2.1 KIẾN THỨC CƠ BẢN VỀ KIỂU XÂU
2.1.1 Khái niệm xâu:
* Khái niệm: Xâu là dãy kí tự trong bộ 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 gọi là xâu rỗng
* Ví dụ:
‘Tin hoc 11’ ‘le thi thanh van’ ‘Lop 11A1’
* Quy tắc, cách thức xác định kiểu xâu:
- Tên kiểu xâu
- Cách khai báo biến kiểu xâu
- Số lượng kí tự của xâu
- Các phép toán thao tác với xâu
- Cách tham chiếu tới phần tử của xâu
2.1.2 Khai báo biến xâu:
* Cú pháp khai báo:
Var <Tên biến>:string[<độ dài lớn nhất của xâu>];
Trong đó: var, string là từ khóa
Tên biến: là tên do người lập trình đặt, tuân theo quy tắc đặt tên
độ dài lớn nhất của xâu: có thể là các giá trị 1, 2, 255
* Ví dụ:
Var ten:string[10]; lop:string[6]; Biến xâu ten có thể nhận giá trị xâu không
quá 10 kí tự, biến lop có thể nhận giá trị xâu có độ dài không quá 6 kí tự
Var s:string; t:string[255]; Biễn xâu s và t đều có thể nhận giá trị xâu
có độ dài không quá 255 kí tự
Trang 52.1.3 Một số thao tác xử lí xâu
2.1.3.1 Gán giá trị cho biến xâu:
a) Gán giá trị từ bàn phím cho biến xâu:
* Cú pháp:
Read(<tên biến xâu>);
Hoặc Readln(<tên biến xâu>);
* Ví dụ: Readln(ten); read(lop); readln(s);
b) Sử dụng câu lệnh gán:
* Cú pháp:
<tên biến xâu>:=<biểu thức>;
Với biểu thức ở vế phải có thể là hằng xâu, có thể là một biểu thức nào đó trả
S:=ten + ‘ hoc lop ’ + lop;
Kết quả: S nhận giá trị ‘Lan hoc lop 11A1’
Trang 6- 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 là nhỏ hơn B.
* Ví dụ:
‘May tinh’ <’May tinh cua toi’
‘Tin hoc’=’Tin hoc’; ‘Tin hoc’<>’tin hoc’;
‘Le mai’ < ‘‘Le hoa’
2.1.3.4 Một số hàm liên quan đến xâu
Hàm luôn trả về một giá trị nào đó, do vậy các hàm có thể tham gia vào các biểu thức tương ứng hoặc phải lưu giá trị mà hàm trả về vào biến
a) Hàm copy:
* Cách sử dụng: copy(s,vt,n)
Với: s là biến xâu hoặc hằng xâu, vt,n: thuộc kiểu nguyên
* Ý nghĩa: Sao chép n kí tự trong xâu s bắt đầu từ vị trí vt Vậy hàm copy trả
về 1 giá trị thuộc kiểu xâu
* Ví dụ: s:=’tin hoc’; t:=copy(s,5,3); Kết quả t =‘hoc’
b) Hàm length:
* Cách sử dụng: length(s)
Với: s là biến xâu hoặc hằng xâu
* Ý nghĩa: lấy độ dài của xâu s Vậy hàm length trả về 1 giá trị thuộc kiểu nguyên
* Ví dụ: s:=’tin hoc’; k:=length(s); kết quả k =7
c) Hàm pos:
* Cách sử dụng: pos(s1,s2)
Với: s1, s2 là biến xâu hoặc hằng xâu
* Ý nghĩa: lấy vị trí xuất hiện đầu tiên của s1 trong s2 Vậy hàm pos trả về 1 giá trị thuộc kiểu nguyên
* Ví dụ: s:=’tin hoc’;t:=’hoc’; k:=pos(t,s); kết quả k =5
d) Hàm upcase:
* Cách sử dụng: upcase(ch)
Với: ch là biến kí tự hoặc hằng kí tự
Trang 7* Ý nghĩa: Chuyển 1 kí tự thành 1 kí tự in hoa tương ứng Vậy hàm upcase trả
về 1 giá trị thuộc kiểu kí tự
* Ví dụ: ch:=’a’; ch1:=upcase(ch); kết quả ch1 =’A’
e) Hàm chr:
* Cách sử dụng: chr(x)
Với: x là biến hoặc hằng thuộc kiểu byte
* Ý nghĩa: Trả về 1 kí tự ứng có mã là x trong bộ mã ASCII Vậy hàm chr trả
về 1 giá trị thuộc kiểu kí tự
* Ví dụ: x:=65; ch1:=chr(x); kết quả ch1 =’A’
f) Hàm ord:
* Cách sử dụng: ord(ch)
Với: ch là biến kí tự hoặc hằng kí tự
* Ý nghĩa: Cho giá trị mã ASCII thập phân của kí tự tương ứng của ch Vậy hàm ord trả về 1 giá trị thuộc kiểu byte
* Ví dụ: ch:=’A’; k:=ord(ch); kết quả k =65
g) Hàm pred :
* Cách sử dụng: pred(ch)
Với: ch là biến kí tự hoặc hằng kí tự
* Ý nghĩa: trả về 1 kí tự đứng ngay trước kí tự ch trong bộ mã ASCII Vậy hàm pred trả về 1 giá trị thuộc kiểu kí tự
* Ví dụ: x:=’D’; ch:=pred(x); kết quả ch =’C’
h) Hàm succ:
* Cách sử dụng: succ(ch)
Với: ch là biến kí tự hoặc hằng kí tự
* Ý nghĩa: Lấy kí tự đứng liền sau kí tự ứng với giá trị hiện thời của ch trong
bộ mã ASCII Vậy hàm succ trả về 1 giá trị thuộc kiểu kí tự
* Ví dụ: ch:=’a’; ch1:=succ(ch); kết quả ch1 =’b’
2.1.3.5 Một số thủ tục liên quan đến xâu
Thủ tục chỉ thực hiện một việc nào đó và không trả về giá trị nào nên
có thể sử dụng thủ tục như một lệnh
Trang 8a) Thủ tục delete:
* Cách sử dụng: delete(s,vt,n);
Với: s là biến xâu vt,n: thuộc kiểu byte
* Ý nghĩa: Thực hiện xóa n kí tự trong xâu s bắt đầu từ vị trí vt Kết quả làm giá trị của biến s bị thay đổi
* Ví dụ: s:=’tin hoc’; delete(s,6,1); kết quả s =’tin hc’
b) Thủ tục insert:
* Cách sử dụng: insert(s1,s2,vt);
Với: s1 là biến xâu hoặc hằng xâu S2 là biến xâu vt: thuộc kiểu byte
* Ý nghĩa: Thực hiện chèn xâu s1 vào xâu s2 bắt đầu từ vị trí vt Kết quả làm giá trị của s2 bị thay đổi
* Ví dụ: s:=’tin hoc’; insert(‘*’,s2,4); kết quả s =’tin* hoc’
c) Thủ tục inc:
* Cách sử dụng: inc(ch);
Với: ch là biến kí tự
* Ý nghĩa: Thực hiện lấy kí tự đứng liền sau kí tự ứng với giá trị hiện thời của
ch trong bộ mã ASCII và ghi vào ch Thủ tục inc làm thay đổi giá trị của ch
* Ví dụ: ch:=’a’; inc(ch); kết quả ch =’b’
* Ví dụ: ch:=’c’; dec(ch); kết quả ch =’b’
Trang 92.2 MỘT SỐ BÀI TẬP LIÊN QUAN ĐẾN KIỂU XÂU
2.2.1 Bài tập xử lí xâu trong sách giáo khoa Tin học 11
Bài 1: Nhập họ tên của hai người vào từ bàn phím Đưa ra màn hình họ tên
dài hơn, nếu bằng nhau thì đưa ra họ tên nhập sau
Chương trình:
Var ten1,ten2:string[50];
Begin
Write(‘nhap ho ten nguoi thu nhat: ’); readln(ten1);
Write(‘nhap ho ten nguoi thu hai: ’); readln(ten2);
If length(ten1) > length(ten2) then write(ten1) else write(ten2); Readln
End.
Bài 2: Nhập hai xâu vào từ bàn phím Chuyển hai xâu đó sang chữ in hoa rồi
đưa ra màn hình Sau đó kiểm tra xem kí tự đầu tiên của xâu thứ nhất có trùng với kí tự cuối cùng của xâu thứ hai không?
Chương trình:
Var s1,s2:string; i:byte;
Begin
Write(‘nhap xau thu nhat: ’); readln(s1);
Write(‘nhap xau thu hai: ’); readln(s2);
For i:=1 to length(s1) do s1[i]:=upcase(s1[i]);
For i:=1 to length(s2) do s2[i]:=upcase(s2[i]);
Bài 3: Nhập một xâu vào từ bàn phím Kiểm tra xem xâu đó có đối xứng
không? (xâu đối xứng: đọc từ trái qua phải giống đọc từ phải qua trái)
For i:=1 to length(s) do t:=s[i]+t;
If t=s then writeln(‘Xau ‘,s,’ doi xung’) else writeln(‘Xau ‘, s,‘ khong doi xung’);
Readln End.
Trang 10Bài 4: Nhập một xâu vào từ bàn phím Đưa ra màn hình xâu đó sau khi xóa
hết các kí tự cách nếu có
Chương trình:
Var s:string; i:byte;
Begin
Write(‘nhap xau can xu ly: ’); readln(s);
While pos(‘ ‘,s) <>0 do delete(s,pos(‘ ‘,s),1);
writeln(‘Xau da loai bo ki tu cach: ‘, s);
Readln End.
Bài 5: Nhập xâu s1 vào từ bàn phím Tạo xâu s2 gồm các chữ số có trong s1
Đưa ra màn hình lần lượt hai xâu s1, s2
For i:=1 to length(s1) do
If (s1[i]>’0’) and (s1[i]<’9’) then s2:=s2+s1[i];
writeln(‘Xau s1: ‘, s1);
writeln(‘Xau s2: ‘, s2);
Readln End.
Bài 6: Nhập một xâu kí tự s vào từ bàn phím Thông báo ra màn hình số lần
xuất hiện của mỗi chữ cái tiếng Anh trong s (không phân biệt chữ hoa hay thường)
Ý tưởng: - Nhập xâu s, chuyển xâu s thành xâu chứa các kí tự in hoa.
- Sử dụng mảng d[‘A’ ’Z’] chứa các số nguyên
- d[s[i]]:=d[s[i]]+1 nếu s[i]>=’A’ và s[i]<=’Z’ với i = 1, length(s)Chương trình:
Var s:string; i:byte; j:char;
Trang 11Bài 7: Nhập vào từ bàn phím xâu s Thay thế tất cả các cụm kí tự ‘anh’ bằng
cụm kí tự ‘em’
Ý tưởng: - Sử dụng hàm pos để tìm vị trí cần chèn, cần xóa
- Thực hiện chèn thêm xâu ‘em’ bằng thủ tục insert, rồi mới tiến hành xóa xâu ‘anh’ trong xâu s bằng thủ tục delete
Delete(s, pos(‘anh’,s),3);
End;
writeln(‘Xau moi la: ’, s);
Readln End.
Bài 8: Viết chương trình đọc một xâu từ file in.txt Hãy cho biết trong xâu đó
có bao nhiêu chữ số mỗi loại? Kết quả ghi ra file out.txt?
Ví dụ
Nam 2014 co 365 ngay, thang 2 co 28 ngay 0: 1
1: 12: 33: 14: 15: 16: 18: 1Chương trình
Var a:array[‘0’ ’9’] of byte; s:string; f:text; j:char;
Trang 122.2.2 Bài tập xử lí xâu trong sách bài tập Tin học 11
Bài 1: (4.40- Tr45) File in.txt chứa họ tên của một người Viết chương trình
thực hiện chuẩn hóa tên cho đúng chính tả Ghi kết quả ra file out.txt
Reset(f); readln(f,s); close(f);
While pos(s,’ ‘)>0 do Delete(s,pos(s,’ ‘),1);
If s[1]=’ ‘ then delete(s,1,1);
If s[length(s)]=’ ‘ then delete(s,length(s),1);
For i:=1 to length(s)-1 do
If (s[i]=’ ‘) and (s[i+1]<>’ ‘) then s[i+1]:=upcase(s[i+1]);
Assign(f,’out.txt’); rewrite(f);
Write(f,s); close(f);
End
Bài 2: (4.27 – Tr 38) Để giữ bí mật người ta phải mã hóa các thông tin trước
khi truyền đi hoặc lưu trữ Một trong những cách mã hóa sớm nhất được sử dụng rộng rãi thời cổ đại là cách mã hóa do Xê Da đề xuất: trong thông điệp, người ta thay mỗi chữ cái bằng chữ cái đứng sau nó k vị trí trong bảng chữ cái Việc tìm kiếm thay thế được tiến hành vòng tròn theo bảng chữ cái Nếu bảng chữ cái có n chữ, thì sau chữ cái thứ n-1 là chữ cái n, sau chữ cái n là chữ cái thứ nhất, Cách mã hóa này được gọi là mã hóa Xê Da Các kí tự ngoài bảng chữ cái vẫn được giữ nguyên
Ví dụ: Với k = 2, thì xâu ‘TIN HOC’ được mã hóa thành ‘VKP JQE’
Hãy lập trình đọc số nguyên k, xâu s từ file goc.txt (hàng 1: số k, hàng 2: xâu cần mã hóa), sau đó ghi xâu đã mã hóa ra file ma.txt
Chương trình
Var s:string; i,k:byte; f:text;
Begin
Trang 13Assign(f,'d:\goc.txt'); reset(f); readln(f,k); readln(f,s);
close(f);
For i:=1 to length(s) do
if (s[i]<='z') and (s[i]>='A') then
if (ord(s[i])+k) <= ord('z') then s[i]:=char(ord(s[i])+k) else s[i]:=char((ord(s[i])+k)-ord('z')+ord('A'));
Assign(f,'d:\ma.txt'); rewrite(f); writeln(f,s); close(f);
End.
Bài 3: (4.37- Tr 44) Tên các tháng trong một năm là Giêng, Hai, Ba, Tư,
Năm, Sáu, Bảy, Tám, Chín, Mười, Một, Chạp Ba tháng đầu tiên trong năm là
là mùa Xuân, ba tháng tiếp theo là mùa Hè, sau đó là ba tháng mùa Thu, và cuối cùng là ba tháng mùa Đông Hãy lập trình
- Nhập tên một tháng âm lịch từ bàn phím (tiếng Việt không dấu)
- Đưa ra màn hình mùa của tháng đó (tiếng Việt không dấu)
for i:=1 to length(s) do s[i]:=upcase(s[i]);
if (s='GIENG')or (s='HAI') or (s='BA') then k:=1
1: writeln('Thang ',t,' thuoc mua Xuan');
2: writeln('Thang ',t,' thuoc mua He');
3: writeln('Thang ',t,' thuoc mua Thu');
4: writeln('Thang ',t,' thuoc mua Dong');
end;
readln
end.
Bài 4: (4.38 - Tr 44) Rô-bốt được điều khiển bằng chương trình Mỗi lệnh
trong chương trình là một chữ cái trong tập {E, W, S, N}, trong đó E: dịch sang hướng Đông, W: dịch sang hướng Tây, S: dịch sang hướng Nam, N: dịch sang hướng Bắc Chương trình là một xâu chỉ chứa các kí tự trong tập đã nêu Người ta thử nghiệm Rô-bốt trên một sa bàn bằng phẳng, không có chướng ngại vật Rô-bốt được đặt ở điểm có tọa độ (0,0) Trục OX hướng về
Trang 14phía Đông, trục OY hướng lên phía Bắc Thử nghiệm thỏa mãn các yêu cầu sau:
- Đưa Rô-bốt về vị trí có tọa độ (x,y) với x,y là số nguyên ≤ 100;
- Trong chương trình phải có đầy đủ các lệnh E, W, S, N
- Mỗi lệnh có thể được sử dụng nhiều lần
Hãy viết đoạn chương trình:
Bài 5: (4.42 - Tr 46) Người ta xâu N viên đá quý kích thước giống nhau thành
một vòng đeo cổ (5≤ N ≤ 120), mỗi viên có một màu trong số các màu được đánh số từ 1 đến 9 Để tăng tính độc đáo cho vòng trang sức quý này, người ta định lắp khóa đeo theo vị trí sao cho khi mở vòng ta được một dây đá quý có tính chất không phụ thuộc vào việc cầm đầu dây nào bên tay phải và đầu kia bên tay trái (tức tạo thành một xâu đối xứng), ta đều được một chuỗi hạt giống nhau, tức là viên đá thứ i từ trái sang luôn có màu j không phụ thuộc vào cách cầm
Trang 15Ví dụ:
Hãy:
- Khai báo biến và kiểu dữ liệu cần sử dụng
- Xác định số vị trí khác nhau có thể mắc khóa tháo lắp vòng
Chương trình:
var s:string; k,dem,i:byte;
{Ham lay xau doi xung}
Trang 162.2.3 Một số bài tập nâng cao về xâu
Bài 1: Viết thủ tục chuẩn hóa một xâu? Biết xâu chuẩn là xâu thỏa mãn:
- không có kí tự cách ở đầu xâu và cuối xâu
- Giữa các từ chỉ có một kí tự cách
Ý tưởng: - Xóa 1 kí tự cách nếu có 2 kí tự cách liền nhau trong xâu
- Xóa 1 kí tự ở đầu và cuối xâu nếu đó là kí tự cách
Bài 2: Viết thủ tục đếm số từ có trong xâu?
Ý tưởng: - Xóa hết kí tự cách ở đầu xâu
- Duyệt từ đầu đến cuối xâu: nếu 2 kí tự liền nhau thỏa mãn kí tự trước là kí tự cách, kí tự sau là khác kí tự cách thì tăng biến đếm lên 1 đơn vị
if t[1]<>’ ‘ then t:=’ ‘+t; {ghep them ki tu cach o dau xau}
for i:=1 to length(t)-1 do
if t[i]=’ ‘ and (t[i+1]<>’ ‘) then tg:=tg+1;
demtu:=tg;
End;
Bài 3: Tệp in.txt thuộc thư mục gốc ổ D có 2 dòng, mỗi dòng chứa một số
nguyên có độ dài không quá 255 chữ số Viết chương trình đọc 2 số từ tệp in.txt rồi tính tổng hai số đó và ghi ra tệp out.txt ở thư mục gốc ổ D