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ỚNMÔ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++ 9
1.3.1 Lập trình xây dựng lớp vector 9
CHƯƠNG 2 BÀI 2( BÀI SỐ 22) 17
2.1 Đề bài 17
2.1.1 Xây dựng cây nhị phân trừu tượng (cụ thể là max-heap) 17
2.1.2 Áp dụng cấu trúc cây để giải quyết bài toán 18
2.2 Phân tích bài toán 18
2.3 Cài đặt các lớp và hàm main bằng C++ 18
2.4 Các phương pháp khảo sát tính chất vật lý của hệ mẫu 20
CHƯƠNG 3 TÀI LIỆU THAM KHẢO 22
Trang 3LỜI CẢM ƠNVớ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ìmhiể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ácthuậ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ảiquyế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)
Chương 3: Kết quả và thảo luận
Kết luận
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 chocá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ụngconst 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ìmthấ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ệcduyệ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ướckhi 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ủamộ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ảngcá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ướckhi 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ủamộ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ảngcá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.
reverse_iterator(T pointer = * nullptr ) : pointer(pointer) {}
void operator=( const reverse_iterator<T> it) { &
Trang 11void operator=( const vector_iterator<T> it) { & pointer = it.pointer;
Trang 12bool operator!=( const vector_iterator<T> it) & const { return pointer != it.pointer;
Trang 13size_t size() const return { num; }
size_t get_capacity() const return { capacity; }
T front() { & return vt[ ]; } 0
T back() { & return vt[num - ]; } 1
T *temp = new T[capacity];
for int ( i = ; i < num; i++) 0
Trang 14typedef 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 - ); } 1
const_reverse_iterator rbegin() const return {
const_reverse_iterator(vt + num - ); } 1
reverse_iterator rend() { return reverse_iterator(vt - ); } 1
const_reverse_iterator rend() const return { const_reverse_iterator(vt
- ); } 1
//
void erase( size_t k)
Trang 16a.push_back(i);
// zVector<int>::reverse_iterator it = a.rbegin();
cout << "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++) cout << *it << ; " "
cout << endl;
return 0 ;
}
Trang 17CHƯƠNG 2 BÀI 2( BÀI SỐ 22)
2.1 Đề bài
1 Cho cây nhị phân trừu tượng (cây heap) chứa các phần tử so sánh được vớinhau thỏa mãn các tính chất sau:
a Phần tử gốc lớn hơn hoặc bằng mọi phần tử còn lại của cây
b 2 cây con trái và phải cũng thỏa mãn tính chất trên
2 Hãy cài đặt cấu trúc dữ liệu cây nhị phân trên có các thao tác push(x) thêmphần tử vào cây và pop() lấy phần tử gốc khỏi cây, top() lấy giá trị của nút gốc sao choluôn luôn đảm bảo tính chất cây heap
Áp dụng cấu trúc cây này như một hàng đợi ưu tiên thực hiện các việc sau:
- Nhập vào 1 dãy số xuất ra dãy giảm dần- Giải quyết bài toán nối thanh kimloại http://laptrinhonline.club/problem/Tèonoidam
Công việc cơ khí thật là mệt nhọc, muốn nối một thanh kim loại độ dài a vớimột thanh kim loại độ dài b thì kinh phí để thuê nối tốn mất a+b đơn vị tiền tệ Hiệnnay Tèo cần nối n thanh kim loại lần lượng có độ dài là a1, a2, an thành một đoạntheo bạn Tèo nên bố trí thế nào để tổng số tiền phải trả là ít nhất
Input: Dòng đầu chứa số nguyên dương n (1<=n<=105) Dòng tiếp theo là n sốnguyên dương tương ứng là độ dài các thanh muốn nối (1<=ai<=103)
Output: Một số nguyên dương là số kinh phí ít nhất phải trả
2.1.1 Xây dựng cây nhị phân trừu tượng (cụ thể là max-heap)
- Nước cất
- Muối bạc nitrat AgNO3
- Các muối photphat: Na2HPO4, NaH2PO4
- Rhodamine B-RhB
Trang 182.1.2 Áp dụng cấu trúc cây để giải quyết bài toán
- Hệ mẫu Ag3PO4 thay đổi tỉ lệ Ag / PO của tiền chất (Hệ mẫu APO).+ 4
3-2) Khảo sát khả năng quang xúc tác phân hủy Rhodamine B của các mẫu đã chế tạodưới ánh sáng đèn Xenon và ánh sáng Mặt Trời tự nhiên
2.3 Cài đặt các lớp và hàm main bằng C++
Hệ mẫu Ag3PO4 với tỉ lệ Ag+/PO43- khác nhau
Bước 1 Hòa tan 0,5096 g muối AgNO vào 150 ml nước cất để được dung dịch3AgNO3 nồng độ 0,02M (dung dịch A)
Bước 2 Hòa tan muối Na2HPO 12H4 2O trong nước cất với lượng tùy theo từngmẫu như trong Bảng 2.1 thu được dung dịch B
Bước 3 Đổ từ từ dung dịch B và dung dịch A, thu được hỗn hợp dung dịch C.Bước 4 Khuấy từ dung dịch C trong 3 giờ ở nhiệt độ phòng để tạo thành cáchạt kết tủa màu vàng
Bước 5 Lọc rửa kết tủa bằng nước cất
Bước 6 Sấy khô kết tủa trong không khí ở 100 C để được bột Ag3PO 4
Trang 19Quy trình chế tạo được thực hiện theo sơ đồ dưới đây:
Hình 2.1 Sơ đồ chế tạo hệ mẫu APO
Kí hiệu các mẫu Ag3PO4 được chế tạo với các tỉ lệ tiền chất Ag+/PO43- khácnhau được trình bày trong Bảng 2.1
Bảng 2.1 Tên và kí hiệu tương ứng của các mẫu Ag3PO4 chế tạo với tỉ lệ Ag+/PO khác
Thể tíchnước cất(ml)
Trang 20Nhiễu xạ tia X (XRD) là một kĩ thuật phân tích nhằm xác định hằng số mạng,cấu trúc, kích thước hạt và thành phần pha của tinh thể của vật rắn Tia X được tạo rabởi một ống tia âm cực, qua bộ phận lọc để thu được tia X đơn sắc, được chuẩn trực đểhướng về phía mẫu.
Phép đo phổ hấp thụ
Phép đo phổ hấp thụ là phương pháp được dùng để phân tích các tính chấtquang học của vật liệu Dữ liệu thu được là đường cong biểu diễn độ hấp thụ của vậtliệu theo tần số của ánh sáng kích thích Sự phụ thuộc độ hấp thụ ánh sáng theo bướcsóng của ánh sáng kích thích được xác định dựa vào việc so sánh cường độ của ánhsáng trước và sau khi đi qua mẫu
Phép đo phổ hồng ngoại
Phương pháp phổ hấp thụ hồng ngoại (FTIR) là phương pháp đo sự hấp thụ ánhsáng hồng ngoại theo số sóng Mỗi hợp chất hóa học hấp thụ năng lượng bức xạ hồngngoại ở một tần số đặc trưng Khi chiếu một chùm tia đơn sắc có bước sóng nằm trongvùng hồng ngoại qua vật liệu cần phân tích, phân tử hấp thụ một phần năng lượng làmgiảm cường độ tia tới
Phổ tán xạ Raman
Quang phổ Raman là một kỹ thuật quang phổ dựa trên sự tán xạ không đàn hồicủa ánh sáng đơn sắc phát ra từ một nguồn laser Các photon của ánh sáng laser bị mẫuhấp thụ rồi sau đó lại được phát xạ lại Tần số của các photon phát xạ lại bị thay đổi sovới tần số ánh sáng đơn sắc ban đầu, được gọi là hiệu ứng Raman
Phép đo phổ huỳnh quang
Phép đo phổ huỳnh quang là một phương pháp hiệu quả, an toàn, không ảnhhưởng đến mẫu nhằm nghiên cứu cấu trúc điện tử của vật liệu Hiện tượng huỳnhquang được định nghĩa là sự phát xạ ánh sáng từ vật liệu khi có kích thích quang học.Phép đo phổ quang điện tử tia X
Phổ quang điện tử tia X là kĩ thuật dùng để nghiên cứu thành phần hoá học,trạng thái điện tử của các nguyên tố trên bề mặt vật rắn, XPS dựa trên nguyên lý củahiệu ứng quang điện
Phương pháp hiển vi điện tử quét
Độ phân giải của SEM phụ thuộc vào các bức xạ phát ra do tương tác giữachùm điện tử và bề mặt mẫu, các phép phân tích được thực hiện thông qua việc phân
Trang 21tích các bức xạ này Ưu điểm của SEM là phân tích mà không phá hủy mẫu vật liệu và
có thể hoạt động ở môi trường chân không thấp
Quy trình đánh giá hoạt tính quang xúc tác của vật liệu
Trong nghiên cứu này, hoạt tính quang xúc tác của vật liệu được đánh giá dựatrên khả năng phân hủy Rhodamine B (RhB) trong dung dịch 10ppm dưới sự chiếusáng của bức xạ khả kiến Ánh sáng đèn Xenon là bức xạ chúng tôi lựa chọn làm ánhsáng kích thích trong quá trình quang xúc tác của vật liệu, đồng thời ánh sáng Mặt Trời
tự nhiên cũng được sử dụng để kiểm tra và có sự so sánh
Bước 4: Dung dịch thu được ở bước 3 được kiểm tra nồng độ bằng cách đo độtruyền qua trên máy Jasco L1 – tại phòng thí nghiệm, Trung tâm Khoa học và Côngnghệ nano, Trường Đại học Sư Phạm Hà Nội
Để có thể đánh giá vai trò của điện tử tự do trong quá trình quang xúc tác củavật liệu, chúng tôi tiến hành thí nghiệm khảo sát hoạt tính quang xúc tác của vật liệukèm theo đồng thời quá trình bắt điện tử tự do bằng dung dịch isopropyl alcohol (IPA).Quy trình vẫn tiến hành như trên, tuy nhiên nước cất ở Bước 1 được thay bằng dungdịch IPA với các nồng độ khác nhau
Trang 22CHƯƠNG 3 TÀI LIỆU THAM KHẢO
1 Akinobu Miyoshi, Shunta Nishioka, and Kazuhiko Maeda (2018), “Water Splitting
on Rutile TiO Based Photocatalysts”, 2 Chemistry – A European Journal, 24(69), pp 18219
18204-2 Z Yi, J Ye, N Kikugawa, T Kako, S Ouyang, H Stuart-Williams, H Yang, J.Cao, W Luo, Z Li, Y Liu, and R L Withers (2010), “An orthophosphate semiconductorwith photooxidation properties under visible-light irradiation”, Nat Mater, 9(7), pp 559-564
3 Hua Wang, Yusong Bai, Jutong Yang, Xiufeng Lang, Jinghong Li, and Lin Guo(2012), “A Facile Way to Rejuvenate Ag3PO4 as a Recyclable Highly Efficient Photocatalyst”,Chemistry - A European Journal, 18(18), pp 5524-5529
4 G Botelho, J C Sczancoski, J Andres, L Gracia, and E Longo (2015),
“Experimental and Theoretical Study on the Structure, Optical Properties, and Growth ofMetallic Silver Nanostructures in Ag3PO4”, The Journal of Physical Chemistry C, 119(11),
pp 6293-6306
5 P Dong, G Hou, C Liu, X Zhang, H Tian, F Xu, X Xi, and R Shao (2016),
“Origin of Activity and Stability Enhancement for Ag3PO4 Photocatalyst after Calcination”,Materials (Basel), 9(12), pp 968-985
6 Guiwei He, Wanliang Yang, Wei Zheng, Li Gong, Xinghui Wang, Yan An, andMengkui Tian (2019), “Facile controlled synthesis of Ag3PO4 with various morphologies forenhanced photocatalytic oxygen evolution from water splitting”, RSC Advances, 9(32), pp.18222-18231
7 Pongsaton Amornpitoksuk, Khanitta Intarasuwan, Sumetha Suwanboon, and JonasBaltrusaitis (2013), “Effect of Phosphate Salts (Na3PO4, Na2HPO4, and NaH2PO4) on Ag3PO4
Morphology for Photocatalytic Dye Degradation under Visible Light and Toxicity of theDegraded Dye Products”, Industrial & Engineering Chemistry Research, 52(49), pp 17369-17375
8 Jin-Ku Liu, Chong-Xiao Luo, Jian-Dong Wang, Xiao-Hong Yang, and Xin-HuaZhong (2012), “Controlled synthesis of silver phosphate crystals with high photocatalyticactivity and bacteriostatic activity”, CrystEngComm, 14(24), pp 8714-8721
9 Xia Hua, Yujian Jin, Kai Wang, Na Li, Haiqiu Liu, Mindong Chen, Shashi Paul, YiZhang, Xudong Zhao, and Fei Teng (2014), “Porous Ag3PO4 microtubes with improvedphotocatalytic properties”, Catalysis Communications, 52, pp 49-52