1. Trang chủ
  2. » Luận Văn - Báo Cáo

báo cáo bài tập lớn môn cấu trúc dữ liệu và giải thuật chủ đề image viewer using linked list

22 2 0
Tài liệu đã được kiểm tra trùng lặp

Đ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

Thông tin cơ bản

Tiêu đề Image Viewer Using Linked List
Tác giả Vũ Đăng Tuấn, Trần Minh Đức, Trần Hưng Sách, Nguyễn Trọng Hiếu
Người hướng dẫn Cô Trần Thị Thanh Hải
Trường học Trường Đại Học Bách Khoa Hà Nội
Chuyên ngành Cấu Trúc Dữ Liệu Và Giải Thuật
Thể loại báo cáo bài tập lớn
Định dạng
Số trang 22
Dung lượng 2,96 MB

Nội dung

Lý do và động lựcNgày nay con người có nhu cầu chụp ảnh rất nhiều , có những người trong bộ sưu tập có đến hàng trăm , hàng nghìn bức ảnh dẫn đến việc quản lý hay xem lại một ảnh nào đó

Trang 1

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

BÁO CÁO BÀI TẬP LỚN MÔN CẤU TRÚC

DỮ LIỆU VÀ GIẢI THUẬT

Chủ đề: “Image Viewer using linked list”

Giáo viên hướng dẫn: cô Trần Thị Thanh Hải

Danh sách sinh viên nhóm 17:

Trang 2

I Giới thiệu 4

1.1 Lý do và động lực 4

1.2 Định nghĩa bài toán 4

1.3 Bảng phân công nhiệm vụ 4

II Phương pháp lựa chọn 5

1 Danh sách liên kết đơn 5

1.1 Con trỏ và struct 5

1.2 Định nghĩa 6

1.3 Đặc điểm của danh sách liên kết đơn 7

2 Giải thuật 7

2.1 Duyệt danh sách 7

2.2 Thêm 1 node vào đầu danh sách 8

2.3 Xóa 1 node khỏi danh sách theo vị trí 8

2.4 Tìm kiếm Node trong danh sách 9

III Triển khai cài đặt 9

1 Ngôn ngữ lập trình và thư viện 9

1.1 Ngôn ngữ lập trình C++ và các thư viện cơ bản 9

1.2 Thư viện openCV 10

2 Tổ chức chương trình 11

IV Kết quả thực nghiệm 13

1 Dữ liệu 13

2 Kết quả thực nghiệm 15

2.1 Test Menu 1 : Hiển thị danh sách ảnh 16

2.2 Test Menu 2 : Thêm ảnh 16

2.3 Test Menu 3: Xóa ảnh 17

2.4 Test Menu 4: Tìm ảnh có lượt xem cao nhất 17

2.5 Test Menu 5: Tìm ảnh theo địa điểm 18

2.6 Test Menu 6: Phân bố ảnh theo năm 18

2.7 Test chức năng ghi file khi đóng chương trình 19

V Kết luận 19

1 Đánh giá mức độ hoàn thành 19

2 Bài học rút ra 19

3 Những khó khắn khi học môn học này 19 Hình ảnh

Trang 3

Hình 1 Khai báo con trỏ 5

Hình 2 Khai báo Node 6

Hình 3 Linked List 6

Hình 4 Khai báo 1 Linked List 6

Hình 5 Code duyệt danh sách 7

Hình 6 Thêm node vào đầu danh sách 8

Hình 7 Xóa Node ở đầu 8

Hình 8 Xóa node bất kỳ không phải ở đầu 9

Hình 9 Tìm kiếm Node 9

Hình 10 Code hiển thị ảnh bằng opencv 11

Hình 11 Thư mục data 11

Hình 12 Thư mục img 11

Hình 13 Tạo các thư viện cần thiết 12

Hình 14 Các ảnh có sẵn trong thư mục ảnh 15

Hình 15 File “Image.txt” 15

Hình 16 File "ListImg.txt" 15

Hình 17 Menu 15

Hình 18 Chức năng 1 16

Hình 19 Thêm thất bại do tên ảnh sai hoặc không có ảnh đó trong file “img” 16

Hình 20 Thêm thất bại do ảnh đã tồn tại trong danh sách 16

Hình 21 Thêm thành công ảnh "messi.jpg" 16

Hình 22 Chức năng 3 17

Hình 23 Chức năng 4 17

Hình 24 Chức năng 5 18

Hình 25 Chức năng 6 18

Hình 26 Ghi lại thay đổi vào file "ListImg.txt" 19

Trang 4

I Giới thiệu

1.1 Lý do và động lực

Ngày nay con người có nhu cầu chụp ảnh rất nhiều , có những người trong bộ sưu tập có đến hàng trăm , hàng nghìn bức ảnh dẫn đến việc quản lý hay xem lại một ảnh nào đó rất khó khăn.Vì vậy nhóm em quyết định tạo ra ứng dụng Image Viewer giúp người dùng xem,thao tác và quản lý hình ảnh một cách dễ dàng hơn.Ngoài ra tạo 1 Image Viewer sử dụng Linked List giúp người học xây dựng một ứng dụng thực tế , học cách áp dụng cấu trúc dữ liệu vào các ứng dụng thực tế và nâng cao kỹ năng lập trình

1.2 Định nghĩa bài toán

Bài toán “Image Viewer using Linked List” là việc xây dựng trình xem ảnh sử dụng cấu trúc dữ liệu Linked List để quản lý danh sách các ảnh Ứng dụng sẽ có các chức năng:

Phân bố ảnh chụp theo năm

1.3 Bảng phân công nhiệm vụ

Vũ Đăng Tuấn Tạo class “Menu” để xử lý các chức năngNguyễn Trọng Hiếu Tạo class “ImageViewer” với các chức năngTrần Minh Đức Tổng hợp và làm báo cáo

Trần Hưng Sách Tìm tài liệu tham khảo và tìm ảnh

Phân công công việc theo thời gian :

Tuần 1 : Tìm hiểu chủ đề và lên kế hoạch giải quyết bài toán Tuần 2 : Nghiên cứu và bắt đầu viết chương trình

Tuần 3 : Hoàn thiện chương trình và chạy thử

Tuần 4 : Tổng hợp kết quả và làm báo cáo

Trang 5

II Phương pháp lựa chọn

1 Danh sách liên kết đơn

1.1 Con trỏ và struct

a Con trỏ

Một con trỏ (pointer) là một biến dùng để lưu trữ địa chỉ của một biến khác Biến khác ở đây có thể là một biến thông thường như biến số nguyên,biến số thực, hoặc có thể là một mảng, một hàm, và có khi cũng chính là một con trỏ khác Vì con trỏ là một biến nên nó cũng cần phải được lưu trữ

ở đâu đó trong bộ nhớ; có nghĩa là bản thân biến con trỏ cũng có một địa

bộ nhớ Do đó, ta có thể dùng con trỏ đề lưu địa chỉ của một con trỏ

khác.

Cú pháp khai báo con trỏ trong C, nói một cách đơn giản (nhưng không hoàn toàn chính xác), gồm 3 phần: (i) kiểu của biến khác mà con trỏ lưu trữ địa chỉ, (2) dấu * và (3) tên của con trỏ Con trỏ hàm thì khai báo hơi khác một chút, nhưng đây không phải vấn đề trọng tâm của bài viết Ví dụ, khai báo một số con trỏ:

b Struct

Struct cho phép chúng ta tập hợp một hoặc một vài kiểu dữ liêu khác nhau thành một kiểu dữ liệu mới Các kiểu dữ liệu thành phần của một struct có thể là kiểu dữ liệu sẵn có như số nguyên, số thực, con trỏ, hoặc một kiểu struct đã định nghĩa trước đó

Trong DSLK, struct được sử dụng để khai báo một “mắt xích” của danh sách Ví dụ ta muốn khai báo một mắt xích của một danh sách liên kết các biến kiểu int thì ta có thể khai báo như sau:

Hinh 1 Khai báo 1 con trỏ

Hinh 2 Khai báo Node

Trang 6

1.2 Định nghĩa

Danh sách liên kết đơn (Singly Linked List): Mỗi một phần tử (hay còn gọi

là node) trong danh sách liên kết đơn gồm có datanext pointer next ,

pointer sẽ trỏ tới node kế tiếp trong danh sách liên kết đơn Và nếu next pointer trỏ tới NULL thì có nghĩa là node đó là node cuối cùng trong danh sách liên kết đơn

1.3 Đặc điểm của danh sách liên kết đơn

Do danh sách liên kết đơn là một cấu trúc dữ liệu động, được tạo nên nhờ việc cấp phát động nên nó có một số đặc điểm sau đây:

Được cấp phát bộ nhớ khi chạy chương trình

Có thể thay đổi kích thước qua việc thêm, xóa phần tử

Kích thước tối đa phụ thuộc vào bộ nhớ khả dụng của RAM

Các phần tử được lưu trữ ngẫu nhiên (không liên tiếp) trong RAM

Hinh 1 Linked List

Hinh 2 Khai báo 1 Linked List

Trang 7

Và do tính liên kết của phần tử đầu và phần tử đứng sau nó trong danh sáchliên kết đơn, nó có các đặc điểm sau:

Chỉ cần nắm được phần tử đầu và cuối là có thể quản lý được danhsách

Truy cập tới phần tử ngẫu nhiên phải duyệt từ đầu đến vị trí đóChỉ có thể tìm kiếm tuyến tính một phần tử

Trang 8

2.2 Thêm 1 node vào đầu danh sách

Gán next của Node mới trỏ đến Node đầu (cũ): node->next = head;Cập nhập lại giá trị head: head = node;

2.3 Xóa 1 node khỏi danh sách theo vị trí

a Xóa ở đầu danh sách

Bước 1: Khai báo một con trỏ p để lưu lại địa chỉ của Node đầu tiên: Node* temp = head;

o Trường hợp ngoại lệ cần xử lý là nếu danh sách không có phần tử nào thì phải thoát trước khi thực hiện xóa

Bước 2: cập nhập lại giá trị của head: head = head->next;

Bước 3: giải phóng vùng nhớ của Node cần xóa: delete temp;

8

Hinh 4 Thêm node vào đầầu danh sách

Hinh 5 Xóa Node đầầu ở

Trang 9

b Xóa các node còn lại

Bước 1: Khai báo một con trỏ p để lưu lại địa chỉ của Node đầu tiên: Node* temp = head;

Bước 2: Duyệt danh sách để tìm vị trí node cần xóa và node trước nó(prev)

Bước 3: cập nhập lại giá trị next của Node prev: prev->next =

temp->next;

Bước 4: giải phóng vùng nhớ của Node cần xóa: delete temp;

2.4 Tìm kiếm Node trong danh sách

Tạo con trỏ temp trỏ đến node đầu

Duyệt danh sách từ node đầu đến node cuối.nếu temp = node cần tìm thì dừng vòng lặp và trả về temp

III Triển khai cài đặt

1 Ngôn ngữ lập trình và thư viện

1.1 Ngôn ngữ lập trình C++ và các thư viện cơ bản

C++ là một ngôn ngũ lập trình đa năng , có cấp độ cao được phát triển bởi Bjarne Stroustrup vào năm 1983 Nó là một phần mở rộng của ngôn ngữ lập trình C và hỗ trợ các mô hình lập trình hương đối tượng C++ được sử dụng rộng rãi trong việc phất triển hệ điều hành, phần mềm hệ thống, trình

Hinh 6 Xóa node bầất kỳ không ph i đầầu ả ở

Hinh 7 Tim kiêấm Node

Trang 10

điều khiển thiết bị , trò chơi video và các uwngs dụng đòi hỏi hiệu suất cao khác.

Các thư viện cần dùng trong bài :

iostream: nhập xuất dữ liệu

string: xử lý chuỗi

vector: lưu trữ thông tin 1 ảnh

map: phân bố ảnh theo năm với “key=năm” và “value=mảng chứa các ảnh cùng năm đó”

fstream : lấy dữ liệu ảnh

opencv2: hiển thị ảnh

1.2 Thư viện openCV

OpenCV là một thư viện mã nguồn mở để phất triển các ứng dụng thịgiác máy tính và xử lý ảnh Thư viện này cung cấp nhiều hàm xử lý ảnh

và video , hỗ trỡ cho nhiều ngôn ngữ lập trình như C++,Python,Java vàC#

OpenCV2 là phiên bản cũ của thư viện OpenCV, được phát hành năm2009.Các tính năng chính của openCV2 :

o Các tính năng phân tích hình ảnh như phát hiện cạnh và đường viền

o Các công cụ đề phát triển các ứng dụng thi giác máy tính và các ứngdụng Al

Cách cài đặt openCV với Visual Studio :

visual-c-tren-windows/

Trang 11

Img: chứa ảnh

Hinh 8 Code hi n th nh bằầng opencv ể ị ả

Hinh 9 Th m c data ư ụ

Hinh 10 Th m c img ư ụ

Trang 12

Header file: chứa các file header

struct Imagestring name - tên

string resolution - độ phân giảistring location - địa điểm

string date - thời gian

int views - sô lượt xem

Image() – hàm tạo rỗng

Image(…) – hàm tạo có tham sốvoid showImage() – hàm hiển thị ảnhbool addImage() – hàm thêm ảnh

Struct nodeImage data – thông tin ảnh

node *next – con trỏ next

Hinh 11 T o các th vi n cầần thiêất ạ ư ệ

Trang 13

node(Image img) – Hàm khởi tạo 1 node

class ImageViewer – tạo 1 linked list với các chức năng node *head – node đầu

int count – số lượng node

ImageViewer() – hàm khởi tạo rỗng

void add(Image img) – thêm 1 node vào đầu

void remove(int index) – xóa 1 node theo vị trí

vector<Image*> mostViews() – tìm ảnh nhiều views nhấtvector<Image*> find(string location) – tìm ảnh theo địa điểmmap<string,vector<Image*> > filter() – phân bố ảnh theo nămvector<Image*> listImg() – lấy tất cả ảnh bỏ vào mảng

Class MENU – xử lý các chức năng

ImageViewer iv – khai báo 1 Linked List

vector<Image*> readfile(string fileName) – lấy ảnh từ file txtMENU() – hàm tạo để thêm ảnh từ file “ListImg.txt” vào dsach

~MENU() – hàm hủy để lưu thay đổi vào file “ListImg.txt” khi đóng chương trình

void menu() – hàm menu

void print(vector<Image*> img) – in danh sách ảnh theo yêu cầuCác hàm thực hiện chức năng từ 1 đến 6

Trang 14

Source file: chứa file main.cpp đề chạy chương trình

IV Kết quả thực nghiệm

1 Dữ liệu

Nhóm em đã sưu tầm được khoảng 50 bức ảnh của các cầu thủ bóng đá trên thếgiới

ST

Trang 15

18 garnacho.jpg 365dpi Argentina 12/01/2023

Trang 16

40 mitoma.jpeg 300dpi Nhat Ban 15/01/2018

45 bruno fernandes.jfif 300dpi Bo Dao Nha 15/04/2023

Trang 17

2 Kết quả thực nghiệm

2.1 Test Menu 1: Hiển thị danh sách ảnh

2.2 Test Menu 2: Thêm nh ả

Hinh 12 Các nh có sằẵn trong th m c nh ả ư ụ ả

Hinh 13 File “Image.txt”

Hinh 14 File "ListImg.txt"

Hinh 15 Menu

Hinh 16 Ch c nằng 1 ứ

Trang 18

2.3 Test Menu 3: Xóa ảnh

2.4 Test Menu 4: Tìm ảnh có lượt xem cao nhất

Hinh 17 Thêm thầất b i do nh đã tôần t i ạ ả ạ

trong danh sách

Hinh 20 Ch c nằng 3 ứ Hinh 18 Thêm thầất b i do tên nh sai ho c không có nh đó trong fle ạ ả ặ ả

“img”

Trang 19

Như đã xem ở trên thì ảnh “gavi” và “messi” được xem nhiều nhất với views

Trang 20

2.6 Test Menu 6: Phân bố ảnh theo năm

2.7 Test chức năng ghi file khi đóng chương trình

Trang 21

Xem ảnh và thông tin ảnh

cơ bản trên danh sách như thêm, xóa, duyệt, tìm kiếm

Ngoài ra, bài toán cũng giúp chúng ta nhận thức được rằng việc lưu trữ

và quản lý dữ liệu là một phần rất quan trọng trong lập trình Nếu không

có cấu trúc dữ liệu phù hợp, việc thao tác trên dữ liệu sẽ trở nên khó khăn và tốn thời gian

Cuối cùng, bài toán cũng giúp chúng ta rèn luyện kỹ năng lập trình và tưduy thuật toán, từ đó giúp chúng ta trở nên thành thạo hơn trong lập trình và giải quyết các bài toán khó hơn

3 Những khó khắn khi học môn học này

Môn học Cấu trúc dữ liệu và Giải thuật có thể đòi hỏi nhiều nỗ lực và thời gian để học và làm quen với các khái niệm và phương pháp Một số khó khăn cụ thể khi học môn này có thể bao gồm:

Khái niệm phức tạp: Cấu trúc dữ liệu và giải thuật có nhiều khái niệm phức tạp và trừu tượng, nhưng lại là cơ sở cho nhiều ứng dụng

và thuật toán phức tạp Việc hiểu rõ các khái niệm này và ứng dụng chúng vào thực tế có thể đòi hỏi nhiều thời gian và nỗ lực

Nhiều thuật toán và phương pháp: Có nhiều thuật toán và phương pháp khác nhau để giải quyết các bài toán sử dụng cấu trúc dữ liệu vàgiải thuật, việc hiểu và áp dụng chúng có thể khó khăn

Trang 22

Tài liệu tham khảo

Thư viện map: https://cplusplus.com/reference/map/map/?kw=map

Thư viện vector: https://cplusplus.com/reference/vector/vector/?kw=vector

Thư viện string: https://cplusplus.com/reference/string/string/?kw=string

OpenCV: opencv-visual-c-tren-windows/

Ngày đăng: 29/05/2024, 18:10

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w