Tải bản đầy đủ (.docx) (23 trang)

SÁNG KIẾN KINH NGHIỆM TIN 11 CHUYÊN đề về xâu kí tự

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (198.28 KB, 23 trang )

ĐỀ TÀI:
CHUYÊN ĐỀ VỀ XÂU KÍ TỰ

Giáo viên

:

Tổ

:

CHUYÊN ĐỀ VỀ XÂU KÍ TỰ
I. TỔNG QUAN LÝ THUYẾT
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 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.


- Ngồ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);
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ã 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’, ‘yen’ < ‘yen dung’
- A=B nếu xâu A và B giống nhau hoàn toàn
VD: ‘hoa’=’hoa, ‘hoa’<>’Hoa’
c. 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ả
‘ydso1’
Delete(s,1,4)
‘1’

‘thptydso1
Delete(s,5,5)
‘thpt’
- 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ả
‘Yendung’ ‘so1’
Insert(s1,s2,1)
‘Yendungso1’
Insert(s2,s1,1)
‘so1Yendung’


- 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:
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 đ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
‘yendungso1’
Copy(s,1,7)
‘yendung’
2
‘Hello’
Length(s)
5
3

‘yendungso1’
Pos(‘g’,s)
7
TT
4
5
6
7

Giá trị ch
‘a’
‘a’

Upcase(ch)
Ord(ch)
Chr(65)
Concat(‘tin’,’hoc’)

‘A’
97
‘A’
‘tinhoc’

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 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 u
cầu của bài tố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: ‘thptyd1’
Output:
t
h
p
t
y
d

1
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: ‘YenDung1’
Output:
1
g
n
u
D

n
e
Y
Khi tơi nêu bài tố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 tố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 repeat…until, 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
YyyyyeeeeennnnnDuuunngggg1
YenDung1
- Ý 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 ibegin
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 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'] 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 q 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 }
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 := 1 to n do F[i, i] := True;
for k := 1 to (n-1) do
for i := 1 to (n-k) do
begin
j := i + k;
F[i, j] := ( F[i+1, j-1] ) and (s[i] = s[j] );
end;
for i:=1 to n do
for j:=1 to n do

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 do write(s[i]);
readln;
End.
4. 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.
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 của hs, và nêu rõ: để tạo được số b từ số a, bằng cách viết ngược lại các
chữ số của a thì:
+ tạo một 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 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à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 1 do s2:=s2+s1[i];
Val(s2,b,code);
Write(b);
Readln;
End.


Bà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 (P≤20) 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ụ:
Vào
Kết quả
p=3, k =11
a1=3, a2 = 4, a3 = 2
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
đượ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 đi
tì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}
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 do readln(a[i]);
for i:=1 to p do readln(s[i]);
for i:=1 to p do
For j:=1 to A[i] do
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 do
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 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ố.
Ví dụ: 1234 ->24-> 2
Chương trình bài tập 3:
Program taosonguyen;
var s,h:string; i,n:integer;
Begin
Write('Nhap n=');
Readln(n);
s:='';
for i:=1 to n do
begin
str(i,h);
s:=s+h;
end;
writeln(s);

Repeat
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);
Until length(s)<=1;
Writeln('KET QUA LA:',S);
Readln
End.
5. Bài tập tự luyện:
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ừ ngay
trướ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
Hã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
A. String
B. Text
C. Array
D. Function
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
A. 0
B. 1
C.2
D. 3
4. Xâu nào là xâu rỗng
A. ’’
B. ’rong’
C. ’xaurong’
D.’0’

5. Xâu là một dãy các kí tự thuộc bảng mã
A. UNICODE
B. TCVN3
D. VNI
D. ASCII
6. Trong pascal phép ghép xâu là:
A. &
B. ++
C. +
D. &&
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ã ASCII
lớ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 hồn tồn
8. Đâu là thủ tục xố 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
A. Copy (S,vt,n)
B. Length(S)
C. Pos(s1,s)

D. upcase(ch)
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
A. Delete(s,vt,n)
B. Length(S)
C. Pos(s1,s2)
D. Insert (s1,s,n)
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
A. Copy(s,vt,n)
B. Insert (s1,s,n)
C. upcase(ch)
D. Length(S)
13. Hàm nào cho chữ cái in hoa ứng với chữ cái trong ch


A. Copy (ch,vt,n)
B. Length(ch)
C. Pos(s1,ch)
D. upcase(ch)
14. Ý 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:
A. VAR St:STRING[266];
B. VAR St=STRING[200];
C. VAR St:STRING;
D. VAR St=STRING;
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à
A. 5;
B. 6;
C. 7;
D. 8;
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);
B. Delete(S,i,1); { i là biến có giá trị bất kỳ }
C. Delete(S,length(S),1);
D. Delete(S,1,i); { i là biến có giá trị bất kỳ }
7. Hãy chọn phương án ghép đúng. Cho xâu S là ‘Hanoi-Vietnam’, S1=’Vietnam’. Kết quả của
hàm PosS1,S) là
A. 7;
B. 6;
C. 9;
D. 8;
8. Cho xâu S1 là ‘Truong THPT Yen Dung so 1’. Kết quả của hàm length(S1) là:
A. 22;

B. 23;
C. 24;
D. 25;
9. Cho xâu S là ‘Truong THPT Yen Dung so 1’, xâu S1 là ‘THPT’ kết quả hàm POS (S1,S) là
A. 6
B. 7
C. 8
D.9
10. Cho xâu S là ‘Truong THPT Yen Dung so 1’ kết quả hàm Delete(S,1,7) là
A. ‘Truong ‘
B. ‘THPT Yen Dung so 1’
C. ‘Truong THPT Yen Du’
D. ‘1’
11. Cho xâu S là ‘Truong THPT Yen Dung so 1’ kết quả hàm upcase S[2] là
A. ‘U’
B. ‘R’
C. ‘N’
D. ‘E’
12. 10. Cho xâu S là ‘Truong THPT Yen Dung so 1’ kết quả hàm copy(S,1,7) là
A. ’Truong
B. ‘THPT Yen Dung so 1’
C. ‘Truong THPT Yen Du’
D.’1’
13. Cho xâu kí tự sau: s:= ‘Nguyen Trai’. Lệnh nào sau đây cho kết quả ‘Nguyen’
 A. copy(s, 1, 6);
 B. delete(s, 7, 5);
 C. Cả A, B đều đúng
 D. Cả A, B đều sai
14. Phép so sánh nào cho kết quả True
A. ‘A’ >’B’

B. ‘A’>’ABC’
C. ‘ABC’ < ‘C’
D. ‘AB’ = ‘ab’
15. Cho xâu S=’yendung1’ . Khi đó S[2] là
A. ‘y’
B. ‘e’
C. ’g’
D. ’1’
16. Thủ tục Insert ('Viet','Nam', 4) sẽ cho xâu kết quả nào sau đây?
A. Viet Nam
B. Nam Viet
C. VietNam
D. NamViet
17. Chọn câu SAI:
A. ‘May tinh’< ‘May tinh cua toi’
B. ‘Ha Noi’ > ‘Ha Nam’
C. ‘TIN HOC’ < ‘tin hoc’
D. ‘Viet Nam’ > ‘Viet nam’
18. Cho A=’abc’; B=’ABC’; khi đó A+B cho kết quả nào?
A. ‘aAbBcC’

B. ‘abcABC’

C. ‘AaBbCc’

D. ‘ABCabc’

19. S1 := ‘tin hoc cho moi nguoi’ ; x :=Pos(‘o’,S1) ; cho kết quả là?
A. 5


B. 6

C.7

D.11

20. So sánh hai xâu a := ‘Ha Noi’, xâu b := ‘Sai Gon’ hãy chọn kết quả.


A. a < b

B.a > b

C. a = b

D. a

C. VẬN DỤNG
1. Trong ngơn ngữ lập trình Pascal, đoạn chương trình sau thực hiện cơng việc gì ? (giá trị của
biến đếm)
dem := 0 ;
For ch := ‘a’ to ‘z’ do
If pos(ch,S) <> 0 then dem := + 1 ;
A. Đếm số lượng ký tự là chữ cái in hoa của xâu S
B. Đếm số lượng ký tự khác dấu cách của xâu S
C. Đếm số lượng chữ cái thường khác nhau có trong xâu S
D. Đếm số lượng ký tự là chữ cái thường trong xâu S
2. Trong ngôn ngữ lập trình Pascal, để in một xâu kí tự ra màn hình theo thứ tự ngược lại của
các ký tự trong xâu (vd : abcd thi in ra là dcba), đoạn chương nào sau đây thực hiện việc gì?
A. For i := 1 to length(S) div 2 do write(S[i])

B. For i := length(S) downto 1 do write(S[i])
C. For i := length(S) downto 1 do write(S)
D. For i := 1 to length(S) do write(S[i])
3. 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);
B. Delete(S, i, 1); { i là biến có giá trị bất kỳ }
C. Delete(S, length(S), 1);
D. Delete(S, 1, i); { i là biến có giá trị bất kỳ }
4. Trong ngơn ngữ lập trình Pascal, đoạn chương trình sau thực hiện cơng việc gì?
d := 0 ;
For i := 1 to length(S) do
if S[i] = ‘ ’ then d := d + 1 ;
A. Xóa đi các dấu cách trong xâu;
B. Đếm số dấu cách có trong xâu;
C. Xóa đi các ký tự số;
D. Đếm số ký tự có trong xâu;
5. Cho đoạn chương trình sau:
s1 := ‘123’; s2 := ‘abc’;
insert (s2 , s1 , 1);
write(s1);
Kết quả in ra màn hình là:
A. ‘123abc’
B. ‘abc’
C. ‘123’
 D. ‘abc123’
6. Cho đoạn chương trình sau:
s := ‘ABCDEF’;
delete(s, 3, 2);
insert(‘XYZ’, s, 4);
write(s);

Kết quả in ra màn hình là:
A. ‘ABXYZEF’
B. ‘ABEXYZF’
 C. ‘AXYZ’
 D. ‘AXYZBEF’
7. Cho đoạn chương trình sau:
s := ‘1001010’;
write(pos(‘011’, s));
Kết quả in ra màn hình là:


A. 0
B. ‘0’
8. Cho đoạn chương trình sau:
s := ‘Mua xuan’;
write(upcase(s[length(s)-1]));
Kết quả in ra màn hình là:
A. ‘X’
B. ‘U’

C. 3

 D. ‘3’

C. ‘A’

 D. ‘N’

9. Cho đoạn chương trình sau:
s1 := ‘abc’; s2 := ‘1234’;

if length(s1) > length(s2) then writeln(s1) else writeln(s2);
Kết quả in ra màn hình là:
A. ‘1234’
B. ‘abc’
 C. ‘1234abc’
10. Cho đoạn chương trình sau:
s:= ‘edcba’;
For i:= length(s) downto 1 do write(s[i]);
Kết quả in ra màn hình là:
A. ‘abcd’
B. ‘dcba’
 C. ‘abcde’

 D. ‘abc1234’

 D. ‘edcba’

D. VẬN DỤNG CAO
1. Trong ngơn ngữ lập trình Pascal, đoạn chương trình thực hiện cơng việc nào trong các công
việc sau:
i := pos(‘ ’, S); { ‘ ’ là 2 dấu cách }
while i <> 0 do
Begin
Delete(S, i, 1) ;
i := pos(‘ ’, S) ;
End;
A. Xóa các dấu cách trong xâu S để S khơng cịn 2 dấu cách liền nhau;
B. Xóa các dấu cách liền nhau cuối cùng trong xâu;
C. Xóa 2 dấu cách liền nhau đầu tiên trong xâu;
D. Xóa đi một trong 2 dấu cách đầu tiên trong xâu;

2. Trong ngơn ngữ lập trình Pascal, đoạn chương trình sau thực hiện cơng việc gì?
S1 := ‘anh’ ;
S2 := ‘em’ ;
i := pos(S2, S) ;
While i <> 0 do
Begin
Delete(S, i, 2) ;
Insert(S1, S, i) ;
i := pos(S2, S) ;
End ;
A. Thay toàn bộ cụm từ ‘em’ trong xâu S bằng cụm từ ‘anh’ ;
B. Thay toàn bộ cụm từ ‘anh’ trong xâu S bằng cụm từ ‘em’ ;
C. Thay cụm từ ‘em’ đầu tiên trong xâu S bằng cụm từ ‘anh’ ;
D. Thay cụm từ ‘anh’ đầu tiên trong xâu S bằng cụm từ ‘em’ ;
3. Trong ngơn ngữ lập trình Pascal, đoạn chương trình sau làm cơng việc gì:
i := pos(‘ ’, X) ;
while i <>0 do
Begin


Delete(X, i, 1) ;
i := pos(‘ ’, X) ;
End;
A. Xóa tất cả các dấu cách phía bên phải trong xâu X ;
B. Xóa tất cả các dấu cách phía bên trái trong xâu X ;
C. Xóa tất cả các dấu cách trong xâu X ;
D. Xóa tất cả các dấu cách ở hai đầu của xâu X ;
4. Trong ngôn ngữ lập trình Pascal, sau khi thực hiện xong đoạn chương trình sau, biến Found
có giá trị là gì? (S là biến xâu ký tự)
Found := 0 ;

x := length(S) ;
For i := 1 to x Div 2 do
If S[i] <> S[x – i + 1] then Found := 1 ;
A. Found bằng 0 nếu S là xâu đối xứng;
B. Found bằng 0 nếu S là xâu không đối xứng;
C. Found khơng có giá trị gì;
D. Found bằng 1 nếu S là xâu đối xứng;
5. Trong ngơn ngữ lập trình Pascal, đoạn chương trình sau thực hiện việc gì?
If (ch >= ‘A’) and (ch <= ‘Z’) then ch := chr( ord(ch) + 32 ) ;
A. Biến ch thành chữ thường nếu ch là chữ hoa;
B. Khơng thực hiện việc gì;
C. Biến ch thành chữ hoa;
D. Xóa ký tự có trong biến ch;
IV. ĐỀ RÈN LUYỆN KĨ NĂNG LÀM BÀI – THỜI GIAN 45 PHÚT
I. TRẮC NGHIỆM
Câu 1: Trong các chương trình chuẩn sau đây, chương trình chuẩn nào là hàm chuẩn?
A. readln(x);
B. Length(S);
C. Insert(S,1,3);
D. Delete(S,5,1);
Câu 2: Giả sử có 2 biến xâu x và y (y đã có giá trị) câu lệnh nào sau đây là không hợp lệ?
A. X:=Copy(y,5,3);
B. x:=y;
C. X:=Delete (y,5,3);
D. Delete(y,5,3);
Câu 3: Hàm Copy(S,vt,n) dùng để?
A. Thực hiện việc xóa n kí tự của biến xâu st bắt đầu từ vị trí vt
B. Copy n kí tự của xâu S
C. Tạo xâu gồm n kí tự liên tiếp bắt đầu từ vị trí vt của xâu S
D. Tạo xâu S gồm n kí tự liên tiếp bắt đầu từ vị trí vt

Câu 4: Cho biết xâu đối xứng có tính chất "đọc nó từ phải sang trái cũng thu được kết quả
giống như đọc từ trái sang phải". Hãy chọn xâu đối xứng?
A. "abba "
B. "abcabc"
C. "abcdba"
D. "abcca"
Câu 5: Var Hoten:string; khi đó độ dài lớn nhất của xâu sẽ nhận giá trị là?
A. 26
B. 255
C. 256
D. 25
Câu 6: Biến Hoten lưu trữ giá trị hằng xâu ‘Nguyen Van Troi’ thì Hoten[7] cho ta kí tự là:
A. ‘ ’
B. ‘y’
C. ‘e’
D. ‘n’
Câu 7: Trong Pascal, cú pháp khai báo biến kiểu xâu là:
A. Var < độ dài lớn nhất của xâu > = string [tên biến xâu] ;
B. Var <tên biến xâu> = string [độ dài lớn nhất của xâu] ;
C. Var <tên biến xâu> : string [độ dài lớn nhất của xâu] ;
D. Var < độ dài lớn nhất của xâu > : string [tên biến xâu] ;


Câu 8: Cho đoạn chương trình sau:
write(‘abc’+‘123456’);
Kết quả in ra màn hình là:
A. ‘123456abc’
B. ‘abc123456’
C. ‘123456’
D. ‘abc’

Câu 9: Trong các phát biểu sau, phát biểu nào sai?
A. Xâu A lớn hơn xâu B nếu kí tự dầ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
B. Hai xâu bằng nhau nếu chúng giống nhau hoàn toàn
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 nhỏ hơn B
D. Xâu A nhỏ hơn xâu B nếu độ dài xâu A nhỏ hơn độ dài xâu B
Câu 10: Cho đoạn chương trình sau:
s := ‘123456789’;
delete (s, 1, 8);
write(s);
Kết quả in ra màn hình là:
 A. ‘6789’
 B. ‘789’
 C. ‘9’
 D. ‘’
Câu 11: Cho đoạn chương trình sau:
s1 := ‘123’; s2 := ‘abcd’;
insert (s1, s2 ,3);
write(s2);
Kết quả in ra màn hình là:
 A. ‘ab123cd’
 B. ‘123abcd’
 C. ‘a123bcd’
 D. ‘abc123d’
Câu 12: Cho đoạn chương trình sau:
s1 := ‘123456789’;
s2 := copy(s1, 3, 5);
write(s2);
Kết quả in ra màn hình là:
 A. ‘567’

 B. 567
 C. 34567
 D. ‘34567’
Câu 13: Cho đoạn chương trình sau:
s := ‘200 ki tu’;
write(length(s));
Kết quả in ra màn hình là:
 A. 200
 B. 9
 C. ‘9’
 D. ‘200’
Câu 14: Cho đoạn chương trình sau:


s1 := ‘1010’; s2 := ‘1001010’;
write(pos(s1, s2));
Kết quả in ra màn hình là:
 A. 0
 B. ‘0’
 C. 4
 D. ‘4’
Câu 15: Cho đoạn chương trình sau:
s := 'Mua Thu';
write(upcase(s[5]));
Kết quả in ra màn hình là:
 A. ‘M’
 B. ‘U’
 C. ‘A’
 D. ‘T’
II. TỰ LUẬN

1. Viết chương trình nhập vào xâu S.u cầu in ra kí tự đầu và kí tự cuối của xâu
2. Nhập từ bàn phím xâu kí tự S . Thơng báo có bao nhiêu loại kí tự chữ cái
‘a’ ..’z’ , ‘A’..’Z’ chứa trong xâu S và số lượng của mỗi loại .
ĐÁP ÁN
I. TRẮC NGHIỆM
1 – B; 2 – C; 3 – C; 4 – A; 5 – B; 6 – A; 7 – C; 8 – B; 9 – D; 10 – C;
11 – A; 12 – D; 13 – B; 14 – C; 15 – D.
II. TỰ LUẬN
1. Đáp án tham khảo
Uses crt;
Var
S: String;
x:integer;
Begin
Clrscr;
Write (‘nhap xau S: ‘); readln(S);
Writeln(‘Ki tu dau: ‘,S[1]);
x:= length(s);
Writeln(‘Ki tu cuoi: ‘,S[x]);
Readln
End.
2. Đáp án tham khảo:
Uses Crt;
Var
D : Array['0'..'z'] of Integer; tong_tu,demtu : Integer;
Procedure Doc_Dem;
Const Fi = 'demkitu.txt';
Var F : Text; S,tu : String; i,k,t : Byte;
j: Char;
Begin

Demtu := 0;
Write('Nhap tu can dem : ');

tunhap : String;
tt : Boolean;


Readln(tunhap);
Writeln('File da cho la : ');
FillChar(D,Sizeof(D),0);
Assign(F,Fi);
{$I-} Reset(F); {$I+}
If IoResult<>0 then
Begin
Writeln('Loi File ');
Readln;
Halt;
End;
While not SeekEof(F) do
Begin
Readln(F,S);
Writeln(S);
{ Dem tung ki tu }
For i:=1 to length(S) do
For j:='0' to 'z' do
If (S[i]= j) then Inc(D[j]);
{ Dem tu }
S :=' '+S;
For i:=1 to length(S)-1 do
If (S[i]=' ') and (S[i+1]<>' ') then

Begin
Inc(tong_tu);
{ Dem tu da nhap }
k := i+1;
t := 1;
tt := True;
While (t<=length(Tunhap)) and tt do
If S[k]=Tunhap[t] then
Begin
Inc(k);Inc(t);
End;
Else tt := False;
If t>Length(tunhap) then Inc(demtu);
End;
End;
Close(F);
End;
Procedure Hien_so_luong_ki_tu;
Var i : Char;
Begin
For i:='0' to 'z' do
If (i in ['0'..'9']) or (i in ['A'..'Z']) or (i in ['a'..'z']) then
If (D[i]>0) then Write(i:2,' :',D[i]:2,' ');
End;
BEGIN
Clrscr;
Doc_Dem;


Writeln('Ket qua ');

Hien_so_luong_ki_tu;
Writeln;
Writeln('Tong so tu la : ',tong_tu);
Writeln('So tu " ',tunhap,'" trong File la : ',demtu);
Readln;
END.



×