OpenStax-CNX module: m17596 1 Xâu ký t. * Thu Nguyen This work is produced by OpenStax-CNX and licensed under the Creative Commons Attribution License 2.0 XÂU KÝ T. (STRING) I. KHAI BÁO KIU STRING TYPE TênKiu = STRING[Max]; VAR Tên bi n : TênKiu; 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 KIU STRING - Có th s dụng các thu tục xu t nh.p Write, Writeln, Readln ž truy xu t các bi n kiu String. - Ð truy xu t ž n ký t. th k cua 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. žu.c so sánh theo th t. t žin. IV. CÁC THU TỤC VÀ HÀM V XÂU KÝ T. 4.1. Hàm l y chi u dài cua 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; Kim 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 tra v vị trí ž u tiên cua xâu con SubSt trong xâu St, ngu.c lại hàm tra v giá trị 0. 4.4. Thu tục DELETE( Pos, Num: Byte); * Version 1.1: Sep 30, 2008 8:33 am -0500 http://creativecommons.org/licenses/by/2.0/
OpenStax-CNX module: m17596 2 Xoá trong xâu St Num ký t. b t ž u t vị trí Pos. 4.5. Thu 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. Thu 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 qua luu vào bi n St. 4.7. Thu tục VAL(St:String; Var Num; Var Code:Integer); Ði xâu s St thành s và gán k t qua luu vào bi n Num. N u vi.c chuyn ži thành công thì bi n Code có giá trị là 0, ngu.c lại bi n Code có giá trị khác 0 (vị trí cua l i). BÀI T.P M U Bài t.p 1: Vi t chuong 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 qua ra màn hình. Ví dụ :Xâu abcdabcd s e cho ra xâu ABCDABCD. For i:=1 to length(st) do St[i]:=Upcase(St[i]); Write(`Xau ket qua: `, St); Bài t.p 2: Vi t chuong trình nh.p vào m.t xâu ký t. t bàn phím. Ði xâu ký t. žó sang ch thu ng r i in k t qua ra màn hình. Ví dụ :Xâu abcdabcd s e cho ra xâu abcdabcd. For i:=1 to length(st) do If St[i] IN [`A'..'Z'] Then St[i]:=CHR(ORD(St[i])+32); Write(`Xau ket qua: `, St); Bài t.p 3: Vi t chuong trình ž m s ký t. ch s trong m.t xâu ký t. žu.c nh.p vào t bàn phím. i,d:byte; For i:=1 to length(st) do If St[i] IN [`0'..'9'] Then d:=d+1; Write(`So ky tu chu so trong xau: `, d);
OpenStax-CNX module: m17596 3 Bài t.p 4: Vi t chuong trình nh.p m.t xâu t bàn phím. In ra xâu žó sau khi xóa h t các ký t. tr ng th a trong xâu. (Ký t. tr ng th a là các ký t. tr ng ž u xâu, cu i xâu và n u gi a xâu có 2 ký t. tr ng liên ti p nhau thì có 1 ký t. tr ng th a). Procedure XoaTrangThua(Var St:String); {Xóa các ký t. tr ng ž u xâu} While St[1]=#32 Do Delete(St,1,1); {Xóa các ký t. tr ng cu i xâu} While St[Length(St)]=#32 Do Delete(St,Length(St),1); {Xóa các ký t. tr ng gi a xâu} While POS(#32#32,St)<>0 Do Delete(St,POS(#32#32,St),1); XoaTrangThua(St); Write(`Xau sau khi xoa cac ky tu trang thua: `, St); Bài t.p 5: Vi t chuong trình li.t kê các t cua m.t xâu ký t. žu.c nh.p vào t bàn phím, m i t phai žu.c vi t trên m.t dòng. Procedure XoaTrangThua(Var St:String); {Xóa các ký t. tr ng ž u xâu} While St[1]=#32 Do Delete(St,1,1); {Xóa các ký t. tr ng cu i xâu} While St[Length(St)]=#32 Do Delete(St,Length(St),1); {Xóa các ký t. tr ng gi a xâu} While POS(#32#32,St)<>0 Do Delete(St,POS(#32#32,St),1); XoaTrangThua(St); St:=St+#32; Writeln(`Liet ke cac tu trong xau: `); While POS(#32,St)<>0 Do Writeln(Copy(St,1,POS(#32,St))); Delete(St,1,POS(#32,St));
OpenStax-CNX module: m17596 4 Bài t.p 6: Vi t chuong trình nh.p vào m.t xâu ký t. t bàn phím. Tìm xâu žao ngu.c cua xâu žó r i in k t qua ra màn hình theo 2 cách: Ð. qui và không ž. qui. Ý tung: - N u xâu St có 1 ký t. thì xâu žao = St. - Ngu.c lại: Xâu žao = Ký t. cu i + Ð. qui(ph n còn lại cua xâu St). {Giai thu.t không ž. qui} Function XauDao(St:String):String; Var S:String; S:=; For i:=length(st) DowTo 1 Do S:=S+St[i]; XauDao:=S; {Giai thu.t ž. qui} Function DeQui(St:String):String; If Length(St)<=1 Then DeQui:=St Else DeQui:=St[Length(St)] + DeQui(Copy(St,1,Length(St)-1)); Write(`Xau dao nguoc: `, XauDao(St)); Bài t.p 7: Vi t chuong trình nh.p vào m.t xâu ký t. t bàn phím. Thông báo lên màn hình các ch cái có trong xâu và s lu.ng cua chúng ( Không phân bi.t ch hoa hay ch thu ng). Ý tung: - Dùng m.t mang dem v i chi s là các ch cái ž luu tr s lu.ng cua các ch cái trong xâu. - Duy.t qua t t ca các ký t. cua xâu St: N u ký t. žó là ch cái thì t ng ô bi n mang dem[st[i]] lên 1 žon vị. dem: Array[`A'..'Z'] Of Byte; ch:char; {Khi tạo mang} For ch:='a' To `Z' Do dem[ch]:=0; {Duy.t xâu}
OpenStax-CNX module: m17596 5 For i:=1 To Length(St) Do If Upcase(St[i]) IN [`A'..'Z'] Then Inc(dem[Upcase(St[i])]); {Li.t kê các ký t. ra màn hình} For ch:='a' To `Z' Do If dem[ch]>0 Then Writeln(ch,' : ',dem[ch]); Bài t.p 8: Vi t chuong trình xóa các ký t. ch s trong m.t xâu ký t. žu.c nh.p vào t bàn phím. {Hàm POSNUM kim tra xem trong xâu St có ký t. ch s hay không? N u có, hàm tra v vị trí ž u tiên cua ký t. ch s, ngu.c lại hàm tra v giá trị 0} Function POSNUM(St:String):Byte; Var OK:Boolean; OK:=False; i:=1; While (i<=length(st)) AND (Not OK) Do If St[i] IN [`0'..'9'] Then OK:=True Else i:=i+1; If OK Then POSNUM:=i Else POSNUM:=0; While POSNUM(St)<>0 Do Delete(St,POSNUM(St),1); Write(`Xau sau khi xoa: `,St); Bài t.p 9: Vi t chuong trình ž mã hoá và giai mã m.t xâu ký t. b ng cách žao ngu.c các bit cua t ng ký t. trong xâu. Uses crt; Var st:string; {Hàm žao bit ký t. c} Function DaoBit(c:char):char; Var n,i,s,bitcuoi,mask:byte; {Ði ký t. sang s } n:=ord(c); {s: k t qua žao 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 cua n}
OpenStax-CNX module: m17596 6 {L y bit cu i cùng cua n: bit c.c phai} bitcuoi:=n AND 1; n:=n shr 1; {loại bo bit cu i cùng: n:=n DIV 2} {B.t bit th i lên: t trái sang phai} if bitcuoi=1 then s:=s OR Mask; Mask:=Mask shr 1; { Mask:= Mask DIV 2} DaoBit:=CHR(s); Function MaHoa(st:string):string; Var {Ðao bit t ng ký t. trong xâu st} For i:=1 To Length(st) Do st[i]:=daobit(st[i]); Mahoa:=st; Write('Nhap xau: '); Readln(st); st:=mahoa(st); Writeln('Xau sau khi ma hoa: ',st); st:=mahoa(st); Writeln('Xau sau khi giai ma: ',st); Bài t.p 10: Vi t chuong trình th.c hi.n phép c.ng 2 s t. nhiên l n (không quá 255 ch s ). Uses crt; Var so1,so2,kqua:string; Procedure LamDayXau(Var st1,st2:string); {Them so 0 vao truoc xau ngan} var If Length(st1)>Length(st2) Then For i:=1 To Length(st1)-Length(st2) Do st2:='0'+st2 Else For i:=1 To Length(st2)-Length(st1) Do st1:='0'+st1; Function Cong(st1,st2:string):string; Var i,a,b,c,sodu:byte; code:integer; st,ch:string; st:=; sodu:=0;
OpenStax-CNX module: m17596 7 LamDayXau(st1,st2); {L y t ng s cua 2 xâu: t phai sang trái} For i:=length(st1) DownTo 1 Do {Ði ký t. sang s nguyên} Val(st1[i],a,code); Val(st2[i],b,code); {Tính tng cua 2 s a,b v a l y ra cho vào bi n c} c:=(a+b+sodu) MOD 10; {L y ph n du cua tng a+b} sodu:=(a+b+sodu) DIV 10; {Ði s nguyên c sang xâu ký t. ch} str(c,ch); {C.ng xâu ch vào bên trái xâu k t qua st} st:=ch+st; {X lý tru ng h.p s du cu i cùng >0} If sodu>0 Then str(sodu,ch); st:=ch+st; Cong:=st; Write('Nhap so thu nhat: '); Readln(so1); Write('Nhap so thu hai: '); Readln(so2); kqua:=cong(so1,so2); Writeln('Tong= ',kqua); End