Khái niệm về danh sách móc nối
Danh sách là tập hợp các nút (ô nhớ) không liền kề, có kiểu dữ liệu xác định và giữa chúng có liên lạc với nhau bởi con trỏ địa chỉ.
Số nút của danh sách gọi là chiều dài của danh sách. Một danh sách có chiều dài bằng 0 là một danh sách rỗng.
Danh sách móc nối kép là tập hợp các nút mà mỗi nút có 2 mối liên kết với 2 phần tử khác trong danh sách.
22 trang |
Chia sẻ: lvbuiluyen | Lượt xem: 2535 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Giới thiệu các thành phần chính của Chương trình quản lý sinh viên, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
MỤC LỤC
MỤC LỤC 01
PHẦN I: GIỚI THIỆU CHUNG 02
1. Khái niệm về danh sách móc nối 02
2. Các phép toán trên danh sách 02
3. Giới thiệu về chương trình quản lý sinh viên 02
PHẦN II: GIỚI THIỆU CÁC THÀNH PHẦN CHÍNH CỦA CHƯƠNG TRÌNH 03
1. Sơ đồ các lớp đối tượng 03
2. Mô tả các lớp đối tượng 04
PHẦN III: GIỚI THIỆU CÁC CHỨC NĂNG TRONG CHƯƠNG
TRÌNH 08
PHẦN IV: MÃ NGUỒN CHƯƠNG TRÌNH 09
PHẦN V: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN CHƯƠNG
TRÌNH 22
PHẦN 1: GIỚI THIỆU CHUNG
1.Khái niệm về danh sách móc nối
Danh sách là tập hợp các nút (ô nhớ) không liền kề, có kiểu dữ liệu xác định và giữa chúng có liên lạc với nhau bởi con trỏ địa chỉ.
Số nút của danh sách gọi là chiều dài của danh sách. Một danh sách có chiều dài bằng 0 là một danh sách rỗng.
Danh sách móc nối kép là tập hợp các nút mà mỗi nút có 2 mối liên kết với 2 phần tử khác trong danh sách.
Một nút trong danh sách móc nối kép có dạng:
RIGHT
INFO
LEFT
Trong đó:
LEFT: con trỏ trái: lưu trữ địa chỉ nút trước
RIGHT: con trỏ phải: Lưu trữ địa chỉ nút sau
Danh sách móc nối kép có dạng:
2.Các phép toán trên danh sách
Tạo mới một danh sách
Thêm 1 nút vào danh sách
Tìm kiếm 1 nút trong danh sách
Xóa 1 nút khỏi danh sách
Sắp xếp thứ tự các danh sách
Hủy danh sách
3.Giới thiệu về chương trình quản lý sinh viên
Chương trình giúp quản lý dữ liệu cũng như thông tin của sinh viên như: mã số sinh viên, họ tên, năm sinh, lớp, điểm trung bình….
Chương trình có các chức năng chình như:
Tạo 1 danh sách sinh viên
Thêm 1 sinh viên vào danh sách
Xóa 1 sinh viên
Tìm kiếm 1 sinh viên
Sắp xếp danh sách sinh viên
PHẦN II: GIỚI THIỆU CÁC THÀNH PHẦN CHÍNH CỦA CHƯƠNG TRÌNH
SƠ ĐỒ CÁC LỚP ĐỐI TƯỢNG
LIST
NODE
*first, *last
getnode
freenode
SINHVIEN info (đối tượng thành phần); * left, * right
Createlist
Nhaplist
Showlist
Listsize
Push_first
Push_last
Push_after
Search_name
Search_maso
Del_first
Del_last
Del_node_name
Del_node_maso
Clear_list
Sort_list_dtb
Ghi_file
Doc_file
SINHVIEN
Maso,hoten,namsinh,gioitinh,quequan,lop,dtb
Nhập
Hiện
LIST a (đttp)
MENU
Hien
Xuly
MÔ TẢ CÁC LỚP ĐỐI TƯỢNG
Lớp SV:
Thuộc tính:
Kiểu dữ liệu char:
maso: Mã số sinh viên
hoten: Họ và tên sinh viên
lop: Lớp sinh viên đang học
gioitinh: Giới tính sinh viên
quequan: Quê quán sinh viên
Kiểu dữ liệu int:
ns: Năm sinh
Kiểu dữ liệu float:
dtb: điểm trung bình
Phương thức:
Nhap: Hàm nhập 1 sinh viên
Hien: Hàm hiện sinh viên
Lớp NODE:
Thuộc tính:
Đối tượng thành phần:
Info: chứa thông tin sinh viên
*l: Con trỏ trái, trỏ tới nút đứng trước
*r: Con trỏ phải, trỏ tới nút đứng sau
Phương thức:
Getnode: Hàm cấp phát 1 nút mới cho danh sách móc nối
Thuật toán:
B1: Khởi tạo 1 nút mới , cấp phát bộ nhớ cho nút đó
B2: Nếu nút đó khác NULL
p->right=NULL;
p->left=NULL;
B3: Nhập dữ liệu info cho nút đó
Hàm trả về con trỏ trỏ tới địa chỉ nút mới tạo. Nếu không đủ bộ nhớ để tạo, hàm trả về giá trị NULL.
Freenode: Hàm giải phóng bộ nhớ nút vừa cấp phát
Lớp LINKLIST thừa kế từ lớp NODE
Thuộc tính kiểu NODE
*first: trỏ tới phần tử đầu danh sách
*last: trỏ tới phần tử cuối danh sách
Phương thức:
Createlist: Hàm khởi tạo 1 danh sách mới
Cho giá trị các con trỏ quản lý địa chỉ hai nút đầu và cuối danh sách móc nối kép về con trỏ NULL.
Nhaplist: Hàm nhập n sinh viên vào danh sách
Thuật toán:
B1: Nhập số lượng sinh viên cần nhập vào danh sách (n)
B2: Khởi tạo biến đếm i, i=0
B3: So sánh i với n. Nếu i B4, nếu i>=n -> B6
B4: Thêm 1 nút vào danh sách (push_last())
B5: Tăng i lên 1 -> Quay lại bước 2
B6: Kết thúc.
Showlist: Hàm hiện danh sách sinh viên
Thuật toán:
B1: Khởi tạo 1 con trỏ trỏ vào nút đầu tiên
B2: Nếu nút đó khác NULL->B3, ngược lại ->kết thúc
B3: Hiện nút đó
B4: Dịch con trỏ sang phải 1 nút->B2
Listsize: Hàm đếm số lượng nút trong danh sách
Thuật toán:
B1: Khởi tạo 1 con trỏ, biến đếm I (i=0)
B2: Cho con trỏ trỏ vào nút đầu tiên
B3: Nếu nút đó khác NULL ->B4, ngược lại->B6
B4: dịch con trỏ sang phải 1 nút
B5: Tăng i lên 1->B3
B6: Trả về i;
Push_first: Hàm thêm 1 nút vào đầu danh sách.
Thuật toán:
B1: Khởi tạo con trỏ, tạo 1 nút.
B2: Neu nút đó =NULL ->B3.
B3: Nếu danh sách rỗng->B4.
Nếu danh sách không rỗng-> B5.
B4: đặt nút mới làm nút đầu và nút cuối.
B5: Liên kết phải nút mới trỏ đến nút đầu tiên hiện thởi trong danh sách.
B6: Liên kết trái nút đầu tiên hiện thời trỏ đến nút mới.
B7: Đặt nút mới làm nút đầu tiên.
Push_last: Hàm thêm 1 nút vào cuối danh sách.
Thuật toán:
B1: Khởi tạo con trỏ, tạo 1 nút
B2: Nếu nút đó =NULL ->B3
B3: Nếu danh sách rỗng->B4
Nếu danh sách không rỗng-> B5
B4: đặt nút mới làm nút đầu và nút cuối.
B5: Liên kết phải nút cuối cùng hiện thời trỏ đến nút mới.
B6: Liên kết trái mới trỏ đến nút cuối cùng hiện thời trong danh sách.
B7: Đặt nút mới làm nút cuối cùng.
Push_after: Hàm thêm 1 nút vào sau 1 vị trí trong danh sách
Thuật toán:
B1: Khởi tạo con trỏ p trỏ đến mới, con trỏ q để duyệt, khởi tạo biến vt để xác định vị trí cần chèn sau, i là biến đếm(i=0).
B2: Nhập vị trí cần chèn (vt).
B3: So sánh vt với số nút trong danh sách
Nếu vt>số nút ->B4
Nếu vtB6
B4: Gán vt = số nút
B5: Thêm 1 nút vào cuối danh sách (push_last).
B6: so sánh i với số nút
Nếu i>số nút->Kết thúc
Nếu iB7
B7: so sánh i với vt
Nếu i=vt->B8
Nếu i khác vt->B11
B8: Tạo 1 nút mới, cho p trỏ đến nút đó.
B9: Nối nút sau q với p.
B10: Nối q với p.
B11: Dịch q sang phải 1 nút, tăng i lên 1.
Search_name: Hàm tìm kiếm 1 nút theo tên trong danh sách
Thuật toán:
B1: Tạo con trỏ q để duyệt, cho q trỏ đến nút đầu tiên
B2: Nếu nút đó bằng NULL-> Kết thúc
Nếu nút đó khác NULL->B3
B3: So sánh dữ liệu tên của nút đó với dữ liệu tên cần tìm
Nếu đúng->B5
Nếu sai->B4
B4: dịch q sang phải 1 nút ->B2
B5: Trả về giá trị là 1 nút.
Search_maso: Hàm tìm kiếm 1 nút theo mã số trong danh sách
Thuật toán:
B1: Tạo con trỏ q để duyệt, cho q trỏ đến nút đầu tiên
B2: Nếu nút đó bằng NULL-> Kết thúc
Nếu nút đó khác NULL->B3
B3: So sánh dữ liệu mã số của nút đó với dữ liệu mã số cần tìm
Nếu đúng->B5
Nếu sai->B4
B4: dịch q sang phải 1 nút ->B2
B5: Trả về giá trị là 1 nút.
Del_first: Hàm xóa nút đầu tiên trong danh sách
Thuật toán:
B1: Xét nếu danh sách rỗng thì không làm gì cả
Nếu danh sách không rỗng->B2
B2: Chuyển nút đầu tiên là nút tiếp theo
Del_last: Hàm xóa nút cuối cùng trong danh sách
Thuật toán:
B1: Xét nếu danh sách rỗng thì không làm gì cả
B2: tạo 1 con trỏ p trỏ đến nút gần cuối
B3: đặt liên kết phải của p là NULL.
B4: đặt liên kết trái của nút cuối là NULL.
B5: đặt p làm nút cuối
Del_node_name: Hàm xóa nút theo tên trong danh sách
Thuật toán:
B1: tạo 1 con trỏ trỏ đến nút cần xóa
B2: Nếu danh sách rỗng không làm gì cả
B3: Nếu nút cần xóa = NULL thì không làm gì cả
B4: Nếu nút cần xóa là nút đầu tiên->del_first().
B5: Nếu nút cần xóa là nút cuối->del_last().
B5: Trường hợp còn lại->B6
B6: Cho liên kết phải nút bên trái nút cần xóa trỏ đến nút bên phải nút cần xóa.
B7: Cho liên kết trái nút bên phải nút cần xóa trỏ đến nút bên trái nút cần xóa.
B8: Cho liên kết phải trái nút cần xóa về NULL.
B9: delete nút cần xóa.
Del_node_maso: Hàm xóa nút theo mã số trong danh sách
Thuật toán:
B1: tạo 1 con trỏ trỏ đến nút cần xóa
B2: Nếu danh sách rỗng không làm gì cả
B3: Nếu nút cần xóa = NULL thì không làm gì cả
B4: Nếu nút cần xóa là nút đầu tiên->del_first().
B5: Nếu nút cần xóa là nút cuối->del_last().
B5: Trường hợp còn lại->B6
B6: Cho liên kết phải nút bên trái nút cần xóa trỏ đến nút bên phải nút cần xóa.
B7: Cho liên kết trái nút bên phải nút cần xóa trỏ đến nút bên trái nút cần xóa.
B8: Cho liên kết phải trái nút cần xóa về NULL.
B9: delete nút cần xóa.
Clear_list: Hàm hủy toàn bộ danh sách
Thuật toán:
B1: Tạo 1 con trỏ q để duyệt, cho q trỏ đến nút đầu tiên.
B2: Nếu danh sách rỗng-> Kết thúc
Ngược lại->B3
B3: Dịch nút đầu tiên sang bên phải 1 nút
B4: Cho liên kết phải q = NULL
B5: Nếu nút đầu tiên khác rỗng, cho liên kết trái nút đó là NULL
B6: delete q;
B7: Cho q trỏ đến nút đàu tiên->B2;
Sort_list_dtb: Hàm sắp xếp danh sách theo điểm trung bình tăng dần
Thuật toán: (Sử dụng thuật toán sắp xếp nổi bọt – Bubble sort)
B1: Tạo 2 con trỏ i, j để duyệt. Cho i trỏ đến nút đầu tiên, j trỏ đến nút cuối cùng.
B2: So sánh i với nút cuối cùng.
Nếu i= nút cuối cùng->kết thúc
Nếu i khác nút cuối -> B3
B3: So sánh j với i
Nếu j =i->B
Nếu j khác i->B4
B4: So sánh dữ liệu dtb của j với nút trước j
Nếu dtb của j> dtb của nút trước j->B7
Nếu dtb của jB5
B5: Đổi chỗ j vs nút trước j
B6: Chuyển j trỏ sang bên trái 1 nút.->B3
B7: Chuyển i trỏ sang bên phải 1 nút.->B2.
Ghi_file: Hàm nhập danh sách ra file
Doc_file: Hàm đọc danh sách từ file
Lớp MENU
Thuộc tính
Đối tượng thành phần:
LIST a;
Phương Thức
Hien: Hàm hiện MENU
Xuly: Hàm xử lý các chức năng
PHẦN III: GIỚI THIỆU CÁC CHỨC NĂNG TRONG CHƯƠNG TRÌNH
Chương tringh quản lý sinh viên có tất cả 7 chức năng chính bao gồm:
Nhập danh sách sinh viên
Nhập danh sách từ bàn phím
Ghi danh sách ra file
Đọc danh sách từ file
Hiện danh sách sinh viên
Đếm số lượng sinh viên trong danh sách
Thêm 1 sinh viên vào danh sách
Thêm 1 sinh viên vào đầu danh sách
Thêm 1 sinh viên vào cuối danh sách
Thêm 1 sinh viên vào sau 1 nút xác định trong danh sách
Tìm kiếm 1 sinh viên trong danh sách
Tìm kiếm 1 sinh viên theo tên trong danh sách
Tìm kiếm 1 sinh viên theo mã số trong danh sách
Xóa 1 sinh viên trong danh sách.
Xóa sinh viên theo mã số xác định
Xóa sinh viên theo tên xác định
Xóa toàn bộ danh sách
Sắp xếp danh sách sinh viên theo điểm trung binh
PHẦN IV: MÃ NGUỒN CHƯƠNG TRÌNH
“baitaplon.h”
#include
#include
#include
#include
#include
#include
#include
class SINHVIEN
{
public:
char maso[6],hoten[30],gioitinh[5],quequan[10],lop[6];
int namsinh;
float dtb;
void nhap();
void hien();
};
class NODE
{
public:
SINHVIEN info;
NODE *left,*right;
NODE* getnode();
void freenode(NODE *p);
};
class LIST : public NODE
{
public:
NODE *first,*last;
void createlist();
void nhaplist();
void showlist();
int listsize();
void push_first(NODE *l);
void push_last(NODE *l);
void push_after(NODE *l);
NODE* search_name(NODE *l,char timten[]);
NODE* search_maso(NODE *l,char timmaso[]);
int del_first();
int del_last();
int del_node_name(NODE *l,char xoaten[]);
int del_node_maso(NODE *l,char xoamaso[]);
void clear_list(NODE *l);
void sort_list_dtb(NODE *l);
void ghi_file();
void doc_file();
};
class MENU
{
LIST a;
public:
void hien();
void xuly();
};
“SINHVIEN.cpp”
#include"baitaplon.h"
void SINHVIEN::nhap()
{
cout<<"\n Nhap ma so sinh vien: "; cin.ignore().get(maso,6);
cout<<"\n Nhap ho ten: "; cin.ignore().get(hoten,30);
cout<<"\n Nhap gioi tinh: "; cin.ignore().get(gioitinh,5);
cout>namsinh;
cout<<"\n Nhap que quan: "; cin.ignore().get(quequan,10);
cout<<"\n Nhap lop: "; cin.ignore().get(lop,6);
cout>dtb;
}
void SINHVIEN::hien()
{
cout<<"+"<<setw(5)<<maso<<"+"<<" "
<<setw(16)<<hoten<<"+"<<" "
<<setw(11)<<namsinh<<"+"<<" "
<<setw(8)<<gioitinh<<"+"<<" "
<<setw(12)<<quequan<<"+"<<" "
<<setw(8)<<lop<<"+"<<" "
<<setw(5)<<dtb<<"+"; cout<<endl;
}
“NODE.cpp”
#include"baitaplon.h"
NODE* NODE::getnode()
{
NODE *p;
p=new NODE;
if(p!=NULL)
{
p->right=NULL;
p->left=NULL;
p->info.nhap();
}
return p;
}
void NODE::freenode(NODE *p)
{
free(p);
}
“LIST.cpp”
#include"baitaplon.h"
#include
void LIST::createlist()
{
first=NULL;
last=NULL;
}
void LIST::nhaplist()
{
int n,i;// n la so luong sinh vien can nhap
cout<<" So sinh vien can nhap :";
cin>>n;
NODE *p;
p=new NODE;
for(i=0;i<n;i++)
{
cout<<"\n sinh vien thu "<<i+1;
push_last(p);
}
}
void LIST::showlist()
{
NODE *p;
p=first;
cout<<"\n+-----+-----------------+------------+---------+-------------+---------+------+";
cout<<"\n|MA SO| HO TEN SV | NAM SINH |GIOI TINH| QUE QUAN | LOP | DTB |";
cout<<"\n+-----+-----------------+------------+---------+-------------+---------+------+\n";
while(p!=NULL)
{
cout<<" ";
p->info.hien();
cout<<"+-----+-----------------+------------+---------+-------------+---------+------+\n";
p=p->right;
}
}
int LIST::listsize()
{
NODE *p;
int i=0;
p=first;
while(p!=NULL)
{
p=p->right
i++;
}
return i;
}
void LIST::push_first(NODE *l)
{
NODE *p;
p=getnode(); //cap phat 1 nut
if(p==NULL)
cout<<"\n Khong them nut duoc";
if(first==NULL) // neu ds rong
first=last=p;
else
{
p->right=first; //lien ket phai tro den nut dau tien hien thoi trong ds
first->left=p; //lien ket trai nut dau ten tro den nut moi
first=p; //dat nut moi lam nut dau tien
}
}
void LIST::push_last(NODE *l)
{
NODE *p; //p la nut moi
p=getnode();
if(p==NULL) cout<<"\n Khong them nut duoc";
if(last==NULL)
first=last=p;
else
{
last->right=p;
p->left=last;
last=p;
}
}
void LIST::push_after(NODE *l)
{
NODE *p,*q;
int vt,i;
q=first;
cout>vt;
if(vt>listsize())
{
vt=listsize();
push_last(l);
}
if(vt<=listsize())
for(i=0;i<=listsize();i++)
if(vt==i)
{
p=getnode();
// noi cac nut sau nut q vao nut moi p
p->right=q->right;
q->right->left=p;
// noi nut q voi p
q->right=p;
p->left=q;
}
q=q->right;
}
NODE* LIST::search_name(NODE *l,char timten[])
{
NODE *q; //q la nut duyet
//q=getnode();
q=first;
while(q!=NULL)
{
if(strcmpi(q->info.hoten,timten)==0)
break;
q=q->right;
}
return q;
}
NODE* LIST::search_maso(NODE *l,char timmaso[])
{
NODE *q; //q la nut duyet
q=first;
while(q!=NULL)
{
if(strcmpi(q->info.maso,timmaso)==0)
break;
q=q->right;
}
return q;
}
int LIST::del_first()
{
if(first==NULL) return 2;
else
{
first=first->right;
return 1;
}
}
int LIST::del_last()
{
if(first==NULL)
return 2;
else
{
NODE *p=last->left;
p->right = NULL;
last->left= NULL;
last=p;
return 1;
}
}
int LIST::del_node_maso(NODE *l,char xoamaso[])
{
NODE *delnode=search_maso(l,xoamaso);
if(first==NULL)
return 0;
if(delnode==NULL)
return 3;
if(delnode==first)
{
del_first();
return 1;
}
if(delnode==last)
{
del_last();
return 1;
}
else
{
(delnode->left)->right = (delnode->right);
(delnode->right)->left=(delnode->left);
delnode->right=NULL;
delnode->left=NULL;
delete delnode;
return 1;
}
}
int LIST::del_node_name(NODE *l,char xoaten[])
{
NODE *delnode=search_name(l,xoaten);
if(first==NULL)
return 0;
if(delnode==NULL)
return 3;
if(delnode==first)
{del_first();
return 1;
}
if(delnode==last)
{del_last();
return 1;
}
else
{
(delnode->left)->right = (delnode->right);
(delnode->right)->left=(delnode->left);
delnode->right=NULL;
delnode->left=NULL;
delete delnode;
return 1;
}
}
void LIST::clear_list(NODE *l)
{
NODE *q=first;
while(q!=NULL)
{
first=first->right;
q->right=NULL;
if(first!=NULL)
first->left=NULL;
delete q;
q=first;
}
}
void LIST::sort_list_dtb(NODE *l)
{
NODE *nodei, *nodej;
for(nodei=first;nodei!=last;nodei=nodei->right)
{
for(nodej=last;nodej!=nodei;nodej=nodej->left)
{
if(nodej->info.dtb left)->info.dtb)
{
float temp;
temp=nodej->info.dtb;
nodej->info.dtb=(nodej->left)->info.dtb;
(nodej->left)->info.dtb=temp;
}
}
}
}
void LIST::ghi_file()
{
SINHVIEN b;
fstream a; //Khao bao doi tuong ghi/doc
int n,i;
cout<<"\n so luong thi sinh = ";
cin>>n;
a.open("SinhVien.dat",ios::out+ios::binary); // Mo tep va ghi kieu nhi phan
for(i=0;i<n;i++)
{
cout<<"\n SV thu "<<i+1;
b.nhap();
a.write((char*)&b,sizeof(b));
}
a.close(); //Dong tep
cout<<"\n Da ghi du lieu vao tep SinhVien.dat";
}
void LIST::doc_file()
{
SINHVIEN b;
fstream a; //Khao bao doi tuong ghi/doc
a.open("SinhVien.dat",ios::in+ios::binary);//Mo de doc theo kieu nhi phan
while(!a.eof()) //Trong khi con chua den cuo^i' file
{
a.read((char*)&b,sizeof(b));
{
cout<<"\n ";b.hien();
}
}
a.close(); //Dong tep
cout<<"\n\n";
}
“MENU.cpp”
#include”baitaplon.h”
void MENU::hien()
{
cout<<setiosflags(ios::left);
cout M E N U <===\n"
<<setw(40)<<"\n 1. Nhap thong tin sinh vien"
<<" 5. Tim sinh vien trong danh sach"
<<setw(40)<<"\n 2. Hien danh sach sinh vien"
<<" 6. Xoa sinh vien"
<<setw(40)<<"\n 3. Dem so sinh vien"
<<" 7. Sap xep danh sach theo diem trung binh"
<<setw(40)<<"\n 4. Bo sung sinh vien vao danh sach"
<<" 8. Ket thuc!";
}
void MENU::xuly()
{
int ch;
LIST a;
NODE *l1;
l1=new NODE;
a.createlist();
do{
hien();
cout>ch;
if(ch==1)
{
int kn;
cout<<"\n 1.Nhap tu ban phim";
cout<<"\n 2.Xuat file";
cout<<"\n 3.Doc file";
cout>kn;
if(kn==1)
{
a.nhaplist();
}
if(kn==2)
{
a.ghi_file();
}
if(kn==3)
{
a.doc_file();
}
}
if(ch==2)
{
a.showlist();
}
if(ch==3)
{
cout<<"\n\n\n";
cout<<"So phan tu cua List la : \n ";
cout<<a.listsize();
}
if(ch==4)
{
int kc; //kieu chen
cout<<"\n 1.Chen dau";
cout<<"\n 2.Chen cuoi";
cout<<"\n 3.Chen sau 1 nut";
cout>kc;
if(kc==1)
{
a.push_first(l1);
}
if(kc==2)
{
a.push_last(l1);
}
if(kc==3)
{
a.push_after(l1);
}
}
if(ch==5)
{
int kt;
cout<<"\n 1.Theo ten";
cout<<"\n 2.Theo ma so";
cout>kt;
if(kt==1)
{
char ten1[30];
cout<<"\n Nhap ten can tim: "; cin.ignore().get(ten1,30);
a.search_name(l1,ten1)->info.hien();
}
if(kt==2)
{
char ms1[6];
cout<<"\n Nhap ma so can tim: "; cin.ignore().get(ms1,6);
a.search_maso(l1,ms1)->info.hien();
}
}
if(ch==6)
{
int kx;
cout<<"\n 1. Xoa theo ma so ";
cout<<"\n 2. Xoa theo ten ";
cout<<"\n 3. Xoa toan bo danh sach";
cout>kx;
if(kx==1)
{
char ms2[6];
cout<<"\n Nhap ma so can xoa: "; cin.ignore().get(ms2,6);
if(a.del_node_maso(l1,ms2)==1)
cout<<"\n Xoa thanh cong";
else
cout<<"\n Xoa that bai";
}
if(kx==2)
{
char ten2[30];
cout<<"\n Nhap ten can xoa: "; cin.ignore().get(ten2,30);
if(a.del_node_name(l1,ten2)==1)
cout<<"\n Xoa thanh cong";
else
cout<<"\n Xoa that bai";
}
if(kx==3)
{
a.clear_list(l1);
cout<<"\n Mission Success";
}
}
if(ch==7)
{
a.sort_list_dtb(l1);
cout<<"\n Sap xep thanh cong";
}
}while(ch!=8);
}
“main.cpp”
#include"baitaplon.h"
void main()
{
MENU a;
a.xuly();
}
PHẦN V: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN CHƯƠNG TRÌNH
Chương trình quản lý sinh viên trên đã thực hiện được hầu hết các chức năng cần thiết cho công việc quản lý sinh viên tại các trường. Tuy nhiên chương trình vẫn còn nhiều lỗi cũng như thiếu xót như: chưa ghi được danh sách ra file cũng như chỉ có thể đọc từ danh sách từ file vừa tạo mà không thể chỉnh sửa. Bên cạnh đó chức năng tìm kiếm chưa cho phép tìm kiếm những dữ liệu trùng tên. Điều này gây khó khăn cho người dùng khi phải làm thao tác nhiều lần để xóa những phần tử lặp giống nhau. Ngoài ra giao diện chương trình chư