CÁC BÀI TẬP VỀ XÂU KÍ TỰ
BÀI TẬP 1
Nhập vào một xâu s khác rỗng
và thực hiện chuẩn
hoá xâu, tức là:
a)
Xoá các dấu cách thừa
b)
Chuyển những kí tự đầu từ thành chữ
hoa, những kí tự khác thành chữ
thường.
HƯỚNG DẪN
Chương trình như sau:
var s : string;
procedure chuanhoa(var
s : string); {s là tham biến để
có thể thay đổi trong chương
trình con}
var i : integer;
begin
while s[1]=' ' do delete(s,1,1); {xoá các kí tự
cách thừa ở đầu
xâu}
while s[length(s)]=' ' do delete(s,length(s),1); {xoá các kí tự cách thừa ở
cuối xâu}
{xoá các kí tự cách thừa ở
giữa các từ: nếu
s[i-1] là cách thì s[i] là dấu cách là thừa.
Phải dùng vòng lặp for downto vì nếu trong quá trình xoá ta làm giảm
chiều dài của xâu, nếu
for to sẽ không dừng
được.}
for i := length(s) downto 2 do
if (s[i]=' ') and (s[i-1]=' ') then delete(s,i,1);
{Chuyển kí tự đầu
xâu thành chữ hoa}
s[1] := Upcase(s[1]);
for i := 2 to length(s) do
if s[i-1]=' ' then s[i] := Upcase(s[i]) {Chuyển
s[i] là kí tự đầu
từ thành chữ hoa.}
else
if s[i] in ['A'..'Z'] then {s[i] là kí tự
chữ hoa không ở đầu
một từ}
s[i]
:= chr(ord(s[i]) + 32); {thì phải chuyển
thành chữ thường}
end;
BEGIN
write('Nhap vao 1 xau s:');
readln(s);
chuanhoa(s);
writeln('Xau s sau khi chuan hoa:',s);
readln;
END.
BÀI TẬP 2
Nhập vào một xâu x khác rỗng
và thông báo xâu đó có phải
là xâu đối xứng hay không?
HƯỚNG DẪN
Xâu đối xứng nếu
nó bằng chính xâu đảo của
nó. Vậy cách đơn giản
nhất là ta sẽ xây dựng
xâu đảo của x và kiểm
tra xem nó có bằng x không. Để
xây dựng xâu đảo của
x, cách đơn giản
nhất là cộng các kí tự của x theo thứ tự
ngược (từ cuối
về đầu).
Chương trình:
var x : string;
(************************************************)
function doixung(x
: string) : boolean; {hàm kiểm tra xâu đối
xứng}
var y : string;
i
: integer;
begin
y := '';
{xây dựng y là xâu đảo của
x, bằng cách cộng dần
các kí tự của
x vào y theo thứ tự
ngược}
for i := length(x) downto 1 do y := y + x[i];
{so sánh x và xâu đảo của nó}
if x=y then doixung := true else doixung := false;
end;
BEGIN
write('Nhap vao 1 xau:');
readln(x);
if doixung(x) then
writeln('Xau doi xung!')
else
writeln('Xau khong doi xung!');
readln;
END.
BÀI TẬP 3
Nhập vào một xâu s và đếm
xem nó có bao nhiêu từ. Từ
là một dãy các kí tự, cách nhau bởi
dấu cách?
HƯỚNG DẪN
Cách đếm từ đơn
giản nhất là đếm
dấu cách: nếu s[i] là kí tự
khác cách và s[i-1] là kí tự cách thì chứng
tỏ s[i] là vị trí bắt đầu của một
từ. Chú ý là từ đầu
tiên của xâu không có dấu cách đứng
trước.
Chương trình:
var s : string;
{Hàm đếm số từ của một xâu}
function sotu(s :
string) : integer;
var i, dem : integer;
begin
{cộng thêm dấu cách phía trước
xâu để đếm cả từ đầu tiên}
s := ' ' + s; dem := 0;
for i := 2 to length(s) do {s[i] là vị trí bắt đầu 1 từ}
if (s[i-1]=' ') and (s[i]<>' ') then dem := dem + 1;
sotu := dem;
end;
BEGIN
write('Nhap vao 1 xau:');
readln(s);
writeln('So tu trong xau la:',sotu(s));
readln;
END.
BÀI TẬP 4
Nhập vào một xâu s và in ra các từ của nó (Từ
là một dãy các kí tự, cách nhau bởi
dấu cách). Xâu có bao nhiêu từ
là đối xứng?
HƯỚNG DẪN
Có nhiều cách để tách một
xâu thành các từ. Cách đơn
giản nhất tiến
hành như sau:
1)
Bỏ qua các dấu cách cho đến
khi gặp một kí tự
khác cách (hoặc hết
xâu).
2)
Ghi các kí tự tiếp
theo vào xâu tạm cho đến
khi gặp dấu cách hoặc
hết xâu, khi đó
ta được 1 từ.
3)
Nếu chưa hết
xâu thì quay lại bước
1.
Mỗi khi tìm được một
từ, ta ghi luôn nó ra màn hình, nếu
từ đó là đối
xứng thì tăng biến đếm. Ta cũng có thể lưu
các từ tách được vào một
mảng nếu bài tập
yêu cầu dùng đến những
từ đó
trong các câu sau.
Chương trình:
var s : string;
dem : integer;
{Hàm kiểm tra từ đối
xứng}
function doixung(x
: string) : boolean;
var y : string;
i
: integer;
begin
y := '';
for i := length(x) downto 1 do y := y + x[i];
if x=y then doixung := true else doixung := false;
end;
{Thủ tục thực
hiện tách từ}
procedure tach;
var i, len : integer;
t
: string;
begin
writeln('Cac tu trong xau:');
i := 1; len := length(s);
repeat
{B1: bỏ qua các dấu cách cho đến
khi hết xâu hoặc gặp
1 kí tự khác cách:}
while (s[i]=' ') and (i<=len) do inc(i);
if i>=len then break; {nếu hết
xâu thì dừng}
t :=
'';
{t là biến tạm
lưu từ đang
tách}
{B2: lấy các kí tự khác cách đưa
vào biến tạm cho đến
khi hết xâu hoặc gặp
1 kí tự cách:}
while (s[i]<>' ') and (i<=len) do begin
t := t + s[i];
inc(i);
end;
{in ra từ vừa tách được
và kiểm tra đối xứng}
writeln(t);
if doixung(t) then inc(dem);
until i >= len;
writeln('So tu doi xung trong xau:',dem);
end;
(************************************************)
BEGIN
write('Nhap vao 1 xau:');
readln(s);
tach;
END.
BÀI TẬP 5
Một số nguyên gọi
là palindrom nếu nó đọc
từ trái sang cũng bằng
đọc từ phải
sang. Ví dụ 121 là một
số palindrom. Nhập một
dãy n phần tử
nguyên dương từ
bàn phím, 5<= n<=20 và các phần tử có 2 đến 4 chữ số. In ra các số là palindrom trong dãy.
HƯỚNG DẪN
Một số là palindrom thì xâu tương ứng của
nó là xâu đối xứng.
Ta sẽ xây dựng một
hàm kiểm tra một số
có phải là palindrom không bằng cách chuyển số đó thành
xâu và kiểm tra xâu đó có đối xứng không?
Chương trình:
uses crt;
var n : integer;
a : array[1..20] of integer;
{Thủ tục nhập
dữ liệu}
procedure nhap;
var i : integer;
begin
clrscr;
repeat
write('n= '); readln(n);
if (n<=20) and (n>=5) then break; {nếu đã thoả
mãn thì thoát khỏi vòng lặp}
writeln('Yeu cau 5<=n<=20. Nhap lai!');
until false;
for i := 1 to n do
repeat
write('A[',i,']='); readln(a[i]);
if (a[i]<=9999) and (a[i]>=10) then break; {a[i] có 2 đến 4 chữ số}
writeln('Yeu cau cac phan tu co 2 den 4 chu so. Nhap lai!');
until false;
end;
{Hàm kiểm tra bằng các kiểm
tra xâu đối xứng}
function palindrom(k
: integer): boolean;
var x,y : string;
i
: integer;
begin
str(k,x); {chuyển k thành xâu x}
y := '';
for i := length(x) downto 1 do y := y + x[i];
{nếu x là đối xứng
thì k là palindrom}
if x=y then palindrom := true else palindrom := false;
end;
{In kết quả:}
procedure palin;
var i : integer;
begin
writeln('Cac so la palindrom trong day:');
for i := 1 to n do
if palindrom(a[i]) then writeln(a[i]);
readln;
end;
(* Chương trình chính *)
BEGIN
nhap;
palin;
END.
Không có nhận xét nào:
Đăng nhận xét