MÔN : NHẬP MÔN ĐIỆN TOÁN
Bài thực hành số 4.1 : Tính hiệu quả của trình thông dịch và biên dịch
Mục tiêu sinh viên cần đạt được:
-
Thấy rõ việc sử dụng trình thông dịch và trình biên dịch cùng các tính chất của chúng.
1. Chạy VB 6.0, cửa sổ hiển thị như sau :
2. Chọn button "Open" để tạo Project mới theo dạng "Standard EXE", cửa sổ thiết kế Form ứng dụng ban đầu như sau :
3. Thiết kế Form có 2 đối tượng : 1 button và 1 Listbox như hình dưới đây. Để vẽ 1 đối tượng giao diện, dời chuột về icon miêu tả nó trong cửa sổ Toolbox bên trái, chọn icon, dời chuột về vị trí cần vẽ trong Form rồi vẽ nó. Chọn đối tượng Button, đặt tên cho nó là btnStart, caption cho nó là Start như hình dưới đây :
4. Tương tự, chọn đốitượng ListBox và đặt tên cho nó là lbOutput. Ấn kép chuột vào button để tạo thủ tục xử lý sự kiện Click chuột cho nó rồi viết đoạn code VB sau đây :
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Private Declare Sub GetLocalTime Lib "kernel32" (lpSystemTime As SYSTEMTIME)
Private Declare Function GetTickCount Lib "kernel32" () As Long
Const MAX = 7
Dim songhiem As Integer
Dim hang(MAX + 1) As Integer
' kiem tra xem co the dat con hau o vi tri h,c ?
' tra ve TRUE neu duoc, FALSE neu khong
Private Function testvitri(ByVal h As Integer, ByVal c As Integer) As Boolean
Dim c1 As Integer
Dim h1 As Integer
' xem co con hau nao nam o hang h ?
For c1 = 0 To c - 1
If hang(c1) = h Then
testvitri = False
Exit Function
End If
Next c1
' co con hau nao nam tren duong cheo tren trai - duoi phai
c1 = c - 1: h1 = h - 1
While (c1 >= 0) And (h1 >= 0)
If hang(c1) = h1 Then
testvitri = False
Exit Function
End If
h1 = h1 - 1: c1 = c1 - 1
Wend
' xem co con hau nao nam tren duong cheo tren phai - duoi trai
c1 = c - 1: h1 = h + 1
While (c1 >= 0) And (h1 <= MAX)
If hang(c1) = h1 Then
testvitri = False
Exit Function
End If
h1 = h1 + 1: c1 = c1 - 1
Wend
testvitri = True
End Function
' Tim vi tri hang cho con hau o cot c
Private Function timvitri(ByVal c As Integer) As Integer
Dim h As Integer
Dim hmin As Integer
hmin = hang(c) + 1
For h = hmin To MAX ' thu hang h
If testvitri(h, c) Then
timvitri = h
Exit Function
End If
Next h
timvitri = -1
End Function
' In kïët quaã con maä ài trïn baân cúâ
Private Sub InKetqua()
Dim h As Integer, c As Integer
Dim buf As String
songhiem = songhiem + 1
lbOutput.AddItem "Caách ài thûá : " & songhiem
For h = 0 To MAX
' Hiïín thõ haâng lûúái ngang baân cúâ
buf = ""
For c = 0 To MAX
buf = buf & "+---"
Next c
lbOutput.AddItem buf & "+"
' Hiïín thõ nöåi dung haâng thûá h baân cúâ
buf = ""
For c = 0 To MAX
If hang(c) = h Then
buf = buf & "| x "
Else
buf = buf & "| "
End If
Next c
lbOutput.AddItem buf & ("|")
Next h
' Hiïín thõ haâng lûúái ngang baân cúâ cuöëi cuâng
buf = ""
For c = 0 To MAX
buf = buf & "+---"
Next c
lbOutput.AddItem buf & "+"
End Sub
Private Sub btnStart_Click()
Dim h As Integer, c As Integer
Dim stime As Long
Dim etime As Long
' xoa listbox
lbOutput.Clear
' ghi nhan thoi diem bat dau chay giai thuat
stime = GetTickCount
songhiem = 0
' khoi dong trang thai xuat phat
For c = 0 To MAX
hang(c) = -1
Next c
songhiem = 0
' bat dau dat con hau vao vi tri 0,0
hang(0) = 0
' bat dau tim con hau cho cot thu hai (1)
c = 1
Lap:
While c <= MAX
' tim con hau cho cot c
h = timvitri(c)
If h >= 0 Then 'tim duoc
hang(c) = h
c = c + 1
GoTo tieptuc
End If
' tim khong duoc
If c > 0 Then
hang(c) = -1
c = c - 1
GoTo tieptuc
End If
' het cach --> dung chuong trinh
lbOutput.AddItem "So nghiem la " & songhiem
'thu chay them 1 thoi gian nua
For h = 1 To 10000
For c = 1 To 10000
h = h: c = c
Next c
Next h
' ghi nhan thoi diem ket thuc chay giai thuat
etime = GetTickCount
diff = etime - stime
'hien thi tong thoi gian chay
lbOutput.AddItem "Chuong trinh chay ton " & diff & " ms"
Exit Sub
tieptuc:
Wend
' tim duoc nghiem
InKetqua
c = c - 1
GoTo Lap
End Sub
5. Chọn menu File.Save Project As..., cửa sổ sau sẽ hiển thị :
6. Duyệt hệ thống file và chọn thư mục lưu các file của Project ứng dụng.
7. Chọn menu Run.Start để chạy ứng dụng, Khi cửa sổ ứng dụng hiển thị, dời chuột về button Start rồi click chuột trên nó để chạy giải thuật "xếp 8 con hậu trên bàn cờ sao cho chúng không thể ăn nhau". Đợi 1 lúc, cửa sổ ứng dụng sẽ hiển thị kết quả như sau :
8. Dời marker trên scrollbar của Listbox về dưới đáy Listbox để hiển thị nội dung cuối cùng của Listbox như hình sau :
9. Bạn sẽ thấy số lượng thời gian chạy giải thuật.
10. Tiếp tục ấn button Start nhiều lần, mỗi lần quan sát và ghi nhận lại thời gian chạy.
11. Chọn menu File.Make Project1.exe, cửa sổ sau sẽ hiển thị :
12. Duyệt hệ thống file về thư mục chứa Project rồi ấn button OK để máy lưu file khả thi tương ứng vào thư mục tương ứng.
13. Chạy trình Windows Explorer, duyệt tìm thư mục chứa Project ứng dụng, chọn nó để hiển thị các file trong Project. Dời chuột về file Project1.exe, ấn kép chuột vào nó để chạy ứng dụng, cửa sổ sau sẽ hiển thị :
14. Dời chuột về button Start rồi click chuột trên nó để chạy giải thuật "xếp 8 con hậu trên bàn cờ sao cho chúng không thể ăn nhau". Đợi 1 lúc, cửa sổ ứng dụng sẽ hiển thị kết quả như sau :
15. Dời marker trên scrollbar của Listbox về dưới đáy Listbox để hiển thị nội dung cuối cùng của Listbox như hình sau :
16. Bạn sẽ thấy số lượng thời gian chạy giải thuật.
17. Tiếp tục ấn button Start nhiều lần, mỗi lần quan sát và ghi nhận lại thời gian chạy.
18. So sánh các giá trị thời gian chạy ứng dụng ở bước 10 và ở bước 17. Lý giải vì sao giá trị thời gian ở bước 17 nhỏ hơn nhiều so với ở bước 10, từ đó thấy rõ ưu điểm của trình biên dịch so với trình thông dịch.
19. Bây giờ đóng cửa sổ VB 6.0, chọn Start.All Program.Accessories.Command Prompt để mở cửa sổ hàng lệnh như sau :
20. Nhập thử lần lượt các lệnh sau :
cd \
dir /w
type Form.bas
...
và quan sát kết quả xử lý từng lệnh mà bạn nhập vào. Bạn thử nghĩ xem có thể dùng trình biên dịch các lệnh trong trường hợp này không ? Hay là cách khả thi duy nhất là dùng trình thông dịch để dịch chạy từng lệnh ngay sau khi người dùng nhập vào ?
Chia sẻ với bạn bè của bạn: |