NHẬT KÝ THỰC HIỆN ĐỀ TÀI 3 MỤC LỤC 5 MỞ ĐẦU 6 CHƯƠNG I GIỚI THIỆU VỀ CẤU TRÚC NGĂN XẾP STACK 7 1.1 Định nghĩa Stack 7 1.2 Biểu diễn 7 1.3 Các thao tác trên stack dựa vào mảng 7 1.3.1 Kiểm tra tính rỗng của stack 8 1.3.2 Kiểm tra tính đầy của stack 8 1.3.3 Đưa dữ liệu vào stack 8 1.3.4 Lấy dữ liệu ra khỏi stack 8 CHƯƠNG II TỔNG QUAN VỀ KÝ PHÁP BA LAN 10 2.1 Biểu thức số học thông thường 10 2.2 Biểu thức dạng hậu tố và tiền tố 10 2.3 Tính giá trị của biểu thức hậu tố 10 2.4 Chuyển đổi từ biểu thức trung tố sang dạng hậu tố. 11 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 14 3.1 Cài đặt 14 3.2 Demo chương trình 18 KẾT LUẬN 19 TÀI LIỆU THAM KHẢO 20
Trang 1TRƯỜ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ÊNNGUYỄ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
HÀ NỘI, NĂM 2016
Trang 2NHẬ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?.
Trang 3Hà Nội, ngày tháng năm 2017
CÁN BỘ - GIẢNG VIÊN HƯỚNG DẪN
(ký, họ tên)
Trang 5LỜ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, đồngthờ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 khoaCông nghệ thông tin cùng các thầy, cô trong khoa cơ bản trường đại học CôngNghiệp Việt Hung Đã tận tình dạy dỗ, động viên và giúp đỡ em trong suốt quá trìnhhọ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ềuNgô Thị Tươi
Trang 6MỤ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
Trang 7MỞ ĐẦ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ínhbằ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àynay 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àycà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ạinhiề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ànhphầ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áytí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ớingườ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àmthế 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ườidùng
Hiện nay có nhiều phương pháp quy ước định nghĩa, đồ án này trình bày mộtphươ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
Trang 8Do còn hạn chế về mặt kiến thức và thời gian, đồ án không tránh khỏi nhữngthiế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
Trang 9CHƯƠ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:
tục nhau trong bộ nhớ (Mảng)
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 node[MAX]; //Dữ liệu lưu trữ trong stack gồm MAX phần tử
} Stack;
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:
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ôngrỗ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
thực hiện khi và chỉ khi ngăn xếp không rỗng
Trang 101.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ểudiễ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 ) { //x là node cần thêm vào stack
s ->top = (s ->top) +1; //Tăng con trỏ top lên 1 đơn vị
s->Node[s ->top] = x; //Lưu trữ x tại vị trí top
}
else <thông báo tràn stack>;
}
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ỗnghay 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ếprỗ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ỏ
Trang 12CHƯƠ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áctoá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ánhạ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):
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
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:
Trang 13Đọc giá trị hậu tố từ trái qua phải:
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ốicù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);
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 = ∅;
Trang 14y = get(stack);
a) Nếu priority(x)≥priority(y): Push(stack, x); b) Nếu priority(x)<priority(y):
y = Po(stack); y⇒Out; Push(stack, x);
c) Nếu stack = ∅: Push(stack, x);
Kiểm nghiệm thuật toán: P = (a+b*c) (− a/b+c)
x∈P Bước Stack Out
Trang 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
- Hàm chuyển đổi biểu thức số học thông thường sang biểu thức hậu tố
• 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
Trang 17}if(s.top() == '(' ) s.pop();
}else{
while( !s.empty() && uT(c) <= uT(s.top())){
hauto=hauto+s.top();s.pop();
}s.push(c);
}}
}}
s.pop();
}
cout<<hauto;
}
Trang 18Hàm này tính giá trị 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");
}
Trang 193.2 Demo chương trình
Trang 20KẾT LUẬNKẾ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ứcthô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:
hàm trong ngôn ngữ C/C++ theo dạng mạ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ácphé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 đề raphương hướng nghiên cứu và phát triển trong tương lai như sau:
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 đặcbiệt như logarit, sin,cos,tan,… tính toán dữ liệu theo kiểu float,double…
Trang 21TÀI LIỆU THAM KHẢO
Tiếng Việt
tâm In tranh Tuyên truyền cổ động – Mai Dịch
Trình Đại học Sư phạm Hà Nội.
Các website
1 https://vi.wikipedia.org/wiki/Kí _pháp_Ba_Lan
2 http://congdongcviet.com/
3 http://vietjack.com/