Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.32 MB, 23 trang )
<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">
Mã sinh viên: 221231039Lớp: Cơng nghệ thơng tin 4 – K63Người hướng dẫn: TS. Hồng Văn thơng
</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">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 tốn...18
2.2. Phân tích bài tố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
</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">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.Hồ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
</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">Để 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ậnTài liệu tham khảo
</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">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ìnhb. 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ị tồ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àng2. Viết hàm main thực hiện các chức năng trên
- 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:
Lớp Vector:
</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">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 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.
</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">- erase(iterator first, iterator last): Loại bỏ các phần tử từ first đến last. - clear(): Xóa tồ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().
- 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 đếnvị trí của con trỏ.
1. Lớp reverse_iterator:Thuộc tính:
- T *pointer: Con trỏ kiểu T sử dụng để theo dõi vị trí hiện tại trong dãy.Phương thức và chức năng:
- reverse_iterator(T *pointer = nullptr): Constructor với tham số mặc định lànullptr.
- operator=(const reverse_iterator<T> &it): Phương thức gán giá trị từ mộtreverse_iterator khác.
- 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.
</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="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.
2. Lớp vector_iterator:Thuộc tính:
- T *pointer: Con trỏ kiểu T sử dụng để theo dõi vị trí hiện tại trong dãy.Phương thức và chức năng:
- vector_iterator(T *pointer = nullptr): Constructor với tham số mặc định lànullptr.
- operator=(const vector_iterator<T> &it): Phương thức gán giá trị từ mộtvector_iterator khác.
- 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ủavị trí hiện tại và vị trí của vector_iterator khác.
</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">1.3.1.1. File iterator.cpp<small>#ifndef iterator__cpp#define iterator__cpptemplate class < T>class reverse_iterator {</small>
<small> T *pointer;public:</small>
<small> reverse_iterator(T pointer = *nullptr) : pointer(pointer) {} void operator=(const reverse_iterator<T> it) {& pointer = it.pointer;</small>
<small> }</small>
<small> T operator*() {& return *pointer; }</small>
<small> const & T operator*() const { return *pointer; }</small>
<small> reverse_iterator<T> operator++() { // ++pointer</small>
<small> --pointer; return this *; }</small>
<small> reverse_iterator<T> operator++( ) {int // pointer++</small>
<small> reverse_iterator<T> tmp = *this; --pointer;</small>
<small> return tmp; }</small>
<small> reverse_iterator<T> operator--() { // --pointer</small>
<small> ++pointer;</small>
</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10"><small> return this *; }</small>
<small> reverse_iterator<T> operator--( ) {int // </small>
<small> reverse_iterator<T> tmp = *this; ++pointer;</small>
<small> return tmp; }</small>
<small> bool operator>=(const reverse_iterator<T> it) &const { return pointer <= it.pointer;</small>
<small>template class < T>class vector_iterator {</small>
<small> T *pointer;public:</small>
<small> vector_iterator(T pointer = *nullptr) : pointer(pointer) {}</small>
</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11"><small> void operator=(const vector_iterator<T> it) {& pointer = it.pointer;</small>
<small> }</small>
<small> T operator*() {& return *pointer; }</small>
<small> const & T operator*() const { return *pointer; }</small>
<small> vector_iterator<T> operator++() { // ++pointer</small>
<small> ++pointer; return this *; }</small>
<small> vector_iterator<T> operator++( ) {int // pointer++</small>
<small> vector_iterator<T> tmp = *this; ++pointer;</small>
<small> return tmp; }</small>
<small> vector_iterator<T> operator--() { // --pointer</small>
<small> --pointer; return this *; }</small>
<small> vector_iterator<T> operator--( ) {int // </small>
<small> vector_iterator<T> tmp = *this; --pointer;</small>
<small> return tmp; }</small>
<small> bool operator>=(const vector_iterator<T> it) &const { return pointer >= it.pointer;</small>
</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12"><small> bool operator!=(const vector_iterator<T> it) &const { return pointer != it.pointer;</small>
1.3.1.2. File: setup_vector.cpp<small>#include <iostream></small>
<small>#include "iterator.cpp"</small>
<small>template class < T>class Vector{private:</small>
<small> size_t capacity, num; T *vt;</small>
<small>public: Vector() {</small>
<small> capacity = ;1</small>
<small> num = ;0</small>
<small> vt = new T[capacity]; }</small>
<small> Vector( k, T x = )int0</small>
<small> {</small>
<small> capacity = num = k; for size_t ( i = ; i < k; i++)0</small>
</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13"><small> { vt[i] = x; } } ~Vector() { (vt)if delete[] vt; }</small>
<small> size_t size() const return { num; } size_t get_capacity() const return { capacity; } T front() { &return vt[ ]; }0</small>
<small> T back() { &return vt[num - ]; }1</small>
<small> T &operator[](int k) { return vt[k]; } bool empty()</small>
<small> {</small>
<small> (num == )if0</small>
<small> {</small>
<small> return true; }</small>
<small> return false; }</small>
<small> void pop_back() {</small>
<small> (num > )if0</small>
<small> num--; }</small>
<small> void extend(size_t new_capacity) {</small>
<small> (new_capacity <= capacity)if {</small>
<small> return; }</small>
<small> capacity = new_capacity; T *temp = new T[capacity]; for int ( i = ; i < num; i++)0</small>
<small> temp[i] = vt[i]; (vt)if</small>
<small> delete[] vt; vt = temp; }</small>
<small> void resize(size_t newsize, T x) {</small>
<small> (newsize <= num)if {</small>
<small> num = newsize; return; }</small>
<small> (capacity < newsize)if</small>
</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14"><small> extend(newsize);</small>
<small> for size_t ( i = num; i < newsize; i++) {</small>
<small> vt[i] = x; }</small>
<small> num = newsize; }</small>
<small> void push_back(T x) {</small>
<small> (num == capacity)if extend(capacity * 2); (vt == ifNULL) vt = new T(1); vt[num++] = x; }</small>
<small> void insert(size_t k, T val) {</small>
<small> (num == capacity)if {</small>
<small> extend(capacity * 2); }</small>
<small> for size_t ( i = num + ; i > k; i--)1</small>
<small> {</small>
<small> vt[i] = vt[i - 1]; }</small>
<small> vt[k] = val; num++; }</small>
<small>typedef 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;</small>
<small>// ...</small>
<small>iterator begin() { return iterator(vt); }</small>
<small>const_iterator begin() const return { const_iterator(vt); }iterator end() { return iterator(vt + num); }</small>
<small>const_iterator end() const return { const_iterator(vt + num); }reverse_iterator rbegin() { return reverse_iterator(vt + num - ); }1</small>
<small>const_reverse_iterator rbegin() const return { const_reverse_iterator(vt + num - ); }1</small>
<small>reverse_iterator rend() { return reverse_iterator(vt - ); }1</small>
<small>const_reverse_iterator rend() const return { const_reverse_iterator(vt - ); }1</small>
<small>// ...</small>
<small> void erase(size_t k)</small>
</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15"><small> num--; }</small>
<small> void erase(iterator first, iterator last) {</small>
<small> (first >= end() || last >= end())if return;</small>
<small> T *pos = first; while (pos != last) {</small>
<small> *pos = *(pos + (last - first)); pos++;</small>
<small> }</small>
<small> num -= last - first; }</small>
<small> void clear() { (vt)if {</small>
<small> delete[] vt; }</small>
<small> num = ;0</small>
<small> vt = nullptr; }</small>
<small> iterator find(iterator first, iterator last, const &value) T {</small>
<small> while (first != last) {</small>
<small> (*first == value)if {</small>
<small> return first; }</small>
<small> ++first; } return last; }</small>
<small>};int main(){</small>
<small> Vector< > a;int for int ( i = ; i <= ; i++)15</small>
</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16"><small> a.push_back(i);</small>
<small> // zVector<int>::reverse_iterator it = a.rbegin();</small>
<small> cout << "Before clear iterator: "; for auto ( it = a.begin(); it != a.end(); it++) cout << *it << ;" "</small>
<small> cout << endl; a.clear();</small>
<small> cout << "After clear iterator: "; for auto ( it = a.begin(); it != a.end(); it++) cout << *it << ;" "</small>
<small> cout << endl;</small>
<small> cout << "Check empty: " << a.empty() << endl; cout << "Adding int from 1 to 5..." << endl; for int ( i = ; i <= ; i++)15</small>
<small> a.push_back(i); cout << "Last iterator: ";</small>
<small> for auto ( it = a.begin(); it != a.end(); it++) cout << *it << ;" "</small>
<small> cout << endl; return 0;}</small>
</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">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âyb. 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 tốn nối thanh kimloại b/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í để th 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ả
- Nước cất
- Muối bạc nitrat AgNO<small>3</small>
- Các muối photphat: Na<small>2</small>HPO<small>4</small>, NaH<small>2</small>PO<small>4</small>- Rhodamine B-RhB
</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">- Cân phân tích- Máy khuấy từ- Con từ
- Cốc thủy tinh các loại- Tủ sấy
- Máy ly tâm- Ống ly tâm- Đèn xenon
Nguồn gốc các hóa chất và thiết bị được sử dụng đều có xuất xứ từ TrungQuốc.
- Hệ mẫu Ag<small>3</small>PO<small>4</small> thay đổi tỉ lệ Ag / PO của tiền chất (Hệ mẫu APO).<sup>+</sup> <small>4</small><sup></sup>
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.
Bước 1. Hòa tan 0,5096 g muối AgNO vào 150 ml nước cất để được dung dịch<small>3</small>AgNO<small>3</small> nồng độ 0,02M (dung dịch A).
Bước 2. Hòa tan muối Na<small>2</small>HPO .12H<small>42</small>O 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 Ag<small>3</small>PO .<small>4</small>
</div>