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.. GV chạy chương trình hoặc sửa chương trình của bài
Trang 2- 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 Yen Dung so 1’, xâu S có số kí tự 18 =>độ dài xâu s bằng 18
- 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: <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
2 Khai báo: Var <tên biến xâu>: 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 16bit 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);
4 Các thao tác xử lí xâu
a 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: ‘Yen Dung’ + ‘so 1’ cho kết quả ‘Yen Dungso 1’
‘Yen Dung’ + ‘ ’ + ‘so 1’ cho kết quả ‘Yen Dung so 1’
b 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ã ASCIIlớ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’, ‘yen’ < ‘yen dung’
- A=B nếu xâu A và B giống nhau hoàn toàn
Trang 3- 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
d Một số hà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
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ụ:
II PHƯƠNG PHÁP GIẢI CÁC DẠNG BÀI TẬP ĐIỂN HÌNH
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: 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 đó
Trang 4GV 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ữanế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)
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 quansá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 trongbà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: ‘thptyd1’
hptyd1Phầ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àytô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ácbiệ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
Trang 5GV 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ànhì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
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
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
Trang 6Khi 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ệntrê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 HSviế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áccâu lệnh trong 2 thủ tục
Procedure catdan(s1:st79; var s2:st79);
Trang 7Ở 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 chohiệ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ẩusai 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úpcá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
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êninternet đều phải đăng nhập
2 Dạng 2: Biến đổi xâu
Trang 8Việ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
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énthà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ố)
Trang 9Input: Cho trong tệp string.INP
Output: Ghi vào tệp String.Out
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 đượccho đế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
for i:=2 to length(s1) do
if s1[i]=s1[i-1] then inc(d)
Trang 103 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
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 đoạn gồm các kí tự từ i đến j của S có/không là palindrome
Ta có công thức là:
- F[i, i] = True
- F[i, j] = F[i+1, j-1]; ( nếu s[i] = s[j] )
- F[i, j] = False; ( nếu 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 }
Trang 114 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:
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 ra số mới b từ số a bằng cách
viết ngược lại các chữ số xuất hiện trong a
+ cần sử dụng vòng lặp biết trước lùi (giống bài tập 2 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 sẽ chạy chương trình cho học sinh quan sát trên mànhì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
Trang 12Bài tập 2: Số nhỏ nhất: Một số nguyên dương n rất lớn có thể được cho bởi 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) chỉ gồm các sốthập phân bằng cách viết s1 liên tiếp A1 lần rồi 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 được cho như trên và cho trước số nguyên dương k nhỏ hơn số chữ số của N.Hãy tìm cách gạch đi k chữ số của N để nhận được một số có giá trị nhỏ nhất
Ví dụ:
p=3, k =11a1=3, a2 = 4, a3 = 2s1 = 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
được ghép lại bởi m ký tự khác nhau khi đó sau khi xóa ta còn lại m-k chữ số trong n Lần lượt đitìm m chữ số nhỏ nhất trong xâu còn lại ta được kết quả 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ó trong free pascal mà không
có trong turbo pascal) có kích thước gần 2GB =230 B nên t ường được xem là vô hạn}
For i:=1 to p do readln(a[i]);
for i:=1 to p do readln(s[i]);
Trang 13Bài tập 3: Cho số nguyên dương N, ta tạo ra số nguyên N1 bằng cách viết liên tiếp nhau các số
nguyên từ 1 đến N Ví dụ N = 4 ta có N1 = 1234 Thực hiện việc thu gọn N1 bằng cách xóa tất cảcác chữ số ở vị trí lẻ, sau đó xóa tất cả các số ở vị trí chẵn, rồi lại xóa các chữ số ở vị trí lẻ, … chođến khi chỉ còn lại một chữ số
for i:=1 to length(s) do
if i mod 2<>0 then s[i]:=' ';
while pos(' ',s)<>0 do delete(s,pos(' ',s),1);
for i:=1 to length(s) do
if i mod 2=0 then s[i]:=' ';
while pos(' ',s)<>0 do delete(s,pos(' ',s),1);
Bài 1 Cho xâu st chỉ gồm các chữ cái Tính số lần xuất hiện của chữ cái xuất hiện nhiều lần nhất
trong xâu (không phân biệt chữ hoa và chữ thường)
Bài 2 Chuẩn hóa văn bản
Một văn bản được gọi là văn bản chuẩn hóa nếu:
- Hai từ liền nhau có duy nhất một 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) được đặt sát vào từ ngaytrước nó, sau đó mới đến dấu cách trống
- Dấu mở ngoặc đặt sát vào phía bên trái của từ bắt đầu mở ngoặc
- Dấu đóng ngoặc đặt sát vào phía bên phải của từ cuối cùng được đóng ngoặc
Trang 14Hãy viết chương trình kiểm tra và đưa một đoạn văn bản về dạng chuẩn
Input: vanban.inp
Output: vanban.out văn bản đã được chuẩn hóa
Bài 3: Viết chương trình chuyển một 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 như các dấu ngoặc giữ nguyên
for i:=1 to length(s) do
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);
- 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 trong dánh sách
+ Xâu đối xừng dài nhất
+ Tìm xâu palindrome dài nhất là xâu con của S
III BÀI TẬP TRẮC NGHIỆM TỔNG HỢP
A NHẬN BIẾT
1 Từ khoá nào dùng trong khai báo xâu
2 Khái niệm xâu:
A Xâu là dãy các ký tự chữ cái, chữ số B Xâu là dãy các chữ cái trong bộ mã ASCII
C Xâu là dãy hữu hạn các phần tử cùng kiểu D Xâu là dãy các ký tự trong bộ mã ASCII
3 Xâu rỗng có độ dài bao nhiêu
4 Xâu nào là xâu rỗng
5 Xâu là một dãy các kí tự thuộc bảng mã
6 Trong pascal phép ghép xâu là:
7 Đáp án nào không chính xác
A 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ã ASCIIlớn hơn
B Xâu A > xâu B nếu độ dài xâu A lớn hơn độ dài xâu B
C 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
D Xâu A = xâu B nếu xâu A và B giống nhau hoàn toàn
8 Đâu là thủ tục xoá xâu s
A Delete (s,vt,n) B Insert (s1,s,n) C Read(s,vt,n) D Copy(s,vt,n)
9 Đâu là thủ tục chèn xâu s1 và xâu s
A Delete (s,vt,n) B Insert (s1,s,n) C write(s1,s2,n) D Copy(s,vt,n)
10.Hàm nào cho biết độ dài xâu
11 Hàm nào cho biết vị trí xuất hiện đầu tiên của xâu s1 trong xâu s2
12 Hàm nào 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
13 Hàm nào cho chữ cái in hoa ứng với chữ cái trong ch
Trang 1514 Ý nghĩa của hàm UPCASE(ch);
A Cho chữ cái in hoa ứng với xâu trong ch B Cho xâu in hoa ứng với chữ cái trong ch
C Cho xâu in hoa ứng với xâu trong ch D Cho chữ cái in hoa ứng với chữ cái trong ch
15 Ý nghĩa của thủ tục INSERT(S1,S2,Vt);
A Thực hiện chèn Vt ký tự của xâu S1 vào cuối xâu S2
B Thực hiện chèn xâu S2 vào xâu S1, bắt đầu tự vị trí Vt
C Thực hiện chèn Vt ký tự của xâu S2 vào cuối xâu S1
D Thực hiện chèn xâu S1 vào xâu S2, bắt đầu từ vị trí Vt
16 Ý nghĩa của thủ tục DELETE(ST,a,b);
A Thực hiện xóa b ký tự liên tiếp của biến xâu St bắt đầu từ vị trí a
B Thực hiện xóa b ký tự liên tiếp của hằng xâu St bắt đầu từ vị trí a
C Thực hiện xóa a ký tự liên tiếp của biến xâu St bắt đầu từ vị trí b
D Thực hiện xóa a ký tự liên tiếp của hằng xâu St bắt đầu từ vị trí b
17 Cách tham chiếu đến một phần tử trong xâu
A Tên biến xâu, tiếp theo là chỉ số được viết trong cặp dấu ( và )
B Chỉ số được đặt ngay sau tên biến xâu
C Giống mảng 2 chiều
D Giống mảng 1 chiều
18 Ý nghĩa của hàm POS(S1,S2);
A Cho vị trí xuất hiện của xâu S1 trong xâu S2
B Cho vị trí xuất hiện đầu tiên của xâu S1 trong xâu S2
C Cho vị trí xuất hiện của xâu S2 trong xâu S1
D Cho vị trí xuất hiện đầu tiên của xâu S2 trong xâu S1
19 Ý nghĩa của hàm COPY(St,a,b);
A Tạo xâu gồm b ký tự bắt đầu từ vị trí a của xâu St
B Tạo xâu gồm a ký tự bắt đầu từ vị trí b của xâu St
C Tạo xâu gồm b ký tự liên tiếp bắt đầu từ vị trí a của xâu St
D Tạo xâu gồm a ký tự liên tiếp bắt đầu từ vị trí b của xâu St
20 Để khai báo xâu ta dùng cú pháp
A VAR <Tên biến xâu>=STRING;
B VAR <Tên biến xâu>:ARRAY[độ dài lớn nhất của xâu] OF Char;
C VAR <Tên biến xâu>:STRING[Độ dài lớn nhất của xâu];
D VAR <Tên biến xâu>OF STRING;
B THÔNG HIỂU
1 Chọn khai báo xâu đúng:
2 Cho biết giá trị của biến xâu St sau khi thực hiện xong câu lệnh St:= ‘Khoa’+‘Hoc’;
A St = ‘Khoa Hoc’; B St = ‘khoa hoc’; C St = ‘Khoahoc’; D St = ‘KhoaHoc’;
3 Cho xâu S là ‘Hanoi-Vietnam’ Kết quả của hàm Pos(‘Vietnam’,S) là
4 Trong NNLTPascal, cách khai báo xâu kí tự nào sau đây là đúng?
A S := file of string ; B S : file of char ; C S : string; D S = string[30];
5 Trong ngôn ngữ lập trình Pascal, khai báo nào trong các khai báo sau là sai khi khai báo xâu kí tự ?
A Var S:string; B Var :S:string[30]; C Var S:String[10]; D Var S:string[250];
6 Trong ngôn ngữ lập trình Pascal, để xóa đi ký tự đầu tiên của xâu ký tự S ta viết :
A Delete(S,1,1);