Với sự phát triển không ngừng của nghành khoa học dữ liệu, chúng ta thấy sự xuất hiện ngày càng nhiều của các thiết bị thông minh và các hệ thống IoT. Với một lượng lớn các thiết bị xuất hiện ngày càng nhiều thì nhu cầu xử lý và thao tác trên dữ liệu ngày càng lớn.
Trong bài tập lớn này sinh viên được yêu cầu thực hiện các thao tác trên một bộ dữ liệu thực được thu thập từ các thiết bị gởi về cho máy chủ. Sinh viên vận dụng các cấu trúc dữ liệu phù hợp để thực hiện, giới hạn đến danh sách liên kết.
Dữ liệu nhập của chương trình được chứa trong file input như sau:
Header | |
---|---|
12 bytes | VRecord data |
4 bytes | number of records |
Content | |
1 | VRecord |
2 | VRecord |
3 | VRecord |
... | ... |
Thông tin chi tiết về record được đặc tả trong cấu trúc VRecord.
Cấu trúc này gồm ID của thiết bị, vị trí (x là longitude, y là latitude),
và timestamp cứa thời gian dữ liệu được gởi đến.
Hàm distanceVR
được cho sẵn để tính khoảng cách giữa 2 thiết bị, giá
trị trả về là khoảng cách tính theo km.
Dữ liệu sinh viên xuất ra cần tuân thủ các quy tắc sau:
- Số nguyên: không cần định dạng
- Số thực: độ chính xác 12 chữ số, đã được cài trong
main.cpp
. - Các dòng dữ liệu: với mỗi request, sinh viên xuất ra thông tin trên cùng một dòng, cách nhau bởi khoảng trắng.
- Nếu request là dạng command, sinh viên xuất
ra
<request>
:Succeed
/Failed
.
Các yêu cầu có thể được xử lý trên database.
Mã | Mô tả |
---|---|
CNV | Tính số lượng thiết bị trong database |
VFF | Tìm thiết bị được lưu trữ đầu tiên |
VFL | Tìm thiết bị được lưu trữ cuối cùng |
VFY<ID> |
Tìm tọa độ y được lưu trữ đầu tiên của thiết bị <ID> |
VFX<ID> |
Tìm tọa độ x được lưu trữ đầu tiên của thiết bị <ID> |
VLY<ID> |
Tìm tọa độ y được lưu trữ cuối cùng của thiết bị <ID> |
VLX<ID> |
Tìm tọa độ x được lưu trữ cuối cùng của thiết bị <ID> |
VFT<ID> |
Tìm thời điểm bắt đầu lưu trữ của thiết bị <ID> |
VLT<ID> |
Tìm thời điểm kết thúc lưu trữ của thiết bị <ID> |
VCR<ID> |
Tính số lượng record của thiết bị <ID> |
VCL<ID> |
Tính độ dài hành trình của thiết bị <ID> |
VMT<ID> |
Tính thời gian di chuyển của thiết bị <ID> |
VFS<ID> |
Tìm điểm dừng đầu tiên của thiết bị <ID> , xuất (x y) |
VLS<ID> |
Tìm điểm dừng cuối cùng của thiết bị <ID> |
VMS<ID> |
Tìm thời gian dừng lâu nhất của thiết bị <ID> |
VAS<ID> |
Tìm khoảng cách trung bình giữa 2 lần thu thập dữ liệu của thiết bị <ID> |
MST | Tìm thời lượng dừng lâu nhất của tất cả các thiết bị |
CNR | Tính số lượng record trong database |
MRV | Tìm thiết bị có số lượng record nhiều nhất |
LRV | Tìm thiết bị có số lượng record ít nhất |
MTV | Tìm thiết bị có tổng thời gian di chuyển lâu nhất |
MVV | Tìm thiết bị có vận tốc di chuyển trung bình nhanh nhất |
CNS | Tính số lượng thiết bị luôn di chuyển và không dừng |
CAS | Tính khoảng cách trung bình khi thu thập dữ liệu của tất cả các thiết bị |
LPV | Tìm thiết bị có hành trình dài nhất |
SPV | Tìm thiết bị có hành trình ngắn nhất |
RVR<ID> |
Xóa các record của thiết bị <ID> |
Lưu ý: nếu có nhiều kết quả có thể trả về thì chọn kết quả đầu tiên theo thứ tự lưu trong dữ liệu đầu vào.
Sinh viên được cung cấp các file sau:
main.cpp
: mã nguồn chính của chương trìnhlistLib.h
: file chứa định nghĩa thư viện danh sách liên kếtdbLib.h
: file header chứa prototype cần thiết để quản lý databasedbLib.cpp
: mã nguồn hiện thực các chức năng quản lý databaserequestLib.h
: file header chứa các prototype cần thiết để quản lý các sự kiệnrequestLib.cpp
: mã nguồn hiện thực các hàm xử lý sự kiệnprocessData.cpp
: mã hiện thực của sinh viên
Sinh viên được cho các hàm sau:
distanceVR
: tính khoảng cách giữa 2 điểm trên mặt đất với toạ độ (latitude (y), longitude (x)) cho trước.loadVDB
: đọc file và tải dữ liệu vào danh sáchstrPrintTime
: in thời gian ra một chuỗi theo định dạng yêu cầu
Đối với file thư viện listLib.h
, sinh viên được cung cấp sẵn định
nghĩa cơ bản. Ngoài ra, để build được chương trình hoàn chỉnh, sinh viên
cần hoàn thiện các hàm còn lại trong danh sách. Sinh viên có thể thêm các
tính năng vào thư viện nếu thấy cần thiết.
processData.cpp Sinh viên hiện thực việc xử lý các yêu cầu thông qua hàm processRequest. Không được thay đổi prototype của hàm này.
Sinh viên được phép tuỳ biến, chỉnh sửa các file mã nguồn trừ file
main.cpp
vì nó sẽ được ghi đè lúc chấm.
Sinh viên không được sử dụng các thư viện nào khác ngoài các thư viện đã được dùng trong framework.
Sinh viên thực hiện build bằng lệnh make
từ command line trên Linux
và chạy file a01
. Cú pháp trên linux như sau:
./dsa172a1 request.txt sampleData.dat
trong đó request.txt
là file chứa danh sách các sự kiện, cách nhau bởi
khoảng trắng hoặc ký tự xuống dòng.
sampleData.dat
là file dữ liệu.
Đối với các bạn dùng VisualStudio trên Windows, các bạn có thể tạo một project và thêm các file mã nguồn vào. Nếu không bạn có thể sử dụng hệ thống CMake để tự sinh project VS cho mình.