1. Trang chủ
  2. » Giáo án - Bài giảng

Chuyên đề xâu kí tự BDHSG tin 9

44 592 4

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 44
Dung lượng 106,01 KB

Nội dung

Chuyên đề bồi dưỡng học sinh giỏi tin học 9 tổng hợp lí thuyết và các dạng bài tập cơ bản và nâng cao về xâu kí tự trong pascal. Các bài tập có lời giải cho học sinh thực hành `......................................................................................................

CHUYÊN ĐỀ XÂU KÍ TỰ A- KIẾN THỨC CƠ BẢN I CÁCH KHAI BÁO VÀ TRUY XUẤT ĐẾN PHẦN TỬ XÂU Cách khai báo: Var: STRING[độ dài xâu]; - Xâu ký tự nhớ chiếm số byte số ký tự cực đại khai báo cộng với byte chứa số ký tự có xâu Độ dài tối đa xâu ký tự 255 - Ngồi có kiểu khai báo khác xâu như: + Shortstring: Chính String + longstring: 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ó free pascal mà khơng có turbo pascal) có kích thước gần 2GB = 230 B nên thường xem vô hạn Cách nhập/xuất: Cách đọc hay viết kiểu STRING tương tự kiểu liệu khác, ta sử dụng thủ tục READ, WRITE Ví dụ: Readln(st); Writeln(st); Truy cập phần tử xâu ký tự: Việc truy cập đến phần tử xâu tương tự mảng chiều thông qua tên biến kiểu STRING số Ví dụ: St := 'Le Thanh Lam'; write(st[4]); -> Kết quả: cho chữ T II CÁC THAO TÁC TRÊN XÂU KÝ TỰ Phép cộng xâu: Ví dụ: st1:=’tin’; st2:=’ hoc’; St=st1 + st2; -> St = ‘tin hoc’ Phép so sánh: Hai xâu ký tự so sánh với phép so sánh =, >, st2 Các thủ tục hàm chuẩn xử lý xâu ký tự a Hàm length(st): cho độ dài thực xâu ký tự st Ví dụ: st:=’tin hoc’ LENGTH(st) cho b Hàm upcase(ch): Cho ký tự hoa ký tự ch Ví dụ: ch:= 'a'; ch:= upcase(ch) ® ch = 'A' Ví dụ: Viết đoạn chương trình nhập vào xâu ký tự Đổi xâu sang chữ in hoa in kết hình var s,s1:string; i:integer; begin write('nhap xau s:'); readln(s); s1:=''; for i:=1 to length(s) s1:=s1+ upcase(s[i]); write(s1); readln; end c Hàm Ord(ch): Cho mã ký tự ch bảng mã ASCII Ví dụ: ch:='a'; n:= Ord(ch) ® n= 97 d Hàm Chr(n): Cho ký tự có mã n Ví dụ: Viết đoạn chương trình nhập vào xâu ký tự Đổi xâu sang chữ thường in xâu hình theo thứ tự ngược lại * Ý tưởng: Để thực chuyển đổi ký tự ch dạng hoa sang dạng thường trước hết ta sử dụng hàm ord(ch) để lấy mã ký tự đó, sau sử dụng hàm chr(ord(ch)+32) để ký tự thường ký tự hoa ch (vì mã ký tự hoa ch lệch mã ký tự thường tương ứng 32 như: ord('A')=65, ord('a')=97) var s,s1:string; i:integer; begin write('nhap xau s:'); readln(s); s1:=''; for i:=1 to length(s) if s[i] in ['A' 'Z'] then s1:=s1+ chr(ord(s[i])+32) else s1:=s1+s[i]; for i:=length(s1) downto write(s1[i]); readln; end e Thủ tục DELETE(st, pos, num): xóa num ký tự xâu st kể từ vị trí pos Ví dụ: st= ‘tin hoc’; Delete(st,4,4); lúc st cho ‘tin’ f Hàm POS(st1,st2): hàm cho vị trí tìm thấy xâu s1 xâu s2 Ví dụ: POS(‘tin’,‘tin hoc’) = Ví dụ: Viết đoạn chương trình nhập vào xâu ký tự In xâu sau xóa hết ký tự trắng thừa xâu (Ký tự trắng thừa ký tự đầu xâu, cuối xâu xâu có ký tự trắng liên tiếp có ký tự trắng thừa) * Ý tưởng: - Sử dụng hàm Pos(' ',s) để biết vị trí i xuất ký tự trắng sử dụng thủ tục Delete(s,i,1) để xóa ký tự thứ i xâu s - Để xóa ký tự trắng đầu xâu ta thực lệnh: while s[1]=' ' delete(s,1,1); - Để xóa ký tự trắng cuối xâu ta thực lệnh: while s[length(s)] = ' ' delete(s,length(s),1); - Để xóa ký tự trắng xâu ta thực lệnh: while pos(' ',s)0 delete(s, pos(' ',s),1); var s:string; begin write('nhap xau s:'); readln(s); while s[1]=' ' delete(s,1,1); while s[length(s)]=' ' delete(s,length(s),1); while pos(' ',s)0 delete(s,pos(' ',s),1); write(s); readln; end g Thủ tục INSERT(st1, st2, pos): Thủ tục cho kết cách chèn xâu ký tự có tên st1 vào xâu st2 vị trí pos, ký tự đứng sau pos dời phía sau xâu ký tự st2 Ví dụ: st1:= ‘tin ‘; st2:=’hoc kho’; INSERT(st1,st2,5) ® st2=’hoc tin kho’; Ví dụ: Viết đoạn chương trình nhập vào xâu s1, s2, s (với xâu s1 xuất lần xâu s) Tìm thay xâu s1 thành xâu s2 xâu s Chẳng hạn: s1 := 'hoc'; s2:= 'bai tap'; s :='hoc tin hoc'; kết sau thay s1 thành s2 s = 'bai tap tin hoc' var s1,s2,s: string; i:byte; begin write('nhap s1:'); readln(s1); write('nhap s2:'); readln(s2); write('nhap xau s:'); readln(s); i:= pos(s1,s); delete(s,i,length(s1)); insert(s2,s,i); write(s); readln; end h Thủ tục STR(value, st): Thủ tục thực việc chuyển đối giá trị kiểu số(value) sang dạng xâu ký tự gán cho biến st Ví dụ: n:=2014; STR(n,st) cho kết xâu st là: st=’2014’; i Thủ tục VAL(st, value,code) đổi xâu ký tự st sang dạng số gán cho biến value, biến đối thành cơng code nhận giá trị ngược lại cho giá trị khác khơng Ví dụ: VAL(‘2014’,value,code) lúc code nhận giá trị value=2014 Ví dụ: Viết đoạn chương trình nhập vào số tự nhiên a có n số Hãy tạo số b từ số a cách in ngược có số xuất a Chẳng hạn số a = 123 b=321 var a,b:Qword; s,s1:string; i,code:longint; begin write('nhap a:'); readln(a); str(a,s); s1:=''; for i:=length(s) downto s1:=s1+s[i]; val(s1,b,code); write(b); readln; end j Hàm CONCAT(s1,s2,…,sn): hàm cho xâu cách nối xâu s1,s2, …,sn lại với Ví dụ: CONCAT(‘hoc ’, ‘tin ’) = ‘hoc tin’; k Hàm COPY(st, pos, num): chép xâu st, num ký tự vị trí pos, Ví dụ: st=’tin hoc’; COPY(st,5,3) = ‘hoc’; Ví dụ: Viết đoạn chương trình nhập vào xâu S (khơng có dấu cách vơ nghĩa) Đưa từ dài xuất xâu S Chẳng hạn: s = 'xin chao ban' ®kết tìm từ 'chao' * Ý tưởng: Dùng hàm pos để xác định ví trí ký tự trống xuất xâu s Từ xác định độ dài từ s Nếu ta thực xóa từ xâu s lặp lại thao tác ta tìm từ tiếp theo, đồng thời ta tìm từ có độ dài lớn * Chương trình: var s,tumax:string; begin write('nhap xau s:'); readln(s); while pos(#32,s)0 begin if pos(#32,s)>length(tumax) then tumax:=copy(s,1,pos(#32,s)); delete(s,1,pos(#32,s)); end; writeln(tumax); readln; end B CÁC DẠNG BÀI TẬP THƯỜNG GẶP Dạng Xử lý số nguyên lớn Phương pháp chung: Để thực phép tính xử lý với số nguyên phạm vi biểu diễn cung cấp, cách đơn giản sử dụng xâu kí tự để biểu diễn với ký tự xâu tương ứng với chữ số số nguyên lớn tính từ trái qua phải Dưới xin đưa số ứng dụng kiểu xâu xử lý số lớn Bài Cộng, trừ số nguyên lớn Cho hai số nguyên dương lớn có có độ dài khơng q 200 chữ số Hãy đưa tổng hiệu số nguyên * Ý tưởng: Sử dụng xâu để lưu số lớn Trước hết cho xâu cách chèn thêm nhiều ký tự '0' vào trước xâu ngắn Việc thực cộng số thực cách cộng cặp ký tự số tương ứng từ phải sang trái xâu (Đối với phép trừ số nguyên thực tương tự) * Đoạn chương trình: function Add(s1,s2:string):string; var i,nho,z,x,y:longint; s:string; begin while length(s1)=s2 then sub:=sub1(s1,s2) else sub:='-'+sub1(s2,s1); end; Bài Ghép số lớn (http://vn.spoj.com/problems/NUMCON/) Vaxia viết số lớn cuộn giấy dài muốn khoe với anh trai Petia thành vừa đạt Tuy nhiên, Vaxia vừa khỏi phòng để gọi anh trai em Kachia chạy vào phịng xé rách cuộn giấy thành số mảnh Kết mảnh có vài kí số theo thứ tự viết Bây Vaxia nhớ xác viết số Vaxia nhớ số lớn Để làm hài lịng cậu em trai, Petia định truy tìm số lớn mà Vaxia viết lên cuộn giây trước bị xé Bạn giúp Petia làm việc Dữ liệu vào: Ghi nhiều dịng Mỗi dịng ghi dãy kí số Số dịng khơng vượt q 100 Mỗi dịng ghi từ đến 100 kí số Bảo đảm có dịng mà kí số khác Dữ liệu ra: Ghi số lớn viết cuộn giấy trước bị xé rách Ví dụ Input Output 66220004 20 004 66 3 * Ý tưởng: Lưu số dạng mảng kiểu xâu, thực xếp mảng theo thứ tự tăng dần theo tiêu chí xếp phần tử s[i] đứng trước phần từ s[j] (s[i] ghép với s[j]) > (s[j] ghép với s[i]) * Chương trình tham khảo var s: array[0 1000] of string; i,n,j: word; {===================} procedure qsort(L,H: word); var tg,k:string; begin if l>=h then exit; i:=l; j:=h; tg:=s[(l+h) div 2]; repeat while tg+s[i]s[j]+tg dec(j); if ilength(s); for i:=1 to begin k:=i; for j:=i to length(s)+i-5 if s[k]i then delete(s,i,k-i); end; writeln(copy(s,1,5)); end; {===========================} Begin Nhap; xuly; readln; end Bài Số nhỏ (Đề thi học sinh giỏi lớp 11 tỉnh Hà Tĩnh năm 2008-2009) Một số nguyên dương n lớn cho P (P£20) số nguyên dương A P xâu ký tự s1, s2, ,sp (độ dài xâu không vượt 255) gồm số thập phân cách viết s1 liên tiếp A1 lần 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 cho cho trước số nguyên dương k nhỏ số chữ số N Hãy tìm cách gạch k chữ số N để nhận số có giá trị nhỏ Ví dụ: Vào Kết p=3, k =11 44 a1=3, a2 = 4, a3 = s1 = 123, s2=0, s3 = 45 * Ý tưởng: Ở toán N số nguyên lớn nên ta sử dụng xâu để biểu diễn nó, giả sử số n lớn ghép lại m ký tự khác sau xóa ta cịn lại m-k chữ số n Lần lượt tìm m chữ số nhỏ xâu lại ta kết 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; 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 readln(a[i]); for i:=1 to p readln(s[i]); for i:=1 to p For j:=1 to A[i] 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 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 Dạng Biến đổi xâu Phương pháp chung: Đây dạng thường gặp, việc biến đổi xâu thực ký tự xâu nên cần nắm rõ hàm, thủ tục kiểu liệu xâu để vân dụng cách linh hoạt vào tập cụ thể Bài Rút gọn xâu (Đề thi HSG lớp 12 tỉnh Nghệ An năm 2009-2010) Cho xâu S gồm chữ in thường với độ dài tối đa 250 ký tự Em viết chương trình để tạo xâu SG từ xâu S cách xóa ký tự liên tiếp giống xâu S để lại kí tự đại diện đoạn Dữ liệu vào: Đọc từ file văn XAUGON.INP chứa xâu S gồm chữ in thường Kết quả: Ghi file văn XAUGON.OUT xâu SG tìm Ví dụ: XAUGON.INP XAUGON.OUT hhooocccsssiiiiinnnhhh hocsinh * Ý tưởng: Duyệt từ đầu xâu đến cuối xâu, gặp ký tự liên tiếp khác giống xóa ký tự * Chương trình tham khảo: const fi='xaugon.inp'; fo='xaugon.out'; Var s:string;f:text; {========} procedure doc; begin assign(f,fi); reset(f); readln(f,s); end; {========} procedure xuly; var ch,kt:char; i,max,dem:longint; begin assign(f,fo); rewrite(f); i:=1; while ilength(max) then max:=kq; end; writeln(f,max); close(f); end; {==============} begin doc; xuly; end Bài Liệt kê chữ (đề thi học sinh giỏi lớp 12 năm học 2011-2012 tỉnh Bạc Liêu) Cho văn chứa tệp văn Bạn viết chương trình liệt kê chữ có mặt văn lần theo thứ tự bảng chữ (không phân biệt chữ hoa chữ thường) Dữ liệu vào: Tệp Dem_chu.inp gồm nhiều dòng chứa ký tự tệp Dữ liệu ra: Tệp Dem_chu.out gồm nhiều dòng ghi ký tự xuất lần Dem_chu.inp Dem_chu.out NAM MOI HANH PHUC C I O 33 P U const fi='dem_chu.inp'; fo='dem_chu.out'; var s:ansistring; b:array['A' 'Z'] of longint; f,g:text; i:longint; ch:char; {===============} begin assign(f,fi); reset(f); assign(g,fo); rewrite(g); fillchar(b,sizeof(b),0); While not eof(f) begin readln(f,s); for i:=1 to length(s) if s[i]' ' then inc(b[upcase(s[i])]); end; for ch:='A' to 'Z' if b[ch]=1 then writeln(g,ch); close(f); close(g); end Bài Tìm số (đề thi học sinh giỏi lớp 12 bảng A năm học 2011-2012 tỉnh Bạc Liêu) Cho xâu s gồm kí tự số Xóa bỏ số kí tự xâu s để lại kí tự số cho vân giữ nguyên thứ tự chúng tạo nên số có giá trị lớn Dữ liệu vào: Từ tệp cau2.inp gồm dòng chứa xâu s Dữ liệu ra: ghi vao tệp cau2.out xâu s chứa kí tự số cịn lại tạo thành số lớn cau2.inp cau.out 124512hoctin8126123 863 var f,g:text; s:string; {=====================} procedure Nhap; Begin assign(f,'cau2.inp'); reset(f); read(f,S); close(f); end; {======================} procedure xuly; var i,j,k:byte; 34 begin i:=1; repeat if s[i] in ['0' '9'] then inc(i) else delete(s,i,1); until i>length(s); for i:=1 to begin k:=i; for j:=i to length(s)+i-3 if s[k]i then delete(s,i,k-i); end; assign(f,'cau2.out'); rewrite(f); writeln(f,copy(s,1,3)); close(f); end; {===========================} Begin Nhap; xuly; readln; end Bài 10 Siêu đối xứng (http://vn.spoj.com/problems/NKSP) Một xâu có độ dài lớn gồm chữ la tinh in thường gọi đối xứng, ta đọc xâu từ trái sang phải từ phải sang trái Một xâu gọi siêu đối xứng, xâu đối xứng tạo thành cách ghép liên tiếp từ nhiều xâu đối xứng Yêu cầu: Cho xâu S, đếm số xâu siêu đối xứng S.( Xâu xâu S đoạn liên tiếp ký tự S) Dữ liệu Chứa xâu S với độ dài không vượt 1000 Kết Ghi số xâu tìm Ví dụ Dữ liệu abc Kết Dữ liệu abacdc Kết const fi=''; var s:ansistring; f:text; A:array[1 1000,1 1000] of boolean; kq,i,j,k,n:longint; 35 {=============} function kt(x,y:longint):boolean; var u,h:longint; begin h:=(y-x) shr 1; for u:=0 to h if S[x+u]S[y-u] then exit(false); exit(true); end; {=============} begin assign(f,fi); reset(f); read(f,s); close(f); kq:=0; n:=length(s); for i:=1 to n-1 for j:=i+1 to n if kt(i,j) then A[i,j]:=true else A[i,j]:=false; for i:=1 to n-3 for j:=i+3 to n for k:=i+1 to j-2 if (A[i,k])and(A[k+1,j]) then begin A[i,j]:=true;break;end; for i:=1 to n-1 for j:=i+1 to n if A[i,j] then inc(kq); write(kq); end • • • • • • Bài 11 Writing (Nguồn http://vn.spoj.com/submit/PBCWRI) Cho chuỗi A,B chứa chữ bảng chữ tiếng Anh (có chữ hoa chữ thường) Chuỗi A có độ dài n, chuỗi B có độ dài m Yêu cầu: Đếm số lần xuất hoán vị chuỗi A chuỗi B Dữ liệu Dòng chứa số nguyên n m Dịng thứ chứa n kí tự chuỗi A Dịng thứ chứa m kí tự chuỗi B Kết qủa Một số kết toán Giới hạn n ≤ 3000 m ≤ 000 000 Ví dụ 36 Dữ liệu 11 cAda AbrAcadAbRa Kết Giải thích: lần vị trí Const fi='PBCWRI.INP'; fo='PBCWRI.OUT'; Var B:array[1 3000001] Of Char; D1,D2:array['a' 'z'] Of Longint; C1,C2:array['A' 'Z'] Of Longint; n,m,kq,i,x:Longint; h:char; f,g:text; Begin assign(f,fi); reset(f); assign(g,fo); rewrite(g); Readln(f,n,m); If m='a') And (h='a') And (B[i]='a') And (B[i]='a') And (B[x]b[m2] then begin tg:=b[m1]; b[m1]:=b[m2]; b[m2]:=tg; end; writeln(f,b[1]); for m1:=2 to dem if b[m1]b[m1-1] then writeln(f,b[m1]); end; close(f); end; {=========} begin doc; try(1); xuly; end Bài 14 Ghép xâu Cho xâu ký tự S1, S2 Có thể ghép số lần liên tiếp xâu S1 để xâu S2 hay không? Dữ liệu: Vào từ tệp Xau.inp - Dòng Ghi xâu S1 - Dòng 2: Ghi xâu S2 Kết quả: Ghi vào tệp Xau.out số K số lần ghép liên tiếp xâu S1 để xâu S2, trường hợp ngược lại ghi số xau.INP xau.OUT ACM ACMACMA CM const fi='xau.inp'; fo='xau.out'; var s1,s2,s:ansistring; i,dem:longint; f,g:text; 42 {==========} begin assign(f,'xau.inp'); reset(f); assign(g,'xau.out'); rewrite(g); readln(f,s1); readln(f,s2); s:=s2; dem:=0; while (length(s)>0) and (pos(s1,s)0) begin inc(dem); delete(s,pos(s1,s),length(s1)); end; if length(s)0 then write(g,0) else write(g,dem); close(f); close(g); end Bài 15 Tiền tố hậu tố Xâu a gọi tiền tố xâu b xâu a trùng với phần đầu xâu b Ví dụ pre tiền tố củaprefix Xâu a gọi hậu tố xâu b xâu a trùng với phần cuối xâu b Ví dụ fix hậu tố củasuffix yenthanh132 vừa học tiền tố hậu tố nên hôm đố bạn toán đơn giản tiền tố hậu tố sau: • Cho xâu a,b gồm kí tự latin thường ('a' đến 'z') • Tìm xâu c thỏa mãn: Xâu a tiền tố xâu c Xâu b hậu tố xâu c Độ xài xâu c ngắn Input • Dịng 1: Xâu a • Dịng 2: Xâu b Output • Một dịng xâu c Giới hạn: • 40% số test có độ dài xâu a,b

Ngày đăng: 27/11/2020, 11:06

TỪ KHÓA LIÊN QUAN

w