Câu 1: Bài Tập Môn: NGÔN NGỮ LẬP TRÌNH Cho văn phạm dưới đây định nghĩa cú pháp của các biểu thức luận lý bao gồm các biến luận lý a,b,, z, các phép toán luận lý not, and, và các dấu mở và đóng ngoặc tròn (<bool_expr> là ký hiệu khởi đầu): <bool_expr>::=<bool_expr> and <bool_fact> <bool_fact> <bool_expr>::=<bool_var> and <bool_fact> <bool_expr> <bool_expr>::=a b z 1. Chọn biểu thức not a and (b and not c) có hợp lệ theo cú pháp này không? Chứng minh. 2. Cho biết độ ưu tiên tính toán của phép toán not, phép toán and, và biểu thức trong dấu mở và đóng ngoặc tròn theo cú pháp này. Giải thích bằng ví dụ của biểu thức ở trên. Câu 2: Cho chương trình sau đây: Program MID_TERM; Var x: array [1 3] of real; Function FOO(x:array[]1 3] of real): real; var i: integer; s: real; s := 0; for i := 1 to 3 do s := s+x[i]; FOO := s x[1] := 1; x[2] := 2; x[3] := 3; write (FOO(x)) 1. Minh họa bản ghi hoạt động (activation record) của MID_TERM và FOO. 2. Có lỗi kiểu (type error) ở phép gọi hàm FOO trong MID_TERM không? Tại sao? Câu 3: Minh họa sự hiện thực (tức là đoạn mà thực thi trong bộ nhớ) của đoạn chương trình sau đây: if X = 0 then S1; if Y = 0 then S2; elsse S3; S4;
Câu 4: Cho chương trình viết bằng ngôn ngữ tựa PASCAL nhưng sử dụng quy tắc tầm vực động như sau: Program DYNAMIC; Var x, y: real; Procedure sub_1; var y, z: real; y := x; z := 3; sub_2 procedure sub_2; var z, w: real; z := y + 1; w := x + 1; sub_3 procedure sub_3; var w, x: real; w := z + 2; x := y + 2; x := 1; y := 2; sub_1 1. Hãy vẽ chồng trung tâm sau khi các lệnh gán trong từng chương trình chính, sub_1, sub_2 và sub_3 được thực hiện, cho thấy dây xích động và giá trị của tất cả các biến. 2. Đặt nhãn cho các đối tượng dữ liệu và cho biết các kết hợp (association) khả biến và không khả biến đối với sub_3 khi nó được thực thi. Câu 5: 1. Cho một ví dụ về kiểm tra kiểu tĩnh và một ví dụ về kiểm tra kiểu động ở ngôn ngữ PASCAL. Minh họa dạng lưu trữ theo thứ tự row-major của dãy A với khai báo sau: var A: array [0 1, 1 2, -1 1] of integer 2. Viết biểu thức tính địa chỉ của các phần tử của một dãy 3 chiều lưu trữ theo thứ tự row-major. Câu 6: Viết giải thuật để tính vị trí V[N] của vector V, cho biết V được lưu trữ dưới dạng liên kết như trong hình vẽ (hình 1). Phần mô tả có địa chỉ là nền α, có kích thước là j. Mỗi phần tử của V được lưu trong những khối rêing rẽ, có kích thước phần dữ liệu là k. α j Phần mô tả Phần tử 1 Phần tử N
Hình 1 Câu 7: Cho đoạn chương trình viết bằng ngôn ngữ tựa PASCAL như sau: SUM := 0; N := 10; For I :=1 to N do SUM := Sum + A[I]; P; Giả sử rằng các giá trị của I được tự động tăng thêm 1 sau mỗi lần thực thi xong thân của phát biểu lặp for, và chương trình con P làm giảm giá trị của N đi 1. Hãy cho biết các phần tử của dãy A tham gia vào tổng SUM trong mỗi trường hợp sau: 1. Giá trị của N chỉ được xét một lần ở đầu phát biểu lặp và P không làm thay đổi giá trị của I. 2. Giá trị của N được xét lại sau mỗi lần thực thi xong thân của phát biểu lặp và P không làm thay đổi giá trị của I. 3. Giá trị của N chỉ được xét một lần ở đầu phát biểu lặp và P làm tăng giá trị của I thêm I. 4. Giá trị của N được xét lại sau mỗi lần thực thi xong thân của phát biểu lặp và P làm tăng giá trị của I thêm I. Câu 8: Cho chương trình viết bằng ngôn ngữ tựa PASCAL như sau: Program M; Var x, y: char; Procedure W; var x: char; x := W ; y := pred(y) procedure D; var y: char; x := succ(x); y := D ; x := B ; y := C ; W; D; Hãy vẽ để cho thấy sự thay đổi giá trị của tất cả các biến ở chồng trung tâm khi chương trình trên được thực thi cho mỗi trường hợp sau: 1. Áp dụng qui tắc tầm vực tĩnh. 2. Áp dụng qui tắc tầm vực động.
Trong mỗi trường hợp, vẽ chồng trung tâm ở những giai đoạn thực thi sau đây của chương trình: 1. Ngay sau khi các lệnh gán trong W ở lần gọi thứ nhất được thực hiện. 2. Ngay sau khi các lệnh gán trong D được thực hiện. 3. Ngay sau khi các lệnh gán trong W ở lần gọi thứ hai được thực hiện. (Ghi chú: pred() và succ() là các hàm trả về kí tự đứng trước và kí tự đứng sau của đối số theo thứ tự trong bảng chữ cái la-tinh). Câu 9: Cho chương trình viết bằng ngôn ngữ cấu trúc khối tựa PASCAL như sau: Program MT2002; Type T = array [1 2] of integer; var a: T; procedure sub_1(var x: integer; y: integer); x := x + 1; y := y+1; sub_2 (x, y) procedure sub_2(x: integer; var y: integer); var a: T; procedure sub_3(var a: T); a[1] := a[1] +1; a[2] := a[2] +1 a[1] := x; a[2] := y; sub_3(a) a[1] := 10; a[2] := 20; sub_1(a[1], a[2]) Hãy vẽ chồng trung tâm ở những giai đoạn thực thi sau đây của chương trình: 1. Ngay sau khi các lệnh gán trong chương trình chính được thực hiện. 2. Ngay sau khi các lệnh gán trong sub_1 được thực hiện. 3. Ngay sau khi các lệnh gán trong sub_2 được thực hiện. 4. Ngay sau khi các lệnh gán trong sub_3 được thực hiện. Mỗi hình vẽ cho thấy các dây xích tĩnh và giá trị của tất cả các biến (Nếu giá trị thuộc kiểu chỉ điểm thì vẽ mũi tên đến ô nhớ tương ứng).
Câu 10: Cho chương trình viết bằng ngôn ngữ cấu trúc khối tựa PASCAL như sau: Program de_so_1; var x,y: integer; procedure sub_1(x: integer; var y:integer); procedure sub_2(x: integer; var y: integer); x := x + 1; y := y+1; sub_2 (x, y) procedure sub_3(var x: integer; var y: integer); sub_1(x,y); x :=4; y:=6; sub_3(x,y); Hãy vẽ chồng trung tâm (central stack) trước và sau khi các lệnh gán trong sub_2 được thực hiện, cho thấy các thông tin sau: 1. Các dây xích tĩnh (static chain). 2. Giá trị các biến x và y của chương trình chính và các chương trình con. Nếu giá trị là kiểu chỉ điểm (pointer) thì vẽ mũi tên đến ô nhớ tương ứng. Câu 11: 1. Hãy xây dựng một văn phạm định nghĩa cú pháp của các biểu thức luận lý bao gồm các biến luận lý a,b,,z, các phép toán luận lý not, or, và các dấu mở và đóng ngoặc đơn đóng ngoặc tròn. Giả sử biểu thức trong dấu mở và đóng ngoặc tròn có độ ưu tiên tính toán cao nhất, kế đến là phép toán not, và sau cùng là phép toán or. 2. Hãy vẽ cây phân tích câu (parse tree) của biểu thức a or not (b or not c) theo văn phạm này