Báo cáo bài tập lớn cấu trúc dữ liệu và giải thuật đề tài lecturer management tree Báo cáo bài tập lớn cấu trúc dữ liệu và giải thuật đề tài lecturer management tree Báo cáo bài tập lớn cấu trúc dữ liệu và giải thuật đề tài lecturer management tree
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
KHOA ĐIỆN TỬ VIỄN THÔNG
BÁO CÁO BÀI TẬP LỚN
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
Đề tài:
Lecturer Management Tree
Giảng viên hướng dẫn : Trần Thị Thanh Hải
Thành viên nhóm : Nguyễn Thắng Đạt 20192748
: Nguyễn Thành Hiếu 20192847
Hà Nội, năm 2022
Trang 2MỤC LỤC
NỘI DUNG
I Giới thiệu chung
I.1 Chủ đề
I.2 Phân chia nhiệm vụ
II Cơ sở dữ liệu
II.1 Thiết kế cơ bản
II.2 Code
III Kết luận
************************************
Trang 3CHƯƠNG 1 GIỚI THIỆU CHUNG
1.1 GIỚI THIỆU VỀ CHỦ ĐỀ
Đề tài chúng em chọn là “ Lecturer Management Tree”
Lí do để chúng em chọn đề tài này là vì em thấy đề tài này
được áp dụng rất nhiều trong thực thế, có thể đã được nhiều
trường trong nước và thế giới sử dụng, có tiềm năng nghiên
cứu và phát triển rất lớn ạ!
1.2 PHÂN CHIA NHIỆM VỤ TRONG NHÓM
Nguyễn Thành Hiếu Hầu hết code
Nguyễn Thắng Đạt Khởi tạo cây, khởi tạo class uniTree
(phần đầu), làm báo cáo
Trang 4CHƯƠNG 2 CƠ SỞ DỮ LIỆU
2.1 THIẾT KẾ CƠ BẢN
Đây là một chương trình quản lý giáo viên đơn giản thể hiện một vài chức năng như:
Tìm kiếm giáo viên trong trường
Quan hệ cấp trên – cấp dưới giữa hai giáo viên trong trường
2.2 CODE
#define WINDOWS
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<string>
using namespace std;
struct node
{
char name[50];
int age,x; // x - do cao cua cay
bool g; // gioi tinh
char position[50];
node* fc; // Pointer cua con dau
node* ns; // Pointer cua anh em ben canh
node();
void getData();
};
Trang 5{
fc=ns=NULL;
g=0;
strcpy(name,"");
strcpy(position,"");
age=x=0;
}
void node::getData()
{
char ch;
fflush(stdin);
cout<<"\nTen: ";
gets(name);
cout<<"Tuoi cua "<<name<<": ";
cin>>age;
fflush(stdin);
cout<<"\nTen vi tri: ";
gets(position);
cout<<name<<" la (m/f): ";
cin>>ch;
if(ch=='m')
g=1;
}
class uniTree
{
public:
node* start;
uniTree();
node* traverseDown(node*,char[]); // ham t́m kiem node* traverseRight(node*,char[]);
Trang 6node* search(char[]);
void addSib(node*,node*); // ham them thanh vien moi void addChild(node*,node*);
void addNew();
void find(); // ham tim quan he
void show(node*); // ham hien thong tin nguoi void display(node*); // Ham hien thi cay
void destroy(node*); // Xoa cay
void updateX(node*,int); // Cap nhat
};
uniTree::uniTree()
{
start = NULL;
}
void uniTree::destroy(node* ptr)
{
node* temp = ptr;
if(ptr==NULL)
return;
while(ptr!=NULL)
{
destroy(ptr->fc);
temp = ptr;
ptr = ptr->ns;
delete temp;
}
start = NULL;
}
Trang 7void uniTree::show(node* ptr)
{
char g[10];
strcpy(g,"Female");
if(ptr->g)
strcpy(g,"Male");
cout<<"\n\nTen: "<< ptr->name <<endl;
cout<<"Tuoi: "<< ptr->age <<endl;
cout<<"Vi tri cong viec "<< ptr->position <<endl; cout<<"Gioi tinh: "<<g<<endl;
}
void uniTree::display(node* ptr)
{
// Hien thi cay
if(ptr==NULL)
return;
while(ptr!=NULL)
{
cout<< ptr->name <<endl;
display(ptr->fc);
ptr = ptr->ns;
}
}
void uniTree::updateX(node* ptr,int x)
{
// Cap nhat thong tin cua cay
if(ptr==NULL)
return;
while(ptr!=NULL)
{
updateX(ptr->fc,x++);
Trang 8if(ptr->ns!=NULL)
ptr->ns->x = x;
ptr = ptr->ns;
}
}
node* uniTree::traverseRight(node* ptr, char s[50]) {
// Tim o cac anh em
ptr = ptr->ns;
while(ptr!=NULL)
{
if(strcmp(ptr->name,s)==0)
return ptr;
else if (traverseDown(ptr,s)!=NULL)
return traverseDown(ptr,s);
else
ptr = ptr->ns;
}
return NULL;
}
node* uniTree::traverseDown(node* ptr, char s[50]) {
// tim o nut con
ptr = ptr->fc;
while(ptr!=NULL)
{
if( strcmp(ptr->name,s)==0 )
return ptr;
else if(traverseRight(ptr,s)!=NULL)
return traverseRight(ptr,s);
else
ptr = ptr->fc;
Trang 9}
return NULL;
}
node* uniTree::search(char s[50])
{
/*
tim theo ten
con tro chi vao tên hien tai
*/
node *ptr = start;
if(strcmp(ptr->name,s)==0)
return ptr;
else if(traverseRight(start,s)!=NULL)
return traverseRight(start,s);
else if(traverseDown(start,s)!=NULL)
return traverseDown(start,s);
else
{
return NULL;
cout<<"***Not found***";
}
}
void uniTree::find()
{
/*
Co cung do cao: là dong nghiep hoac dong cap o nhanh khac Khac do cao = 1 - Sep hoac truong bo mon khac
Khac do cao = 2 - Sep cua sep
khac do cao >2 xa qua nen bo
*/
char name1[50],name2[50];
cout<<"Nhap ten hai nguoi:\n";
fflush(stdin);
Trang 10gets(name1);
fflush(stdin);
gets(name2);
node* ptr1 = search(name1);
node* ptr2 = search(name2);
node* ptr;
node* ptrk=ptr1;
node* ptrk1=ptr2;
switch(ptr1->x - ptr2->x)
{
case 0:
char s[50];
strcpy(s,"Dong nghiep");
ptr = ptr1;
while(ptr!=NULL)
{
if(ptr==ptr2)
{
cout<<endl<<name1<<" la "<<s<<" cua
"<<name2<<endl;
return;
}
ptr = ptr->ns;
}
ptr = ptr2;
while(ptr!=NULL)
{
if(ptr==ptr1)
{
cout<<endl<<name1<<" is "<<s<<" cua
"<<name2<<endl;
return;
}
ptr = ptr->ns;
}
Trang 11cout<<endl<<name1<<" va "<<name2<<" la nguoi dong cap";
break;
case 1:
char str3[50];
strcpy(str3,"Cap tren");
ptr2 = ptr2->fc;
while(ptr2!=NULL)
{
if(ptr2==ptr1)
{
cout<<endl<<name1<<" is "<<name2<<"'s "<<str3; return;
}
ptr2=ptr2->ns;
}
strcpy(str3,"Cap duoi cua dong nghiep");
cout<<endl<<name1<<" is "<<name2<<"'s "<<str3;
break;
case -1:
char str[10];
strcpy(str,"Cap Tren");
ptr = ptrk->fc;
while(ptr!=NULL)
{
if(ptr==ptrk1)
{
cout<<endl<<name1<<" la "<<str<<" cua "<<name2; return;
}
ptr=ptr->ns;
}
strcpy(str,"Dong nghiep cua sep");
cout<<endl<<name1<<" la "<<str<<name2;
break;
Trang 12case 2:
char str1[50];
strcpy(str1,"Cap duoi");
ptr2 = ptr2->fc->fc;
while(ptr2!=NULL)
{
if(ptr2==ptr1)
{
cout<<endl<<name1<<" la Sep "<<str1<<" cua
"<<name2;
return;
}
ptr2 = ptr2->ns;
}
break;
case -2:
char str2[50];
strcpy(str2,"Cap tren");
ptr1 = ptr1->fc->fc;
while(ptr1!=NULL)
{
if(ptr1==ptr2)
{
cout<<endl<<name1<<" la sep cua "<<str2<<" cua
"<<name2;
return;
}
ptr1 = ptr1->ns;
}
break;
default:
cout<<"Quan he xa qua (T _ T)";
break;
}
}
Trang 13void uniTree::addNew()
{
node* temp = new node;
temp->getData();
if(start == NULL)
{
start = temp;
temp->x=0;
}
else
{
cout<<"\nNhap mot ten co quan he: ";
char name[50];
fflush(stdin);
gets(name);
cout<<"\n1 Cap duoi\n2 Dong nghiep\n\n"<< temp->name <<"
la voi "<<name<<" : ";
int opt;
cin>>opt;
switch(opt)
{
case 1:
addChild(search(name),temp);
break;
case 2:
addSib(search(name),temp);
break;
}
}
cout<<"\nDa them thanh cong.\n";
Trang 14void uniTree::addSib(node* a,node* b)
{
// them b la nut anh chi cua a
while(a->ns!=NULL)
a=a->ns;
a->ns = b;
b->x = a->x;
}
void uniTree::addChild(node* a,node* b)
{
// b là nút con cua a
if(a->fc==NULL)
a->fc = b;
else
addSib(a->fc,b);
b->x = a->x+1;
}
void connect(uniTree *T1, uniTree *T2)
{
char name[50];
int opt;
int x;
cout<<"Ten nguoi duoc ket hop: ";
fflush(stdin);
gets(name);
cout<<T2->start->name<<" la cua "<<name<<"\n1 Cap duoi
2 Dong nghiep - ";
cin>>opt;
Trang 15node *ptr = T1->search(name);
switch(opt)
{
case 1:
T1->addChild(ptr,T2->start);
x = ptr->x + 1;
break;
case 2:
T1->addSib(ptr,T2->start);
x = ptr->x;
break;
}
T2->updateX(T2->start,x);
T2->destroy(T2->start);
cout<<"\nDa ket hop\n";
}
int main()
{
uniTree T[100];
int opt,n,n1,n2;
char c,name[50];
cout<<"\nNhap Truong so = ";
cin>>n;
while(1)
{
#ifdef WINDOWS
system("cls");
#endif
cout<<"\n\n\n\t Truong so = "<<n<<"\n\n\t1 Them nguoi moi\ n\t2 Tim quan he giua hai nguoi\n\t3 Tim kiem\n\t4 Huy\n\t5 Hien thi cay\n\t6 Thay doi truong\n\t7 Ket noi hai cay\n\t8 Thoat\n\n\ tBan chon = ";
cin>>opt;
cout<<endl;
switch(opt)
{
Trang 16default:
cout<<"Khong co chuc nang"; break;
case 1:
T[n].addNew();
break;
case 2:
T[n].find();
break;
case 3:
cout<<"Nhap ten nguoi can tim: "; fflush(stdin);
gets(name);
T[n].show(T[n].search(name)); break;
case 4:
T[n].destroy(T[n].start);
cout<<"Cay "<<n<<" Da huy"; break;
case 5:
T[n].display(T[n].start);
break;
case 6:
cout<<"Nhap truong so: ";
cin>>n;
break;
case 7:
cout<<"Ghep voi \n";
cin>>n2>>n1;
Trang 17connect(&T[n1],&T[n2]);
break;
case 8:
return 0;
}
cout<<"\n\nPress any key to continue ";
cin>>c;
}
}
CHƯƠNG 3 KẾT LUẬN
Phần mềm đạt một số mục tiêu nhất định tuy nhiên còn nhiều
khuyết điểm như tính năng hạn chế Gặp một vài lỗi trong quá trình chạy
Tuy nhiên những gì thu được từ sau bài tập lớn lần này giúp chúng
em tự tin hơn để tiếp tục đam mê trong ngành lập trình
Trang 18Chúng em rất mong nhận được sự quan tâm và góp ý từ phía cô! Chúng em xin chân thành cảm ơn!
TÀI LIỆU THAM KHẢO [1]
[2] https://www.youtube.com/watch?v=9zfpOe1Xs7Q&t=461s