Viết các class cơ bản cho chương trình, thread tìm đích tới của thang máy và thread đi chuyển1 tuần Nguyễn Bá Thủy: Viết thread đóng và mở cửa, bổ sung các hàm con trong class elevator 1
Trang 1VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
──────── * ───────
BÀI TẬP LỚN
MÔN: KỸ THUẬT LẬP TRÌNH
NHÓM PE10
Sinh viên thực hiện : Võ Tiến Tú
Vũ Đình Ba Nguyễn Bá Thủy Phạm Thanh Tùng
Giáo viên hướng dẫn : TS Vũ Thị Hương Giang
Trang 2MỤC LỤC
MỤC LỤC 2
LỜI NÓI ĐẦU 3
PHÂN CÔNG THÀNH VIÊN TRONG NHÓM 4
CHƯƠNG 1 PHÂN TÍCH YÊU CẦU VÀ THIẾT KẾ GIẢI PHÁP 5
CHƯƠNG 2 CÀI ĐẶT CHƯƠNG TRÌNH 11
b Giao diện bắt đầu chương trình (với user) 13
.14
c.Yêu cầu thang máy đi đến tầng chỉ định: 14
.15
d Gọi thang máy lên(xuống): 15
.16
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 17
TÀI LIỆU THAM KHẢO 18
PHỤ LỤC 19
Trang 3LỜI NÓI ĐẦU
Hệ thống điều khiển thang má, như nhóm đã tìm hiểu là 1 hệ thống điển hình trong xử lí hàng đợi Tuy nhiên việc xây dựng một cấu trúc hàng đợi cho thang máy đôi hay ba là việc khó khăn.
Trong khuôn khổ môn kĩ thuật lập trình, chúng tôi muốn mô phỏng thang máy dựa trên lập trình hướng đối tượng để có 1 cấu trúc đơn giản cho thang máy
Mục đích của bài tập lớn là thiết lập một chương trình điều khiển hoạt động của một cụm hai thang máy cho tòa nhà D6.
Trang 4PHÂN CÔNG THÀNH VIÊN TRONG NHÓM
Võ tiến Tú: Tìm hiểu các tài liệu để xây dựng chương trình mô phỏng thang máy theo hướng đối tượng (1 tuần) Viết các class cơ bản cho chương trình, thread tìm đích tới của thang máy và thread đi chuyển(1 tuần)
Nguyễn Bá Thủy: Viết thread đóng và mở cửa, bổ sung các hàm con trong class elevator (1 tuần)
Phạm Thanh Tùng: Viết giao diện nhập và xuất, bổ sung các hàm con trong class systemControl(1 tuần)
Vũ Đình Ba: bổ sung các hàm con trong class floor(4 ngày).
Trang 5CHƯƠNG 1 PHÂN TÍCH YÊU CẦU VÀ THIẾT KẾ GIẢI PHÁP
<Trình bày, mô tả chi tiết về các kết quả khảo sát về bài toán – thông qua đề bài và sau những lần trao đổi, gặp mặt các thành viên trong nhóm>
<Thiết kế dữ liệu, giải thuật, giao diện chương trình>
1.1 Mô tả yêu cầu bài toán
Bài toán đưa ra những yêu cầu cơ bản như ra các lệnh đóng, mở cửa thang máy; di chuyển thang máy lên, xuống theo yêu cầu của người dùng Đồng thời, thang máy phải
có cách sắp xếp và thực hiện lệnh của nhiều người dùng khác nhau cũng như phân công chức năng hoạt động giữa hai thang máy với nhau sao cho việc giải quyết những yêu cầu của người dùng được thực hiện hiệu quả và nhanh nhất Kèm theo đó, thang máy cần có những bảo đảm an toàn về trọng lượng, có chuông báo động và tính năng giữ an toàn khi đang di chuyển
1.2 Biểu đồ IPO
Bao gồm 2 phần chức năng dành cho user (người sử dụng ở bên trong hoặc bên ngoài thang máy) và admin (người điều khiển)
1.2.1 Admin
1.2.1.1 Chức năng 1: Bật báo động
Tên thang máy Kiểm tra tên thang máy
Kiểm tra trạng thái đèn báo động
Ghi trạng thái đèn là 1
Thông báo đã nhập lệnh (hoặc báo lỗi)
Trạng thái đèn thang máy
1.2.1.2 Chức năng 2: Tắt báo động
Tên thang máy Kiểm tra tên thang máy
Kiểm tra trạng thái đèn báo động
Ghi trạng thái đèn là 0
Thông báo đã nhập lệnh (hoặc báo lỗi)
Trạng thái đèn thang máy
Trang 61.2.1.3: Chức năng 3: Chọn tầng đến
Tên thang máy E
Tên tầng F
Kiểm tra tên thang máy và tên tầng
Ghi vào mảng CallUp[F]
[E] =1 CallDown[F][E] =1
Thông báo đã nhập lệnh (hoặc báo lỗi)
1.2.1.4: Chức năng 4: Yêu cầu mở cửa thang máy
Tên thang máy E Kiểm tra tên thang máy
Kiểm tra trạng thái di chuyển
Tìm tầng hiện tại F Ghi vào mảng CallUp[F]
[E] =1 CallDown[F][E] =1
Thông báo đã nhập lệnh (hoặc báo lỗi)
1.2.1.5: Chức năng 5: Khởi động lại hệ thống
Lệnh khởi động hệ thống Thông báo đã khởi động lại
1.2.1.6: Chức năng 6: Chuyển quyền sử dụng cho người dùng
Lệnh chuyển quyền sử
dụng
In ra màn hình Hệ thống các lệnh dành cho
người dùng 1.2.1.7: Chức năng 7: Thoát
Trang 7Lệnh thoát In ra màn hình Lời tạm biệt người dùng
1.2.2: User:
1.2.2.1: Chức năng 7: Bật báo động
Giống như Admin
1.2.2.2: Chức năng 8: Gọi thang máy đi lên (dành cho người dùng bên ngoài thang máy)
Tên tầng F Kiểm tra tên tầng
Ghi vào mảng CallUp[F]
[E] =1 cho cả hai thang máy
Thông báo đã nhập lệnh (hoặc báo lỗi)
1.2.2.3: Chức năng 9: Gọi thang máy đi xuống (dành cho người dùng bên ngoài thang máy)
Tên tầng F Kiểm tra tên tầng
Ghi vào mảng CallDown[F][E] =1 cho cả hai thang máy
Thông báo đã nhập lệnh (hoặc báo lỗi)
1.2.2.4: Chức năng 10: Chọn tầng cần đến (dành cho người dùng bên trong thang máy)
Giống như Admin
1.2.2.5: Chức năng 11: Yêu cầu mở cửa thang máy
Giống như Admin
1.2.2.6: Chức năng 12: Chuyển quyền sử dụng cho Admin
Trang 8Lệnh chuyển quyền sử
dụng
In ra màn hình Đã thực hiện lệnh
1.3 Thiết kế chương trình
Các thành phần :
Người sử dụng, người quản lí, giao diện hiển thị, bộ điều khiển đối tượng điều khiển
(1) Thang máy nhận lệnh bật báo động, tắt báo động, lệnh đi chuyển( lên, xuống hoặc đứng yên), đổi khóa di chuyển , mở cửa, đóng cửa, đổi khóa cửa, reset từ bộ
điều khiển
(2): Bộ điều khiển có khả năng lấy thông tin về vị trí tầng, trạng thái di chuyển, khóa
di chuyển, trạng thái cửa, khóa cửa
(3): Tầng nhận lệnh có yêu cầu chọn thang ở tầng số … , có yêu cầu đi lên hoặc đi xuống từ tầng …, reset từ bộ điều khiển.
(4): Bộ điều khiển có khả năng lấy thông tin về các yêu cầu được ghi tại mỗi tầng.
Class: Bộ điều khiển g
Người
sử dụng
Người quản lí
Giao diện hiển thị Đồi tượng điều khiển
Thang Tầng máy
Trang 91.4 Thiết kế dữ liệu
Dữ liệu được thiết kế và thể hiện thông qua các class Có 2 nhóm class chính phục vụ cho việc theo dõi trạng thái của thang máy và theo dõi vị trí và lệnh của người dùng
Trong nhóm class phục vụ cho việc theo dõi trạng thái thang máy, những biến chính được sử dụng là:
Evelator - int: thể hiện tên thang máy, với 0 chỉ thang máy 1, 1 chỉ thang máy 2,
và -1 là không chỉ thang máy nào
Direction - int: chỉ chiều thang máy đi, với 1 là đi lên và -1 là đi xuống
Floor - int: Vị trí tầng của thang máy
State - int: Trạng thái di chuyển của thang máy, với 1 là đi lên, -1 là đi xuống
Ngoài ra còn có một số biến đếm int khác được sử dụng để đếm thời gian di chuyển cho thang máy như: isClosingDoor, CountTimeDoor, CountTimeFloor…
Trong nhóm class phục vụ cho việc theo dõi người dùng, có 2 biến chính là CallUp – bool và CallDown – bool
Các giá trị này được đưa vào mảng hai chiều CallUp[F][E] hay CallDown[F][E] theo cách thức sau:
F: tên tầng, E: tên thang máy : thể hiện bằng biến int
Quy ước: 0 chỉ thang máy 1, 1 chỉ thang máy 2
Khi có lệnh gọi thang máy đi lên tầng F: CallUp[F][0] = CallUp[F][1] = 1
Khi có lệnh gọi thang máy đi xuống tầng F:
CallDown[F][0] = CallDown[F][1] = 1 Khi có lệnh chọn tầng cần đến F của thang máy E:
CallUp[F][E] = CallDown[F][E] = 1
Các giá trị này sẽ bị xóa đi khi thang máy thực hiện lệnh mở cửa tại tầng F ứng với mỗi lệnh
1.5 Thiết kế giải thuật
Thuật toán dựa trên các hàm goi là thread Trong đó, hàm ThreadMove1 và ThreadMove2 điều khiển quá trình di chuyển của thang máy, hàm ThreadOpenDoor1
và ThreatOpenDoor2 điều khiển sự mở cửa thang máy, hàm ThreadCloseDoor1 và ThreadCloseDoor2 điều khiển sự đóng thang máy
Trang 10Những Thread này được thực hiện độc lập với các lệnh nhập dữ liệu từ người dùng (bao gồm lệnh gọi thang máy, lệnh chọn tầng muốn đến…)
Những Thread hoạt động theo cách thức so sánh giá trị vị trí tầng của thang máy với vị trí tầng của lệnh Thang máy sẽ mở (đóng) khi vị trí tầng của nó trùng với tên tầng của lệnh Hàm ThreadMove1 (ThreadMove2) sẽ thay đổi vị trí tầng của thang máy 1 (thang máy 2) tăng lên 1 hay giảm đi 1 trong khi không còn tên tầng của bất kì lệnh nào trùng với vị trí tầng của thang máy
ThreadFindAction luôn thực hiện để tìm ra hành động tiếp theo của thanh máy và nó gián tiếp ra lệnh cho các thread ở trên thực hiện
Trang 11CHƯƠNG 2 CÀI ĐẶT CHƯƠNG TRÌNH
2.1 Các kỹ thuật lập trình đã áp dụng
<Liệt kê các kỹ thuật lập trình đã sử dụng để làm bài tập lớn >
…
I Các kỹ
thuật bẫy lỗi và
1 Bẫy lỗi nhập từ bàn phím,
và xóa bộ nhớ đệm trước Hàm scanf trong hàm main
STT Mô tả kỹ thuật / quy tắc Mô tả đối tượng áp dụng
(hàm, biến, biểu thức, câu lệnh) và phạm vi áp dụng
I Các kỹ
thuật làm việc
với biến
1 Đặt tên biến nhất quán, Ngắn gọn, có tính chất gợi nhớ
Các biến trong các class và main
2 Các biến đếm, biến trung gian: đặt tên bằng 1 chữ cái:
biến đếm i,j
Các biến trong các class và main
II Các kỹ
thuật viết mã 1 Sử dụng các khoảng trống
hợp lý, phân đoạn chương trình, đánh dấu cấu trúc phân cấp
Trong toàn bộ hàm và từng đoạn chương trình
2 Sử dụng else if trong cấu trúc đa lựa chọn Trong các hàm
3 Gióng hàng trong các biểu thức điều kiện để tránh nhầm lẫn
Trong toàn bộ hàm và từng đoạn chương trình
III Các kỹ
thuật thiết kế
chương trình
1 Sử dụng chương trình con Chia chương trình ra thành các
hàm
2 Tạo file header File PE10_Cursor
3 Đóng gói, bao bọc Trong các class
IV Các kỹ
thuật xây dựng
hàm/thủ tục
1 Đặt tên hàm gợi nhớ, tiện sử dụng
Toàn bộ các hàm trong chương trình
2 Tham chiếu con trỏ, truyền giá trị với biến int va bool Trong toàn chương trình
3 Inline funtions Các hàm đơn giản trong các
class
4 Sử dụng lính canh Trong các vòng lặp
Trang 12lập trình phòng
ngừa
biệt trước khi xử lí
…3 Assertion Các hàm quan trọng và các
thread trong chương trình
II Phong
cách lập trình
1 Luôn gióng hàng các câu lệnh sau dấu mở ngoặc
Toàn bộ chương trình
2 Chú thích đầy đủ Toàn bộ chương trình
3 Gióng hàng giữa các câu lệnh
Toàn bộ chương trình
4 Gióng hàng các cặp mở đóng ngoặc nhọn cùng cấp
Toàn bộ chương trình
5 Dùng dòng trống để chia code thành các đoạn chính
Toàn bộ chương trình
2.2 Kết quả chương trình
<Trình bày tổng quan về kết quả đạt được trong quá trình làm bài tập lớn trong chương trình minh họa, nêu qua những chức năng chính đã thực hiện được>
Chức
năng
(đán
h số
theo
menu
từ
1-14)
Chữ ký (Khai báo chức năng) Tình trạng khi nộp bài
( 0 : chưa làm
1 : chưa chạy
2 : chạy thông và chưa bắt
hết ngoại lệ 3: chạy thông và có bắt hết
ngoại lệ)
Người thực hiện : ai làm
gì
(X: cài đặt Y: kiểm thử)
2.3 Giao diện chương trình
a, Giao diện bắt đầu chương trình (với admin)
Trang 13b Giao diện bắt đầu chương trình (với user)
Trang 14c.Yêu cầu thang máy đi đến tầng chỉ định:
Trang 17KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN
Chương trình thiết kế theo hướng đối tượng nên có ưu điểm là cấu trúc rõ ràng, dễ dàng mở rộng với các chức năng nhập số người và khống chế số người, thêm tầng, thêm thang … Do mô hình hóa được các câu lệnh phức tạp nên vẫn đề cần xem xét quan trọng nhất chỉ tập trung vào ThreadFindAction nếu muốn cải tiến thuận toán theo cách di chuyển chẵn lẻ hay khống chế tầng
Do sử dụng nhiều thread đồng thời nên chương trình phụ thuộc nhiều vào phần cứng của hệ thống, độ trế thời gian phải được xem xét tới Cách khắc phục:
- Thay đổi cách biểu hiện của class elevator ngay từ khi gọi thread
- Tính đến trế thời gian, dùng hàm Sleep(200) hoặc Sleep(100)
(đã thựu hiện)
Nhược điểm cuối cùng là giao diện nhập dữ liệu cùng với giao diện in ra nên có trường hợp xảy ra lẫn con trỏ in ra hoặc nhập vào Cách khắc phục:
- Tạo giao diện đồ họa riêng (do khó khăn trong sử dụng đồ họa C nên nhóm chưa đủ thời gian để sửa đổi giao diện)
Trang 18
TÀI LIỆU THAM KHẢO
[1] Slide môn Kỹ thuật lập trình của cô Vũ Thị Hương Giang
[2] The Art of Computer Programming tập 3 - Donald Knuth
Trang 19PHỤ LỤC
Chú ý kèm file PE10_Cursor.h cùng với file ElevatorSimalation.cpp trong cùng 1 folder, hoặc đính kèm file header khi chạy devC++
Chương trình hoạt động tốt trên môi trường Window, bạn có thể bật lên và sử dụng
mà không cần thêm thao tác cài đặt