You are on page 1of 18

TRƯỜ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


MỤ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.....................................................................................


************************************
CHƯƠ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
CHƯƠ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();
};
node::node()
{
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[]);
node* 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;
}
void 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++);
if(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;
}
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);
gets(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;
}
cout<<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;
case 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;
}
}
void 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";
}

void 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;
node *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)
{
default:
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;
connect(&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.
Chú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

You might also like