Tải bản đầy đủ (.doc) (27 trang)

Chuyên đề sáng kiến 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 (330.49 KB, 27 trang )

MỤC LỤC
PHẦ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


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu

PHẦ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
THPT Chu Văn An

3

GV: Lê Thị Thanh Vân


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu

nà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

THPT Chu Văn An

4

GV: Lê Thị Thanh Vân


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu

PHẦ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ụ:
Khai báo
Ý nghĩa
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ự.
THPT Chu Văn An


5

GV: Lê Thị Thanh Vân


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu

2.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ả
về giá trị xâu.
* Ví dụ:
ten:=’Lan’;
lop:=’11’+’A1’;
2.1.3.2. Phép ghép xâu:
* Tác dụng: Ghép nhiều xâu thành một xâu.
* Kí hiệu: +
* Ví dụ:
ten:=’Lan’; lop:=’11’+’A1’;
S:=ten + ‘ hoc lop ’ + lop;
Kết quả: S nhận giá trị ‘Lan hoc lop 11A1’
2.1.3.3. So sánh xâu

* Các phép toán so sánh: > (lớn hơn); >= (lớn hơn hoặc bằng); <= (nhỏ hơn
hoặc bằng); < (nhỏ hơn); = (bằng); < > (khác)
* Quy tắc so sánh xâu:
- Xâu A lớn hơn xâu B nếu như kí tự đầu tiên khác nhau giữa chúng kể từ trái
sang phải của xâu A có mã ASCII lớn hơn.

THPT Chu Văn An

6

GV: Lê Thị Thanh Vân


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu

- 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ự.
THPT Chu Văn An

7

GV: Lê Thị Thanh Vân


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu

* Ý 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.
THPT Chu Văn An

8


GV: Lê Thị Thanh Vân


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu

a) 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’.
d) Thủ tục dec:
* Cách sử dụng: dec(ch);
Với: ch là biến kí tự
* Ý nghĩa: Thực hiện lấy kí tự đứng ngay trước kí tự ứng với giá trị hiện thời
của ch trong bộ mã ASCII và ghi vào ch . Vậy thủ tục dec làm thay đổi giá trị
của ch.

* Ví dụ: ch:=’c’; dec(ch); kết quả ch =’b’.

THPT Chu Văn An

9

GV: Lê Thị Thanh Vân


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu

2.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]);
Writeln(‘Xau s1: ‘, s1);Writeln(‘Xau s2: ‘, s2);
If s1[1]=s2[length(s2)] then writeln(‘Trung nhau’)
else writeln(‘Khong trùng’);
Readln
End.

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)
Chương trình:
Var s,t:string; i:byte;
Begin
Write(‘nhap xau can kiem tra: ’); readln(s);
t:=’’;
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.

THPT Chu Văn An

10

GV: Lê Thị Thanh Vân



Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu

Bà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.
Chương trình:
Var s1,s2:string; i:byte;
Begin
Write(‘nhap xau s1: ’); readln(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;
d:array[‘A’..’Z’] of byte;

Begin
Write(‘nhap xau s: ’); readln(s);
For j:=’A’ to ‘Z’ do d[j]:=0;
For i:=1 to length(s) do
Begin
s[i]:=upcase(s[i]); d[s[i]]:= d[s[i]]+1;
End;
For j:=’A’ to ‘Z’ do
If d[j]>0 then writeln(‘Ki tu ‘,j,’ xuat hien: ‘,d[j],’ lan’);
Readln;
end.
THPT Chu Văn An

11

GV: Lê Thị Thanh Vân


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu


Bà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.
Chương trình:
Var s:string;
Begin
Write(‘nhap xau s: ’); readln(s);
While pos(‘anh’,s)>0 do
Begin
Insert(‘em’,s, pos(‘anh’,s));
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ụ
in.txt
Nam 2014 co 365 ngay, thang 2 co 28 ngay

out.txt
0: 1
1: 1
2: 3

3: 1
4: 1
5: 1
6: 1
8: 1

Chương trình
Var a:array[‘0’..’9’] of byte; s:string; f:text; j:char;
Begin
Assign(f,’in.txt’); reset(f);
Readln(f,s); close(f);
Fillchar(a,sizeof(a),0);
For i:=1 to length(s) do if (s[i]>=’0’) and (s[i]<=’9’) then a[s[i]]:=a[s[i]]+1;
Assign(f,’out.txt’); rewrite(f);
For j:=’0’ to ‘9’ do
If a[j]>0 then writeln(f,j,’ ‘,a[j]);
End.

THPT Chu Văn An

12

GV: Lê Thị Thanh Vân


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu

2.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

Ví dụ:
In.txt
le thi thanh mai
Nguyen van linh

Out.txt
Le Thi Thanh Mai
Nguyen Van Linh

Chương trình
Var f:text; s:string[50]; i:byte;
Begin
Assign(f,’in.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
THPT Chu Văn An

13

GV: Lê Thị Thanh Vân


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu
Assign(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).
Chương trình

var s,t:string; i,k:byte;
begin
write('Thang can xac dinh mua: ');
readln(s); t:=s;
for i:=1 to length(s) do s[i]:=upcase(s[i]);
if (s='GIENG')or (s='HAI') or (s='BA') then k:=1
else
if (s='BON')or (s='NAM') or (s='SAU') then k:=2
else
if (s='BAY')or (s='TAM') or (s='CHIN') then k:=3
else k:=4;
case k of
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ề

THPT Chu Văn An

14


GV: Lê Thị Thanh Vân


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu

phí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:
. Nhập vào tọa độ x, y từ bàn phím
. Đưa ra màn hình một chương trình thỏa mãn điều kiện thử nghiệm.
Chương trình
Var x1,y1,x,y:byte;s:String;
begin
write('toa do cua robot can den: '); readln(x,y);
x1:=0; y1:=0;
s:='';
while (y1begin
s:=s+'N'; y1:=y1+1;
end;
while x1begin
x1:=x1+1;
s:=s+'E';
end;
x1:=x1-1;

y1:=y1-1; s:=s+'SW';
writeln('toa do: ',x1,y1,' quang duong la: ',s);
readln
end.

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.

THPT Chu Văn An

15

GV: Lê Thị Thanh Vân


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu

Ví 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}
function dx(x:string):string;
var i:byte;tg:string;
begin
tg:='';
for i:=length(x) downto 1 do
tg:=tg+x[i];
dx:=tg;
end;
{Chuong trinh chinh}
begin
write('nhap xau chi chua cac ki tu 1, 2, ...9');
readln(s);
dem:=0; k:=length(s); i:=1;
while i<=k do
begin
i:=i+1;
s:=s+s[1];
delete(s,1,1);
if dx(s)=s then
begin
dem:=dem+1;
writeln('cach mo khoa thu ', dem,' o vi tri ', i,' ta duoc: ',s);
end;
end;
if dem=0 then writeln(‘Khong co cach mo khoa’);
readln
end.
THPT Chu Văn An


16

GV: Lê Thị Thanh Vân


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu

2.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.
Thủ tục chuanxau
Procedure chuanxau(var s:string);
Begin
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);
End;

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ị.
Thủ tục demtu
Procedure demtu(s:string):byte;
Var t:string; tg:byte;

Begin
tg:=0;
t:=s;
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.
Ví dụ:
in.txt
1234567

out.txt
124691356

123456789
Ý tưởng: Viết 3 thủ tục thực hiện: đọc dữ liệu từ file, xử lí, ghi kết quả ra file.
Chương trình
Var f:text; s1,s2:string; c:string;
THPT Chu Văn An

17

GV: Lê Thị Thanh Vân



Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu
{thu tuc doc file}
Procedure reafile;
Begin
Assign(f,’D:\in.txt’);
Reset(f);
Readln(f,s1);

readln(f,s2);

Close(f);
End;
{thu tuc xu li}
Procedure xuli;
Var x,y,nho,t,i:byte;
Begin
While length(s1)<>length(s2) do
If length(s1)Else s2:=’0’+s2;
Nho:=0;

c:=’’;

For i:= length(s1) downto 1 do
Begin
x:=48 – ord(s1[i]);
y:=48 – ord(s2[i]);
t:=(x+y+nho) div 10;
nho:=(x+y+nho) mod 10;

c:=chr(48+t)+c;
end;
if nho>0 then c:=chr(48+nho)+c;
end;
{thu tuc ghi ket qua vao file}
Procedure ghifile;
Begin
Assign(f,’D:\out.txt’);
Rewrite(f);
Writeln(f,c);
Close(f);
End;
{Chuong trinh}
THPT Chu Văn An

18

GV: Lê Thị Thanh Vân


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu
Begin
Docfile;
Xuli;
Ghifile;
End.

Bài 4: Tệp in.txt thuộc thư mục gốc ổ D chứa một xâu. Viết chương trình đọc
dữ liệu từ tệp in.txt ra xâu s1. Tạo xâu s2 chứa các chữ số từ xâu s1. Kiểm tra
xem các chữ số trong xâu s1 theo thứ tự có tạo thành số bậc thang không? Ghi

kết quả ra file kqua.txt ở ổ D.
Ví dụ:
in.txt
kqua.txt
Nam2014
2014 khong
Soluong12345 12345 co
Chương trình:
Var f:text; s1,s2:string; c:string;
{thu tuc doc file}
Procedure reafile;
Begin
Assign(f,’D:\in.txt’);
Reset(f);
Readln(f,s1);
Close(f);
End;
{thu tuc xu li}
Procedure xuli;
Var x,y,nho,t,i:byte;
Begin
s2:=’’; {s2 khoi tao la xau rong}
For i:=1 to length(s1) do
If (s1[i]<=’9’) and (s1[i]>=’0’) then s2:=s2+s1[i];
kt:=true;
i:=1;
while (iTHPT Chu Văn An

19


GV: Lê Thị Thanh Vân


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu
begin
if s2[i]>=s2[i+1] then kt:=false;
i:=i+1;
end;
end;
{thu tuc ghi ket qua vao file}
Procedure ghifile;
Begin
Assign(f,’D:\out.txt’);
Rewrite(f);
If kt then Writeln(f,s2,’ co’)
Else Writeln(f,s2,’ khong’);
Close(f);
End;
{Chuong trinh}
Begin
Docfile;
Xuli;
Ghifile;
End.

Bài 5: Một xâu là đối xứng nếu xâu đó đọc từ trái sang phải cũng giống như
đọc từ phải sang trái. Cho một xâu s, hãy tìm số ký tự ít nhất cần thêm vào
xâu s để s trở thành xâu đối xứng.
In.txt

edbabcd

Out.txt
2

ec
Dữ liệu vào từ tệp in.txt gồm một dòng là xâu s.
Dữ liệu ra: Ghi vào tệp out.txt
- Dòng 1: số lượng kí tự phải thêm vào
- Dòng 2: Các kí tự cần chèn thêm

THPT Chu Văn An

20

GV: Lê Thị Thanh Vân


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu

Ý tưởng:
Gọi xâu s1 là xâu đảo của xâu s ban đầu, t là xâu con chung dài nhất
của s1 và s. Khi đó các kí tự của s không thuộc t chính là các kí tự cần chèn
vào s để s trở thành xâu đối xứng.
Sử dụng mảng L[0..max,0..max] để lưu độ dài xâu con chung dài nhất với
L[i,j] là độ dài xâu con chung dài nhất của hai xâu s và s1.
Khi đó:

L[0,j]=0 với ∀j∈[1,N] (N=length(s))
L[i,0]=0 với ∀i∈[1,M] (M=length(s1))


∀j∈[1,N] , ∀i∈[1,M]:
Nếu s[i]=s1[j] thì L[i,j]:= L[i-1,j-1]+1
Ngược lại L[i,j]:= Max{L[i-1,j], L[i,j-1]}
Chương trình
Var

L:array[0..100,0..100] of byte;
Kq: array[0..100] of boolean;
m:integer; s,s1:string; f:text; i,j:byte;
{thu tuc doc file}
Procedure docfile;
Begin
Assign(f,’in.txt’); reset(f);
Readln(f,s);close(f);
m:=length(s);
s1:=’’;
for i:=m downto 1 do s1:=s1+s[i];
end;
function max(var a,b: byte):byte;
begin
if a>b then max:=a else max:=b;
end;
procedure xuly;
begin
fillchar(L,sizeof(L),0);
for i:=1 to m do
for j:=1 to m do
if (s[i]=s1[j]) then L[i,j]:= L[i-1,j-1]+1
else L[i,j]:= max(L[i-1,j], L[i,j-1]);

end;
procedure ghifile;
begin
Assign(f,’out.txt’); rewrite(f);
writeln(f,m-L[m,m]);
THPT Chu Văn An

21

GV: Lê Thị Thanh Vân


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu
fillchar(kq,sizeof(kq),false);
i:=m; j:=m;
while (i>0) and (j>0) do
if s[i]=s1[j] then
begin
kq[i]:=true;
i:=i-1; j:=j-1;
end
else
if L[i,j]=L[i,j-1] then j:=j-1
else i:=i-1;
for i:=1 to m do
if kq[i] = false then writeln(f,s[i],’ ‘);
close(f);
end;
{Chuong trinh chinh}
Begin

Docfile; xuly; ghifile;
End.

Bài 6: Hai số tự nhiên được gọi là nguyên tố tương đương nếu chúng có
chung các ước số nguyên tố. Ví dụ các số 75 và 15 là nguyên tố tương đương
vì cùng có các ước nguyên tố là 3 và 5.

In.txt
So thu nhat: 75
So thu hai: 15
So thu nhat: 18
So thu hai: 15
Ý tưởng

Out.txt
75 va 15 là nguyen to tuong duong
18 va 15 khong nguyen to tuong duong

- Đọc 2 xâu từ file in.txt, sau đó chuyển các chữ số của 2 xâu thành 2 số m, n
- Phân tích hai số m, n thành tích các thừa số nguyên tố.
- Lưu các thừa số nguyên tố của m, n vào hai mảng A, B.
- So sánh các phần tử mảng A với các phần tử mảng B. Nếu trùng nhau hết thì
m,n nguyên tố tương đương. Ngược lại chúng không nguyên tố tương đương
Chương trình
type kt=array[1..100] of integer;
var n,m,i,so1,so2:integer;A,B:kt;
{Ham phan tich mot so thanh tich cac thua so nguyen to}
procedure ptich(x:integer; var t:kt;var y:integer);
{x: so can phan tich, t: mang chua cac thua so nguyen to, y so luong cac thua so}
THPT Chu Văn An


22

GV: Lê Thị Thanh Vân


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu
begin
i:=2;y:=0;
while x>1 do
begin
while x mod i = 0 do
begin
y:=y+1;
t[y]:=i;
x:=x div i;
end;
i:=i+1;
end;
end;
{Ham kiem tra cac uoc cua 2 so trung nhau khong}
function ktra(a1,a2:kt):boolean;
var tim:boolean;
begin
i:=1; tim:=true;
if n>m then m:=n;
while (i<=m) and (tim) do
begin
if a[i]<>b[i] then tim:=false;
i:=i+1;

end;
if tim then ktra:=true else ktra:=false;
end;
{Doc file}
Procedure docfile;
Begin
Assign(f,’in.txt’); reset(f);
Readln(f,s1); readln(f,s2); close(f);
so1:=0; so2:=0;
For i:=1 to length(s1) do
if (s1[i]>=’0’) and (s1[i]<=’9’) then so1:= so1*10+ 48- ord(s1[i]);
for i:=1 to length(s2) do
if (s2[i]>=’0’) and (s2[i]<=’9’) then so2:= so2*10+ 48- ord(s2[i]);
end;
begin
docfile;
ptich(so1,a,n);
ptich(so2,b,m);
assign(f,’out.txt’); rewrite(f);
if ktra(a,b) then writeln(f,so1,’ va ‘, so2,' la nguyen to tuong duong')
else writeln(f, so1,’va ‘, so2,' khong ngto tuong duong');
close(f);
readln
end.

THPT Chu Văn An

23

GV: Lê Thị Thanh Vân



Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu

Bài 7: Đưa ra giá trị của một xâu theo yêu cầu sau: mỗi từ trên một dòng (từ
là các kí tự (khác kí tự cách) liền kề nhau, các từ ngăn cách nhau bởi dấu
cách)
in.txt
xin chao cac ban

out.txt
xin
chao
cac
ban

Ý tưởng:
- Thực hiện xóa các kí tự cách trong xâu s sao cho không có nhiều hơn 1 kí tự
cách liền kề nhau.
- Duyệt từ đầu xâu đến cuối xâu, gặp kí tự cách thì sử dụng lệnh writeln(f),
ngược lại sử dụng lệnh write(f,s[i]). Với f là biến file.
Chương trình:
Var s:string; i:byte; f:text;
Begin
Assign(f,’in.txt’); reset(f);
Readln(f,s); close(f);
While pos(‘ ‘,s)>0 do
delete(s,pos(‘ ‘,s),1);
Assign((f,’in.txt’); rewrite(f);
For i:=1 to length(s) do

If s[i]=’ ‘ then writeln(f) else write(f,s[i]);
Close(f);
End.

2.3. Áp dụng vào thực tế giảng dạy tại trường THPT Chu Văn An.
Chương trình Tin học lớp 11 nói chung và dữ liệu kiểu xâu nói riêng là
hay tuy nhiên kiến thức nhiều và khó nên học sinh tiếp thu kém ngay trong
một thời gian ngắn. Điều đó đòi hỏi người giáo viên phải mày mò, tìm tòi và
đặc biệt phải có kinh nghiệm giảng dạy để gây hứng thú cho học sinh. Với hệ
thống bài tập trên, tôi đã áp dụng vào giảng dạy tại trường THPT Chu Văn
An. Kết quả, học sinh lớp tôi giảng dạy cũng đã quan tâm hơn tới môn học,
đặc biệt, nhiều học sinh còn tự tìm hiểu, tham khảo thêm kiến thức môn học
từ nhiều nguồn tài liệu khác nhau. Nhiều học sinh ra trường, khi đi học tại các
trường đại học, các em cũng tâm sự “Nhờ cô giảng dạy môn Tin học lớp 11
THPT Chu Văn An

24

GV: Lê Thị Thanh Vân


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu

mà giờ em học lập trình nói riêng và môn Tin học nói chung là dễ dàng hơn
rất nhiều so với các bạn cùng lớp đại học của em, cô ạ!”. Tôi hi vọng hệ thống
bài tập này sẽ là một tài liệu tham khảo cho các bạn đồng nghiệp. Và hơn nữa,
tôi cũng mong các bạn đóng góp thêm vào hệ thống bài tập này để chúng ta
có một tài liệu hay hơn, chất lượng hơn.
Kết quả học tập của học sinh lớp giảng dạy năm học 2013-2014
Lớp

Giỏi
Khá
TB
Dưới TB
11A1 35%
63%
2%
0%
11A2 37%
60%
3%
0%
11A4 19%
73%
8%
0%
11A8 18%
64%
7%
1%
Ngoài ra, tôi cũng sử dụng hệ thống bài tập này khi luyện đội tuyển Tin
học trẻ do tỉnh đoàn tổ chức, tham gia ở bảng không chuyên. Kết quả cũng
khả quan: 1 em đạt giải nhất/1 giải, 2 em đạt giải ba/2 giải, 2 em đạt giải
khuyến khích /4 giải. Với những bài tập nêu trên, học sinh của tôi đã phần nào
say mê bộ môn Tin học hơn. Cụ thể, có một học sinh đã đạt chứng chỉ
Microsoft Office với phần mềm Power Point. Hay các em đã mạnh dạn tham
gia cuộc thi khoa học kỹ thuật với đề tài thuộc lĩnh vực Tin học,….

THPT Chu Văn An


25

GV: Lê Thị Thanh Vân


Chuyên đề: Kiểu xâu – một số bài tập liên quan đến xâu

PHẦN 3: KẾT LUẬN VÀ KHUYẾN NGHỊ
Chuyên đề trên đây do kinh nghiệm bản thân tôi đã giảng dạy tại trường
THPT Chu Văn An trong những năm qua và với những gì đã thực nghiệm tôi
mạnh dạn trao đổi với các bạn bè đồng nghiệp. Việc sử dụng kiến thức về
kiểu xâu thông qua hệ thống bài tập nêu trên và áp dụng giảng dạy tại trường
THPT Chu Văn An, bản thân tôi thấy hiệu quả. Mang lại niềm say mê, yêu
thích môn học cho học sinh. Tôi hi vọng, đây có thể là một tài liệu tham khảo
hữu ích cho các bạn đồng nghiệp trên địa bàn tỉnh Thái Nguyên. Tuy nhiên,
hệ thống bài tập này vẫn còn hạn chế như chưa có bài tập liên hệ thực tế, hệ
thống máy tính để học sinh thực hành chưa đủ. Tôi hi vọng vào thời gian tới,
hệ thống bài tập này sẽ được các bạn đồng nghiệp bổ sung thêm để hay hơn,
chất lượng hơn. Hệ thống phòng thực hành sẽ có đủ máy tính cho học sinh
thực hành.
Trên đây là toàn bộ chuyên đề sáng kiến kinh nghiệm của tôi. Rất mong
sự đóng góp ý kiến của các bạn đồng nghiệp, qua đó sẽ giúp tôi giảng dạy tốt
hơn nữa bộ môn Tin học. Một bộ môn quan trọng trong việc hình thành, 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 Tin học trong học tập và các lĩnh vực hoạt động của học sinh sau
này.

THPT Chu Văn An

26


GV: Lê Thị Thanh Vân


×