Tài liệu bồi dưỡng Tin học
6.3 Cho dãy n số nguyên a1, a2, a3, . an. Xếp lại dãy số theo nguyên tắc : a1 đổi chỗ cho an; a2 đổi chỗ cho an-1.
Thuật giải:
1. Nhập dãy n phần tử .
2. Đổi chỗ từng phần tử theo thứ tự: a[1] cho a[n] ; a[2] cho a[n-1] . a[n div 2] cho a[n div 2 + 1]. (Dùng biến trung gian để đổi chỗ ).
3. In dãy sau khi xắp xếp.
VAR A: ARRAY[1.100] OF integer; i,n, tg : integer;
BEGIN
Writeln('Xap xep lai day : A[1]<->A[n]; A[2]<->A[n-1].');
Write('Hay cho so phan tu cua mang: '); Readln(n);
FOR i:= 1 To n DO Begin Write('A[',i,'] = '); Readln(A[i]); End;
Write(' Day ban dau la: ');
FOR i:=1 TO n DO Write(A[i]:4);
Writeln;
{Xắp xếp lại dãy đã cho}
FOR i:=1 TO n DIV 2 DO
Begin
tg:=A[i]; {Sử dụng biến trung gian để đổi chỗ 2 phần tử cho nhau}
A[i]:=A[n-i+1];
A[n-i+1]:=tg;
End;
{In dãy đã xắp xếp}
Write('Day sau khi xap xep la : ');
FOR i:= 1 To n DO Write(A[i]:4);
END.
-1, 0, 1, 7, 3, -4; Xắp lại là : -2, -1, -4, 0, 1, 7, 3. Thuật giải : - Không dùng mảng phụ: Duyệt lần lượt các phần tử của mảng. Lần 1 : nếu gặp phần tử âm thì in ra. Lần 2 : in phần tử 0 nếu có. Lần 3: nếu gặp phần tử dương thì in ra. - Dùng mảng phụ : Dùng 2 mảng phụ . 1 mảng chứa các số âm, một mảng chứa số dương. Var j,i,n,dem, so, test : Integer; A:ARRAY[1..100] OF integer; BEGIN write('Cho so phan tu = '); Read(n); FOR i:=1 TO n DO Begin write('A[',i,'] = '); Readln(A[i]); End; writeln('Day da cho la: '); FOR i:=1 TO n DO Write(A[i]:4); writeln; writeln('Day sau khi xap xep la: '); FOR i:=1 TO n DO IF A[i]<0 THEN Write(A[i]:4) ; FOR i:=1 TO n DO IF A[i]=0 THEN Write(A[i]:4) ; FOR i:=1 TO n DO IF A[i]>0 THEN Write(A[i]:4) ; END. 6.10. Nhập vào n số nguyên(N<100). Tính trung bình cộng, trung bình nhân của các số đó. Var i, n, Tong, Tich :Integer; A: ARRAY[1..100] OF integer; BEGIN writeln('Tinh Trung binh cong va Trung binh nhan'); Write('Nhap vao n =' ); Readln(n); Tong:=0; Tich:=1; FOR i:=1 TO n DO Begin Write('So thu ',i,'='); Read(A[i]); End; FOR i:=1 TO n DO Begin Tong:=Tong+A[i]; Tich:=Tich*A[i]; End; Writeln('Trung binh cong cua ',n, ' so da cho la : ', Tong/n:10:2); Writeln('Trung binh nhan cua ',n, ' so da cho la : ', Tich/n:10:2); END. ---------------------------------------------------- 6.11. “Mặt bằng lớn nhất” : Trong một dãy số, các phần tử bằng nhau liên tiếp được gọi là một mặt bằng của dãy. Mặt bằng lớn nhất là mặt bằng có số phần tử nhiều nhất trong số các mặt bằng của dãy. Cho một dãy số nguyên N phần tử. Hãy tìm mặt bằng lớn nhất của nó. Thuật giải: 1. Nhập dãy n phần tử. 2. Duyệt từng phần tử a[i] : Nếu a[i] = a[i+1] thì tăng đếm lên 1, ngược lại gán đếm =1. 3. Nếu số phần tử lớn nhất (max) < đếm thì gán đếm cho max. Kết quả ta có max là số phần tử của mặt bằng lớn nhất. 4. In ra số phần tử của mặt bằng lớn nhất. CONST han = 1000; Var n, i, j, d, max: integer; a: array[1..han] of integer; BEGIN {Nhap va in day cho truoc} Write('Cho so phan tu = '); readln(n); for i:=1 to n do begin write('So thu ',i,' ='); readln(a[i]); end; write('DAY DA CHO LA : '); for i:=1 to n do write(a[i]:4); writeln; {Tim mat bang lon nhat} max:=0; d:=1; FOR i:=1 TO n-1 DO Begin IF a[i] = a[i+1] THEN d:=d+1 ELSE d:=1; IF max < d THEN max:=d; End; {In ra mat bang lon nhat} Write('Mat bang lon nhat la: '); d:=1; FOR i:=1 TO n-1 DO Begin IF a[i] = a[i+1] THEN d:=d+1 ELSE d:=1; IF d = max THEN Begin FOR j:=1 TO max DO write(a[i]:4); Writeln; Writeln('Gom ',max,' phan tu'); End; End; END. ------------------------------------------------------ 6.12. Cho một dãy số nguyên N phần tử. Tìm dãy con đơn điệu tăng lớn nhất của dãy. Ví dụ cho dãy : 9 13 1 2 3 4 5 3 5 2 3 4 1 In ra: Dãy con đơn điệu tăng lớn nhất có 5 phần tử là 1 2 3 4 5 Bắt đầu từ vị trí số 3 đến vị trí số 7. Thuật giải: 1. Đếm số phần tử của dãy đơn điệu tăng lớn nhất: - Gán số phần tử (max)=1, đếm (d) =1; - Duyệt từ a[1] đến a[n-1]: Nếu a[i] < a[i+1] thì tăng d lên 1, ngược lại gán d =1. So sánh max với d: nếu max nhỏ hơn d thì gán d cho max. Kết quả sau vòng lặp ta được max là số phần tử của dãy đơn điệu tăng lớn nhất. 2. In ra số max: Nếu max >1 thì in ra : “Số phần tử của dãy đơn điệu tăng lớn nhất là max” , ngược lại thì in ra “Không có dãy đơn điệu tăng”. 3. Tìm ra vị trí bắt đầu của dãy đơn điệu tăng lớn nhất: (ở trên ta đã có số phần tử của dãy đơn điệu tăng lớn nhất là max. Vì vậy: chỉ cần xác định được vị trí bắt đầu của dãy đó thì có thể in ra được từng phần tử của dãy). - Gán kiểm tra (kt)=0 và vị trí bắt đầu (bd)=0; - Ta xét từng đoạn gồm max phần tử, bắt đầu từ vị trí a[i] Lặp với j:=1 đến n – max: Lặp với i từ j đến j + max-1 : Nếu a[i] < a[i+1] thì tăng kt lên 1, ngược lại gán kt = 0; Sau khi lặp xong, so sánh kt với max: nếu kt=max thì gán bd = i và nhảy khỏi vòng lặp (Goto M). Ví dụ ta có dãy 10 phần tử như sau: Dãy con lớn nhất gồm 5 (max=5)phần tử, từ vị trí số 4 đến vị trí số 8 . Ta so sánh đoạn 5 phần tử , bắt đầu từ vị trí 1. Nếu gặp đoạn có tất cả các phần tử giống nhau thì biến kt sẽ tăng đúng bằng 5. Khi đó ta sẽ đánh dấu vị trí bắt đầu của dãy con. 4. In ra vị trí bắt đầu, kết thúc và các phần tử của dãy con. Chương trình như sau: Trong PASCAL để in một ký tự , có thể dùng ký tự # và mã ASCCI của nó. Ví dụ: #13 là xuống dòng (Tương đương lệnh Writeln). #10 là về đầu dòng. LABEL M; CONST han = 1000; {Giới hạn số phần tử của mảng} Var n, i, j, d, max, kt, bd: integer; a: array[1..han] of integer; BEGIN {Nhập và in dãy } Write('Cho so phan tu = '); readln(n); FOR i:=1 TO n DO begin write('So thu ',i,' ='); readln(a[i]); end; write('DAY DA CHO LA : '); FOR i:=1 TO n DO write(a[i]:4); writeln; {1. Đếm số phần tử (max) của dãy đơn điệu tăng lớn nhất} max:=1; d:=1; {Gán số phần tử =1, đếm =1} FOR i:=1 TO n-1 DO Begin IF a[i] < a[i+1] THEN inc(d) ELSE d:=1; IF max < d THEN max:=d; End; {2. In số phần tử (max) của dãy đơn điệu tăng lớn nhất } Writeln; IF max>1 THEN Writeln('Day don dieu tang dai nhat co: ',max,' phan tu', #13) ELSE writeln('Khong co day don dieu tang'); {3. Tìm vị trí bắt đầu (bd) của dãy đơn điệu tăng lớn nhất} kt:=0; bd:=0; FOR j:=1 TO n DO FOR i:=j TO j+max-1 DO Begin IF a[i]<a[i+1] THEN inc(kt) ELSE kt:=0; IF kt = max then begin bd:= j; goto M; end; End; M: {4. In ra vị trí bắt đầu, kết thúc và các phần tử của dãy đơn điệu tăng lớn nhất} IF bd >0 THEN Begin writeln('Bat dau tu vi tri so: ',bd,' den vi tri so ',bd+max-1); Write('Cac phan tu cua day la :'); FOR i:=bd TO bd+max-1 DO write(a[i]:4); End; END. * (Sửa lại chương trình để tìm dãy con đơn điệu giảm lớn nhất)? * Có thể sửa chương trình này để giải bài “ Tìm mặt bằng lớn nhất ” không? _____________________________________ 6.13. Tìm tập con : Tập A được gọi là tập con của tập B nếu tất cả các phần tử của A đều có mặt trong B. (Nói cách khác: nếu bỏ đi n phần tử (n>=0) của tập B thì ta có tập A). Không kể đến thứ tự các phần tử. Ví dụ : A = 1, 2, 3. B = 9, 12, 3, 4, 1, 7, 2, 1, 3. --> A là tập con của B. Ví dụ : A = 1, 2, 3. B = 9, 12, 3, 2, 4, 7, 2, 3. (Thiếu phần tử 1). --> A Không là tập con của B. Nhập các phần tử bất kỳ của các tập A và B. Xét xem A có là tập con của B không ? Nếu có in ra màn hình “ A la tap con cua B “ , nếu không in ra màn hình “ A khong phai la tap con cua B “. Thuật giải : 1. Nhập các phần tử cho dãy A và dãy B. (Số phần tử của B phải >= số phần tử của A). 2. So sánh từng phần tử của A với từng phần tử của B : Nếu phần tử a[i] có mặt trong B thì gán biến kiểm tra =1, ngược lại, gán biến kiểm tra = 0; Với mỗi a[i] sẽ có m phép so sánh (với m phần tử của B). Mỗi phép so sánh bằng gán =1. (Cộng dồn vào biến kết quả (kq) ). 3. Nếu biến kết quả (kq) = m (số phần tử của A) thì A là tập con của B. Chương trình : VAR n, m, i,j,kq, kt: integer; a, b : array[1..100] of integer; BEGIN {Nhap va in ra Tap A va Tap B } Write('So phan tu cua A = '); readln(n); FOR i:=1 TO n DO begin write('A[',i,'] ='); readln(a[i]); end; write('A = '); FOR i:=1 TO n DO write(a[i]:4); Writeln; Writeln('****************************************************'); REPEAT {Bat buoc nhap so phan tu cua B phai bang hoac lon hon so phan tu cua A} Write('So phan tu cua B = '); readln(m); UNTIL m >= n; FOR j:=1 TO m DO begin write('B[',j,'] ='); readln(b[j]); end; write('B = '); FOR j:=1 TO m DO write(b[j]:4); Writeln; riteln('******************************************************'); {So sanh tung phan tu cua A voi tung phan tu cua B } kq:=0; FOR i:=1 TO n DO Begin kt:=0; FOR j:=1 TO m DO IF a[i] = b[j] THEN inc(kt); IF kt>=1 THEN kt:=1; {Ngăn chặn a[i] lặp lại hơn 1 lần } {Writeln('KT vong ',i,' = ',kt);} kq:=kq+kt; {Sau một vòng lặp của j thì kt=1 hoặc =0} End; Writeln('KQ = ', kq); {Kiem tra gia tri cua bien kq: Neu kq = so phan tu cua A thi A la tap con cua B Nguoc lai : A khong la tap con cua B} IF kq = n THEN Writeln('A LA TAP CON CUA B') ELSE writeln('A khong phai la tap con cua B'); END. ----------------------------------------------------- 6.14. “Dãy đoạn con” : Cho 2 dãy số thực a1, a2, ... an (1) và b1, b2, ..., bn (2). Dãy (1) gọi là Dãy đoạn con của dãy (2) nếu các phần tử trong (1) có mặt liên tiếp trong (2). Ví dụ : (1) = 1, 2, 1 là dãy đoạn con của (2) = 0, 1, 2, 1, 7, 3. Dãy (3) = 1, 2, 7 thì không là dãy đoạn con của (2). Nhập dãy (1) và dãy (2), Xét xem (1) có dãy đoạn con của (2) không? Thông báo kết quả ra màn hình. Thuật giải : Tương tự bài 6.13. VAR n, m, i,j, k, kq, kt, bd: integer; a, b, c : array[1..100] of integer; BEGIN {Nhap va in ra Day A va Day B } Write('So phan tu cua A: n = '); readln(n); FOR i:=1 TO n DO begin write('A[',i,'] ='); readln(a[i]); end; write('A = '); FOR i:=1 TO n DO write(a[i]:4); Writeln; Writeln('***************************************'); repeat {Bat buoc nhap so phan tu cua B phai bang hoac lon hon so phan tu cua A} Write('So phan tu cua B: (m>=n) = '); readln(m); until m >= n; FOR j:=1 TO m DO begin write('B[',j,'] ='); readln(b[j]); end; write('B = '); FOR j:=1 TO m DO write(b[j]:4); Writeln; Writeln('*************************************'); {So sanh a[i] voi tung doan b[j] gom n phan tu lien tiep} bd:=0; kq:=0; REPEAT kt:=0; FOR i:=1 TO n DO IF a[i] = b[i+bd] THEN inc(kt); IF kq < kt THEN kq:=kt; Writeln; Writeln('kt(',bd+1,') = ',kt); {In ra ket qua kt cua tung vong lap } inc(bd); UNTIL bd > m-n; Writeln('KQ = ',kq); IF kq = n THEN Writeln('A La day doan con cua B') ELSE Writeln('Khong phai'); END. ----------------------------------------------------- 6.15. Dãy đơn điệu : Dãy số a1, a2, ... , an gọi là dãy tăng (giảm) đơn điệu nếu với mọi a[i] đều có a[i] a[i+1] (Đối với dãy giảm) với i = 1, 2, ..., n-1. Nhập một dãy n số nguyên. a. Xét xem dãy đó tăng hay giảm đơn điệu? b. Nếu không tăng hay giảm thì xắp xếp lại dãy theo chiều tăng. VAR n, i,j, tang,tg, giam : integer; a : array[1..100] of integer; BEGIN {1. Nhap va in ra day so } REPEAT {Bat buoc nhap so phan tu lon hon 0} Write('So phan tu ( >0 ) = '); readln(n); UNTIL n > 0; FOR i:=1 TO n DO Begin write('A[',i,'] ='); readln(a[i]); End; write('A = '); FOR i:=1 TO n DO write(a[i]:4); Writeln; Writeln('********************************************'); {2. Xet day tang hay giam} tang:=1; giam:=1; FOR i:=1 TO n-1 DO Begin IF a[i] < a[i+1] THEN inc(tang); IF a[i] > a[i+1] THEN inc(giam); End; IF tang = n THEN Writeln('Day Tang ') ELSE IF giam = n THEN Writeln('Day Giam ') ELSE writeln('Day khong tang hay giam'); {3. Xap xep lai day theo chieu tang} FOR j:= 1 TO n DO Begin FOR i:=1 TO n-1 DO {Sau n-1 lan lap ta co a[1] < a[2]} IF a[i] > a[i+1] THEN Begin tg:= a[i]; a[i]:= a[i+1]; a[i+1]:=tg; End; End; Write('Day sau khi xap xep la:'); FOR i:=1 TO n DO Write(a[i]:4); END. * Nâng cấp chương trình : Nếu dãy không tăng hay giảm thì xắp xếp theo chiều của dãy con đơn điệu tăng lớn nhất ? -------------------------------------------------------------- 6.16. Cho dãy số thực n phần tử. Tìm một dãy con lớn nhất gồm các phần tử đôi một khác nhau của nó. Chẳng hạn dãy : 1, 1, 3, 2, 1, 3, 3, 3, 2, 4 thì một dãy con nhận được là : 1, 3, 2, 4. (Dãy con gồm các phần tử có mặt trong dãy, mỗi phần tử xuất hiện 1 lần). Thuật giải: - Dùng một dãy phụ b. - Trước tiên gán b[1] = a[1]; biến dem dùng để đếm các phần tử của dãy b. - So sánh mỗi phần tử của dãy a với từng phần tử của dãy b. nếu khác nhau thì bổ sung thêm vào dãy b. - Cuối cùng ta được dãy b gồm các số chỉ xuất hiện 1 lần. Ví dụ : A = 1 2 3 1 4 7 Trước tiên gán b[1] = a[1] = 1. Sau đó: *Cho i chạy từ 2 đến n để xét mỗi phần tử a[i] . *Với mỗi a[i] : so sánh với từng phần tử b[j], nếu khác nhau thì bổ sung vào dãy b. Ta có sơ đồ sau: VAR n, i,j, k, dem, kt : integer ; a,b : array[1..100] of integer; BEGIN {1. Nhap va in ra day so a } REPEAT {Bat buoc nhap so phan tu lon hon 0} Write('So phan tu ( >0 ) = '); readln(n); UNTIL n > 0; FOR i:=1 TO n DO begin write('A[',i,'] ='); readln(a[i]); end; write('A = '); FOR i:=1 TO n DO write(a[i]:4); Writeln; {-------------------------------------------------} {2. Gan b[1] = a[1]} b[1]:=a[1]; j:=1; dem:=1; {-------------------------------------------------} {3. So sanh moi a[i] (i=2 -> n) voi tung b[j] Neu khac nhau thi gan cho b[j] } FOR i:=2 TO n DO BEGIN kt:=0; for k:=1 to dem do if a[i] b[k] then kt:=kt+1 ; if kt = dem then begin inc(j); b[j]:=a[i]; inc(dem); end; END; {-------------------------------------------------} {4. Viet ra day b} Write('Cac so co mat trong day A la : '); FOR j:=1 TO dem DO write(b[j]:4); END. -------------------------------------------------------------- 6.17. Sinh ngẫu nhiên một dãy có N số nguyên (n < = 2000). a. Tìm phần tử nhỏ nhất và các vị trí của các số bằng giá trị đó. b. Tìm phần tử lớn thứ 2 và các vị trí của các số bằng giá trị đó. c. Tìm các dãy đoạn con dài nhất mà các phần tử bằng 0 (nếu có). USES WinCrt; LABEL M; VAR n, i,j, min, max, max1, max2, d, kt, k : integer; a,b : array[1..100] of integer; BEGIN {-------------------------------------------------} {1. Nhap va in ra day so a } Write('So phan tu = '); readln(n); FOR i:=1 TO n DO Begin Write('A[',i,'] = '); readln(a[i]); end; write('A = '); FOR i:=1 TO n DO write(a[i]:4); Writeln; Writeln('-----------------------------'); {-------------------------------------------------} {2. Tim va in ra phan tu nho nhat} min:=a[1]; FOR i:=2 TO n DO IF min > a[i] THEN min := a[i]; Writeln('a. Phan tu nho nhat la : ',min); Write('Tai vi tri so : '); FOR i:=1 TO n DO IF a[i] = min THEN Write(i:5); Writeln; Writeln('-----------------------------'); {-------------------------------------------------} {3. Tim phan tu lon nhat} max1:=a[1]; FOR i:=2 TO n DO IF max1 < a[i] THEN max1 := a[i]; Writeln('Phan tu lon nhat la : ',max1); Writeln; Writeln('-----------------------------'); {-------------------------------------------------} {4. Tim phan tu lon thu hai} FOR k:=1 TO max1 DO FOR i:=1 TO n DO IF a[i] = max1-k THEN Begin max2:=a[i]; Writeln('b. So lon thu hai la: ', max2); GOTO M; End; M: FOR i:=1 TO n DO IF a[i] = max2 THEN Writeln(' Tai vi tri so : ',i:5); Writeln; Writeln('-----------------------------'); {5. Tim so phan tu cua doan con dai nhat ma cac phan tu la so O } max:=1; d:=1; FOR i:=1 TO n-1 DO Begin IF (a[i] = 0) and (a[i] = a[i+1]) THEN inc(d) ELSE d:=1; IF max < d THEN max := d; End; IF max >1 THEN writeln('c. Day so O lon nhat co ', max, ' Phan tu') ELSE Writeln('Khong co day so O'); Writeln('-----------------------------'); END. ------------------------------------------------------------ 6.18. Nhập vào 12 số nguyên biểu diễn năng suất của 12 tháng. Dùng ký tự (*) để vẽ biểu đồ cột ra màn hình. VAR A: ARRAY[1..12] OF byte; i, j, cot, dong: byte; BEGIN Writeln('Nhap nang suat cho moi thang.'); FOR i:=1 TO 12 DO Begin Write('Thang ',i,' : '); Readln(A[i]); End; Gotoxy(1, 25); Write('THANG'); FOR i:=1 TO 12 DO Write(i:5); cot:=10; FOR i:=1 TO 12 DO Begin dong:=24; FOR j:=1 TO a[i] DO Begin gotoxy(cot, dong); write('*'); dec(dong); end; cot:=cot+5; End; END. ------------------------------------------------------------------------ 6.19. Cho một dãy N số nguyên (0<N<200) và số nguyên k. Tìm các bộ 3 số liên tiếp nhau có tổng bằng k và in chúng ra màn hình. Có bao nhiêu bộ số thoả mãn điều kiện đó? VAR A: ARRAY[1..200] OF byte; dem, i, j, n, k : byte; BEGIN {Nhap cac han tu cua day} Write('Cho so phan tu = '); Readln(n); FOR i:=1 TO n DO Begin Write('A[',i,']= '); Readln(A[i]); End; {In day ra man hinh} Write('Day da cho la: '); FOR i:=1 TO n DO Write(i:4); Writeln; Write('Hay cho so K = '); Readln(k); {Tim cac bo 3 so co tong = k} FOR i:=1 TO n DO IF a[i]+a[i+1]+a[i+2] = k THEN Begin Write(A[i]:4, A[i+1]:4, A[i+2]:4); inc(dem); End; {Thong bao so nghiem} Writeln; IF dem>0 THEN Writeln('Co tat ca ',dem,' bo so co tong bang ',k) ELSE Writeln('Khong co bo so nao co tong bang ',k); END. 6.20. Cho dãy N+1 số thực (0<N<200) và số thực x. Tính giá trị biểu thức : P(x) = anxn + an-1xn-1 ....... a1x + a0 . 6.21. Số học sinh của một trường là N . Nhập tuổi của các học sinh. + Cho biết tuổi lớn nhất ? Có bao nhiêu người ? + Cho biết tuổi nhỏ nhất? Có bao nhiêu người ? + Có bao nhiêu độ tuổi ? Mỗi độ tuổi có bao nhiêu người ? 6.22. Giả sử D1, D2, ..... Dn là điểm thi của N thí sinh dự thi. + Tìm ra 3 điểm cao nhất, cao thứ nhì và cao thứ 3 để xếp giải Nhất, Nhì, Ba. Mỗi giải có bao nhiêu người ? 6.23. Dãy nhị phân được gọi là dãy điều hoà nếu chỉ có các phần tử 0 và 1 xen kẽ nhau hoặc chỉ có 1 phần tử là 0 hoặc 1. Nhập vào một dãy nhị phân N số hạng. + Kiểm tra xem dãy có điều hoà không ? + Nếu không thì chèn thêm một số 0 hoặc 1 để được dãy điều hoà. + Nếu sau khi chèn thêm vẫn không được dãy điều hoà thì chèn số 1 vào vị trí N/2 và in dãy ra màn hình. 6.24. Dãy khả đối xứng là dãy sau khi đổi chỗ các số hạng trong dãy, ta được dãy đối xứng. Ví dụ dãy S = 111222333 -> 123321 là dãy đối xứng. Nhập vào một dãy N phần tử. + Xét xem dãy có khả đối xứng không? Nếu có thì xắp xếp lại thành dãy đối xứng. + Nếu không thì thông báo ra màn hình “ Dãy bất khả đối xứng”. ___________________________________ 7. Xâu ký tự (String). - Xâu kí tự (String) là một dãy hữu hạn các kí tự. - Độ dài của xâu là số kí tự có mặt trong xâu. - Khai báo: Type Kieuxau = String[max]; Var Xau1 : Kieuxau; Xau2 : String[max]; {Khai báo trực tiếp}. Xau3 : String; {Mặc định độ dài tối đa}. Trong đó : + max : là một số nguyên dương không lớn hơn 255, xác định độ dài tối đa của xâu. + Khai báo như kiểu Xau3 thì độ dài của nó tối đa là 255 kí tự. Chú ý : + Khác với mảng : Xâu có thể truy nhập toàn bộ xâu hay từng ký tự của xâu. Để truy nhập đến ký tự bất kỳ trong xâu, ta viết: S[i] ; Trong đó S là tên của biến kiểu xâu, i là vị trí tính từ đầu bên phải. Ví dụ : Xau3 có giá trị là abcdeghik. Xau3[4] sẽ là kí tự d. + Phép cộng xâu : Ví dụ : S1 có giá trị là HOA; S2 có giá trị là HONG; S = S1 + S2 có giá trị là HOAHONG. * Một số hàm và thủ tục xử lý xâu: + Hàm Length(S) : Cho giá trị trả về là độ dài của xâu S. Ví dụ : Xâu S = abcd thì Length(S) = 4. + Hàm Pos(xc, S) : Cho giá trị trả về là vị trí đầu tiên của xâu con xc trong xâu S. Nếu không có xc trong xâu x thì trả về giá trị bằng 0. + Hàm Copy(x, p, n) : Trả về xâu con gồm n kí tự của xâu x bắt đầu từ ký tự P. + Hàm concat(x1, x2, x3, ..., xn) : = x1 + x2 + x3 + ... + xn; Trong đó các xi là các biểu thức kiểu String. + Thủ tục Delete(x, p, n) : Xoá n ký tự của xâu x bắt đầu từ vị trí p. x: String; p, n : Integer. + Thủ tục Insert(x , y, n) : Chèn xâu x vào xâu y tại vị trí n. x, y: String; n : Integer. + Thủ tục val(s, n, i) : Đổi chuỗi s kiểu String sang số và lưu vào biến n kiểu số. I=0 nếu không có lỗi khi đổi. Nếu i 0 thì đó là vị trí lỗi. + Thủ tục str(n, s) : Đổi số n kiểu số sang chuỗi và lưu vào biến s kiểu chuỗi. Sau đây là đoạn chương trình dùng để thử các hàm trên: Var X, xc: string; BEGIN X:= 'abcd'; xc:= 'cd'; Writeln('Xau X = abcd; Xau xc = cd'); Writeln('Do dai cua xau X la : ',length(X)); Writeln('Do dai cua xau xc la : ',length(xc)); writeln('Vi tri bat dau cua xau con xc trong xau X la : ',pos(xc,X)); Writeln('Copy 2 ky tu cua xau X bat dau tu vi tri so 2 la: ', copy(X,2,2)); Writeln('Ham Concat(X, xc) = ', concat(X, xc)); delete(X, 2,
File đính kèm:
- Tai_lieu_BD_HSG.doc