Tuy nhiên, nhiều rạp chiếu phim vẫn áp dụng phương pháp quản lý thủ công, dẫn đến nhiều bất cập như tốn thời gian và công sức trong việc lưu trữ thông tin phim, suất chiếu, và khách hàng
CƠ SỞ LÝ THUYẾT
Ý tưởng
- Khi bắt đầu công việc,nhân viên nhập vào tài khoản và mật khẩu để bắt đầu quản lí.
- Chương trình tự động quét tất cả thông tin phim,nhân viên,phòng chiếu và ghi vào chương trình.
- Tại đây,nhân viên có thể chỉnh sửa,cập nhật nhanh thông tin phim.
- Nhân viên có thể đặt vé cho khách hàng.
- Chương trình sẽ tự động phân bổ suất chiếu của các bộ phim vào khung giờ hợp lí.-Thống kê doanh số theo từng bộ phim.
Cơ sở lý thuyết
2.2.1 Cấu trúc dữ liệu Stack với Pointer Array
Mảng con trỏ là một loại mảng mà mỗi phần tử của nó là một con trỏ, cho phép trỏ đến một vùng nhớ chứa giá trị thay vì lưu trữ trực tiếp giá trị trong mảng.
Đỉnh Stack (top): Là biến chỉ số theo dõi vị trí cao nhất (đỉnh) của stack.
Kích thước cố định (MAX_SIZE): Là giới hạn số phần tử mà stack có thể chứa.
Hình 1 Minh họa cấu trúc dữ liệu stack
Thư viện này được sử dụng để thực hiện nhập/xuất dữ liệu từ dòng lệnh (console) trong C++.
Cung cấp các đối tượng và hàm như std::cin, std::cout, std::cerr, và std::clog, trong đó std::cout được sử dụng để in dữ liệu ra màn hình, trong khi std::cin cho phép nhập dữ liệu từ người dùng.
4Trần Xuân Bách– Hồ Khang Hy 23.16B ĐỒ ÁN CƠ SỞ LẬP TRÌNH
Thư viện C chuẩn trong C++ dùng để thực hiện nhập/xuất dữ liệu theo cách truyền thống của ngôn ngữ C.
Cung cấp các hàm như printf, scanf, fgets, fputs, fopen, fclose, v.v.
Công dụng: fprintf: Xuất dữ liệu theo định dạng. fscanf: Nhập dữ liệu theo định dạng.
Các thao tác với file như đọc, ghi (fopen, fclose, fprintf).
Thư viện này được sử dụng để định dạng đầu ra dữ liệu.
Cung cấp các hàm hỗ trợ định dạng số thập phân, căn lề, độ rộng, v.v.
The C++ standard library provides several useful manipulators for formatting output The `std::setw` function sets the width of the output field, while `std::setprecision` specifies the number of decimal places to display The `std::fixed` manipulator ensures that numbers are printed in a fixed-point notation Additionally, `std::left` and `std::right` allow for left or right alignment of the output, enhancing the readability of formatted data.
2.2.3 Tạo ra các lớp tổng quát
Class Template (Template lớp) Ý nghĩa:
Là các lớp có thể hoạt động với nhiều kiểu dữ liệu khác nhau.
Thay vì viết nhiều lớp riêng biệt cho từng kiểu dữ liệu, ta viết một lớp duy nhất dùng template parameter.
TỔ CHỨC CẤU TRÚC DỮ LIỆU VÀ THUẬT TOÁN
Phát biểu bài toán
Bài viết này trình bày hai loại file thông tin quan trọng File đầu tiên chứa thông tin về các bộ phim, với mỗi dòng bao gồm mã phim, tên phim, tên đạo diễn, thể loại, thời lượng, điểm số và số suất chiếu trong một ngày File thứ hai cung cấp thông tin về nhân viên, trong đó mỗi dòng ghi rõ tên đăng nhập, mật khẩu, mã nhân viên, tên nhân viên, giới tính, ngày sinh, số điện thoại, địa chỉ và chức vụ.
In ra vé xem phim của khách hang(mã vé.txt)
Cấu trúc dữ liệu
*Định nghĩa các cấu trúc trong chương trình a.Class stack
6 Trần Xuân Bách– Hồ Khang Hy 23.16B template class Stack { private:
T* arr[MAX_SIZE]; int top; int capacity; public:
~Stack(); bool push(T* value); bool push(const T&);
T& getAt(int index) const {return *arr[index];} int getTop() const {return top;}; bool isEmpty() const; bool isFull() const; void display(); void add(const char*);
T* findById(string); void sortById(); void edit(const char*); void Delete(const char*);
}; ĐỒ ÁN CƠ SỞ LẬP TRÌNH b Class Movie
+ showtime: Số suất chiếu. c Class Staff
7 class Movie { private: string id; int duration; string name; double rating; string director; int showTime; string genre; public:
Movie(const string&, const string&, const string&, const string&, int, double,int );
The Movie class provides essential methods for managing film attributes, including retrieving and setting properties such as ID, name, rating, duration, director, genre, and showtime Key functions include getid(), getrating(), getname(), getduration(), getdirector(), getShowTime(), and getgenre() for accessing these values, while set() allows for comprehensive updates to multiple attributes simultaneously Individual setters like setid(), setShowTime(), setname(), setrating(), setdirector(), setduration(), and setgenre() enable precise modifications Finally, displayInfo() presents the movie's details, ensuring users can easily view and understand the film's information.
}; class Staff { protected: string username; bool gender; string password; string birth; string id; string phonenumber; string name; string address; string role; public:
The `Staff` class constructor initializes various attributes, including username, password, ID, name, gender, birthdate, phone number, address, and role It provides getter methods for retrieving these attributes, such as `getusername()`, `getpassword()`, and `getid()`, among others Additionally, the class includes setter methods to update the password, phone number, and address The `displayInfo()` function is declared as a pure virtual function, requiring derived classes to implement their specific display logic.
Class RoomStaff kế thừa từ class Staff.
Class TicketStaff kế thừa từ clas Staff
8 Trần Xuân Bách– Hồ Khang Hy 23.16B class RoomStaff : public Staff{ private: public:
RoomStaff(const string&, const string&, const string&, const string&, bool, const string&, const string&, const string&, const string&); void displayInfo() const;
}; class TicketStaff : public Staff{ private: double rating; public:
The TicketStaff class is designed to manage ticket-related information, incorporating multiple string parameters and a boolean value for enhanced functionality It features methods to retrieve and set the rating, ensuring efficient data handling Additionally, the Manager class extends the Staff class, introducing a private department attribute, which allows for better organization and management within the team.
The Manager class is defined with multiple parameters, including department and various string attributes The method getdepartment() is implemented to return the value of the department This article discusses the foundational concepts of programming projects.
Class Manager kế thừa từ class Staff
Thuật toán
Thuật toán của bài toán quản lý bưu kiện được thể hiện qua:
3.3.1 Thuật toán phân phối suất chiếu
Bước 1: Khởi tạo biến top, filmIndex, dex, totalShowTime và mảng a[] chứa số lượng số chiếu trong 1 ngày của các bộ phim
Khai báo mảng m[7][5] tương ứng với 5 phòng và mỗi ngày 1 phòng chiếu tối đa 7 suất
Bước 2: Lặp qua từng suất chiếu (i là thứ tự chiếu, j là phòng chiếu):
Vòng lặp i từ 0 đến 6 (tương ứng 7 suất chiếu/ngày).
Vòng lặp j từ 0 đến 4 (tương ứng 5 phòng chiếu).
Bước 3: Bỏ qua phim hết suất chiếu:
Nếu a[filmIndex]==0 , tăng filmIndex (vòng tròn với %( top+1 ) để chuyển sang phim kế tiếp.
Bước 4: Phân bổ suất chiếu:
Gán m[i][j]= stackMovie.getAt(filmIndex).getid() (gán ID phim vào suất chiếu).
Giảm a[filmIndex] để cập nhật số suất chiếu còn lại.
Bước 5 Kiểm tra điều kiện dừng:
Tăng dex++ Nếu dex-> totalShowTime, dừng hàm (return).
Bước 6 Chuyển sang phim kế tiếp:
Tăng filmIndex lên phim kế tiếp (vòng tròn với %(top +1))
Bước 1: Tạo ID mới bằng cách tìm ID lớn nhất trong stackMovie sau đó thêm 1 đơn vị.
Bước 2: Nhập thông tin phim mới:
Tiêu đề (title) ,đạo diễn (director), thể loại (genre), thời lượng
(duaration) ,đánh giá (rating), và số suất chiếu (showTime) từ người dùng.
Bước 3: Tạo đối tượng phim mới:
Bước 3.1: Gán ID mới (newID) cho phim vừa nhập.
Bước 3.2: Khởi tạo đối tượng Movie với các thông tin vừa nhập và ID mới. Bước 4: Thêm phim vào stack:
Gọi hàm push() để thêm phim mới vào stack.
Bước 5: Ghi lại danh sách phim vào file:
Mở file filename ở chế độ ghi.
3.3.3 Thuật toán chỉnh sửa thông tin phim.
Bước 1: Tìm phim theo ID ,Gọi hàm findByID() để tìm phim trong stack.
Nếu không tìm thấy, thông báo và kết thúc hàm.
Bước 2: Nhập số lượng thuộc tính cần sửa.Yêu cầu người dùng nhập số lượng thuộc tính muốn chỉnh sửa.
Bước 3: Vòng lặp sửa thuộc tính bao gồm việc lặp qua số lượng thay đổi mà người dùng yêu cầu Đầu tiên, hiển thị danh sách các thuộc tính có thể chỉnh sửa, sau đó yêu cầu người dùng nhập lựa chọn thuộc tính Cuối cùng, cập nhật giá trị mới cho thuộc tính đã chọn.
Bước 4: Sắp xếp lại stack Gọi hàm sortByID() để đảm bảo stack được sắp xếp theo ID.
Bước 5: Ghi thông tin vào file
Mở file dữ liệu chính (filename) và ghi lại toàn bộ thông tin của các phim trong stack.
Bước 1 Tìm phim theo ID Nhập ID cần xóa, tìm trong stack Nếu không tìm thấy, thoát.
Bước 2 Xóa phim.(gọi hàm delete) Tìm và xóa phim khỏi mảng.
Bước 3 Ghi lại dữ liệu vào file Cập nhật file với danh sách các phim còn lại trong stack.
3.3.5.Thuật toán gán thời gian chiếu
Bước 1 Xác định freetime Tùy vào tổng suất chiếu, chọn thời gian nghỉ giữa các suất.
Bước 2 Khởi tạo thời gian: Bắt đầu từ 8:00 sáng (28800 giây)
Bước 3 Duyệt phòng và suất chiếu:
Với mỗi phòng (5 phòng),Với mỗi suất chiếu (7 suất):
Lưu thời gian bắt đầu vào mảng h[i][j].Cộng 2 giờ phim và freetime để tính giờ tiếp theo.
10Trần Xuân Bách– Hồ Khang Hy 23.16B ĐỒ ÁN CƠ SỞ LẬP TRÌNH
CHƯƠNG TRÌNH VÀ KẾT QUẢ
Ngôn ngữ cài đặt
C++ là một ngôn ngữ lập trình đa mục đích được phát triển bởi Bjarne
Vào đầu thập niên 1980, Bjarne Stroustrup đã phát triển C++ với mục tiêu mở rộng ngôn ngữ C bằng cách tích hợp các tính năng lập trình hướng đối tượng (OOP) C++ kết hợp hiệu quả của C và tính linh hoạt của OOP, cho phép phát triển đa dạng các ứng dụng từ nhỏ đến lớn, bao gồm hệ thống nhúng, phần mềm quản lý và các ứng dụng hiệu năng cao.
C++ mang lại hiệu suất cao nhờ tối ưu hóa khả năng truy cập bộ nhớ và xử lý dữ liệu, rất phù hợp cho các ứng dụng yêu cầu xử lý khối lượng lớn thông tin, chẳng hạn như hệ thống quản lý rạp chiếu phim.
Hỗ trợ lập trình hướng đối tượng: C++ cung cấp các khái niệm như lớp
(class), đối tượng (object), kế thừa (inheritance), và đa hình (polymorphism), giúp tổ chức mã nguồn rõ ràng và dễ bảo trì.
1 Sơ đồ tổ chức chương trình chính
Hình 2 Sơ đồ tổ chức chương trình quản lí rạp chiếu phim.
Các thư viện được sử dụng trong chương trình
4.2 1 Các nguyên mẫu hàm được xây dựng trong chương trình
Nguyên mẫu hàm Chức năng
Để đọc thông tin nhân viên phòng, sử dụng hàm `readRoomStaffFromFile(const char*, Stack&)` Để đọc thông tin nhân viên bán vé, áp dụng hàm `readTicketStaffFromFile(const char*, Stack&)` Để đọc thông tin của quản lý, gọi hàm `readManagerFromFile(const char*, Stack&)` Cuối cùng, để đọc thông tin phim, sử dụng hàm `readMovieFromFile(const char*, )`.
Stack&); Đọc thông tin chi tiết của phim void readRoomFromFile(const
Stack& stackRoom); Đọc thông tin các ghế ngồi của phòng void readShowTimes(const
Stack& stackMovie, int a[]); Đọc suất chiếu int totalShowTimeCount(const
Stack& stackMovie, int a[]); Hàm tính tổng các suất chiếu trong 1 ngày void initializeArray(string m[7][5]); Hàm khởi tạo mảng thứ tự các suất chiếu void allocateShowTimes(const
Stack& stackMovie, string m[7][5], int a[20]);
Hàm gán suất chiếu void convertSecondsToHours(int seconds); Hàm chuyển đổi thời gian void ThoiGianChieu(const
Hàm gán suất chiếu void ShowTimeTheoPhim(const
Stack& stackMovie,string m[7][5],int h[7][5],string &index);
Hàm in ra 1 suất chiếu void ShowTimeAllPhim(const
Stack& stackMovie,string m[7][5],int h[7][5], int a[20]); Hàm in ra tất cả các suất chiếu void XuLySuatChieu(Stack& stackMovie ,string m[7][5],int h[7][5], int a[20]);
Hàm xử lý suất chiếu int
ReturnPhongChieu(Stack& stackMovie,string m[7][5],int h[7][5],
Hàm trả về phòng chiếu
13 int a[20],string id,int SuatChieuMua); void InVe(const string& ticketId); Hàm in vé chiếu phim void DatVe(Stack& stackMovie,Stack& stackRoom);
Hàm đặt vé xem phim void ResetRoom(int totalShowTimeCount);
Hàm cài lại trạng thái ghế ở tất cả các phòng bool login(Stack&,
Hàm đăng nhập tài khoảng nhân viên void displayUserInfo(); Hàm hiển thị thông tin nhân viên interFace(stackMovie, stackRoomStaff, stackTicketStaff, stackManager, stackRoom);
Hàm giao diện các thao tác xử lí
4.2.2 Thiết kế file cơ sở dữ liệu đầu vào
- Cấu trúc file: Mỗi entry của file gồm 7 trường:
ID phim, Tên phim, đạo diễn, thể loại, thời gian, điểm, số suất chiếu trong 1 ngày
Hình 3 Thông tin của phim
- Cấu trúc file : Mỗi entry của file gồm 10 trường:
Tên đăng nhập, mật khẩu, Tên nhân viên, giới tính, ngày sinh, số điện thoại, địa chỉ, chức vụ, điểm.
14Trần Xuân Bách– Hồ Khang Hy 23.16B ĐỒ ÁN CƠ SỞ LẬP TRÌNH
Hình 4 Thông tin nhân viên
- Cấu trúc file : Mỗi entry của file gồm 10 trường:
Tên đăng nhập, mật khẩu, Tên nhân viên, giới tính, ngày sinh, số điện thoại, địa chỉ, chức vụ, điểm
Hình 5 Thông tin của nhân viên phòng
- Cấu trúc file : Mỗi entry của file gồm 10 trường:
Tên đăng nhập, mật khẩu, Tên nhân viên, giới tính, ngày sinh, số điện thoại, địa chỉ, chức vụ, chi nhánh
Hình 6 Thông tin của quản lý
- Tên file: (suất chiếu).txt
- Cấu trúc file : Mỗi entry của file gồm 64 chỗ ngồi và trạng thái:
Hình 7 Thông tin ghế ngồi của 1 phòng
Kết quả
4.3.1 Giao diện đăng nhập của chương trình.
8 Giao diện đăng nhập của chương trình
16Trần Xuân Bách– Hồ Khang Hy 23.16B ĐỒ ÁN CƠ SỞ LẬP TRÌNH
4.3.2 Giao diện chính của chương trình.
Hình 9 Giao diện chính của chương trình khi đăng nhập với tư cách Room Staff
Hình 10 Giao diện chính của chương trình khi đăng nhập với tư cách Ticket Staff
Hình 11 Giao diện chính của chương trình khi đăng nhập với tư cách Manager
Giao diện chính của chương trình hiện các chức năng của chương trình bao gồm: + Tra vé khách hàng
+ Tra bảng giờ của các phim
+ Quản lý phòng (tình trạng ghế, doanh thu, )
+ Quản lý nhân viên (hiển thị, thêm, sửa thông tin, xóa)
+ Quản lý phim (hiển thị, thêm, sửa thông tin, xóa)
+ Đăng xuất a, Tra vé khách hàng:
18Trần Xuân Bách– Hồ Khang Hy 23.16B ĐỒ ÁN CƠ SỞ LẬP TRÌNH
Hình 12 Tìm và kiểm tra vé khách hàng thông qua ID vé b, Xem bảng giờ và phòng chiếu của các phim :
Hình 13 Xem bảng giờ của tất cả các phim trong ngày c, Đặt vé cho khách hàng
Hình 14 Nhập tên khách hàng
Hình 15 Chọn phim cho khách hàng
Hình 16 Chọn suất chiếu của phim theo yêu cầu khách hàng
Hình 17 Hiển thị các ghế khả dụng trong suất chiếu khách hàng chọn
20Trần Xuân Bách– Hồ Khang Hy 23.16B ĐỒ ÁN CƠ SỞ LẬP TRÌNH
Hình 18 Cập nhật và xác nhận trạng thái ghế của phòng d, Quản lý phòng
Hình 19 Hiện ra các lựa chọn để thao tác với phòng
Hình 20 Hiển thị tình trạng các ghế của phòng theo ID và suất chiếu
Hình 21 Duyệt và hiển thị doanh thu của một phim theo ID e, Quản lý phim:
Hình 22 Hiển thị các lựa chọn để thao tác với phim
22Trần Xuân Bách– Hồ Khang Hy 23.16B ĐỒ ÁN CƠ SỞ LẬP TRÌNH
Hình 23 Nhập thông tin của phim mới
Hình 24 Chỉnh sửa thông tin phim dựa theo ID phim
Hình 25 Lựa chọn những thông tin cần được thay đổi f, Quản lý nhân viên
Hình 26 Lựa chọn các chức năng them,sửa xoá nhân viên.
4.3.3 Kết quả thực thi của chương trình
Trong quá trình làm việc, các suất chiếu phim sẽ được xử lý tự động Nhân viên sẽ đặt vé cho khách hàng tại quầy và lưu trữ thông tin vào file để đảm bảo an toàn dữ liệu Nếu có sai sót trong quá trình làm việc, việc kiểm tra sẽ diễn ra nhanh chóng.
Chương trình sẽ tự động tính tổng doanh thu của bộ phim đó mang lại để dễ dàng kiểm tra và thống kê.
Hình 27 File chương trình dùng để lưu thông tin vé khách hàng
Hình 28 Dữ liệu các vé của khách hang.
24Trần Xuân Bách– Hồ Khang Hy 23.16B ĐỒ ÁN CƠ SỞ LẬP TRÌNH
Phần mềm đã đáp ứng đầy đủ các yêu cầu cơ bản của Đồ án, với các kết quả thực hiện đạt tiêu chí ban đầu Ngoài ra, phần mềm còn được cải tiến với một số tính năng bổ sung, góp phần hoàn thiện Đồ án hơn nữa.
Giao diện đồ họa thân thiện, dễ sử dụng giúp người dùng dễ dàng thao tác với bảng chọn và tối ưu hóa các thuật toán cùng cấu trúc dữ liệu trong bài viết.
Phần mềm có thể gặp lỗi khi kiểu dữ liệu đầu vào không tương thích với kiểu dữ liệu của biến nhận Điều này dẫn đến những sự cố nhỏ trong quá trình hoạt động của phần mềm.