Thuộc tính: - capacity kích thước hiện tại của vector - num số lượng phần tử thực tế trong vector - mảng chứa các phần tử của vectorvt Phương thức: - Vector: Khởi tạo một vector rỗng.. -
Trang 1BÁO CÁO BÀI TẬP LỚN MÔN HỌC:
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
Sinh viên thực hiện: Nguyễn Đình Tuấn Anh
Mã sinh viên: 221231039
Lớp: Công nghệ thông tin 4 – K63
Người hướng dẫn: TS Hoàng Văn thông
Trang 2MỤC LỤC
MỤC LỤC 2
LỜI CẢM ƠN 3
MỞ ĐẦU 4
CHƯƠNG 1 BÀI 1(BÀI SỐ 20) 5
1.1 Đề bài 5
1.2 Phân tích bài toán 5
1.2.1 Xây dựng lớp Vector 5
1.2.2 Xây dựng quản lý một cửa hàng bán tạp hóa, thông tin quản lý của cửa hàng 9
1.3 Cài đặt các lớp và hàm main bằng C++ 12
1.3.1 Lập trình xây dựng lớp vector 12
1.3.2 Lập trình xây dựng quản lý một cửa hàng bán tạp hoá 19
CHƯƠNG 2 BÀI 2( BÀI SỐ 22) 30
2.1 Đề bài 30
2.2 Phân tích bài toán 30
2.2.1 Xây dựng cây nhị phân trừu tượng (cụ thể là max-heap) 30
2.2.2 Áp dụng cấu trúc cây để giải quyết bài toán 31
2.3 Cài đặt các lớp và hàm main bằng C++ 31
2.3.1 Lập trình xây dựng cây heap 31
2.3.2 Giải quyết bài toán bằng heap 34
Trang 3LỜI CẢM ƠN Với lòng kính trọng và biết ơn sâu sắc,chúng tôi xin chân thành cảm ơn TS Hoàng Văn Thông, thầy đã tận tình chỉ bảo, hướng dẫn và tạo mọi điều kiện giúp đỡ
em trong suốt quá trình tìm hiểu và nghiên cứu thực hiện bài tập lớn.
Hà Nội, tháng 11 năm 2023 Sinh viên thực hiện.
Nguyễn Đình Tuấn Anh
Trang 4MỞ ĐẦU
Để nắm vững những kiến thức từ môn cấu trúc dữ liệu và giải thuật, em đã tìm hiểu và vận dụng kiến từ ngôn ngữ C++ và lập trình hướng đối tượng cùng với các thuật toán để giải quyết các yêu cầu của đề bài đưa ra Nội dung bài tập em đã giải quyết là bài 20 và bài 22 trong danh sách bài tập.
Cấu trúc bài tập lớn bao gồm:
Mở đầu
Nội dung:
Chương 1: Bài 1( Bài 20 trong danh sách bài tập)
Chương 2: Bài 2( Bài 22 trong danh sách bài tập)
Tài liệu tham khảo
Trang 5CHƯƠNG 1 BÀI 1(BÀI SỐ 20)
Ngày mua bán, Giá mua bán.
Với các phương thức:
a Đọc danh thông tin quản lý của cửa hàng từ file vào chương trình
b Ghi thông tin quản lý của cửa hàng vào file
c Nhập xuất các mặt hàng
d Hiển thị toàn bộ danh sách mặt hàng hiện có
e Thống kê số lượng mặt hàng tồn của mỗi mặt hàng
2 Viết hàm main thực hiện các chức năng trên
1.2 Phân tích bài toán
1.2.1 Xây dựng lớp Vector
- Yêu Cầu của Bài Toán:
Xây dựng cấu trúc dữ liệu vector và các chức năng của vector.
Xác định các lớp: bài này gồm file ‘setup_vector.cpp’ có lớp Vector và file iterator có lớp ‘vector_reverse’ ‘vector_iterator’ ,
- Mô tả thuộc tính, chức năng của từng lớp và phương thức:
File: setup_vector.cpp
Lớp Vector:
Trang 6Thuộc tính:
- capacity (kích thước hiện tại của vector)
- num (số lượng phần tử thực tế trong vector)
- (mảng chứa các phần tử của vector) vt
Phương thức:
- Vector(): Khởi tạo một vector rỗng.
- Vector(int k, T x = 0): Khởi tạo vector với k phần tử, mỗi phần tử có giá trị x.
- ~Vector(): Hủy bỏ vector và giải phóng bộ nhớ.
- size() -> size_t: Trả về số lượng phần tử thực tế trong vector.
- get_capacity() -> size_t: Trả về kích thước hiện tại của vector.
- front() -> T: Trả về giá trị của phần tử đầu tiên.
- back() -> T: Trả về giá trị của phần tử cuối cùng.
- &operator[]( int k) -> T: Trả về giá trị của phần tử tại vị trí k.
- empty() -> bool: Kiểm tra xem vector có rỗng hay không.
- pop_back(): Loại bỏ phần tử cuối cùng của vector.
- extend(new_capacity): Mở rộng kích thước của vector.
- resize(size_t newsize,T x): Thay đổi kích thước của vector và gán giá trị x cho các phần tử mới.
- push_back(T x) : Thêm một phần tử vào cuối vector.
- insert(size_t k,T val): Chèn giá trị val vào vector tại vị trí k.
- begin() -> iterator: Trả về iterator bắt đầu từ phần tử đầu tiên.(có hàm sử dụng const trong code)
- end() -> iterator: Trả về iterator kết thúc sau phần tử cuối cùng .(có hàm sử dụng const trong code)
- rbegin() -> reverse_iterator: Trả về iterator bắt đầu từ phần tử cuối cùng .(có hàm sử dụng const trong code)
- rend() -> reverse_iterator: Trả về iterator kết thúc trước phần tử đầu tiên .(có hàm sử dụng const trong code)
- erase(size_t k): Loại bỏ phần tử tại vị trí k.
Trang 7- erase(iterator first, iterator last): Loại bỏ các phần tử từ first đến last.
- clear(): Xóa toàn bộ vector.
- find(value) -> iterator: Tìm kiếm giá trị trong vector và trả về iterator nếu tìm thấy, ngược lại trả về iterator end().
File: iterator.cpp
- Chức năng chính của các lớp này là cung cấp các phương thức để thao tác với con trỏ trong vector, đặc biệt là để thực hiện các phép tăng/giảm, cộng/trừ giá trị, và truy xuất đến giá trị mà con trỏ đang trỏ đến Các phương thức này có thể hữu ích trong việc duyệt qua một vector theo chiều ngược lại và thực hiện các thao tác khác liên quan đến
- operator*(): Phương thức trả về giá trị mà con trỏ đang trỏ đến.
- operator++(): Phương thức tăng con trỏ lên một đơn vị (tiền tố).
- operator++(int): Phương thức tăng con trỏ lên một đơn vị và trả về giá trị trước khi tăng (hậu tố).
- operator (): Phương thức giảm con trỏ đi một đơn vị (tiền tố).
- operator (int): Phương thức giảm con trỏ đi một đơn vị và trả về giá trị trước khi giảm (hậu tố).
- Các phương thức so sánh (>=, >, <=, <, !=): So sánh hai reverse_iterator, là các phương thức so sánh, cho phép so sánh giá trị của pointer với giá trị của một iterator khác, trả về giá trị kiểu bool.
- operator+(long long val) const: Phương thức trả về một reverse_iterator với vị trí nằm sau val phần tử so với vị trí hiện tại.
Trang 8- operator-(long long val) const: Phương thức trả về một reverse_iterator với vị trí nằm trước val phần tử so với vị trí hiện tại.
- operator-(const reverse_iterator<T> &it) const: Phương thức trả về khoảng cách giữa hai reverse_iterator.
- operator*(): Phương thức trả về giá trị mà con trỏ đang trỏ đến.
- operator++(): Phương thức tăng con trỏ lên một đơn vị (tiền tố).
- operator++(int): Phương thức tăng con trỏ lên một đơn vị và trả về giá trị trước khi tăng (hậu tố).
- operator (): Phương thức giảm con trỏ đi một đơn vị (tiền tố).
- operator (int): Phương thức giảm con trỏ đi một đơn vị và trả về giá trị trước khi giảm (hậu tố).
- Các phương thức so sánh (>=, >, <=, <, !=): So sánh hai vector_iterator, là các phương thức so sánh, cho phép so sánh giá trị của pointer với giá trị của một iterator khác, trả về giá trị kiểu bool.
- operator+(long long val) const: Phương thức trả về một vector_iterator với vị trí nằm sau val phần tử so với vị trí hiện tại.
- operator-(long long val) const: Phương thức trả về một vector_iterator với vị trí nằm trước val phần tử so với vị trí hiện tại.
- operator-(const vector_iterator<T> &it) const: Phương thức trả về khoảng cách giữa hai vector_iterator.
- operator+(const vector_iterator<T> &it) const: Phương thức trả về tổng của
vị trí hiện tại và vị trí của vector_iterator khác.
Trang 91.2.2 Xây dựng quản lý một cửa hàng bán tạp hóa, thông tin quản lý của cửa hàng.
- string loaiHoaDon: Loại hóa đơn (Mua hoặc Bán).
- int soLuong: Số lượng hàng.
- string ngayMuaBan: Ngày mua hoặc bán hàng.
- double giaMuaBan: Giá mua hoặc bán hàng.
Trang 10- void setMaHoaDon(string maHoaDon): Thiết lập mã hóa đơn.
- string getMaHang(): Trả về mã hàng.
- void setMaHang(string maHang): Thiết lập mã hàng.
- string getLoaiHoaDon(): Trả về loại hóa đơn.
- void setLoaiHoaDon(string loaiHoaDon): Thiết lập loại hóa đơn.
- int getSoLuong(): Trả về số lượng hàng.
- void setSoLuong(int soLuong): Thiết lập số lượng hàng.
- string getNgayMuaBan(): Trả về ngày mua hoặc bán hàng.
- void setNgayMuaBan(string ngayMuaBan): Thiết lập ngày mua hoặc bán hàng.
- double getGiaMuaBan(): Trả về giá mua hoặc bán hàng.
- void setGiaMuaBan(double giaMuaBan): Thiết lập giá mua hoặc bán hàng.
- friend istream &operator>>(istream &cin, HoaDon &hoaDon): Phương thức nhập thông tin từ người dùng.
- friend ostream &operator<<(ostream &cout, const HoaDon &hoaDon): Phương thức xuất thông tin ra màn hình.
Lớp HoaDon thường được sử dụng để biểu diễn thông tin của một hóa đơn trong quản
- string ten_sp: Tên sản phẩm.
- string ten_nsx: Tên nhà sản xuất.
Phương thức:
- Danhmuc(){string maHang = "Unknown", string ten_sp = "Unknown", string ten_nsx = "Unknown"}: Hàm khởi tạo mặc định, đặt giá trị mặc định cho các thuộc tính.
Trang 11- Danhmuc(string maHang, string ten_sp, string ten_nsx): Hàm khởi tạo với các giá trị cụ thể cho mã hàng, tên sản phẩm, và tên nhà sản xuất.
- string getMaHang(): Trả về mã hàng.
- void setMaHang(string maHang): Thiết lập mã hàng.
- string getTen_sp(): Trả về tên sản phẩm.
- void setTen_sp(string ten_sp): Thiết lập tên sản phẩm.
- string getTen_nsx(): Trả về tên nhà sản xuất.
- void setTen_nsx(string ten_nsx): Thiết lập tên nhà sản xuất.
Lớp Danhmuc thường được sử dụng để lưu trữ thông tin về danh mục mặt hàng trong quản lý của cửa hàng bán tạp hóa Mỗi đối tượng của lớp này biểu diễn một mặt hàng cụ thể với các thuộc tính như mã hàng, tên sản phẩm, và tên nhà sản xuất.
- void GhiFile(string tenFile): Ghi thông tin quản lý của cửa hàng vào file.
- void NhapXuatMatHang(): Nhập thông tin của một mặt hàng từ người dùng.
- void NhapHoaDon(HoaDon &hoaDon): Nhập thông tin cho hóa đơn từ người dùng.
Trang 12- void XuatDanhSachMatHang(): Hiển thị toàn bộ danh sách các mặt hàng hiện có.
- void ThongKeTonKho(): Thống kê số lượng mặt hàng tồn kho.
reverse_iterator(T pointer = * nullptr) : pointer(pointer) {}
void operator=(const reverse_iterator<T> it) {&
Trang 13reverse_iterator<T> operator ( ) {int // reverse_iterator<T> tmp = *this;
vector_iterator(T pointer = * nullptr) : pointer(pointer) {}
void operator=(const vector_iterator<T> it) {&
pointer = it.pointer;
Trang 15return pointer != it.pointer;
Trang 16size_t size() const return { num; }
size_t get_capacity() const return { capacity; }
T front() { & return vt[ ]; }0
T back() { & return vt[num - ]; }1
T &operator[](int k) { return vt[k]; }
T *temp = new T[capacity];
for int ( i = ; i < num; i++)0
Trang 17typedef vector_iterator<T> iterator;
typedef const vector_iterator<T> const_iterator;
typedef vector_iterator<T> reverse_iterator;
typedef const vector_iterator<T> const_reverse_iterator;
//
iterator begin() { return iterator(vt); }
const_iterator begin() const return { const_iterator(vt); }iterator end() { return iterator(vt + num); }
const_iterator end() const return { const_iterator(vt + num); }reverse_iterator rbegin() { return reverse_iterator(vt + num - ); }1const_reverse_iterator rbegin() const return {
Trang 19cout << "Before clear iterator: ";
for auto ( it = a.begin(); it != a.end(); it++)
cout << *it << ;" "
cout << endl;
a.clear();
cout << "After clear iterator: ";
for auto ( it = a.begin(); it != a.end(); it++)
cout << *it << ;" "
cout << endl;
cout << "Check empty: " << a.empty() << endl;
cout << "Adding int from 1 to 5 " << endl;
for int ( i = ; i <= ; i++)1 5
a.push_back(i);
cout << "Last iterator: ";
for auto ( it = a.begin(); it != a.end(); it++)
HoaDon(string maHoaDon = "Unknown", string maHang = "Unknown",
string loaiHoaDon = "Unknown", soLuong = , string ngayMuaBan = int 0
"Unknown", double giaMuaBan = 0)
{
this->maHoaDon = maHoaDon;
this->maHang = maHang;
this->loaiHoaDon = loaiHoaDon;
this->ngayMuaBan = ngayMuaBan;
Trang 20this->giaMuaBan = giaMuaBan;
this->soLuong = soLuong;
}
string getMaHoaDon(){ return maHoaDon; }
void setMaHoaDon(string maHoaDon){ this->maHoaDon = maHoaDon; } string getMaHang(){ return maHang; }
void setMaHang(string maHang){ this->maHang = maHang; }
string getLoaiHoaDon(){ return loaiHoaDon; }
void setLoaiHoaDon(string loaiHoaDon){ this->loaiHoaDon = loaiHoaDon; }
getSoLuong(){ int return soLuong; }
void setSoLuong( soLuong) { int this->soLuong = soLuong; }
string getNgayMuaBan(){ return ngayMuaBan; }
void setNgayMuaBan(string ngayMuaBan) { this->ngayMuaBan = ngayMuaBan; }
double getGiaMuaBan(){ return giaMuaBan; }
void setGiaMuaBan(double giaMuaBan){ this->giaMuaBan = giaMuaBan; }
friend istream operator>>(istream cin, HoaDon & & &hoaDon) {
Trang 21return maHang;
}
void setMaHang(string maHang){
this->maHang = maHang;
}
string getTen_sp(){
return ten_sp;
}
void setTen_sp(string ten_sp){
this->ten_sp = ten_sp;
}
string getTen_nsx(){
return ten_nsx;
}
void setTen_nsx(string ten_nsx){
this->ten_nsx = ten_nsx;
}
};
Trang 24file << danhSachMatHang.size() << endl;
for auto ( &matHang : danhSachMatHang) {
file << matHang.getMaHang() << "\n"
<< matHang.getTen_sp() << "\n"
<< matHang.getTen_nsx() << endl; }
// Ghi danh sách hóa đơn
file << danhSachHoaDon.size() << endl;
for auto ( &hoaDon : danhSachHoaDon)
Trang 25cout << "Nhap lua chon cua ban: ";
bool yourChoice;
Trang 26cout << "Da them mat hang thanh cong " << endl;
pos = danhSachMatHang.size() - 1; // set pos to the index
of the newly added item
}
// HoOi ngửời dùng có muôan mua/bán hàng không
cout << "Ban muon mua (1) hay ban (2) hang? Nhap lua chon: "; luaChon;int
tempHoaDon.setLoaiHoaDon(luaChon == ? 1 "Mua" "Ban" : );
// Gọi hàm nhập thông tin hóa đơn
return;
}
else
Trang 27// TODO: Nhập thông tin cho hóa đơn từ ngửời dùng
cout << "Nhap so luong: ";
cout << "Danh sach mat hang: " << danhSachMatHang.size() <<
" mat hang" << endl;
for auto ( &matHang : danhSachMatHang)
Trang 28soLuongTon -= hoaDon.getSoLuong(); (soLuongTon < )if 0
}
}
cout << "Ma hang: " << matHang.getMaHang() << ", Ten hang: " << matHang.getTen_sp() << ", So luong ton: " << soLuongTon; cout << endl;
Trang 29cout << "1 Doc danh thong tin quan ly cua cua hang tu file vaochuong trinh" << endl;
cout << "2 Ghi thong tin quan ly cua cua hang vao file" << endl;
cout << "3 Nhap, xuat thong tin mot mat hang" << endl; cout << "4 Hien thi danh sach cac mat hang hien co" << endl; cout << "5 Thong ke so luong mat hang ton" << endl; cout << "0 Thoat" << endl;
cout << " -" << endl; cout << "Nhap lua chon cua ban: ";