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

Hiện thực chương trình chuyển biểu thức logic từ infix sang postfix và tính bảng chân trị dựa trên biểu thức postfix vừa tìm được

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 (1021.99 KB, 13 trang )

lOMoARcPSD|9242611

TỔNG LIÊN ĐỒN LAO ĐỘNG VIỆT NAM
TRƯỜNG ĐẠI HỌC TƠN ĐỨC THẮNG
KHOA CÔNG NGHỆ THÔNG TIN

BÀI TẬP LỚN MÔN CẤU TRÚC RỜI RẠC

…tên đề tài …
Hiện thực chương trình chuyển biểu thức
logic từ infix sang postfix và tính bảng chân
trị dựa trên biểu thức postfix vừa tìm được

Người hướng dẫn: GV Trần Hồng Tài
Người thực hiện: Nguyễn Huy
Lớp

: 18H50202
Khóa : 22

THÀNH PHỐ HỒ CHÍ MINH, NĂM 2019


lOMoARcPSD|9242611

LỜI CẢM ƠN
Em cảm ơn thầy Trần Hồng Tài đã hướng dẫn em làm hoàn thành bài
tiểu luận.


lOMoARcPSD|9242611



MỤC LỤC
Chương 1: Giới thiệu
1.1: Liệt kê các công việc cá nhân đã làm theo thời gian
1.2: Giới thiệu các chương tiếp theo
Chương 2: Cơ sở lý thuyết
1.1: Lý thuyết về Reverse Polish notation
1.2:Lý thuyết về logic cơ bản và dùng để tính bảng chân trị
Chương 3: Thực nghiệm
Chương 4: Kết quả


lOMoARcPSD|9242611

CHƯƠNG 1: GIỚI THIỆU
1.1

Liệt kê các công việc cá nhân đã làm theo thời gian
Ngày 4/11/2019 Lên mạng tìm lý thuyết về giải thuật Ba Lan ngược,
cách sử dụng, công dụng và lợi ích của giải thuật này.
Ngày 5/11/2019 bắt đầu code về giải thuật Ba Lan. Chuyển các biểu thức
logic từ infix sang postfix
Ngày 6/11/2019 xem lý thuyết về bảng chân trị, cách vẽ bảng chân trị
bằng ngôn ngữ Python
Ngày 7/11/2019 tiến hành code tính tốn các biểu thức logic bằng bảng
chân trị
Ngày 8/11/2019 viết báo cáo

1.2


Giới thiệu các chương tiếp theo
Chương 2: Cơ sở lý thuyết. Ở chương 2 này chúng ta sẽ tìm hiểu về lý thuyết
giải thuật Ba Lan ngược, lý thuyết về logic cơ bản và tính tốn bảng chân trị
Chương 3: Thực nghiệm. Ở chương 3 chúng ta sẽ thực nghiệm 1 vài ví dụ
bằng cách chạy tay thuật toán đã làm trong file Essay.py
Chương 4:Kết quả. Ở chương này ta sẽ chạy chương trình mà chúng ta code
để kiểm tra xem kết quả khi chúng ta chạy có được kết quả giống với kết quả
chúng ta thực hiện ở chương 3 hay không


lOMoARcPSD|9242611

Chương 2: Cơ sở lý thuyết
1.1: Lý thuyết về Reverse Polish notation
Ký pháp nghịch đảo Ba Lan được phát minh vào khoảng giữa thập kỷ
1950 bởi Charles Hamblin.Từ cái tên hậu tố các bạn cũng đoán ra phần nào là
theo cách biểu diễn này, các toán tử sẽ được đặt sau các toán hạng. Cụ thể là
biểu thức trung tố: 4+5 sẽ được biểu diễn thành 4 5 +.
Quá trình tính tốn giá trị của biểu thức hậu tố khá tự nhiên đối với máy
tính. Ý tưởng là đọc biểu thức từ trái sang phải, nếu gặp một toán hạng (con số
hoặc biến) thì push tốn hạng này vào ngăn xếp; nếu gặp toán tử, lấy hai toán
hạng ra khỏi ngăn xếp (stack), tính kết quả, đẩy kết quả trở lại ngăn xếp. Khi
quá trình kết thúc thì con số cuối cùng cịn lại trong ngăn xếp chính là giá trị
của biểu thức đó

1.2:Lý thuyết về logic cơ bản và dùng để tính bảng chân trị
Trạng thái logic: trạng thái của một thực thể. Xét về mặt logic thì một
thực thể chỉ tồn tại ở một trong hai trạng thái. Thí dụ, đối với một bóng đèn ta
chỉ quan tâm nó đang ở trạng thái nào: tắt hay cháy. Vậy tắt / cháy là 2 trạng
thái logic của nó

Biến logic(mệnh đề): người ta biểu diễn biến logic bởi 1 ký hiệu nó chỉ
nhận 2 giá trị là 0 và 1.
Giả sử rằng ta có 2 mệnh đề P và Q thì ta sẽ suy ra được các phép tốn cơ
bản sau:
1. PHÉP PHỦ ĐỊNH
Phủ địnhcủa mệnh đề P được ký hiệu là ~P, là mệnh đề được định bởi:
~P đúng ↔ P sai
Bảng chân trị:

P
1
0

~P
0
1

2. Phép nối liền (hội,giao)
Phép nối liềncủa mệnh đề P và Q được ký hiệu bởi P ^ Q, là mệnh đề được
định bởi
P ^ Q đúng ↔ P và Qđồng thời đúng


lOMoARcPSD|9242611

Bảng chân trị:
P
Q
P^Q
0

0
0
0
1
0
1
0
0
1
1
1
3. Phép nối rời (tuyển,hợp)
Phép nối rời của 2 mệnh đề P và Q được ký hiệu bởi P VQ, là mệnh đề
được định bởi:
P VQsai ↔ P và Qđồng thời sai
Bảng chân trị:
P
Q
PVQ
0
0
0
0
1
1
1
0
1
1
1

1
4. Phép kéo theo
Mệnh đề P kéo theoQ của 2 mệnh đề P và Q, kí hiệu bởi P→Qlàmệnh đề
được định bởi
P→Qsai↔ Pđúng và Qsai
Bảng chân trị:
P
Q
P→Q
0
0
1
0
1
1
1
0
0
1
1
1
5. Phép kéo theo 2 chiều
Mệnh đề P kéo theo Q và ngược lại của hai mệnh đề P và Q, ký hiệu bởi
P↔Qlà mệnh đề định bởi
P↔Qđúng↔ P và Q có cùng chân trị
Bảng chân trị:
P
Q
P↔Q
0

0
1
0
1
0
1
0
0
1
1
1


lOMoARcPSD|9242611

Chương 3: Thực nghiệm
Ex1:Infix= R|(P&Q)
Các bước làm
Ta tạo 1 mảng postfix và 1 stack
Ta duyệt từng phần tử trong Infix
Phần tử đầu tiên là R nên ta đẩy vào postfix=[‘R’]. Tiếp theo đó là tốn tử’|’ thì ta đẩy
nó vào stack=[‘|’].Phần tử tiếp theo là “(” nên ta chèn nó lên vị trí 1 của
stack=[‘(’,’|’],phần tử tiếp theo là P ta đẩy vào postfix=[‘R’,’P’].Phần tử tiếp theo là
toán tử ‘&’ do độ ưu tiên của &<| nên ta chèn & lên vị trí 1 của stack=[‘&’,’(’,’|’].Phần
tử tiếp là Q nên ta đẩy vào postfix=[‘R’,’P’,’Q’].Cuối cùng là ‘)’ ‘)’ báo hiệu cho việc
kết thức 1 biểu thức do vậy ta bắt đầu chuyển các toán tử vào postfix.khi duyệt tới
‘)’bằng cách ta tạo mốt biến tạm và gán giá trị cho biến là phần tử đầu trong stack.Khi
đó temp=’&’so sánh thỏa điều kiện while temp is not ‘(’ đẩy giá trị của temp vào trong
postfix=[‘R’,’P’,’Q’,’&’]và lấy giá trị kế tiếp trong stack gán cho temp.Khi này
temp=’(’ không thỏa điều kiện while nên dừng lại.Lúc này đã duyệt hết phần tử nên ta

thốt vịng lập và trong stack lúc này chỉ cịn 1 phần tử ‘|’ ta dùng vòng lập để duyệt
các phần tử trong stack và lần lượt đẩy nó vào postfix. Ta được
postfix=[‘R’,’P’,’Q’,’&’,’|’].
Tiếp theo là tính tốncác biểu thức logic.
Ta tạo mảng Cha và 1 stack. Ta duyệt từng phần tử trong postfix khi thấy mệnh đề
thì ta bỏ vào mảng Cha.Sau đó ta cài đặt list Cha sang set Cha.Tiếp theo ta sắp xếp
chúng theo thứ tự.Khi đó ta sẽ có được Cha={‘P’,’Q’,’R’}.tiếp theo sau đó ta tạo bảng
chân trị bằng cách :

Tiếp theo sau ta tạo mảng Ope=['~','&','|','>','='] chứa tốn tử theo thứ tự sau đó ta chạy
vịng lặp duyệt các phần tử trong postfix. Nếu là mệnh đề thì ta bỏ vơ stack sau khi
duyệt thì stack=[‘R’,’P’,’Q’].Tiếp theo là dấu ‘&’ nên sẽ không bỏ ngoặc mà ta gan
h1=phần tử cuối trong stack => h1=’Q’ tiếp theo ta sẽ gán giá trị True False từ bảng
chân trị cho mệnh để Q.Tương tự với h2 ta có được giá trị True False cho mệnh đề P
và ta đã có được 2 giá trị cho 2 mệnh đề ta bắt đầu tính tốn với tốn tử ‘&’. Ta lưu giá


lOMoARcPSD|9242611

trị của 2 mệnh đề bằng biến a1 và a2. Sau đó ta sẽ chạy vịng for tính tốn

Vịng for này làm như sau tạo 1 mảng lồng với tuple của a và b a và chạy trong
zip(a1,a2) hàm zip để giúp 2 biến chạy song song với nhau để tạo kết quả thành cột
Sau khi tính xong là lưu kết quả vào Trutable. Sau khi lưu vào chúng ta phải lưu vào
stack số thứ tự của cột chúng ta vừa tính được để lấy ra làm phép tính sau.Ta cũng tạo
giá trị cho mệnh đề P sau đó chúng ta sử dụng số thứ tự của cột cuối cùng để chúng ta
lấy kết quả của cột đó thơng qua đoạn code sau:

Ta lưu giá trị của P là a2 còn giá trị của cột thứ 4 là a1
Ta sử dụng a1 và a2 để tính tương tự như tính ở ‘&’

Sau đó là lưu kết quả vào trong bảng Truthtable. Thế là ta đã tính tốn xong ví dụ 1
Ex2:Infix= ~P|(Q&R)>R
Đầu tiên ta tạo 1 mảng postfix và 1 stack. Ta duyệt các phần từ của infix bằng
vòng for. Phần tử đầu tiên là P nên ta đẩy vào postfix=[‘P’].Phần tử tiếp theo là toán tử
‘~’ ta chèn vào vị trí số 1 của stack=[‘~’].Phần tử tiếp theo là 1 toán tử ‘|’ do độ ưu tiên
của ‘~’< độ ưu tiên của ‘|’nên ta đẩy ‘~’vào postfix=[‘P’,’~’] lúc này stack đã hết tốn
hạng nên ta dừng dịng while và đẩy ‘|’ vào stack=[‘|’].Ta duyệt tiếp infix thì ta được ‘(’
lúc này ta đẩy ‘(’ vào vị trí đầu tiên trong stack=[‘(’,’|’].Tiếp đó tới phần tử Q ta đẩy
vào trong postfix=[‘P’,’~’,’Q’].Tiếp theo là 1 tốn tử ‘&’ do ‘&’ có độ ưu tiên nhỏ hơn
‘(’ nên ta đẩy ‘&’vào vị trí 1 của stack=[‘&’,’(’,’|’]. Tiếp theo đó là R nên ta đẩy vào
trong postfix=[‘P’,’~’,’Q’,’R’].Tiếp theo là ngoặc ‘)’ báo hiệu cho kết thúc 1 biểu thức.
Ta cho gán biến temp=’&’ có giá trị đầu của stack, temp có giá trị là 1 toán tử nên ta
đẩy vào postfix=[‘P’,’~’,’Q’,’R’,’&’] và gán biến temp=’(’ giá trị kế tiếp trong stack
do temp không phải tốn tử nên thốt vịng lặp while.Ta tiếp tục duyệt Infix ta được ‘>’
là toán tử do ‘>’>’|’ nên ta đẩy ‘|’vào postfix=[‘P’,’~’,’Q’,’R’,’&’,’|’] và đẩy ‘>’ vào
stack=[‘>’].Tiếp theo ta duyệt phần tử cuối cùng ta được 1 toán hạng R ta đẩy vào
postfix=[‘P’,’~’,’Q’,’R’,’&’,’|’,’R’]. Duyệt hết phần tử ta thoát khỏi vòng lặp. Bắt đầu


lOMoARcPSD|9242611

đưa các phần tử còn lại trong stack vào postfix bằng vòng for ta thu được
postfix=[‘P’,’~’,’Q’,’R’,’&’,’|’,’R’,’>’]. Ta đã xong phần chuyển đổi sang postfix.
Phần tiếp theo là phần tính tốn
Ta tạo mảng Cha và 1 stack. Ta duyệt từng phần tử trong postfix khi thấy mệnh đề thì
ta bỏ vào mảng Cha.Sau đó ta cài đặt list Cha sang set Cha.Tiếp theo ta sắp xếp chúng
theo thứ tự.Khi đó ta sẽ có được Cha={‘P’,’Q’,’R’}.tiếp theo sau đó ta tạo bảng chân
trị bằng cách :

Tiếp theo sau ta tạo mảng Ope=['~','&','|','>','='] chứa tốn tử theo thứ tự sau đó ta chạy

vịng lặp duyệt các phần tử trong postfix. Phần tử đầu tiên là ‘P’ nằm trong Cha nên ta
bỏ vào stack=[‘P’]. Tiếp theo đó lá tốn tử ‘~’ nên ta sẽ gán giá trị True False cho P
bằng bảng chân trị phía trên và ta lưu kết quả đó ở a1 sau đó ta tính phủ định của a

Ta lưu kết quả ở tp sau khi tính tiếp theo đó ta sẽ lưu vào Truthtable và ta sẽ tính số
thứ tự cột kết quả mà chúng ta vừa tính và lưu vào trong stack=[3].Tiếp đến là ‘Q’ ta
lưu vào trong stack=[3,’Q’].Tiếp đến là ‘R’ ta lưu vào trong stack=[3,’Q’,’R’]. Tiếp
theo là dấu ‘&’ thì ta lấy R từ stack và gán giá trị True False cho R lưu vào a1,tiếp theo
với Q ta lưu vào a2, sau đó ta thực hiện phép tính ‘&’

Vịng for này làm như sau tạo 1 mảng lồng với tuple của a và b a và chạy trong
zip(a1,a2) hàm zip để giúp 2 biến chạy song song với nhau để tạo kết quả thành cột


lOMoARcPSD|9242611

Sau khi tính xong là lưu kết quả vào Trutable. Sau khi lưu vào chúng ta phải lưu vào
stack=[3,4] số thứ tự của cột chúng ta vừa tính được để lấy ra làm phép tính sau.Tiếp
theo là ‘|’ta sẽ lấy kết quả của cột 4 và kết quả cột 5 để tính. Để lấy kết quả từ cột 3 ta
thực hiện đoạn code sau.

h1 sẽ được gán giá trị đầu trong stack là 4 a[4] tức là cột thứ 5 trong Truthtable, tương
tự với h2 thì ta sẽ có giá trị a1 và a2 là kết quả của 2 cột 4 và 5 sau đó ta thực hiện
phép tốn ‘|’ tương tự như tính ‘&’ kết quả sau khi tính được thì lưu vào Truthtable
cịn số thứ tự của cột thì lưu vào stack=[4] .Tiếp theo đó là ‘R’ ta lưu vào stack=[4,’R’]
và cuối cùng là ‘>’ ta gán giá trị cho R bằng cách làm như ở trên sau đó ta lấy kết quả
của cột thứ 5 theo cách trên và tính ‘>’ sau khi tính xong ta lưu kết quả vô Truthtable
và thứ tự của cột kết quả vừa tính vào stack. Duyệt hết phần tử tốn khỏi vịng lặp trả
về kết quả. Thế là đã tính xong Ex2


Chương 4: Kết quả


lOMoARcPSD|9242611


lOMoARcPSD|9242611

Downloaded by tran quang ()


lOMoARcPSD|9242611

TÀI LIỆU THAM KHẢO
Tiếng việt
1. />2. />3. Tài liệu môn toán rời rạc của trường ĐH Khoa Học Tự Nhiên

Downloaded by tran quang ()



×