例学生学籍管理系统.docx
《例学生学籍管理系统.docx》由会员分享,可在线阅读,更多相关《例学生学籍管理系统.docx(29页珍藏版)》请在冰豆网上搜索。
![例学生学籍管理系统.docx](https://file1.bdocx.com/fileroot1/2022-12/30/ac94c3f9-5f58-44ee-ad62-33bc74ec503b/ac94c3f9-5f58-44ee-ad62-33bc74ec503b1.gif)
例学生学籍管理系统
范例二:
C++课程设计报告
设计题目:
学生学籍管理系统
学生姓名:
_______________
学号:
班级:
_______________
专业:
指导教师:
_______________
年月日
目录
一、系统总框图及函数定义及说明2
二、模块设计分析5
三、特色算法5
四、存在的问题及对策6
五、使用6
六、程序源代码6
在一个拥有上万个学生的大学里,对学生的管理成了一件比较棘手的事情(如果你采取人工的办法?
!
),好在现在有了电脑,有了各种各样的程序来帮你方便的完成这项工作;下面我要介绍的就是本人呕心沥血的拙作。
一、系统总框图及函数定义及说明
表一:
listNode()
listNode(Inform&);
listNode(listNode&);
InformdatalistNode*create();
listNode*del(listNode*,char*);
intnum数据成员成员函数listNode*insert(listNode*,Inform&);
listNode*modify(listNode*);
listNode*nextPtrvoidprintlistNode(listNode*);
voidsearch(char*,listNode*)
~listNode();
achieveachInform()
char*nameInform(Inform&)
char*idintoperator<=(constInform&);
char*sex数据成员成员函数Inform&operator=(Inform&)
char*numberintoperator==(constInform&);
char*roomnumberintoperator!
=(char*)
char*phonenumberintoperator==(char*);
~Inform();
intsumachieve();
voidcountaverage(subject*);
intnumintoperator==(achieve&);
数据成员成员函数achieve&operator=(achieve&);
intaveragevoidinstruction();
voidsetnum(inta);
subject*T(公)intgetnum();
~achieve();
(公有)
intachievement
(公有)
charname数据成员成员函数subject&operator=(constsubject&);
(公有)
intxuefen
∙系统总框图:
本系统的功能虽然不是很强大,但是也包括了添加,删除,查找,修改和计算总学分和加权平均分等
基本的功能,具体框图如下。
密码
p或P或I或i
D
MDs
或或或
mdS
另外,在程序中,都是以e或E退出系统的,具体的操作可以在提示下进行。
上表列出了程序中定义的类中的数据成员(除特别说明外都是私有成员)和成员函数,并把类之间的包含关系显示出来了。
除了上面列举的函数外,还有若干用于重载输入输出的类的友元函数;下表将把所有的函数原型和简单说明列出:
表二
函数原型
函数参数,返回值及功能说明
ListNode()
链表类listNode的空构造函数
listNode(Inform&)
链表类listNode的构造函数(给nextPtr分配动态空间)
listNode(listNode&);
链表类listNode的拷贝构造函数
listNode*create()
建立一个链表,返回链表的头指针
listNode*del(listNode*,char*);
若节点数据的一个属性与char*相同则删除,返回头指
listNode*insert(listNode*,Inform&);
插入一个节点数据(Inform类);返回头指针
listNode*modify(listNode*);
修改链表中节点的数据,返回头指针
voidprintlistNode(listNode*);
打印链表中的数据;
voidsearch(char*,listNode*)
查找并打印链表节点数据(Inform类)中与char*相同的节点
~listNode()
链表类listNode的析构函数
Inform()
学生信息类Inform类的构造函数(动态分配内存)
Inform(Inform&)
学生信息类Inform类的拷贝构造函数
intoperator==(constInform&);
对Inform类的对象重载==号
intoperator!
=(char*)
重载Inform类的对象与char*的!
=号
Inform&operator=(Inform&)
对Inform类的对象重载=号
intoperator==(char*);
重载Inform类的对象与char*的==号
~Inform();
学生信息类Inform类的析构函数
achieve();
成绩类(achieve)的构造函数
voidcountaverage(subject*);
以科目类(subject)的数组为形参,计算加权平均分
intoperator==(achieve&);
对成绩类(achieve)对象重载==号
achieve&operator=(achieve&);
对成绩类(achieve)对象重载=号
voidinstruction();
打印一个输出成绩的格式;
voidsetnum(inta);
设置科目数
intgetnum();
返回科目数
~achieve();
成绩类(achieve)的析构函数
subject&operator=(constsubject&);
对科目类(subject)对象重载=号
voidINSTRUCTION()
打印一个菜单(提示性语句)
voidwelcome();
开始界面;
ostream&operator<<(ostream&,constsubject&)
对科目类(subject)对象重载输出流
ostream&operator<<(ostream&,Inform&)
对学生信息类(Inform)对象重载输出流
ostream&operator<<(ostream&,achieve&)
对成绩类(achieve)对象重载输出流
istream&operator>>(istream&,Inform&)
对学生信息类(Inform)对象重载输入流
istream&operator>>(istream&,achieve&)
对成绩类(achieve)对象重载输出流
istream&operator>>(istream&,subject&)
对科目类(subject)对象重载输入流
二、模块设计分析
程序首先建立一个链表(提示用户输入链表的第一个节点,调用create函数),因为节点的数据是Inform类的对象,所以重载了Inform类的输入函数,又由于Inform类中包含了achieve类,achieve类中包含了subject类,所以又分别重载了achieve类和subject类的输入函数;
接着在提示菜单(voidINSTRUCTION())下要完成插入数据,删除数据,查找数据,修改数据,打印链表,为此,分别设计了对链表进行操作的函数insert,del,search,modify,printlistNode,
为了在printlistNode函数中实现对链表数据的输出,分别重载了Inform,achieve,subject类的输出函数;在基本操作函数中,insert将输入的Inform类的对象(包含各种属性)插入链表头,printlistNode打印出链表中的各个节点,del删除一个节点。
此为链表的基本操作,唯一可以称得上是特色算法的只能是search和modify
三、特色算法
voidsearch(char*sea,listNode*head);
算法:
1.因为可能有几个节点的信息中与char*相同(如一个寝室号码有几个人相同),所以定义listNode*t[];用来保存匹配的节点的指针,再定义一个整型变量n来记录找到的节点个数;
2.用for循环(以查找次数小于节点数为终止条件)查找head->data是否有属性与sea相同;
此处重载了head->data即Inform类的对象与char*的==号;如果相同,n加1,把该head指针放入t[0]中,t[]的角标变量加1,无论是否相同,都把head指向下一个节点;
voidmodify(listNode*head);
算法:
1.输入要修改的学生的一项资料char*a;
2.调用search(a,head)看能否找到这个节点;
3.如果有则删除这个节点del(head);再输入一个Inform类对象信息,插入即可;
四、存在的问题及对策
由于时间匆忙以及本人水平有限,本程序存在的问题比较多,自认为主要有以下几个方面,未尽之处还请各位看官多多斧正。
1.程序没有对输入的学生信息诸如学号,姓名,电话号码,寝室号码等进行检测其合理性,所以在电话号码,寝室号码,学号等中可以输入字母或在名字中可以输入数字就在所难免了,作为一个学籍管理系统,这样的安全性是致命的。
要解决这个问题,就要在重载函数中加入各种判断语句,工作量比较大。
2.由于水平有限,没有制作图形界面,在一个单调的黑屏下进行各种操作连我都对输入各种信息有些失去耐心,何况是用户!
(此为死穴,只能继续努力了。
)
3.程序的功能也是一个问题,学生的信息太简单,可进行的操作也少,可能有些功能实现起来显得有些别扭。
五、使用
由于做程序时,把所有的文件包含在一个空的工程中,运行时不能分别编译各个cpp文件,具体为打开.dsw文件,再进行编译连接,运行即可。
密码为:
82136
六、程序源代码
*****************************listNode.h******************************************
#ifndeflistNode_h
#definelistNode_h
#defineLENsizeof(listNode)
#include
#include
#include
#include
#include
#include"Inform.h"
#defineMAX24
classlistNode{
public:
listNode(){}
listNode(Inform&);
listNode(listNode&);
listNode*create();
listNode*insert(listNode*);//对链表进行插入操作;
listNode*del(listNode*,char*);//删除资料中含有char*的节点;
voidprintlistNode(listNode*);//打印链表;
~listNode();
voidsearch(char*,listNode*);//查找链表中含有char*的学生;
listNode*modify(listNode*);
private:
Informdata;
staticintnum;
listNode*nextPtr;
};
#endif
*********************listNode.cpp*********************************
#include"listNode.h"
intlistNode:
:
num=0;
listNode:
:
listNode(Inform&da)
{
data=da;
nextPtr=newlistNode[LEN];
}
listNode:
:
listNode(listNode©)//拷贝构造函数。
{
data=copy.data;
nextPtr=newlistNode[LEN];
assert(nextPtr!
=0);
nextPtr=copy.nextPtr;
}
listNode*listNode:
:
create()//从文件f3.txt中读入链表数据;
{
listNode*head=NULL;
listNode*p1,*p2;
p1=p2=newlistNode[LEN];
charch;
cout<<"\t输入第一个学生的情况:
"<do
{
cin>>p1->data;
num=num+1;
if(num==1)
head=p1;
else
p2->nextPtr=p1;
p2=p1;
p1=newlistNode[LEN];
cout<<"\t要继续输入吗?
(y/n):
";
cin>>ch;
}while(ch=='y');
p2->nextPtr=NULL;
cout<<"\t输入学生个数为:
"<return(head);
}
listNode*listNode:
:
insert(listNode*head)//将Inform类的一个对象DATA插入链表头。
{
cout<<"\t输入要插入的学生资料:
"<Informinsertdata;
cin>>insertdata;
listNode*p0,*p1;
p0=newlistNode[LEN];
assert(p0!
=0);
p0->data=insertdata;
p0->nextPtr=NULL;
p1=newlistNode[LEN];
assert(p1!
=0);
p1=head;
head=p0;
p0->nextPtr=p1;
num+=1;
cout<<"TheDATAhavebeeninsertedintothelist."<returnhead;
}
listNode*listNode:
:
del(listNode*head,char*DELDATA)//删除链表中数据为DELDATA的节点。
{
listNode*p1,*p2;
cout<<"确定要删除该生的资料吗?
(y/n):
";
charch;
cin>>ch;
if(ch=='y')
{
if(head==NULL)
{
cout<abort();
}
p1=head;
while(p1->data!
=DELDATA&&p1->nextPtr!
=NULL)
{
p2=p1;
p1=p1->nextPtr;
}
if(p1->data==DELDATA)
{
if(p1==head)
head=p1->nextPtr;
else
p2->nextPtr=p1->nextPtr;
cout<"<num-=1;
}
else
cout<"<returnhead;
}
else
returnhead;
}
voidlistNode:
:
printlistNode(listNode*head)//打印以head为头指针的链表。
{
listNode*p;
if(num==0)
cout<<"\t没有学生资料。
"<p=head;
if(head!
=NULL)
do{
cout<data<p=p->nextPtr;
}while(p!
=NULL);
}
voidlistNode:
:
search(char*sea,listNode*head)
{
listNode*p=newlistNode[LEN];
listNode*t[MAX2];
intn=0,j=0;
for(inti=0;i{
if(head->data==sea)
{
n+=1;
while(j{
t[j]=head;
j++;
break;
}
}
head=head->nextPtr;
}
if(n==0)
cout<"<elseif(n==1)
{
cout<<"找到一个学生资料,要输出吗?
(y/n)."<charc;
cin>>c;
if(c=='y')
{
cout<<"\t该学生学生资料是:
"<cout<<(*t)->data<}
}
else
{
cout<<"\t找到"<cout<<"要输出这些学生资料(y/n)."<charc;
if((c=getchar())!
='y')
exit
(2);
else
for(intj=n-1;j>=0;j--)
cout<data<}
}
listNode*listNode:
:
modify(listNode*head)
{
cout<<"输入要修改的学生的一项资料(姓名,学号,电话号,身份证号或寝室号):
";
charch[20];
cin>>ch;
search(ch,head);
cout<<"\t即将删除该生的资料,确定吗?
(y/n)";
charc;cin>>c;
if(c=='y')
{
head=del(head,ch);
cout<<"\t输入修改的学生资料:
"<Informinsertdata;
cin>>insertdata;
head=insert(head);
returnhead;
}
else
returnhead;
}
listNode:
:
~listNode()
{
delete[]nextPtr;
}
****************************Inform.h**************************
#ifndefInform_h
#defineInform_h
#include
#include
#include
#include
#include
#include
#include
#include"achieve.h"
classInform{
friendostream&operator<<(ostream&,Inform&);
friendistream&operator>>(istream&,Inform&);
public:
Inform();
Inform(Inform&);
intoperator==(constInform&);
intoperator==(char*);
intoperator!
=(char*);
Inform&operator=(Inform&);
~Inform();
private:
char*number;
char*id;
char*name;
char*sex;
achieveach;
char*phonenumber;
char*roomnumber;
};
#endif
******************************Inform.cpp************************************
#include
#include"Inform.h"
ostream&operator<<(ostream&output,Inform&t)
{
cout<<"********************基本资料********************"<cout<<"姓名性别学号"<output<cout<output<chara;
cout<<"\t\t要输出详细信息吗?
(y/n)";
cin>>a;
if(a=='y')
{
cout<cout<<"********************详细资料********************"<cout<<"身份证号电话号码寝室号"<output<output<output<if((t.ach).getnum()==0)
cout<<"\t没有输入成绩信息。
"<else
{
(t.ach).instruction();
output<out