Thông tin tài liệu:
Bài hướng dẫn này bao gồm 3 phần: 1. Ngăn xếp và cách tạo lập; 2. Ký pháp Nghịch đảo BaLan; 3. Viết chương trình. Cả ba phần sẽ được để trong cùng một bài viết cho liên tục.
Nội dung trích xuất từ tài liệu:
VIẾT CHƯƠNG TRÌNH TÍNH GIÁ TRỊ BIỂU THỨC VIẾT CHƯƠNG TRÌNH TÍNH GIÁ TRỊ BIỂU THỨCTác giả: Đặng Nhật AnhCấp độ bài viết: Trung bìnhTóm tắt: Bài tut này có mục đích hướng dẫn các bạn tự viết ra một chương trình tính giá trịbiểu thức toán học đơn giản bằng một số kỹ thuật căn bảnBài hướng dẫn này bao gồm 3 phần: 1. Ngăn xếp và cách tạo lập; 2. Ký pháp Nghịch đảo BaLan; 3. Viết chương trình. Cả ba phần sẽ được để trong cùng một bài viết cho liên tục.Phần 1 - Ngăn xếp và cách tạo lậpI. Giới thiệuNgăn xếp (stack) là một loại cấu trúc dữ liệu tuân theo quy tắc Last In, First Out (LIFO, tứcvào sau cùng, ra trước tiên). Có thể hình dung ngăn xếp như một chồng sách mà mỗi quyểnsách là một phần tử dữ liệu. Quyển sách để lên trên cùng (tức quyển sau cùng) sẽ được lấy rađầu tiên, quyển được bỏ vào đầu tiên thì lấy ra sau cùng.Ngăn xếp có nhiều ứng dụng trong lập trình, đặc biệt là trong các trình xử lý biểu thức, câycú pháp, v.v.Có thể tìm hiểu thêm về ngăn xếp ở Wikipedia. http://vi.wikipedia.org/wiki/Ng%C4%83n_x%E1%BA%BFpII. Phương thức và thuộc tínhTheo mặc định, ngăn xếp có hai phương thức (còn gọi là phép toán) chính yếu:Push: bỏ một phần tử vào ngăn xếp, ở vị trí trên cùng (sau cùng).Pop: lấy phần tử trên cùng (sau cùng) ra khỏi ngăn xếp, trả về giá trị của phần tử đó.Ngoài ra, người ta còn có thể thêm một phương thức nữa:Peek: trả về giá trị phần tử trên cùng của ngăn xếp nhưng không lấy nó ra khỏi ngăn xếp.Thuộc tính Length của ngăn xếp cho biết độ lớn của nó. Nếu ngăn xếp không có phần tửnào, ta có Length = 0.III. Tạo lậpTrong VB6 mặc nhiên không có kiểu dữ liệu ngăn xếp. Do đó ta sẽ tự tạo.Trên lý thuyết, các phần tử trong ngăn xếp có thể có một kiểu bất kỳ. Trong ví dụ sau đây,chúng ta sẽ làm một ngăn xếp chứa các số nguyên, đặt tên là IntStack.Ta tạo ngăn xếp bằng một class, có 3 phương thức Push, Pop, Peek và 1 thuộc tính Length.Đoạn mã của class sẽ như sau: Khai báo các biến, hằng cần thiết Hằng MAX là số lượng tối đa của các phần tử, thêm vào quá số này sẽ báo lỗi Stack OverflowPrivate Const MAX As Integer = 256 1 Mảng chứa các phần tử, phải đặt chỉ số từ 1Private Nodes(1 To MAX) As Integer Biến con trỏ, tức chỉ số của phần tử trên cùng.Private Ptr As Integer Do mặc nhiên Ptr=0, mà khi tạo lập thì ngăn xếp chưa có phầntử nào. Nếu đặt Nodes(0 To MAX-1) thì hóa ra Ptr=0 chỉ phần tử đầutiên, vốn không có. Đó là lý do Nodes(1 To MAX) Phương thức PushPublic Sub Push(ByVal data As Integer) If Ptr < MAX Then Ptr = Ptr + 1 Nodes(Ptr) = data Else Báo lỗi Stack Overflow End IfEnd Sub Phương thức PopPublic Function Pop() As Integer If Ptr > 0 Then Trả về phần tử trên cùng Pop = Nodes(Ptr) Xóa nó khỏi ngăn xếp Nodes(Ptr) = 0 Ptr = Ptr - 1 Đẩy con trỏ xuống Else Báo lỗi Stack Empty Pop = 0 End IfEnd Function Phương thức PeekPublic Function Peek() As Integer If Ptr > 0 Then Trả về phần tử trên cùng Peek = Nodes(Ptr) Else Báo lỗi Stack Empty Peek = 0 End IfEnd Function 2 Thuộc tính LengthPublic Property Get Length() As Integer Length = PtrEnd PropertyBạn thử kiểm tra bằng đoạn mã sau:Dim stack As New IntStackstack.Push 8stack.Push 3MsgBox stack.Pop()MsgBox stack.Peek()MsgBox stack.LengthPhần 2 - Ký pháp Nghịch đảo Ba Lan(Quý vị có thể tham khảo bài Ký pháp Nghịch đảo Ba Lan của bác truongphu ở trong chuyênmục Tut VB & VBA)I. Giới thiệuBình thường, để viết một biểu thức tổng 2 số, ta viết a + b. Cách viết này gọi là trung tố(infix). Bởi vì dấu + (ta gọi là toán tử) nằm ở giữa a, b (toán hạng). Một biểu thức phức tạphơn có thể ở dạng (a + b) * c.Ký pháp Nghịch đảo Ba Lan (Reversed Polish Notation - RPN) là dạng biểu thức hậu tố(postfix), nghĩa là toán tử nằm sau toán hạng.Theo đó, biểu thức a + b viết thành a b +; biểu thức (a + b) * c sẽ viết thành a b + c *.Phương pháp này giúp loại bỏ dấu ngoặc trong các biểu thức, cũng như không phải lưu ý tớimức ưu tiên toán tử (operator precedence).RPN là một phương tiện tốt giúp máy tính đọc được các biểu thức toán học, từ đó tính ragiá trị.Vậy, khi ta nhập một biểu thức toán vào một chương trình tính giá trị biểu thức, nó sẽchuyển biểu thức về dạng RPN, sau đó mới tính toán.Toán tử nhị phân & Toán tử đơn phân: Một toán tử gọi là nhị phân khi nó tác động lên 2toán hạng, vậy cộng (+), trừ (-), nhân ( *), chia (/) và lũy thừa (^) là toán tử nhị phân. Một toántử gọi là đơn phân khi nó chỉ tác động lên 1 toán hạng, vậy dấu âm (-) dương (+) là toán tửđơn phân.II. Trình tự chuyển đổiTrước hết là tạo hai ngăn xếp, đặt t ...