Docstoc
EXCLUSIVE OFFER FOR DOCSTOC USERS
Try the all-new QuickBooks Online for FREE.  No credit card required.

Cac de tuyen cao hoc - Lap trinh

Document Sample
Cac de tuyen cao hoc - Lap trinh Powered By Docstoc
					                                                                                   1/2



              Đề thì tuyển Nghiên cứu sinh và Cao học
           Môn: Phương pháp lập trình, CTDL và giải thuật
                               Thời gian: 180 phút


Câu 1. Cho chương trình sau:
   Program Chuyengiaomang(input,outphut);
   Var i:integer;
       A:array[1..2]of interger;
   Procedure p(var x,y:integre);
   Begin
   {3} X:=x+1;
   {4} Y:=y+1;
   {5} Write(x,y);
   End;

   BEGIN
   {1} i:=1; A[1]:=2; A[2]:=0;
   {2} P(i,a[a[i]]);
   {7} writeln(i,a[1],a[2]);
   {8} END.

   a. Cho biết kết quả in ra.
   b. Giải thích kết quả đó qua hành động của chương trình theo các bước từ {1}
      đến {8}.

Bài 2. Giải thuật tìm kiếm nhị phân được thể hiện như sau:
   Type kieuPT = integer;
         Bang = array[1..n] of kieuPT {n>0 và bảng được sắp}
   Function TimNhiPhan(k:kieuPT; var b:bang):integer;
   Var t,p,g:integer; {trái,phải,giữa}
   Begin
      T:=1; p:=n;
      Repeat
         G:=(t+p) div 2;
         if k>b[g] then t:=g
         else           p:=g;
      until (b[g]=k)or(t>=p);
      If b[g] = k then TimNhiPhan:=g {tìm được k}
      Else             TimNhiPhan:=0; {không tìm được}
   End;

    Hãy tìm một ví dụ b[1], b[2],…, b[n] chứng tỏ rằng giải thuật trên không đưa
ra kết quả mong muốn. Hãy chữa lại chương trình trên cho đúng.

Bài 3. Cho cây nhị phân với khai báo như sau:
   Type tro = ↑nut;
        Nut = record
                Giatri:integer;
                Contrai,conphai:tro;


                                                               Trình bày: Trần Hoài Nhân
                                                                                        2/2


             End;
   Var t:tro; {trỏ gốc của cây}

    Hãy lập hàm: Function copy(T:tro):tro; Cho phép, với một cây có gốc
trỏ bởi T, lập một bản sao của cây đó (ở bộ nhớ trong) và cho lại địa chỉ của gốc
của cây mới này.

Bài 4. Với cây nhị phân được khai báo như ở bài 3, ta có thể tiến hành duyệt cây
theo một giải thuật không đệ quy theo sơ đồ sau, trong đó có đúng một danh sách
tuyến tính để làm (các con trỏ tới) các nút cần ghi nhớ trong cây.

   Nạp (con trỏ) gốc cây vào danh sách;
   While danh sách không rỗng do
      Begin
         Lấy một nút từ danh sách, gọi đó               là N;
         Thăm N (chẳng hạn in giá trị của               nó);
         Nạp con trái của N vào danh sách               (nếu có);
         Nạp con phải của N vào danh sách               (nếu có);
      End;

   Tuy nhiên, tùy theo cách chọn nút N từ danh sách ra như thế nào, mà ta thành
lập được 2 giải thuật duyệt cây khác nhau:
   - Giải thuật S (dùng stack): Lấy nút mới nhất (được nạp muộn nhất) trong
      danh sách.
   - Giải thuật Q (dùng queue): Lấy nút cũ nhất (đươc nạp sớm nhất) trong danh
      sách.
   a. Hãy cho biết các giải thuật S, Q duyệt cây sau đây theo các thứ tự nào?
                                            1

                                    2               3

                            4               5           6

                                7       8       9

   b. Từ sự gợi ý của sơ đồ trên, hãy viết một thủ tục duyệt cây nhị phân theo thứ
      tự preorder (gốc-trái-phải). Chú ý không được phá hoại cây đã cho và cố
      gắng loại các động tác thừa. Thăm một nút được thể hiện bởi in giá trị của
      nút đó ra.




                                                                    Trình bày: Trần Hoài Nhân
                                                                                     1/2



            Đề thi tuyển NCS và Cao học 6/1994 (Đề số 1)
                    Môn thi: Phương pháp lập trình
                      Thời gian 180’ - Được sử dụng tài liệu


Bài 1. Người ta viết một chương trình trên Pascal chuẩn, để tính giai thừa của một
số nguyên không âm như sau:
    Program Giaithua(input,output)
    Label 99;
    Type tunhien = 0..maxint;
    Var x,y:tunhien;

    Procedure halt;
    Begin
       Goto 99;
    End;

    Procedure fact(var n,f:tunhien);
    Var k:so;
    Begin
       k:=0; f:=1;
       While k<>n do
       Begin
          K:=k+1;
          If (f > (maxint div k)) then halt
          Else f:=f*k;
       End;
    End;
    BEGIN
       X:=3;
       Fact(x,y);
       Writeln(y);
       Fact(y,y);
       Write(y);
       99;
    END.

   1. Hãy cho biết kết quả đưa ra từ các lệnh in và giải thích.
   2. Kết quả trên có điều không bình thường. Hãy giải thích lý do. Chữa lại
      chương trình để in ra đúng giá trị 3! Và (3!)! như mong muốn.

Bài 2. Hãy viết một chương trình cho phép đọc lần lượt các ký tự của một xâu từ
bàn phím, kết thúc bằng một dấu chấm, hãy hiển thị lại xâu đó theo thứ tự đảo
ngược (không có dấu chấm). Chương trình viết theo ba phương án sau:
   a. Dùng một mảng để ghi nhận xâu. Chương trình không đệ quy. Chú ý xử lý
      trường hợp trên mảng.
   b. Dùng một danh sách tuyến tính móc nối để ghi nhận ghi nhận xâu, chương
      trình không đệ quy.
   c. Dùng kỹ thuật đệ quy.


                                                                 Trình bày: Trần Hoài Nhân
                                                                                       2/2



Bài 3. Người ta diễn tả một biểu thức số học infix bằng một cây nhị phân như sau:
  - Các nút trong của cây chứa các toán tử (+,-,*,/,#,↑). Trong đó # là phép toán
       một ngôi và ↑ là phép lũy thừa.
  - Các lá chứa toán hạng (số thực).
  - Mỗi nút có các trường: Ctrai trỏ tới nút con trái, Cphai trỏ tới nút con phải,
       một trường LoaiNut cho biết nút này ứng với +,-,*,/,#,↑ hay toán hạng. Nếu
       loại nút là # thì chỉ có con phải, còn nếu loại nút là toán hạng thì không có
       các cây con trái, phải và nút có thêm một trường chứa trị (Thực) của toán
       hạng.
  a. Hãy viết các khai báo (trong Pascal) cho cây như trên.
  b. Giả sử đã có một cây (xây dựng đúng yêu cầu trên), trỏ bởi một con trỏ T.
       Hãy viết một hàm (Function) cho phép tính giá trị của biểu thức tương ứng
       với cây đó.




                                                                   Trình bày: Trần Hoài Nhân
                                                                                                   1/2



              Đề thi tuyển NCS và Cao học 6/1994 (đề số 2)
                       Môn: Phương pháp lập trình
                      Thời gian: 180 phút – Được sử dụng tài liệu.


Bài 1. Cho một thủ tục viết trên Pascal chuẩn như sau:
    Procedure R(x,y:integer);
    Begin
       if y>0 then
       begin
          x:=x+1;
          y:=y-1;
          writeln(x,y);
          R(x,y);
          writeln(x,y);
       end;
    End;
   a. Thực hiện thủ tục trên với x = 5 và y = 3. Viết rõ các kết quả in ra.
   b. Kết quả sẽ ra sao nếu x không phải là tham trị, mà là tham biến (thêm var
      trước x trong danh sách tham số).

Bài 2. Hãy viết một chương trinh đọc vào từ bàn phím một số nguyên không âm,
rồi hiển thị trở lại số đó theo cơ số 8. Chương trình viết theo 3 phương án khác
nhau như sau:
   a. Dùng một mảng để lưu các giá trị trung gian trước khi in.
   b. Dùng một danh sách tuyến tính móc nối để lưu các giá trị trung gian trước
       khi in.
   c. Dùng kỹ thuật đệ quy.

Bài 3. Xét một cây không rỗng, với hai loại nút: các nút min và các nút max. Mỗi
nút có chứa một giá trị nguyên. Ta định nghĩa giá trị của cây như sau:
   1. Nếu gốc cây là một nút min, thì giá trị của cây là số nhỏ nhất trong các số:
      - Số nguyên chứa tại gốc.
      - Giá trị của cây con trái (không xét đến khi cây con trái rỗng).
      - Giá trị của cây con phải (không xét đến khi cây con phải rỗng).
   2. Nếu gốc cây là một nút max, thì giá trị của cây là số lớn nhất trong các số
      trên.
   a. Hãy cho biết giá trị của cây sau đây.

                                          0
                                                                               Ghi chú:

                      100                                   100                      Nút max

             0                   0                 0                   0             Nút min


         1       23         17       99       98       53         21       0


                                                                               Trình bày: Trần Hoài Nhân
                                                                                   2/2



b. Hãy khai báo trong Pascal một cây như trên, và viết một hàm (Function) cho
   phép tính giá trị của cây trỏ bởi một con trỏ T cho trước (giả thiết T<>NIL).




                                                               Trình bày: Trần Hoài Nhân
                                                                                     1/2



                         Đề thi tuyển cao học 1995
                            Môn thi: Lập trình
                                   (180 phút)


Bài 1. Cho chương trình sau:
   Program Print(input,output);
   Var i:integer;
       T:array[1..2]of interger;
   Procedure p(var x,y:interger);
   Begin
   {3}X:=x+1;
   {4}Y:=y+1;
   {5}Write(x,y);
   {6}End;
   Begin
   {1}i:=1;T[1]:=2;T[2]:=0;
   {2}P(i,T[T[i]]);
   {7}witeln(i,T[1],T[2]);
   {8}End.

   Cho biết kết quả in ra từ chương trình trên. Chỉ rõ giá trị của các biến và các
tham số, qua mỗi bước theo vết thực hiện {1,2,3,4,5,6,7,8}

Bài 2. Cho hàm:
   Function M(n:integer):integer;
   Begin
      If n>100 then M:=n-100
      Else          M:=M(M(n+1));
   End.

   a. Cho biết các giá trị M(101), M(99), M(88).
   b. Một cách tổng quát, cho biết M(n) với các trường hợp khác nhau của n. Giải
      thích lời đáp đưa ra.

Bài 3. Trong một hệ soạn thảo, văn bản đang soạn được lưu ở bộ nhớ trong dưới
dạng một danh sách nối kép như sau:




                                                                 Trình bày: Trần Hoài Nhân
                                                                                   2/2



          Đầu

                        Dòng 1                 Đầu


                        Dòng 2                 Cuối

                                    …         Trường hợp văn bản rỗng
                 …
          Cuối          Dòng n

                   Trường hợp chung

Khai báo của danh sách này như sau:
   Type str80=String[80];
        Tro=^dongvb;
        Dongvb=record
                 Truoc:tro;
                 Dong:str80;
                 Sau:tro;
                End;
   Var dau,cuoi:tro; {đều bằng NIL khi văn bản là rỗng}

   a. Viết một thủ tục dưới dạng:
      Procedure XenTruoc(var d:tro;p:tro;s:str80);
      Cho phép xen một dòng mới với nội dung cho bởi s vào trước phần tử trỏ
      bởi p trong danh sách có đầu d.
   b. Gọi Bloc(db,cb) là một khối liền nhau các dòng kể từ dòng trỏ bới db đến
      dòng trỏ bởi cb. Hãy viết một thủ tục dưới dạng:
      Procedure chuyenBl(var d,c:tro; db,cb,noiden:tro);
      Cho phép chuyển dời Bloc(db,cb) tới trước dòng trỏ bởi noiden trong
      danhsach(d,c), giả sử noiden không ở trong Bloc.
   c. Viết một thủ tục:
      Procedure chepBl(var d:tro; db,cb,noiden:tro);
      Cho phép chép (mà không hủy) một Bloc(bd,cb) tới trước dòng trỏ bởi
      noiden trong danh sách có đầu d. Giải sử noiden không ở trong Bloc.




                                                               Trình bày: Trần Hoài Nhân
                                                                                     1/2



         Đề thì tuyển Nghiên cứu sinh và Cao học 1995 (Đề B)
                     Môn: Phương pháp lập trình
                   Thời gian: 180 phút – Được sử dụng tài liệu


Bài 1. Cho khai báo kiểu của một danh sách tuyến tính móc nối như sau:
   Type tro = ^kieupt;
        Kieupt=record
                  Giatri:integer;
                  Tieptheo:tro;
                End;

   a. Cho: Var ds,q:tro;
      Trong đó ds trỏ tới đầu của một danh sách tuyến tính. Hãy viết một thủ tục:
                     Procedure LayMax(var ds,q:tro);
      Cho phép lấy phần tử có giá trị lớn nhất ra khỏi danh sách tuyến tính ds,
      phần tử đó sẽ được trỏ bới q.
   b. Cho: Var ds1,ds2:tro;
      Trong đó ds1 trỏ đầu của một danh sách tuyến tính chưa được sắp xếp theo
      trường giá trị, còn ds2 thì đã được khởi gán ds2:=NIL. Hãy viết một thủ tục:
                  Procedure SapChon(var ds1,ds2:tro);
      Cho phép chọn dần các phần tử trong ds1 từ giá trị lớn đến bé, đưa vào ds2
      để rốt cục thì ds1=nil, còn ds2 trỏ tới một danh sách tuyến tính gồm mọi
      phần tử cũ của ds1, nhưng đã sắp theo thứ tự của trường giá trị.

Bài 2. Cho khai báo của một cây nhị phân như sau:
   Type trỏ=^nút;
        Nút = record
                Giátrị:interger;
                Ctrái, CPhải:trỏ;
               End;
   Var gốc:trỏ {trỏ tới nút gốc của cây}

   Hãy lập hàm: Function Copy(gốc: trỏ): trỏ; Cho phép trả lại địa chỉ của
gốc một cây mới, cây này được thành lập như là một bản sao cây đã cho (trỏ bới
gốc).

Bài 3. Cho một tệp (tập tin) văn bản, trong đó có chứa các từ. Các dấu phân cách
từ là: dấu trắng, dấu phẩy, dấu chấm phẩy, dấu hai chấm, dấu chấm than, dấu chấm
hỏi. Mọi từ đều bắt đầu bằng một ký tự trong tập [‘A’.. ‘Z’]
    a. Viết một thủ tục cho phép đọc các từ trong tệp văn bản đã cho và lưu các từ
       đó vào mảng các danh sách móc nối:
      Từđiển:array[‘A’..’Z’] of danhsách;
      Trong đó kiểu danhsách được cho như sau:
      Type danhsách = ^kiểupt;
           Kiểupt = record
                       Từ:strinh[10];


                                                                 Trình bày: Trần Hoài Nhân
                                                                                 2/2


                        Tiếptheo:danhsách;
                     end;
   Một danh sách móc nối trong từđiển đều phải sắp thứ tự (tăng dần) và tất cả
   các từ phải khác nhau.
b. Viết một thủ tục hiển thị tất cả các từ ra màn hình theo thứ tự tăng dần.
c. Viết một thủ tục bổ sung một từ mới, bằng cách đọc từ đó từ bàn phím, tìm
   nó trong Từđiển (dùng phép tìm kiếm tuần tự trong danh sách móc nối chứa
   dữ liệu tăng dần).
   - Nếu tìm thấy, hiểu thị thông báo “Đã có trong từ điển”
   - Nếu không tìm thấy, chèn nó vào trong Từđiển ở vị trí thích hợp.




                                                             Trình bày: Trần Hoài Nhân
                                                                                            1/2



                Đề thì tuyển Nghiên cứu sinh và Cao học 1996 (Đề 1)
                            Môn: Phương pháp lập trình
                          Thời gian: 120 phút – Được sử dụng tài liệu


    Bài 1. Dãy các phân số tối giản theo thứ tự tăng Tn = { m k | 0 ≤ m ≤ k ≤ n}, với n
    cho trước được xây dựng dần dần như sau:
          Với n = 1 T1 = {0/1 , 1/1}
          Với n = 2 T2 = {0/1 , 1/2 , 1/1}
          Với n = 3 T3 = {0/1 , 1/3 , 1/2 , 2/3 , 1/1}
          Với n = 4 T4 = {0/1 , 1/4 , 1/3 , 1/2 , 2/3 , 3/4 , 1/1}
       Ở mỗi bước n tiếp sau, ta chèn vào giữa 2 phân số kế tiếp trong dãy Tn-1 nhận
                         a   c           u
    được ở bước n-1:       và phân số mới với u=a+c, v=b+d với điều kiện b+d=n.
                         b   d           v
          1. Viết thủ tục đệ qui
             Procedure phanso(n:integer; var kqua:day; k:integer);
             Với Type day=array[1..100] of string[7];
             Nhằm xây dựng dãy kqua gồm các phân số tối giản theo thứ tự tăng Tn; quy
             ước: Các phần tử 0,1 được viết dưới dạng 0/1 và 1/1 tương ứng.
          2. Đưa ra một phương án không dùng đệ qui.

    Bài 2. Cho một danh sách móc nối lưu trữ các thông tin về sách, bao gồm: Thể
    loại, số hiệu, tên sách, tác giả, năm xuất bản trong một thư viện như hình vẽ:
Thuvien
            Toan                   Ly   × ×       Hoa   × ×        Tinhoc             ×


 01 Giait     A 90        03 Daiso B 81 ×         09 Pascal A            18      C        D 96 ×


    Các cấu trúc dữ liệu được khai báo như sau:
          Type str25=string[25];
               Troloai=^loai;
               Loai=record
                       Theloai:str25;
                       Dau,cuoi:^sach;
                       Tiep:troloai;
                    End;
               Trosach=^sach;
               Sach=record
                       Sohieu:integer;
                       Ten:str25;
                       Tacgia:str25;
                       Nam:integer;
                       Next:trosach;
                    End;
          Var thuvien:Troloai;


                                                                        Trình bày: Trần Hoài Nhân
                                                                                    2/2



Hãy viết các chương trình con:
  1. Procedure Them(var l:troloai; lvuc,tensach,nguoi:str25;
     so,nam:integer);
     Cho phép thực hiện thêm vào thư viện một cuốn sách mới thuộc thể loại
     lvuc có tên là tensach, được tác giả nguoi viết vào năm nam, cuốn sách có số
     hiệu so.
     - Nếu thể loại lvuc chưa có trong thư viện, thì tạo một bản ghi về thể loại,
        đặt nó ở vị trí phù hợp, với các con trỏ tương ứng chỉ một bản ghi khác
        về sách với các tham số so, tensach, nguoi, nam đã cho.
     - Nếu thể loại sách đã có, thì thêm vào danh sách móc nối tương ứng một
        bản ghi về sách mới vào cuối danh sách (chú ý kiểm tra so cuổn sách này
        đã có trong danh sách chưa).
  2. Function CuNhat(var l:troloai):integer;
     Cho kết quả là năm xuất bản của cuốn sách ra đời sớm nhất có trong thư
     viện.
  3. Procedure Trich(author:str25; l:troloai; var
     tuyen:trosach);
     Nhằm trích ra từ thư viện đã cho các tác phẩm về mọi thể loại của cùng một
     tác giả author nào đó (giả thiết là các tác giả có tên khác nhau). Các tác
     phẩm này tạo thành một danh sách móc nối về sách mới (không phân biệt
     thể loại), mà đầu của nó được cho bởi biến tuyen. Các phần tử của danh sách
     này được chép lại từ danh sách thư viện l và như vậy các thông tin về sách
     đã có trong thư viện (kể cả sách của tác giả author nói trên) vẫn như cũ.




                                                                Trình bày: Trần Hoài Nhân
                                                                                        1/2



          Đề thì tuyển Nghiên cứu sinh và Cao học 1996 (Đề 2)
                      Môn: Phương pháp lập trình
                      Thời gian: 120 phút – Được sử dụng tài liệu


Bài 1. Dãy Morse vô hạn m được xây dựng như sau m = x0, x1, x2, …
  - Ban đầu, viết phần tử x0 = 0.
  - Ở mỗi bước n tiếp theo, nếu đã có dãy con wn-1 ở bước n-1, thì ta ghép thêm
       vào cuối dãy wn-1 dãy wn−1 để nhận được dãy mới wn = wn-1, wn −1 ; ở đây dãy
       con wn −1 được xây dựng từ dãy con wn-1 bằng cách thay 0 thành 1, thay 1
       thành 0.
  Chẳng hạn, ban đầu có dãy w0 = 0
  Bước 1 có dãy                 w1 = 0,1
  Bước 2 có dãy                 w2 = 0,1,1,0
  Bước 3 có dãy                 w3 = 0,1,1,0,1,0,0,1
  1. Viết hàm đệ qui
       Function xacdinh(k:integer):integer;
       Xác định giá trị của phần tử thứ k trong dãy Morse.
       Chẳng hạn: k = 0 giá trị của phần tử thứ 0 là 0
                   k = 7 giá trị của phần tử thứ 7 là 1.
    2. Đưa ra một phương án không dùng đệ qui.

Bài 2. Người ta cần tạo lập một chỉ dẫn về các từ khóa xuất hiện trong các trang
của một tệp văn bản (cuốn sách, bài báo, tài liệu tham khảo,…) như sau:
       Tin học: 1, 4, 162
       Lập trình: 10, 16, 40, 58

   Trước khi in ra, chỉ dẫn này được xây dựng đề lưu trữ tạm thời trong bộ nhớ,
dưới dạng mảng con trỏ, chỉ tới các danh sách tuyến tính các từ có cùng chữ cái
đầu (không phân biệt chữ thường, chữ hoa):


a            ACM      10       Antivirus 30       Antivirus 13          AIDS       118 ×
b            Buffer    6        Buffer 101         Block 142 ×




    Các cấu trúc dữ liệu được khai báo như sau:
     Type Str25=string[25];
          Tro=^nut;
          Nut=record
                Ten:str25;
                Trang:integer;


                                                                    Trình bày: Trần Hoài Nhân
                                                                                     2/2


               Tiep:tro;
              end;
         index=array[‘a’..’z’]of tro;
    Var chidan:index;
        Keyword:array[1..50]of str25;

Hãy lập các thủ tục:
  1. Procedure them(n:str25; tr:integer);
      Thực hiện các công việc sau: Kiểm tra xem từ n có thuộc mảng từ khóa
      keyword đã cho trước hay không. Nếu n không thuộc thì không là giá cả, nếu
      n thuộc thì thêm từ n cùng với chỉ số trang tr vào cuối danh sách tương ứng,
      được xác định bởi chữ cái đầu tiên các từ n. Chú ý: không phân biệt chữ
      thường, chữ hoa.
  2. Procedure trichyeu;
      Nhằm tìm ra 10 từ khóa quan trọng nhất, nghĩa là 10 từ xuất hiện với tần
      xuất cao nhất. In các từ này với 5 từ trên một dòng theo thứ tự giảm dần của
      số lần xuất hiện cùng với tần xuất xuất hiện tương ứng.
  3. Procedure tach(tr:integer; var chidan1,chidan2:Index);
      Nhằm tách chỉ dẫn chidan đã cho thành 2 chỉ dẫn con:
      - chidan1 bao gồm các xuất hiện của các từ khóa tại các trang có chỉ số ≤tr
        đã cho.
      - chidan2 bao gồm các xuất hiện của các từ khóa tại các trang có chỉ số >tr
        đã cho.
  4. Procedure Inchidan;
      Cho phép in ra theo qui cách từ khóa cùng với các chỉ số trang tương ứng:
           ACM: 10
           AIDS: 118
           Antivirus: 13, 30
           Block: 142
           Buffer: 0, 101




                                                                 Trình bày: Trần Hoài Nhân
                                                                                    1/2



         Đề thì tuyển Nghiên cứu sinh và Cao học 1996 (Đề 3)
                     Môn: Phương pháp lập trình
                  Thời gian: 120 phút – Được sử dụng tài liệu


Câu 1. Người ta thực hiện thuật toán tìm kiếm nhị phân trên một bảng được sắp
xếp theo thứ tự tăng như sau:
    Type ptu=record
                Khoa:integer;
                Info:string[20];
              end;
         Mang=array[1..100]of ptu;
    Function tim(c:integer;var a:mang):integer;
    Var trai, phai, giua:integer;
      Begin
        trai:=1;phai:=100;
        Repeat
          Giua:=(trai+phai)div 2;
           if a[giua].khoa<c then trai:=giua;
           Else                   phai:=giua;
        Until (a[giua].khoa=c)or(trai>=phai);
        if a[giua].khoa=c then tim:=giua
        else                    tim:=0;
      end;

   1. Chương trình là đúng đắn nếu trong mọi trường hợp nó sẽ dừng và gán một
      giá trị cho hàm tim như sau:
   - 1≤tim≤100 nếu mảng a có phần tử a[tim].khoa=c.
   - tim = 0        nếu trong mảng a không chứa phần tử có giá trị khóa bằng c.
      Hãy tìm ví dụ cụ thể chứng tỏ hàm tim không đúng đắn.
   2. Hãy chữa lại chương trình sao cho đúng đắn. Sau đó viết thành thủ tục
      đệ qui.

Câu 2. Người ta tạo lập một chỉ dẫn về các từ khóa trong một tệp văn bản (một
cuốn sách, tài liệu tham khảo, bài báo) như sau:
      Computer: 9
      Zemple: 9
   Trước khi in ra, chỉ dẫn này cần được xây dựng và lưu trữ tạm thời trong bộ
nhớ trong, dưới dạng mảng các con trỏ, chỉ tới các danh sách tuyến tính bao gồm
các từ có cùng chữ cái đầu tiên (không phân biệt chữ thường, chữ hoa).
   Các cấu trúc dữ liệu được khai báo như sau:
    Type index=array[‘a’..‘z’]of tro;
         Tro=^nut;
         Str25=string[25];
         Nut=record
               Ten:str25;
               Trang:integer;
               Tiep:tro;
             end;


                                                                Trình bày: Trần Hoài Nhân
                                                                                    2/2


     Var chidan:index;
         Keyword:array[1..50]of str25;
Hãy lập các thủ tục thao tác trên danh sách như trong hình:
a         Anglais 10        Anglais 5            AIDS   30      Antivirus 100 ×
b          Brain   3         Block 10 ×
c        Computer 9         Connect 109          AIDS   30 ×
…

z         Zemple   9 ×

    1. Procedure Them(n:str25;tr:integer);
       Thực hiện các công việc kiểm tra xem từ n có thuộc mảng từ khóa keyword
       đã cho trước hay không. Nếu n không thuộc, không làm gì cả. Nếu n thuộc,
       thì thêm từ n cùng với chỉ số trang tr vào cuối dánh sách tương ứng, được
       xác định bởi chữ cái đầu tiên của n. Chú ý: không phần biệt chữ thường,
       chữ hoa.
    2. Procedure Sapxep;
       Nhằm sắp xếp lại các từ khóa trong từng danh sách của chỉ dẫn theo thứ tự
       từ vựng của cặp (tên, trang):
       - Đầu tiên sắp xếp theo thứ tự alphabet của tên.
       - Sau đó, trong nhóm các từ khóa cùng tên (không phân biệt chữ hoa, chữ
         thường), sắp xếp theo thứ tự tăng của chỉ số trang.
    3. Procedure Thaythe(u,v:str25);
       Nếu từ u xuất hiện trong danh sách từ khóa keyword thì thay mọi xuất hiện
       của u bởi v trong chỉ dẫn.
    4. Procedure Inchidan;
       Nhằm in các từ khóa cùng chỉ số trong tương ứng theo qui cách:
           AIDS: 30
           Anglais: 5,10
           Antivirus: 100
           Block: 10
           Brian: 3
           CAD: 10
           Connect: 109
           Computer: 5
           Zemple: 9




                                                                Trình bày: Trần Hoài Nhân
                                                                                     1/2



                      Đề thi tuyển sinh Cao học 1997
                               Môn: Tin học
               Thời gian: 120 phút – Không được sử dụng tài liệu.


Bài 1. Xét dãy số a1, a2,…, an với 0 < n ≤ 100.
  Hãy viết các chương trình con thực hiện các công việc sau:
  1. Đọc các giá trị a1, a2,…, an từ bàn phím và kiểm tra dãy nhận được có phải là
       một hoán vị của {1,2,…,n} hay không?
  2. Phân chia dãy a1, a2,…, an thành các dãy con tăng dần có độ dài cực đại. Hãy
       viết theo 2 phương án đệ qui và không đệ qui. Chẳng hạn, với n = 6 và dãy
       3, 2, 4, 1, 6, 5 ta chia thành các dãy con {3} {2,4} {1,6} {5}.

Bài 2. Cho chương trình
   Program Thumotty;
   Var y,a,b:integer;
   Function H1(y:integer):integer;
   Begin
      Y:=y+3;
      H1:=y-1;
   End;

   Function H2(var y:integer):integer;
   Begin
      Y:=y-3;
      H2:=y+1;
   End;

   BEGIN
      y:=6;
      a:=y*H1(y)+H2(y);
      writeln(y);
      writeln(a);
      b:=y*(H2(y)+H1(y));
      writeln(y);
      writeln(b);
   END.

   Các kết quả được in ra trong chương trinh là bao nhiêu? Giải thích?

Bài 3. Kết quả thi đại học của một lớp được lưu lại trong một danh sách tuyến tính
móc nối với các nút được khai báo như sau:
   Type tro=^nut
        Nut=record
               Sohieu:integer;
               Ten:alpha;
               Toan,ly,hoa:real;
               Tiep:tro;
            End;


                                                                 Trình bày: Trần Hoài Nhân
                                                                                2/2



Đầu của danh sách được trỏ bởi biến dau
Var dau:tro;

Hãy viết các chường trình con:
1. Procedure Nhap(var dau:tro; sh:integer; name:alpha;
   t,l,h:real);
   Cho phép nhập số hiệu sh, tên của học sinh name, và các điểm toán, lý, hóa
   được cho bởi t, l, h tương ứng với một nút mới sẽ đặt ở cuối danh sách của
   lớp được nhớ bởi con trỏ Dau.
2. Procedure Ketqua(dchuan:real; dau:tro; var do, truot:tro);
   Cho phép thông báo dánh sách học sinh đỗ (có tổng các điểm toán, lý, hóa
   lớn hơn hoặc bằng điểm chuẩn dchuan), danh sách này được trỏ bới con trỏ
   do và danh sách các học sinh bị trượt, được trỏ bởi truot.

   Yếu cầu: Không chép lại các phần tử của danh sánh lớp học sinh sang một
   vùng nhớ ngoài danh sách đã cho.




                                                            Trình bày: Trần Hoài Nhân
                                                                                       1/2



         Đề thi tuyển sinh cao học ngành công nghệ thông tin
                       Môn: Ngôn ngữ lập trình
                Thời gian 180 phút - Không được sử dụng tài liệu


Bài 1. Cho dãy số nguyên dương khác nhau từng đôi một A=a1,a2,…,an, n<=100
và hoán vị P = [p1,p2,…,pn] của các số [1,2,…,n]
   Hãy viết các chương trình con thực hiện các công việc sau đây:
   1. Đọc các dãy số A, P từ bàn phím và kiểm tra tính đúng đắn của dữ liệu nhập
      vào.
   2. Tạo ra một nội dung mới của dãy A=a[p1],…,a[pn] mà không dùng mảng
      phụ nào khác ngoài A và P đã cho.
      Ví dụ, với dãy A=8,6,2,1,3,4 và hoán vị P=5,4,6,2,1,3 ta có nội dung mới
      của dãy A=3,1,4,6,8,2. Viết hai phương án lặp và đệ quy.
   3. Với dãy A đã cho, hãy xác định một hoán vị nào đó P sao cho
      a[p1]<=…<=a[pn].
      Ví dụ, với dãy A như trên, ta có P=4,3,5,6,2,1 thỏa mãn tính chất trên. Viết
      hai phương án đệ quy và lặp.

Bài 2. Khai báo kiểu của một danh sách tuyến tính móc nối và một cây nhị phân
như sau:
   Type tro=^ptu;
        Ptu=record
               Gtri:integer;
               Tiep:tro;
            End;
        Pointer=^nut;
        Nut=record
               Value:integer;
               Trai,phai:pointer;
            End;
   Var ds:tro;
       Goc:point;

   Viết các chương trinh con thực hiện các công việc sau đây:
   1. Procedure Dungcay(ds:tro; var goc:pointer);
      Nhằm xây dựng cây nhị phân tìm kiếm có gốc được trỏ bởi goc trên cơ sở
      các phần tử của danh sách ds đã cho. Giả thiết rằng các phần tử của
      danh sách có giá trị khác nhau từng đôi một.
      Ví dụ, với danh sách các phần tử:
                        8      3     9     4     1     10
      Ta xây dựng được cây nhị phân tìm kiếm như sau:




                                                                   Trình bày: Trần Hoài Nhân
                                                                                   2/2




                                          8

                                  3           9


                             1        4           10


   2. Procedure Cay_NP_min(ds:tro;var goc:pointer);
      Nhằm xây dựng cây nghị phân tìm kiếm có gốc được trỏ bởi goc, tưng ứng
      với một cây hoán vị nào đó của các phần tử trong danh sách ds sao cho độ
      cao của cây nhận được là nhỏ nhất.

Bài 3. Trên đĩa có một tệp văn bản (TEXT) có tên là ‘VB.TXT’. Mỗi dòng có độ
dài không quá 80, gồm nhiều từ. Mỗi từ là một dãy liên tiếp các ký tự được phân
cách bằng dấu trắng, dấu phẩy, dấu chấm, dấu chấm phẩy, dấu hai chấm, dấu chấm
than, dấu hỏi, dấu ngoặc đơn đóng và dấu ngoặc đơn mở.
   Lập chương trình con thực hiện các công việc sau đây:
   1. Đọc các dòng của tệp văn bản.
   2. Với mỗi dòng, đếm số từ xuất hiện trong đó và đưa ra màn hình kết quả tính
       được.
   3. Đưa ra màn hình từ dài nhất trong văn bản.




                                                               Trình bày: Trần Hoài Nhân
                                                                                      1/2



        Đề thi tuyển sinh Cao học nghành Công nghệ thông tin
                          Năm học 1998-1999
                     Môn thi: Ngôn ngữ lập trình
                  Thời gian 180’ - Không được sử dụng tài liệu


Bài 1. Cho một tệp văn bản ở trên đĩa với tên là “BK.TXT”, trong đó có chứa các
từ. Các dấu phân cách từ là dấu trắng, dấu phẩy, dấu chấm phẩy, dấu hai chấm, dấu
chấm than, dấu chấm hỏi.
    Một từ là dãy liên tiếp các chữ cái viết thường, viết hoa. Lập chương trình con
thực hiện các công việc sau:
    1. Đọc các từ trong tệp văn bản đã cho.
    2. Giả thiết rằng có một danh sách các từ khoá được cho trong mảng có khai
       báo như sau: Var tukhoa:array[1..50]of string[5]; Xác định tần
       xuất xuất hiện của các từ khoá trong tệp văn bản và in ra màn hình theo quy
       tắc: 5 từ trên một dòng, mỗi từ kèm theo số lần xuất hiện của nó theo thứ tự
       giảm dần.

Bài 2. Khai báo kiểu của một danh sách tuyến tính móc nối như sau:
    Type Tro=^nut;
         Nut= record
                Gtri:integer;
                Tiep:tro;
              end;
    Var ds:tro;

   Viết chương trình con thực hiện các công việc sau:
   1. Function dxung(ds:tro):boolean;
      Nhằm kiểm tra danh sách ds có phải là đối xứng hay không? Viết hai
      phương án: Lặp và đệ qui.
      Ví dụ:
      - Các danh sách sau là đối xứng:
          Ds1:      14     -808 7       -808 14
          Ds2:      -104 7       7      -104
      - Các danh sách sau là không đối xứng:
          Ds3:      14     8     …       9   14
   2. Function Kha_dx(ds:tro):boolean;
      Nhằm kiểm tra xem đối với danh sách ds đã cho, có tồn tại một cách sắp xếp
      lại các phần tử để cuối cùng nhận được một danh sách đối xứng hay không?
   3. Procedure Saplai(ds:tro);
      Nhằm đưa ra một cách sắp xếp lại các phần tử để có một danh sách đối xứng
      (giả thiết rằng điều này có thể làm được nhờ hàm kha_dx(…)).

Bài 3. Người ta xây dựng dần dãy Kanto vô hạn K = k0, k1, k2, k3, … như sau:
  - Ban đầu ta viết dãy con chỉ gồm một ký tự a, Wo = a.


                                                                  Trình bày: Trần Hoài Nhân
                                                                                      2/2



   - Ở mỗi bước i tiếp theo, dãy con Wi được tạo lập bằng cách thay đồng thời
trong dãy Wi-1 mọi xuất hiện của a bởi dãy kí hiệu a,b,a và mọi xuất hiện của b bởi
dãy kí hiệu b,b,b.
   Ví dụ:
      W0 = a
      W1 = a,b,a
      W2 = a,b,a,b,b,b,a,b,a

   Viết chương trình con thực hiện công việc sau đây:
   Function xdinh(n:interger):char; Nhằm xác định giá trị của phần tử kn
trong dãy Kanto K.
   Ví dụ:
      với: n=0 k=a
             n=4 k=b
             n=9 k=b
             n=18 k=a
   Viết hai phương án: Đệ quy và lặp.




                                                                  Trình bày: Trần Hoài Nhân
                                                                                      1/2



        Đề thi tuyển sinh Cao học nghành Công nghệ thông tin
                          Năm học 1999-2000
                     Môn thi: Ngôn ngữ lập trình
                  Thời gian 180’ - Không được sử dụng tài liệu


Bài 1. Người ta viết một chương trình để tính giai thừa của một số nguyên không
âm như sau:
    Program giaithua(input,output)
    Label 1999;
    Type so = 0..maxint;
    Var x,y:so;

    Procedure factorial(var n,f:interger);
    Var k:so;
    begin
       K:=0; f:=1;
       While k<>n do
       begin
          K:=k+1;
          if (f > (maxint div k)) then goto 1999
          else                         f:=f*k;
       end;
    end;
    BEGIN
       X:=4;
       Factorial(x,y);
       writeln(y);
       Factorial(y,y);
       writeln(y);
       1999; writeln(‘ket thuc’);
    END.

   a. Hãy cho biết kết quả đưa ra từ các lệnh in và giải thích.
   b. Kết quả trên có điều không bình thường. Hãy giải thích lý do. Chữa lại
      chương trình để in ra đúng giá trị 4! Và (4!)! như mong muốn.

Bài 2. Cho một tập các cặp số nguyên S ={(a1,b1),(a2,b2),…,(an,bn)}. Ta nói dãy
D bào gồm các cặp giá trị của S là dãy Domino nếu:
   • Trong D không có cặp nào xuất hiện 2 lần.
   • Đối với mọi cặp giá trị liên tiếp nhau trong dãy D, giá trị thứ 2 của cặp đứng
      trước luôn bằng giá trị thứ nhất của cặp đứng sau.
   • Không có dãy D nào thoả mãn hai tính chất trên chứa D như một phần con.
   Chẳng hạn, trong tập {(3,1),(6,1),(4,3),(2,6),(9,4),(4,0),(6,2),(8,7)} có dãy
   Domino {(2,6),(6,1)} và {(9,4),(4,3),(3,1)}
   Hãy lập các chương trình con thực hiện các công việc sau:
   1. Đọc tập n cặp số nguyên từ tệp văn bản có tên DL.TXT được tổ chức theo
      quy cách:


                                                                  Trình bày: Trần Hoài Nhân
                                                                                      2/2



      • Dòng đầu tiên chứa số n.
      • N dòng tiếp theo, mỗi dòng chứa một cặp số ai, bi.
      Và lưu vào một cấu trúc A nào đó.
   2. Xác định một dãy Domino nào đó từ tập A đã cho.
   3. Xác định dãy Domino có số cặp giá trị lớn nhất có thể được.

Bài 3. Cho khai báo của một cây nhị phân như sau:
    Type tro=^nut;
         Nut = record
                  Gtri:integer;
                  Trai,phai:tro;
               end;
    Var goc:tro;

   Hãy lập các chương trình con thực hiện các công việc sau:
   1. Hàm Function CayTK(Goc:tro):boolean; cho phép kiểm tra xem cây
      có gốc được trỏ bởi goc có phải là cây nhị phân tìm kiếm hay không.
      Chú ý: Cây rỗng cũng được coi là cây tìm kiếm. Viết theo hai phương pháp
      đệ quy và không đệ quy.
   2. Trường hợp cây ban đầu không phải là cây tìm kiếm, hãy viết thủ tục
                         Procedure Saplai(goc:tro);
      Cho phép tráo đổi nội dung của các nút trong cây, nhưng không thay đổi cấu
      trúc cây, để nhận được cây nhị phân tìm kiếm.
      Chẳng hạn, với cây ở trên hình 1, sau khi tráo đổi ta nhận được cây tìm kiếm
      như ở hình 2.
                       8                                     4

               6            7                        3            8


           3           4        1                1           6          9

                            9                                     7

                   Hình 1                                Hình 2




                                                                  Trình bày: Trần Hoài Nhân
                                                                                                        1/2


BỘ GIÁO DỤC & ĐÀO TẠO                   Họ và tên thí sinh:..................................................
     ĐẠI HỌC HUẾ                            Số báo danh:..................................................


          KỲ THI TUYỂN SINH SAU ĐẠI HỌC NĂM 2001
                  Môn thi: Ngôn ngữ lập trình
                               (Dành cho cao học)
                             Thời gian làm: 180 phút


Câu 1. Chương trình sau cho kết quả như thế nào trên màn hình? Hãy giải thích?

   var a:integer;
   procedure Change(x:integer;var y:integer);
   begin
      writeln(x:2,y:2); x:=x+1; y:=y-1;
      if x<5 then Change(x,y);
      write(x:2,y:2);
   end;
   BEGIN
      a:=2;
      Change(a,a);
   END.

Câu 2. Viết chương trình đọc vào một số nguyên thập phân, đổi số này ra hệ bát
phân lưu trữ dưới dạng chuỗi và đưa kết quả ra màn hình.

Câu 3. Cho dãy số: 18, 8, 25, 42, 53, 10, 4, 34. Hãy trình bày quá trình đổi chỗ các
phần tử trong dãy để thu được một dãy sắp theo thứ tự tăng dần bằng phương pháp
HeapSort.

Câu 4. Tại một công ty, người ta quản lý các thành phố có mở đại lý bằng một
danh sách liên kết (mà ta gọi là danh sách thành phố). Mỗi nút của danh sách thành
phố là một bản ghi gồm 3 trường: TenThanhPho (tên thành phố), con trỏ Next trỏ
đến nút tiếp theo và con trỏ Down trỏ đến phần tử đầu của một danh sách khác
chứa thông tin của các đại lý trong thành phố (mà ta gọi là danh sách đại lý). Mỗi
nút của danh sách đại lý là một bản ghi gồm 4 trường: TenDaily (tên đại lý), SDT
(số điện thoại), DoanhThu (doanh thu) và con trỏ Tiep trỏ đến đại lý tiếp theo.
   • Hai thành phố khác nhau trỏ đến hai danh sách đại lý khác nhau.
   • Danh sách thành phố được sắp xếp theo thứ tự tăng dần của TenThanhPho.
   • Danh sách đại lý được sắp theo thứ tự tăng dần của SDT.
   Người ta cho khai báo cấu trúc dữ liệu nói trên như sau:
      type St25=String[25];
           st8=string[8];
           TroDL=^DaiLy;
           DaiLy = record
                     TenDaiLy:st25;
                     SDT:st8;


                                                                                  Trình bày: Trần Hoài Nhân
                                                                                    2/2


                      DoanhThu:longint;
                      Tiep:TroDL;
                   end;
      TroTP=^ThanhPho;
      ThanhPho = record
                      TenThanhPho:st25;
                      down: TroDL;
                      Next: TroTP;
                 end;
      var First:TroTP; {First trỏ đến đầu danh sách thành phố}

   1. Viết thủ tục:
      Procedure Xoa(Var First:TroTP; Thpho:St25; DT:St8);
      Cho phép xóa đại lý có số điện thoại DT thuộc thành phố có tên Thpho ra
      khỏi danh sách các đại lý. Nếu thành phố này chỉ có một đại lý duy nhất thì
      khi thực hiện xóa đại lý đó, thành phố Thpho cũng đồng thời bị loại khỏi
      danh sách thành phố.
   2. Viết hàm:
      Function DemDaiLy(First:TroTp):word;
      Trả về số lượng các đại lý trên toàn quốc.



Ghi chú: Cán bộ coi thi không được giải thích gì thêm.




                                                                Trình bày: Trần Hoài Nhân
                                                                                                          1/2


BỘ GIÁO DỤC & ĐÀO TẠO                     Họ và tên thí sinh:..................................................
     ĐẠI HỌC HUẾ                              Số báo danh:..................................................


          KỲ THI TUYỂN SINH SAU ĐẠI HỌC NĂM 2002
                  Môn thi: Ngôn ngữ lập trình
                                (Dành cho cao học)
                              Thời gian làm: 180 phút


Câu 1. Cho khai báo một danh dách liên kết đơn như sau:
   type TroNut=^Nut;
        Nut=record
               giatri:integer;
               tiep:TroNut;
            end;
   var First:TroNut;

   Viết thủ tục đệ quy:
                     procedure InNguoc(First:TroNut);
   thực hiện việc in giá trị (trường giatri) các nút theo thứ tự ngược lại.

Câu 2. Người ta biển diễn thông tin về các nhạc sĩ dưới dạng một cây nhị phân tìm
kiếm có khoá TenNS (tên nhạc sĩ). Mỗi nút của cây là một bản ghi gồm trường
TenNS và 3 trường con trỏ: Left, Right, First. Hai con trỏ Left và Right lần lượt trỏ
tới hai nút con trái và con phải của nút đó, con trỏ First trỏ tới phần tử đầu của một
danh sách liên kết đơn chứa thông tin các bản nhạc của nhạc sĩ. Mỗi phần tử của
danh sách này là một bản ghi gồm 3 trường: TenBH (tên bài hát), Nam (năm ra đời
bài hát) và Next (lưu địa chỉ của phần tử tiếp theo trong danh sách). Danh sách này
được sắp theo thứ tự tăng dần của Nam.
    Người ta cho khai báo của cấu trúc dữ liệu nói trên như sau:
   type St25=String[25];
        TroNP=^Nhacpham;
        NhacPham=record
                     TenBH:String;
                     Nam:word;
                     Next:TroNP;
                  end;
        TroNS=^nut;
        Nut=record
               TenNS:st25;
               First:TroNP;
               Left,Right:TroNS;
            end;
   var Top:TroNS;

   1. Viết hàm
                     Function NumSong(Name:st25):byte;
      trả về các nhạc phẩm của nhạc sĩ có tên Name.
   2. Viết thủ tục


                                                                                    Trình bày: Trần Hoài Nhân
                                                                                     2/2


                      Procedure LastSong(Name:St25);
       in lên các bài hát ra đời trong năm cuối cùng (trong danh sách) của nhạc sĩ
có tên Name.

Câu 3. Cho một chương trình viết theo Pascal như sau:
var x:integer;
Procedure Them2Bot1(var x:integer; y:integer);
   begin
      writeln(x,y:4); inc(x,2);
      if y>0 then
         begin
           dec(y); Them2Bot1(x,y);
         end;
      writeln(x,y:4);
   end;
BEGIN
  x:=5;Them2Bot1(x,x);
END.

   Hãy viết các kết quả in ra khi thực hiện chương trình trên.

Câu 4. Viết chương trình đọc vào một số tự nhiên n, sau đó cho in ra tất cả các số
nguyên tố không nhỏ hơn 2 và không lớn hớn n.


Ghi chú: Cán bộ coi thi không được giải thích gì thêm.




                                                                 Trình bày: Trần Hoài Nhân
                                                                                                         1/2


BỘ GIÁO DỤC & ĐÀO TẠO                    Họ và tên thí sinh:..................................................
    ĐẠI HỌC HUẾ                              Số báo danh:..................................................


          KỲ THI TUYỂN SINH SAU ĐẠI HỌC NĂM 2003
                  Môn thi: Ngôn ngữ lập trình
                                (Dành cho cao học)
                              Thời gian làm: 180 phút


Câu 1. Cho chương trình:
   type link=^node;
         node = record key:integer;next:link; end;
   var i,N,M:integer; t,x:link;
   BEGIN
      read(N,M);
      new(t);t^.key:=1;x:=t;
     for i:=2 to N do
         begin
            new(t^.next);t:=t^.next; t^.key:=i;
         end;
      t^.next:=x;
      while t<>t^.next do
         begin
            for i:=1 to M-1 do t:=t^.next;
            write(t^.next^.key);
            x:=t^.next; t^.next:=t^.next^.next;
            dispose(x);
         end;
      writeln(t^.key);
   END.
    a. Cho biết kết quả sẽ được in ra màn hình khi thực hiện chương trình, nếu dữ
liệu đưa vào N=5,M=3.
    b. Chương trình trên thực hiện công việc gì?

Câu 2. Người ta biểu diễn thông tin các câu lạc bộ bóng đá chuyên nghiệp của một
quốc gia dưới dạng một cây nhị phân tìm kiếm có khoá là TenCLB (tên câu lạc bộ).
Mỗi nút của cây là một bản ghi gồm 4 trường: TenCLB và 3 trường con trỏ: Left,
Right, First. Hai con trỏ Left và Right lần lượt trỏ tới hai nút con trái và con phải
của nút đó, con trỏ First trỏ tới phần tử đầu của một danh sách liên kết đơn chứa
thông tin các cầu thủ thuộc câu lạc bộ (danh sách này có ít nhất là 11 phần tử). Mỗi
phần tử của danh sách này là một bản ghi gồm 4 trường: TenCT (tên cầu thủ),
SoAo (số áo), Tuoi (tuổi) và Next (lưu địa chỉ của phần tử tiếp theo trong danh
sách). Danh sách này được sắp theo thứ tự tăng dần của SoAo. Người ta cho khai
báo của cấu trúc dữ liệu nói trên như sau:
   type St25=String[25];
        TroCT=^Cauthu;
        Cauthu=record
                 TenCT:St25;


                                                                                   Trình bày: Trần Hoài Nhân
                                                                                        2/2


                 SoAo, Tuoi:byte;
                 Next: TroCT;
               end;
        TroCLB=^nut;
        Nut = record
                 TenCLB:st25;
                 First:TroCT;
                 Left, Right:TroCLB;
              end;
   var top:TroCLB;

   a. Viết thủ tục:
      Procedure List(Club:st25):byte;
      để in danh sách các cầu thủ trong câu lạc bộ có tên Club.
   b. Viết thủ tục:
      Procedure Bosung(ten:TroCLB; Club, Name:str25; t,m:byte);
      để bổ sung cầu thủ có tên Name, t tuổi và mang số áo m vào câu lạc bộ có
      tên là Club. Việc bổ sung này chỉ được thực hiện trong trường hợp
      câu lạc bộ Club đã có trong cây và chưa có cầu thủ nào của câu lạc bộ mang
      số áo m.
   c. Viết thủ tục:
      Procedure Xoa(Club:st25; m:byte);
      để xoá cầu thủ mang số áo m ra khỏi câu lạc bộ Club.
   d. Viết hàm:
      Function TuoiMin(Club:st25):byte;
      cho biết tuổi của cầu thủ trẻ nhất trong câu lạc bộ có tên Club.

Câu 3. Cho một chuỗi các chữ số nhị phân Tn được xác lập theo quy tắc sau:
      - T0 = 0
      - Với i = 1,2,3,… Ti nhận được từ Ti-1 bằng cách thay đổi 0 bởi 01 và thay 1
bởi 10.
      Ví dụ:       T0 = 0
                   T1 = 01
                   T2 = 0110
                   T3 = 01101001
      Lập chương trình đọc vào một số tự nhiên n và hiễn thị chuỗi Tn.

Câu 4. Viết chương trình đọc vào một số tự nhiên cơ số 10, cho in ra số đó dưới
dạng cơ số 2.


Ghi chú: Cán bộ coi thi không được giải thích gì thêm.




                                                                    Trình bày: Trần Hoài Nhân
                                                                                                        1/2


BỘ GIÁO DỤC & ĐÀO TẠO                   Họ và tên thí sinh:..................................................
    ĐẠI HỌC HUẾ                             Số báo danh:..................................................


          KỲ THI TUYỂN SINH SAU ĐẠI HỌC NĂM 2004
                  Môn thi: Ngôn ngữ lập trình
                               (Dành cho cao học)
                             Thời gian làm: 180 phút


Câu 1. Cho một chương trình viết trên Pascal như sau:
    var x:integer;
    procedure tanggiam(var x:integer; y:integer);
    begin
       writeln(x,y);x:=x+1;
       if y>0 then
       begin
         y:=y-1;
         tanggiam(x,y);
         writeln(x,y);
       end;
    end;
    BEGIN
       x:=3;
       tanggiam(x,x);
    END.
    Hãy viết các kết quả in ra khi thực hiện chương trình trên.

Câu 2. Một người có thể biết nhiều ngoại ngữ khác nhau, vì vậy việc lưu trữ
thông tin về trình độ ngoại ngữ của một số các bộ có thể tổ chức như sau:
   • Sử dụng một cây nhị phân tìm kiếm để lưu tên cán bộ theo khóa Ten,
      nút gốc của cây có địa chỉ là T.
   • Mỗi nút trên cây T, ngoài trường Ten, còn có trướng DSNN dùng để lưu địa
      chỉ nút đầu của một danh sách nối đơn. Trình độ ngoại ngữ của mỗi cán bộ
      được thể hiện trên mỗi danh sách nối đơn này với trường khóa là NgoaiNgu.
   Cấu trúc này được khai báo như sau:
      Type str20=Sring[20];
           troNN=^NN;
           NN=record
                Ngoaingu:Str20; {ngoại ngữ: Anh, Phap, Nga,…}
                Capdo:Char {cấp độ: A, B, C}
                Next:TroNN;
              end;
           TroCB=^CB;
           CB=record
                Ten:Str20; {Tên cán bộ}
                DSNN:TroNN;
                Left, Right:TroCB;
             end;
      Var T:TroCB;


                                                                                  Trình bày: Trần Hoài Nhân
                                                                                       2/2



   a. Viết hàm:
       Function DinhViCB(T:TroCB; Name:Str20):TroCB;
      Cho kết quả là địa chỉ của một nút trên cây T mà trường Ten có giá trị là
      Name. Nếu không tìm thấy nút này thì hàm trả về giá trị NIL.
   b. Viết thủ tục:
       Procedure BoSungCB(var T:TroCB; Name:Str20);
      Để bổ sung một cán bộ mới vào cây T có trường Ten=Name và DSNN=NIL.
   c. Viết thủ tục:
       Procedure CapNhat(T:TroCB; Name, FL:Str20; Level:Char);
      Để cập nhật thông tin “cán bộ có tên Name biết ngoại ngữ FL với cấp độ
      Level”. Lưu ý rằng:
      • Việc cập nhật này chỉ được thực hiện trong trường hợp có cán bộ có tên
         Name. Nếu không tìm được cán bộ có tên Name thì thông báo “Khong co
         can bo nay!”.
      • Nếu cán bộ tìm ra chưa biết ngoài ngữ FL, thì cần bổ sung thông tin này
         vào đầu danh sách móc nối đơn.
      • Nếu cán bộ tìm ra đã biết ngoại ngữ FL, thì chỉ thay đổi cấp độ cũ bởi
         cấp độ mới Level trong trường hợp cấp độ mới Level là lớn hơn cấp
         độ cũ.
   d. Viết thủ tục:
       Procedure InDS(T:TroCB);
       Để in ra danh sách tất cả cán bộ (theo thứ tự tăng dần của tên cán bộ) kèm
       khả năng ngoại ngữ, theo ví dụ mẫu như sau:
   TRÌNH ĐỘ NGOẠI NGỮ CỦA CÁC CÁN BỘ
   1. AN: ANH-B
   2. BINH: ANH-C, NGA-B, PHAP-A
   3. CHI: Khong biet thu tieng nào
   …

Câu 3. Cho cây nhị phân có khai báo như sau:
   Type TroNut=^Nut;
        Nut=record
              Info:integer;
              Left,right:TroNut;
            End;
   Var T:TroNut;

   Cây T (nút gốc trỏ bởi T) được gọi là một “đống” nếu cây T là rỗng, hoặc cây T
chỉ có một nút, hoặc cây T có tính chất sau: giá trị trường Info của bất kỳ nút N nào
thuộc cây T đều lớn hơn giá trị trường Info của mọi nút thuộc cây con trái và
cây con phải của nút N đó.
   Viết hàm Function LaDong(T:TroNut):boolean; cho kết quả là True nếu
cây T là một đống, ngược lại trả về giá trị False.


Ghi chú: Cán bộ coi thi không được giải thích gì thêm.




                                                                   Trình bày: Trần Hoài Nhân
                                                                                                         1/3


BỘ GIÁO DỤC & ĐÀO TẠO                    Họ và tên thí sinh:..................................................
    ĐẠI HỌC HUẾ                              Số báo danh:..................................................


           KỲ THI TUYỂN SINH SAU ĐẠI HỌC NĂM 2005
                   Môn thi: Ngôn ngữ lập trình
                                (Dành cho cao học)
                              Thời gian làm: 180 phút


Câu 1. Cho danh sách liên kết đơn mà nút đầu trỏ bởi biến con trỏ First (gọi tắt là
danh sách First) có khai báo như trong chương trình chính:
   TYPE TroNut=^Nut;
        Nut=Record
              Info:Integer;
              Next:TroNut;
            End;
   Var First:TroNut;

   Giả sử, giá trị trường Info của các nút thuộc danh sách First lần lượt là: 8, 4, 10,
9, 5. Hãy cho biết kết quả in ra màn hình khi máy thực hiện lời gọi chương trình
con: Sort(First) biết rằng thủ tục Sort có nội dung như sau:

Procedure Sort(F:TroNut);
Var tam:integer;
   Procedure List(F:TroNut);
      Begin
        if F<>nil then begin write(F^.info:5);List(F^.Next); end;
      End;
BEGIN
   If (F<>nil)and(F^.Next<>nil) then
     Begin
       Sort(F^.Next);
       If F^.info > F^.Next^.info then
          Begin
             Tam:=F^.info; F^.info:=F^.Next^.info;
             F^.next^.info:=tam;
             List(First);
             writeln;
             Sort(F^.Next);
          End;
     End;
END;

Câu 2. Thông tin về các môn học được đào tạo tại một khoa của một trường Đại
học có thể được lưu trữ trong một danh sách liên kết đơn vời nút đầu được trỏ bởi
FirstS có khai báo như sau ở chương trình chính:

   Type st30=String[30];
        TroMH=^NutMH;


                                                                                   Trình bày: Trần Hoài Nhân
                                                                                      2/3


     NutMH=record
             MaMH:integer;        {Mã môn học: trường khóa}
             TenMH:St30;          {Tên môn học}
             SoDVHT:byte;         {Số đơn vị học trình}
             Next:TroMH;          {Địa chỉ nút tiếp theo trong danh sách}
           end;
Var FirstS:TroMH;

a. Viết hàm
   Function Addr(First: TroMH; BMaMH:integer):TroMH;
   trả về địa chỉ của nút thuộc danh sách FirstS có mã môn học là BMaMH,
   hoặc trả về giá trị NIL nếu không có nút nào có mã môn học là BMaMH.
b. Để quản lý các môn học được phân công giảng dạy của mỗi giáo viên, người
   ta lại sử dụng một danh sách liên kết đơn (gọi là danh sách giáo viên) với
   nút đầu được trỏ bởi con trỏ FirstT. Mỗi nút của danh sách giáo viên là một
   bản ghi gồm 4 trường: trường MaGV để lưu mã giáo viên (là trường khóa),
   trường HoTenGV để lưu họ tên giáo viên, trường Down lưu địa chỉ của nút
   tiếp theo, và trường DSM lưu địa chỉ nút đầu của một danh sách khác chứa
   mã của môn học do giáo viên đó đảm nhiệm (gọi là danh sách môn học).
   Mỗi nút của danh sách môn học là một bản ghi gồm 2 trường: MaM để lưu
   mã môn học đã được đăng ký trong danh sách FirstS và trường Tiep lưu địa
   chỉ của nút tiếp theo. Lưu ý rằng:
   • Danh sách giáo viên được sắp theo thứ tự tăng dần của MaGV.
   • Cho biết khai báo bổ sung của cấu trúc dữ liệu nói trên như sau:
      type St25=String[25];
           st8=string[8];
           TroM=^NutM;
           NutM=record
                  MaM:integer;
                  Tiep: TroM;
                end;

           TroGV=^NutGV;
           NutGV=record
                  MaGV:st8;
                  HoTenGV:st25;
                  down: TroGV;
                  DSM: TroM;
                end;
      var FirstT:TroGV;

   Viết hai thủ tục:
   + Procedure ListOfSubjects(FirstT:TroGV; BMaGV:st8);
   để liệt kê các môn học do giáo viên có mã giáo viên là BMaGV đảm nhiệm
   theo mẫu sau:
   STT    Tên môn học             Số đơn vị học trình
   …      …                       …




                                                                  Trình bày: Trần Hoài Nhân
                                                                                         3/3



       + Procedure ListOfTeachers(FirstT:TroGV; BMaM:integer);
       để liệt kê các giáo viên đảm nhiệm môn học có mã môn học là BMaM theo
       mẫu sau:
       STT    Họ và tên giáo viên
       …      …

Câu 3. Cho trước cây nhị phân Top (nút gốc trỏ bởi Top) có khai báo như sau:
    type TroNutTrenCay = ^NutTrenCay;
         NutTrenCay = record
                        Value:integer;
                        Left,Right:TroNutTrenCay;
                      end;
    var Top:TroNutTrenCay;

   a. Viết hàm
       Function Muc(Top,p:TroNutTrenCay):word;
      trả về giá trị là mức (level) của một nút thuộc cây nhị phân Top được trỏ bởi
      con trỏ P.
   b. Để biểu diễn một hàng đợi, người ta có thể sử dụng một danh sách liên kết
      đơn vời nút đầu (lối trước) và nút cuối (lối sau) lần lượt trỏ bởi First và Last.
      Ngoài ra mỗi nút trên danh sách này còn có thể lưu địa chỉ của một nút thuộc
      cây nhị phân Top. Cụ thể ta có khai báo bổ sung như sau:
   type TroNutTrenDS=^NutTrenDS;
        NutTrenDS = record
                      Info: TroNutTrenCay;
                {lưu địa chỉ của một nút thuộc cây nhị phân Top}
                      Next: TroNutNutTrenDS;
                {lưu địa chỉ nút tiếp trong danh sách}
                     end;
   var First, Last: TroNutTrenDS;

   Viết hai thủ tục:
   + Procedure InsertQueue(var                    First,Last:   TroNutTrenDS;             X:
   TroNutTrenCay);
   để bổ sung một nút mà trường Info có giá trị bằng X tại vị trí lối sau Last.
   + Procedure DeleteQueue(var First,Last: TroNutTrenDS; var X:
   TroNutTrenCay);
   để loại bỏ một nút tại vị trí lối trước First và gán giá trị trường Info của nút này
   cho tham biến X.
   c. Viết thủ tục
       Procedure LietKe(Top: TroNutTrenCay);
       nhằm liệt kê giá trị trường Value của mọi nút trên cây nhị phân Top, với
       yêu cầu:
       • Thứ tự các nút được liệt kê là theo thứ tự tăng dần của mức các nút trên
          cây.
       • Các nút có cùng mức được liệt kê theo thứ tự từ trái sang phải.

Ghi chú: Cán bộ coi thi không được giải thích gì thêm.


                                                                     Trình bày: Trần Hoài Nhân
                                                                                                        1/3


BỘ GIÁO DỤC & ĐÀO TẠO                   Họ và tên thí sinh:..................................................
     ĐẠI HỌC HUẾ                            Số báo danh:..................................................


          KỲ THI TUYỂN SINH SAU ĐẠI HỌC NĂM 2006
                  Môn thi: Ngôn ngữ lập trình
                               (Dành cho cao học)
                             Thời gian làm: 180 phút


Câu 1. Xét đoạn chương trình sau:
   function Power(n:byte):integer;
   begin
     if n=0 then Power:=1
      else
        if (n mod 2)=0 then Power:=sqr(Power(n div 2))
        else Power:=2*sqr(Power(n-1)div 2));
   end;
   a. Tính Power(20).
   b. Xét độ phức tạp tính toán của chương trình trên.

Câu 2. Xét dãy số: 12, 10, 5 , 19, 7, 16. Hãy cho biết diễn biến dãy số này (sự thay
đổi mỗi lúc có hoán đổi giá trị) khi việc sắp xếp được thực hiện theo thứ tự tăng
dần bằng phương pháp nỗi bọt (Bubble Sort).

Câu 3. Một trung tâm đào tạo Tin học cần quản lý việc học của học viên theo
chứng chỉ môn học. Trong mỗi kỳ, trung tâm lưu giữ thông tin về kết quả học tập
của các học viên trong một danh sách liên kết với nút đầu được trỏ bởi con trỏ F
(gọi à danh sách học viên F). Mỗi nút của danh sách là một bản ghi gồm 3 trường:
   • Trường Down: Lưu địa chỉ của nút tiếp theo trong danh sách học viên.
   • Trường Hoten: Lưu họ tên học viên (trường khóa của danh sách học viên).
   • Trường DsMon: Lưu địa chỉ của nút đầu của một danh sách khác chứa các
       kết quả các môn học mà học viên này đăng ký học trong học kỳ đó (gọi là
       danh sách môn hộc).
   Mỗi nút của danh sách môn học gồm các trường:
   • Trường TenMH: Tên của môn học (khóa).
   • Trường Diem: Điểm thi kết thúc môn học này của học viên.
   • Trường Next: Lưu địa chỉ nút tiếp theo của danh sách môn học.
   Lưu ý rằng chỉ có danh sách học viên được sắp xếp theo thứ tự tăng dần của
   Hoten.
   Khai báo CTDL:
      type St20=String[20];
           TroMH=^MonHoc;
           MonHoc = record
                     TenMH:st20;
                     Diem:byte;
                     Next:TroMH;


                                                                                  Trình bày: Trần Hoài Nhân
                                                                                   2/3


                  end;
     TroHV=^HocVien;
     HocVien = record
                     HoTen:st20;
                     down: TroHV;
                     DsMon: TroMH;
                end;
     var F:TroHV;

  a. Viết hàm:
     Function TimHV(F: TroHV; Name:St20):TroHV;
     Trả về địa chỉ của nút thuộc danh sách học viên F có giá trị trường
     Hoten=Name, hoặc trả về giá trị NIL nếu trong danh sách F không có học
     viên nào có họ tên là Name.
  b. Viết hàm:
     Function TimMH(F: TroHV; Subject:st20):TroMH;
     Trả về địa chỉ của nút thuộc danh sách môn học P (nút đầu trỏ bởi P) có giá
     trị trường TenMH=Subject, hoặc trả về giá trị NIL nếu trong danh sách P
     không có môn học nào có tên Subject.
  c. Viết thủ tục:
     Procedure Bosung(F: TroHV; Name,Subject:st20);
     Để bổ sung một học viên có tên Name vào danh sách F nếu chưa có học viên
     đó và học viên này có danh sách môn học đăng ký ban đầu gồm 1 môn học
     Subject. Nếu đã có học viên này, thì bổ sung một môn học có tên Subject
     vào cuối danh sách môn học của học viên đó, nếu môn học này chưa có
     trong danh sách; ngược lại, không làm gì cả.
  d. Viết thủ tục:
     Procedure Capnhat(F: TroHV; Name,Subject:st20; Mark:byte);
     Để cập nhật điểm thi Mark của môn học Subject cho học viên Name. Nếu
     không tìm thấy học viên Name thì thực hiện việc bổ sung học viên Name và
     môn học Subject kèm điểm số Mark tương ứng. Nếu không thấy môn học
     Subject của học viên Name thì thực hiện việc bổ sung môn học Subject kèm
     số điểm Mark.
  e. Viết thủ tục:
     Procedure InDSHV(F: TroHV);
     Thực hiện việc in danh sách học viên và điểm của từng môn học đăng kí
     kèm điểm trung bình của mỗi học viên, điểm trung bình bằng tổng tất cả các
     cột điểm chia cho số lượng môn học đã đăng ký. In danh sách theo mẫu:
     DANH SACH HOC VIEN
     1. Le Van A: Tin(9), Pascal(10) – DTB: 9.50
     2. Le Van B: word(5), Excel(8) – DTB: 6.50
     …

Câu 4. Cho cây nhị phân
     type TroNut=^Nut;
          Nut = record
                    Giatri:integer;
                    Left,Right:TroNut;



                                                               Trình bày: Trần Hoài Nhân
                                                                                     3/3


                   end;
      var T:TroNut;

   a. Viết hàm:
      ChieuCao(T:TroNut):byte;
      Trả về chiều cao của cây nhị phân T.
   b. Xét một danh sách liên kết F:
      type TroNutDS=^NutDS;
           NutDS = record
                      Giatri:integer; {lưu giá trị 1 nút trên cây}
                      Muc:byte; {lưu mức tương ứng của nút đó}
                      Next:TroNutDS;
                   end;
      var F:TroNutDS;
      Giả sử ban đầu danh sách F đã được khởi tạo là danh sách rỗng. Viết thủ tục
      bằng đệ qui:
      Ghi(T:TroNut; Var T:TroNutDS; level:byte);
      Để tạo danh sách F và ghi thông tin trường giatri của mọi nút trên cây T vào
      danh sách F này, đồng thời mức của nút trỏ bởi T là level sẽ được gán cho
      trường Muc của F.
   c. Giả sử thông tin trong cây nhị phân T đã được ghi vào danh sách T nhờ lời
      gọi Ghi(T,F,1). Viết hàm:
      DemSoNut(F:TroNutDS, level:byte):integer;
      Cho kết quả là số nút của danh sách F có giá trị trường Muc=level.
   d. Viết hàm:
      LaCayNPDD(T:Tronut):boolean;
      Cho kết quả True nếu cây T là cấy nhị phân đầy đủ, ngượi lại trả về giá trị
      False.




Ghi chú: Cán bộ coi thi không được giải thích gì thêm.




                                                                 Trình bày: Trần Hoài Nhân