Báo Cáo Đồ Án Môn Học _ Cấu Trúc Dữ Liệu và Giải Thuật _ Khoa Công Nghệ Thông Tin _ Đồ Án Xây Dựng Trạm Thu Phí Các Loại Xe Dùng Cấu Trúc Dữ Liệu Queue _ Trường Đại Học Sài Gòn _ PDF
Trường Đại Học Sài Gòn Báo Cáo Đồ Án TRƯỜNG ĐẠI HỌC SÀI GÒN -o0o - Báo Cáo Đồ Án Môn Học Cấu Trúc Dữ Liệu Giải Thuật Khoa Công Nghệ Thông Tin Trường Đại Học Sài Gòn Báo Cáo Đồ Án Trường Đại Học Sài Gòn -o0o - Trạm Thu Phí Báo Cáo Đồ Án Ngành Cơng Nghệ Thông Tin Họ tên: Nguyễn Thành Hưng Lớp: DCT1211 MSSV: 3121410241 Học Phần: Cấu trúc liệu giải thuật Năm hoc: 2022/ HK: Giảng Viên: PGS.TS Nguyễn Tuấn Đăng Trường Đại Học Sài Gòn Báo Cáo Đồ Án Mục Lục Đề bài: A Đề bài: .5 B Các yêu cầu cần giải đề bài: Mô tả hệ thống xây dựng: .5 2.1.Xác định đối tượng hệ thống hàm khởi tạo đối tượng đó: 2.2.Các chức hệ thống: 3.Giải thích lý sử dụng cấu trúc liệu để mơ hình hóa đối tượng liệu hệ thống: 3.1.Dùng hàng đợi để mơ hình hóa trạm thu phí: 3.2.Dùng danh sách liên kết để biểu diễn thông tin xe trạm: .9 4.Giải thích cài đặt cấu trúc liệu: 10 4.1.Cấu trúc liệu danh sách liên kết 10 A Định nghĩa: 10 B Cấu trúc liệu phần tử: 10 4.1.Cấu trúc liệu hàng đợi: .11 A Định nghĩa: 11 B Cài đặt hàng đợi danh sách liên kết: 12 C Cấu trúc liệu hàng đợi: 12 Mã giả trình bày thuật tốn thực chức chương trình:13 5.1.Chức thêm xe vào cuối hàng đợi: 13 5.2.Chức lấy xe đầu hàng đợi: 13 5.3.Hiển thị thông tin hàng đợi: 14 Trình bày giải thích chương trinh viết đề cài đặt thuật toán: 14 6.1 Các chương trình khởi tạo: 14 A Khởi tạo danh sách liên kết: 14 B Khởi tạo hàng đợi rỗng hàm kiểm tra hàng đợi: 15 6.2.Chương trình cài đặt thuật tốn thêm vào lấy khỏi hàng đợi: .15 A Thêm khóa vào hàng đợi: 15 B Lấy khóa từ hàng đợi: 17 C Lấy thông tin phần tử hàng đợi: 19 Kết thực thi chương trình giải thích: 19 7.1 Mô tả hoạt động hệ thống: .19 Kết luận: 23 Trường Đại Học Sài Gòn Báo Cáo Đồ Án Danh Mục Hình Hình 1: Sơ đồ tiến trình hàm thongtinxe Hình 2: Danh sách liên kết đơn Fist .10 Hình 3: Hàng đợi danh sách liên kết 12 Hình 4: hàng đợi có phần tử 16 Hình 5: hàng đợi có nhiều phần tử 16 Hình 6: xóa phần tử hàng đợi 18 Hình 7: Xóa phần tử hàng đợi có nhiều phần tử 19 Hình 8: Trạm thi phí cho xe vào 20 Hình 9: Trạm thu phí cho xe vào 20 Hình 10: Trạm thu phí bị đầy xe 21 Hình 11: Giải hàng đợi bị đầy 22 Trường Đại Học Sài Gòn Báo Cáo Đồ Án 1.Đề bài: A Đề bài: xe Trạm thu phí có hàng đợi xe Hàng đợi đủ chỗ cho 20 Xe qua trạm có loại sau đây: xe container, xe tải, xe khách, xe Thông tin xe bao gồm: số đăng ký, loại xe Vào thời điểm có xe khỏi hàng đợi để qua trạm, có ngẫu nhiên từ đến xe vào hàng đợi Khi xe qua trạm thơng tin xe ghi nhận Tất liệu khởi tạo ngẫu nhiên Chương trình dừng lại phím quy ước nhấn hàng đợi bị đầy B Các yêu cầu cần giải đề bài: - Khởi tạo liệu cho loại xe - Thêm xe vào hàng đợi - Lấy xe đầu hàng đợi ra, in thông tin xe lấy 2.Mô tả hệ thống xây dựng: 2.1.Xác định đối tượng hệ thống hàm khởi tạo đối tượng đó: Đề yêu cầu xây dựng chương trình có sử dụng cấu trúc liệu để mô tả hoạt động trạm thu phí Để xây dựng hoạt động trạm thu phí ta cần có thơng tin vào loại xe Ở gồm loại xe: xe tải, xe khách xe Mỗi loại xe lại gồm thông tin như: số đăng ký, loại xe Thông tin cho loại xe xây dựng cấu trúc sau: struct car { string loaiXe; int soDangKy = 0; }; Mỗi xe gồm biến kiểu string để lưu trữ tên xe biến Trường Đại Học Sài Gòn Báo Cáo Đồ Án kiểu int để lưu lại số đăng ký, ban đầu số đăng ký gán 0, sau hàm random gán lại giá trị Hàm random xây dựng sau: int random(int minN, int maxN) { return minN + rand() % (maxN + - minN); } Hàm radom nhận giá trị đầu vào maxN minN, đó: maxN số ngẫu nhiên lớn , minN số ngẫu nhiên nhỏ Hàm radom dựa hàm rand thư viện stdlib.h Hàm trả số nguyên có kiểu liệu int.Tuy nhiên, hàm rand không random số chạy lại code Để tạo số ngẫu nhiên cần kết hợp với hàm srand phần main, kết hợp với hàm time thư viện time.h Sau để tạo hàm sinh số ngẫu nhiên đoạn dựa vào phép toán chia dư phép toán chia dư (%) số bất kỳ(a) cho số b cố định: a % b cho giá trị thuộc đoạn [0, b-1] Để khởi tạo giá trị cho biến cấu trúc liệu car, hàm sau khởi tạo giá trị cách ngẫu nhiên dựa vào hàm random: car* thongtinxe() { car* xe = new car; int r = random(1, 4); switch (r) { case 1: xe->loaiXe = "xe Tai"; break; case 2: xe->loaiXe = "xe Khach"; break; case 3: xe->loaiXe = "xe Con"; break; case 4: xe->loaiXe = "xe Container"; break; } xe->soDangKy = random(1, 100); return xe; } Hàm thongtinxe không nhận liệu đầu vào trả trỏ có Trường Đại Học Sài Gịn Báo Cáo Đồ Án kiểu liệu car, trỏ trỏ tới biến loaiXe, soDangKy xe Trong hàm thongtinxe sử dụng cấu trúc swich-case, biến r nhận giá trị ngẫu nhiên từ tới 4, r trùng với case biến loaiXe nhận giá trị tương ứng với case đó, sau hàm random tiếp tục sinh số ngẫu nhiên từ đến 100 để gán giá trị cho biến soDangKy Flow chart: Trường Đại Học Sài Gòn Báo Cáo Đồ Án Hình 1: Sơ đồ tiến trình hàm thongtinxe Trường Đại Học Sài Gòn Báo Cáo Đồ Án 2.2.Các chức hệ thống: - Khởi tạo thông tin xe - Khởi tạo hàng đợi - Kiểm tra hàng đợi rỗng, đầy - Khởi tạo số lượng xe vào hàng đợi (từ đến xe) - Thêm xe vào cuối hàng đợi, đếm số lượng xe vào hàng đợi - Đếm số lượng xe hàng đợi, hàng đợi đầy không cho xe tiếp tục vào, hàng đợi rỗng tiếp tục cho xe vào - Lấy xe khỏi hàng đợi vị trí đầu hàng - Lấy thơng tin xe khỏi hàng đợi, đếm số lượng xe lại hàng đợi - In thông tin xe hàng đợi 3.Giải thích lý sử dụng cấu trúc liệu để mơ hình hóa đối tượng liệu hệ thống: phí: 3.1.Dùng hàng đợi để mơ hình hóa trạm thu Dùng cấu trúc liệu hàng đợi để mơ hình hóa đối tượng liệu trạm thu phí cách tốt để mơ hình hóa đối tượng liệu vì: Hàng đợi danh sách thêm vào đầu lấy đầu danh sách Hàng đợi gọi danh sách FIFO (Fist-In Fist-Out), tức thêm vào trước, lấy trước Điều tương ứng với trạm thu phí thực tế Trạm thu phí thực tế có đầu vào đầu ra, xe vào đầu lại Vì tương đồng nên việc mơ tả đối tượng liệu cài đặt hoạt động trạm thu phí dễ dàng 3.2.Dùng danh sách liên kết để biểu diễn thông tin xe trạm: Đối với danh sách loại xe thơng tin xe trạm thu phí cài đặt danh sách liên kết vì: Các phần tử danh sách chèn hay xóa cách dễ dàng mà không cần phân bổ lại xếp lại tồn cấu trúc mục liệu không cần lưu trữ liên tục nhớ hay đĩa, tái cấu trúc mảng thời gian chạy hoạt động tốn nhiều Danh sách liên kết cho phép chèn hay xóa nút điểm danh sách Mặc khác, thân danh sách liên kết liên kết đơn giản nên không cho phép truy cập ngẫu nhiên tới liệu hình thức đánh Trường Đại Học Sài Gòn Báo Cáo Đồ Án mục hiệu nào, nhiều toán tử lấy nút cuối danh sách, tìm nút có chứa liệu cho, hay tìm vị trí nút để chèn nút yêu cầu lặp qua hầu hết tất phần tử danh sách Tuy nhiên chương trình khơng cần truy cập tới ngẫu nhiên phần tử, hay tìm kiếm danh sách mà quên tâm tới việc thêm xóa nên việc sử dụng danh sách liên kết thay cho mảng dễ dàng 4.Giải thích cài đặt cấu trúc liệu: 4.1.Cấu trúc liệu danh sách liên kết A Định nghĩa: Với cấu trúc liệu danh sách xe hàng đợi cài đặt danh sách liên kết, cụ thể danh sách liên kết đơn: Danh sách liên kết danh sách có cấu trúc liệu tuyến tính phần tử liên kết với vùng liên kết chúng Mỗi phần tử có hai vùng chình: vùng liệu vùng liên kết chứa địa phần tử Vùng liên kết cuối danh sách có giá trị NULL Danh sách liên kết có đặt điểm hai phần tử không lưu nhớ B Cấu trúc liệu phần tử: Fist Data Next Hình 2: Danh sách liên kết đơn Fist 10 Trường Đại Học Sài Gòn Báo Cáo Đồ Án Một phần tử danh sách có thuộc tính: - Data: chứa nội dung liệu phần tử, thường kiểu số nguyên,chuỗi ký tự, cấu trúc - Next: Con trỏ trỏ tới phần tử kế tiếp, có kiểu trỏ phần tử kiểu phần tử Code: struct car { string loaiXe; int soDangKy = 0; }; struct carlist { car* xe; carlist* next; }; 4.1.Cấu trúc liệu hàng đợi: A Định nghĩa: Hàng đợi danh sách đối tượng liệu, hai đầu danh sách xem đầu hàng, cịn đầu hàng Chẳng hạn, hàng đợi danh sách ký tự (a, b, c, d), a đứng đầu hàng, cịn d đứng hàng Chúng ta thực phép tốn sau hàng đợi, phép tốn Q hàng đợi, x đối tượng kiểu với đối tượng hàng Q Empty(Q) Hàm trả true hàng Q rỗng false không Enqueue(x, Q) Thêm đối tượng x vào đuôi hàng Q Dequeue(Q) Loại đối tượng đứng đầu hàng Q GetHead(Q) Hàm trả đối tượng đứng đầu hàng Q, cịn hàng Q khơng thay đổi Ví dụ Nếu Q = (a, b, c, d) a đầu hàng, d đuôi hàng, thực phép tốn Enqueue(e, Q) ta nhận Q = (a, b, c, d, e), với e đứng hàng, sau thực phép tốn Dequeue(Q), ta có Q = (b, c, d, e) b trở thành phần tử đứng đầu hàng Với phép toán Enqueue Dequeue xác định đối tượng vào hàng trước khỏi hàng trước Vì lý mà hàng đợi gọi cấu trúc liệu FIFO (viết tắt cụm từ First- In First- Out) Điều đối lập với ngăn xếp, ngăn xếp đối tượng khỏi ngăn xếp đối tượng sau đặt vào ngăn xếp 11 Trường Đại Học Sài Gòn Báo Cáo Đồ Án Hàng đợi sử dụng hoàn cảnh mà cần xử lý đối tượng theo trình tự FIFO Cuối chương trình bày ứng dụng hàng đợi mô hệ phục vụ Nhưng trước hết cần nghiên cứu phương pháp cài đặt hàng đợi Cũng ngăn xếp, cài đặt hàng đợi mảng DSLK B Cài đặt hàng đợi danh sách liên kết: Cũng ngăn xếp, cài đặt hàng đợi DSLK Với ngăn xếp, cần truy cập tới phần tử đỉnh ngăn xếp, nên cần trỏ top trỏ tới đầu DSLK (xem hình 6.3) Nhưng với hàng đợi, cần phải truy cập tới phần tử đầu hàng phần tử đuôi hàng, cần sử dụng hai trỏ ngoài: trỏ front trỏ tới thành phần đầu DSLK, lưu phần tử đầu hàng, trỏ rear trỏ tới thành phần cuối DSLK, lưu phần tử hàng, hình front Data Next rear Hình 3: Hàng đợi danh sách liên kết C Cấu trúc liệu hàng đợi: Hàng đợi có thuộc tính sau: - Front: trỏ đầu lấy hàng đợi, có kiểu trỏ phần tử kiểu phần tử -Rear: trỏ đầu thêm vào hàng đợi, có kiểu trỏ phần tử kiểu phần tử -Count: số phần tử hàng đợi Code: 12 Trường Đại Học Sài Gòn Báo Cáo Đồ Án struct Queue { carlist* front; carlist* rear; int cout; }; 5.Mã giả trình bày thuật tốn thực chức chương trình: 5.1.Chức thêm xe vào cuối hàng đợi: Mã giả: Alogrithm Enqueue(ref queue, theInfo) Tạo phần tử p có khóa theInfo If(queue rỗng) then Đầu lấy front p Else Phần tử cuối trỏ p End if Đầu thêm vào rear p Tăng số phần tử End Enqueue 5.2.Chức lấy xe đầu hàng đợi: Mã giả: Alogrithm Dequeue(ref queue) If(queue rỗng) “Hang doi rong” Else p front If(queue có phần tử) Rear = NULL End if Front phần tử sau p Hủy bỏ phần tử p End if Giam số phần tử tai 13 Trường Đại Học Sài Gịn Báo Cáo Đồ Án End Dequeue 5.3.Hiển thị thơng tin hàng đợi: Mã giả: Alogrithm Display( queue) If(queue rỗng) “Hang doi rong” Esle p đầu lấy front While(p phần tử queue) Hiển thị nội dung p p đến phần tử End while End if End Display 6.Trình bày giải thích chương trinh viết đề cài đặt thuật toán: 6.1 Các chương trình khởi tạo: A Khởi tạo danh sách liên kết: carlist* createNode(car* data) { carlist* p = new carlist; if (p == NULL) { cout next = NULL; } return p; Đầu tiên, khởi tạo biến trỏ p, node danh sách liên kết Nếu không cấp phát tiếp nhớ chứng tỏ nhớ đầy, 14 Trường Đại Học Sài Gòn Báo Cáo Đồ Án khỏi chương trình Nếu cấp phát nhớ biến trỏ xe p nhận data làm liệu Phần next p trỏ tới null B Khởi tạo hàng đợi rỗng hàm kiểm tra hàng đợi: void InIt(Queue& queue) { queue.front = NULL; queue.rear = NULL; queue.cout = 0; } bool IsEmty(Queue queue) { return queue.front == NULL; } #define Max 20 bool IsFull(Queue queue) { return queue.cout >= Max; } Khỏi tạo hàng đợi rỗng hàm InIt: gán trỏ front rear queue NULL trỏ khơng khởi tạo giá trị, chúng chứa giá trị rác Ngoài địa vùng nhớ, có giá trị mà trỏ giữ được, giá trị null Null giá trị đặc biệt, điều có nghĩa trỏ chưa trỏ đến địa Hàm IsEmpty IsFull kiểm tra hàng đợi rỗng hay đầy Việc cần thiết cho thuật toán thêm vào hàng đợi hay lấy khỏi hàng đợi Hai hàm kiểm tra dựa vào hai trỏ front (trỏ vào phần tử hàng đợi) trỏ count (đếm số lượng phần tử hàng đợi) 6.2.Chương trình cài đặt thuật tốn thêm vào lấy khỏi hàng đợi: A Thêm khóa vào hàng đợi: void EnQueue(Queue& queue, carlist* p) { if (IsEmty(queue)) { queue.front = p; 15 Trường Đại Học Sài Gòn } Báo Cáo Đồ Án } else queue.rear->next = p; queue.rear = p; queue.cout++; Hàm enqueue nhận vào trỏ danh sách liên kết p, hàng đợi rỗng hai trỏ front rear trỏ vào p, tăng số lượng phần tử lên Nếu khơng ta thêm vào cuối hàng đợi cách cho trỏ next rear trỏ tới p sau chuyển p thành rear Ví Dụ: Nếu hàng đợi rỗng ta thêm vào hàng đợi phần tử xe tải sau: Front Xe tải Rear Hình 4: hàng đợi có phần tử Nếu hàng đợi không rỗng mà chứa phần tử xe con, xe khách ta thêm xe tải vào hàng đợi sau: Front Xe Rear Rear -> Xe khách Xe tải Hình 5: hàng đợi có nhiều phần tử 16 Trường Đại Học Sài Gòn Báo Cáo Đồ Án Q trình thêm khóa vào hàng đợi ví dụ sau: - Tạo phần tử p có nội dung xe tải - Nếu hàng đợi rỗng, đầu lấy front p - Nếu hàng đợi khác rỗng, phần tử cuối trỏ p - Đầu thêm vào rear p: p phần tử cuối - Tăng số phần tử Hàm CarIn sữ dụng thuật toán Enqueue để thêm xe vào kiểm soát số lượng xe vào, hàm gọi hàm random sau dựa số lượng xe để thực thêm vào, hàm kiểm tra xem hàng đợi đầy chưa, đầy ngừng void CarIn(Queue& queue) { int r = 3; int i = 0; for (; i < r; i++) { if (IsFull(queue)) break; EnQueue(queue, createNode(thongtinxe())); } soLuongXeVao(i); } B Lấy khóa từ hàng đợi: Hàm CarOut hàm xây dựng dựa thuật toán Dequeue, yêu cầu đề xe khỏi trạm lưu lại thơng tin xe, nên hàm CarOut bao gồm hai công việc lấy xe khỏi hàng đợi in thông tin xe Sau lấy xe khỏi hàng đợi hàm CarOut in thông tin xe void CarOut(Queue& queue) { cout