某系学生成绩管理系统计算器程序论文.docx
《某系学生成绩管理系统计算器程序论文.docx》由会员分享,可在线阅读,更多相关《某系学生成绩管理系统计算器程序论文.docx(40页珍藏版)》请在冰豆网上搜索。
某系学生成绩管理系统计算器程序论文
目录
PARTI
1需求分析1
2算法基本原理1
3类设计2
4详细设计3
4.1类的接口设计4
4.2类的实现6
4.3主函数设计11
5运行结果与分析13
5.1程序运行结果13
5.2运行结果分析15
PARTII
1类设计…………………………………………………………………………16
2详细设计……………………………………………………………………..23
3运行结果………………………………………………………………………31
参考文献31
PARTI
1需求分析
(1)实现年级管理(4个年级)、班级管理及学生信息管理,可以实现班级的查询、添加、删除、修改,学生成绩的查询、添加、删除、修改等。
程序使用类的包含方法实现。
1)一个班最多30名学生,4门课程;
2)班级信息、学生成绩存放在数据文件中;
3)内存中数据组织建议采用STL容器。
设计班级类、学生类等,建立文件、输出文件内容、计算每个学生总分并进行总分排序、查找各科最低分和最高分。
(2)设计一个Student类,包含学生的基本信息:
姓名、学号、四门课程(大外、高数、模电、C++)的分数和总分数;StuList类用于实现学生成绩的查找、添加、删除、修改;Class类包含班级带的基本信息:
年级、班级名称和所有学生;ClList类用于实现班级的查询、添加、删除、修改。
(3)用list链表容器存放多个学生的信息和多个班级的信息。
使用容器的sort()函数实现学生的总分排序。
Max()和Min()分别实现查找各科的最高分和最低分。
2算法基本原理
一个年级包含多个班级,用list链表容器存放一个年级的所有班级,
用Class类存放班级的所有学生,用ClList类的成员函数对班级进行查找、添加、删除、修改。
(2)一个班级有很多学生(不超过30个),用Student类存放学生信息,StuList类带的成员函数实现学生成绩的查找、添加、删除、修改,总分的排序,求各科的最高分和最低分。
(3)学会STL标准模板库里德容器、迭代器、和算法的使用方法。
本程序使用List链表容器存放学生信息并进行相应的操作,如用push_back()函数进行添加操作、用sort()函数进行排序,用erase()函数进行删除操作等。
(4)用文件FILE读取和输出学生信息和班级信息。
3类设计
从上面的算法分析可以看到,本设计面临的计算问题的关键是学生信息和班级信息的处理。
可以定义一个学生类Student显示学生的基本信息,然后定义一个学生链表类StuList实现学生成绩的相关操作;又定义一个班级类Class显示班级的基本信息,最后定义一个班级链表类ClList实现班级的一些相应操作等。
从问题的需要来看,需要调用STL标准模板库里德一些函数如push_back()函数进行添加操作、用sort()函数进行排序,用erase()函数进行删除操作等。
学生类和班级类还有学生链表类和班级链表类之间的相互关系如图1所示。
StuList
-listthestu
+Getthestu():
list
+Add(Studentstu):
void
+Seek(char*num):
void
+Show():
void
+SorttoFile(char*filename):
void
+Max():
void
+Min():
void
学生类和学生链表类的UML图的表示
Class
-clgrade[10]:
char
-clclass[10]:
char
-cl:
list
+Class()
+Class(char*grade,char*cclass,listl)
+*Getclclass():
char
+CPrint():
void
ClList
-thecl:
list
+CAdd(Classcl):
void
+CSeek(char*cclass):
void
+CModify(char*cclass,Class&cl):
void
+CDelete(char*cclass):
void
+CShow():
void
班级类和班级链表类的UML图形表示
学生链表类需要访问学生类的私有成员,但是私有成员是不允许外部函数访问的,故在学生类当中定义了返回私有成员(stunum和stuscore)的成员函数,同理在班级类中也定义了返回(clclass)的成员函数。
4详细设计
整个程序一个文档,kese1.h文件中包括学生类Student、学生链表类StuList、班级类Class、班级链表类ClList的声明,kese1.Cpp文件中包含;这四个类类的成员函数实现文件;main.cpp文件包括程序的主函数,主函数中定义了一个类StuList的对象,通过这个对象存放所有的学生并进行相关操作;比定义了ClList类的对象,通过这个对象对班级进行相关的操作。
4.1类的接口设计
//kese1.h文件,实现类的声明
#include
#include
#include
#include
#include
#include
usingnamespacestd;
//student.h学生类
classStudent;
classStuList;
ostream&operator<<(ostream&os,constStudent&stu);//输出流文件声明
classStudent
{
private:
charstuname[20];//学生姓名
charstunum[12];//学生学号
floatstuscore[4];//四门课程的成绩
floattotal;//总分数
public:
Student()//构造函数
{}
Student(char*name,char*num,floats1,floats2,floats3,floats4);//构造函数
voidprint(intn=-1);//输出函数
char*Getnum()//输出学号
{
returnstunum;
}
float*Getstuscore()//输出分数
{
returnstuscore;
}
friendostream&operator<<(ostream&os,constStudent&stu);//读出文件
booloperator<(constStudent&stu)//重载<运算符
{
returntotal>stu.total;//
}
friendclassStuList;//友元类
};
//StuList.h学生信息的相关处理
classStuList
{
private:
listthestu;//链表对象
public:
listGetthestu()//输出链表
{
returnthestu;
}
voidAdd(Studentstu);//添加学生信息
voidSeek(char*num);//查询学生信息,按学号查询,返回记录号,-1表示没有找到
voidShow();//遍历列表显示
voidSorttoFile(char*filename);//按学生总成绩从高到低排序并写到文件中
voidMax();//各科的最高分
voidMin();//各科的最低分
};
//Class.h班级类
classClass
{
private:
charclgrade[10];//一共四个年级,其中的一个年级
charclclass[10];//班级名称
listcl;//链表对象,一个班最多30个学生
public:
Class(){}//构造函数
Class(char*grade,char*cclass,listl)//构造函数
{
strncpy(clgrade,grade,10);
strncpy(clclass,cclass,10);
cl=l;
}
char*Getclclass()//输出学号
{
returnclclass;
}
voidCPrint();//输出学生信息
friendostream&operator<<(ostream&os,constClass&cl);//读出文件
};
//ClList.h班级链表类
classClList
{
private:
listthecl;
public:
voidCAdd(Classcl);//添加班级信息
voidCSeek(char*cclass);//查询班级信息,按班级名称查询
voidCModify(char*cclass,Class&cl);//修改班级信息
voidCDelete(char*cclass);//删除班级信息
voidCShow();//遍历列表显示
};
以上四个类已经能够显示学生信息,比不过可通过一些成员函数实现学生和班级的一些添加、修改、删除、查找等操作。
4.2类的实现
#include"stdafx.h"
#include
#include
#include
#include
#include
#include
#include
usingnamespacestd;
//Student.cpp
Student:
:
Student(char*name,char*num,floats1,floats2,floats3,floats4)//构造函数
{
strncpy(stuname,name,20);
strncpy(stunum,num,12);
stuscore[0]=s1;
stuscore[1]=s2;
stuscore[2]=s3;
stuscore[3]=s4;
total=stuscore[0]+stuscore[1]+stuscore[2]+stuscore[3];
}
voidStudent:
:
print(intn)//输出函数
{
staticboolstuHead=false;
if(!
stuHead)
{
if(n>0)
cout<cout<<<<stuHead=true;
}
if(n>0)
cout<cout<<<<}
ostream&operator<<(ostream&os,constStudent&stu)//读出文件
{
os.write(stu.stuname,20);
os.write(stu.stunum,12);
os.write((char*)stu.stuscore,sizeof(stu.stuscore));
os.write((char*)&stu.total,sizeof(float));
returnos;
}
//StuList.cpp
voidStuList:
:
Add(Studentstu)//添加学生信息的函数
{
thestu.push_back(stu);
}
voidStuList:
:
Seek(char*num)//按学号查找
{
intsign=-1,i=0;
list:
:
iteratorit=thestu.begin();//定义迭代器指针
Studentstu;
while(it!
=thestu.end())
{
stu=*it;
if(strcmp(stu.Getnum(),num)==0)
{
sign=i;
break;
}
it++;
i++;
}
if(sign>=0)
{
cout<<"找到的结果为"<stu.print(sign+1);
}
else
cout<<"没有找到!
"<
}
voidStuList:
:
Show()//遍历列表显示
{
list:
:
iteratorit=thestu.begin();//定义迭代器指针
inti=0;
while(it!
=thestu.end())
{
it->print(++i);
it++;
}
}
voidStuList:
:
SorttoFile(char*filename)//按学生总成绩进行排序
{
thestu.sort();
Show();
//排序后的内容保存到文件中
ofstreamout(filename);
copy(thestu.begin(),thestu.end(),ostream_iterator(out));
}
voidStuList:
:
Max()//各科的最高分
{
floatmax[4]={0,0,0,0};
for(inti=0;i<4;i++)
{
list:
:
iteratorit=thestu.begin();//定义迭代器指针
Studentstu;
while(it!
=thestu.end())
{
stu=*it;
if(max[i]max[i]=stu.stuscore[i];
it++;
}
}
cout<<"各科的最高分:
"<<"大外"<}
voidStuList:
:
Min()//各科的最低分
{
floatmin[4]={100,100,100,100};
for(inti=0;i<4;i++)
{
list:
:
iteratorit=thestu.begin();//定义迭代器指针
Studentstu;
while(it!
=thestu.end())
{
stu=*it;
if(min[i]>stu.stuscore[i])
min[i]=stu.stuscore[i];
it++;
}
}
cout<<"各科的最低分:
"<<"大外"<}
//Class.cpp
voidClass:
:
CPrint()//输出班级信息
{
cout<cout<cout<cout<<<<list:
:
iteratorit=cl.begin();//定义迭代器指针
inti=0;
while(it!
=cl.end())
{
it->print(++i);
it++;
}
}
//ClList.cpp
voidClList:
:
CAdd(Classcl)//增加班级信息
{
thecl.push_back(cl);
}
voidClList:
:
CSeek(char*cclass)//查询班级信息
{
intsign=-1;
list:
:
iteratorit=thecl.begin();//定义迭代器指针
Classcl;
while(it!
=thecl.end())
{
cl=*it;
if(strcmp(cl.Getclclass(),cclass)==0)
{
sign=1;
break;
}
it++;
}
if(sign>0)
{
cout<<"查找的结果为"<cl.CPrint();
}
else
cout<<"没有查找到!
"<}
voidClList:
:
CModify(char*cclass,Class&cl)//修改班级信息
{
list:
:
iteratorit=thecl.begin();//定义迭代器指针
while(it!
=thecl.end())
{
if(strcmp((*it).Getclclass(),cclass)==0)
{
*it=cl;
//sign=1;
break;
}
it++;
}
cout<<"修改的结果为"<cl.CPrint();
}
voidClList:
:
CDelete(char*cclass)//班级的删除
{
list:
:
iteratorit=thecl.begin();//定义迭代器指针
while(it!
=thecl.end())
{
if(strcmp((*it).Getclclass(),cclass)==0)
{
thecl.erase(it);
break;
}
it++;
}
cout<<"删除成功"<}
voidClList:
:
CShow()//年级中所有班级的显示
{
list:
:
iteratorit=thecl.begin();//定义迭代器指针
Classcl;
while(it!
=thecl.end())
{
cl=*it;
cl.CPrint();
it++;
}
}
4.3主函数设计
//kese1.cpp
intmain()//主函数
{
StuListthestu;//存放所有学生
Studentstu1("ma","0803070201",88,90,69,52.6f);
Studentstu2("li","0803070202",52,96,74,56);
Studentstu3("wang","0803070101",85,25,95,79);
Studentstu4("yang","0803070102",82,78,84,95);
Studentstu5("ding","0803070301",76,85.6f,94,83);
thestu.Add(stu1);
thestu.Add(stu2);
thestu.Add(stu3);
thestu.Add(stu4);
thestu.Add(stu5);
thestu.Show();
thestu.Seek("0803070201");//查找学号为0803070201的同学
cout<<"排序的结果"<thestu.SorttoFile("student.dat");//按总分排序
thestu.Max();
thestu.Min();
StuLists1;
StuLists2;
StuLists3;
s1.Add(stu3);
s1.Add(stu4);
s3.Add(stu5);
s2.Add(stu1);
s2.Add(stu2);
ClListthecl;
Classcl1("二年级","08030701",s1.Getthestu());
Classcl2("二年级","08030702",s2.Getthestu());
Classcl3("二年级","08030703",s3.Getthestu());
thecl.CAdd(cl1);
thecl.CAdd(cl2);
thecl.CShow();
thecl.CSeek("08030702");//查找班级为08030702的班级
thecl.CAdd(cl3);
cout<<"将08030702修改为08030703"<thecl.CModify("08030702",cl3);//修改班级
cout<<"删除08030701班"<thecl.CDelete("08030701");//删除08030701班
return0;
}