Đăng ký Đăng nhập
Trang chủ Quản lý môn học và đăng ký môn dạy học cho giáo viên...

Tài liệu Quản lý môn học và đăng ký môn dạy học cho giáo viên

.DOCX
51
384
69

Mô tả:

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.
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ SÀI GÒN KHOA 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 Tp.Hồ Chí Minh, tháng 1/2015 BÀI TẬP LỚN MÔN CNPM GVHD: Thầy Nguyễn Trung Trực Em 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 SVTH: Nguyễn Thị Thu Sương Trang 1 CẢM ƠN PHẦ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. 2. Mục tiêu đề tài: - Cũng cố kiến thức đã học về danh sách liên kết nói chung và danh sách liên kết đơn nói riêng từ đó suy ra danh sách liên kết đơn lồng. - Rèn luyện kỹ năng lập trình C++. - Ứng dụng lý thuyết đã học giải quyết bài toán cụ thể. 3. Phạm vi nghiên cứu. - 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. CHƯƠNG 1:CƠ SỞ LÝ THUYẾT 1. Tổng quan về danh sách liên kết. 1.1. Định nghĩa : 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. 1.2. Phân loại: Tùy cách liên kết giữa các phần tử, danh sách liên kết gồm có nhiều loại khác nhau: - Danh sách liên kết đơn: mỗi phần tử liên kết với 1 phần tử đứng sau nó - trong danh sách. Danh sách liên kết đôi/kép: mỗi phần tử liên kết với 1 phần tử đứng trước và - sau nó trong danh sách. Danh sách liên kết vòng: phần tử cuối danh sách liên kết với phần tử đầu danh sách. 2. Danh sách liên kết đơn: 1.2.1. Khái niệm: Danh sách liên kết đơn là một cấu trúc lưu trữ trong đó các phần tử của danh sách không cố định, các phần tử trong danh sách không thể truy cập trực tiếp. Muốn truy cập bất kỳ phần tử nào phải xuất phát từ phần tử đầu tiên. Mỗi Node trong phần tử có thể được biểu diễn như sau: Data Next 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. Cú pháp: Struct Node{ Kiểu_dữ_liệu Data; Node * Next; } Hì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ách While (đ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. } 1.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. plist = p;(2) Hình 1.2: Chèn đâu danh sách. Trường hợp 2: Chèn Node được trỏ bởi q vào sau Node trỏ p trong danh sách. Bước 1: cho vùng liên kết của Node được trỏ q chứa địa chỉ Node ngay sau Node được trỏ bởi p. q-> next = p -> next; (1) Bướ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 p-> next = q;  Cập nhật lại Node cuối cùng bây giờ chính nó q vừa mới tạo ra. q-> next = NULL; 1.3.3.3. Xóa một phần tử ra khỏi danh sách: có 2 trường hợp xảy ra: Trường hợp 1: thực hiện xóa đầu danh sách nếu p chứa địa chỉ node đầu danh sách (plist). 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); Hì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 Node 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 quả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, địa chỉ. 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: Môn học Đăng ký 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. Tên môn học: m_tenMH. Giáo Viên: Mã giáo viên: _maGV. Giáo Viên 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: ST Thuộc tính Kiểu Mặc định T 1 2 m_maMH m_tenMH Char [10] Chả [10] N Kiểu Mặc định Ràng buộc Chương trình Khóa chính Mã môn học. Tên môn học. Ràng Chương trình Giáo Viên ST Thuộc tính T 1 _maGV Char [10] buộc Khóa Mã giáo viên chính 2 3 _tenGV _diachi Char [50] Char [50] Tên giáo viên địa chỉ giáo viên 4 m_maMH Khóa Mã môn học ngoại Các ràng buộc nghiệp vụ: Giáo viên chỉ đăng ký môn học khi có môn học trong bảng môn học. CHƯƠNG 4: THỰC HIỆN VÀ ƯU KHUYẾT ĐIỂM 1. Chương trình và chức năng cụ thể: 1.1. Cấu trúc chương trình: 2.1.1 Danh sách môn học: struct MonHoc { char m_maMH[10]; char m_tenMH[50]; }; typedef struct Node_MH *NODEPTR_MH; struct Node_MH { MonHoc data; NODEPTR_MH next; }; 1.1.2. danh sách giáo viên: struct GiaoVien { char _maGV [10]; char _tenGV [50]; char _diachi [50]; NODEPTR_MH Danhsach_MH; }; typedef struct Node_GV *NODEPTR_GV; struct Node_GV { GiaoVien info; NODEPTR_GV next; }; 1.2. Các chức năng của chương trình: Mô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. - - - + 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: + Nhập mã giáo viên. + Tìm giáo viên. + Nếu tìm thấy nhập lại thông tin giáo viên. Ngược lại xuất ra không có giáo viên này. Xóa một môn học mà giáo viên đó đăng ký: + Nhập mã môn học. + 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 (); void 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) { pHead = NULL; }  Hàm khởi tạo: khởi tạo danh sách môn học của nhà trường rỗng chưa có phần tử nào. 2.3. Kiểm tra danh sách môn học có rỗng không: int KiemTra_rong_MH (NODEPTR_MH &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.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) { NODEPTR_MH p; p = new Node_MH; if (p!=NULL) p->data = x; p->next= NULL; return p; }  Hàm tạo 1 node môn học của nhà trường: theo cấu trúc tuần tự. Tạo con trỏ môn học P có phần thông tin là 1 moohc học. 2.5. Chèn cuối một môn học vào cuối danh sách môn học của trường. void them_cuoi_MH (NODEPTR_MH &plist, MonHoc x) { NODEPTR_MH p; p= taonut_MH (x); if (KiemTra_rong_MH(plist)==1) { plist= p; } else { NODEPTR_MH q=plist; while (q->next!=NULL) q=q->next; q->next=p; } }  Hàm thêm một môn học vào cuối danh sách dùng cấu trúc rẽ nhánh.Tạo một nút P chứa thông tin nhập vào. Nếu danh sách rỗng thì thêm P vào danh sách. ngược lại thêm P vào cuối danh sách môn học. 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; } }  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) { NODEPTR_MH p,q; if (strcmp(plist->data.m_maMH,x.m_maMH)==0) { xoadau_MH (plist); return true; } else { p=plist; q=plist; while ((p!=NULL) && (strcmp(p->data.m_maMH,x.m_maMH)!=0)) { q=p; p=p->next; } if (p!=NULL) { q->next=p->next; delete 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.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) { NODEPTR_MH p; p=plist; while ((p!=NULL) && strcmp(p->data.m_maMH,x.m_maMH)!=0) p=p->next; return p; }  Hàm tìm một môn học mà trường học có dạy sử dụng cấu trúc tuấn tự và cấu trúc lập. cho con trỏ P trỏ vào phần tử đầu tiên của danh sách. Duyệt tất cả phần tử trong danh sách môn học của trường học. So sánh mã môn học trong danh sách với mã môn học nhập vào nếu không trùng thì chuyển sang phần tử kế tiếp, Ngược lại trả về Node P. 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) { MonHoc x; cout<<"nhap ma so mon hoc:"; fflush(stdin); cin.getline(x.m_maMH,10); if(tim_MH(plist, x) != NULL) { cout<<"Mon Hoc Da Ton Tai Trong He Thong"; return; } cout<<"nhap ten mon hoc:"; cin.getline(x.m_tenMH,50); them_cuoi_MH(plist,x); }  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<data.m_tenMH <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) { pHead = NULL; }  Hàm khởi tạo: khởi tạo danh sách giáo của nhà trường rỗng chưa có phần tử nào.
- Xem thêm -

Tài liệu liên quan