1. Trang chủ
  2. » Tất cả

Hướng dẫn một số dạng bài tập

19 1 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Hướng Dẫn Một Số Dạng Bài Tập
Tác giả Nguyễn Tấn Cường
Trường học Trường Đại Học
Chuyên ngành Tin Học
Thể loại Bài Tập
Định dạng
Số trang 19
Dung lượng 0,96 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

MỘ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 2

Và 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 3

GetAttr ("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 4

Câ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 5

Câ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 6

Câ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 7

Sắ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 8

3 Debug một chương trình:

Trang 9

Ví 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 10

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 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 11

Câ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 12

4 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 13

Lờ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 14

5 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 15

Câ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 16

6 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 17

Câ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 18

7 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 19

Câ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é ^^)

Ngày đăng: 04/04/2023, 10:10

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w