I/-Khai báo:
- Khai báo gián tiếp:
Type
[Tên kiểu] = String[n]; hoặc [Tên kiểu] = String;
Var
[Tên biến]: [Tên kiểu];
- Khai báo trực tiếp:
CHƯƠNG 6: KIỂU CHUỖI KÝ TỰ I/-Khai báo: - Khai báo gián tiếp: Type [Tên kiểu] = String[n]; hoặc [Tên kiểu] = String; Var [Tên biến]: [Tên kiểu]; - Khai báo trực tiếp: Var [Tên biến]: String[n]; hoặc [Tên biến]: String; Trong đó: n là độ dài của chuỗi (nếu không khai báo n thì độ dài của chuỗi là 255 ký tự) Ví dụ: (Khai báo trực tiếp) Var hoten:string[25]; diachi:string; Ví dụ: (Khai báo gián tiếp) Type ht = string[25]; dc = string; Var hoten:ht; diachi:dc; II/- Nhập / Xuất dữ liệu kiểu chuỗi: Nhập xuất dữ liệu kiểu chuỗi cũng sử dụng các cặp câu lệnh (Readln,Writeln...) như các kiểu dữ liệu khác. Chú ý: Nếu dữ liệu nhập vào lớn hơn độ dài của chuỗi thì các ký tự thừa sẽ bị mất Ví dụ: VCT nhập vào tên hai người sau đó in ra màn hình để kiểm tra. Program Nhap_chuoi; uses crt; Var ten1,ten2: string[7]; begin clrscr; writeln('Chuong trinh minh hoa thu tuc Nhap / Xuat chuoi'); write('Nhap ten nguoi thu nhat: ');readln(ten1); write('Nhap ten nguoi thu hai: ');readln(ten2); writeln; write('Ten cua hai nguoi vua nhap la: '); writeln(ten1,' va ',ten2); readln; end. III/- Truy xuất đến từng ký tự của kiểu chuỗi: Mỗi ký tự của chuỗi được truy xuất thông qua Tên biến chuỗi cùng với chỉ số của chuỗi để trong cập dấu [ ]. Chẳng hạn ht[1] chỉ ký tự thứ nhất của chuỗi ht. Biến [i]; Ví dụ 1: VCT nhập vào một chuỗi sau đó yêu cầu người dùng nhập vào vị trí ký tự cần truy xuất. In ký tự đó ra màn hình để kiểm tra. Program truy_xuat_chuoi; uses crt; Var chuoi: string; i: integer; begin clrscr; writeln('Chuong trinh truy xuat den tung ky tu cua chuoi'); writeln(' *********************'); write('Nhap vao mot chuoi: ');readln(chuoi); write('Ban muon truy xuat ky tu thu may ?: ');readln(i); writeln('Ky tu thu: ',i:2,' la chu: ',chuoi[i]); writeln; writeln(' Bam phim Enter de ket thuc'); readln; end. Ví dụ 2: VCT nhập vào một chuỗi, sau đó in chuỗi vừa nhập ra màn hình để kiểm tra bằng cách sử dụng lệnh For. Program truy_xuat_chuoi; uses crt; Var chuoi: string; i,n: integer; begin clrscr; writeln('Chuong trinh truy xuat den tung ky tu cua chuoi'); writeln(' *********************'); write('Nhap vao mot chuoi: ');readln(chuoi); n:=length(chuoi); {Ham tinh chieu dai chuoi} writeln; writeln('Cac ky tu vua nhap la:'); for i:=1 to n do begin writeln(chuoi[i]); delay(1000); {Ham tri hoan thoi gian tinh theo miligiay} end; writeln; writeln(' Bam phim Enter de ket thuc'); readln; end. IV/- Các phép toán trên chuỗi: 1/- Phép gán: Để gán giátrị cho một biến chuỗi, chúng ta cũng dùng toán tử gán ( := ) như đối với các kiểu dữ liệu khác. Ví dụ: Holot:= ‘Tran Binh Trong’; 2/- Phép cộng chuỗi: Để ghép (cộng) hai hay nhiều chuỗi lại với nhau ta dùng toán tử cộng ( + ). Ví dụ: chuoi1:= ‘Turbo’ chuoi2:= ‘ Pascal’ chuoi3;= ‘ Version 7.0’ ==> chuoi4:= chuoi1 + chuoi2 + chuoi3 ==> chuoi4 = Turbo Pascal Version 7.0 3/- Phép toán so sánh: Ta có thể sử dụng các toán tử quan hệ sau: = Bằng nhau ‘AB’ = ‘BC’ < Nhỏ hơn ‘AB’ < ‘BC’ > Lớn hơn ‘AB’ > ‘BC’ <= Nhỏ hơn hoặc bằng ‘AB’ < = ‘BC’ >= Lớn hơn hoặc bằng ‘AB’ >= ‘BC’ Khác nhau ‘AB’ ‘BC’ Khi so sánh 2 chuỗi với nhau, các ký tự cùng vị trí của 2 chuỗi lần lượt so sánh với nhau theo thứ tự từ TRÁI qua PHẢI. + Nếu hai chuỗi có độ dài khác nhau, song kết quả so sánh của từng cặp ký tự là bằng nhau cho đến ký tự cuối cùng thì chuỗi ngắn hơn sẽ là chuỗi nhỏ hơn. Ví dụ: ‘ABC ’ > ‘AB ’ ==> Kết quả là: True + Nếu hai chuỗi có độ dài bằng nhau, nhưng có một cặp ký tự tương ứng giữa hai chuỗi khác nhau thì sẽ căn cứ vào trị mã ASCII nào lớn hơn thì chuỗi đó lớn hơn. Ví dụ: ‘ABC ’ Kết quả là: False + Hai chuỗi chỉ bằng nhau khi độ dài và các ký tự của chúng giống nhau. Ví dụ: ‘ABC ’ = ‘ABC ’ ==> Kết quả là: True. Ví dụ: VCT nhập vào hai chuỗi riêng biệt, sau đó in kết quả ra màn hình là chuỗi thứ ba ( chuỗi thứ ba là kết quả của chuỗi 1 ghép với chuỗi 2). So sánh chuỗi một với chuỗi hai và in kết quả so sánh ra màn hình để kiểm tra. Program So_sanh_chuoi; uses crt; Var chuoi1,chuoi2,chuoi3: string; begin clrscr; writeln('Chuong trinh ghep va so sanh chuoi'); writeln(' *******************'); {Nhap vao chuoi1 va chuoi2} write('Nhap vao chuoi thu nhat: ');readln(chuoi1); write('Nhap vao chuoi thu hai : ');readln(chuoi2); {In chuoi thu ba ra man hinh de kiem tra} chuoi3:=chuoi1+chuoi2; {thuc hien lenh gan va lenh ghep chuoi} Writeln('Chuoi thu ba la: ',chuoi3); {So sanh chuoi mot va chuoi hai va in ra man hinh de kiem tra} begin If (length(chuoi1)=length(chuoi2)) and (chuoi1=chuoi2) then writeln('Hai chuoi nay co do dai bang nhau va giong nhau') else if chuoi1 = chuoi2 then writeln('Hai chuoi nay hoan toan giong nhau') else if chuoi1 < chuoi2 then writeln('chuoi thu nhat nho hon chuoi thu hai') else writeln('chuoi thu nhat lon hon chuoi thu hai'); end; writeln; writeln(' Bam phim Enter de ket thuc'); readln; end. V/- Các thủ tục và hàm của kiểu chuỗi: 1/- Thủ tục DELETE(): Cú pháp: Delete(St,Pos,Num); Ý nghiã: Dùng để xoá khỏi St một chuỗi con chứa Num ký tự kể từ vị trí Pos trở đi. Ví dụ: st:=’abcd’ ==> Delete(st,2,1) ==> st=’acd’ 2/- Thủ tục INSERT(): Cú pháp: Insert(St2,St1,Pos); Ý nghĩa: Dùng để chèn chuỗi St2 vào vị trí Pos của chuỗi St1. Ví dụ: St1:=’abcd’ St2:=’ef’ Insert(St2,St1,3) ==> St1=‘abefcd’ Ví dụ: VCT nhập vào một chuỗi, in chuỗi đó ra màn hình để kiểm tra. Tiếp theo yêu cầu người dùng nhập vào vị trí cần xoá các ký tự của chuỗi và số ký tự muốn xoá, in chuỗi sau khi xoá để kiểm tra. Yêu cầu người dùng nhập vào một chuỗi mới và vị trí cần chèn, in chuỗi sau khi chèn theo thứ tự ngược lại để kiểm tra . Chẳng hạn: St:=’Hoang Dieu’ ==> Delete(st,7,4)=’Hoang ‘ ==> st1:=’ Dieu’ ==>Insert(st1,st,7)=’Hoang Dieu’ ==> chuỗi sau khi đảo ngược là: ‘ueiD gnaoH’ (sử dụng vòng lặp For.......Downto.....để đảo chuỗi). Program Thu_tuc_Delete_Insert; uses crt; Var st,st1: string; Pos,pos1,num,i,n:integer; begin clrscr; Writeln('Chuong trinh minh hoa thu tuc Delete va Insert'); writeln(' ********'); write('nhap vao mot chuoi: ');readln(st); writeln; Writeln('Chuoi vua nhap vao la: ',st); writeln; write('Nhap vao vi tri can xoa: ');readln(pos); writeln; Write('Nhap vao so ky tu muon xoa: ');readln(num); Delete(st,pos,num); writeln('Chuoi sau khi xoa la: ',st); writeln('Chen chuoi moi vao chuoi st'); write('Nhap vao chuoi moi: ');readln(st1); write('Muon chen vao vi tri thu may: ');readln(pos1); Insert(st1,st,pos1); writeln('Chuoi st sau khi chen la: ',st); writeln('Chuoi sau khi dao vi tri la:'); n:=length(st); {Ham Length(st) lay do dai cua chuoi st} For i:=n downto 1 do {Dao nguoc chuoi} write(st[i]); writeln; writeln('Bam phim Enter de ket thuc'); readln; end. 3/- Thủ tục STR(): Cú pháp: Str(Value,St); Ý nghĩa: Biến đổi giá trị số của Value thành chuỗiký tự để lưu kết quả vào biến chuỗi St. Ví dụ: i:=123 ==> Str( i, st) ==> st= ‘123’ 4/- Thủ tục VAL(): Cú pháp: Val(St,Var,Code); Ý nghĩa: biến đổi một biểu thức chuỗi số St thành giá trị số nguyên hoặc số thực và gán kết quả cho biến Var. Ví dụ: St:=’123’ ==> Val(St,i,result) ==> i:=123 Ví dụ: VCT nhập vào một số nguyên và một chuỗi số. Sau đó in ra màn hình là kết quả của số nguyên cộng với chuỗi số Chẳng hạn: a:=2 và st:=’123’ ==>kq:=125 (sử dụng hàm Val để đổi chuỗi số st thành số). Program Thu_tuc_Val_Str; uses crt; Var a,c,i,result:integer; st,st1:string; begin clrscr; writeln('Chuong trinh minh hoa thu tuc Val va Str'); write('Nhap vao mot so nguyen: ');readln(a); write('Nhap vao mot chuoi so: ');readln(st); Val(st,i,result); {ham doi chuoi so ra so} c:=a+i; writeln('Ket qua so la: ',c); Str(c,st1); {ham doi so ra chuoi so} writeln('Ket qua chuoi la: ',st1+' la chuoi so'); writeln('Bam phim Enter de ket thuc'); readln; end. 5/- Hàm COPY(): Cú pháp: Copy(St,Pos,Num); Ý nghĩa: cho kết quả là một chuỗi con chứa Num ký tự của St kể từ vị trí Pos trở đi tính từ trái qua. Ví dụ: St:=’abcdef’ ==> Copy(St,2,2) ==>’bc’ 6/- Hàm LENGTH(): Cú pháp: Length(St); Ý nghĩa: cho kết là chiều dài thực của biểu thức chuỗi st Ví dụ: st:=’abcd’ ==> Length(st) ==>4 7/- Hàm POS(): Cú pháp: Pos(St2,St1); Ý nghĩa: Cho kết quả là một số nguyên chỉ định cị trí xuất hiện của chuỗi st2 trong chuỗi st1. Ví dụ: st1:=’abcdef’ ==> Pos(‘de’,st) ==> 4 ==> Pos(‘gh’,st) ==>0 ****************************************** BÀI TẬP Bài 1: VCT đổi từ năm Dương Lịch sang năm Aâm Lịch. - Năm Aâm lịch là sự kết hợp giữa Chi và Can, trong đó: + Chi có 10 Chi là: {Canh, Tân, Nhâm, Quý, Giáp, Aát, Bính, Đinh, Mậu, Kỷ} + Can có 12 Can là: {Thân, Dậu, Tuất, Hợi, Tý, Sửu, Dần, Mẹo, Thìn, Tỵ, Ngọ, Mùi} - Muốn tìm được Chi ta lấy năm Dương Lịch chia cho 10 lấy phần dư - Muốn tìm được Can ta lấy năm Dương Lịch chia cho 12 lấy phần dư Ví dụ: năm Dương Lịch là 2005 è năm Aâm Lịch là Aát Dậu vì Chi = 2005 mod 10 = 5 è Chi[5] = Aát Can = 2005 mod 12 = 1 è Can[1] = Dậu Bài 2: VCT đổi từ số tiền ra chữ (giới hạn số nhập vào 0) Ví dụ: 325 ==> Ba trăm hai mươi lăm - Dùng biến mảng để lưu trữ các giá trị :{một , hai, ba ,bốn, năm, sáu, bảy, tám, chín} - Yêu cầu người dùng nhập vào số cần đổi (có kiểm tra điều kiện 0 nếu nhập sai yêu cầu nhập lại). - Tách số ban đầu thành: phần trăm, phần chục, phần đơn vị theo công thức sau: + Tram:= so div 100 ví dụ: 320 ==> 3 + chuc:= (so – tram*100) div 10 ví dụ: 320 ==> 2 + donvi:= so-tram*100-chuc*10 ví dụ: 320 ==> 0 - Đổi số phần trăm, chục, đơn vị ra chữ theo giải thuật sau: + Đổi phần chục: if chuc=1 then chu:=chu+' muoi ' else if chuc=0 then chu:=chu+' le ' else chu:=chu+a[chuc]+' muoi '; + Đổi phần trăm: If tram0 then chu:=chu+a[tram]+' tram ' Else chu:=chu+'Khong tram '; + Đổi phần đơn vị: If donvi0 then chu:=chu+a[donvi]; - In kết quả ra màn hình để kiểm tra - Sửa chương trình lại làm sau cho người dùng nhập được nhiều lần (Sử dụng lệnh nhảy Goto) Bài 3: VCT nhập vào họ và tên của một người, cắt bỏ các khoảng trống bên phải và trái(nếu có), tách tên , chữ lót, họ ra khỏi họ và tên, in lên màn hình. Để thực hiện ta dùng giải thuật sau: - Yêu cầu người dùng nhập vào họ và tên - Cắt các ký tự trống ở biên trái : + Duyệt chuỗi Hoten từ trái qua. Trong khi (While) Hoten[i]= #32 (#32 là ký tự trống) thì thực hiện lệnh xoá chuỗi Hoten từ vị trí i một ký tự. Cứ tiếp tục như vậy cho đến khi nào = #32 thi dừng. - Cắt các ký tự ở biên phải tương tự như trên nhưng thực hiện theo hướng ngựơc lại - Tách tên ra khỏi họ và tên: + Do tên nằm biên phải của chuỗi Hoten nên ta đưa từng ký của chuỗi Hoten vào biến mảng Ten kiểu Char (kiểu ký tự) cho đến khi nào gặp ký tự trống (#32) thì dừng. - Tách họ ra khỏi họ và tên tương tự như trên nhưng theo thứ tự ngược lại - Tách chữ lót ra khỏi họ va tên dựa vào độ dài của Họ và tên đã tách ở trên. - In kết quả ra màn hình để kiểm tra. ******************************************************** BÀI GIẢI Bài 1: Program Duong_lich_thanh_Am_lich; uses crt; Var can,chi:array[0..11]of string; chisocan,chisochi,nam:integer; chon:char; begin clrscr; chi[0]:='canh'; chi[1]:='Tan'; chi[2]:='Nham'; chi[3]:='Quy'; chi[4]:='Giap'; chi[5]:='At'; chi[6]:='Binh'; chi[7]:='Dinh'; chi[8]:='Mau'; chi[9]:='Ky'; can[0]:='Than'; can[1]:='Dau'; can[2]:='Tuat'; can[3]:='Hoi'; can[4]:='Ty'; can[5]:='suu'; can[6]:='Dan'; can[7]:='Meo'; can[8]:='Thin'; can[9]:='Ty'; can[10]:='Ngo'; can[11]:='Mui'; {repeat clrscr;} write('Nhap nam Duong lich: ');readln(nam); chisochi:=nam mod 10; chisocan:=nam mod 12; writeln('Nam Am lich la: ',chi[chisochi],' ',can[chisocan]); {write('Enter de tiep tuc, Esc de ket thuc '); chon:=readkey; until chon=#27;} readln; end. Bài 2: Program Doi_so_ra_chu; uses crt; label nhan; {khai bao nhan} Var a:array[1..9]of string; so,tram,chuc,donvi:integer; ch:char; chu:string; begin clrscr; writeln(' chuong trinh doi tu so ra chu'); {Gan gia tri cho mang a} a[1]:='mot'; a[2]:='hai'; a[3]:='ba'; a[4]:='bon'; a[5]:='nam'; a[6]:='sau'; a[7]:='bay'; a[8]:='tam'; a[9]:='chin'; nhan: write('Nhap vao so can doi: ');readln(so); {kiem tra xem so nhap vao co nho hon 0 va lon hon 100 hay khong?} while (so>1000) or (so<0) do begin write('Ban da nhap sai, hay nhap lai ! ');readln(so); end; {tach so ban dau thanh tram chuc don vi} tram:=so div 100; chuc:=(so- tram*100) div 10; donvi:= so - tram*100 - chuc*10; {Doi phan tram} If tram0 then chu:=chu+a[tram]+' tram ' Else chu:=chu+'Khong tram '; {Doi phan chuc} if chuc=1 then chu:=chu+' muoi ' else if chuc=0 then chu:=chu+' le ' else chu:=chu+a[chuc]+' muoi '; {Doi phan don vi} If donvi0 then chu:=chu+a[donvi]; {if (chuc=0) and (donvi=0) then chu:=a[tram]+ ' tram'; if (tram=0) and (chuc=0) and (donvi=0) then chu:='Khong tram'; } {in ket qua ra man hinh} writeln(chu); write('Ban muon doi nua hay khong (C/K) ?');readln(ch); If upcase(ch)='C' then {doi chu thuong thanh hoa} begin chu:=''; {xoa du lieu trong chuoi chu} goto nhan; {nhay den nhan} end else exit; {thoat ve man hinh soan thao} readln; end. Bài 3: Program Tach_ten; uses crt; Var Hoten:string[24]; ten,ho,lot:array[1..20]of char; i,j,k,demten:integer; begin clrscr; hoten:='';{xoa du lieu trong hoten} writeln('Chuong trinh tach ten ra khoi ho va ten'); writeln('Cho biet ho va ten: ');readln(hoten); {cat cac ky tu trong o trai} writeln('Do dai cua chuoi ban dau la: ',length(hoten)); i:=1; while hoten[i] = #32 do {#32 la ky tu trong} begin delete(hoten,i,1); i:=i+1; end; {cat cac ky tu trong o phai} j:=length(hoten); while hoten[j] = #32 do begin delete(hoten,j,1); j:=j-1; end; {tach ten ra khoi ho va ten} k:=j; {k la do dai cua chuoi} demten:=0; while hoten[k]#32 do begin ten[k]:=hoten[k]; k:=k-1; demten:=demten+1;{dem ten xem co bao ky tu} end; {tach ho ra khoi ho va ten} i:=1; while hoten[i]#32 do begin ho[i]:=hoten[i]; i:=i+1; end; {tach chu lot} for j:=i to length(hoten)-demten do lot[j]:=hoten[j]; writeln('Do dai chuoi sau khi cat la: ',j); writeln('Ho va Ten sau khi tach la:'); writeln(ten); {do kieu phan tu cua mang la CHAR nen ta co the su dung lenh writeln(ten)} writeln(ho); writeln(lot); readln; end. (Lưu hành nội bộ)
Tài liệu đính kèm: