Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 19 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
19
Dung lượng
0,96 MB
Nội dung
MỘT SỐ DẠNG BÀI TẬP HAY GẶP TRONG TIN HỌC ĐẠI CƯƠNG Thuộc tính file: Hiểu sau: Hàm GetAttr(pathname) trả giá trị, độ dài 1byte Giá trị hiểu sau: Decimal Bin 0000 0000 vbNormal 0000 0001 vbReadOnly 0000 0010 vbHidden 0000 0100 vbSystem 0000 1000 vbVolume 16 0001 0000 vbDirectory 32 0010 0000 vbArchive Ví dụ, giá trị trả hàm GetAttr(pathname) 3D = 0000 0011B có nghĩa file mang pathname file đọc, bị ẩn Quay lại xét toán tử bitwise: Người biên soạn: Nguyễn Tấn Cường Và tốn tử luận lý khác (ngang khơng biết hiểu chưa hỉ?) Ví dụ ^^ (Lấy slide mà thôi) If GetAttr ("c:\windows\win.com") And vbReadOnly Then MsgBox "c:\windows\win.com file đọc" End Có nghĩa lấy thuộc tính file có đường dẫn c:\windows\ win.com, xem coi có phải file đọc (ReadOnly) hay khơng Ở đây, And có nghĩa so sánh xem có giống hay khơng Ví dụ bậc nhỏ Người biên soạn: Nguyễn Tấn Cường GetAttr ("c:\windows\win.com") trả giá trị 2D = 0000 0010B, mà vbReadOnly có giá trị 0000 0001 ("c:\windows\win.com") And vbReadOnly tương đương với 0000 0010 and 0000 0001, kết 0000 0000 tức mang False Kết luận: And tốn tử bitwise với thuộc tính coi file có phải 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() Or bitwise thêm vào thuộc tính vbReadOnly vào file "c:\windows\win.com", khơng tin viết thử biết :P Biểu diễn liệu 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 Câu 1: Sau chạy thủ tục Form_Load() file data.bin có kích thước là: a b c d byte 13 byte 18 byte 20byte Người biên soạn: Nguyễn Tấn Cường Câu 2: VB dùng số cho byte đầu file, byte số mang giá trị Hex a b c d 00 01 01 00 00 00 FF FF Câu 3: byte số 3, có giá trị Hex là: a b c d 00 0F F6 FF 0F 00 F1 FF Câu 4: byte số từ tới có giá trị Hex a b c d 00 00 70 C1 00 00 20 C1 C1 70 00 00 C1 20 00 00 Câu 5: byte số từ tới 16 a b c d 00 00 00 00 00 00 20 C1 00 00 00 00 00 00 24 C0 C0 24 00 00 00 00 00 00 C0 20 00 00 00 00 00 00 Câu 6: byte số 17 18 có giá trị Hex a b c d 42 73 43 68 44 3F 44 69 Giải: Câu 1: String chiếm byte? Ở VB 6.0 chuỗi, ký tự chiếm byte Còn từ VB 7.0, chiếm byte Người biên soạn: Nguyễn Tấn Cường Câu 2: Khi ghi file #1, byte đầu giá trị False Boolean Khi lưu vào ô nhớ, False chiếm byte, giá trị Do có byte= 16 bit, nên, giá trị ô nhớ 0000 0000 0000 0000 Đổi Hexa, thành 00 00 Câu 3: byte ô nhớ thứ chứa giá trị i= -15, kiểu liệu integer (2 byte) Đổi hệ nhị phân: 15D = 1111B Vì kiểu liệu integer, nên viết lại, them số cho đủ byte(16bit) 15D = 0000 0000 0000 1111B Thực “bù 1”: đổi thành 1, đổi thành 0, ta có: 1111 1111 1111 0000 Thực “bù 2” cộng vào “bù 1”: 1111 1111 1111 0001 Đổi hệ hexa, ta có được: F F F Vì cách ghi ô nhớ VB Little Endian, nên ô nhớ có địa thấp F1, cao FF Đáp án: F1 FF Người biên soạn: Nguyễn Tấn Cường Câu 4: byte từ tới 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 liệu single (câu 4) – 4byte S= 1, E= 127 + e, với e = Suy 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 vào cho đủ 32 bit) Quy hệ Hexa C 0 0 Sắp xếp lại theo kiểu LE: 00 00 20 C1 + Nếu kiểu liệu double (câu 5) – byte S= 1, E= 1023 + e, với e = Suy 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 vào cho đủ 32 bit) Quy hệ Hexa C 0 0 0 0 0 0 Người biên soạn: Nguyễn Tấn Cường Sắp xếp lại theo kiểu LE: 00 00 00 00 00 00 20 C0 Câu 6: Byte số 17 18 chứa chuỗi “Di” Trong bảng mã ASCII, A = 65, B = 66, C = 67, D = 68 Đổi hexa 44 Còn i = 105, đổi hexa 69 Đáp án 44 69 Người biên soạn: Nguyễn Tấn Cường Debug chương trình: Người biên soạn: Nguyễn Tấn Cường Ví dụ (trích từ đề thi HK2 khóa 2011) Private Sub Command1_Click() MsgBox ("Bat dau chay Command1_Click()") 'Dong Dim a As Integer 'Dong Dim b As Integer 'Dong a=3 'Dong b=4 'Dong a = f(a, b) 'Dong b = f(b, a) 'Dong End Sub Public Function f(ByVal a As Integer, ByVal b As Integer) As Integer 'Dong 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 Người biên soạn: Nguyễn Tấn Cường Câu 1: Nếu chương trình dừng dịng ta chọn Debug.Step Into chương trình đến dịng: a Dịng b Dịng c Dòng d Dòng Câu 2: Nếu chương trình dừng dịng (do dịng gọi) dùng Debug.Step Out chương trình đến dịng a b c d Dòng 10 Dòng 11 Dòng 15 Dịng Câu 3: Nếu chương trình dừng dịng 6, ta chọn Debug.Step Into chương trình đến dòng: a b c d Dòng Dòng Dịng Dịng 10 Câu 4: Nếu chương trình dừng dòng 6, ta chọn Debug.Step Out chương trình đến dịng a b c d Dòng Dòng Dòng 15 Tất câ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”, cho chương trình chạy từ đầu thủ tục Command1_Click() chương trình dừng dịng a b c d Dịng Dòng Dòng 13 Dòng 14 Câu 6: Giả sử chưa có điểm dừng 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” cho chương trình chạy từ đầu thủ tục, Command1_Click() chương trình nằm dịng: a Dòng b Dòng Người biên soạn: Nguyễn Tấn Cường c Dòng 13 d Dòng 14 Giải: Câu 1: Debug.Step Into để chạy tiếp dòng lệnh dừng lại (Pause), lệnh thi hành lênh gọi thủ tục ứng dụng dừng lại lệnh thủ tục Chương trình chạy tiếp tới dòng dừng lại Câu 2: Debug.Step Out để chạy lệnh lại thủ tục hành quay dừng lại sau lệnh gọi thủ tục (Pause) Chương trình chạy hết thủ tục f dừng lại sau lệnh gọi thủ tục a = f(a, b) ‘Dòng tức dừng lại dòng Câu 3: Debug.Step Into để chạy tiếp dòng lệnh dừng lại (Pause), lệnh thi hành lênh gọi thủ tục ứng dụng dừng lại lệnh thủ tục Dòng lệnh thi hành Step Into dừng lệnh thủ tục f, dừng dòng 10 Câu 4: Dòng thuộc Command1_Click() nên chạy, khỏi chương trình Câu 5: Sau dòng 13 giá trị b thay đổi, chương trình dừng dịng 14 Câu 6: b khai báo có giá trị Sau dịng b thay đổi giá trị (b= 4) Chương trình dừng dịng Người biên soạn: Nguyễn Tấn Cường 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 = Call Vidu(a, b, c) Call Vidu(a, a, a) End Sub Câu 25: Sau Call Vidu(a, b, c) chạy xong, có: a b c d a = 5, b = 2, c = 13 a = 1, b = 2, c = 13 a = 5, b = 2, c = Tất sai Câu 26: Sau Call Vidu(a, a, a) chạy xong, có: a b c d a=1 a=5 a= 13 Tất sai Người biên soạn: Nguyễn Tấn Cường Lời giải: m khơng khai báo cả, mặc định byRef (tham khảo), n tham trị (sau kết thúc hàm, giá trị khơng thay đổi), p tham khảo (Viết có lẽ sai mặt tin học, hiểu nhá ^^) Xét đoạn lệnh: Call Vidu(a, b, c) a m= m=n+p n=p+m p=m+n Kết thúc Sở dĩ n tham trị b n= 2 8 C p= 3 13 13 n n= 5 20 20 p p= 10 10 30 Xét tiếp Call Vidu(a, a, a) m=n+p n=p+m p=m+n Kết thúc m= m= 10 10 30 a= 30 Người biên soạn: Nguyễn Tấn Cường Biến toàn cục, biến cục Xét ví dụ sau (lấy từ đề thi HK2 K11) Dim a As Integer, b As Integer, c As Integer Private Sub Vidu() a = a + 4: b = b + 5: c = c + End Sub Private Sub Command1_Click() Dim a As Integer, b As Integer, c As Integer a = 1: b = 2: c = Call Vidu End Sub Private Sub Command2_Click() Print a; b; c End Sub Câu 27: chạy thủ tục Command2_Click() sau chạy xong, kết in là: a b c d 000 123 456 Tất sai Người biên soạn: Nguyễn Tấn Cường Câu 28: Nếu chạy thủ tục Command1_Click() đầu tiên, tiếp tục chạy tiếp thủ tục Command2_Click() sau chạy xong, kết in là: a b c d 123 456 579 Tất sai Lời giải: Nếu chạy thủ tục Command2_Click(), a, b, c mặc định 0, 0, Chưa có lệnh thực thi liên quan tới a, b, c Nếu chạy thủ tục Command1_Click() đầu tiên, tiếp tục chạy tiếp thủ tục Command2_Click(): Trong phần Vidu, chưa khai báo hết, biến a, b, c lúc Sub Vidu(), nên giá trị ban đầu Biến a,b,c biến toàn cục, biến command1 biến cục bộ! Khi gọi hàm vidu() lấy biến tồn cục để xử lý ko phải biến cục hàm đó, mà biến tồn cục khai báo chưa gán giá trị nên ban đầu a= 0, b= 0, c= Người biên soạn: Nguyễn Tấn Cường Tăng thời gian sống biến: Static Xét ví dụ sau (lấy từ đề thi HK2 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 thủ tục Command1_Click() chạy, máy thị: a b c d Giá trị không xác định Câu 2: Nếu định nghĩa hàm MyFunc() 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 thủ tục Command1_Click() click chạy, máy thị: a b Người biên soạn: Nguyễn Tấn Cường c d Không xác định Câu 3: Nếu định nghĩa hàm MyFunc() sau, Thì sau thủ tục Command1_Click() click chạy, máy thị: Private Static Function MyFunc() Static a as Integer Dim b as Integer a= a+ 1: b= b + 1: MyFunc= a + b End Function a c b d Giá trị không xác định Câu 4: Nếu định nghĩa hàm MyFunc() sau, Thì sau thủ tục Command1_Click() click chạy, máy thị: Private Static Function MyFunc() Static a as Integer Static b as Integer a= a+ 1: b= b + 1: MyFunc= a + b End Function c c d d Giá trị không xác định Người biên soạn: Nguyễn Tấn Cường Truy xuất file: Xét ví dụ sau (lấy từ đề thi HK2 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 = To 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 Print Seek(1) Close #1 End Sub Câu 39: Lệnh Print in kết là: a 25 Byte b 48 Byte c 50 Byte d 96 Byte Câu 40: Lệnh Print in kết là: a x.Name =2 b x.Name =1 c x.Name= d x.Name= Câu 41: Lệnh Print in kết là: a b c d Hướng dẫn giải: Câu 39: Integer chiếm byte, String * 23 chiếm 23byte Có vịng for Đáp án: 50 Người biên soạn: Nguyễn Tấn Cường Câu 40: Ở vị trí thứ 2, theo vịng for, k= 1, x.ID= 1, x.Name = "x.Name =" & x.ID suy x.Name = "x.Name =1" Câu 41: Cứ lần đọc xong record, seek tăng lên Đáp án: Một số lý thuyết cần lưu ý (các lý thuyết đúc kết thơng qua đề thi khóa 2011) 8.1 Hàm (Function): tên hàm tên biến hàm không trùng 8.2 Thủ (Sub): tên thủ tục biến tên biến thủ tục giống 8.3 Combobox= Textbox + Listbox 8.4 Form: dùng tên cho Form button; khơng có quyền dùng tên cho button textbox Tên thủ tục xử lý kiện cho Form bắt đầu Form_ 8.5 Button: button có thuộc tính (Name)= butName thủ tục xử lý kiện button bắt đầu butName_ 8.6 Mặc định, Array bắt có số bắt đầu Khi thêm Option Base {0|1} xác định cận Array 8.7 Thứ tự ưu tiên toán tử VB từ thấp tới cao: luận lý, so sánh, số học (xem thêm slide ^^) Người biên soạn: Nguyễn Tấn Cường