Tải bản đầy đủ (.docx) (7 trang)

De HSG Hay20162017 72

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (155.89 KB, 7 trang )

<span class='text_page_counter'>(1)</span>KIỂU CHUỖI KÝ TỰ 1. Chuỗi và khai báo biến chuỗi : Var Tênbiếnchuỗi : String[N] ; hoặc: Var Tênbiếnchuỗi : String ; Trong đó N là một hằng nguyên (0 < N <= 255) ấn định số ký tự tối đa mà biến có thể nhận và gọi là độ dài tối đa của biến chuỗi. Nếu không có chỉ thị [N] thì chuỗi có độ dài tối đa là 255 ký tự. Ví dụ, cho khai báo : Var St : String[17]; Diachi : String; Khi đó St là biến chuỗi có độ dài tối đa là 17 ký tự, còn biến Diachi có độ dài tối đa là 255 ký tự. Cần phân biệt độ dài với độ dài tối đa của biến chuỗi: độ dài tối đa được xác định ngay khi khai báo là khả năng có thể chứa của biến chuỗi, còn độ dài của chuỗi là số ký tự đang thực có trong chuỗi. Nếu gán: St := ‘Nguyen Thi Mai’; Diachi := ‘Quan 1, Thanh pho Ho Chi Minh’; thì biến St có độ dài là 14 ký tự, mặc dù khả năng nó có thể chứa tới 17 ký tự. Tương tự, biến Diachi có độ dài là 29 ký tự còn độ dài tối đa cho phép là 255. Khi gán cho biến chuỗi một hằng chuỗi dài hơn độ dài tối đa của nó thì các ký tự thừa sẽ bị bỏ qua. Ví du, nếu gán: St := ‘Quan 1, Thanh pho Ho Chi Minh’; thì gía trị của biến St sẽ là St=‘Quan 1, Thanh pho’. Trong bộ nhớ của máy, một biến chuỗi sẽ chiếm một số byte bằng độ dài tối đa của nó cộng thêm 1. Byte đầu tiên, gọi là byte 0, chứa một ký tự có mã bằng độ dài thực của chuỗi, mỗi byte còn lại chứa một ký tự. Cấu trúc của biến St nói trên có dạng: N g. u. y. e. n. T h. i. M a. i. Ðộ dài N (=14) của biến St và ký tự trong byte 0 (ký hiệu là St[0]) liên quan với nhau như sau: N = Ord ( St[0] ) St[0]= Chr( N ) Turbo Pascal có sẵn hàm Length(chuỗi) cho ngay độ dài thực của chuỗi mà không cần phải dùng đến byte 0. Ví dụ : Length(St)=14. 2. Truy nhập vào từng phần tử của chuỗi : Giống như mảng, mỗi phần tử của chuỗi được truy nhập thông qua tên chuỗi và chỉ số của phần tử. Gọi N =Length(St), khi đó ký tự thứ i (i=1, 2, ..., N) của St được ký hiệu là St[i]. Ví dụ, cho : St :=‘ABC’; thì N=3 và St[1]=‘A’, St[2]=‘B’, St[3]=‘C’. Lệnh St[1]:=‘a’; sẽ biến đổi St thành St=‘aBC’. Như vậy mỗi ký tự St[i] được dùng như một biến kiểu ký tự, và chuỗi có thể xem là một mảng các ký tự. Chẳng hạn để in chuỗi ta có thể in từng ký tự như sau: For i:=1 to Length(St) do write(St[i]); Ðiều này cho thấy chuỗi là một kiểu dữ liệu có tính cấu trúc. Nhưng mặt khác, mỗi chuỗi lại có thể xem là một gía trị duy nhất, vì có thể nhập và in chuỗi trực tiếp bằng các lệnh: Readln(St); Write(St); Ðặc điểm này cho thấy chuỗi còn là một kiểu dữ liệu có tính đơn giản. 3. Các thao tác trên chuỗi : Phép cộng (nối) chuỗi: Khi cộng hai chuỗi, ta được một chuỗi mới gồm các ký tự của hai chuỗi ban đầu ghép lại.Ví dụ : ‘tin’ + ‘hoc’ =‘tinhoc’ ‘1234’+ ‘5678’ = ‘12345678’ Phép so sánh chuỗi: Khi so sánh hai chuỗi, ta so sánh từng cặp ký tự của hai chuỗi từ trái qua phải. Nếu phát hiện ra một cặp ký tự khác nhau thì chuỗi nào chứa ký tự nhỏ hơn sẽ nhỏ hơn. Ví dụ:.

<span class='text_page_counter'>(2)</span> ‘Hong’ > ‘Han’ vì ‘o’ > ‘a’ ‘thanh’ > ‘thao’ vì ‘n’ > ‘o’ Nếu so sánh hết chiều dài của chuỗi ngắn hơn mà không có cặp nào khác nhau thì chuỗi ngắn hơn sẽ nhỏ hơn, ví dụ: ‘an’ < ‘anh’ ‘chu’ < ‘chung’ Hai chuỗi bằng nhau khi chúng cùng độ dài và các ký tự ở các vị trí tương ứng thì bằng nhau. 4. Các hàm liên quan đến chuỗi : Hàm Length(St) : cho độ dài của chuỗi St. Ví dụ: Length(‘ABCD’)=4 vì chuỗi ‘ABCD’ có 4 ký tự. Chuỗi rỗng có độ dài bằng 0. Hàm Pos(S, St): Cho vị trí đầu tiên tìm thấy chuỗi S trong chuỗi St, nếu không tìm thấy thì hàm cho kết qủa bằng 0. Ví dụ: Pos(‘Ab’, ‘cdAb3Abm’) = 3, Pos(‘Ab’, ‘1bA3b’) = 0. Hàm Copy(St, k, m) : cho m ký tự của St tính từ vị trí k. Ví dụ: Copy (‘ABCDEF’, 4, 2) =‘DE’. Nếu k> Length(St) thì kết qủa sẽ là một chuỗi rỗng Nếu m> số ký tự đứng sau kể từ vị trí k thì hàm Copy chỉ lấy các ký tự từ vị trí k đến hết chiều dài của St, Ví dụ : Copy (‘ABCD’, 3, 10) = ‘CD’ 5. Các thủ tục liên quan đến chuỗi : Thủ tục Delete(St, k, m) : Xóa m ký tự trong biến chuỗi St bắt đầu từ vị trí thứ k. Ví dụ, sau khi thực hiện các lệnh: St:=‘ TurboPascal’; Delete(St, 1, 5); thì gía trị của St=‘Pascal’ vì 5 ký tự đầu đã bị xóa. Nếu k > Length(St) thì không xóa gì cả. Nếu m > số ký tự đứng sau kể từ vị trí k thì xóa hết từ vị trí k đến cuối chuỗi. Ví dụ, sau khi thực hiện ba lệnh : St:=‘Turbo Pascal’; Delete(St, 10, 20); Write(St); thì in ra chữ Turbo Pas vì St đã bị xóa đi 3 ký tự cuối nên chỉ còn St=‘Turbo Pas’. Thủ tục Insert(S, St, k) : Chèn chuỗi S vào biến chuỗi St tại vị trí k. Ví dụ, cho : St:=‘ABCD’; Sau khi thực hiện lệnh: Insert(‘**’, St, 3); thì St bị biến đổi thành St=‘AB**CD’. Nếu k> Length(St) thì S được nối vào cuối của St. Ví dụ, sau khi thực hiện hai lệnh : St:=‘XYZ’; Insert(‘ABC’, St, 6); thì St=‘XYZABC’. Thủ tục Str(x, St): Biến đổi số nguyên hay thực x thành kiểu chuỗi và gán cho biến chuỗi St. Ví dụ, sau khi thực hiện lệnh : Str(4752, St); thì kết qủa là St= ‘4752’. Số x có thể được định dạng như khi in ra màn hình. Lệnh Str(4752 : 6, St); cho kết qủa St=‘ 4752’ (trước số 4752 có 2 ký tự trắng) . Nếu x là biến thực và gía trị của x=34.95 thì lệnh :.

<span class='text_page_counter'>(3)</span> Str(x :7:3, St); cho kết qủa St=‘ 34.950’ (trước số 34.950 có 1 ký tự trắng) . Thủ tục Val(St, x, k ): Biến đổi chuỗi số St thành số nguyên hay thực và gán cho biến nguyên hay thực x. Số nguyên k dùng để phát hiện lỗi: nếu đổi được thì k=0, ngược lại, gía trị của k là vị trí có lỗi trong chuỗi St. Ví dụ, cho ba biến n, k, j kiểu nguyên và biến x kiểu thực, sau khi thực hiện các lệnh : St:=‘385’; Val(St, n, j); Val(‘12.59’, x, k); thì n=385, j=0, x=12.59 và k=0. Nếu gán St := ‘3a7’; và thực hiện lệnh: Val(St, n, k); thì gía trị của n không xác định còn k=2 là vị trí của chữ a trong chuỗi St, tại đó không đổi ra số được. 6. Các ví dụ về chuỗi: Ví dụ 11.9: Ðổi một chuỗi ra chữ hoa hay chữ thường. Ðể đổi cả chuỗi St thành chữ hoa, ta đổi từng ký tự của chuỗi đó ra chữ hoa, tức là : For i:=1 to Length(St) do St[i]:=Upcase(St[i]); Tương tự, để đổi cả chuỗi St thành chữ thường, ta cũng đổi từng ký tự của chuỗi St ra chữ thường: For i:=1 to Length(St) do if ( St[i]>=‘A’) and (St[i]<=‘Z’) then St[i]:=Chr( Ord(St[i]) + 32) ; Ví dụ 11.10: Chuẩn hóa một chuỗi ký tự . Cho chuỗi St có nhiều ký tự trắng thừa ở đầu, ở cuối và giữa các từ, như St=‘ nguyen van tuan ‘. Chuẩn hóa chuỗi St là xóa hết các ký tự trắng thừa ở đầu và ở cuối, và giữa hai từ chỉ giữ lại đúng một ký tự trắng, như St =‘nguyen van tuan’. a) Xóa các ký tự trắng ở đầu chuỗi : Ðể xóa một ký tự trắng ở đầu của chuỗi St, ta dùng lệnh: If St[1]=#32 then Delete(St,1,1); Muốn xóa hết các ký tự trắng ở đầu chuỗi ta dùng lệnh: While St[1]=#32 do Delete(St,1,1); Diễn giải: chừng nào ký tự đầu tiên của St vẫn còn là ký tự trắng thì cứ xóa nó đi cho đến khi ký tự đầu tiên là khác trắng. Sở dĩ phải dùng vòng lặp While là vì số ký tự trắng ở đầu chuỗi là không biết trước. b) Xóa các ký tự trắng ở cuối chuỗi : Tương tự, muốn xóa tất cả các ký tự trắng ở cuối của chuỗi St, ta dùng lệnh: While St[ length(St) ]= #32 do Delete(St, length(St), 1); Diễn giải: chừng nào ký tự cuối cùng của St còn là khoảng trắng thì cứ xóa nó đi cho đến khi ký tự cuối cùng là khác trắng. c) Xóa các ký tự trắng thừa ở giữa hai từ trong chuỗi : Muốn xóa các ký tự trắng thừa để giữa hai từ chỉ còn đúng một ký tự trắng ta làm như sau: tìm trong St chỗ nào có hai ký tự trắng thì xóa đi một, và lặp lại thao tác trên cho đến khi trong St không còn chỗ nào có hai ký tự trắng liên tiếp. Tức là : k:=Pos(‘ ‘, St); { ‘ ‘ là 2 ký tự trắng } While k > 0 do begin Delete(St, k, 1); k:=Pos(‘ ‘, St); end; Ví dụ 11.11 : đếm trong chuỗi St có bao nhiêu chữ pascal. Vì chữ pascal có 6 ký tự, nên ta so sánh từng cụm 6 ký tự của St với chuỗi pascal, bắt đầu từ vị trí 1: Dem:=0; For i:=1 to Length(St) do if Copy (St, i, 6) =‘pascal’ then Inc(Dem); Writeln(‘ Số chữ pascal là ‘ , Dem); Ví dụ 11.12: Tìm kiếm và thay thế..

<span class='text_page_counter'>(4)</span> Tìm trong chuỗi St xem có chứa chữ ‘basic’ không, nếu có thì thay bằng chữ ‘pascal’, nếu không có thì in câu ‘không có’. Ví dụ St=‘ngon ngu basic duoc dung pho bien’, sau khi thay thế ta được St = ‘ngon ngu pascal duoc dung pho bien’. Ta dùng hàm Pos để tìm xem trong St có chứa chữ ‘basic’ không. Thủ tục Delete sẽ xóa chuỗi ‘basic’ khỏi St, và thủ tục Insert sẽ chèn chuỗi ‘pascal’ vào St tại vị trí đang xét: Ví dụ 11.13: Tính tổng các bình phương của các chữ số của một số tự nhiên N. Ví dụ N= 325 thì T=32+22+52 = 38. PROGRAM VIDU11_13 ; { Tính tổng các bình phương các chữ số của số N} Var N, T : Longint; i, j , k : Integer; St : String[40]; Begin Write(‘Nhập số N : ‘); Readln(N); Str( N, St ); { Ðổi số N ra chuỗi gởi vào St } T:=0; For i:=1 to Length(St) do begin Val ( St[i], j, k ); {Ðổi St[i] ra số gởi vào j} T:=T+ j*j; end; Writeln(‘ Tổng= ‘, T); Readln; End. Ví dụ 11.14: Tách mỗi từ của chuỗi in riêng trên một dòng: Cho St=‘ ngon ngu pascal ‘, cần in ra : ngon ngu pascal Phương pháp: Bước 1: -Chuẩn hóa chuỗi St thành St=‘ngon ngu pascal’. -Thêm một ký tự trắng vào cuối để St=‘ngon ngu pascal ‘. Bước 2: -Tìm k là vị trí của ký tự trắng đầu tiên, in k-1 ký tự đầu tiên, đó chính là từ thứ nhất, xóa k ký tự đầu tiên, kết qủa St=‘ngu pascal ‘. Lặp lại qúa trình trên cho đến khi trong St không còn ký tự trắng nào nữa. Chương trình cụ thể như sau: PROGRAM VIDU11_14 ; { Tách các từ và in riêng trên các dòng } Uses Crt; Var St: String; Tu : String[10]; k: Integer; Begin Clrscr; Write( ‘Nhập chuỗi St :’); Readln(St); { Chuẩn hóa chuỡi St } While St[1]=#32 do Delete(St,1,1); While St[ length(St) ]=#32 do Delete(St, length(St) ,1); k:=Pos(‘ ‘, St); { ‘ ‘ là 2 ký tự trắng } While k > 0 do begin.

<span class='text_page_counter'>(5)</span> Delete(St, k, 1); k:=Pos(‘ ‘, St); end; Writeln(‘ Chuỗi đã chuẩn hóa là : ’ , St); Writeln( ‘ Tách và in mỗi từ trên một dòng: ‘); St:=St + #32; { thêm 1 ký tự trắng vào cuối St} k:=Pos(#32, St); While k>0 do begin Tu:=Copy(St, 1, k-1); Writeln(Tu); Delete(St, 1, k); k:=Pos(#32, St); end; Readln; End. Ví dụ 11.15 : Ðể kết thúc phần này xin giới thiệu chương trình tạo dòng chữ ‘DAI HOC QUOC GIA TP.HCM’ chạy ngang màn hình từ phải qua trái. Chương trình kết thúc khi ta nhấn một phím bất kỳ. Tại vị trí dòng 10, cột 10, ta in chuỗi St rồi ngừng trong giây lát nhờ thủ tục Delay. Sau đó ta xóa ký tự đầu tiên của St đi rồi lại in St tại vị trí dòng 10, cột 10. Kết qủa là ta có cảm giác chuỗi St dịch sang phải một cột. Lặp lại các thao tác trên ta sẽ thấy chuỗi St chạy sang phải. Ðể St không bị ngắn dần và tạo cảm giác các chuỗi St chạy nối đuôi nhau, thì trước khi xóa St[1] ta nối St[1] vào cuối của St. Dưới đây là chương trình cụ thể: Chú ý rằng hàm Keypressed trả về gía tri logic là TRUE khi có một phím trên bàn phím được bấm. Thủ tục Delay(k) ngừng chương trình một thời gian là k/1000 giây. Hai hàm và thủ tục này đều thuộc thư viện CRT. PROGRAM VIDU11_15 ; { Tạo chữ chạy ngang màn hình} Uses Crt; Var St: String[80]; Begin St:=‘DAI HOC QUOC GIA TP.HCM ‘ ; TextMode(C40); TextBackground(green); TextColor(yellow); Clrscr; Repeat Gotoxy(10,10); Write(St); Delay(500); St:=St+ St[1]; { nối ký tự đầu vào cuối chuỗi} Delete(St, 1, 1); { Xóa ký tự đầu} Until Keypressed; TextMode(C80); End..

<span class='text_page_counter'>(6)</span> Bài tập về mảng và chuỗi ký tự Câu 1: Nhập một mảng gồm N tên các sinh viên. Hãy chuẩn hóa tất cả các tên này, đổi ra chữ hoa hết, sắp xếp và in lên màn hình theo thứ tự a, b, c, ... . Ví dụ nhập năm tên: lan, an, anh, thanh, bich, in ra : AN, ANH, BICH, LAN, THANH. Câu 2: Nhập một chuỗi St gồm nhiều từ. Giả thiết St có không qúa 20 từ, mỗi từ dài không qúa 10 ký tự. Xây dựng một mảng A chứa các từ của St, với A[i] chứa từ thứ i của St. Sắp xếp và in các từ của mảng A theo trật tự giảm của độ?dài của từ. Ví dụ cho St=‘ Thanh pho da Nang’ thì : A[1]=‘Thanh’, A[2]= ‘pho’, A[3]=‘Da’, A[4]=‘Nang’. In ra: Thanh Nang pho Da. Câu 3: Nhập một dãy số bất kỳ x1, x2,..., xn , cho biết dãy có đối xứng không?, dãy có lập thành một cấp số cộng không?. Ví dụ dãy 1 3 5 4 5 3 1 là đối xứng, dãy 1 3 5 7 là một cấp số cộng. Câu 4: Nhập một dãy số bất kỳ x 1, x2,..., xn , cho biết dãy thuộc loại nào: tăng, giảm hay không tăng, không giảm ? Câu 5: Đếm trong chuỗi St có bao nhiêu chữ pascal và tách mỗi từ của chuỗi in riêng trên một dòng Câu 6: Cho một danh sách là một mảng các xâu kí tự (array [1..20]of string[20]). Hãy lập trình để sắp xếp danh sách trên theo thứ tự của bảng chữ cái. Ví dụ nếu danh sách là: NGO XUAN TU TRAN THI BINH NGUYEN THI BINH LE VAN AN TRAN THANH CHUNG thì danh sách sau khi được sắp xếp sẽ là: LE VAN AN NGO XUAN TU (N đứng sau L) NGUYEN THI BINH (U đứng sau O) TRAN THANH CHUNG (T đứng sau N) TRAN THI BINH (I đứng sau A) Câu 7: Một xâu kí tự có thể "nén" theo cách sau: một xâu con gồm n > 1 kí tự giống nhau, chẳng hạn gồm n kí tự "a", sẽ được ghi thành na. Ví dụ xâu 'aaaabbcd' sẽ được nén thành '4a2bcd'. Hãy viết chương trình nén và giải nén các xâu kí tự. (Chú ý trong các xâu được nén phải không được có chữ số, nếu không kết quả sẽ không như ta mong muốn. Chẳng hạn xâu 'aaa2b' được nén thành '3a2b' có thể sẽ bị lẫn với 'aaabb'). Câu 8: Cho trước một xâu kí tự, trong đó có ít nhất 4 chữ số. Hãy loại bỏ một số kí tự khỏi xâu sao cho 4 kí tự cuối cùng còn lại theo đúng thứ tự đó tạo nên một số lớn nhất. Ví dụ nếu cho xâu '24d5n4r05f704n652z393' thì số lớn nhất còn lại là 7693. Hãy lập chương trình để giải bài toán trên Câu 9: Để nâng cao độ tin cậy khi truyền các bit thông tin, mỗi bit được lặp lại 3 lần, ví dụ ’011’ được truyền thành ’000111111’. Khi nhận thông tin, cứ một đoạn 3 bit được giải mã thành 1 bit là số gặp trong đoạn đó ít nhất 2 lần. Ví dụ nếu thông tin nhận được là '000110010011' thì thông tin đã giải mã là '0101'. Cho xâu nhị phân là thông tin nhận được. Hãy viết chương trình giải mã thông tin đó. Câu 10: Bạn hãy viết chương trình nhập vào một xâu kí tự, trong đó, nếu tính từ phải sang trái thì kí tự # là dấu hiệu xoá đi một kí tự đứng ngay trước nó nếu có. Ví dụ: ’#Ta#ôi đi ngủ#h###học’ có nghĩa là ’Tôi đi học’. Sau đó, in ra xâu đã sửa lại theo qui định trên..

<span class='text_page_counter'>(7)</span> Câu 11: Kết quả xổ số được cho bởi hai mảng A = (a1, a2,..., an) và B = (b1, b2,..., bn), trong đó A là mảng các số trúng giải, còn B là mảng số tiền thưởng của mỗi giải tương ứng. Hãy lập chương trình dùng thuật toán tìm kiếm nhị phân tính tổng số tiền thưởng cho các vé mang các số ghi trong mảng C = (c1, c2,..., cm) cho trước. Câu 12: Hai số nguyên được gọi là nguyên tố cùng nhau nếu ước chung lớn nhất của chúng bằng 1. Viết chương trình cho phép nhập số nguyên dương n từ bàn phím (1  n  1000000), sau đó xuất ra màn hình số các số nguyên dương nhỏ hơn n và nguyên tố cùng nhau với n. Ví dụ về chương trình khi chạy: Nhap vao so n: 9 Ket qua la: 6 Câu 13: Hãy viết chương trình: a. Nhập vào một đoạn text bất kỳ b. Thống kê xem trong đoạn text đó có bao nhiêu nguyên âm và hiển thị ra màn hình (theo thứ tự từ trái sang phải, không kể trùng nhau) c. Hãy cho hiện thị đoạn text trên với các nguyên âm bị cắt bỏ d. Hãy chèn số 0 vào tất cả các vị trí nguyên âm của đoạn text đã nhập vào. Thí dụ: Cho nhập vào đoạn text là: Thi tin hoc tre khong chuyen tinh Soc Trang Số kí tự nguyên âm là: 11 Các nguyên âm gồm: iioeouyeioa Sau khi cắt bỏ nguyên âm: Th tn hc tr khng chn tnh Sc Trng Sau khi chèn số 0: Th0 t0n h0c tr0 kh0ng ch000n t0nh S0c Tr0ng.

<span class='text_page_counter'>(8)</span>

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×