xâu kí tự (String) Trong pascal

11 20.6K 133
xâu kí tự (String) Trong pascal

Đ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

String I. Định nghĩa xâu tự (String) Xâu 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 tự (CHAR). Nhng xâu tự chỉ có thể có tối đa 255 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 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 * * * * * * * * * * * * 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]); hiệu * biểu diễn 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âu tự Khi so sánh 2 xâu máy sẽ so sánh từng cặp tự của 2 xâu từ 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ố 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âu tự VD : readln(st); Writeln(st); 1 V. Các hàm chuẩn xử lí xâu tự 1. Length (St) Hàm cho ta độ dài của xâu tự St VD : l := length(st); 2. Delete (St, Pos, Num) Thủ tục xoá đi Num tự kể từ vị trí Pos trong xâ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 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ự trong xâ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âu 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 trong xâ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 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 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 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 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 tự hoa} writeln(s);{Xuất S} readln; end. Bài 4: { Nhập một chuỗi 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 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 tự. Đếm xem trong chuỗi có bao nhiêu tự, mỗi 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 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 tự i và solan[i]} end; readln; end. Bài 6: { Viết thủ tục - Xóa n 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 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 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 trong xâ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 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 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 tự. In ra màn hình chuỗi 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 tự chỉ gồm 'A' và 'B'. Đa ra màn hình chuỗi nén theo quy luật sau. Đếm số tự kề nhau và giống nhau, thay bằng 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 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 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 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 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 tự trắng đầu S} while(s[length(s)]=' ')and(s<>'')do delete(s,length(s),1);{Xoá các 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á 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à 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à 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 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 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

Ngày đăng: 04/11/2013, 20:15

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan