Bài 1. Ôn tập: Dữ liệu và thuật toán trong Pascal
Câu hỏi, ví dụ, bài tập
Câu 1: Hai kiểu khai báo sau có tương đương với nhau không:
Var Ch:Char; Var St:String[1];
Sau đó liệu ta có thể thực hiện các lệnh gán như sau hay không:
St:=Ch; Ch:=St;
Trả lời
Câu 2: Trong chương trình Pascal nếu ta khai báo một biến số nhưng không đặt giá trị ban đầu cho chúng thì các biến này sẽ như thế nào. Để minh họa xét ví dụ sau:
Uses crt; Var n: integer; St: String; a: Real; Begin Writeln('Số tự nhiên:',n); Writeln('Xâu kí tự:',St); Writeln('Số thực:',a:10:2); End.
Trả lời
Câu 3: Lập chương trình in ra trên màn hình 10 dòng đầu tiên của tam giác Pascal theo dạng sau:
Trả lời
Câu 4: Lập chương trình in ra trên màn hình 10 dòng đầu tiên của tam giác Pascal theo dạng sau:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
....................
Trả lời
Câu 5: Giả sử giá trị ban đầu của X là 0.1. Hãy tính giá trị của X sau các lệnh sau:
a.
If 2+ 4 = 5 then X:=X+1;
b.
If (1+2 =3) or (4 < 1) then X:=round(X+1);
c.
If ((2 > 3) or not((1+ 1 =2) and (3 < 5))) then X:=X*X;
Trả lời
Câu 6: Hãy kiểm tra kết quả của chương trình sau:
Program VD; Uses Crt; Const Nmax = 1000; Type DayNP = Array[0..Nmax] of byte; Var A: DayNP; N,i:integer Begin Readln(N); For i:=0 to N do A[i]:=0; While A[N] <> 1 do Begin For i:=1 to N do Write(A[N-i]); Writeln; i:=0; While A[i] = 1 do Begin A[i]:=0; i:=i+1; End; A[i]:=1; End; End.
Trả lời
Câu 7: Nhập xâu ký tự có dạng sau từ bàn phím: X1±X2±X3±.....±Xk có dạng: các chữ số nối tiếp nhau bằng dấu + hoặc -.
Viết chương trình tính giá trị của biểu thức trên.
Trả lời
Câu 8: Có một chuyên gia lập trình Pascal phát biểu là bất cứ một lệnh lặp While nào cũng có thể thay thế tương đương bằng một lệnh lặp Repeat. Ngược lại mọi lệnh Repeat đều có thể thay thế bằng lệnh While.
Điều đó có đúng không. Hãy cho ví dụ minh họa.
Trả lời
Câu 9: Một lệnh lặp For có thể thay thế bằng lệnh While không. Điều ngược lại có đúng không.
Trả lời
Câu 10: Trong Pascal có lệnh tạo nhãn (Label) và lệnh chuyển điều khiển đến nhãn (Goto). Trên thực tế có thể thấy rằng lệnh tạo nhãn và chuyển điều khiển tới nhãn dễ gây rối chương trình và khó theo dõi. Em hãy chuyển chương trình sau có nhãn thành không có mà tác dụng của chương trình không thay đổi.
Program VD; Label 100, 101; Var i, a: integer; Begin For i:=1 to 100 do Begin Writeln('Nhập a: '); Readln(a); If a <= 0 then goto 100; If a mod 5 = 0 then Begin Writeln(a); goto 101; End; 100: End; Writeln('Không tìm thấy'); 101: End.
Trả lời
Câu 11: Viết chương trình nhập số tự nhiên N và in ra dòng thứ N của tam giác Pascal.
Trả lời
Câu 12: Xét bàn cờ vua 8x8. Các ô được đánh dấu bởi vị trí hàng và cột, ví dụ vị trí (1,2) chỉ ra vị trí hàng 1 cột 2.
Cho trước k vị trí, trên đó đã xếp k quân hậu: (((i_1,j_1), (i_2,j_2), ..., (i_k,j_k))).
Viết chương trình kiểm tra xem k quân hậu trên có ở trong trạng thái độc lập hay không (tức là không quân nào có thể khống chế quân nào).
Trường hợp các quân trên đã độc lập hãy kiểm tra xem có thể bổ xung thêm một quân hậu nữa mà vẫn bảo đảm tính độc lập được hay không, nếu được hãy chỉ ra vị trí của quân hậu mới.
Trả lời
Câu 13: Xét bàn cờ vua 8 x 8. Các ô được đánh dấu bởi vị trí hàng và cột, ví dụ vị trí (1,2) chỉ ra vị trí hàng 1 cột 2. Cho trước k vị trí, trên đó đã xếp k quân tốt: (((i_1,j_1), (i_2,j_2), ..., (i_k,j_k))).
Hãy viết chương trình kiểm tra xem có thể xếp một quân hậu trên bàn cờ sao cho nó có thể khống chế toàn bộ k quân tốt. Nếu được hãy chỉ ra vị trí của quân hậu đó.
Trả lời
Câu 14: Xét bàn cờ vua 8 x 8. Các ô được đánh dấu bởi vị trí hàng và cột, ví dụ vị trí (1,2) chỉ ra vị trí hàng 1 cột 2. Cho trước k vị trí, trên đó đã xếp k quân tốt: (((i_1,j_1), (i_2,j_2), ..., (i_k,j_k))).
Hãy viết chương trình để chỉ ra và xếp thêm trên bàn cờ một số tối thiểu nhất các con hậu sao cho chúng sẽ khống chế toàn bộ k quân tốt. Chương trình phải chỉ ra được vị trí của mỗi quân hậu được xếp.
Trả lời
Câu 15: Trên một bàn tròn người ta xếp n số 0 và 1. Giả sử dãy số đã cho được viết dưới dạng: ((a_1 a_2 a_3 .... a_n)). Sau mỗi phút các số trên vòng tròn sẽ tự biến đổi theo cách sau: Nếu hai số bên cạnh giống nhau thì không thay đổi, ngược lại nếu hai số bên cạnh khác nhau thì sẽ thay đổi 0 --> 1 và 1 --> 0.
Cho trước dãy số như trên, lập chương trình tính sau k phút (k nhập từ bàn phím) dãy số ban đầu sẽ thay đổi như thế nào.
Trả lời
Câu 16: Giả thiết giống bài trên. Dễ thấy rằng dãy đã cho sẽ không biến đối nữa khi mà tất cả các số của dãy là như nhau.
Cho trước một dãy bất kỳ ban đầu, hãy kiểm tra xem quá trình biến đổi trên có bị dừng lại hay không. Hãy kiểm tra với các dãy cụ thể sau:
1010101000101100
0100010101111001
Trả lời
Câu 17: Giả thiết giống bài trên. Dãy đã cho ban đầu được gọi là Tuần hoàn nếu quá trình biến đổi đến một lúc nào đó sẽ xuất hiện lại dãy ban đầu.
Cho trước một dãy ban đầu hãy kiểm tra xem nó có phải là tuần hoàn hay không. Hãy kiểm tra cụ thể với các dãy sau:
101010101010
100100100100
Trả lời
Câu 18: Cần phải xếp 20 bao gạo vào 8 nhà kho sao cho mỗi cạnh của nhà kho phải có tổng số bao gạo là 7. Người ta đã nghĩ ra cách xếp như sau:
2 | 3 | 2 |
3 | 3 | |
2 | 3 | 2 |
Giải quyết bài toán trên nhưng với tổng số 24 bao gạo.
Giải quyết bài toán chỉ với 16 bao gạo.
Trả lời
Câu 19: Ma trận kỳ ảo bậc N là bảng số vuông N x N bao gồm các số 1, 2, 3, ..., ((N^2)) sao cho tổng số các hàng, các cột và các đường chéo đều bằng nhau.
Em hãy thử tìm ma trận kỳ ảo bậc 4.
Trả lời
Câu 20: Hãy thử tìm ma trận kỳ ảo bậc 5.
Trả lời