1. Trang chủ
  2. » Luận Văn - Báo Cáo

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ố

15 5,6K 3

Đ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

Định dạng
Số trang 15
Dung lượng 359,14 KB

Nội dung

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

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

Trang 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"

Trang 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-/

Trang 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

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

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 10

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

If (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 12

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

Return 0

EndSelect

EndIf

Next

TinhTienTo = s1.Pop

s1.Clear()

EndFunction

Chương 4: Kết Quả

Trang 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ê

Trang 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

Ngày đăng: 18/09/2014, 12:21

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w