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

Bài tập lớn nghiên cứu cài đặt chương trình chuyển một biểu thức ở dạng trung tố sang dạng ký pháp hậu tố ký pháp đảo ba lan

17 6 0

Đ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

Tiêu đề Nghiên Cứu Cài Đặt Chương Trình Chuyển Một Biểu Thức Ở Dạng Trung Tố Sang Dạng Ký Pháp Hậu Tố (Ký Pháp Đảo Ba Lan)
Tác giả Trần Quang Khải
Trường học Trường Đại Học Kinh Tế Quốc Dân
Chuyên ngành Nguyên Lý Ngôn Ngữ Lập Trình
Thể loại bài tập lớn
Năm xuất bản 2017
Thành phố Hà Nội
Định dạng
Số trang 17
Dung lượng 326,01 KB

Nội dung

Các hoạt động cơ bản trên cấu trúc dữ liệu ngăn xếp...8Chương III: ỨNG DỤNG STACK ĐỂ CHUYỂN BIỂU THỨC TỪ DẠNG TRUNG TỐ SANG HẬU TỐ.... Xây dựng phép dịch biểu thức trung tố sang dạng hậu

TRƯỜNG ĐẠI HỌC KINH TẾ QUỐC DÂN VIỆN CÔNG NGHỆ THÔNG TIN – KINH TẾ **************************** o Bá o cá BÀI TẬP LỚN ực th NGUYÊN LÝ NGÔN NGỮ LẬP TRÌNH p tậ tổ ng Đề tài: Nghiên cứu cài đặt chương trình chuyển biểu thức dạng trung tố sang dạng ký pháp hậu tố (Ký pháp đảo Ba Lan) p hợ Họ tên: Trần Quang Khải Mã sinh viên: 11146120 Lớp tín chỉ: Ngun lý ngơn ngữ lập trình(216)_1 Hà Nội, Năm 2017 MỤC LỤC LỜI MỞ ĐẦU NỘI DUNG Chương I: CƠ SỞ LÝ THUYẾT VỀ KÝ PHÁP BA LAN .4 1.1 Ký pháp Ba Lan 1.2 Ký pháp nghịch đảo Ba Lan 1.3 Các phương pháp biểu diễn phép tốn hai ngơi Bá Chương II: CẤU TRÚC DỮ LIỆU NGĂN XẾP (STACK) Giới thiệu Ngăn xếp (Stack) 2.2 Biểu diễn cấu trúc liệu ngăn xếp (Stack) 2.3 Các hoạt động cấu trúc liệu ngăn xếp o 2.1 o cá 3.1 ực th Chương III: ỨNG DỤNG STACK ĐỂ CHUYỂN BIỂU THỨC TỪ DẠNG TRUNG TỐ SANG HẬU TỐ Xây dựng phép dịch biểu thức trung tố sang dạng hậu tố tậ p 3.2 Giải thuật dịch biểu thức dạng ký pháp trung tố sang biểu thức dạng ký pháp hậu tố tổ Chương IV: CÀI ĐẶT CHƯƠNG TRÌNH TRÊN NGƠN NGỮ LẬP TRÌNH C 12 ng Định hình 12 4.2 Viết chương trình 12 4.3 Test chương trình 14 p hợ 4.1 KẾT LUẬN 16 Tài liệu tham khảo: 17 LỜI MỞ ĐẦU Ký pháp Ba lan (Polish notation), gọi ký pháp tiền tố (Prefix notation), cách viết biểu thức đại số thuận lợi cho việc thực phép toán Đặc điểm cách viết không cần dùng đến dấu ngoặc thực từ trái sang phải Mục đích đề tài nhằm giới thiệu sở lý thuyết ký pháp nghịch đảo Ba Lan, thuật toán chuyển biểu thức từ dạng trung tố sang hậu tố cài đặt chương trình ngơn ngữ lập trình C o Bá Chương 1: Cơ sở lý thuyết ký pháp Ba Lan Chương 2: Cấu trúc liệu Ngăn xếp (Stack) cá Chương 3: Ứng dụng Stack để chuyển biểu thức từ dạng trung tố sang hậu tố o ực th Chương 4: Cài đặt chương trình ngơn ngữ lập trình C p tậ ng tổ p hợ NỘI DUNG Chương I: CƠ SỞ LÝ THUYẾT VỀ KÝ PHÁP BA LAN 1.1 Ký pháp Ba Lan Ký pháp Ba lan (tiếng Anh: Polish notation), gọi ký pháp tiền tố (tiếng Anh: prefix notation), cách viết biểu thức đại số thuận lợi cho việc thực phép toán Đặc điểm cách viết không cần dùng đến dấu ngoặc thực từ trái sang phải o Bá o cá ực th tậ p Jan Łukasiewicz tổ ng Kí pháp Ba Lan nhà logic toán Jan Łukasiewicz đề xuất khoảng năm 1920 Jan Łukasiewicz nhà toán học người Ba Lan Ơng sinh Lwów, Galicia (nay Lviv, Ukraina) Lĩnh vực nghiên cứu ơng logic tốn hợ p Khi lập trình, tính giá trị biểu thức toán học điều đỗi bình thường Tuy nhiên, nhiều ứng dụng (như chương trình vẽ đồ thị hàm số chẳng hạn, chương trình cho phép người dùng nhập vào hàm số), ta cần phải tính giá trị biểu thức nhập vào từ bàn phím dạng chuỗi Với biểu thức toán học đơn giản (như a+b) bạn tự làm phương pháp tách chuỗi “thủ công” Nhưng để “giải quyết” biểu thức có dấu ngoặc, ví dụ (a+b)*c + (d+e)*f ,  phương pháp tách chuỗi đơn giản khơng khả thi Trong tình này, ta phải dùng đến Ký Pháp Nghịch Đảo Ba Lan (Reserve Polish Notation – RPN), thuật toán “kinh điển” lĩnh vực trình biên dịch 1.2 Ký pháp nghịch đảo Ba Lan Cách trình bày biểu thức theo cách thơng thường tự nhiên với người lại “khó chịu” máy tính khơng thể cách tường minh q trình tính tốn để đưa giá trị biểu thức Để đơn giản hóa q trình tính tốn này, ta phải biến đổi lại biểu thức thông thường dạng hậu tố - postfix (cách gọi ngắn thuật ngữ ký pháp nghịch đảo Ba Lan) Để phân biệt hai dạng biểu diễn biểu thức, ta gọi cách biểu diễn biểu thức theo cách thơng thường trung tố - infix (vì tốn tử nằm hai toán hạng) Ký pháp nghịch đảo Ba Lan phát minh vào khoảng thập kỷ 1950 Charles Hamblin - triết học gia khoa học gia máy tính người Úc - dựa theo cơng trình ký pháp Ba Lan nhà Tốn học người Ba Lan Jan Łukasiewicz Hamblin trình bày nghiên cứu hội nghị khoa học vào tháng năm 1957 thức cơng bố vào năm 1962 Bá o Theo cách biểu diễn này, toán tử đặt sau toán hạng Cụ thể biểu thức trung tố: 4+5 biểu diễn lại thành + cá Q trình tính toán giá trị biểu thức hậu tố tự nhiên máy tính o th Các phương pháp biểu diễn phép tốn hai ngơi ực 1.3 Một phép tốn hai ngơi tập hợp X ánh xạ f: X×X→X cho tậ p Ánh xạ f thường ký hiệu *, gọi toán tử, phần tử a, b gọi hạng tử (cịn gọi tốn hạng) tổ ng Biểu thức trung tố hiểu đơn giản tức toán tử đặt hai toán hạng, dĩ nhiên phải tốn tử hai ngơi Vậy dựa vào vị trí của tốn tử, liệu ta biểu diễn biểu thức đại số dạng khác? Câu trả lời được, nói, ta có ba cách biểu thức tiền tố (prefix), trung tố (infix) hậu tố (postfix) p hợ  Prefix: Biểu thức tiền tố biểu diễn cách đặt toán tử lên trước toán hạng Cách biểu diễn biết đến với tên gọi “ký pháp Ba Lan” nhà toán học Ba Lan Jan Łukasiewicz phát minh năm 1920 Với cách biểu diễn này, thay viết x+y dạng trung tố, ta viết +xy Tùy theo độ ưu tiên toán tử mà chúng xếp khác nhau, bạn xem số ví dụ phía sau phần giới thiệu  Postfix: Ngược lại với cách Prefix, tức toán tử đặt sau toán hạng Cách biểu diễn gọi “ký pháp nghịch đảo Ba Lan” viết tắt RPN (Reverse Polish notation), phát minh vào khoảng thập kỷ 1950 triết học gia nhà khoa học máy tính Charles Hamblin người Úc Về lý thuyết, ký pháp tiền tố ký pháp hậu tố cịn mở rộng cho phép tốn ba nhiều mà dùng tới dấu ngoặc để thể độ ưu tiên phép tốn, tương tự với hàm số đa biến, cịn ký pháp trung tố khơng thể Tuy nhiên, thực tế khơng có nhiều phép tốn đa ngơi ký pháp trung tố dùng rộng rãi thói quen Một số ví dụ: Prefix Postfix x+y +xy xy+ x+y-z -+xyz xy+z - x+y*z +x*yz xyz*+ +x-yz xyz-+ x+(y-z) o Bá Infix o cá ực th p tậ ng tổ p hợ Chương II: CẤU TRÚC DỮ LIỆU NGĂN XẾP (STACK) 2.1 Giới thiệu Ngăn xếp (Stack) Một ngăn xếp là cấu trúc liệu trừu tượng, sử dụng hầu hết ngôn ngữ lập trình Đặt tên ngăn xếp hoạt động ngăn xếp đời sống thực, ví dụ cỗ hay chồng đĩa, … Trong đời sống thực, ngăn xếp cho phép hoạt động vị trí ngăn xếp Ví dụ, đặt thêm hay đĩa vào ngăn xếp Do đó, cấu trúc liệu trừu tượng ngăn xếp cho phép thao tác liệu vị trí Tại thời điểm nào, truy cập phần tử ngăn xếp o Bá Đặc điểm làm cho ngăn xếp trở thành cấu trúc liệu dạng LIFO LIFO viết tắt Last-In-First-Out Ở đây, phần tử đặt vào (được chèn, thêm vào) cuối truy cập Trong thuật ngữ ngăn xếp, hoạt động chèn gọi hoạt động PUSH và hoạt động xóa gọi hoạt động POP o cá Biểu diễn cấu trúc liệu ngăn xếp (Stack) ực th 2.2 Sơ đồ minh họa ngăn xếp hoạt động diễn ngăn xếp p tậ ng tổ p hợ Một ngăn xếp triển khai theo phương thức Mảng (Array), Cấu trúc (Struct), Con trỏ (Pointer) Danh sách liên kết (Linked List) Ngăn xếp dạng kích cỡ cố định ngăn xếp thay đổi kích cỡ Phần triển khai ngăn xếp sử dụng mảng với việc triển khai ngăn xếp cố định 2.3 Các hoạt động cấu trúc liệu ngăn xếp Hoạt động PUSH cấu trúc liệu ngăn xếp : Tiến trình đặt (thêm) phần tử liệu vào ngăn xếp biết đến với tên Hoạt động PUSH Hoạt động push bao gồm bước sau:     o Bá  Bước 1: kiểm tra xem ngăn xếp đầy hay chưa Bước 2: ngăn xếp đầy, tiến trình bị lỗi Bước 3: ngăn xếp chưa đầy, tăng top để trỏ tới phần nhớ trống Bước 4: thêm phần tử liệu vào vị trí nơi mà top trỏ đến ngăn xếp Bước 5: trả success cá o Hoạt động POP cấu trúc liệu ngăn xếp: th ực Việc truy cập nội dung phần tử xóa từ ngăn xếp cịn gọi Hoạt động POP Trong triển khai Mảng hoạt động pop(), phần tử liệu không thực bị xóa, thay vào đó top sẽ bị giảm vị trí thấp ngăn xếp để trỏ tới giá trị Nhưng triển khai Danh sách liên kết, hoạt động pop() thực xóa phần tử xữ liệu xóa khỏi khơng gian nhớ p tậ    Bước 1: kiểm tra xem ngăn xếp trống hay không Bước 2: ngăn xếp trống, tiến trình bị lỗi Bước 3: ngăn xếp không trống, truy cập phần tử liệu tại top đang trỏ tới Bước 4: giảm giá trị top Bước 5: trả success p  hợ  ng tổ Hoạt động POP bao gồm bước sau: Chương III: ỨNG DỤNG STACK ĐỂ CHUYỂN BIỂU THỨC TỪ DẠNG TRUNG TỐ SANG HẬU TỐ 3.1 Xây dựng phép dịch biểu thức trung tố sang dạng hậu tố Gọi ∑ toán hạng, Г toán tử ( + , - , * , / ) dạng ký pháp hậu tố (postfix) định nghĩa sau:   Nếu biểu thức E (Expression) có dạng a ∈ ∑ thì:  Postfix a a Nếu biểu thức E có dạng E1 θ E2 , E1 , E2 biểu thức, cịn θ tốn tử thì:  Postfix E1 θ E2 E ' E ' θ , E ' , E' 2tương ứng postfix E1 , E  Nếu biểu thức E có dạng (E) thì:  Postfix (E) biểu diễn postfix E VD: Cho biểu thức dạng trung tố (infix): (a+b)*c Hãy xác định dạng ký pháp hậu tố (postfix) biểu thức trên? o Bá Giải: o cá  Xác định dạng ký pháp Postfix: o Đặt E1 = (a+b), E2 = c, θ = * o Với E1 = (a+b) ta lại đặt: E11 = a, E12 = b, θ = + nên ta có dạng postfix E1 ab+ ực th Do đó, ta có dạng ký pháp Postfix E ab+c* p tậ hợ Output: Biểu thức số học dạng postfix ng tổ 3.2 Giải thuật dịch biểu thức dạng ký pháp trung tố sang biểu thức dạng ký pháp hậu tố Input: Biểu thức số học dạng infix p Phương pháp: Ta sử dụng Stack: S1 lưu trữ toán tử tốn hạng, đồng thời lưu ln kết quả, S2 lưu trữ toán tử  Trước hết, toán tử ta gán cho mức ưu tiên (Giá trị số ngun), tốn tử có mức ưu tiên lớn thực trước, tốn tử có mức ưu tiên nhỏ thực sau  Hoạt động: Duyệt biểu thức vào từ trái qua phải thực thao tác sau: o Nếu ký hiệu vào tốn hạng ghi vào S1 o Nếu ký hiệu vào tốn tử đố ta phải kiểm tra S2:  Nếu S2 rỗng ghi tốn tử vào S2  Nếu S2 khơng rỗng thì: Ta so sánh mức đọ ưu tiên toán tử theo nguyên tắc sau: Giả sử gọi θ i toán tử xét, θ j toán tử S2 => Xảy trường hợp: Nếu θ i ≤ θ j đẩy θ j khỏi đỉnh S2, sau tiếp tục lặp θ i > θ j dừng, lúc ghi θ i vào S2; trường hợp khác ta ghi ln θ i vào S2 o Nếu ký hiệu vào dấu mở ngoặc “(” ta ghi vào S2, sau áp dụng lại thao tác 1,2 gặp dâu ngoặc “)”, có tốn tử nằm cặp dấu ngoặc “(”, “)” phải đẩy hết Khi đẩy hết cặp dấu ngoặc “tự hủy” Lưu ý: Ta sử dụng thêm ký hiệu đặc biệt để đánh dấu kết thúc phải biểu thức có mức ưu tiên nhỏ VD: Mơ tả giải thuật dịch biểu thức dạng ký pháp trung tố: a+b*c sang biểu thức dạng ký pháp hậu tố (postfix) Giải: o Bá Ta sử dụng stach S1, S2, dấu “;” để đánh dấu kết thúc gán giá trị mức ưu tiên cho toán tử dấu “;” bảng sau: o cá ực th p tậ ng tổ Ta có hoạt động giải thuật sau: p hợ 10 o Bá o cá ực th p tậ ng tổ p hợ 11 Chương IV: CÀI ĐẶT CHƯƠNG TRÌNH TRÊN NGƠN NGỮ LẬP TRÌNH C 4.1 Định hình Chương trình giúp chuyển biểu thức từ dạng trung tố sáng dạng hậu tố Với biểu thức trung tố nhập vào kết biểu thức hậu tố tương ứng 4.2 Viết chương trình o Bá o cá ực th p tậ ng tổ p hợ 12 o Bá o cá ực th p tậ ng tổ p hợ 13 4.3 Test chương trình o Bá o cá ực th p tậ ng tổ p hợ Nhập vào biểu thức (a+b)*c/d+e 14 o Bá Kết quả: ab+c*d/e+ o cá ực th p tậ ng tổ p hợ 15 KẾT LUẬN Đến kết thúc việc bàn luận nghiên cứu cài đặt chương trình chuyển biểu thức dạng trung tố sang dạng ký pháp hậu tố (ký pháp đảo ba lan) Qua trình nghiên cứu đề tài, em nhận số kết sau: Hiểu rõ ký pháp Ba Lan, nghịch đảo Ba Lan Nắm bắt giải thuật chuyển biểu thức từ dạng trung tố sang hậu tố Cài đặt thành cơng thuật tốn ngơn ngữ lập trình C o Bá Đề tài cịn nhiều sai sót, em mong thầy bạn đóng góp ý kiến để hồn thiện tốt đề tài Em xin chân thành cảm ơn! o cá ực th p tậ ng tổ p hợ 16 Tài liệu tham khảo: Bài giảng Nguyên lý ngôn ngữ lập trình - ThS Lưu Minh Tuấn - Bộ mơn CNTT Viện CNTTKT - ĐHKTQD Viết chương trình tính giá trị biểu thức – Tác giả: Đặng Nhật Anh – Diễn đàn: caulacbovb.com Các nguồn khác Internet o Bá o cá ực th p tậ ng tổ p hợ 17

Ngày đăng: 05/01/2024, 13:55

w