高校学籍管理系统C++程序设计.docx
《高校学籍管理系统C++程序设计.docx》由会员分享,可在线阅读,更多相关《高校学籍管理系统C++程序设计.docx(34页珍藏版)》请在冰豆网上搜索。
高校学籍管理系统C++程序设计
VC++课程设计---高校学籍管理系统
源程序
一、课程设计题目:
学籍管理系统
二、目的与要求:
1、目的:
(1)要求学生达到熟练掌握C++语言的基本知识和技能;
(2)基本掌握面向对象程序设计的基本思路和方法;
(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
2、基本要求:
(1)要求利用面向对象的方法以及C++的编程思想来完成系统的设计;
(2)要求在设计的过程中,建立清晰的类层次;
(3)在系统的设计中,至少要用到面向对象的一种机制。
3、创新要求:
在基本要求达到后,可进行创新设计,如根据查找结果进行修改的功能。
4、写出设计说明书
三、设计方法和基本原理:
1、功能要求
要求完成以下功能:
1)能够从屏幕上读取一个学生的信息并将信息存入到数据文件中。
2)能够将指定的信息从文件中删除。
3)能够按编号、姓名对学生的信息进行检索并将检索结果显示在屏幕上。
4)可以统计全部学生的总成绩,及其在班上的排名。
5)能够统计各科的平均成绩及及格率。
6)要求有错误提示功能,例如性别只能输入男女,输入错误提示重新输入。
7)如果检索不到相应的信息应提示用户。
2、问题的解决方案:
根据系统功能要求,可以将问题解决分为以下步骤:
a)写出需求分析(做什么)
b)分析系统中的各个实体之间的关系及其属性和行为;
c)根据问题描述,设计系统的类层次;
d)完成类层次中各个类的描述(包括属性和方法);
e)完成类中各个成员函数的定义;
f)用户界面的设计
g)分析系统功能模块(系统流程图)
h)代码编写
i)功能调试;
j)完成系统总结报告以及系统使用说明书。
源程序代码如下:
[code]/*
course.dat-课程列表(只读)
student.dat-学生信息
*/
#include
#include
#include
#include
classCOURSE //课程类
{
private:
staticintcoursenum; //课程数量
staticchar(*coursename)[20]; //课程名称
public:
staticvoidLoadCourse() //从文件COURSE.DAT装入课程信息
{
ifstreamf("course.dat");
f>>coursenum;
coursename=newchar[coursenum][20];
for(inti=0; i f>>coursename;
f.close();
}
friendclassSTUDENT;
friendclassCOLLEGE;
};
intCOURSE:
:
coursenum=0;
char(*COURSE:
:
coursename)[20]=0;
classSTUDENT//学生类
{
private:
charnum[20]; //学号
charname[20]; //姓名
charsex; //性别
charcname[20];//班级
float*grade; //成绩(动态数组)
floatsum; //各科总分
STUDENT*next;
public:
STUDENT()
{
grade=newfloat[COURSE:
:
coursenum];
next=0;
}
~STUDENT()
{
delete[]grade;
}
voidInput()
{
sum=0;
cout<<"学号:
"; cin>>num; //输入学生一般信息
cout<<"姓名:
"; cin>>name;
cout<<"性别:
"; cin>>sex; sex=toupper(sex);
cout<<"班级:
"; cin>>cname;
for(inti=0; i:
coursenum; i++) //输入学生各科成绩
{
cout<:
coursename<<"成绩:
"; cin>>grade;
sum+=grade; //计算总分
}
}
voidInput(ifstream&f)
{
f>>num;
f>>name;
f>>sex; sex=toupper(sex);
f>>cname;
for(inti=0; i:
coursenum; i++) //输出学生各科成绩,总分
{
f>>grade;
}
f>>sum;
}
staticvoidOutputT()
{
cout< for(inti=0; i:
coursenum; i++)
cout<:
coursename;
cout< }
voidOutput()
{
cout< cout< cout< cout< for(inti=0; i:
coursenum; i++) //输出学生各科成绩,总分
{
cout< }
cout< }
voidOutput(ofstream&f)
{
f< f< f< f< for(inti=0; i:
coursenum; i++) //输出学生各科成绩,总分
{
f< }
f< }
friendclassCOLLEGE;
};
classCOLLEGE //学校类
{
private:
STUDENT*SL; //学生链表
voidClear();
intFind(char*ID,STUDENT**p1,STUDENT**p2);
voidCOLLEGE:
:
ValueS2ToS1(STUDENT&s1,STUDENT&s2);
public:
COLLEGE()
{
COURSEadCourse(); //装入课程信息
SL=newSTUDENT(); //创建学生链表表头结点
}
~COLLEGE()
{
STUDENT*p=SL; //删除学生链表各个结点
while(p)
{
SL=p->next;
deletep;
p=SL;
}
}
voidSet(); //课程设置(增,删,改,存)
voidAdd(); //增加学生
voidDelete(); //删除学生
voidModify(); //修改学生
voidQuery(); //查询学生信息(按姓名,学号)
voidPrint(); //输出所有学生信息
voidStat(); //统计课程平均成绩,课程合格率
voidSumSort(); //按总分排名(高->低)
voidNumSort(); //按学号排序(低->高)
voidSave(); //学生数据存盘
voidLoad(); //装入学生数据
};
//增加学生
voidCOLLEGE:
:
Add()
{
cout<<"\n**增加学生信息**\n";
STUDENT*p=newSTUDENT; //创建1个新学生结点
STUDENT*p2=SL; //查找学生链表表尾结点
while(p2->next)p2=p2->next;
p2->next=p; //链接学生结点
p->Input(); //输入学生信息
}
//查找学生结点(返回1-找到,0-未找到.结点指针由p1返回,p2为前看指针)
intCOLLEGE:
:
Find(char*ID,STUDENT**p1,STUDENT**p2)
{
*p1=SL->next;
*p2=SL;
while(*p1)
{
if(strcmp((*p1)->num,ID)==0)
break; //找到
else
{
*p2=*p1; //继续查找
*p1=(*p1)->next;
}
}
return*p1?
1:
0;
}
//删除学生
voidCOLLEGE:
elete()
{
cout<<"\n**删除学生**\n";
charNo[20];
STUDENT*p1,*p2;
cout<<"学号:
"; cin>>No;
if(!
Find(No,&p1,&p2))
{
cout<<"指定的学生没有找到!
\n";
}
else
{
p2->next=p1->next; //连接
deletep1;
cout<<"正确删除!
\n";
}
}
//修改学生
voidCOLLEGE:
:
Modify()
{
cout<<"\n**修改学生**\n";
charNo[20];
STUDENT*p1,*p2;
cout<<"学号:
"; cin>>No;
if(!
Find(No,&p1,&p2))
{
cout<<"指定的学生没有找到!
\n";
}
else
{
p1->Output(); //输出原来的学生信息(做提示)
p1->Input(); //输入此学生信息(更新)
cout<<"修改完成!
\n";
}
}
/*承上*/
//查询学生信息
//按学号或姓名查找,如果找到显示该学生,如果未找到,也给出相应提示.
voidCOLLEGE:
uery()
{
cout<<"\n**查询学生**\n";
STUDENT*p=SL->next;
charNo[20];
charName[20];
charch;
do
{
cout<<"按学号查1,按姓名查2:
"; cin>>ch;
}while(ch!
='1'&&ch!
='2');
intflag=0; //未找到0,找到1
if(ch=='1') //按学号查
{
cout<<"学号:
"; cin>>No;
while(p)
if(strcmp(p->num,No)==0)
{
flag=1; break;
}
else
p=p->next;
}
else //按姓名查
{
cout<<"姓名:
"; cin>>Name;
while(p)
if(strcmp(p->name,Name)==0)
{
flag=1; break;
}
else
p=p->next;
}
if(flag==1) //如果找到,显示此同学信息
{
p->OutputT();
p->Output();
}
else //否则给出未找到提出
cout<<"指定的学生没有找到!
\n";
}
//输出所有学生信息
voidCOLLEGE:
rint()
{
cout<<"\n**输出学生信息**\n";
STUDENT*p=SL->next;
STUDENT:
:
OutputT(); //输出标题
while(p) //循环输出各位学生信息
{
p->Output();
p=p->next;
}
}
//学生数据存盘
voidCOLLEGE:
:
Save()
{
ofstreamf("student.dat");
STUDENT*p=SL->next;
while(p) //遍历学生链表
{
p->Output(f); //写入文件
p=p->next;
}
f.close();
cout<<"\n**保存数据完成!
**\n";
}
voidCOLLEGE:
:
Clear()
{
STUDENT*p=SL->next;
while(p)
{
SL->next=p->next;
deletep;
p=SL->next;
}
}
//装入学生数据
voidCOLLEGEad()
{
Clear();
ifstreamf("student.dat");
STUDENT*p=SL;
STUDENT*p2=newSTUDENT;
p2->Input(f);
while(f)
{
p->next=p2;
p=p->next;
p2=newSTUDENT;
p2->Input(f);
}
deletep2;
f.close();
}
//统计课程平均成绩,课程合格率
voidCOLLEGE:
:
Stat()
{
float*sum=newfloat[COURSE:
:
coursenum]; //各科平均成绩
float*pass=newfloat[COURSE:
:
coursenum]; //各科合格人数,/n=>合格率
intn=0; //学生人数
for(inti=0; i:
coursenum; i++)
{
STUDENT*p=SL->next; n=0;
sum=pass=0;
while(p) //遍历学生链表
{
n++; //人数
sum=sum+p->grade; //某科总分
if(p->grade>=60)pass++; //某科合格人数
p=p->next;
}
}
for(i=0; i:
coursenum; i++)
{
cout<:
showpoint);
cout<:
coursename<<"平均:
"<"< }
delete[]sum;
delete[]pass;
}
voidCOLLEGE:
:
ValueS2ToS1(STUDENT&s1,STUDENT&s2)
{
strcpy(s1.num,s2.num); //学号
strcpy(s1.name,s2.name); //姓名
s1.sex=s2.sex; //性别
strcpy(ame,ame); //班级
for(inti=0; i:
coursenum; i++)
s1.grade=s2.grade; //成绩指针(动态数组)
s1.sum=s2.sum; //各科总分
}
//按总分排名(采用选择法排序),总分高->低
voidCOLLEGE:
:
SumSort()
{
STUDENT*p1,*p2;
p1=SL->next;
while(p1)
{
p2=p1->next;
while(p2)
{
if(p2->sum>p1->sum)
{
STUDENTt;
ValueS2ToS1(t,*p1);
ValueS2ToS1(*p1,*p2);
ValueS2ToS1(*p2,t);
}
p2=p2->next;
}
p1=p1->next;
}
}
voidCOLLEGE:
:
NumSort() //按学号排序(低->高)
{
STUDENT*p1,*p2;
p1=SL->next;
while(p1)
{
p2=p1->next;
while(p2)
{
if(strcmp(p2->num,p1->num)<0) //只要修改这里,其余同SumSort
{
STUDENTt;
ValueS2ToS1(t,*p1);
ValueS2ToS1(*p1,*p2);
ValueS2ToS1(*p2,t);
}
p2=p2->next;
}
p1=p1->next;
}
}
voidmain()
{
charch;
COLLEGEc; //定义大学对象
cout.setf(ios:
:
left);
//显示主菜单,接受选择,并分支调用大学类的相应功能的成员函数
do
{
cout<<"\n☆☆高校学籍管理系统☆☆\n";
cout<<"1-增加学生\n";
cout<<"2-删除学生\n";
cout<<"3-修改学生\n";
cout<<"4-查询学生\n";
cout<<"5-输出学生信息\n";
cout<<"6-综合统计(课程平均成绩,课程合格率)\n";
cout<<"7-总分排序\n";
cout<<"8-学号排序\n";
cout<<"S-数据存盘\n";
cout<<"L-数据装入\n";
cout<<"Q-退出\t请选择(1-8,SLQ):
";
cin>>ch; ch=toupper(ch);
switch(ch)
{
case'1':
c.Add(); break;
case'2':
c.Delete();break;
case'3':
c.Modify();break;
case'4':
c.Query();break;
case'5':
c.Print(); break;
case'6':
c.Stat(); break;
case'7':
c.SumSort(); break;
case'8':
c.NumSort(); break;
case'S':
c.Save(); break;
case'L':
c.Load(); break;
}
}while(ch!
='Q');
}
3、2数据文件
1、course.dat:
3
C++
英语
高数
2、student.dat:
86101 chenkaijun M M8601 77 59 96 232
86102 zhaowei F M8601 55 85 77 217
86103 wubin M M8601 85 87 92 264
86104 shijun M M8601 58 90 85 233
86105 wangzhuguo M M8601 66 70 86 222
3、3运行结果参考
☆☆高校学籍管理系统☆☆
1-增加学生
2-删除学生
3-修改学生
4-查询学生
5-输出学生信息
6-综合统计(课程平均成绩,课程合格率
7-总分排序
8-学号排序
S-数据存盘
L-数据装入
Q-退出请选择(1-8,SLQ)
☆☆高校学籍管理系统☆☆
1-增加学生
2-删除学生
3-修改学生
4-查询学生
5-输出学生信息
6-综合统计