Tải bản đầy đủ - 0 (trang)
Cấu trúc dữ liệu

Cấu trúc dữ liệu

Tải bản đầy đủ - 0trang

ĐỒ ÁN GIẢI THUẬT VÀ LẬP TRÌNH – QUẢN LÝ KÝ TÚC XÁ



GVHD : Phan Thanh Tao



- Sử dụng các hàm để cài đặt danh sách liên kết:

struct DataSV

{

SinhVien data;

DataSV *next, *pre;

};

struct ListSV

{

DataSV *head, *tail;

};



- Sử dụng các hàm để khởi tạo phần tử cho danh sách liên kết:

DataSV* CreateNode(SinhVien data)

{

DataSV* node = new DataSV;

if (node != NULL)

{

node->data = data;

node->next = node->pre = NULL;

}

return node;

}



- Sử dụng các hàm để chèn phần tử vào danh sách liên kết bao gồm:

 Chèn phần tử vào đầu danh sách

void AddHead(ListSV& list, DataSV* data)

{

if (!list.head)

{

list.head = list.tail = data;

}

else

{

list.head->pre = data;

data->next = list.head;

list.head = data;

}

}



 Chèn phần tử vào cuối danh sách

void AddTail(ListSV& list, DataSV* data)

{

if (!list.head)

{

list.head = list.tail = data;

}

else

{

list.tail->next = data;

data->pre = list.tail;

list.tail = data;

}

}



5



Trịnh Minh An – Lớp 14T2

Bùi Văn Thảo – Lớp 14T2



ĐỒ ÁN GIẢI THUẬT VÀ LẬP TRÌNH – QUẢN LÝ KÝ TÚC XÁ



GVHD : Phan Thanh Tao



 Chèn phần tử vào sau một phần tử trong danh sách

void AddAfter(ListSV& list, DataSV* data, DataSV* after)

{

if (!after)

{

AddHead(list, data);

}

else

{

if (after == list.tail)

{

AddTail(list, data);

}

else

{

data->next = after->next;

data->pre = after;

after->next->pre = data;

after->next = data;

}

}

}



 Chèn phần tử vào trước một phần tử trong danh sách

void AddBefore(ListSV& list, DataSV* data, DataSV* before)

{

if (!before)

{

AddHead(list, data);

}

else

{

if (before==list.head)

{

AddHead(list, data);

}

else

{

data->pre = before->pre;

data->next = before;

before->pre->next = data;

before->pre = data;

}

}

}



- Sử dụng các hàm duyệt và in ra các phần tử trong danh sách liên kết:

void ShowNext(ListSV list)

{

for (DataSV* i=list.head; i; i = i->next)

{

cout << i->data;

}

}



- Sử dụng các hàm để tìm kiếm các phần tử trong danh sách liên kết:



6



Trịnh Minh An – Lớp 14T2

Bùi Văn Thảo – Lớp 14T2



ĐỒ ÁN GIẢI THUẬT VÀ LẬP TRÌNH – QUẢN LÝ KÝ TÚC XÁ



GVHD : Phan Thanh Tao



DataSV* SearchNode(ListSV list, int key)

{

DataSV* i = list.head;

while (i && i->data.get_id() != key) i = i->next;

return i;

}



- Sử dụng các hàm để xóa các phần tử trong danh sách liên kết gồm:

 Xóa phần tử đầu tiên của danh sách

void RemoveHead(ListSV& list)

{

if (!list.head)

{

cout << "\nList is empty!";

}

else if (list.head == list.tail)

{

delete list.head;

list.head = list.tail = NULL;

}

else

{

DataSV* temp = list.head;

list.head->next->pre = NULL;

list.head = list.head->next;

delete temp;

}

}



 Xóa phần tử cuối cùng của danh sách

void RemoveTail(ListSV& list)

{

if (!list.head)

{

cout << "\nList is empty!";

}

else if (list.head == list.tail)

{

delete list.head;

list.head = list.tail = NULL;

}

else

{

DataSV* temp=list.tail;

list.tail->pre->next = NULL;

list.tail = list.tail->pre;

delete temp;

}

}



 Xóa phần tử sau một phần tử trong danh sách

void RemoveAfter(ListSV& list, DataSV* after)

{

if (!list.head)

{

cout << "\nList is empty!\n";



7



Trịnh Minh An – Lớp 14T2

Bùi Văn Thảo – Lớp 14T2



ĐỒ ÁN GIẢI THUẬT VÀ LẬP TRÌNH – QUẢN LÝ KÝ TÚC XÁ



}



GVHD : Phan Thanh Tao



}

else if (list.head == list.tail)

{

cout << "\nList only one element!\n";

}

else if (list.tail != after)

{

DataSV* tmp = after->next;

after->next->next->pre = after;

after->next = after->next->next;

delete tmp;

}



 Xóa phần tử trước một phần tử trong danh sách

void RemoveBefore(ListSV& list, DataSV* before)

{

if (!list.head)

{

cout << "\nList is empty!\n";

}

else if (list.head == list.tail)

{

cout << "\nList only one element!\n";

}

else if (list.tail != before)

{

DataSV* tmp = before->pre;

before->pre->pre->next = before;

before->pre = before->pre->pre;

delete tmp;

}

}



 Xóa phần tử theo từ khóa (key) trong danh sách

void RemoveKey(ListSV& list, int key)

{

DataSV* result = SearchNode(list, key);

if(result)

{

if (list.head->data.get_id() == key)

{

RemoveHead(list);

}

else if (list.tail->data.get_id() == key)

{

RemoveTail(list);

}

else

{

result->pre->next = result->next;

result->next->pre = result->pre;

delete result;

}

}

else

{

cout << "\nKey not found!";



8



Trịnh Minh An – Lớp 14T2

Bùi Văn Thảo – Lớp 14T2



ĐỒ ÁN GIẢI THUẬT VÀ LẬP TRÌNH – QUẢN LÝ KÝ TÚC XÁ



GVHD : Phan Thanh Tao



}

}



- Sử dụng đa năng hóa các hàm tương tự ở trên cho từng đối tượng để

tạo và xử lý danh sách tương ứng với từng đối tượng.

- Sử dụng các hàm Header và Footer để tạo khung cho danh sách.

- Sử dụng các hàm void ShowPhong(ListPhong list) để in

ra sơ đồ thơng tin phòng theo từng khu nhà với tham số truyền vào list là

danh sách liên kết chứa các phần tử đối tượng Phong.

- Sử dụng hàm void SaveData(ListSV list) với tham số

truyền vào là 1 danh sách kiểu SinhVien, HopDong, hoặc

Phong để lưu các thông tin của từng đối tượng trong danh sách vào các file

“.txt” và mỗi thuộc tính cách nhau một ký tự ‘:’.

- Sử dụng hàm void ReadData(ListSV list) với tham số

truyền vào list là 1 danh sách kiểu SinhVien, HopDong, hoặc

Phong để đọc các thông tin của từng đối tượng trong danh sách từ các file

“.txt” và bỏ qua các ký tự ‘:’ có trong file.

- Sử dụng các hàm bool check_mssv(ListSV list,

HopDong hd) để kiểm tra xem có xảy ra trường hợp trùng mã số sinh

viên hay không!

bool check_mssv(ListSV list, HopDong hd)

{

for (DataSV* i = list.head; i; i = i->next)

if (hd.get_maSV() == i->data.get_id())

return false;

return true;

}



- Sử dụng các hàm bool check_phong(ListPhong list, HopDong

hd) để kiểm tra xem phòng cần tìm đến đã đủ người hay chưa.

bool check_phong(ListPhong list, HopDong hd)

{

DataPhong* p = SearchNode(list, hd.get_maPhong());

if (p->data.get_tinhTrang() < 8) return true;

else return false;

}



- Sử dụng các hàm bool check_phong(ListPhong list, HopDong hd,

SinhVien sv) để kiểm tra xem phòng cần tìm đến là phòng nam hay phòng

nữ.

bool check_phong(ListPhong list, HopDong hd, SinhVien sv)

{

DataPhong* p = SearchNode(list, hd.get_maPhong());

if (p->data.get_loaiPhong() != sv.get_GioiTinh()) return

false;

else return true;

}



9



Trịnh Minh An – Lớp 14T2

Bùi Văn Thảo – Lớp 14T2



ĐỒ ÁN GIẢI THUẬT VÀ LẬP TRÌNH – QUẢN LÝ KÝ TÚC XÁ



GVHD : Phan Thanh Tao



- Sử dụng hàm void ThemHopDong(ListSV& l_sv,

ListHD& l_hd, ListPhong& l_p) để thêm mới 1 phần tử mới vào

danh sách. Hàm này được ràng buộc trong quá trình nhập dữ liệu bởi các

điều kiện là:

 Ngày kết thúc hợp đồng phải là sau ngày hiện tại.

 Mã số sinh viên phải chưa được đăng ký.

 Kiểm tra phòng là loại phòng nam hay nữ và đã đầy hay còn

trống.

Nếu vi phạm các điều kiện này trong quá trình nhập thì chương trình sẽ xuất

thông báo và yêu cầu nhập lại. Sau khi thực hiện thao tác thêm hợp đồng thì

mã hợp đồng tự tăng lên 1, số lượng MIN tăng lên 1, các thông tin sẽ được

cập nhật vào các danh sách.

- Hàm void Thong_Ke(ListSV l_sv, ListHD l_hd,

ListPhong l_p) sử dụng các hàm ShowNext() để thống kê danh sách

hợp đồng, danh sách sinh viên, danh sách phòng theo dạng liệt kê.

- Hàm void Tra_Phong(ListSV& l_sv, ListHD& l_hd,

ListPhong& l_p) gồm có hai thao tác đó là trả phòng bằng mã số hợp

đồng hoặc trả phòng bằng mã số sinh viên. Với điều kiện ràng buộc là:

 Mã số hợp đồng và mã số sinh viên phải đã tồn tại trong danh

sách.

Sau khi thực hiện thao tác trả phòng thì các phần tử SinhVien và

HopDong sẽ bị xóa khỏi danh sách, còn tại danh sách Phong sẽ update

các giá trị số lượng Min(số lượng sinh viên hiện tại)

- Hàm void Chuyen_Phong(ListSV l_sv, ListHD&

l_hd, ListPhong& l_p) để chuyển phòng cho sinh viên bằng việc thay

đổi các thuộc tính các lớp tương ứng. Với điều kiện ràng buộc là:

 Mã số sinh viên phải tồn tại trong danh sách.

 Mã số phòng phải tồn tại, phải khác với mã số phòng hiện tại

sinh viên đang ở và phải nằm trong danh sách phòng còn trống.

Sau khi gọi hàm Chuyen_Phong thì sẽ thay đổi giá trị số lượng MIN

của các phòng tương ứng(+1 hoặc là -1) và thc tính mã phòng trong

HopDong cũng sẽ thay đổi thành phòng mới



10



Trịnh Minh An – Lớp 14T2

Bùi Văn Thảo – Lớp 14T2



ĐỒ ÁN GIẢI THUẬT VÀ LẬP TRÌNH – QUẢN LÝ KÝ TÚC XÁ



GVHD : Phan Thanh Tao



- Hàm void Gia_Han(ListSV l_sv, ListHD& l_hd,

ListPhong l_p) gồm hai thao tác đó là gia hạn phòng theo

mã số hợp đồng hoặc theo mã số sinh viên. Với điều kiện

ràng buộc là:

 Mã số hợp đồng và mã số sinh viên phải tồn tại

trong danh sách.

- Hàm void SearchFull(ListSV l_sv, ListHD l_hd,

ListPhong l_p) sử dụng các hàm .find(string s) để tìm các từ khóa

tương ứng trong các tất cả các thuộc tính của tất cả các phần tử trong cả 3

danh sách.

- Hàm void Tim_Kiem(ListSV l_sv, ListHD l_hd,

ListPhong l_p) để tìm kiếm thơng tin sinh viên, thơng tin hợp đồng,

thơng tin phòng và thơng tin chung đã có. Với điều kiện ràng buộc:

 Mã số sinh viên, tên sinh viên, mã số hợp đồng và số lượng

sinh viên phải có trong danh sách

 Mã số phòng và khu vực phòng phải nằm trong phạm vi quy

định.

- Hàm void Menu() để hiện thị trang chủ chính của chương trình

bao gồm các thao tác: Đăng ký hợp đồng mới, tình trạng phòng KTX, thống

kê KTX, trả phòng, chuyển phòng, gia hạn phòng, tìm kiếm, thốt chương

trình và lưu dữ liệu.

- Các hàm sẽ được biên dịch và thực thi khi được hàm main gọi.



3. Chương trình

Bài tốn được cài đặt bằng ngơn ngữ lập trình hướng đối tượng C++

quen thuộc và cơ bản với phần lớn sinh viên Cơng nghệ thơng tin nói riêng

và sinh viên ngành Kỹ thuật nói chung. Sử dụng phần mềm Visual Studio

2015 của Microsoft cung cấp để biên dịch và thực thi.

Do đề tài đồ án chỉ yêu cầu thực hiện những yêu cầu cơ bản của một

phần mềm và lượng kiến thức đã tích lũy hiện tại, bài tốn được thực hiện

trên cửa sổ console quen thuộc của Window (Giao diện gần giống MS-DOS

trực quan). Giao diện được hiển thị theo từng dòng chức năng và được người

dùng lựa chọn bằng việc nhập vào thứ tự yêu cầu thông qua hàm switch …

case.

Khi chương trình khởi chạy thì hàm main() sẽ lần lượt gọi các hàm

khởi tạo các đối tượng thuộc lớp, các danh sách. Đồng thời chương trình sẽ

gọi các hàm ReadFile() để đọc dữ liệu từ các file .txt có sẵn được lưu trong



11



Trịnh Minh An – Lớp 14T2

Bùi Văn Thảo – Lớp 14T2



ĐỒ ÁN GIẢI THUẬT VÀ LẬP TRÌNH – QUẢN LÝ KÝ TÚC XÁ



GVHD : Phan Thanh Tao



thư mục chứa chương trình. Sau đó sẽ thực hiện các chức năng của chương

trình theo Menu tương ứng.

Hàm main()

int main()

{

ListSV l_sv;

ListHD l_hd;

ListPhong l_p;

CreatList(l_sv);

CreatList(l_hd);

CreatList(l_p);

ReadFile(l_sv);

ReadFile(l_hd);

ReadFile(l_p);

while (1)

{

int mn;

do {

Menu();

cin >> mn ;

switch (mn)

{

case 1:

system("cls");

ThemHopDong(l_sv, l_hd, l_p);

system("pause");

system("cls");

break;

case 2:

system("cls");

ShowPhong(l_p);

system("pause");

system("cls");

break;

case 3:

Thong_Ke(l_sv,l_hd,l_p);

break;

case 4:

Tra_Phong(l_sv, l_hd, l_p);

break;

case 5:

Chuyen_Phong(l_sv, l_hd, l_p);

system("cls");

break;

case 6:

Gia_Han(l_sv, l_hd, l_p);

break;

case 7:

Tim_Kiem(l_sv,l_hd, l_p);

system("cls");

break;

case 8:

SaveData(l_hd);

SaveData(l_p);

SaveData(l_sv);

return 0;



12



Trịnh Minh An – Lớp 14T2

Bùi Văn Thảo – Lớp 14T2



ĐỒ ÁN GIẢI THUẬT VÀ LẬP TRÌNH – QUẢN LÝ KÝ TÚC XÁ



GVHD : Phan Thanh Tao



default:

break;

}

} while (mn!='0');



}



13



system("pause");

}

return 0;



Trịnh Minh An – Lớp 14T2

Bùi Văn Thảo – Lớp 14T2



ĐỒ ÁN GIẢI THUẬT VÀ LẬP TRÌNH – QUẢN LÝ KÝ TÚC XÁ



GVHD : Phan Thanh Tao



 Giao diện khởi chạy chương trình:



Khi người dùng lựa chọn các chức năng theo số thứ tự, giao diện phần mềm

sẽ thay đổi tùy theo lựa chọn được nhập vào và thực hiện các chức năng tương

ứng. Dưới đây nhóm chúng em chỉ trình bày một số chức năng cơ bản của phần

mềm, những chức năng khác và chức năng tương tự sẽ được thể hiện khi sử dụng

chương trình.

Dữ liệu được nạp vào chương trình thơng qua 2 cách là đọc từ file có sẵn và

nhập trực tiếp từ bàn phím.Việc đọc từ file có sẵn được tự động thực thi khi

chương trình bắt đầu thực thi ngay từ đầu bằng hàm ReadFile().

void ReadFile(ListSV& list)

{

fstream myfile("DataSinhVien.txt");

string s;

if (myfile.is_open()) {

while (myfile.eof() == false)

{

SinhVien sv;

Date d;

getline(myfile, s, ':');

sv.set_id(atoi(s.c_str()));

getline(myfile, s, ':');

sv.set_Ten(s);

getline(myfile, s, ':');

atoi(s.c_str()) ? sv.set_GioiTinh(true) :

sv.set_GioiTinh(false);

getline(myfile, s, ':');

d.set_day(atoi(s.c_str()));

getline(myfile, s, ':');

d.set_month(atoi(s.c_str()));

getline(myfile, s, ':');

d.set_year(atoi(s.c_str()));

sv.set_NgaySinh(d);

getline(myfile, s, ':');

sv.set_Lop(s);

getline(myfile, s);

sv.set_Khoa(s);



14



Trịnh Minh An – Lớp 14T2

Bùi Văn Thảo – Lớp 14T2



ĐỒ ÁN GIẢI THUẬT VÀ LẬP TRÌNH – QUẢN LÝ KÝ TÚC XÁ



}

else {

}



GVHD : Phan Thanh Tao



AddTail(list, CreateNode(sv));

}

myfile.close();

cout << "file not found!!!\n";



}



Hoặc là nhập dữ liệu từ bàn phím giao diện đăng ký hợp đồng mới:



 Đây là giao diện khi quá trình nhập liệu khi khơng thỏa mãn các điều

kiện ràng buộc và yêu cầu nhập lại.



15



Trịnh Minh An – Lớp 14T2

Bùi Văn Thảo – Lớp 14T2



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Cấu trúc dữ liệu

Tải bản đầy đủ ngay(0 tr)

×