bá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

23 0 0
Tài liệu đã được kiểm tra trùng lặp
bá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

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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 1

BÁO CÁO BÀI TẬP LỚNMÔN HỌC:

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬTSinh viên thực hiện: Nguyễn Đình Tuấn Anh

Mã sinh viên: 221231039Lớp: Công nghệ thông tin 4 – K63Người hướng dẫn: TS Hoàng Văn thông

Trang 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 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 3

LỜ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 4

MỞ ĐẦ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ậnTài liệu tham khảo

Trang 5

CHƯƠNG 1 BÀI 1(BÀI SỐ 20) 1.1 Đề bài

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ị 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àng2 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 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.

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 đế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.

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.

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.

Trang 9

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ủacửa hàng.

1.3 Cài đặt các lớp và hàm main bằng C++

1.3.1 Lập trình xây dựng lớp vector

1.3.1.1 File iterator.cpp#ifndef iterator cpp#define iterator cpptemplate class < T>class reverse_iterator {

T *pointer;public:

reverse_iterator(T pointer = *nullptr) : pointer(pointer) {} void operator=(const reverse_iterator<T> it) {& pointer = it.pointer;

}

T operator*() {& return *pointer; }

const & T operator*() const { return *pointer; }

reverse_iterator<T> operator++() { // ++pointer

pointer; return this *; }

reverse_iterator<T> operator++( ) {int // pointer++

reverse_iterator<T> tmp = *this; pointer;

return tmp; }

reverse_iterator<T> operator () { // pointer

++pointer;

Trang 10

return this *; }

reverse_iterator<T> operator ( ) {int //

reverse_iterator<T> tmp = *this; ++pointer;

return tmp; }

bool operator>=(const reverse_iterator<T> it) &const { return pointer <= it.pointer;

template class < T>class vector_iterator {

T *pointer;public:

vector_iterator(T pointer = *nullptr) : pointer(pointer) {}

Trang 11

void operator=(const vector_iterator<T> it) {& pointer = it.pointer;

}

T operator*() {& return *pointer; }

const & T operator*() const { return *pointer; }

vector_iterator<T> operator++() { // ++pointer

++pointer; return this *; }

vector_iterator<T> operator++( ) {int // pointer++

vector_iterator<T> tmp = *this; ++pointer;

return tmp; }

vector_iterator<T> operator () { // pointer

pointer; return this *; }

vector_iterator<T> operator ( ) {int //

vector_iterator<T> tmp = *this; pointer;

return tmp; }

bool operator>=(const vector_iterator<T> it) &const { return pointer >= it.pointer;

Trang 12

bool operator!=(const vector_iterator<T> it) &const { return pointer != it.pointer;

1.3.1.2 File: setup_vector.cpp#include <iostream>

#include "iterator.cpp"

template class < T>class Vector{private:

size_t capacity, num; T *vt;

public: Vector() {

capacity = ;1

num = ;0

vt = new T[capacity]; }

Vector( k, T x = )int0

{

capacity = num = k; for size_t ( i = ; i < k; i++)0

Trang 13

{ vt[i] = x; } } ~Vector() { (vt)if delete[] vt; }

size_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]; } bool empty()

{

(num == )if0

{

return true; }

return false; }

void pop_back() {

(num > )if0

num ; }

void extend(size_t new_capacity) {

(new_capacity <= capacity)if {

return; }

capacity = new_capacity; T *temp = new T[capacity]; for int ( i = ; i < num; i++)0

temp[i] = vt[i]; (vt)if

delete[] vt; vt = temp; }

void resize(size_t newsize, T x) {

(newsize <= num)if {

num = newsize; return; }

(capacity < newsize)if

Trang 14

extend(newsize);

for size_t ( i = num; i < newsize; i++) {

vt[i] = x; }

num = newsize; }

void push_back(T x) {

(num == capacity)if extend(capacity * 2); (vt == ifNULL) vt = new T(1); vt[num++] = x; }

void insert(size_t k, T val) {

(num == capacity)if {

extend(capacity * 2); }

for size_t ( i = num + ; i > k; i )1

{

vt[i] = vt[i - 1]; }

vt[k] = val; num++; }

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;

//

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 15

num ; }

void erase(iterator first, iterator last) {

(first >= end() || last >= end())if return;

T *pos = first; while (pos != last) {

*pos = *(pos + (last - first)); pos++;

}

num -= last - first; }

void clear() { (vt)if {

delete[] vt; }

num = ;0

vt = nullptr; }

iterator find(iterator first, iterator last, const &value) T {

while (first != last) {

(*first == value)if {

return first; }

++first; } return last; }

};int main(){

Vector< > a;int for int ( i = ; i <= ; i++)15

Trang 16

a.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++)15

a.push_back(i); cout << "Last iterator: ";

for auto ( it = a.begin(); it != a.end(); it++) cout << *it << ;" "

cout << endl; return 0;}

Trang 17

CHƯƠ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â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 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 18

2.1.2 Áp dụng cấu trúc cây để giải quyết bài toán

- 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.

2.2 Phân tích bài toán1) Chế tạo hệ mẫu:

- 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 12H42O 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

Ngày đăng: 14/05/2024, 16:06

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan