- Biểu diễn biểu thức bằng cây nhị phân - Tinh giá trị của biểu thức dưới dạng tiền tố , hậu tố.. Khi viết biểu thức biểu diễn phép toán đó ta có thể đặt ký hiệu toán tử ở trước ký phá
Trang 1Mục lục:
Đề tài và Phân công công việc……… ……… trang Chương 1: Khái Niệm Cơ Bản……… trang
1.1.Khái niệm ký pháp tiền tố, trung tố, hậu tố……… trang 1.2.Cây biểu diễn biểu thức……….trang Chương 2: Phân tích bài toán………trang
2.1.Mục đích………trang 2.2.Giải thuât………trang 2.2.1.Đưa một biểu thức số học có chứa các phép toán +,-,*,/,^ về dạng trung tố, tiền tố, hậu tố………trang 2.2.2- Thuật toán tính giá trị của một biểu thức biểu diễn dưới dạng tiền tố hoặc hậu tố………trang Chương 3: Xây Dựng Chương Trình……….trang
3.1- Hàm kiểm tra biểu thức nhập vào……….trang 3.2- Chuyển một biểu thức dưới dạng trung tố sang tiền tố…trang 3.3- Chuyển một biểu thức dưới dạng trung tố sang hậu tố…trang 3.4 Tính giá trị của biểu thức dưới dạng tiền tố……….trang 3.5 Tính giá trị của biểu thức dưới dạng hậu tố……….trang Chương 4: Kết Quả……… trang Chương 5 : Tài Liệu Tham Khảo……… trang
Trang 2Đề tài :
- Ký pháp trung tố, tiền tố, hậu tố
- Đưa một biểu thức số học có chứa các phép toán +,-,*,/,^ về dạng trung tố, tiền tố, hậu tố
- Biểu diễn biểu thức bằng cây nhị phân
- Tinh giá trị của biểu thức dưới dạng tiền tố , hậu tố
Phân công công việc:
Nguyễn Thị Thanh Trúc : Tìm hiểu và làm phần chuyển từ trung tố sang hậu tố
Chương 1: Khái Niệm Cơ Bản
1.1khái niệm ký pháp trung tố, tiền tố, hậu tố:
Là các phương pháp biểu diễn phép toán hai ngôi
Một phép toán hai ngôi trên tập hợp X là một ánh xạ f: X×X → X cho
(a,b) f(a,b) A Ánh xạ f khi đó thường được ký hiệu bởi *, được gọi là toán tử, các phần tử a, b được gọi là các hạng tử (còn gọi là toán hạng)
Trang 3 Khi viết biểu thức biểu diễn phép toán đó ta có thể đặt ký hiệu toán tử ở trước (ký pháp tiền tố), sau (ký pháp hậu tố) hoặc giữa (ký pháp trung tố) các toán hạng
Thông thường trong các biểu thức đại và số học, ta viết ký hiệu phép toán
giữa hai hạng tử, đó là ký pháp trung tố Ví dụ: a + b, a * b, Khi một biểu
thức có nhiều phép toán, ta dùng các cặp dấu ngoặc "(", ")" và thứ tự ưu tiên các phép toán để chỉ rõ thứ tự thực hiện các phép toán (Các phép toán đều quy về phép toán 2 ngôi.)
Ta cũng có thể viết hai hạng tử trước và kí hiệu toán tử sau ( ký pháp hậu tố hay còn gọi là ký pháp BaLan đảo) Chẳng hạn:
Ví dụ: a + b viết là a b +; a * b viết là a b *
Cũng có thể viết toán tử trước, hai toán hạng sau ( ký pháp tiền tố hay còn gọi là ký pháp BaLan ) Chẳng hạn:
Ví dụ: a + b viết là + a b; a * b viết là * a b
Về lý thuyết, ký pháp tiền tố và ký pháp hậu tố còn có thể được mở rộng cho các phép toán ba ngôi hoặc nhiều hơn mà vẫn không phải dùng tới dấu ngoặc
để thể hiện độ ưu tiên các phép toán, tương tự với hàm số đa biến, còn ký pháp trung tố thì không thể Tuy nhiên, trong thực tế không có nhiều phép toán đa ngôi và ký pháp trung tố vẫn được dùng rộng rãi vì thói quen
Ví dụ: + a b c có thể được hiểu là tổng của 3 số a, b và c trong ký pháp tiền tố Tương tự, f a b c có thể được hiểu là hàm f của 3 biến a, b và c
trong ký pháp tiền tố
1.2.Cây biểu diễn biểu thức
Dùng cây nhị phân để biểu diển biểu thức có thể thấy rõ hơn về trình tự tính toán biểu thức
Trang 4 Duyệt cây nhị phân trong hình trên theo trung thứ tự là:
a + b c d / 2
Duyệt cây theo tiền thứ tự ta sẽ có:
+ a b c / d 2
Duyệt cây theo hậu thứ tự ta sẽ có:
Trang 5a b + c d 2 /
Với cách duyệt theo trung thứ tự bỏ các dấu ngoặc như trên sẽ gây ra sai lệch trong việc tính toán biểu thức Vì biểu thức a + b * c – d / 2 có thể hiểu theo nhiều cách a + (b*c-d) / 2 hay a + (b * c) – d / 2
Còn với cách duyệt theo tiền thứ tự hay hậu thứ tự sẽ chỉ xác định được một biểu thức duy nhất (a + b) * (c-(d/2))
Vì vậy khi tính toán một biểu thức toán học bất kỳ, ta sẽ đưa biểu thức toán học về dạng tiền tố hoặc hậu tố để dể tính toán
Chương 2: phân tích bài toán
2.1.Mục đích:
Trang 62.1.1.Đưa một biểu thức số học có chứa các phép toán +,-,*,/,^ về dạng trung tố, tiền tố, hậu tố
2.1.2.Biểu diễn giá trị của biểu thức bằng cây nhị phân
2.1.3.Tính giá trị của biểu thức dưới dạng tiền tố, hậu tố
2.2 Giải thuật
2.2.1.Đưa một biểu thức số học có chứa các phép toán +,-,*,/,^ về dạng trung tố, tiền tố, hậu tố
Việc tính giá trị một biểu thức viết dưới dạng phép toán sau rất thuận tiện như trên, tuy nhiên, theo thói quen thông thường, việc nhập biểu thức đó vào lại không dễ, người ta thường nhập vào một công thức dưới dạng thông thường (phép toán giữa) rồi dùng chương trình chuyển đổi nó sang dạng phép toán sau Chúng ta hãy xét biểu thức trong ví dụ trên
Q=a*(b+c)-d^5
Kí hiệu biểu thức ghi dưới dạng phép toán sau là P Trong quá trình chuyển đổi ta dùng một stack S để lưu các phần tử trong P chưa sử dụng đến Khi
đọc từ trái sang phải biểu thức Q la lần lượt có:
1 Đọc và ghi nhận giá trị a, ghi giá trị a vào P Vậy P = "a"
2 Đọc toán tử "*" Đưa toán tử này vào stack S: S = "*"
3 Đọc dấu ngoặc mở "(", đưa dấu ngoặc này vào stack: S = "*("
4 Đọc hạng tử b, đưa b vào P: P= "a b"
5 Đọc toán tử "+", đặt "+" vào stack: S ="*(+"
6 Đọc hạng tử "c", đưa c vào cuối P: P="a b c"
7 Đọc dấu ngoặc đóng ")" Lần lượt lấy các toán tử ở cuối stack ra khỏi stack đặt vào cuối P cho đến khi gặp dấu ngoặc mở "(" trong stack thì
giải phóng nó: S= "*"; P="a b c +"
8 Đọc toán tử "-" Cuối stack S có toán tử "*" có mức ưu tiên lớn hơn
toán tử "-", ta lấy toán tử "*" ra khỏi stack, đặt vào cuối P, đặt toán tử
"-" vào stack: S="-"; P=" a b c + * "
9 Đọc hạng tử d, đưa d vào cuối P P="a b c + * d"
Trang 710 Đọc toán tử "^", đưa toán tử "^" vào cuối stack: S="-^"
11 Đọc hằng số 5, đưa 5 vào cuối P: P="a b c + * d 5"
Đã đọc hết biểu thức Q, lần lượt lấy các phần tử cuối trong stack đặt vào P cho đến hết P="a b c + * d 5 ^ -"
Thuật toán chuyển từ ký pháp trung tố sang ký pháp tiền tố hoặc hậu tố rất gần với cách xử lý các phép tính trong máy tính bấm tay (hay máy tính bỏ túi) Một biểu thức chỉ gồm các phép toán hai ngôi bất kỳ luôn có thể được tính bằng máy tính bấm tay mà không cần dùng dấu ngoặc Các phép toán ở trước nếu có độ ưu tiên (ưu tiên bởi toán tử hoặc bởi dấu ngoặc) thấp hơn
một phép toán ở sau được đẩy vào một hàng chờ (stack), chỉ khi nào các
phép toán ưu tiên hơn ở sau được tính xong, các phép toán ở trước mới được
xử lý
2.2.2- Thuật toán tính giá trị của một biểu thức biểu diễn dưới dạng tiền tố hoặc hậu tố
Thuật toán: biểu thức đưa vào là gồm n ký hiệu chứa các ký hiệu số hoặc ký hiệu
toán học, được biểu diển dưới dạng hậu tố ( Tương tự tiền tố)
Ấn định k =1
Khảo sat ký hiệu thứ k Nếu là biến, thì đưa vào ngăn xếp Ngược lại, nếu là toán tử thì thì lấy hai khoản mục ra khỏi ngăn xếp, thực hiện phép toán rồi đưa trở lại ngăn xếp
Nếu k = n thì thuật toán chấm dứt và đáp số cuối cùng nằm trên ngăn xếp, ngược lại thì k tăng thêm 1 và lặp lại bước 2
Ví dụ: Tính biểu thức ( 8 + 2 * 5 ) / ( 1 + 3 * 2 – 4 )
Chuyển về công thức hậu tố: 8 2 5*+1 3 2*+4-/
Trang 8Bước
1
2
3
4
5
6
7
8
9
10
11
12
13
8 2 5 * + 1 3 2 *- 4 - /
2 5 * + 1 3 2 * + 4 - /
5 * + 1 3 2* + 4 - /
* + 1 3 2* + 4 - /
+ 1 3 2* + 4 - /
1 3 2* + 4 - /
3 2* + 4 - /
2* + 4 - /
* + 4 - /
+ 4 - /
4 - /
- /
/
Lưu 8 vào Stack Lưu 2 vào Stack Lưu 5 vào Stack Thực hiện 2*5 =10 lưu 10 vào Stack Thực hiện 10 + 8 = 18 lưu 18 vào Stack Lưu 1 vào Stack
Lưu 3 vào Stack Lưu 2 vào Stack Thực hiện 3 * 2 = 6 lưu 6 vào Stack Thực hiện 1 + 6 = 7 lưu 7 vào Stack Lưu 4 vào Stack
Thực hiện 7 – 4 = 3 lưu 3 vào Stack Thực hiện 18/3 = 6 lưu vào Stack ( Kết quả cuối )
Chương 3: Xây Dựng Chương Trình
8 8 8 8 18 18 18 18 18 18 18 18 6
2
3 Các bước thực hiện khi tính toán biểu thức BaLan
Ngăn xếp theo các bước tương ứng
Trang 9Ngôn ngữ sử dụng : Visual Basic 2005
3.2- Hàm kiểm tra độ ưu tiên của các phép toán
PrivateFunction KiemTra(ByVal a AsChar)
Select Case a
Case "0" To "9"
KiemTra = 1
Case "+", "-", "*", "/", "(", ")", "^"
KiemTra = 2
CaseElse
KiemTra = 0
End Select
EndFunction
PrivateFunction xetdau(ByVal a AsChar)
Select Case a
Case "*", "/", "^"
xetdau = 1
Case "-"
xetdau = 2
Case "+"
xetdau = 3
CaseElse
xetdau = 0
End Select
EndFunction
3.2- Chuyển một biểu thức dưới dạng trung tố sang tiền tố
Trang 10Dim S As New Stack
Dim len As Integer
Dim P As String = String.Empty
Dim N AsChar() = tx1.Text.ToCharArray
Dim i AsInteger
len = tx1.Text.Length - 1
For i = len To 0 Step -1
If KiemTra(N(i)) = 1 Then
P = N(i) + P
EndIf
If KiemTra(N(i)) = 2 Then
P = " " + P
If N(i) <> "(" Then
If S.Count = 0 Then
S.Push(N(i))
Else
If xetdau(S.Peek) > xetdau(N(i)) Then
S.Push(N(i))
Else
If S.Peek = ")" Then
S.Pop()
Else
P = S.Pop + P
EndIf
S.Push(N(i))
EndIf
EndIf
Else
While S.Count <> 0
Trang 11If (S.Peek <> ")") Then
P = S.Pop + P
Else
S.Pop()
ExitWhile
EndIf
EndWhile
EndIf
EndIf
Next
While S.Count <> 0
P = S.Pop + P
End While
'xoa khoang trang du
i = 1
While i < P.Length - 2
If P(i) = " " Then
If KiemTra(P(i + 1)) <> 1 Or KiemTra(P(i - 1)) <> 1 Then
P = P.Remove(i, 1)
i -= 1
EndIf
EndIf
i += 1
End While
TienTo = P
S.Clear()
3.4 Tính giá trị của biểu thức dưới dạng tiền tố
Trang 12Dim s1 AsNew Stack
Dim ViTri As Integer = str.Length - 1
For i AsInteger = str.Length - 2 To 0 Step -1
If str(i) = " " Or KiemTra(str(i)) = 2 And KiemTra(str(i +
_ 1)) <> 2 Then
Dim str1 AsString = String.Empty
For index AsInteger = i + 1 To ViTri
str1 += str(index)
Next
If str1 <> String.Empty Then
s1.Push(CDbl(str1))
ViTri = i - 1
EndIf
EndIf
If KiemTra(str(i)) = 2 Then
Dim a AsDouble = s1.Pop
Dim b AsDouble = s1.Pop
SelectCase str(i)
Case "+"
s1.Push(CDbl(a + b))
Case "-"
s1.Push(CDbl(a - b))
Case "*"
s1.Push(CDbl(a * b))
Case "/"
s1.Push(CDbl(a / b))
Case "^"
s1.Push(CDbl(a ^ b))
CaseElse
Trang 13Return 0
EndSelect
EndIf
Next
TinhTienTo = s1.Pop
s1.Clear()
EndFunction
Chương 4: Kết Quả
Trang 14Chương 5 : Tài Liệu Tham Khảo
1 Cấu Trúc Máy Tính Cơ Bản
Tổng hợp và biên dịch : VN-GUIDE
Nhà xuất bản thống kê
Trang 152 Giáo trình lý thuyết đồ thị - Ts Trần Hành
Trường Đại Học Lạc Hồng
3 Giáo Trình Toán Rời Rạc
Trường Đại Học Sư Phạm Huế
Xuất bản vào mùa thu 2003