Danh sách liên kết là danh sách mà phần tử (Node) liên kết với nhau nhờ vào vùng liên kết của chúng. Mỗi Node bao gồm 2 phần: Phần Data dung để chứa dữ liệu cần xử lý và phần liên kết dùng để liên kết với node khác.
Trang 1KHOA CÔNG NGHỆ THÔNG TIN
BÀI TẬP LỚN MÔN CÔNG NGHỆ PHẦN MỀN
TÊN ĐỀ TÀI:
QUẢN LÝ MÔN HỌC VÀ ĐĂNG KÝ MÔN DẠY HỌC
CHO GIÁO VIÊN
Sinh viên thực hiện:
Nguyễn Thị Thu Sương MSSV:DH51201926
Trang 3Em xin gửi lời cảm ơn đến quý thầy cô trong khoa Công Nghệ Thông tin của trường Đại Học Công Nghệ Sài Gòn (STU) đã giúp đỡ cũng như đã tận tình truyền dạy những kiến thức để em có thể thực hiện bai tậ lớn môn công nghệ phần mền này.
Và em xin gửi lời cảm ơn đến cô Lê Thị Kim Dung và Thầy Nguyễn Trung Trực đã tận tình giúp đỡ để em có thể hoàn thành bài tập lớn này Cũng như có cơ hội
áp dụng được những gì mình đã học vào thực tế
LỜI CẢM ƠN
Trang 4PHẦN MỞ ĐẦU
1. Lý do đề tài:
Là sinh viên đang học nghành công nghệ thông tin Việc ứng dụng những kiên thức đã học để tạo ra một chương trình chạy được trong thực tế là vô cùng quan trọng Để cũng cố kiến thức và nhằm áp dụng những kiến thức đã học vào thực
tế nên em đã chọn đề tài quản lý môn học và đăng ký môn học cho giáo viên làm bài tập lớp
- Lý thuyết về danh sách liên kết đơn
- Bài toán quản lý đăng ký môn học
4. Phương pháp nghiên cứu:
- Nghiên cứu từ tài liệu cấu trúc dữ liệu và giải thuật trên sách
- Tìm kiếm và nghiên cứu trên Internet
Trang 5CHƯƠNG 1:CƠ SỞ LÝ THUYẾT
1. Tổng quan về danh sách liên kết.
Trong đó:
Data :thường chứa nội dung thông tin của phần tử
Next: chứa địa chỉ của node tiếp theo hay còn gọi là vùng liên kết
Trang 6Hình 1.1 Danh sách liên kết.
1.2.2.Thao tác trên Node:
- Khai báo biến con trỏ p là biến con trỏ kiểu Node:Node * p
- Cấp phát vùng nhớ mới cho Node- được trỏ bởi p: p= new Node
- Truy cập vào trường Data: p-> data
- Truy cập vào trường trỏ bởi Next: p-> next
- Hủy Node bởi con trỏ p: delete (p)
1.2.3.Các thao tác trên danh sách liên kết:
Thao tác trên danh sách liên kết khác với thao tác trên mảng, khi cần thêm node vào danh sách liên kết ta cần xin cấp phát vùng nhớ cho Node và nối node đó vào danh sách và khi không sử dụng thì ta giải phóng nó khỏi danh sách Truy cập trên danh sách cũng khác so với mảng Nếu ở mảng ta truy cập trực tiếp thông qua chỉ số mảng (thông qua địa chỉ ô nhớ) thì ở danh sách liên kết ta phải truy cập một cách tuần tự Khi làm việc trên danh sách liên kết đơn cũng tuần tự như vậy nên ta cần chú ý những điểm sau:
- Danh sách luôn có con trỏ đầu danh sách: con trỏ plist
- Danh sách luôn có giá trị báo kết thúc danh sách: NULL
- Trường next của mỗi node chỉ chứa địa chỉ của node sau nó, trừ node
cuối
- Trường next của node cuối cùng phải chứa giá trị NULL
- Không tách danh sách thành 2 danh sách con nếu danh sách phần sau chưa có con trỏ tới
- khởi tạo danh sách bằng rỗng: plist = NULL
1.3.3.1 Duyệt danh sách liên kết đơn:
Duyệt lần lượt từng Node trong danh sách:
Mục_đích (Node & plist ){
Node p = plist ; // cho con trỏ p vào đầu danh sáchWhile (điều kiện dừng)
{[xử lý p-> dat];// xuất ra màng hình, thực hiện các phép toán
p=p-> next;// cho con trỏ chỉ tới phần tử kế tiếp
Trang 71.3.3.2 Chèn một phần tử vào danh sách:
Để chèn một phần tử vào X danh sách ta cấp phát vùng nhớ cho
1 Node mới được trỏ bởi q và gán giá trị X cho trường Data;
Node q;
q= new Node;
q-> data= X;
chèn một node mới vào danh sách có 4 trường hợp:
Trường hợp 1:chèn Node q vào đầu danh sách:
Bước 1: cho vùng liên kết của q chứa địa Node đầu danh sách
q-> next = plist;(1)Bước 2: cho plist trỏ tới q: cập nhật lại con trỏ danh sách đâu
Trang 8Bước 2: cho vùng liên kết của Node được trỏ bỏi q chứa địa chỉ của Node được trỏ bởi p.
p-> next = q; (2)
Hình 1.3: Chèn node vào sau 1 node bất kỳ
Trường hợp 3: chèn Node được trỏ bởi q vào cuối danh sách.
Bước 1: nếu danh sách rỗng thì danh sách hiện tại có 1 phần tủ chính là q vừa mới chèn vào, return
Bước 2: ngược lại nếu danh sách không rỗng:
• Cho con trỏ p chứa địa chỉ Node đầu danh sách
Node p = list;
• Duyệt danh sách từ đầu tới cuối
While ( p-> next !- NULL) p= p-> next;
• Cho phần tử liên kết của Node được trỏ p chứa địa chỉ của q
Bước 1: cho con trỏ đầu danh sách plist trỏ vào node sau nó
p = p-> next
Bước 2: giải phóng node p ra khỏi danh sách
Delete (p);
Trang 9Hình 1.4: xóa đầu danh sách.
Trường hợp 2: con trỏ p chứa địa chỉ Node bất kỳ nhưng không phải Node đầu.
Bước 1: cho con trỏ q trỏ đầu danh sách plist,dùng vòng lập cho nó trỏ tới địa chỉ node trước node được trỏ bởi p trong dan sách
Node q = plist ; while (q-> next != p) q = q-> next; (1)Bước 2: gán địa chỉ của Node ngay sau Node được trỏ bởi p vào ô nhớ next của node được trỏ bởi q
q-> next = p-> next; (2)Bước 3: giải phóng Node được trỏ bởi p
Delete (p);
Hình 1.5: xóa 1 node bất kỳ trong danh sách
1.3.3.4 Tìm kiếm phần tử trong danh sách.
Bước 1:cho p trỏ vào đầu danh sách plist
Trang 10Node p = plist;
Bước 2: thực hiện vòng lập để duyệt p chạy từ đầu danh sách tới cuối danh sách, tại mỗi node nếu trường data của node được trỏ bởi p = X thì trả về Node p và dừng vong lập Ngược lại nếu p != X thì cho p trỏ tới Node kế tiếp
while ((p!=NULL) && strcmp(p->info._maGV,x._maGV)!=0)
p=p->next;
Hình 1.6: tim kiếm một node trong danh sách
CHƯƠNG 2: CÁC NGHIỆP VỤ CỦA VIỆC QUẢN LÝ MÔN HỌC VÀ ĐĂNG
KÝ MÔN DẠY CỦA GIÁO VIÊN 2.1 Đặc tả bài toán:
Quản lý môn hoc và việc đăng ký môn dạy của các giáo viên trong một trường học gồm:
Thông tin giáo viên: mã giáo viên, tên giáo viên, môn học đăng ký
Thông tin môn học có trong trường: tên môn hoc, mã môn học…
Những thông tin trên cần chính xác và rõ ràng và nhanh chóng, mà công việc làm thủ công thì phức tạp và tốn nhiều công sức và thời gian Chính vì lý do trên nên bài toán
Trang 11quản quản lý môn học và đăng ký môn dạy của giáo viên đã ra đời để thực hiện
những công việc trên 1 cách nhanh chóng và thuận tiện
2.2 Yêu cầu hệ thống:
Thông tin của một giáo viên dạy ở trung tâm gồm: Mã giáo viên, tên giáo viên, địachỉ Một giáo viên có 1 danh sách các môn đăng ký dạy Biết rằng thông tin của một môn học như sau:
Hãy sử dụng danh sách liên kết đơn có cấu trúc lồng nhau để tổ chức dữ liệu cho bài toán trên và thực hiện các yêu
cầu sau:
- Nhập 1 danh sách giáo viên và danh sách các môn học mà giáo viên đăng ký dạy
- Cho phép thêm, xóa, sửa giáo viên
- Cho phép tìm giáo viên khi biết mã số môn học hay tên môn học
- Khi biết mã giáo viên ta có thể thêm 1 môn học mới mà giáo viên đó đăng ký
CHƯƠNG 3: PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG QUẢN LÝ MÔN
HỌC VÀ ĐĂNG KÝ MÔN HỌC CỦAGIÁO VIÊN.
1. Lược đồ quan hệ thực thể trong chương trình:
2. Thiết kế cơ sở dữ liệu:
2.1. Các thuộc tính của đối tượng:
Môn học:
Mã môn học: m_maMH
Môn học
Trang 12Tên môn học: m_tenMH.
Giáo Viên:
Mã giáo viên: _maGV
Tên giáo viên: _tenGV
địa chỉ: _diachi
Danh sách môn học mà giáo viên đăng ký:
#Mã môn hoc m_maMH
2.2. Từ diễn tả dữ liệu cho các thực thể:
- Môn học: các thông tin chứa môn học của trường học bao gồm: Mã môn học, tên môn học
- Giáo viên: các thông tin giáo viên gồm: Mã giáo viên, tên giáo viên, địa chỉ, danh sách môn học mà giáo viên đăng ký dạy Giáo viên chỉ đăng ký những môn học mà nhà trường có
2.3. Lược đồ quan hệ:
Quy ước gạch dưới là khóa chính, thêm # phía trước là khóa ngoại
Ví dụ:
m_maMH : là khóa chính
#_maGV: là khóa ngoại
Ta có lược đồ quan hệ như sau:
Môn học (m_maMH, m_tenMH)
Giáo viên: ( _mGV ,_tenGV, _diachi, m_maMH)
3. Cơ sở dữ liệu:
3.1. Danh sách các bảng:
Môn học:
STT Thuộc tính Kiểu Mặc định Ràng buộc Chương trình
1 m_maMH Char [10] Khóa chính Mã môn học
2 m_tenMH Chả [10] N Tên môn học
Giáo Viên
buộc Chương trình
Trang 131 _maGV Char [10] Khóa
chính Mã giáo viên
2 _tenGV Char [50] Tên giáo viên
3 _diachi Char [50] địa chỉ giáo viên
Trang 14CHƯƠNG 4: THỰC HIỆN VÀ ƯU KHUYẾT ĐIỂM
Trang 15Môn học:
- Nhập danh sách môn học (thêm 1 môn học vào danh sách môn học của nhà trường):
+ Nhập thông tin môn học gồm mã môn học và tên môn học
- Hiển thị thông tin môn học:
+ Duyệt danh sách môn học
+ In ra tất cả môn học mà nhà trường có dạy
- Xóa môn học mà của nhà trường:
+ Nhập mã môn học cần xóa
+ Duyệt hết danh sách môn học
+Nếu có môn học thì xóa môn học ngược lại xuất không có môn học này
- Tìm môn học trong danh sách môn học của nhà trường:
+ Nhập mã môn học cần tìm
+ Duyệt hết danh sách mmoon học
+ Nếu có thì xuất ra tìm thấy môn học ngược lại xuất ra không có môn học này
Giáo viên:
- Nhập thông tin giáo viên (thêm 1 giáo viên vào danh sách):
+ Nhập thông tin của giáo viên gồm: mã giáo viên, tên giáo viên, địa chỉ
- Xuất danh sách giáo viên và tất cả môn học mà giáo viên đó đăng ký: + Duyệt danh sách giáo viên
+ In ra danh sách giáo viên.
+ Duyệt danh sách môn học mà giá viên đó đăng ký.
+ In ra danh sách mà giáo viên đó đăng ký ( nếu có).
- Thêm một môn học mà giáo viên đó đăng ký:
+ Nhập mã môn học mà giá viên muốn đăng ký.
+ Duyệt danh sách môn học của nhà trường.
+ nếu có mã môn học trong danh sách môn học nhà trường thì thêm vào
danh sách môn học mà giáo viên đăng ký Ngược lại xuất ra không có môn này trong trường
+ Nếu bạn muốn đăng ký thêm thì nhấn 1 Ngược lại ấn 0
- Tìm giáo viên:
+ Nhập mã giáo viên cần tìm.
+ Duyệt danh sách giáo viên.
+ Trả về node giáo viên nếu tìm thấy.
- Xóa 1 giáo viên:
+ Nhập mã giáo viên.
+ Tìm giáo viên.
+ Nếu tìm thấy thì xóa giáo viên đó ra khỏi danh sách Ngược lại xuất ra
không có giáo viên này
- Tìm tất cả giáo viên khi nhập mã môn học.:
+ Nhập mã môn học.
Trang 16+ Duyệt danh sách giáo viên.
+ Duyệt danh sách môn học mà giáo viên đó đăng ký.
+ Nếu tìm thấy thì xuất thông tin giáo viên đó.
- Tìm môn học khi biết mã giá viên:
+ Nhập mã giáo viên
+ Duyệt danh sách giáo viên.
+ Duyệt danh sách môn học mà giáo viên đó đăng ký.
+ Nếu tìm thấy thì xuất thông tin môn học đó.
- Sữa thông tin giáo viên:
+ Tìm mã môn học trong danh sách môn học mà giáo viên đăng ký.
+ Nếu có thì xóa môn học đó khỏi danh sách môn học mà giáo viên đó đăng
ký.Ngược lại xuất ra không có môn học trong danh sách
2. Cài đặt chương trình:
2.1.Định nghĩa cấu trúc chương trình quản lý môn học và đăng ký môn học cho giáo viên:
void Khoi_tao_MH (NODEPTR_MH &pHead);
int KiemTra_rong_MH (NODEPTR_MH &plist);
NODEPTR_MH taonut_MH (MonHoc x);
void them_cuoi_MH (NODEPTR_MH &plist, MonHoc x);
void xoadau_MH (NODEPTR_MH & plist);
bool xoaMH_X(NODEPTR_MH & plist,MonHoc x);
NODEPTR_MH tim_MH ( NODEPTR_MH & plist, MonHoc x);
void them_monhoc (NODEPTR_MH &plist);
void xuat_MH (NODEPTR_MH plist);
void Khoi_tao_GV (NODEPTR_GV &pHead);
int kiemtra_rong_GV (NODEPTR_GV &plist);
NODEPTR_GV creatednode_GV (GiaoVien x);
void insert_last_GV (NODEPTR_GV &plist, GiaoVien x);
void xoadau_GV (NODEPTR_GV & plist);
bool xoaGV_X(NODEPTR_GV & plist,GiaoVien x);
void them_thongtin_GV (NODEPTR_GV &plist, NODEPTR_MH DSMHHT);void xuat_danhsach_GV (NODEPTR_GV plist);
NODEPTR_GV tim_GV ( NODEPTR_GV & plist, GiaoVien x);
void xuat_giao_vien_khi_biet_maMH(char maMH [10],NODEPTR_GV plist);int xoa_MH_ma_GV_DangKy (NODEPTR_GV & plist, char maMH [10]);int them_monhoc_cho_giaovien ( NODEPTR_GV plist,NODEPTR_MH
DSMHHT,char magv[10]);
void menu ();
Trang 17void main();
2.2. Khởi tạo danh sách môn học của nhà trường:
void Khoi_tao_MH (NODEPTR_MH &pHead)
2.3.Kiểm tra danh sách môn học có rỗng không:
int KiemTra_rong_MH (NODEPTR_MH &plist)
2.4.Tạo một Node môn học mới trong danh sách môn học của trường:
NODEPTR_MH taonut_MH (MonHoc x)
Trang 18void them_cuoi_MH (NODEPTR_MH &plist, MonHoc x)
2.6.Xóa một môn học ở đầu danh sách môn học của trường.
void xoadau_MH (NODEPTR_MH & plist)
{
NODEPTR_MH p;
if (!KiemTra_rong_MH(plist)){
p=plist;
plist = p->next;
delete p;
}}
Trang 19 Hàm xóa một môn học ở đầu danh sách sử dụng cấu trúc điều kiện rỗng hay không tạo một Node P kiểm tra rỗng gắn P là phần tử đầu tiên cho phần tử đầu tiên trỏ tới phần tử kế tiếp và xóa P.
2.7.Xóa một môn học bất ký trong danh sách môn học của trường.
bool xoaMH_X(NODEPTR_MH & plist,MonHoc x)
q->next=p->next;
delete p;
return true;
}}
return false;
}
Trang 20 Hàm xóa một Node bất kỳ trong danh sách sử dụng cấu trúc tuần tự và rẽ nhánh
và cấu trúc lập.Cho con trỏ P chứa phần tử muốn xóa Nếu P là phần tử đầu tiên thì gọi hàm xóa đầu Ngược lại dung cấu trúc lậpWHILE để duyệt tất cả các phần tử trong danh sách nếu thỏa điều kiện trong lập while thì chuyển qua phần
tử kế tiếp Ngược lại thì xóa phần tử P
2.8. Tìm một môn học mà trường học có dạy.
NODEPTR_MH tim_MH ( NODEPTR_MH & plist, MonHoc x)
2.9.Thêm một môn học( nhập danh sách môn học) vào danh sách môn học của trường.
void them_monhoc (NODEPTR_MH &plist)
Trang 21 Hàm nhập (thêm) một môn học vào danh sách môn hoc Sử dụng cấu trúc tuần
tự và cấu trúc điều kiện.Nhập thông tin môn học gồm mã môn học và tên môn học.Nếu môn học đã có trong danh sách thì không thể thêm vào nữa
2.10. Xuất danh sách môn học của nhà trường.
void xuat_MH (NODEPTR_MH plist)
{
NODEPTR_MH p=plist;
{
while (p !=NULL){
cout<<"ma mon hoc:"<< p->data.m_maMH<<endl;cout<<"ten mon hoc:"<< p->data.m_tenMH <<endl;
p = p->next ;}
}}
Hàm xuất danh sách môn học của nhà trường: sử dụng cấu trúc lập Xuất ra tất
cả các phần tử có trong danh sách môn học
2.11. Khởi tạo danh sách giáo viên:
void Khoi_tao_GV (NODEPTR_GV &pHead)
Trang 222.12. Kiểm tra danh sách giáo viên có rỗng không:
int kiemtra_rong_GV (NODEPTR_GV &plist)
{
return (plist ==NULL ?1:0);
} Hàm kiểm tra rỗng: Sử dụng cấu trúc rẽ nhánh Nếu danh sách rỗng trả về 1 ngược lại trả về 0
2.13. Tạo một Node giáo viên:
NODEPTR_GV creatednode_GV (GiaoVien x)
2.14. Chèn một Node giáo viên vào cuối danh sách giáo viên:
void insert_last_GV (NODEPTR_GV &plist, GiaoVien x)
Trang 232.15. Xóa một Node giáo viên ở đầu danh sách giáo viên:
void xoadau_GV (NODEPTR_GV & plist)
{
NODEPTR_GV p;
if (!kiemtra_rong_GV(plist)){
p=plist;
plist = p->next;
delete p;
}}
Hàm xóa một giáo viên ở đầu danh sách sử dụng cấu trúc điều kiện rỗng hay không tạo một Node P kiểm tra rỗng gắn P là phần tử đầu tiên cho phần tử đầu tiên trỏ tới phần tử kế tiếp và xóa P
2.16. Xóa một Node giáo viên bất kỳ trong danh sách giáo viên:
bool xoaGV_X(NODEPTR_GV & plist,GiaoVien x)
Trang 24delete p;
return true;
}}
return false;
}
Hàm xóa một Node bất kỳ trong danh sách sử dụng cấu trúc tuần tự và rẽ nhánh
và cấu trúc lập.Cho con trỏ P chứa phần tử muốn xóa Nếu P là phần tử đầu tiên thì gọi hàm xóa đầu Ngược lại dung cấu trúc lậpWHILE để duyệt tất cả các phần tử trong danh sách nếu thỏa điều kiện trong lập while thì chuyển qua phần
tử kế tiếp Ngược lại thì xóa phần tử P
2.17. Nhập (thêm) thông tin giáo viên vào trong danh sách giáo viên:
void them_thongtin_GV (NODEPTR_GV &plist, NODEPTR_MH DSMHHT){
GiaoVien x;
cout<<"nhap ma so Giao Vien:";
cin.ignore();
Trang 25 Hàm nhập (thêm) một giáo viên vào danh sách giáo viên Sử dụng cấu trúc tuần
tự và cấu trúc điều kiện.Nhập thông tin môn học gồm giáo viên gồm mã giáo
viên, tên giáo viên, địa chỉ
2.18. Xuất danh sách giáo viên và danh sách môn học mà giáo viên đăng ký:
void xuat_danhsach_GV (NODEPTR_GV plist)
{
NODEPTR_GV p=plist;
{
while (p !=NULL){
cout<<"\n -";
cout<<"\nma Giao Vien:"<<p->info._maGV<<endl;
cout<<"ten Giao Vien:"<<p->info._tenGV<<endl;
cout<<"dia chi:"<<p->info._diachi<<endl;
cout<<"danh sach mon hoc"<<endl;
xuat_MH (p->info.Danhsach_MH);
p = p->next ;}
}
}
Trang 26 Hàm xuất danh sách giáo viên của nhà trường: sử dụng cấu trúc lập Xuất ra tất
cả các phần tử có trong danh sách giáo viên
2.20. Xuất giáo viên khi biết mã môn hoc:
void xuat_giao_vien_khi_biet_maMH(char maMH [10],NODEPTR_GV plist){
if ( strcmp ( q->data.m_maMH,maMH)==0)
{
cout<<"ma giao vien:"<<p->info._maGV<<endl;cout<<"ten giao vien:"<<p->info._tenGV<<endl;cout<<"dia chi giao vien:"<<p->info._diachi<<endl;