Tải bản đầy đủ (.pdf) (15 trang)

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ố

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (359.14 KB, 15 trang )


Lý Thuyết Đồ Thị Giáo viên: Ts Trần Hành

Nhóm 1 Lớp 07CT113
1
Mụ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









Giới Thiệu

Lý Thuyết Đồ Thị Giáo viên: Ts Trần Hành

Nhóm 1 Lớp 07CT113
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:
Phạm Quang Huy : Thiết kế form , bẫy lổi, làm word.
Nguyễn Thị Thanh Trúc : Tìm hiểu và làm phần chuyển từ trung tố sang hậu tố.
Đới Sỹ Đức: Tìm hiểu và làm phần chuyển từ trung tố sang tiền tố.
Hoàn Khai Nguyên: Tìm hiểu và làm phần tính toán biểu thức tiền tố.
Nguyễn Thị Nữ Việt: Tìm hiểu và làm phần tính toán biểu thức 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).

Lý Thuyết Đồ Thị Giáo viên: Ts Trần Hành

Nhóm 1 Lớp 07CT113
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

Lý Thuyết Đồ Thị Giáo viên: Ts Trần Hành

Nhóm 1 Lớp 07CT113
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ó:

Lý Thuyết Đồ Thị Giáo viên: Ts Trần Hành

Nhóm 1 Lớp 07CT113
5


a 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:

Lý Thuyết Đồ Thị Giáo viên: Ts Trần Hành

Nhóm 1 Lớp 07CT113
6
2.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"

Lý Thuyết Đồ Thị Giáo viên: Ts Trần Hành


Nhóm 1 Lớp 07CT113
7
10. Đọ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-/

Lý Thuyết Đồ Thị Giáo viên: Ts Trần Hành

Nhóm 1 Lớp 07CT113

8
Bướ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
2
10

1
1
1
1
7
7
3




5



3
3
6

4









2



















1
2
3
4
5
6
7
8
9
10
11
12
1
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

Lý Thuyết Đồ Thị Giáo viên: Ts Trần Hành

Nhóm 1 Lớp 07CT113
9


Ngô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
Private Function KiemTra(ByVal a As Char)
Select Case a
Case "0" To "9"
KiemTra = 1
Case "+", "-", "*", "/", "(", ")", "^"
KiemTra = 2
Case Else
KiemTra = 0
End Select
End Function
Private Function xetdau(ByVal a As Char)
Select Case a
Case "*", "/", "^"
xetdau = 1
Case "-"
xetdau = 2
Case "+"
xetdau = 3
Case Else
xetdau = 0
End Select
End Function

3.2- Chuyển một biểu thức dưới dạng trung tố sang tiền tố
Private Function TienTo()

Lý Thuyết Đồ Thị Giáo viên: Ts Trần Hành


Nhóm 1 Lớp 07CT113
10
Dim S As New Stack
Dim len As Integer
Dim P As String = String.Empty
Dim N As Char() = tx1.Text.ToCharArray
Dim i As Integer
len = tx1.Text.Length - 1
For i = len To 0 Step -1
If KiemTra(N(i)) = 1 Then
P = N(i) + P
End If
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
End If
S.Push(N(i))
End If
End If

Else
While S.Count <> 0

Lý Thuyết Đồ Thị Giáo viên: Ts Trần Hành

Nhóm 1 Lớp 07CT113
11
If (S.Peek <> ")") Then
P = S.Pop + P
Else
S.Pop()
Exit While
End If
End While
End If
End If
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
End If
End If
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ố
Private Function TinhTienTo(ByVal str As String)

Lý Thuyết Đồ Thị Giáo viên: Ts Trần Hành

Nhóm 1 Lớp 07CT113
12
Dim s1 As New Stack
Dim ViTri As Integer = str.Length - 1
For i As Integer = str.Length - 2 To 0 Step -1
If str(i) = " " Or KiemTra(str(i)) = 2 And KiemTra(str(i +
_ 1)) <> 2 Then
Dim str1 As String = String.Empty
For index As Integer = i + 1 To ViTri
str1 += str(index)
Next
If str1 <> String.Empty Then
s1.Push(CDbl(str1))
ViTri = i - 1
End If
End If
If KiemTra(str(i)) = 2 Then
Dim a As Double = s1.Pop
Dim b As Double = s1.Pop
Select Case 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))
Case Else

Lý Thuyết Đồ Thị Giáo viên: Ts Trần Hành

Nhóm 1 Lớp 07CT113
13
Return 0
End Select
End If
Next
TinhTienTo = s1.Pop
s1.Clear()
End Function


















Chương 4: Kết Quả


Lý Thuyết Đồ Thị Giáo viên: Ts Trần Hành

Nhóm 1 Lớp 07CT113
14











Chươ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ê

Lý Thuyết Đồ Thị Giáo viên: Ts Trần Hành

Nhóm 1 Lớp 07CT113
15

2. 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


×