Tải bản đầy đủ (.doc) (21 trang)

Đồ án chuyển đổi trung tố 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 (236.4 KB, 21 trang )

-1-

TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP VIỆT – HUNG
KHOA: Điện-Điện Tử-Công Nghệ Thông Tin

TÊN SINH VIÊN

NGUYỄN XUÂN THIỀU
NGÔ THỊ TƯƠI

TÊN ĐỀ TÀI

TÌM HIỂU KỸ THUẬT BẢO
MẬT THÔNG TIN BẰNG
PHƯƠNG PHÁP GIẤU TIN
TRONG ẢNH
THỰC TẬP TỐT NGHIỆP
CHUYÊN NGÀNH: Công

Nghệ Thông Tin

HÀ NỘI, NĂM 2016


-2-

NHẬN XÉT, ĐÁNH GIÁ, CHO ĐIỂM
(Của giảng viên hướng dẫn)
………………………………………………..
………………………………………………………………………………………
……………..……………………………………………………………..


……………………………………………………………..
……………………………………………………………..………………..
………………………………………………………………………………………..
……………………………………..
……………………………………………………………..
………………………………………………………………………………………
………………..……………………………………………………………..
……………………………………………………………………………………….
……………………………………………………..
……………………………………………………………..
………………………………………………………………………………………
………………..……………………………………………………………..
………………………………………………………………………………………
……………………………………………………..
……………………………………………………………..
………………………………………………………………………………………
………………..……………………………………………………………..
………………………………………………………………………………………
……………………………………………………..
……………………………………………………………..
………………………………………………………………………………………
………………..……………………………………………………………..
………………………………………………………………………………………
……………………………………………………..
……………………………………………………
Điểm: …………………….………(bằng chữ: …..…………… ….)
Đồng ý/Không đồng ý cho sinh viên bảo vệ trước hội đồng chấm đồ án tốt nghiệp?.


-3-


Hà Nội, ngày tháng năm 2017
CÁN BỘ - GIẢNG VIÊN HƯỚNG DẪN
(ký, họ tên)


-4-

NHẬT KÝ THỰC HIỆN ĐỀ TÀI
Thời gian

Công việc
Nhận đề tài

2 ngày
2
1
1
1
1
1
2
2

Tạo tài liệu
Chỉnh sửa tài liệu

Ghi chú



-5-

LỜI CẢM ƠN
Trước tiên, em xin gửi lời biết ơn sâu sắc nhất tới cô Nguyễn Thị Thu Thủy,
người đã tận tình chỉ bảo, định hướng cho em trong suốt quá trình thực tập, đồng
thời giúp em tiếp cận với phương pháp tư duy và nghiên cứu khoa học mới.
Em xin gửi lời cảm ơn chân thành tới tất cả các thầy giáo cô giáo trong khoa
Công nghệ thông tin cùng các thầy, cô trong khoa cơ bản trường đại học Công
Nghiệp Việt Hung. Đã tận tình dạy dỗ, động viên và giúp đỡ em trong suốt quá trình
học tập, nghiên cứu.
Xin gửi lời cảm ơn chân thành nhất tới gia đình, bạn bè đã hết lòng tin tưởng,
động viên và đóng góp những ý kiến quý báu cho em trong suốt quá trình thực hiện
đề tài này.
Xin chân thành cảm ơn!
Hà Nội, Ngày tháng năm 2017
Sinh viên thực hiện:
Nguyễn Xuân Thiều
Ngô Thị Tươi


-6-

MỤC LỤC
NHẬT KÝ THỰC HIỆN ĐỀ TÀI.............................................................................4
MỞ ĐẦU.....................................................................................................................7
CHƯƠNG I GIỚI THIỆU VỀ CẤU TRÚC NGĂN XẾP STACK..........................9
1.1 Định nghĩa Stack.................................................................................................9
1.2 Biểu diễn.............................................................................................................9
1.3 Các thao tác trên stack dựa vào mảng................................................................9
1.3.1 Kiểm tra tính rỗng của stack.....................................................................10

1.3.2 Kiểm tra tính đầy của stack.......................................................................10
1.3.3 Đưa dữ liệu vào stack................................................................................10
1.3.4 Lấy dữ liệu ra khỏi stack...........................................................................10
CHƯƠNG II TỔNG QUAN VỀ KÝ PHÁP BA LAN............................................12
2.1 Biểu thức số học thông thường.........................................................................12
2.2 Biểu thức dạng hậu tố và tiền tố.......................................................................12
2.3 Tính giá trị của biểu thức hậu tố.......................................................................12
2.4 Chuyển đổi từ biểu thức trung tố sang dạng hậu tố.........................................13
CHƯƠNG III XÂY DỰNG MÔ HÌNH TÍNH TOÁN THEO KÍ PHÁP BA LAN
SỬ DỤNG CẤU TRÚC STACK..............................................................................16
3.1 Cài đặt...............................................................................................................16
3.2 Demo chương trình...........................................................................................19
KẾT LUẬN...............................................................................................................20
TÀI LIỆU THAM KHẢO........................................................................................21


-7-

MỞ ĐẦU
I. Đặt vấn đề
Trước khi máy tính được sử dụng rộng rãi các nhà kế toán thường phải tính
bằng tay hoặc bằng các bảng tính trên giấy. Dù có giỏi và kinh nghiệm đến mấy, khả
năng sai sót vẫn có thể xảy ra, chưa kể thời gian tính toán là rất lâu. Trong khi ngày
nay họ có thể tính toán nhờ một chương trình bảng tính rất dễ sử dụng, rất chính xác
và tiết kiệm được rất nhiều thời gian.
Với sự phát triển mạnh mẽ trong lĩnh vực khoa học công nghệ, máy tính ngày
càng đi sâu hơn vào đời sống văn hóa, xã hội của con người, đã và đang mang lại
nhiều lợi ích trong nhiều lĩnh vực của cuộc sống. Nó đang dần trở thành một thành
phần quan trọng không thể tách rời của xã hội thông tin hiện đại. Ưu điểm của máy
tính là khả năng tính toán nhanh đạt được độ chính xác cao. Tuy nhiên, máy tính có

những giới hạn của nó, cho dù nó có những chức năng tân tiến đến đâu, nó cũng chỉ
là cỗ máy, làm theo những chỉ dẫn được đặt ra sẵn từ phía con người chứ không thể
linh hoạt thay đổi được. Các biểu thức số học vốn đã quen thuộc thân thiện với
người sử dụng nhưng lại hoàn toàn xa lạ đối với máy tính. Vấn đề được đặt ra là làm
thế nào để máy tính có thể hiểu được các phép tính để trả lại kết quả phục vụ người
dùng.
Hiện nay có nhiều phương pháp quy ước định nghĩa, đồ án này trình bày một
phương pháp tiếp cận cho việc xây dựng một cách tính toán trên máy tính dựa trên
ký pháp Ba lan (Polish notation)

Đồ án gồm 4 chương với nội dung như sau:
• Chương I

: Giới thiêu về cấu trúc ngăn xếp stack

Giới thiệu tổng quan về kiểu dữ liệu stack
• Chương II

: Tổng quan về ký pháp Ba lan

Giới thiệu tổng quan về ký pháp Ba lan, cách biểu diễn biểu thức số học theo
kí pháp hậu tố, tiền tố.
• Chương III : Xây dựng mô hình tính toán theo kí pháp Ba lan sử dụng
cấu trúc stack
Nội dung của chương tập trung trình bày việc xây dựng biểu thức hậu tố, và
cách tính biểu thức hậu tố
• Chương IV : Kết Luận
Tổng kết lại toàn bộ những vấn đề đã thực hiện trong đồ án. Dựa trên những
kết quả thu được để từ đó nêu ra những hướng nghiên cứu và phát triển trong
tương lai nhằm cải thiện hiệu quả của phương pháp được nghiên cứu.



-8-

Do còn hạn chế về mặt kiến thức và thời gian, đồ án không tránh khỏi những
thiếu sót. Vì vậy em mong nhận được những ý kiến đóng góp của các thầy cô giáo
và các bạn sinh viên để em có thể nâng cao kiến thức của mình hơn nhằm phục vụ
cho những nghiên cứu sau này


-9-

CHƯƠNG I
GIỚI THIỆU VỀ CẤU TRÚC NGĂN XẾP STACK
Nội dung chương này sẽ trình bày kiểu cấu trúc dữ liệu ngăn xếp - stack, cách
xây dựng ngăn xếp theo kiểu mảng bao gồm cấu trúc ngăn xếp, các hàm kiểm tra
ngăn xếp trống, ngăn xếp đầy dữ liệu, hàm lấy giá trị, hàm thêm phần tử vào ngăn
xếp, lấy dữ liệu ra khỏi ngăn xếp.
1.1 Định nghĩa Stack
Stack là tập hợp các node thông tin được tổ chức liên tục hoặc rời rạc nhau
trong bộ nhớ và thực hiện theo cơ chế FILO (First – In – Last – Out ).
1.2 Biểu diễn
Có hai phương pháp biểu diễn ngăn xếp:

Biểu diễn liên tục: các phần tử dữ liệu của ngăn xếp được lưu trữ liên
tục nhau trong bộ nhớ (Mảng).

Biểu diễn rời rạc: các phần tử dữ liệu của ngăn xếp được lưu trữ rời
rạc nhau trong bộ nhớ (Danh sách liên kết).
Ví dụ. Biểu diễn ngăn xếp dựa vào mảng.

typedef struct {
int top;
int node[MAX];
} Stack;

//Đỉnh đầu của stack nơi diễn ra mọi thao tác
//Dữ liệu lưu trữ trong stack gồm MAX phần tử

1.3 Các thao tác trên stack dựa vào mảng
Các thao tác xây dựng trên stack theo cơ chế Last-In-First-Out bao gồm:


Kiểm tra tích rỗng của stack (Empty(stack s)). Khi ta muốn lấy dữ
liệu ra khỏi ngăn xếp thì nó chỉ được thực hiện khi và chỉ khi ngăn xếp không
rỗng.



Kiểm tra tính đầy của ngăn xếp (Full(stack s)). Khi ta muốn đưa dữ
liệu vào ngăn xếp thì nó chỉ được thực hiện khi và chỉ khi ngăn xếp chưa tràn.



Đưa dữ liệu vào ngăn xếp (Push(stack s, item x)). Thao tác này chỉ
được thực hiện khi và chỉ khi ngăn xếp chưa tràn.



Đưa dữ liệu vào ngăn xếp (Pop(stack s)). Thao tác này chỉ được
thực hiện khi và chỉ khi ngăn xếp không rỗng.



- 10 -

1.3.1 Kiểm tra tính rỗng của stack
Tất cả các thao tác trên stack chỉ được thực hiện tại vị trí con trỏ top. Vì vậy
ta qui ước tại vị trí top = -1 stack ở trạng thái rỗng. Thao tác được thực hiện như
sau:
int Empty( stack *s ) { //s là con trỏ đến stack
if ( stack ->top == -1 ) // Nếu top =-1
return (1); //Hàm trả lại giá trị đúng
return(0); //Hàm trả lại giá trị sai
}
1.3.2 Kiểm tra tính đầy của stack
Khi ta muốn lấy dữ liệu ra khỏi ngăn xếp thì ngăn xếp phải chưa tràn. Vì biểu
diễn dựa vào mảng, do đó tại vị trí top = MAX -1 thì stack ở trạng thái đầy. Thao tác
được thực hiện như sau:
int Full( stack *s ) { //s là con trỏ đến stack
if ( stack ->top == MAX-1 ) // Nếu top = MAX -1
return (1); //Hàm trả lại giá trị đúng
return(0); //Hàm trả lại giá trị sai
}
1.3.3 Đưa dữ liệu vào stack
Khi muốn đưa dữ liệu vào ngăn xếp thì ta phải kiểm tra ngăn xếp có đầy
(tràn) hay không? Nếu ngăn xếp chưa đầy, thao tác sẽ được thực hiện. Nếu ngăn xếp
đã đầy, thao tác không được thực hiện. Thao tác được thực hiện như sau:
void Push( stack *s, int x ) {
if ( !Full (s)){
s ->top = (s ->top) +1;
s->Node[s ->top] = x;

}
else <thông báo tràn stack>;
}

//x là node cần thêm vào stack
// Nếu stack chưa tràn
//Tăng con trỏ top lên 1 đơn vị
//Lưu trữ x tại vị trí top

1.3.4 Lấy dữ liệu ra khỏi stack
Khi muốn lấy dữ liệu ra khỏi ngăn xếp thì ta phải kiểm tra ngăn xếp có rỗng
hay không? Nếu ngăn xếp không rỗng, thao tác sẽ được thực hiện. Nếu ngăn xếp
rỗng, thao tác không được thực hiện. Thao tác được thực hiện như sau:
int Pop( stack *s ) { //s là con trỏ đến stack
if ( !Empty (s)) { // Nếu stack không rỗng
x =s->Node[s ->top]; //x là nội dung node bị lấy ra
s ->top = (s ->top) -1; //giảm con trỏ top 1 đơn vị
return (x); //Trả lại x là node bị loại bỏ


- 11 -

}
else {
<thông báo stack rỗng>;
return (∞);
}
}



- 12 -

CHƯƠNG II
TỔNG QUAN VỀ KÝ PHÁP BA LAN
Chương này sẽ giới thiệu tổng quan về các vấn đề biểu thức số học và ký pháp
Ba lan, biểu thức dạng tiền tố và hậu tố, cách tính giá trị biểu thức hậu tố. chuyển
đổi giữa biểu thức trung tố và hậu tố.
2.1 Biểu thức số học thông thường
Trong các biểu thức số học với phép toán hai ngôi, như phép cộng, phép trừ,
phép nhân, phép chia, phép lũy thừa,… các toán tử bao giờ cũng được đặt ở giữa các
toán hạng
Với cách biểu diễn này, việc sử dụng các cặp dấu ngoặc để phân việ các toán
hạng (cũng là để phân biệt thứ tự thực hiện các phép toán) là cần thiết
Ví dụ:
a. (A+B)*C
b. A+(B*C)
Là hoàn toàn khác nhau cho các kết quả khác nhau.
Trong trường hớp không muốn dùng dấu ngoặc thì phải theo qui ước về thứ tự
ưu tiên thực hiện các phép toán, nghĩa là theo thứ tự (độ ưu tiên giảm dần):
- Phép lũy thừa
- Phép nhân, phép chia
- Phéo cộng, phép trừ.
Đối với các các phép toán có cùng thứ tự ưu tiên sẽ thực hiện từ trái qua phải.
Ví dụ: Với biểu thức
A+B*C-A^F
Thứ tự thực hiện sẽ là:
1. A^F
2. B*C
3. A+(B*C)
4. (A+(B*C))-(A^F)

2.2 Biểu thức dạng hậu tố và tiền tố
Với ký pháp hậu tố thì toán tử sẽ được đặt sau toán hạng một và toán hạng hai.






a+b⇔ab+
a-b⇔aba*b⇔ab*
a/b⇔ab/
(P) ⇔ P

2.3 Tính giá trị của biểu thức hậu tố
Việc tính toán giá trị của một biểu thức hậu tố, khi đã biết giá trị của các biến
được định nghĩa như sau:


- 13 -

Đọc giá trị hậu tố từ trái qua phải:
Nếu ký tự được đọc X là toán hạng thì bảo lưu giá trị của nó.
Nếu ký tự được đọc X là toán tử thì 2 giá trị vừa được bảo lưu sẽ lần
lượt được lấy ra và tác động toán tử X vào giữa giá trị lấy ra sau với giá
trị lấy ra trước và bảo lưu kết quả lại.
Quá trình trên sẽ được tiếp tục cho tới khi kết thúc biểu thức. Giá trị cuối
cùng sẽ được bảo lưu chính là giá trị của biểu thức.
Thuật toán tính toán giá trị biểu thức hậu tố
Bước 1 (Khởi tạo):
stack = ∅;

Bước 2 (Lặp) :
For each x∈P do
2.1. Nếu x là toán hạng:
Push( stack, x);
2.2. Nếu x ∈ { +, -, *, /,^ }
a)
TH2 = Pop(stack, x);
b)
TH1 = Pop(stack, x);
c) KQ = TH1 ⊗ TH2;
d) Push (stack, KQ);
EndFor;
Bước 3(Trả lại kết quả):
Return(Pop(stack)).
Ví dụ: P = 6 2 4 * + 6 2 / 4 + -

Kết quả: P=7

2.4 Chuyển đổi từ biểu thức trung tố sang dạng hậu tố.
Thuật toán chuyển đổi biểu thức trung tố P thành biểu thức hậu tố:
Bước 1 (Khởi tạo): stack = ∅; Out = ∅;
Bước 2 (Lặp) :
For each x∈P do
2.1. Nếu x =‘ (‘ : Push(stack, x);
2.2. Nếu x là toán hạng: x⇒Out;
2.3. Nếu x ∈ { +, -, *, / }


- 14 -


y = get(stack);
a)
Nếu priority(x)≥priority(y): Push(stack, x);
b)
Nếu priority(x)y = Po(stack); y⇒Out; Push(stack, x);
c) Nếu stack = ∅: Push(stack, x);
2.4. Nếu x =‘)’:
y = Pop(stack);
While (y!=‘(’ ) do
y⇒Out; y = Pop(stack);
EndWhile;
EndFor;
Bước 3(Hoàn chỉnh biểu thức hậu tố):
While (stack ≠ ∅) do
y = Pop(stack); y⇒Out;
EndWhile;
Bước 4(Trả lại kết quả):
Return(Out).
Kiểm nghiệm thuật toán: P = ( a + b * c ) − ( a / b + c )

x∈P

Bước

Stack

Out

x =‘(‘


2.1

(



x =a

2.2

(

a

x =+

2.3.a

(+

a

x =b

2.2

(+

ab


x =*

2.3.a

(+*

ab

x=c

2.2

(+*

abc

x =‘)‘

2.3



abc*+

x =-

2.2.c

-


abc*+

x =‘(‘

2.1

-(

abc*+

x =a

2.2

-(

abc*+a

x =/

2.2.a

-(/

abc*+a


- 15 -


x =b

2.2

-(/

abc*+ab

x =+

2.3.b

-(+

a b c * + a b/

x =c

2.2

-(+

a b c * + a b/c

x =‘)‘

2.4




a b c * + a b/c + P = a b c * + a b/c + -


- 16 -

CHƯƠNG III
XÂY DỰNG MÔ HÌNH TÍNH TOÁN THEO KÍ PHÁP BA
LAN SỬ DỤNG CẤU TRÚC STACK
Chương 3 trình bày quy trình các bước để xây dựng lên biểu thức hậu tố và các
bước tính giá trị biểu thức trên ngôn ngữ C/C++.
3.1 Cài đặt
- Hàm này trả về độ ưu tiên của các toán tử
• toán tử mũ ^ có độ ưu tiên cao nhất trả về giá trị 2
• toán tử *, / có độ ưu tiên thấp hơn toán tử mũ trả về gia trị 1
• toán tử +, - có độ ưu tiên thấp nhất trả về giá trị 0
• các toán tử khác trả về -1
int uT( char c ){ // tra ve muc do uu tien cua cac toan tu
if( c == '(') return 0;
if( c == '+' || c == '-' ) return 1;
if( c == '*' || c == '/' || c == '%' ) return 2;
if( c == '^' ) return 3;
}
- Hàm chuyển đổi biểu thức số học thông thường sang biểu thức hậu tố
• Tham số đầu vào là biểu thức số học thông thường
• Giá trị trả về là biểu thức hậu tố
void Biendoi(string& str, string& hauto){ // chuyen bthuc trung to sang hau to.
stack<char> s;
string str1 = "";
string cach=" ";
int i = 0;

while( i < str.length() ){
char c = str.at(i);
if( c != ' ' ){
if( c - '0' >= 0 && c - '0' <= 9 || isalpha(c) ) str1 += c;
else{
hauto=hauto+str1;
hauto=hauto+cach;
str1 = "";
if( c == '(') s.push(c);
else{
if( c == ')') {
while( s.top()!= '('){
hauto=hauto+s.top();


- 17 -

s.pop();
}
if(s.top() == '(' ) s.pop();
}
else{
while( !s.empty() && uT(c) <=
uT(s.top())){
hauto=hauto+s.top();
s.pop();
}
s.push(c);
}
}

}
}
i++;
}
if( str1 != "" )
hauto=hauto+str1;
while(!s.empty()){
if(s.top()!= '(')
hauto=hauto+s.top();
s.pop();
}
cout<}


- 18 -

Ví dụ: Biểu thức (10-4/2)+(10-2*2)
Bước
0
1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17

Ký tự xét
(
1
0
4
/
2
)
+
(
1
0
2
*
2
)

Stack
{(}
{(}
{(}
{(-}

{(-}
{(-/}
{(-/}
{}
{+}
{+(}
{+(}
{+(}
{+(-}
{+(-}
{+(-*}
{+(-*}
{+}

{}

Biểu thức
1
10
10
10 4
10 4
10 4 2
10 4 2/10 4 2/10 4 2/10 4 2/- 1
10 4 2/- 10
10 4 2/- 10
10 4 2/- 10 2
10 4 2/- 10 2
10 4 2/- 10 2 2
10 4 2/- 10 2 2*10 4 2/- 10 2 2*-+


Hàm này tính giá trị biểu thức hậu tố
• Tham số đầu vào là biểu thức hậu tố
• Giá trị trả về là kết quả của biểu thức
void Tinh( string str, stack<int> st ){ // Tinh gia tri bieu thuc hau to
int s = str.size();
for( int i= 0; i< s; i++ ){
if( str.at(i) -'0' >= 0 && str.at(i) - '0' <= 9 ) st.push( str.at(i) - '0' );
else if( str.at(i) != ' ' && st.top() != st.empty() ){
int a, b;
b = st.top(); st.pop();
a = st.top(); st.pop();
if( str.at(i) == '+' ) st.push( a + b );
if( str.at(i) == '-' ) st.push( a - b );
if( str.at(i) == '*' ) st.push( a * b );
if( str.at(i) == '/' ) st.push( a / b );
if( str.at(i) == '^' ) st.push( pow( a, b ) );
if( str.at(i) == '%' ) st.push( a % b );
}
} if( !st.empty() ) cout<< st.top()<<"\n";
else cout<< (" 1212");
}


- 19 -

3.2 Demo chương trình


- 20 -


KẾT LUẬN
KẾT QUẢ ĐẠT ĐƯỢC
Đồ án đã trình bày các bước xây dựng một biểu thức hậu tố từ một biểu thức
thông thường và cách tính giá trị biểu thức dựa theo ký pháp Ba lan. Dựa trên cơ sở
lý thuyết về ký pháp Ba lan kiểu dữ liệu ngăn xếp đồ án đã đạt được những kết quả
nhất định. Nội dung chi tiết các phần mà đồ án đã làm được như sau:
• Trình bày một cách khái quát cơ sở lý thuyết cấu trúc ngăn xếp, mô tả các
hàm trong ngôn ngữ C/C++ theo dạng mạng.
• Xây dựng và cài đặt thành công hàm chuyển đổi từ biểu thức số học thông
thường sang biểu thức hậu tố và cách tính toán biểu thức hậu tố với các
phép toán thông thường như +,-,*,/,^
HƯỚNG NGHIÊN CỨU TRONG TƯƠNG LAI
Dựa trên ý tưởng và những điều chưa thực hiện được trong hiện tại, em đề ra
phương hướng nghiên cứu và phát triển trong tương lai như sau:

Tối ưu hóa cài đặt giải thuật trong các hàm.

Cải tiến các hàm nhằm tăng khả năng tính toán thay vì hiện tại chương
trình mới chỉ thực hiện trên các biểu thức số học đơn giản theo kiển int,
các toán hạng cơ bản, chương trình có thể tính toán các biểu thức hàm đặc
biệt như logarit, sin,cos,tan,… tính toán dữ liệu theo kiểu float,double…


- 21 -

TÀI LIỆU THAM KHẢO
Tiếng Việt
1.


Đỗ Xuân Lôi, 2006, Cấu Trúc Dữ Liệu Và Giải Thuật, Trung
tâm In tranh Tuyên truyền cổ động – Mai Dịch.

2.

Lê Minh Hoàng, 2002, Bài giảng chuyên đề Giải Thuật và Lập
Trình. Đại học Sư phạm Hà Nội.

Các website
1. _pháp_Ba_Lan
2. />3. />


×