Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 11 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
11
Dung lượng
174,5 KB
Nội dung
String I. Định nghĩa xâukítự(String) Xâu kítự có thể hiểu đơn giản là một mảng một chiều có kiểu phần tử là các kítự (CHAR). Nhng xâu kítự chỉ có thể có tối đa 255 kítự nhng nó có các lệnh xử lí xâu nh : xoá một đoạn trong xâu, copy một đoạn trongxâu . mà mảng kítự không có đợc II. Cách khai báo xâu VAR Tên_xâu : STRING [độ_dài_cực_đại]; VD : Ta khai báo FileName : String[20]; Sau đó ta thực hiện phép gán : FileName := 'VIDU.PAS'; Lúc này chiều dài thực sự của xâu là 8 mặc dù độ dài cực đại là 20 Ta xét cấu trúc của xâu : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 V I D U . P A S * * * * * * * * * * * * Kítự 0 chứa độ dài thực sự của xâu, ta có thể viết Độ_dài_thực_sự_của_xâu = Ord(Filename[0]); Kí hiệu * biểu diễn kítự không xác định Nếu trong quá trình thao tác, độ dài của xâu vợt quá độ dài cực đại thì máy sẽ tự động cắt bỏ phần phía sau xâu kể từ vị trí độ dài cực đại. VD : Khi ta gán FileName := 'HOI THI TIN HOC TRE KHONG CHUYEN'; Thì lúc đó FileName = 'HOI THI TIN HOC TRE '; III. Truy nhập vào phần tử của mảng Do cấu trúc của xâu tơng tự của mảng nên cách truy xuất của nó cũng tơng tự của mảng Tên_xâu [chỉ_số_phần_tử] VD : Muốn gán phần tử thứ 3 của xâu là 'A' Filename [3] := 'A'; IV. Các thao tác trên xâu 1. Phép cộng xâu VD : S1 := 'PHAN MEM '; S2 := 'SANG TAO'; S := S1 + S2; Sau đó S = 'PHAN MEM SANG TAO'; 2. So sánh xâukítự Khi so sánh 2 xâu máy sẽ so sánh từng cặp kítự của 2 xâutừ trái qua phải theo giá trị của bảng mã ASCII Nếu 2 xâu có độ dài khác nhau song số kítự giông nhau đến độ dài của xâu ngắn nhất giống nhau thì xâu có độ dài ngắn hơn thì bé hơn VD : 'FILENAME' < 'FILENAMEA' cho giá trị TRUE 'FiLENAME' < 'FILENAME' cho giá trị FALSE 'FILENAME' = 'FILENAME' cho giá trị TRUE 3. Thao tác nhập xuât Có thể dùng các hàm Write, Writeln, Readln đối với xâukítự VD : readln(st); Writeln(st); 1 V. Các hàm chuẩn xử lí xâukítự 1. Length (St) Hàm cho ta độ dài của xâukítự St VD : l := length(st); 2. Delete (St, Pos, Num) Thủ tục xoá đi Num kítự kể từ vị trí Pos trongxâu St VD : S := 'TOI DI HOC'; Delete(s,5,3); { Sau đó S = 'TOI HOC' } 3. Insert (Obj, St, Pos); Thủ tục xen xâu Obj vào xâu St tại vị trí Pos VD : S := 'THANH DA NANG'; Insert('PHO ',S,7); { Sau đó S = 'THANH PHO DA NANG' } 4. Str (Value, St) Thủ tục biến đổi giá trị bằng số nguyên hoặc thực Value thành một xâu biểu diễn số đó. Cách biểu diễn của St sẽ đợc quy cách do qui cách của Value VD : I := 512; Str(I:5,St); Sẽ cho St = ' 512'; 5. Val St, Var1, Code) Thủ tục biến đổi xâu St (biểu diễn số nguyên, thc) thành một số nguyên thực chứa trong Var1. Code là số nguyên để phát hiện lỗi, nếu phép biến đổi đúng thì Code có giá trị bằng 0. Nếu sai Code sẽ là vị trị của kítự sai. VD : St := '123.56'; Val(st,X,Result); Sẽ cho X=123.56 và Result=0 St := '123X'; Val(st,X,result); Sẽ cho X không xác định và Result=4 6. Copy (St, Pos, Size) Hàm Copy sẽ nhận Size kí tựtrongxâu St từ vị trí Pos VD : St := '123456789'; St1 := Copy(St,3,2); Sẽ cho St1='34' 7. Concat(St1,St2, .StN) Hàm ghép nối các xâu St1,St2, .StN thành xâukítự theo thứ tự đã viết VD : St1 := 'BORLAND '; St2 := 'PASCAL '; St3 := '7.0'; St := Concat(St1,St2,St3); Sẽ cho St='BORLAND PASCAL 7.0'; Cách viết này tơng tự với ST := St1 + St2 + . + StN 8. Pos (Obj, Target) Hàm trả lại vị trí đầu tiên của xâu Obj gặp trongxâu Target Pos = 0 nếu không tìm thấy VD : St := '123456789'; Pos('45',St) cho giá trị bằng 3 Pos('4X',St) @1cho giá trị 0 vì không tìm thấy 2 Bài 1:{ Nhập một chuỗi kí tự. Tỉa bỏ dấu cách bên phải, trái, tỉa giữa (nếu giữa 2 từ có nhiều dấu cách chỉ để lại 1 dấu cách VD : " que huong " -> "que huong"} uses crt; var s:string;{Xâu S} i:byte;{i kiểu byte} begin clrscr;{Xoá màn hình} write('S = ');readln(s);{Đọc S} while(s[1]=' ')and(s<>'')do delete(s,1,1);{Xoá các dấu cách đầu của S} while(s[length(s)]=' ')and(s<>'')do delete(s,length(s),1);{Xoá các dấu cách ở cuối} i:=1;{Gán i bằng 1} while i<length(s)do{Trong khi i < chiều dài của S} begin if(s[i]=' ')and(s[i+1]=' ')then delete(s,i,1){Nếu s[i]là ' ' và s[i+1]cũng là ' ' thì} else inc(i);{Ngợc lại tăng i} end; writeln('Sau khi doi : ',s);{Xuất s} readln; end. Bài 2: { Nhập chuỗi kí tự, xem chuỗi đó có đối xứng nhau không VD : "ABBA" là đối xứng "RADAr" là đối xứng "AFF" là không đối xứng Hớng dẫn i:=1;j:=length(s); while(upcase(s[i])=upcase(s[j]))and(i<=j)do begin inc(i);dec(j); end; Nếu i>j thì chuỗi đối xứng, ngợc lại thì không đối xứng} uses crt; var s:string;{Xâu S} i,j:byte;{i,j kiểu byte} begin clrscr;{Xoá màn hình} write('S = ');readln(s);{Đọc S} i:=1;j:=length(s);{Gán i bằng 1 và j bằng chiều dài s} while(upcase(s[i])=upcase(s[j]))and(i<=j)do{Trong khi s[i]=s[j] và i<=k thì} begin inc(i);dec(j);{Tăng i. Giảm j} end; if i>j then write('Xau doi xung')else write('Xau khong doi xung');{Xuất kết quả} readln; end. 3 Bài 3: { Nhập một chuỗi kí tự. Đổi chuỗi này thành a. Chữ in hoa b. Chữ in thờng c. Chữ in hoa ở đầu từ VD : luOnG tHe ViNH In ra : LUONG THE VINH luong the vinh Luong The Vinh} uses crt; var s:string;{Xâu S} i:byte;{i kiểu byte} begin clrscr;{Xoá màn hình} write('S = ');readln(s);{Đọc S} for i:=1 to length(s)do s[i]:=upcase(s[i]);{Đổi S thành hoa (dùng upcase)} writeln(s);{Xuất S} for i:=1 to length(s)do{Cho i chạy từ 1 đến độ dài S} if(s[i]>='A')and(s[i]<='Z')then s[i]:=chr(ord(s[i])+32);{Nếu s[i] trong khoảng 'A' 'Z' thì đổi s[i]thành 'a' 'z'} writeln(s);{Xuất S} s[1]:=upcase(s[1]);{Đổi s[1]thành kítự hoa} for i:=2 to length(s)do{Cho i chạy từ 2 đến độ dài S} if(s[i-1]=' ')then s[i]:=upcase(s[i]);{Nếu s[i-1]là ' ' thì đổi s[i]thành kítự hoa} writeln(s);{Xuất S} readln; end. Bài 4: { Nhập một chuỗi kí tự. Đếm xem trong chuỗi có bao nhiêu từ Quy ớc mỗi từ viết cách nhau một dấu cách VD : PHAM HUU NGON Có 3 từ Hớng dẫn Thêm kítự trắng vào đầu S S := ' '+S; Cho i chạy từ trái sang phải. Nếu s[i]là dấu cách và s[i+1] là chữ thì tăng số từ lên 1} var s:string;{Xâu S} i,so:byte;{i,so kiểu byte} begin write('S = ');readln(s);{Đọc S} so:=0;{Gán so bằng 0} s:=' '+s;{Thêm dấu cách vào đầu s} for i:=1 to length(s)-1 do{Cho i chạy từ 1 đến độ dài xâu s-1} if(s[i]=' ')and(s[i+1]<>' ')then inc(so);{Nếu s[i]là ' ' và s[i+1]khác ' ' thì tăng so} writeln('Co ',so,' tu');{Xuất so} readln; end. 4 Bài 5:{ Nhập chuỗi kí tự. Đếm xem trong chuỗi có bao nhiêu kí tự, mỗi kítự xuất hiện bao nhiêu lần. Hớng dẫn Dùng mảng solan:ARRAY[0 255]OF byte để lu số lần xuất hiện của các kítự có mã ASCII. VD : Chữ A xuất hiện 3 lần thì ta có solan[ord('A')]=3 hay solan[65]=3} uses crt; var s:string;{Xâu S} solan:array[0 255]of byte;{Mảng solan 0 255 kiểu byte} i:byte;{i kiểu byte} begin clrscr;{Xoá màn hình} write('S = ');readln(s);{Đọc S} for i:=1 to length(s)do{Cho i chạy từ 1 đến độ dài S} inc(solan[ord(s[i])]); for i:=0 to 255 do{Cho i chạy từ 0 đến 255} if solan[i]>0 then{Nếu solan[i]>0 thì} begin writeln('Ki tu ',chr(i),' xuat hien ',solan[i],' lan');{Xuất kítự i và solan[i]} end; readln; end. Bài 6: { Viết thủ tục - Xóa n kítựtừ vị trí v của chuỗi S (giống Delete(s,v,n)của Pascal) - Chèn S1 vào sau vị trí v của xâu S (giống Insert(s1,s,v)của Pascal) Hớng dẫn Chúng ta coi chuỗi là mảng các kí tự. Sau khi thực hiện các thao tác xoá, dồn trên chuỗi. Ta gán lại chiều dài của chuỗi bằng cách s[0]:=chr(n); N là chiều dài thực sự} uses crt; var s:string;{Xâu S} procedure xoa(var s:string;v,n:byte); var i:byte;{Khai báo i kiểu byte} begin for i:=v to v+n-1 do{Cho i chạy từ v đến độ dài v+n-1} s[i]:=s[i+n];{Gán s[i]bằng s[i+n]} s[0]:=chr(length(s)-n);{Cập nhât lại độ dài thực sự xâu S} end; procedure chen(s1:string;var s:string;v:byte); var i,l:byte;{Khai báo i,l kiểu byte} begin l:=length(s1);{Gán l bằng độ dài xâu S1} for i:=length(s)+l downto v+l do{Cho i chạy từ độ dài S+l đến độ dài v+l} s[i]:=s[i-l];{Gán s[i]bằng s[i-l]} for i:=1 to l do{Cho i chạy từ 1 đến l} 5 s[v+i-1]:=s1[i];{Gán s[v+i-1]bằng s1[i]} s[0]:=chr(length(s)+l);{Cập nhât lại độ dài thực sự xâu S} end; begin clrscr;{Xoá màn hình} s:='PHAM HUU NGON'; xoa(s,6,4); writeln(s); chen('HUU ',s,6); writeln(s); readln; end. Bài 7: { Viết hàm - Trích n kítựtừ vị trí v của chuỗi S (giống hàm Copy(s,v,n)của Pascal) - Trả lại vị trí đầu tiên có mặt của chuỗi S1 trongxâu S (giống hàm POS(s1,s) của Pascal)} uses crt; var s:string;{Xâu S} function chep(s:string;v,n:byte):string; var s1:string;{Xâu s1} i:byte;{i kiểu byte} begin for i:=1 to n do{Cho i chạy từ 1 đến N} s1[i]:=s[v+i-1];{Gán s1[i]bằng s[v+i-1]} s1[0]:=chr(n);{Cập nhât lại độ dài thực sự xâu S} chep:=s1;{Gán chep bằng s1} end; function tim(s1:string;s:string):byte; var i:byte;{Khai báo i kiểu byte} begin for i:=1 to length(s)-length(s1)+1 do{Cho i chạy từ 1 đến độ dài s-độ dài s1+1} if chep(s,i,length(s1))=s1 then{Nếu chep(s,i,length(s1))=s1 thì} begin tim:=i;{Gán tim bằng i} exit;{Thoát khỏi chơng trình con} end; tim:=0;{Gán tim bằng 0} end; begin clrscr;{Xoá màn hình} s:='PHAM HUU NGON'; writeln(chep(s,6,3)); writeln(tim('NGON',s)); readln; end. 6 Bài 8: { Đọc một chuỗi kí tự. Cho chạy quảng cáo trên màn hình a. Từ trái qua phải b. Từ phải qua trái c. Chạy cùng lúc 2 dòng kítựtừ bên trái và bên phải vào giữa màn hình Hớng dẫn Viết thủ tục viet(x,y:integer;s:string) có tác dụng viết chuỗi s ở vị trí x,y} uses crt; var x,y:integer;{x,y kiểu integer} s:string;{Xâu S} procedure viet(x,y:integer;s:string); var l:byte;{Khai báo l kiểu byte} begin l:=length(s);{Gán l bằng độ dài S} if x<0 then{Nếu x<0 thì} begin gotoxy(1,y);{Di chuyển tới (1,y)} write(copy(s,1-x,79)); end else begin if x>0 then gotoxy(x,y)else gotoxy(1,y);{Nếu x>0 thì di chuyển tới (x,y)ngợc lại tới (1,y)} write(copy(s,1,80-x)); end end; begin clrscr;{Xoá màn hình} write('S = ');readln(s);{Đọc S} for x:=80 downto -length(s)do{Cho i chạy từ 80 xuống -length(s)} begin viet(x,12,s); delay(40); gotoxy(1,12);clreol;{Xoá dòng 12} end; for x:=-length(s)to 80do{Cho i chạy từ -length(s)đến 80} begin viet(x,12,s); delay(40); gotoxy(1,12);clreol;{Xoá dòng 12} end; for x:=80 downto -length(s)do{Cho i chạy từ 80 xuống -length(s)} begin viet(x,12,s);viet(-length(s)+80-x,12,s); delay(40); gotoxy(1,12);clreol;{Xoá dòng 12} end; end. 7 Bài 9:{ Đọc một chuỗi kí tự. In ra màn hình chuỗi kítự đó a. Căn trái màn hình b. Căn phải màn hình c. Căn giữa màn hình} var s:string;{Xâu S} i:byte;{i kiểu byte} begin write('S = ');readln(s);{Đọc S} writeln(s); writeln(s:80); writeln(s:40+(length(s)div 2)); readln; end. Bài 10: { Đọc từ bàn phím chuỗi kítự chỉ gồm 'A' và 'B'. Đa ra màn hình chuỗi nén theo quy luật sau. Đếm số kítự kề nhau và giống nhau, thay bằng kítự đại diện và số đã nén. Nếu số đã nén bằng 1 thì không ghi số nén chỉ ghi kítự VD : AAAAAABAAABBBBBAABABBBBB Chuỗi sau khi nén A6BA3B5A2BAB5 Hớng dẫn Bạn cần dùng thêm hàm Str(I,S)để đổi số I sang chuỗi} var s,s1,tam:string;{Xâu s,s1,tam} ch:char;{ch kiểu kí tự} i,j,solan:byte;{i,j,solan kiểu byte} begin write('S = ');readln(s);{Đọc S} s1:='';{Gán s1 bằng rỗng} ch:=s[1];{Gán ch bằng s[1]} i:=1;{Gán i bằng 1} while i<=length(s) do{Trong khi i<=length(s)} begin j:=i;{gán j bằng i} s1:=s1+ch;{Cộng ch vào sau s1} repeat inc(j)until(s[j]<>ch)or(j>length(s));{Tăng j cho đến khi đổi kítự hoặc j>chiều dài S} if j-i>1 then{Nếu j-i>1 thì} begin str(j-i,tam);{Đổi j-i sang chuỗi tam} s1:=s1+tam;{Cộng tam vào sau s1} end; i:=j;{Gán i=j} if ch='A' then ch:='B' else ch:='A';{Gán ch bằng kítự ngợc lại} end; writeln(s1);{Xuất s1} readln; end. 8 Bài 11:{ Nhập N. Sau đó nhập N tên ngời (họ tên) a. Đổi chuỗi thành các chữ cái hoa. Sau đó đảo tên ngời lên đầu. In ra màn hình các chuỗi sau khi đảo. b. Sắp xếp tên ngời theo tên, nếu cùng tên thì xếp theo họ VD : VU NAM HO NAM TRAN ANH In ra : NAM VU Sau đó : TRAN ANH NAM HO HO NAM ANH TRAN VU NAM Hớng dẫn a. Cần xây dựng thủ tục dao(s)để đảo tên b. Dựa vào câu a chỉ, và viết thêm thủ tục tỉa các dấu cách (bài 1). Sau đó ta so sánh chuỗi nh bình thờng. Sau khi so sánh và đổi chỗ ta lại đảo tên ra cuối} uses crt; var s:array[1 20]of string;{Mảng s gồm 20 xâu} i,j,n:byte;{i,j,n kiểu byte} tg:string;{Xâu tg} procedure tia(var s:string); var i:byte;{Khai báo i kiểu byte} begin while(s[1]=' ')and(s<>'')do delete(s,1,1);{Xoá các kítự trắng đầu S} while(s[length(s)]=' ')and(s<>'')do delete(s,length(s),1);{Xoá các kítự trắng cuối S} i:=1;{Gán i bằng 1} while i<length(s)do{Trong khi i<length(s) thì} begin if(s[i]=' ')and(s[i+1]=' ')then delete(s,i,1){Nếu s[i]=' ' và s[i+1]=' ' thì xoá kítự thứ i} else inc(i);{Ngợc lại tăng i} end; end; procedure dao(var s:string); var i:byte;{Khai báo i kiểu byte} begin for i:=length(s)downto 1 do{Cho i chạy từ length(s) xuống 1} if s[i]=' ' then break;{Nếu s[i] là kítự rỗng thì ngừng} s:=copy(s,i+1,255)+' '+copy(s,1,i-1); end; procedure daolai(var s:string); var i:byte; begin for i:=1 to length(s)do{Cho i chạy từ 1 đến length(s)} if s[i]=' ' then break;{Nếu s[i] là kítự rỗng thì ngừng} s:=copy(s,i+1,255)+' '+copy(s,1,i-1); end; begin clrscr;{Xoá màn hình} write('N = ');readln(n);{Đọc N} for i:=1 to n do 9 begin write('S [',i,'] = ');readln(S[i]);{Đọc S[i]} tia(s[i]); for j:=1 to length(s[i])do s[i,j]:=upcase(s[i,j]);{Đổi s[i] thành chữ hoa} dao(s[i]); end; writeln('Sau khi dao'); for i:=1 to n do writeln(s[i]);{Xuất N xâu} for i:=1 to n-1 do{Cho i chạy từ 1 đến n-1} for j:=i+1 to n do{Cho i chạy từ i+1 đến n} if s[i]>s[j]then{Nếu s[i]>s[j] thì} begin tg:=s[i];s[i]:=s[j];s[j]:=tg;{Đổi chỗ s[i],s[j]} end; writeln('Sau khi sap xep'); for i:=1 to n do{Cho i chạy từ 1 đến n} begin daolai(s[i]); writeln(s[i]);{Xuất s[i]} end; readln; end. Bài 12:{ Nhập 2 số nguyên dơng A,B (có thể lên đến 200 chữ số). Tính tổng 2 số đó Hớng dẫn Vì A,B quá lớn nên ta phải dùng xâu để lu rồi sau đó phải viết thủ tục cộng 2 chuỗi} uses crt; var a,b:string;{a,b kiểu string} function cong(a,b:string):string; var tong:string;{tong kiểu string} la,lb:byte;{la,lb kiểu byte} i,c,nho:byte;{i,c,nho kiểu byte} begin la:=length(a);lb:=length(b);{Gán la,lb bằng độ dài A,B} if la<lb then{Nếu la<lb thì} for i:=1 to lb-la do a:='0'+a{Điền lb-la kítự '0' và trớc A} else for i:=1 to la-lb do b:='0'+b;{Ngợc lại điền la-lb kítự '0' và trớc B} tong:='';{Gán tong bằng xâu rỗng} nho:=0;{Gán nho bằng 0} for i:=length(a) downto 1do{Cho i chạy từ độ dài A xuống 1} begin c:=ord(a[i])+ord(b[i])-96+nho; if c>9 then{Nếu c>9 thì} begin nho:=1;{Gán nho bằng 1} c:=c-10;{Giảm c đi 10} end else nho:=0;{NGợc lại gán nho bằng 0} 10 . nghĩa xâu kí tự (String) Xâu kí tự có thể hiểu đơn giản là một mảng một chiều có kiểu phần tử là các kí tự (CHAR). Nhng xâu kí tự chỉ có thể có tối đa 255 kí. kí tự nhng nó có các lệnh xử lí xâu nh : xoá một đoạn trong xâu, copy một đoạn trong xâu. mà mảng kí tự không có đợc II. Cách khai báo xâu VAR Tên_xâu