Câu 1: Nếu chương trình đang dừng ở dòng 1 rồi ta chọn Debug.Step Into thì chương trình sẽ đến dòng: a.. Dòng 5 Câu 2: Nếu chương trình đang dừng ở dòng 9 do dòng 6 gọi rồi dùng Debug.St
Trang 1MỘT SỐ DẠNG BÀI TẬP HAY GẶP TRONG TIN HỌC ĐẠI CƯƠNG
1 Thuộc tính của file:
Hiểu như sau: Hàm GetAttr(pathname) trả về một giá trị, độ dài là 1byte Giá trị này hiểu
như sau:
1 0000 0001 vbReadOnly
16 0001 0000 vbDirectory
32 0010 0000 vbArchive
Ví dụ, giá trị trả về của hàm GetAttr(pathname) là 3 D = 0000 0011B thì có nghĩa là file mang
pathname là file chỉ đọc, và đang bị ẩn
Quay lại xét các toán tử bitwise:
Trang 2Và các toán tử luận lý khác nữa (ngang đây không biết đã hiểu chưa hỉ?)
Ví dụ nhé ^^
(Lấy trong slide ra mà thôi)
If GetAttr ("c:\windows\win.com") And vbReadOnly Then
MsgBox "c:\windows\win.com là file chỉ đọc"
End
Có nghĩa là lấy thuộc tính của file có đường dẫn là c:\windows\ win.com, và xem coi nó có phải là file chỉ đọc (ReadOnly) hay không Ở đây, And có nghĩa là so sánh xem có giống hay không Ví dụ bậc nhỏ hơn nhé.
Trang 3GetAttr ("c:\windows\win.com") trả về giá trị là 2D = 0000 0010B,
mà vbReadOnly có giá trị là 0000 0001
("c:\windows\win.com") And vbReadOnly sẽ tương đương với 0000 0010 and 0000 0001, kết quả là 0000 0000 tức là mang False
Kết luận: And trong toán tử bitwise với thuộc tính thì coi là file đó có phải là thuộc tính đó hay không.
Xét tiếp nhé:
Dim bytFileAttr As Byte
bytFileAttr = GetAttr ("c:\windows\win.com")
bytFileAttr = bytFileAttr Or vbReadOnly ' Or bitwise
SetAttr "c:\windows\win.com", bytFileAttr
Trong SetAttr() thì Or bitwise sẽ thêm vào thuộc tính vbReadOnly vào file "c:\windows\win.com", không tin thì viết ra thử là biết :P
2 Biểu diễn dữ liệu trên ô nhớ (chương 2)
Xét ví dụ (trích từ đề thi HK2 khóa 2011)
Private Sub Form_Load()
Dim a As Boolean, I As Integer, f As Single, d As Double, s as String A= false: i= -15: f= -10: d= -10: s= "Di"
Open "c:\data.bin" For Binary As #1
Put #1, ,a: Put #1, ,i: Put #1, ,f: Put#1, , d: Put #1, ,f: Put #1, , s
Close #1
End Sub
Trang 4Câu 2: VB dùng chỉ số 1 cho byte đầu trong file, 2 byte ở chỉ số 1 và 2 mang giá trị Hex là
a 00 01
b 01 00
c 00 00
d FF FF
Câu 3: 2 byte ở chỉ số 3, 4 có giá trị Hex là:
a 00 0F
b F6 FF
c 0F 00
d F1 FF
Câu 4: 4 byte ở chỉ số từ 5 tới 8 có giá trị Hex là
a 00 00 70 C1
b 00 00 20 C1
c C1 70 00 00
d C1 20 00 00
Câu 5: 8 byte ở chỉ số từ 9 tới 16 là
a 00 00 00 00 00 00 20 C1
b 00 00 00 00 00 00 24 C0
c C0 24 00 00 00 00 00 00
d C0 20 00 00 00 00 00 00
Câu 6: 2 byte ở chỉ số 17 18 có giá trị Hex là
a 42 73
b 43 68
c 44 3F
d 44 69
Giải:
Câu 1: String chiếm bao nhiêu byte? Ở VB 6.0 thì trong chuỗi, cứ 1 ký tự chiếm 1 byte Còn từ VB 7.0, sẽ chiếm 2 byte.
Trang 5Câu 2: Khi ghi file #1, 2 byte đầu là giá trị False trong Boolean Khi lưu vào
ô nhớ, False chiếm 2 byte, giá trị của nó là 0 Do có 2 byte= 16 bit, nên, giá trị của các ô nhớ là 0000 0000 0000 0000 Đổi về Hexa, thành 00 00.
Câu 3: 2 byte ở ô nhớ thứ 3 và 4 chứa giá trị của i= -15, kiểu dữ liệu là integer (2 byte)
Đổi về hệ nhị phân: 15D = 1111B Vì kiểu dữ liệu là integer, nên viết lại, them
số 0 sao cho đủ 2 byte(16bit)
15D = 0000 0000 0000 1111B
Thực hiện “bù 1”: 0 đổi thành 1, 1 đổi thành 0, ta sẽ có:
1111 1111 1111 0000
Thực hiện “bù 2” cộng 1 vào “bù 1”:
1111 1111 1111 0001
Đổi về hệ hexa, ta có được:
F F F 1
Vì cách ghi ô nhớ của VB là Little Endian, nên ô nhớ có địa chỉ thấp hơn là F1, cao hơn là FF
Đáp án: F1 FF
Trang 6Câu 4: 4 byte từ 5 tới 8 có chứa biến f= -10.
Đổi 10 sang nhị phân: 1010 = 1.010*23 (1.m*2e)
Theo slide này, ta có:
+ Nếu kiểu dữ liệu là single (câu 4) – 4byte
S= 1, E= 127 + e, với e = 3 Suy ra E= 130D = 1000 0010, M = m = 010.
Xếp theo slide trên, ta có
1100 0001 0010 0000 0000 0000 0000 0000 (Thêm 0 vào cho đủ 32 bit)
Quy về hệ Hexa
C 1 2 0 0 0 0 0
Sắp xếp lại theo kiểu LE:
00 00 20 C1
+ Nếu kiểu dữ liệu là double (câu 5) – 8 byte
S= 1, E= 1023 + e, với e = 3 Suy ra E= 130D = 10000000010, M = m = 010 Xếp theo slide trên, ta có
1100 0000 0010 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 (Thêm 0 vào cho đủ 32 bit)
Quy về hệ Hexa
C 0 2 0 0 0 0 0 0 0 0 0 0 0
0 0
Trang 7Sắp xếp lại theo kiểu LE:
00 00 00 00 00 00 20 C0
Câu 6: Byte ở chỉ số 17 và 18 chứa chuỗi “Di” Trong bảng mã ASCII, A = 65,
B = 66, C = 67, D = 68 Đổi về hexa là 44 Còn i = 105, đổi về hexa là 69 Đáp
án 44 69.
Trang 83 Debug một chương trình:
Trang 9Ví dụ (trích từ đề thi HK2 khóa 2011)
Private Sub Command1_Click()
MsgBox ("Bat dau chay Command1_Click()") 'Dong 1
Dim a As Integer 'Dong 2
Dim b As Integer 'Dong 3
a = 3 'Dong 4
b = 4 'Dong 5
a = f(a, b) 'Dong 6
b = f(b, a) 'Dong 7
End Sub
Public Function f(ByVal a As Integer, ByVal b As Integer) As Integer 'Dong 9 Dim x As Integer 'Dong 10
a = a + 1 'Dong 11
x = a + b 'Dong 12
b = b + 2 'Dong 13
f = a * b 'Dong 14
End Function 'Dong 15
Trang 10Câu 1: Nếu chương trình đang dừng ở dòng 1 rồi ta chọn Debug.Step Into thì chương trình sẽ đến dòng:
a Dòng 2
b Dòng 3
c Dòng 4
d Dòng 5
Câu 2: Nếu chương trình đang dừng ở dòng 9 (do dòng 6 gọi) rồi dùng Debug.Step Out thì chương trình sẽ đến dòng
a Dòng 10
b Dòng 11
c Dòng 15
d Dòng 7
Câu 3: Nếu chương trình đang dừng ở dòng 6, rồi ta chọn Debug.Step Into thì chương trình sẽ đến dòng:
a Dòng 7
b Dòng 8
c Dòng 9
d Dòng 10
Câu 4: Nếu chương trình đang dừng ở dòng 6, rồi ta chọn Debug.Step Out thì chương trình sẽ đến dòng
a Dòng 7
b Dòng 9
c Dòng 15
d Tất cả 3 câu trên đều sai
Câu 5: Thiết lập vị trí cursor ở dòng 10, chọn Debug.Add Watch, Expression chọn b, đánh dấu chọn vào optionButton “Break When Value Change”, rồi cho chương trình chạy từ đầu thủ tục Command1_Click() thì chương trình sẽ dừng ở dòng
a Dòng 5
b Dòng 6
c Dòng 13
d Dòng 14
Câu 6: Giả sử chưa có điểm dừng nào được thiết lập trước Thiết lập vị trí cursor ở dòng 3, chọn Debug.Add Watch, Expression chọn b, đánh dấu chọn vò optionButtion
“Break When Value Change” rồi cho chương trình chạy từ đầu thủ tục, Command1_Click() thì chương trình sẽ nằm ở dòng:
Trang 11Câu 1: Debug.Step Into để chạy tiếp một dòng lệnh rồi dừng lại (Pause), nếu lệnh thi hành là lênh gọi thủ tục thì ứng dụng sẽ dừng lại ở lệnh đầu tiên của thủ tục Chương trình sẽ chạy tiếp tới dòng 4 rồi dừng lại
Câu 2: Debug.Step Out để chạy các lệnh còn lại của thủ tục hiện hành rồi quay về và dừng lại sau lệnh gọi thủ tục này (Pause) Chương trình sẽ chạy hết thủ tục f rồi dừng lại sau lệnh gọi thủ tục a = f(a, b) ‘Dòng 6 tức là sẽ dừng lại ở dòng 7
Câu 3: Debug.Step Into để chạy tiếp một dòng lệnh rồi dừng lại (Pause), nếu lệnh thi hành là lênh gọi thủ tục thì ứng dụng sẽ dừng lại ở lệnh đầu tiên của thủ tục Dòng 6 là lệnh thi hành Step Into sẽ dừng ở lệnh đầu tiên của thủ tục f, vậy thì sẽ dừng ở dòng 10
Câu 4: Dòng 6 thuộc Command1_Click() nên khi chạy, sẽ thoát khỏi chương trình
Câu 5: Sau dòng 13 giá trị của b mới thay đổi, chương trình sẽ dừng ở dòng 14
Câu 6: b khi mới khai báo có giá trị là 0 Sau dòng 5 thì b mới thay đổi giá trị (b= 4) Chương trình dừng ở dòng 6
Trang 124 byVal, byRef
Xét ví dụ sau (Trích từ đề thi HK2 khóa 2011)
Dim a As Integer, b As Integer, c As Integer
Private Sub Vidu(m As Integer, ByVal n As Integer, ByRef p As Integer)
m = n + p: n = p + m: p = m + n
End Sub
Private Sub Command1_Click()
a = 1: b = 2: c = 3
Call Vidu(a, b, c)
Call Vidu(a, a, a)
End Sub
Câu 25: Sau khi Call Vidu(a, b, c) chạy xong, chúng ta sẽ có:
a a = 5, b = 2, c = 13.
b a = 1, b = 2, c = 13.
c a = 5, b = 2, c = 3.
d Tất cả đều sai.
Câu 26: Sau khi Call Vidu(a, a, a) chạy xong, chúng ta sẽ có:
a a = 1
b a = 5
c a= 13
d Tất cả đều sai.
Trang 13Lời giải:
m không khai báo gì cả, mặc định là byRef (tham khảo), n tham trị (sau khi kết thúc hàm, thì giá trị không thay đổi), p là tham khảo (Viết thế này có lẽ sai về mặt tin học, nhưng hiểu thế nhá ^^)
Xét đoạn lệnh: Call Vidu(a, b, c)
Sở dĩ vậy vì n là tham trị.
Xét tiếp Call Vidu(a, a, a)
Trang 145 Biến toàn cục, biến cục bộ
Xét ví dụ sau (lấy từ đề thi HK2 của K11)
Dim a As Integer, b As Integer, c As Integer
Private Sub Vidu()
a = a + 4: b = b + 5: c = c + 6
End Sub
Private Sub Command1_Click()
Dim a As Integer, b As Integer, c As Integer
a = 1: b = 2: c = 3
Call Vidu
End Sub
Private Sub Command2_Click()
Print a; b; c
End Sub
Câu 27: nếu chạy thủ tục Command2_Click() thì sau khi chạy xong, kết quả in ra là:
a 0 0 0
b 1 2 3
c 4 5 6
d Tất cả đều sai.
Trang 15Câu 28: Nếu chạy thủ tục Command1_Click() đầu tiên, rồi tiếp tục chạy tiếp thủ tục
Command2_Click() thì sau khi chạy xong, kết quả in ra là:
a 1 2 3
b 4 5 6
c 5 7 9
d Tất cả đều sai.
Lời giải:
Nếu chạy thủ tục Command2_Click(), vì a, b, c mặc định là 0, 0, 0 Chưa có lệnh thực thi
nào liên quan tới a, b, c
Nếu chạy thủ tục Command1_Click() đầu tiên, rồi tiếp tục chạy tiếp thủ tục Command2_Click():
Trong phần Vidu, chưa khai báo gì hết, biến a, b, c lúc này là của Sub Vidu(), nên giá trị ban đầu của nó bằng 0 Biến a,b,c ở trên cùng là biến toàn cục, biến trên trong command1 là biến cục bộ! Khi gọi hàm vidu() thì nó sẽ lấy biến toàn cục để xử lý chứ ko phải là biến cục bộ trong hàm đó, mà biến toàn cục thì nó chỉ khai báo chứ chưa gán giá trị nên ban đầu a= 0, b=
0, c= 0
Trang 166 Tăng thời gian sống của biến: Static
Xét ví dụ sau (lấy từ đề thi HK2 của K11)
Private Sub Command1_Click()
Dim kq as Integer
kq= MyFunc(): kq= MyFunc(): Print CStr(kq)
End Sub
Private Function MyFunc()
Dim a as Integer
Dim b as Integer
a= a+ 1: b= b + 1: MyFunc= a + b
End Function
Câu 1: Sau khi thủ tục Command1_Click() chạy, máy hiện thị:
a 2
b 3
c 4
d Giá trị không xác định
Câu 2: Nếu định nghĩa hàm MyFunc() như sau:
Private Static Function MyFunc()
Dim a as Integer
Dim b as Integer
a= a+ 1: b= b + 1: MyFunc= a + b
End Function
Thì sau khi thủ tục Command1_Click() click chạy, máy hiện thị:
Trang 17Câu 3: Nếu định nghĩa hàm MyFunc() như sau, thì Thì sau khi thủ tục Command1_Click() click chạy, máy hiện thị:
Private Static Function MyFunc()
Static a as Integer
Dim b as Integer
a= a+ 1: b= b + 1: MyFunc= a + b
End Function
Câu 4: Nếu định nghĩa hàm MyFunc() như sau, thì Thì sau khi thủ tục Command1_Click() click chạy, máy hiện thị:
Private Static Function MyFunc()
Static a as Integer
Static b as Integer
a= a+ 1: b= b + 1: MyFunc= a + b
End Function
Trang 187 Truy xuất file:
Xét ví dụ sau (lấy từ đề thi HK2 của K11)
Private Type record
ID As Integer
Name As String * 23
End Type
Private Sub Command1_Click()
Dim x As record, k As Integer
Open "Random1" For Random As #1 Len = Len(x)
For k = 2 To 1 Step -1
x.ID = k: x.Name = "x.Name =" & x.ID
Put #1, , x
Next k
Print LOF(1) & " Byte" 'Lenh Print thu nhat
Seek #1, 2: Get #1, , x
Print x.Name 'Lenh Print 2
Print Seek(1)
Close #1
End Sub
Câu 39: Lệnh Print 1 sẽ in ra kết quả là:
a 25 Byte
b 48 Byte
c 50 Byte
d 96 Byte
Câu 40: Lệnh Print 2 sẽ in ra kết quả là:
a x.Name =2
b x.Name =1
c x.Name= 2
d x.Name= 1
Câu 41: Lệnh Print 3 sẽ in ra kết quả là:
a 1
b 2
c 3
d 4 Hướng dẫn giải:
Câu 39: Integer chiếm 2 byte, String * 23 chiếm 23byte Có 2 vòng for Đáp án: 50
Trang 19Câu 40: Ở vị trí thứ 2, thì theo như vòng for, k= 1, x.ID= 1, x.Name = "x.Name =" & x.ID suy
ra x.Name = "x.Name =1"
Câu 41: Cứ mỗi lần đọc xong 1 record, seek tăng lên 1 Đáp án: 3
8 Một số lý thuyết cần lưu ý (các lý thuyết này đúc kết thông qua đề thi khóa 2011)
8.1 Hàm (Function): tên của hàm và tên của biến trong hàm không được trùng nhau 8.2 Thủ (Sub): tên thủ tục và biến tên biến trong thủ tục có thể giống nhau
8.3 Combobox= Textbox + Listbox
8.4 Form: có thể dùng 1 tên cho cả Form và button; không có quyền dùng 1 tên cho button và textbox Tên thủ tục xử lý sự kiện cho Form bắt đầu bằng Form_
8.5 Button: một button có thuộc tính (Name)= butName thì thủ tục xử lý sự kiện trên button này bắt đầu bằng butName_
8.6 Mặc định, Array bắt có chỉ số bắt đầu là 0 Khi thêm Option Base {0|1} thì sẽ xác định cận dưới của Array là 0 hoặc 1
8.7 Thứ tự ưu tiên các toán tử trong VB từ thấp tới cao: luận lý, so sánh, số học (xem thêm slide nhé ^^)