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

Tài liệu ôn HSG môn tin học

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 (82.82 KB, 20 trang )

DỮ LIỆU KIỂU XÂU KÝ TỰ
A. LÝ THUYẾT VỀ XÂU:
I. KHAI BÁO KIỂU STRING
TYPE TênKiểu = STRING[Max];
VAR

Tên biến : TênKiểu;

hoặc khai báo biến trực tiếp:
VAR

Tên biến : STRING[Max];

Trong đó Max là số ký tự tối đa có thể chứa trong chuỗi (Max Î [0,255]). Nếu không có
khai báo [Max] thì số ký tự mặ mặc định trong chuỗi là 255.
Ví dụ:
Type

Hoten = String[30];
St80 = String[80];

Var

Name : Hoten;
Line : St80;
St : String; {St có tối đa là 255 ký tự}

II. TRUY XUẤT DỮ LIỆU KIỂU STRING
- Có thể sử dụng các thủ tục xuất nhập Write, Writeln, Readln để truy xuất các biến
kiểu String.
- Để truy xuất đến ký tự thứ k của xâu ký tự, ta sử dụng cú pháp sau: Tênbiến[k].



III. CÁC PHÉP TOÁN TRÊN XÂU KÝ TỰ
3.1. Phép nối xâu: +


3.2. Các phép toán quan hệ: =, <>, <, <=, >, >=.
Chú ý: Các phép toán quan hệ được so sánh theo thứ tự từ điển.

IV. CÁC THỦ TỤC VÀ HÀM VẾ XÂU KÝ TỰ
4.1. Hàm lấy chiều dài của xây ký tự
LENGTH(St : String):Integer;
4.2. Hàm COPY(St : String; Pos, Num: Byte): String;
Lấy ra một xâu con từ trong xâu St có độ dài Num ký tự bắt đầu từ vị trí Pos .
4.3. Hàm POS(SubSt, St :String):Byte;
Kiểm tra xâu con SubSt có nằm trong xâu St hay không? Nếu xâu SubSt nằm trong xâu
St thì hàm trả về vị trí đầu tiên của xâu con SubSt trong xâu St, ngược lại hàm trả về giá
trị 0.
4.4. Thủ tục DELETE(Var St:String; Pos, Num: Byte);
Xoá trong xâu St Num ký tự bắt đầu từ vị trí Pos.
4.5. Thủ tục INSERT(SubSt: String; Var St: String; Pos: Byte);
Chèn xâu SubSt vào xâu St bắt đầu tại vị trí Pos.
4.6. Thủ tục STR(Num; Var St:String);
Đổi số nguyên hay thực Num thành dạng xâu ký tự, kết quả lưu vào biến St.
4.7. Thủ tục VAL(St:String; Var Num; Var Code:Integer);
Đổi xâu số St thành số và gán kết quả lưu vào biến Num. Nếu việc chuyển đổi thành công
thì biến Code có giá trị là 0, ngược lại biến Code có giá trị khác 0 (vị trí của lỗi).

B. BÀI TẬP:
Bài 1:



Viết đoạn chương trình cho phép đọc một xâu ký tự và kiểm tra xâu này có đối
xứng không.
Ví dụ: Xâu “abcddcba” là xâu đối xứng. Xâu “abcdabcd” không đối xứng.
a.Hướng dẫn:
b. Mã chương trình:
Program xau_doi_xung;
var st:string;
doi_xung: boolean;
i,n:byte;
begin
write('Nhap xau can kiem tra: '); readln(st);
doi_xung:= true;
n:=length(st);
for i:=1 to n div 2 do
if st[i]<> st[n-i+1] then doi_xung:=false;
if doi_xung then write('Xau doi xung') else write('Khong doi xung');
readln
end.
c. Nhận xét:
- Dùng thêm biến n để chương trình rõ ràng, dễ theo dõi. Có thể thay n bằng
length(st);
- Có thể thay for i:=1 to n div 2 bằng for i:=1 to n nhưng lúc đó chương trình phải
xét n trường hợp thay vì chỉ cần xét n/2 trường hợp.
- Thuật toán của bài này giống với thuật toán xét xem một số có phải là số nguyên
tố không (Thuật toán lính canh).
Bài 2:
Viết chương trình cho phép viết hoa ký tự đầu từ trong một xâu.
Ví dụ: le nho duyet -> Le Nho Duyet
a. Hướng dẫn:

b. Mã chương trình:
Program Doi_chu;
uses crt;
var st: string;
i:byte;
begin
clrscr;
write('Nhap xau can doi:'); readln(st);
for i:= 1 to length(st) do if (st[i]=' ') then st[i+1]:=upcase(st[i+1]);
st[1]:=upcase(st[1]);
write(st);
readln
end.


c. Nhận xét:
Bài 3:
Viết chương trình xoá các dấu cách thừa trong một xâu ký tự (Giữa hai từ chỉ có
một dấu cách.
Ví dụ: Le nho
Duyet -> Le Nho Duyet
a.Hướng dẫn:
- Thực hiện lặp cho đến khi không tìm thấy hai ký tự trắng liên tiếp trong xâu: Thay thế
xâu hai ký tự trắng bằng xâu một ký tự trắng.
b. Mã chương trình:
Program Xoa_trang;
uses crt;
var st: string;
n:byte;
begin

clrscr;
write('Nhap xau can chuan hoa: '); readln(st);
n:= Pos(' ',st);
while n<>0 do
begin
delete(st,n,1);
n:=Pos(' ',st);
end;
write(st);
readln
end.
c. Nhận xét: Không dùng biến n chương trình tuy khó theo dõi hơn nhưng đơn giản hơn
nhiều:
Thay: n:= Pos(' ',st);
while n<>0 do
begin
delete(st,n,1);
n:=Pos(' ',st);
end;
Bằng : while (' ',st) <>0 do delete(st, Pos(' ',st),1)
Bài 4:
Viết chương trình cho phép tách phần tên ra khỏi xâu gồm họ và tên. Theo qui ước
cách ghi tên của Tiếng việt, tên là từ cuối cùng trong xâu.
Ví dụ: Le Nho Duyet -> Duyet.
a.Hướng dẫn:
b. Mã chương trình:
Program Tach_Ten;


uses crt;

var st,ten: string;
vitri,dai,i: byte;
begin
clrscr;
write('Nhap xau: '); readln(st);
for i:=1 to length(st) do if st[i]=' ' then vitri:=i+1;
writeln(vitri);
dai:=length(st) - vitri + 1;
ten:=Copy(st,vitri,dai);
write(ten);
readln
end.
c. Nhận xét: Chương trình trên sẽ chạy sau nếu xâu có ký tự trắng ở cuối xâu (Lúc đó
việc xác định vị trí của tên sẽ sai). Để khắc phục lỗi này ta cần thực hiện xoá ký tự trắng
ở cuối xâu trước.
Bài 5:
Viết chương trình cho phép dich xâu sang mã moocxo.
a.Hướng dẫn:
b. Mã chương trình:
Program Mooc_xo;
uses crt;
var st,mooc :string;
i: byte;
begin
write('Nhap cau bach van: '); readln(st);
for i:=1 to length(st) do
case st[i] of
'a': mooc:=mooc + ' '+'._';
'b': mooc:=mooc + ' '+'_.';
end;

write(mooc);
readln
end.
c. Nhận xét:
- Đoạn chương trình chỉ mới mã hoá được hai ký tự a, b. Để có thể sử dụng cần
khai báo cho các trường hợp còn lại.
- Thực tế không cần phân biệt chữ hoa hay chữ thường nên ta qui về một kiểu. Để
qui về kiểu chữ hoa ta dùng case upcase(st[i]) of thay cho case st[i] of...
Bài 6:


Viết phần mềm cho phép mã hoá và giải mã một xâu ký tự theo ý riêng. Để mã
hoá mỗi người dùng các khoá khác nhau. Ví dụ Khoá a: = succ(a) cho phép mã hoá xâu
abc thành bcd.
a.Hướng dẫn:
b. Mã chương trình:
Program Ma_hoa;
uses crt;
var st: string;
i: byte;
begin
clrscr;
write('Nhap xau can ma hoa: ');readln(st);
for i:= 1 to length(st) do st[i]:=succ(st[i]);
write('Sau ma hoa: ',st);
readln;
for i:= 1 to length(st) do st[i]:=pred(st[i]);
write('Sau giai ma: ',st);
readln;
end.

c. Nhận xét: Để mã hoá theo khoá a ->b ta dùng hàm succ, và pred. Nếu khoá là a ->d lúc
đó ta dùng đến các hàm cho biết mã ascii của ký tự (ORD) và ký tự có mã (CHR) .
Bài 7:
Viết chương trình cho phép đổi một số hệ thập phân sang số nhị phân.
a.Hướng dẫn:
b. Mã chương trình:
Program Doi_Ra_Nhi_Phan;
uses crt;
var st,st1: string;
so: longint;i:byte;
begin
clrscr;
write('Nhap so can doi: '); readln(so);
st:='';
while so > 0 do
begin
str(so mod 2,st1);
st:=st+st1;
so:=so div 2;
end;
for i:=length(st) downto 1 do write(st[i]);
readln


end.
c. Nhận xét:Chúng ta hoàn toàn có thể thay str(so mod 2,st1);bằng lệnh if so mod 2 = 1
then st:=st+’1’ else st:=st+’0’. Lúc này ta không phải dùng thêm biến phụ st1.
Bài 8:
Viết chương trình rã chữ: Khi cắt khẩu hiệu người ta thường có nhu cầu được biết
mỗi ký tự xuất hiện bao nhiêu lần trong câu khẩu hiệu. Hãy viết chương trình thực hiện

điều đó.
Ví dụ nhập: LE NHO DUYET
Cho biết D: 1; E: 2...
a.Hướng dẫn:
b. Mã chương trình:
Program Ra_chu;
uses crt;
var st:string;
M: array['A'..'Z'] of byte;
ch:Char;
i:byte;
begin
clrscr;
writeln('CHUONG TRINH RA CHU DE CAT KHAU HIEU');
write('Nhap cau: ');readln(st);
for i:=1 to length(st) do st[i]:=upcase(st[i]);
for ch:='A' to 'Z' do M[ch]:=0;
for i:=1 to length(st) do
begin
ch:=st[i];
M[ch]:= M[ch]+1;
end;
for ch:='A' to 'Z' do if M[ch]>0 then write(ch,':',M[ch],' ');
readln
end.
c. Nhận xét:
Bài 9:
Khi cộng hai số có giá trị quá lớn ta không thể thực hiện được do gới hạn giá trị
của biến. Bằng cách sử dụng xâu ký tự, ta có thể lập chương trình cộng hai số rất lớn
(255 chữ số). Hãy viết chương trình này.

a.Hướng dẫn:
b. Mã chương trình:
Program Cong_so_lon;
uses crt;


var so1, so2, tong, st1: string;
nho, i, chuso1, chuso2, chusoc: byte;
m:integer;
Procedure Doi_chieu(var so:string);
var i:byte;
tam: string;
begin
tam:='';
for i:=length(so) downto 1 do tam:=tam+so[i];
so:=tam;
end;
begin
write('Nhap so thu nhat: ');readln(so1);
write('Nhap so thu hai: ');readln(so2);
doi_chieu(so1);
doi_chieu(so2);
{-Lam cho hai so co do dai giong nhau}
if length(so1)>length(so2) then
for i:=1 to length(so1)-length(so2) do so2:=so2 +'0'
else
for i:=1 to length(so2)-length(so1) do so1:=so1 +'0';
{--Bat dau cong-----------}
nho:=0;
for i:=1 to length(so1) do

begin
val(so1[i],chuso1,m);
val(so2[i],chuso2,m); {Doi thanh so de cong}
chusoc:= (chuso1+chuso2+nho) mod 10;
nho:= (chuso1+chuso2+nho) div 10;
str(chusoc,st1); {Doi thanh ky tu de dua vao tong}
tong:=tong+st1
end;
{Cong them nho cuoi cung}
if nho>0 then
begin
str(nho,st1);
tong:=tong+st1
end;
{---------------}
doi_chieu(tong);
write(tong);
readln


end.
c. Nhận xét:
Bài 10:
Viết chương trình cho phép ghi bằng chữ một số. Ví dụ: 123.456.789 đọc Một
trăm hai mươi ba triệu, bốn trăm năm mươi sáu ngàn, bảy trăm tám mươi chín.
a. Hướng dẫn:
b. Mã chương trình:
Program Doc_so;
var n:longint;
Function Dich_1so(n:byte):string;

begin
case n of
1: Dich_1so:='mot';
2: Dich_1so:='hai';
3: Dich_1so:='ba';
4: Dich_1so:='bon';
5: Dich_1so:='nam';
6: Dich_1so:='sau';
7: Dich_1so:='bay';
8: Dich_1so:='tam';
9: Dich_1so:='chin';
0: Dich_1so:='khong';
end;
end;
Function Dich_3so(n:integer):string;
var Ket_qua: string;
begin
Ket_qua:=Dich_1so(n div 100) + ' tram ';
n:= (n mod 100);
Ket_qua:=Ket_qua + Dich_1so(n div 10) +' muoi ';
n:=n mod 10;
Ket_qua:=Ket_qua + Dich_1so(n);
Dich_3so:=Ket_qua;
end;
Function Dich_9so(n:longint):string;
var ket_qua: string;
begin
ket_qua:='';
if n div 1000000000 > 0 then ket_qua:=dich_3so(n div 1000000000) +' ty,
';



n:=n mod 1000000000;
if n div 1000000 > 0 then ket_qua:=ket_qua + dich_3so(n div 1000000)+'
trieu, ';
n:=n mod 1000000;
if n div 1000 > 0 then ket_qua:=ket_qua + dich_3so(n div 1000)+' ngan, ';
n:=n mod 1000;
ket_qua:=ket_qua + dich_3so(n);
Dich_9so:=ket_qua;
end;
{----------------------}
begin
write('Nhap so n: '); readln(n);
write(Dich_9so(n));
readln
end.
c. Nhận xét: Còn rất nhiều trường hợp riêng cần xử lý để đưa đoạn chương trình trên vào
sử dụng trong thực tế.
Bài 11 :Lập trình đếm số lần xuất hiện ở mỗi loại kí tự thuộc bảng chữ cái tiếng Anh
trong một xâu kí tự Str .
1) Var A: array [ 'A'..'Z'] of integer;
S: string;
ch: char;
i: integer;
BEGIN
Write(' Cho mot xau ki tu : '); Readln(s);
For ch:= 'A' to 'Z' do A[ch]:=0;
For i:=1 to length(s) do
Begin

If Upcase(S[i]) in (['A'..'Z']) then
Begin


S[i]:= Upcase(S[i]);
A[S[i]]:= A[S[i]]+1;
End;
End;
For ch:= 'A' to 'Z' do
Writeln('So lan xuat hien cua ',ch,' trong xau la: ', A[ch]:4) ;
Readln ;
END .
Bài 12 :Cho số tự nhiên n và xâu có độ dài n . Hãy biến đổi xâu đã cho bằng cách thay
đổi trong đó :
a. Tất cả các dấu ! bằng dấu chấm .
b. Mỗi một nhóm các dấu chấm liền nhau bằng một dấu chấm .
c. Một nhóm các dấu chấm đứng liền nhau bằng dấu ba chấm .
2)a ) Var S: string;
i: byte;
BEGIN
Write(' Cho mot xau ki tu S = '); Readln(S);
For i:=1 to length(S) do
If S[i] = '!' then S[i]:= '.';
Write( ' Chuoi sau khi da bien doi la : ', S);
Readln;
END .
b)


Uses crt;

Var S : string;

i : byte;

BEGIN
Clrscr;
Write(' Cho mot xau ki tu S = '); Readln(S);
i:=1;
While i< length(S) do
If (S[i]='.')and(S[i+1]='.') then Delete(S,i,1)
Else inc(i);
Write('Chuoi sau khi da bien doi la: ' ,S);
Readln;
END .
c)
Uses crt;
Var S: string;
i, j: byte;
BEGIN
Clrscr;
Write('Nhap xau S='); Readln(S);
i:=1;
While i<=Length(S) do


Begin
If S[i]='.' then
Begin
j:=i;
While (S[i]='.')and(i<=length(S)) do inc(i);

dec(i);
If (i-j)=1 then insert('.',S,i)
Else
If (i-j)>2 then
Begin
Delete(S,j+2,i-j-2); i:=j+1;
End;
End ;
Inc(i);
End;
Write('Chuoi sau khi bien doi la: ',S);
Readln;
END .

Bài 13 :Cho số tự nhiên n và một dãy các kí tự S 1 , S2 , … , Sn . Hãy tìm số tự nhiên I đầu
tiên sao cho các kí tự Si , Si+1 đều là chữ cái a . Nếu trong dãy không có những cặp như
vậy thì thông báo .
3)


Var S: string;
i: integer;
BEGIN
Write(' Cho mot xau ki tu : '); Readln(S);
i:= pos('aa', S); {tìm vị trí xâu con 'aa' trong S}
If i<>0 then Writeln(' Ton tai "aa" tai vi tri ', i)
Else Writeln(' Khong ton tai .') ;
Readln;
END .


Bài 14 :Cho số tự nhiên n và dãy các kí tự S1 , S2 , … , Sn . Biết rằng trong dãy có ít nhất
một dấu phẩy . Hãy tìm số tự nhiên i sao cho :
a. Si là dấu phẩy đầu tiên . b. Si là dấu phầy cuối cùng .
4)a )
Var S: string;
i: integer;
BEGIN
Write('Cho mot xau S co dau ",": '); Readln(S);
i:= pos(',', S);

(* vị trí của dấu ',' trong S *)

If i<> 0 then Write(' Vi tri thoa man la: ', i);
Readln;
END .
b)


Var S: string;
i: integer;

BEGIN
Write('Cho mot xau S co dau ",": '); Readln(S);
i:= length(S);
While (i>=1)and(S[i] <> ',' ) do i:=i -1;
If i>=1 then Write('So thu tu thoa man la: ', i)
Else Write('Khong ton tai.');
Readln;
END .


Bài 15 :Viết chương trình nhập một xâu kí tự , sau đó chỉ ra xem xâu đó có phải là xâu
đối xứng không ( xâu đối xứng là xâu có các kí tự giống nhau và đối xứng nhau qua điểm
giữa xâu , ví dụ ‘ABBA’ hoặc ‘ABCBA’ ) .
5)Uses Crt;
Var St : string;
dx : Boolean;
i, len: byte;
BEGIN
Clrscr;
Write(' Nhap xau St = '); Readln(St);
dx:= True;


i:=1;
len:= Length(St);
While dx and (i<=(len div 2)) do
Begin
dx:=(St[i] = St[len - i+1]);
inc(i);
End;
If dx then Write(' St la xau doi xung ')
Else Write(' St khong phai la xau doi xung ') ;
Readln;
END .

Bài 16 :Cho một xâu kí tự S . Hãy viết chương trình tính xem trong S có bao nhiêu loại kí
tự khác nhau ( phân biệt chữ in hoa với chữ in thường ) . Ví dụ với S là “Pascal” ta có
đáp số là 5 .
6)Var S: string;
i, j, dem: integer;

t: boolean;
BEGIN
Write('Cho mot xau ki tu S: '); Readln(S);
dem:=0;
For i:=1 to length(S) do
Begin


t:=false;
For j:=1 to i-1 do if (S[j]=S[i]) then t:=true;
If not t then dem:= dem+1;
End;
Write('So ki tu khac nhau cua xau S la: ', Dem);
Readln;
END .

Bài 17 :Viết chương trình nhập một xâu kí tự và biến đổi chúng thành toàn chữ in hoa .

7)Var S : string; i : integer;
BEGIN
Write('Cho mot xau ky tu: '); Readln(S);
For i:=1 to length(S) do
If S[i] in ['a' ..'z'] then S[i]:= Upcase(S[i]);
Write('Chuoi sau khi da bien doi la: ', S);
Readln;
END .
Bài 18 :Họ tên một học sinh được nhập từ bàn phím . Bạn hãy viết chương trình điều
chỉnh lại các kí tự đầu của các từ đơn trong tên của học sinh ấy trở thành chữ in hoa .
8)Uses crt;
Const Chu=['a'..'z'];

Var

Hoten: string;


i,len: byte;
BEGIN
Clrscr;
Write('Ho ten='); Readln(Hoten);
Len:=length(Hoten);
If Hoten[1] in Chu then Hoten[1]:=Upcase(Hoten[1]);
For i:=2 to len do
If (Hoten[i-1]=#32)and(Hoten[i] in Chu) then
Hoten[i]:=Upcase(Hoten[i]);
Write('Ho ten sau khi dieu chinh la: ', Hoten);
Readln;
END .

Bài 19 :Viết chương trình nhập xãu kí tự từ bàn phím , sau đó gọt xâu lại bằng cách cách
xoá đi các kí tự trống ở hai đầu của xâu . Ví dụ nếu nhập xâu “ Ha noi “ , thì kết quả sẽ là
“Ha noi” .
9)Var S: String;
BEGIN
Write('Cho mot xau ky tu: '); Readln(S);
While S[1] = #32 do Delete(S,1,1);
While (S[length(S)] = #32) do Delete(S,length(S),1);
Write('Chuoi sau khi da bien doi la: ', S);
Readln;



END .
Bài 20: Viết chương trình để mã hoá và giải mã một xâu ký tự bằng cách đảo ngược các
bit của từng ký tự trong xâu.
Uses crt;
Var st:string;
{Hàm đảo bit ký tự c}
Function DaoBit(c:char):char;
Var n,i,s,bitcuoi,Mask:byte;
Begin
{Đổi ký tự sang số}
n:=ORD(c);
{s: kết quả đảo bit, Mask: mặt nạ dùng để bật bit thứ i}
s:=0;
Mask:=128;
For i:=1 To 8 Do {duyệt qua 8 bit của n}
Begin
{Lấy bit cuối cùng của n: bit cực phải}
bitcuoi:=n AND 1;
n:=n shr 1; {loại bỏ bit cuối cùng: n:=n DIV 2}
{Bật bit thứ i lên: từ trái sang phải}
if bitcuoi=1 then s:=s OR Mask;
Mask:=Mask shr 1; { Mask:= Mask DIV 2}
End;
DaoBit:=CHR(s);
End;
Function MaHoa(st:string):string;
Var i:Byte;
Begin
{Đảo bit từng ký tự trong xâu st}
For i:=1 To Length(st) Do st[i]:=DaoBit(st[i]);

Mahoa:=st;
End;
Begin
Write('Nhap xau: '); Readln(st);
st:=MaHoa(st);
Writeln('Xau sau khi ma hoa: ',st);


Readln;
st:=MaHoa(st);
Writeln('Xau sau khi giai ma: ',st);
Readln;
End
=====================\\//=========================.



×