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

Chu de 12 2015

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 (207.63 KB, 32 trang )

<span class='text_page_counter'>(1)</span>LUYỆN THI HỌC SINH GIỎI MÔN TIN HỌC Thời gian làm bài: 150 phút. CHỦ ĐỀ 12 TẦN SỐ Tổng quan TT 1 2 3. Tên bài Mật khẩu an toàn Tần số Xâu thu gọn. Tệp chương trình. Tệp dữ liệu. Tệp kết quả. MKAT.PAS TANSO.PAS XAUTG.PAS. MKAT.INP TANSO.INP XAUTG.INP. MKAT.OUT TANSO.OUT XAUTG.OUT. Thời gian 1s/test 1s/test 1s/test. Bài 1. (6 điểm) MẬT KHẨU AN TOÀN Mật khẩu được gọi là an toàn loại 1 nếu nó có ít nhất 6 ký tự và trong đó phải có đủ 3 loại: chữ thường, chữ hoa và chữ số. Mật khẩu được gọi là an toàn loại 2 nếu nó có chứa ít nhất 2 chữ thường khác nhau, 2 chữ hoa khác nhau và 2 chữ số khác nhau. Yêu cầu: Cho trước xâu S, dài không quá 255 ký tự, gồm chữ thường, chữ hoa và chữ số, cần: a) Xác định các số nH, nT, nS tương ứng là số các chữ hoa khác nhau, số các chữ thường khác nhau, và số các chữ số khác nhau, có trong xâu S. b) Tìm khúc con đầu tiên, ngắn nhất K1 của xâu S có thể dùng làm mật khẩu an toàn loại 1 (nếu không tìm được khúc con như thế thì đặt K1 = ‘0’). c) Tìm khúc con đầu tiên, ngắn nhất K2 của xâu S có thể dùng làm mật khẩu an toàn loại 2 (nếu không tìm được khúc con như thế thì đặt K2 = ‘0’). Dữ liệu: đọc vào từ tệp MKAT.INP, gồm nhiều phương án, mỗi phương án trên 1 dòng, trên dòng đó ghi xâu S. Kết quả: đưa ra màn hình và ghi ra tệp MKAT.OUT, mỗi phương án trên 1 dòng, trên dòng đó lần lượt ghi các số nH, nT, nS và các khúc con K1, K2 tìm được.. Ví dụ:. MKAT.INP dserwGasddasddda2453dssa Asdg5HgHvH4c. MKAT.OUT 1 6 4 Gasddasddda2 0 2 5 2 Asdg5H Asdg5HgHvH4. Bài 2. (6 điểm) TẦN SỐ Cho một văn bản gồm N câu (N <= 500), mỗi câu chứa không quá 255 ký tự. Ta gọi tần số của một ký tự là số lần xuất hiện của ký tự đó trong toàn bộ văn bản. Yêu cầu: Tìm tần số lớn nhất trong các tần số của các chữ cái (không phân biệt chữ thường và chữ hoa) trong văn bản đã cho. Dữ liệu: Đọc từ tệp TANSO.INP, gồm nhiều phương án, mỗi phương án được ghi trên nhiều dòng: - Dòng đầu tiên ghi số N. - N dòng tiếp theo, mỗi dòng ghi 1 câu của văn bản. Kết quả: Đưa ra màn hình và ghi ra tệp TANSO.OUT, mỗi phương án ghi trên 1 dòng, trên dòng đó ghi số tần số lớn nhất tìm được, tiếp đó ghi số chữ thường, bản thân chữ thường đó, cuối cùng ghi số chữ hoa, bản thân chữ hoa ứng với tần số lớn nhất đó. Ví dụ : TANSO.INP 5 aaaaag3475949AAAAA&()()#$%#@@# hfhkkljklklaaaaa08343AAAAAjjojAAAAa hjgjhggjaaaaaj 97|+|aaaAA ijofj 05885-8-12112\=-09988876655 btrei AAAAAUHHI()(&() TANSO.OUT 40 19 a 21 A Bài 3. (7 điểm) XÂU THU GỌN Xâu thuần nhất là xâu chỉ chứa các chữ cái, không chứa các chữ số. Các xâu thuần nhất có thể được nén lại để làm giảm dung lượng lưu trữ bằng phương pháp nén loạt dài như sau: - Mỗi chữ cái (‘A’ chẳng hạn) xuất hiện liên tiếp K lần được ghi dưới dạng AK, nghĩa là chữ cái đó cùng với số lần xuất hiện liên tiếp của nó. - Mỗi cụm ký tự (‘C2A’ chẳng hạn) xuất hiện liên tiếp M lần được ghi dưới dạng (C2A)M, nghĩa là cụm ký tự đó,.

<span class='text_page_counter'>(2)</span> để trong cặp dấu ngoặc tròn, tiếp đó là số lần xuất hiện liên tiếp của cụm ký tự đó. Chú ý rằng trong cụm ký tự có thể có các chữ số, các dấu ngoặc tròn và bắt buộc phải có ít nhất 1 chữ cái. Ví dụ: xâu ‘AAABCCCCACCCCA’ (14 ký tự) được thu gọn thành ‘A3B(C4A)2’ (9 ký tự). Yêu cầu: Cho biết xâu thuần nhất, tìm xâu thu gọn của nó. Dữ liệu: Đọc từ tệp XAUTG.INP, gồm nhiều phương án, mỗi phương án được ghi trên một dòng, trên dòng đó ghi xâu thuần nhất cần xử lý. Kết quả: Đưa ra màn hình và ghi ra tệp XAUTG.OUT, mỗi phương án ghi trên 1 dòng, trên dòng đó ghi độ dài của xâu ban đầu, độ dài của xâu thu gọn và bản thân xâu thu gọn tìm được. Ví dụ : XAUTG.INP AABCCACCA AAAAAAABCCCCCBBBADDDDDDDDDDDD XAUTG.OUT 9 9 A2B(C2A)2 29 11 A7BC5B3AD12. TÓM TẮT LÝ THUYẾT.

<span class='text_page_counter'>(3)</span> 1. So sánh các xâu kí tự Giống như đối với các số, Turbo Pascal cũng có các phép toán so sánh các xâu kí tự, nhưng các xâu kí tự được so sánh theo thứ tự từ điển và phân biệt chữ hoa với chữ thường - X1 < X2: xâu X1 đứng trước xâu X2. Ví dụ ‘123’ < ‘13’, ‘abc’ < ‘abd’, ‘A’< ‘a’. - X1 > X2: xâu X1 đứng sau xâu X2. Ví dụ ‘13’ > ‘123’, ‘abd’ > ‘abc’, ‘a’ > ‘A’. - X1 = X2: xâu X1 bằng (cùng vị trí với) xâu X2. Ví dụ ‘123’ = ‘123’, ‘abc’ = abc’. - X1 <> X2: xâu X1 khác (khác vị trí với) xâu X2. Ví dụ ‘123’ <> ‘12’, ‘ab’ <> ‘aB’. 2. Kĩ thuật sử dụng tệp tạm Trong nhiều trường hợp không thể dùng các biến bộ nhớ để làm việc(vì kích thước bộ nhớ tối đa chỉ là 65520 byte, không cho phép dùng các mảng lớn). Ví dụ với Bài 1, nếu dùng mảng ta phải khai báo một mảng có 1000 phần tử kiểu String var vb: array[1..1000] of String; Khi gặp khai báo này, Turbo Pascal sẽ đưa ra thông báo lỗi ‘Structure too large’ (Cấu trúc quá lớn vì 1000 x 255 = 255000 > 65520). Nếu chương trình khai báo nhiều biến, mỗi biến không vượt quá 65520 byte nhưng tổng số byte sử dụng vượt quá 65520 byte thì Turbo Pascal sẽ đưa ra thông báo lỗi ‘Too many variables’ (Sử dụng quá nhiều biến). Lưu ý rằng các biến bộ nhớ ở đây bao gồm các biến ở phần khai báo chung, và các biến cục bộ, khai báo bên trong các hàm hoặc các thủ tục của chương trình. Để giải quyết các vấn đề như trên, ta có thể dùng tệp tạm, là tệp văn bản, để lưu trữ các dạng dữ liệu khác nhau. Đây là giải pháp dùng bộ nhớ ngoài (đĩa cứng hoặc USB) thay cho bộ nhớ trong. Làm việc với các tệp có chậm hơn so với các mảng nhưng ưu điểm là dung lượng lớn (dung lượng tối đa của tệp lên đến 2 GB (2 tỉ byte) ). 3. Các loại kí tự Turbo Pascal chia các kí tự thành nhiều nhóm: Chữ cái: gồm hai dạng - chữ thường: ‘abcdefghijklmnopqrstuvwxyz’ (26 chữ cái thường của tiếng Anh). - chữ hoa: ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’ (26 chữ cái hoa của tiếng Anh). Chữ số: ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ (các chữ số Ả-rập). Các dấu ngắt câu: ‘.’, ’,’, ’?’, ’!’, ‘;’, … Các ký tự đặc biệt: ‘~’, ‘@’, ‘#’, ‘$’, ‘%’, ‘^’, ‘&’, ‘*’,... 4. Cách đếm số kí tự của một nhóm kí tự Để đếm số kí tự của các nhóm kí tự trong một văn bản, ta nên làm như sau (ví dụ dùng cho nhóm chữ thường, với các nhóm khác, làm tương tự): - Khai báo hằng chứa các ký tự của nhóm const ChuThuong = ‘abcdefghijklmnopqrstuvwxyz’; - Duyệt qua toàn bộ văn bản và đếm số kí tự thuộc nhóm nhờ hàm pos(kítự, vănbản) Đặt n = length(vb), sct:= 0 Duyệt với i từ 1 đến n Nếu vb[i] thuộc nhóm thì tăng sct 5. Cách tính tần số của từng kí tự - Dùng mảng với chỉ số là kí tự var TS = array[‘A’..’Z’] of integer - Duyệt qua toàn bộ văn bản và đếm số lần xuất hiện của các chữ cái (không phân biệt chữ hoa, chữ thường) Đặt n = length(vb) Duyệt với i từ 1 đến n Nếu vb[i] là ChuHoa thì tăng TS[vb[i]] Nếu vb[i] là ChuThuong thì tăng TS[chr(ord(vb[i])-32)] 7. Dùng sắp xếp để tìm số lớn nhất, số nhỏ nhất - Khi sắp xếp dãy theo thứ tự giảm dần, phần tử đầu tiên sẽ là phần tử lớn nhất, phần tử cuối cùng sẽ là phần tử nhỏ nhất. TSMax = TS[‘A’], TSMin = TS[‘Z’]. - Khi sắp xếp dãy theo thứ tự tăng dần, phần tử đầu tiên sẽ là phần tử nhỏ nhất, phần tử cuối cùng sẽ là phần tử lớn nhất. TSMin = TS[‘A’], TSMax = TS[‘Z’]. 8. Dùng sắp xếp để tìm danh sách các kí tự có tần số lớn nhất - Khởi tạo mảng chỉ số MC[ch] = ch với ch từ ‘A’ đến ‘Z’. - Sắp xếp đồng thời 2 dãy TS và CS theo thứ tự giảm dần của TS - Khởi tạo DS = ‘’, ch = ‘A’..

<span class='text_page_counter'>(4)</span> - Lặp lại chừng nào TS[ch] = TS[‘A’] Đặt DS = DS + ch, ch = suss(ch) {Chữ cái tiếp theo của ch}. GỢI Ý CÁCH GIẢI Bài 1. - Thủ tục DemSoKiTu(xv, nnH, nnT, nnS) để đếm số chữ hoa (nnH), số chữ thường (nnT), số chữ số (nnS) khác nhau trong xâu xv: Khởi tạo dacoH := '', dacoT := '', dacoS := '', nnH := 0, nnT := 0, nnS := 0. Đặt l = length(xv);.

<span class='text_page_counter'>(5)</span> Duyệt với i từ 1 đến l Nếu xv[i] là ChuHoa và chưa có xv[i] trong dacoH thì Tăng nnH Đặt dacoH = dacoH + xv[i] Nếu xv[i] là ChuThuong và chưa có xv[i] trong dacoT thì Tăng nnT Đặt dacoT = dacoT + xv[i] Nếu xv[i] là ChuSo và chưa có xv[i] trong dacoS thì Tăng nnS Đặt dacoS = dacoS + xv[i] - Hàm TimK(ktype) để tìm mật khẩu an toàn loại ktype Khởi tạo sk := '0', n1 := N-1, minL := N. Duyệt với i từ 1 đến n1 Đặt i1 = i+1 Duyệt với j từ i1 đến N Đặt stemp = copy(S, i, j-i+1), nL = length(stemp). DemSoKiTu(stemp, n2H, n2T, n2S) Nếu (n2H>=ktype) và (n2T>=ktype) và (n2S>=ktype) và (nL>=6) thì Nếu minL> nL thì Đặt sk = stemp, minL = nL Kết quả TimK = sk Bài 2. - Thủ tục DemChu(dong): để đếm số chữ có ở đầu vào; Đặt m = length(dong) Duyệt với i từ 1 đến m Đặt vtt = pos(dong[i],ChuT), vtH := pos(dong[i],ChuH) Nếu (vtt >= 1) thì tăng tst[vtt] Nếu (vth >= 1) thì tăng tsh[vth] - Thủ tục XuLyDong để xử lí một dòng của văn bản Đặt L = length(dong) Duyệt với i từ 1 đến L Nếu dong[i] là ChuThuong thì Tăng sct, đặt vt = pos(dong[i],ChuThuong), Tăng TS[ChuHoa[vt]]) Nếu dong[i] là ChuHoa) thì Tăng scH, tăng TS[dong[i]]) Đặt tscc = sct + scH - Thủ tục TimTSM để tìm tần số lớn nhất (tsm) và vị trí chữ cái tương ứng Đặt vtm = 1, tsm = tst[1] + tsh[1] Duyệt với i từ 2 đến 26 Nếu tsm < tst[i] + tsh[i] thì Đặt tsm = tst[i] + tsh[i], vtm = i Bài 3. - Thủ tục NenDon để nén các chữ cái có trong xâu S Đặt n = length(S), X = '', ic = 1, cc = S[1] Duyệt với i từ 2 đến n Nếu (cc = S[i]) thì tăng ic {cum ky tu don} Trái lại Nếu ic > 1 thì Đổi ic thành xâu xc Đặt X = X + cc + xc Trái lại thì đặt X = X + cc Đặt ic = 1, cc = S[i] Nếu ic > 1 then Đổi ic thành xâu xc Đặt X = X + cc + xc; Trái lại thì đặt X = X + cc.

<span class='text_page_counter'>(6)</span> - Hàm CoChu(cum) để kiểm tra xem trong cum co chữ cái hay không Đặt tl = false Duyệt với i từ 1 đến length(cum) Nếu pos(cum[i], ChuCai) > 0 thì Đặt tl = true, break Trả về tl - Thủ tục GopCum(dd, nn: byte; var cl:boolean) để gộp các cụm liên tiếp, có độ dài dd Đặt id = 1, X = '' Lặp lại cum1 = copy(Xt, id, dd), ll = 1, j = id + dd Lặp lại cum2 = copy(Xt, j, dd) Nếu (cum1 = cum2) và CoChu(cum1) thì Tăng ll, đặt j = j + dd, đặt cl = true cho đến khi cum1 <> cum2 hoặc không cochu(cum1) Nếu ll>1 thì Đổi ll thành xâu xl Đặt X = X + '(' + cum1 + ')' + xl Đặt id = j Trái lại Đặt X = X + Xt[id] Tăng id cho đến khi id >= nn Duyệt với j từ id đến nn Đặt X = X + xt[j] - Thủ tục NenBoi để nén các cụm ký tự Lặp lại Đặt Xt = X, n = length(Xt), n2 = n div 2, n4 = n div 4 Tăng sl, đặt cl = false Duyệt với dd từ n2 giảm đến n4 GopCum(dd, n, cl) Nếu (Xt <> X) thì break {đã thay đổi} Đặt Xt = X, n = length(Xt), n2 = n div 2, n4 = n div 4 Giảm n4 Duyệt với dd từ 2 đến n4 GopCum(dd,n,cl) Nếu (Xt <> X) thì break {đã thay đổi} cho đến khi cl = false. DỮ LIỆU ĐỂ KIỂM TRA BÀI 1 Tệp MKAT.INP dserwGasddasddda2453dssa Asdg5HgHvH4c Asdg5HgzuKvtxL4cdEFghijK5LMNo ds1erwGas23Hddasddda456dssabCd dser1wGas23dda456sdVdd7890adssa dse11rwGas22Mddas333ddda2453dssa dser90Hw12Gasdd345asddda2453dssa 1dser22wGas333ddas444ddda2345dssa abcde1fghHijkrw1111111111Gasddas11. Tệp MKAT.OUT 1 6 4 Gasddasddda2 0 2 5 2 Asdg5H Asdg5HgHvH4 8 13 2 Asdg5H 5HgzuKvtxL4 3 7 6 s1erwG Gas23H 2 6 10 ser1wG Gas23dda456sdV 2 6 5 e11rwG 1rwGas22M 2 6 7 ser90H Hw12Ga 1 6 5 er22wG 0 2 14 1 e1fghH 0.

<span class='text_page_counter'>(7)</span> DỮ LIỆU ĐỂ KIỂM TRA BÀI 2 Tệp TANSO.INP 5 aaaaag3475949AAAAA&()()#$%#@@# hfhkkljklklaaaaa08343AAAAAjjojAAAAa hjgjhggjaaaaaj 97|+|aaaAA ijofj 05885-8-12112\=-09988876655 btrei AAAAAUHHI()(&() 5 #$%#@@#hfhkkljklklJ hfhkkljklklaaaaa08343jjoj hjgjhggjj 97|+|hjgjhggj ijofj 05885-8-12112\=-09988876655 btreihjgjhggj AAAAAUHHI()(&()hjgjhggj 6 5949ccccc&ggggggJ3475949BBB&()()#$%#@@# hfhkkljklklbbb08343KKKKKjjojjjjja 97|+|aaaAAhjgjhgg 97|+|aaaAA ijofj 05885-8-12112\=-09988876655 btrei CCCCCUHHI()(&()hhhhhg34759iJofj 05885 &BBBg3475949Jbb&()()hjgjhggJaaaaa 6 5949ccccc&ggggggJ3475949BBBBB&()()#$%#@@# hfhkkljklklbbbbb08343KKKKKjjojjjjja 97|+|aaaAAhjgjhgg97|+|aaaAA ijofj 05885-8-12112\=-09988876655 btrei CCCCCUHHI()(&()hhhhhg34759iJofj 05885 &BBBBBg3475949Jbbbbb&()()hjgjhggJaaaaa 7 5949CCCCC&bbbbbg3475949ccccc&()()#$%#@@# hfhkkljklklCCCCC08343bbbbbjjojbbbbbhfhkkljklkl 97|+|aaaAAhjgjhggjhhhhhj 97|+|aaaAAhfhkkljklkl ijofj 05885-8-12112\=-09988876655 btreihfhkkljklkl hfhkkljklKlbbbbbUHHI()(&()cccccg34759ijofj 05885 hfhkkljklKl&kkkkkg3475949GGGGG&()()hjgjhggjaaaaa hfhkkljklKlCCCCC&CCCCCg3475949bbbbb&97|+|aaaAA 7 5949CCCCC&bbbbbg3475949ccccc&()()#$%#@@# hfhljklklCCCCC08343bbbbbjjojbbbbbhfhljklkl 97|+|aaaAAhjgjhggjhhhhhj 97|+|aaaAAhfhljklkl ijofj 05885-8-12112\=-09988876655 btreihfhkljklkl hfhkljklKlbbbbbUHHI()(&()cccccg34759ijofj 05885 hfhkljklKl&g3475949GGGGG&()()hjgjhggjaaaaa hfhkljklKlCCCCC&CCCCCg3475949bbbbb&97|+|aaaAA. Tệp TANSO.OUT 40 19 a 21 A 21 20 j 1 J 19 15 j 4 J 21 11 b 10 B 33 30 k 3 K 30 10 c 20 C DỮ LIỆU ĐỂ KIỂM TRA BÀI 3 Tệp XAUTG.INP (chú ý: dữ liệu kéo dài đến dòng tụt vào ngay sau) AABCCACCA AAAAAAABCCCCCBBBADDDDDDDDDDDD XCAABAABAABCCADADCAABAABAABCCADADY.

<span class='text_page_counter'>(8)</span> AAAABBAAAABBAAAABBAAAABBAAAABBHAAAABBAAAABBAAAABBAAAABBAAAABBH ABBBBBCCDCCDCCDCCDCCDCCDCCDCCDCCDCCDEABBBBBCCDCCDCCDCCDCCDCCDCCDCCDCCDCCDEABBB BBCCDCCDCCDCCDCCDCCDCCDCCDCCDCCDE AABCCACCAAAAAAAABCCCCCBBBADDDDDDDDDDDDXCAABAABAABCCADADCAABAABAABCCADADY AAAAAAABCCCCCBBBADDDDDDDDDDDDXCAABAABAABCCADADCAABAABAABCCADADYAAAABBAAAABBAAA ABBAAAABBAAAABBHAAAABBAAAABBAAAABBAAAABBAAAABBH AABCCACCAAAAAAAABCCCCCBBBADDDDDDDDDDDDXCAABAABAABCCADADCAABAABAABCCADADYAAAAAA ABCCCCCBBBADDDDDDDDDDDDXCAABAABAABCCADADCAABAABAABCCADADY ABBBBBCCDCCDCCDCCDCCDCCDCCDCCDCCDCCDEABBBBBCCDCCDCCDCCDCCDCCDCCDCCDCCDCCDEABBB BBCCDCCDCCDCCDCCDCCDCCDCCDCCDCCDEAABCCACCAAAAAAAABCCCCCBBBADDDDDDDDDDDDXCAABAA BAABCCADADCAABAABAABCCADADYAAAAAAABCCCCCBBBADDDDDDDDDDDDX. Tệp XAUTG.OUT 9 9 A2B(C2A)2 29 11 A7BC5B3AD12 34 19 X(C(A2B)3C2(AD)2)2Y 62 11 ((A4B2)5H)2 111 14 (AB5(C2D)10E)3 72 38 A2B(C2A)28BC5B3AD12X(C(A2B)3C2(AD)2)2Y 125 41 A7BC5B3AD12X(C(A2B)3C2(AD)2)2Y((A4B2)5H)2 135 68 A2B(C2A)28BC5B3AD12X(C(A2B)3C2(AD)2)2YA7BC5B3AD12X(C(A2B)3C2(AD)2)2Y 213 64 (AB5(C2D)10E)3A2B(C2A)28BC5B3AD12X(C(A2B)3C2(AD)2)2YA7BC5B3AD12X. MÃ NGUỒN BÀI 1. {Phan khai bao chung} Uses Crt; Const tentep='MKAT'; ChuHoa: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; ChuThuong: string = 'abcdefghijklmnopqrstuvwxyz'; ChuSo: string = '0123456789'; Var S, K1, K2: string; N, nH, nT, nS: byte;. soPA, pa: byte; f: text; {Dem so phuong an} Procedure DemSoPA; BEGIN Assign(f,tentep+'.INP'); Reset(f); soPA:=0; while not EOF(f) do begin inc(soPA);.

<span class='text_page_counter'>(9)</span> ReadLn(f); end; Close(f); END; {Doc du lieu cua phuong an pa} procedure DocPA; var i: byte; BEGIN Assign(f,tentep+'.INP'); Reset(f); i:=1; while i<pa do begin readln(f); inc(i); end; readln(f,S); close(f); N := length(S); END; {Dem so ki tu cac loai} procedure DemSoKiTu(xv: string; var nnH, nnT, nnS: byte); var l, i: byte; dacoH, dacoT, dacoS: string; BEGIN dacoH := ''; dacoT := ''; dacoS := ''; nnH := 0; nnT := 0; nnS := 0; l:=length(xv); for i := 1 to l do begin if ((pos(xv[i],ChuHoa)>0) and (pos(xv[i], dacoH)<=0)) then begin inc(nnH); dacoH := dacoH + xv[i]; end; if ((pos(xv[i],ChuThuong)>0) and (pos(xv[i], dacoT)<=0)) then begin inc(nnT); dacoT := dacoT + xv[i]; end; if ((pos(xv[i],ChuSo)>0) and (pos(xv[i], dacoS)<=0)) then. begin inc(nnS); dacoS := dacoS + xv[i]; end; end; END; {Tim K1 hoac K2} Function TimK(ktype: byte): string; var n1, i, i1, j, n2H, n2T, n2S, minL, nL: byte; stemp, sk: string; BEGIN sk := '0'; n1 := N-1; minL := N; for i:=1 to n1 do begin i1:= i+1; for j:= i1 to N do begin stemp := copy(S, i, j-i+1); nL := length(stemp); DemSoKiTu(stemp, n2H, n2T, n2S); if (n2H>=ktype) and (n2T>=ktype) and (n2S>=ktype) and (nL>=6) then begin if minL> nL then begin sk := stemp; minL := nL; end; end; end; end; TimK := sk; END; {Ghi ket qua ra man hinh va tep tin} procedure GhiKQ; BEGIN assign(f, tentep+'.OUT'); if pa<=1 then rewrite(f) else append(f); writeln(f,nH,' ',nT,' ',nS,' ',K1,' ',K2); close(f); writeln(nH,' ',nT,' ',nS,' ',K1,' ',K2); END; {Chuong trinh chinh} BEGIN clrscr; DocSoPA;.

<span class='text_page_counter'>(10)</span> for pa:=1 to soPA do begin DocPA; DemSoKiTu(S, nH, nT, nS); K1 := TimK(1); K2 := TimK(2);. GhiKQ; end; writeln; write('Da xong. Nhan ENTER de thoat.'); readln; END.. GIẢI THÍCH MÃ NGUỒN BÀI 1 1. Chương trình chính. Sau khi gọi lệnh DemSoPA, vòng lặp For gọi các lệnh DocPA, DemSoKiTu, K1 := TimK(1), K2 := TimK(2), và GhiKQ. 2. Lệnh DemSoPA: đếm số phương án có trong tệp dữ liệu. 3. Lệnh DocPA: đọc dữ liệu của phương án thứ pa. 4. Lệnh GhiKQ: ghi kết quả ra màn hình và tệp tin. 5. Lệnh DemSoKiTu(S, tscc, scT, scH): Để đếm tổng số chữ cái (tscc), số chữ thường (scT), số chữ hoa (scH) trong xâu S. Thuật giải đã nêu ở phần Gợi ý cách giải. 5. Các lệnh K1 := TimK(1), K2 := TimK(2): để tìm khúc con K1 và K2 theo yêu cầu. Thuật giải đã nêu ở phần Gợi ý cách giải.. MÃ NGUỒN BÀI 2 (Tệp TANSO.PAS) {Phan khai bao chung} uses crt; const tentep = 'TANSO'; {Ten tep} ChuH: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; ChuT: string = 'abcdefghijklmnopqrstuvwxyz';. var N: integer; {Dau vao} dong: string; {Dau vao} tst, tsh: array[1..26] of integer; {Bien phu} tsm, vtm: integer; {Bien phu} soPA, pa: integer; {QL phuong an} f: text; {Bien tep}.

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

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

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

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

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

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

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

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

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

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

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

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

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

<span class='text_page_counter'>(24)</span> for i:= 2 to 26 do if tsm < tst[i] + tsh[i] then begin tsm := tst[i] + tsh[i]; vtm := i; end; END; {Doc du lieu phuong an} procedure DocPA; var i, j: byte; BEGIN assign(f, tentep+'.INP'); reset(f); i:=1; while i<pa do begin readln(f,N); for j := 1 to N do readln(f); inc(i); end; fillchar(tst,sizeof(tst),0); fillchar(tsh,sizeof(tsh),0); readln(f,N); for j := 1 to N do begin readln(f, dong); DemChu(dong); end; close(f); END; {Ghi ket qua ra man hinh va tep tin} procedure GhiKQ; BEGIN assign(f,tentep+'.OUT'); if pa=1 then rewrite(f) else append(f); writeln(tsm,' ',tst[vtm],' ',chut[vtm],' ', tsh[vtm],' ',chuh[vtm]); writeln(f,tsm,' ',tst[vtm],' ',chut[vtm],' ',tsh[vtm],' ',chuh[vtm]); close(f); END; {Chuong trinh chinh} BEGIN clrscr; DemSoPA; for pa:=1 to soPA do begin DocPA; TimTSM; GhiKQ;.

<span class='text_page_counter'>(25)</span> end; writeln; write('Da xong. Nhan ENTER de thoat.');. readln; END.. GIẢI THÍCH MÃ NGUỒN BÀI 2 1. Chương trình chính. Sau khi gọi lệnh DemSoPA, vòng lặp For gọi các lệnh DocPA, TimTSM và GhiKQ. 2. Lệnh DemSoPA: đếm số phương án có trong tệp dữ liệu. 3. Lệnh DocPA: đọc các dòng dữ liệu của phương án thứ pa và xử lý đối với các dòng đó. Thuật giải đã nêu ở phần Gợi ý cách giải. 4. Lệnh GhiKQ: ghi kết quả ra màn hình và tệp tin nhưng đầu tiên nó gọi lệnh TimTSM để tìm tần số lớn nhất và danh sách các chữ cái có tần số lớn nhất đó. Thuật giải đã nêu ở phần Gợi ý cách giải..

<span class='text_page_counter'>(26)</span> MÃ NGUỒN BÀI 3 (Tệp XAUTG.PAS) {Phan khai bao chung}.

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

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

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

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

<span class='text_page_counter'>(31)</span> X := ''; ic := 1; cc := S[1]; for i := 2 to n do if (cc = S[i]) then inc(ic) else {cum ky tu don} begin if ic > 1 then begin str(ic,xc); X := X + cc + xc; end else X := X + cc; ic := 1; cc := S[i]; end; if ic > 1 then begin str(ic,xc); X := X + cc + xc; end else X := X + cc; END; {Co chu cai trong cum} function CoChu(cum: string): boolean; var i: byte; tl: boolean; BEGIN tl := false; for i:= 1 to length(cum) do if pos(cum[i], ChuCai) > 0 then begin tl := true; break; end; CoChu := tl; END; {Gop cac cum} procedure GopCum(dd, nn: byte; var cl:boolean); var id, ll, j: byte; cum1, cum2, xl: string; BEGIN id := 1; X := ''; repeat cum1 := copy(Xt, id, dd); ll := 1; j := id + dd; repeat cum2 := copy(Xt, j, dd); if (cum1 = cum2) and CoChu(cum1) then begin.

<span class='text_page_counter'>(32)</span> inc(ll); inc(j,dd); cl := true; end; until (cum2 <> cum1) or (not Cochu(cum1)); if ll>1 then begin str(ll,xl); X := X + '(' + cum1 + ')' + xl; id := j; end else begin {khong lap} X := X + Xt[id]; inc(id); end; until id >= nn; for j:= id to nn do X := X + xt[j]; END; {Nen cac cum nhieu ky tu} procedure NenBoi; var n, n2, n4, dd, sl: byte; cl: boolean; BEGIN repeat Xt := X; n := length(Xt); n2 := n div 2; n4 := n div 4; inc(sl); cl := false; for dd := n2 downto n4 do begin GopCum(dd, n, cl); if (Xt <> X) then break; end; Xt := X;. n := length(Xt); n2 := n div 2; n4 := n div 4; dec(n4); for dd := 2 to n4 do begin GopCum(dd,n,cl); if (Xt <> X) then break; end; until (cl = false); END; {Ghi ket qua ra man hinh va tep tin} procedure GhiKQ; BEGIN Assign(f, tentep+'.OUT'); if (pa = 1) then Rewrite(f) else Append(f); Writeln(length(S),' ',length(X),' ',X); Writeln(f, length(S),' ',length(X),' ',X); Close(f); END; {Chuong trinh chinh} BEGIN clrscr; DemSoPA; for pa:=1 to soPA do begin DocPA; NenDon; NenBoi; GhiKQ; end; writeln; write('Da xong. Nhan ENTER de thoat.'); readln; END.. GIẢI THÍCH MÃ NGUỒN BÀI 3 1. Chương trình chính. Sau khi gọi lệnh DemSoPA, vòng lặp For gọi các lệnh DocPA, NenDon, NenBoi và GhiKQ. 2. Lệnh DemSoPA: đếm số phương án có trong tệp dữ liệu. 3. Lệnh DocPA: đọc dữ liệu của phương án thứ pa và xử lý cho phương án đó. Lệnh này gọi lệnh DemChu xử lý từng câu trong phương án. Thuật giải đã nêu ở phần Gợi ý cách giải. 4. Lệnh GhiKQ: ghi kết quả ra màn hình và tệp tin..

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

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

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