Bài thực hành số 1 buổi 1 176 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ì[.]
Trang 1MÔ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 :
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 :
Trang 23 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 :
Trang 34 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
Trang 4Dim 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
Trang 5testvitri = 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 quẫ con mậ ài trïn bân cúâ
Private Sub InKetqua()
Dim h As Integer, c As Integer
Dim buf As String
songhiem = songhiem + 1
lbOutput.AddItem "Cấch ài thûá : " & songhiem For h = 0 To MAX
' Hiïín thõ hâng lûúái ngang bân cúâ
buf = ""
For c = 0 To MAX
buf = buf & "+ -"
Next c
lbOutput.AddItem buf & "+"
' Hiïín thõ nưåi dung hâng thûá h bân cúâ
buf = ""
For c = 0 To MAX
Trang 6If 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)
Trang 7c = 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
Trang 8InKetqua
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 :
Trang 98 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 :
Trang 109 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ị :
Trang 1112 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ị :
Trang 1214 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 :
Trang 1315 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 :
Trang 1416 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 :
Trang 1520 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 ?