文档库

最新最全的文档下载
当前位置:文档库 > C++成绩管理系统实验报告(含源代码)

C++成绩管理系统实验报告(含源代码)

学生成绩管理系统设计报告

一、需求分析:

用数组或链表数据结构完成一个学生成绩管理系统,此系统的具体功能要求如下:

(1)学生信息录入功能

1)用户从键盘输入每个学生的信息:学号、姓名、性别、数学、英语、政治、程序设计基础、物理五门课成绩。

2)可插入一个或多个学生信息到当前编辑的班级数据中。

3) 可删除一个或多个学生信息。

●(2)文件保存功能

1)学生信息每一班存为一个数据文件,数据文件可在程序中打开、编辑和重新保存。

2)用户输入学生信息可随时保存数据文件。

(3)文件打开功能

1)程序只能对当前打开的数据文件进行编辑。

(4)查询功能

用户录入每个学生每门课程的分数;

●能够计算每个学生的各门功课总分和平均分,并按总分将成绩排序,显示每个学生的总

分和排名;

●计算全班各门功课的平均分,显示每门课程中低于平均分的每一个学生的学号,姓名,

性别,科目,成绩等信息;

●显示每门科目中,成绩在90分以上的学生信息。另外还输出每门科目中不及格的学生

信息;

●能按姓名或者学号查找,增加,删除和保存各个学生的信息。

(5)报表输出功能

1) 按学号输出一个班学生信息:学号、姓名、性别、数学、英语、政治、

程序设计基础、物理成绩和总成绩,到屏幕和文件。

2) 按总成绩输出从高到低输出学号、姓名信息。

注:以上功能以菜单形式供用户使用,并有一定的容错功能。

二、概要设计

整体框架:

整个学生成绩管理系统采用链表作为基本数据结构,创建一个类student用于保存学生的数据且是链表中的一个节点。类list作为保存整个链表之用。主函数通过switch语句来根据用户的需要连接各个模块,以实现用户的需要。

模块基本介绍:

1.用户输入模块

在此模块中,用户将根据菜单提示结合自己的需求输入一个0~11的值,来实现一定的功能。

2.学生信息录入模块

此模块可以让用户从键盘输入每个学生的信息:学号、姓名、性别、数学、英语、政治、程序设计基础、物理五门课成绩。用户可插入一个或多个学生信息到当前编辑的班级数据中。用户可删除一个或多个学生信息。

3.文件保存功能模块

用户在确定以录入的成绩无误之后,可以将学生信息以每一班为单位存为一个数据文件。用户输入的学生信息可随时保存数据文件。

4.文件打开功能模块

用户可以用此模块将数据文件在程序中打开、编辑,程序只能对当前打开的数据文件进行编辑。

5.查询功能模块

在此模块里,用户可实现以下操作:1.浏览所有学生信息;2.按学号查询学生信息;3.按姓名查询学生信息;4.查询一个班每个人的总成绩和平均成绩; 5.查询一个班某一门课每个人的总成绩和平均成绩;6)进行成绩的统计分析:包括总人数,每门课的最高成绩、最低成绩、平均成绩、各个分数段的人数(100-90、89-80、79-70、69-60、59-50、50以下)、及格人数。

6.报表输出功能模块

在此模块中,用户可以浏览所有学生的信息,或者可以按学号输出一个班学生信息:学号、姓名、性别、数学、英语、政治、程序设计基础、物理成绩和总成绩,到屏幕和文件。也可以按总成绩输出从高到低输出学号、姓名信息。

模块图:

三、详细设计

主要功能模块的算法设计思路:

1. 用户输入模块设计

提示用户输入一个0~11的值,并存储在一个整型变量m中。

2. 学生信息录入模块设计

通过应用list中的instu()函数,来新建一个链表中的节点,即一个新的学生信息,来进行成绩的录入功能。成绩修改功能,可以根据姓名或学号进行查询并修改相应的课程的成绩,使用了void search(char s[10],int)和void search1(char s[20],int)函数进行操作。search函数根据姓名查找,search1函数根据学号进行查找。因为学号和姓名,都是存储在字符数组中的,所以都是通过字符串的比较进行查找的。然后根据整形参数进行对应的课程成绩的修改。成绩删除功能,也是可以根据姓名或学号进行删除,查询的算法和成绩修改功能的查询方法是一样的,当找到要删除的节点时,因为节点都是在堆内存中保存的,所以可以直接delete掉,并将前一个节点的next指针指向被删掉的节点的next指针所指向的节点。

3. 文件保存功能模块

先提示用户输入保存文件的文件名及班级名称。文件的前两行分别是班级名称和成绩单的开头,然后通过ofstream变量output来进行学生信息的输出,一项一项的输出,并设定格式,直到输出节点为NULL为止,之后关闭output。

4. 文件打开功能模块

先提示用户输入要打开的数据文件的名称,然后通过一个ifstream变量input 来进行文件操作。首先判断文件是否存在,如果不存在则输出"File does not exist",并跳出switch语句。文件存在的话,则可以进行数据的存入了。因为数据文件具有固定的格式,即开头两行是班级名称和表头,则可以先用两次input.getline(temp,80);语句来将input设置到第三行,此时可以将数据通过input 读入链表中。先用input.eof()判断文件中是否有数据,若有数据,则进行数据的读入,直到文件结束。

5. 查询功能模块

可以根据姓名或学号进行查找,搜索方法和前几个模块相同。通过outstu1(char *n)和outstu(char *n)来进行输出。总成绩和平均成绩的查询通过函数void outsum(char *)和void outsum1(char *)来完成。通过函数scanall()来浏览所有学生的信息。通过函数think()来进行成绩的统计分析。

6. 报表输出功能模块

通过建立一个新的类class stucopy用于拷贝student的数据,并实现排序功能。创建一个stucopy stu[M]数组,将原链表的数据拷贝与数组中,然后用选择排序方法将数组排序,然后用output按照标准的格式输出或保存为数据文件。

四、程序结构

源代码:

# include # include # include

#include //用getch(); using namespace std;

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌Student 类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ class Student { public: char name[20]; char Id[20];

int Cnum; //C++课程得分 int Mnum; //数学课程得分 int Enum; //英语课程得分 int sum; //总分 Student * Next; void Input() { cout<<"\t\t 请输入学生的姓名:"; cin>>name; cout<<"\t\t 请输入学生的学号:"; cin>>Id; cout<<"\t\t 请输入C++课程的成绩:"; cin>>Cnum; cout<<"\t\t 请输入数学课程的成绩:"; cin>>Mnum;

cout<<"\t\t 请输入英语课程的成绩:"; cin>>Enum;

学生成绩管理系统

操作 查询

成绩统计

按总成绩排名

录入 增加 删除 修改

总成绩查询

姓名

每个学生的平均成绩 各科不及格的人数

输出所有学生的成绩

sum=Cnum+Mnum+Enum;

}

void ReadFile(istream & in)

{

in>>name>>Id>>Cnum>>Mnum>>Enum>>sum;

}

void Show()

{

cout<<"姓名:"<

}

};

//﹌﹌﹌﹌﹌﹌﹌﹌﹌Studentmassage类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌

class Studentmassage

{

public:

Studentmassage();

~Studentmassage();

void ShowMenu();

void Find();

void Save();

void ModifyItem();

void RemoveItem();

void Swap(Student *,Student *);

void Sort();

//void Unpass();

int ListCount();

//void Average();

void Display()

{

for(Student * p=Head->Next;p!=End;p=p->Next)

p->Show();

cout<<"输入任意字符!继续……";

getch();

}

void AddItem()

{

End->Input();

End->Next=new Student;

End=End->Next;

cout<<"添加成功!"<

cout<<"输入任意字符!继续……";

getch();

}

private:

Student * Head,* End;

ifstream in;

ofstream out;

Student *FindItem(char * name)

{

for(Student * p=Head;p->Next!=End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空

if(!strcmp(p->Next->name,name))

return p;

return NULL;

}

Student *FindID(char * Id)

{

for(Student * p=Head;p->Next!=End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空

if(!strcmp(p->Next->Id,Id))

return p;

return NULL;

}

};

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌构造函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌Studentmassage::Studentmassage()

{

Head=new Student;

Head->Next=new Student;

End=Head->Next;

in.open("sort.txt");

if(!in)

cout<<"这是一个新系统,无学生信息。请先输入。"<

else

{

while(!in.eof())

{

End->ReadFile(in);

if(End->name[0]=='\0')

break;

End->Next=new Student;

End=End->Next;

}

in.close();

cout<<"\t\t读取学生信息成功!"<

}

}

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌析构函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌Studentmassage::~Studentmassage()

{

Save();

for(Student * temp;Head->Next!=End;)

{

temp=Head->Next;

Head->Next=Head->Next->Next;

delete temp;

}

delete Head,End;

}

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌菜单﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌

void Studentmassage::ShowMenu()

{

cout<<"******************************************************************** ************"<

cout<<"〒〒〒〒〒〒〒〒〒〒☆学生成绩管理系统☆〒〒〒〒〒〒〒〒〒〒"<

cout<<"〒〒〒〒〒〒〒★★★★★★★★★★★★★★★★★〒〒〒〒〒〒〒"<

cout<<"〒〒〒〒〒〒〒〒〒★☆ 1.增加学生成绩☆★〒〒〒〒〒〒〒〒〒"<

cout<<"〒〒〒〒〒〒〒〒〒★☆ 2.显示学生成绩☆★〒〒〒〒〒〒〒〒〒"<

cout<<"〒〒〒〒〒〒〒〒〒★☆ 3.排序统计成绩☆★〒〒〒〒〒〒〒〒〒"<

cout<<"〒〒〒〒〒〒〒〒〒★☆ 4.查找学生成绩☆★〒〒〒〒〒〒〒〒〒"<

cout<<"〒〒〒〒〒〒〒〒〒★☆ 5.删除学生成绩☆★〒〒〒〒〒〒〒〒〒"<

cout<<"〒〒〒〒〒〒〒〒〒★☆ 6.修改学生信息☆★〒〒〒〒〒〒〒〒〒"<

cout<<"〒〒〒〒〒〒〒〒〒★☆0.安全退出系统☆★〒〒〒〒〒〒〒〒〒"<

cout<<"\n\t\t\n\t\t请选择:";

}

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌查找函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌

void Studentmassage::Find()

{

char name[20] ,Id[10];

int x;

Student * p=NULL;

cout<<"\n\t\t*********************************\n";

cout<<"\t\t※1.按学生的姓名查找\n\t\t※2.按学生学号查找";

cout<<"\n\t\t*********************************\n请选择:";

cin>>x;

switch(x)

{

case 1:{cout<<"\t\t请输入要查找的学生的姓名:";cin>>name;

if(p=FindItem(name))

{

p->Next->Show();

cout<<"输入任意字符!继续……";

getch();

}

else

{

cout<<"\t\t没有找到该姓名的学生!"<<'\n'<

cout<<"输入任意字符!继续……";

getch();

}

}

break;

case 2:

{

cout<<"\t\t请输入要查找的学生的学号:";cin>>Id;

if(p=FindID(Id))

{

p->Next->Show();

cout<<"输入任意字符!继续……";

getch();

}

else

{

cout<<"\t\t没有找到该学好的学生!"<<'\n'<

cout<<"输入任意字符!继续……";

getch();

}

}break;

}

}

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌修改信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌void Studentmassage::ModifyItem() //修改信息

{

char name[20];

Student * p=NULL;

cout<<"\t\t请输入要修改的人的姓名:";cin>>name;

if(p=FindItem(name))

{

cout<<"\t\t已找到学生的信息,请输入新的信息!"<

p->Next->Input();

cout<<"修改成功!"<

cout<<"输入任意字符!继续……";

getch();

}

else

{

cout<<"\t\t没有找到!"<

cout<<"输入任意字符!继续……";

getch();

}

}

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌删除信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌

void Studentmassage::RemoveItem() // 删除信息

{

char name[20];

Student * p=NULL,*temp=NULL;

cout<<"\t\t请输入要删除的学生的姓名:"<>name;

if(p=FindItem(name))

{

temp=p->Next;

p->Next=p->Next->Next;

delete temp;

cout<<"\t\t删除成功!"<

cout<<"输入任意字符!继续……";

getch();

}

else

{

cout<<"\t\t没有找到!"<

cout<<"输入任意字符!继续……";

getch();

}

}

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌

void Studentmassage::Swap(Student *p1, Student *p2)//交换两个combox变量的数据域{

Student *temp=new Student;

strcpy(temp->name,p1->name);

strcpy(temp->Id,p1->Id);

temp->Cnum=p1->Cnum;

temp->Mnum=p1->Mnum;

temp->Enum=p1->Enum;

temp->sum=p1->sum;

strcpy(p1->name,p2->name);

strcpy(p1->Id,p2->Id);

p1->Cnum=p2->Cnum;

p1->Mnum=p2->Mnum;

p1->Enum=p2->Enum;

p1->sum=p2->sum;

strcpy(p2->name,temp->name);

strcpy(p2->Id,temp->Id);

p2->Cnum=temp->Cnum;

p2->Mnum=temp->Mnum;

p2->Enum=temp->Enum;

p2->sum=temp->sum;

}

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌

int Studentmassage::ListCount()//统计当前链表的记录总数,返回一个整数{

if(! Head)

return 0;

int n=0;

for(Student * p=Head->Next;p!=End;p=p->Next)

{

n++;

}

return n;

}

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌

void Studentmassage::Sort()//对当前链表进行排序

{

cout <<"Sorting..."<

Student *p=NULL,*p1=NULL,*k=NULL;

int n=Studentmassage::ListCount();

if(n<2)

return;

for(p=Head->Next;p!=End;p=p->Next)

for(k=p->Next;k!=End;k=k->Next)

{

if(p->sum>k->sum)

{

Studentmassage::Swap(p,k);

}

}

cout <<"排序完成!"<

getch();

return;

}

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌保存函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌

void Studentmassage::Save()

{

out.open("sort.txt");

for(Student *p=Head->Next;p!=End;p=p->Next)

out<name<<"\t"<Id<<"\t"<Cnum<<"\t"<Mnum<<"\t"<Enum <<"\t"<sum<<'\n';

out.close();

}

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌主函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌

int main()

{

int x,i=0;

bool quit=false;

cout<<"\t\t§§§§§§§§§§§§§§§§§§§§§§§§§§"<

for(i=0;i<3;i++)

cout<<"\t\t◎\t\t\t\t\t\t ◎"<

cout<<"\t\t◎★★★★【欢迎进入学生成绩管理系统】★★★★◎"<

for(i=0;i<3;i++)

cout<<"\t\t◎\t\t\t\t\t\t ◎"<

cout<<"\t\t§§§§§§§§§§§§§§§§§§§§§§§§§§\n"<

Studentmassage Grade;

cout<<"按任意键开始……";

getch();

while(!quit)

{

//system("cls");

Grade.ShowMenu();

cin>>x;

switch(x)

{

case 0:quit=true;break;

case 1:Grade.AddItem();break;

case 2:Grade.Display();break;

case 3:Grade.Sort();break;

case 4:Grade.Find();break;

case 5:Grade.RemoveItem();break;

case 6:Grade.ModifyItem();break;

}

}

return 0;

}