资源描述
学生成绩管理系统
说明:该课程设计包含两个部分,一个为纯dos系统下控制台程序,用C++编写;另一个为有界面MFC项目。
目录
纯dos系统下控制台程序
1、 设计要求...........................................3
2、 设计分析...........................................3
3、 调试说明...........................................4
4、 源代码.............................................8
5、 试验总结..........................................21
有界面MFC项目
1、设计内容...........................................22
2、设计说明..........................................22
3、设计步骤..........................................22
4、运行演示..........................................27
5、试验总结..........................................29
纯dos系统下控制台程序
1、 设计要求
现有学生成绩信息,内容以下:
姓名 学号 语文 数学 英语
张明明 01 67 78 82
李成友 02 78 91 88
张辉灿 03 68 82 56
王露 04 56 45 77
陈东明 05 67 38 47
请用C/C++编写一系统,实现学生信息管理,软件入口界面应包含以下多个方面:
功效要求:
(1) 信息维护:
要求:学生信息数据要以文件形式保留,能实现学生信息数据维护。此模块包含子模块有:增加学生信息、删除学生信息、修改学生信息
(2) 信息查询:
要求:查询时可实现按姓名查询、按学号查询
(3) 成绩统计:
要求:A输入任意一个课程名(如数学)和一个分数段(如60--70),统计出在此分数段学生情况。
(4) 排序:能对用户指定任意课程名,按成绩升序或降序排列学生数据并显示排序结果(使用表格形式显示排序后输出结果)
其它要求:
(1) 只能使用C/C++语言,源程序要有合适注释,使程序轻易阅读
(2) 最少采取文本菜单界面(假如能采取图形菜单界面愈加好)
(3) 学生可自动增加新功效模块(视情况可另外加分)
(4)写出课程设计汇报,具体要求见相关说明文档
2、 设计分析
(1)需求分析:
该程序要能实现对学生成绩信息增加、删除、修改,实现对学生按姓名查询,按学号查询显示,对任意一个课程名和分数段学生人数进行输出并统计人数,最好还要依据用户需求对学生成绩排序。
(2)系统性能要求:
a. 系统安全、可靠;
b. 功效齐全;
c.操作方便、界面友好;
d.易于维护和扩充。
(3) 系统功效模块:
学生成绩管理系统包含:增加、删除、修改、显示、信息查询、成绩统计、排序多个部分组成。
学生成绩管理系统
(4)模块框架图
排序
成绩统计
信息查询
显示
修改
删除
增加
输入课程名和升降序排序
输入课程名和分数段统计
按姓名查询
按学号查询
3、 调试说明
运行程序后,现出来一个简练主界面。
若没有学生信息,显示“这是一个新系统,无学生信息,请先输入。”若已存在学生信息,显示“读取学生信息成功!”
一秒钟后,自动切入主菜单界面。
首先选择1,增加学生信息。
录入学生信息后选择4,显示学生信息。
选择2,删除学生信息,输入要删除学生姓名,这里我输入是王露,显示剩下几位同学信息。
选择3,修改学生信息,输入要修改学生姓名,然后输入新学生信息,这里我修改是张明明,显示修改后学生信息。
将张明明和王露信息重新输入。
输入5,信息查询,出来选择界面,“1、按学生姓名查找”、“2、按学生学号查找”,输入1,运行结果以下:
输入2,运行结果以下:
输入6,排序,显示选择界面,用户可依据需求选择科目和升降序,这里我是按语文成绩降序排序。
输入7,成绩统计,用户自行输入要统计科目和分数段进行统计。这里我统计是英语成绩在60—90学生。
4、 源程序代码
#include<iostream>
#include<fstream>
#include<iomanip>
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>
using namespace std ;
#define HEADER1 " -----------------------------学生成绩----------------------------\n"
#define HEADER2 " | 姓名 | 学号 | 数学 | 语文 | 英语 | 总分 |\n"
#define HEADER3 " |----------|----------|----------|----------|----------|----------|\n"
class Student //定义学生类
{
public:
char name[20] ;
char id[20] ;
int math ;
int chinese ;
int english ;
int sum ;
Student *next ;
void input() ;
void ReadFile(istream & in) ;
void show() ;
} ;
void Student::input() //输入学生信息函数
{
cout<<"\n\t\t请输入:"<<endl<<endl ;
cout<<"\t\t姓名:" ;
cin>>name ;
cout<<"\t\t学号:" ;
cin>>id ;
cout<<"\t\t数学成绩:" ;
cin>>math ;
cout<<"\t\t语文成绩:" ;
cin>>chinese ;
cout<<"\t\t英语成绩:" ;
cin>>english ;
sum = math + chinese + english ;
}
void Student::ReadFile(istream & in) //读取文件
{
in>>name>>id>>math>>chinese>>english>>sum ;
}
void Student::show() //输出学生信息
{
cout<<" |"<<setw(8)<<name<<" |"<<setw(6)<<id<<" |"<<setw(6)<<math<<" |"<<setw(6)<<chinese<<" |"<<setw(6)<<english<<" |"<<setw(7)<<sum<<" |"<<endl ;
cout<<" |----------|----------|----------|----------|----------|----------|\n" ;
}
class StudentMassage //定义学生信息类,包含各项处理功效
{
public:
StudentMassage() ;
~StudentMassage() ;
void ShowMenu() ;
void Display() ;
void AddItem() ;
void Find() ;
void save() ;
void ModifyItem() ;
void RemoveItem() ;
void Swap(Student *p1 , Student *p2) ;
void Sort() ;
int ListCount() ;
int Count() ;
private:
Student *Head , *End ;
ifstream in ;
ofstream out ;
Student *FindItem(char *name) ;
Student *FindId(char *id) ;
} ;
Student *StudentMassage::FindItem(char *name)
{
Student *p ;
for(p = Head ; p->next != End ; p = p->next)
if(!strcmp(p->next->name , name))
return p ;
return NULL ;
}
Student *StudentMassage::FindId(char *id)
{
Student *p ;
for(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<<"\n\t\t这是一个新系统,无学生信息,请先输入。"<<endl ;
else
{
while(!in.eof())
{
End->ReadFile(in) ;
if(End->name[0]=='\0')
break ;
End->next = new Student ;
End = End->next ;
}
in.close() ;
cout<<"\n\t\t读取学生信息成功!"<<endl ;
}
}
StudentMassage::~StudentMassage() //析构函数
{
Student *temp ;
save() ;
for(temp ; Head->next != End ; )
{
temp = Head->next ;
Head -> next = Head ->next->next ;
delete temp ;
}
delete Head , End ;
}
void StudentMassage::ShowMenu() //显示菜单
{
cout<<"\n\n\t\t\t\t 主菜单"<<endl<<endl<<endl ;
cout<<"\t\t****************************************"<<endl<<endl ;
cout<<"\t\t1、增加学生信息 2、删除学生信息"<<endl<<endl ;
cout<<"\t\t3、修改学生信息 4、显示学生信息"<<endl<<endl ;
cout<<"\t\t5、信息查询 6、排序"<<endl<<endl ;
cout<<"\t\t7、成绩统计 0、安全退出"<<endl<<endl ;
cout<<"\t\t****************************************"<<endl<<endl<<endl ;
cout<<"\t\t请选择:" ;
}
void StudentMassage::Display() //显示学生信息
{
Student *p ;
cout<<endl<<HEADER1<<HEADER2<<HEADER3 ;
for(p = Head->next ; p != End ; p = p->next)
p->show() ;
cout<<"\n\n输入任意字符,继续......" ;
getch() ;
}
void StudentMassage::AddItem() //添加学生信息
{
End->input() ;
End->next = new Student ;
End = End->next ;
cout<<"\n\t\t添加成功!"<<endl ;
cout<<"\n输入任意字符,继续......" ;
getch() ;
}
void StudentMassage::Find() //查找函数
{
char name[20] , id[20] ;
int x ;
Student *p = NULL ;
cout<<"\n\t\t****************************************\n" ;
cout<<"\t\t\t 1、按学生姓名查找"<<endl ;
cout<<"\t\t\t 2、按学生学号查找" ;
cout<<"\n\t\t****************************************\n\n\t\t请选择:" ;
cin>>x ;
switch(x)
{
case 1: //按姓名查找
{
cout<<"\n\t\t请输入要查找学生姓名:" ;
cin>>name ;
if(p = FindItem(name))
{
cout<<endl<<HEADER1<<HEADER2<<HEADER3 ;
p->next->show() ;
cout<<"\n请输入任意字符,继续......" ;
getch() ;
}
else
{
cout<<"\t\t没有找到该姓名学生!"<<endl<<endl ;
cout<<"请输入任意字符,继续......" ;
getch() ;
}
} break ;
case 2: //按学号查找
{
cout<<"\n\t\t请输入要查找学生学号:" ;
cin>>id ;
if(p = FindId(id))
{
cout<<endl<<HEADER1<<HEADER2<<HEADER3 ;
p->next->show() ;
cout<<"\n请输入任意字符,继续......" ;
getch() ;
}
else
{
cout<<"\n\t\t没有找到该学号学生!"<<endl<<endl ;
cout<<"请输入任意字符,继续......" ;
getch() ;
}
} break ;
}
}
void StudentMassage::ModifyItem() //修改学生信息
{
char name[20] ;
Student *p = NULL ;
cout<<"\n\t\t请输入要修改学生姓名:" ;
cin>>name ;
if(p = FindItem(name))
{
cout<<"\n\t\t已找到该学生,请输入新信息!"<<endl ;
p->next->input() ;
cout<<"\n\t\t修改成功!"<<endl ;
Display() ;
}
else
{
cout<<"\n\t\t没有找到!"<<endl ;
cout<<"\n输入任意字符!继续......." ;
getch() ;
}
}
void StudentMassage::RemoveItem() //删除学生信息
{
char name[20] ;
Student *p = NULL , *temp = NULL ;
cout<<"\n\t\t请输入要删除学生姓名:" ;
cin>>name ;
if(p = FindItem(name))
{
temp = p->next ;
p->next = p->next->next ;
delete temp ;
cout<<"\n\t\t删除成功!"<<endl ;
Display() ;
}
else
{
cout<<"\t\t没有找到!"<<endl ;
cout<<"输入任意字符!继续......" ;
getch() ;
}
}
int StudentMassage::ListCount() //返回统计学生总数
{
Student *p ;
int n = 0 ;
if(!Head)
return 0 ;
for(p = Head->next ; p != End ; p = p->next)
n ++ ;
return n ;
}
int StudentMassage::Count() //成绩统计
{
Student *p ;
int x , m , n ,count = 0 ;
if(!Head)
{
cout<<"\n\t\t没有资料能够统计!"<<endl ;
return 0 ;
}
cout<<"\n\t\t****************************************\n" ;
cout<<"\t\t\t 1、统计数学成绩"<<endl ;
cout<<"\t\t\t 2、统计语文成绩"<<endl ;
cout<<"\t\t\t 3、统计英语成绩" ;
cout<<"\n\t\t****************************************\n"<<endl ;
cout<<"\t\t请选择:" ;
cin>>x ;
switch(x)
{
case 1 :
{
cout<<"\n\t\t请输入分数段起始分数和终止分数:" ;
cin>>m ;
cin>>n ;
for(p = Head ; p != End ; p = p->next)
if(p->math >=m && p->math <= n)
{
count ++ ;
if(count == 1)
cout<<endl<<HEADER1<<HEADER2<<HEADER3 ;
p->show() ;
}
cout<<"\n\t\t数学成绩在"<<m<<"--"<<n<<"学生共有"<<count<<"人!\n"<<endl ;
cout<<"输入任意字符,继续......." ;
getch() ;
} ; break ;
case 2:
{
cout<<"\n\t\t请输入分数段起始分数和终止分数:" ;
cin>>m ;
cin>>n ;
for(p = Head ; p != End ; p = p->next)
if(p->chinese >=m && p->chinese <= n)
{
count ++ ;
if(count == 1)
cout<<endl<<HEADER1<<HEADER2<<HEADER3 ;
p->show() ;
}
cout<<"\n\t\t语文成绩在"<<m<<"--"<<n<<"学生共有"<<count<<"人!\n"<<endl ;
cout<<"输入任意字符,继续......." ;
getch() ;
} ; break ;
case 3:
{
cout<<"\n\t\t请输入分数段起始分数和终止分数:" ;
cin>>m ;
cin>>n ;
for(p = Head ; p != End ; p = p->next)
if(p->english >=m && p->english <= n)
{
count ++ ;
if(count == 1)
cout<<endl<<HEADER1<<HEADER2<<HEADER3 ;
p->show() ;
}
cout<<"\n\t\t英语成绩在"<<m<<"--"<<n<<"学生共有"<<count<<"人!\n"<<endl ;
cout<<"输入任意字符,继续......." ;
getch() ;
} ; break ;
}
}
void StudentMassage::Swap(Student *p1 , Student *p2) //交p1,p2学生信息
{
Student *temp = new Student ;
strcpy(temp->name , p1->name) ;
strcpy(temp->id , p1->id) ;
temp->math = p1->math ;
temp->chinese = p1->chinese ;
temp->english = p1->english ;
temp->sum = p1->sum ;
strcpy(p1->name , p2->name) ;
strcpy(p1->id , p2->id) ;
p1->math = p2->math ;
p1->chinese = p2->chinese ;
p1->english = p2->english ;
p1->sum = p2->sum ;
strcpy(p2->name , temp->name) ;
strcpy(p2->id , temp->id) ;
p2->math = temp->math ;
p2->chinese = temp->chinese ;
p2->english = temp->english ;
p2->sum = temp->sum ;
}
void StudentMassage::Sort() //排序
{
Student *p = NULL , *p1 = NULL , *k = NULL ;
int n = StudentMassage::ListCount() , x , y ;
if(n < 2)
{
cout<<"数据较少,无法排序!"<<endl ;
return ;
}
cout<<"\n\t\t**************************************\n" ;
cout<<"\t\t\t 1、按数学成绩排序"<<endl ;
cout<<"\t\t\t 2、按语文成绩排序"<<endl ;
cout<<"\t\t\t 3、按英语成绩排序"<<endl ;
cout<<"\t\t\t 4、按总分排序" ;
cout<<"\n\t\t**************************************\n\n\t请选择:" ;
cin>>x ;
switch(x)
{
case 1:
{
cout<<"\n\t\t**************************************\n" ;
cout<<"\t\t\t 1、按降序排序\n\t\t\t 2、按升序排序" ;
cout<<"\n\t\t**************************************\n\n\t请选择:" ;
cin>>y ;
if(y == 1)
{
for(p = Head->next ; p != End ; p = p->next)
for(k = p->next ; k != End ; k = k->next)
{
if(p->math < k->math)
StudentMassage::Swap(p , k) ;
}
cout<<"\n\t\t排序完成!"<<endl ;
StudentMassage::Display() ;
getch() ;
}
else
{
for(p = Head->next ; p != End ; p = p->next)
for(k = p->next ; k != End ; k = k->next)
{
if(p->math > k->math)
StudentMassage::Swap(p , k) ;
}
cout<<"\n\t\t排序完成!"<<endl ;
StudentMassage::Display() ;
getch() ;
}
} ; break ;
case 2:
{
cout<<"\n\t\t**************************************\n" ;
cout<<"\t\t\t 1、按降序排序\n\t\t\t 2、按升序排序" ;
cout<<"\n\t\t**************************************\n\n\t请选择:" ;
cin>>y ;
if(y == 1)
{
for(p = Head->next ; p != End ; p = p->next)
for(k = p->next ; k != End ; k = k->next)
{
if(p->chinese < k->chinese)
StudentMassage::Swap(p , k) ;
}
cout<<"\n\t\t排序完成!"<<endl ;
StudentMassage::Display() ;
getch() ;
}
else
{
for(p = Head->next ; p != End ; p = p->next)
for(k = p->next ; k != End ; k = k->next)
{
if(p->chinese > k->chinese)
StudentMassage::Swap(p , k) ;
}
cout<<"\n\t\t排序完成!"<<endl ;
StudentMassage::Display() ;
getch() ;
}
} ; break ;
case 3:
{
cout<<"\n\t\t**************************************\n" ;
cout<<"\t\t\t 1、按降序排序\n\t\t\t 2、按升序排序" ;
cout<<"\n\t\t**************************************\n\n\t请选择:" ;
cin>>y ;
if(y == 1)
{
for(p = Head->next ; p != End ; p = p->next)
for(k = p->next ; k != End ; k = k->next)
{
if(p->english < k->english)
StudentMassage::Swap(p , k) ;
}
cout<<"\n\t\t排序完成!"<<endl ;
StudentMassage::Display() ;
getch() ;
}
else
{
for(p = Head->next ; p != End ; p = p->next)
for(k = p->next ; k != End ; k = k->next)
{
if(p->english > k->english)
StudentMassage::Swap(p , k) ;
}
cout<<"\n\t\t排序完成!"<<endl ;
StudentMassage::Display() ;
getch() ;
}
} ; break ;
case 4:
{
cout<<"\n\t\t**************************************\n" ;
cout<<"\t\t\t 1、按降序排序\n\t\t\t 2、按升序排序" ;
cout<<"\n\t\t**************************************\n\n\t请选择:" ;
cin>>y ;
if(y == 1)
{
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<<"\n\t\t排序完成!"<<endl ;
StudentMassage::Display() ;
getch() ;
}
else
{
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<<"\n\t\t排序完成!"<<endl ;
StudentMassage::Display() ;
getch() ;
}
} ; break ;
}
}
void StudentMassage::save() //存入文件
{
out.open("sort.txt");
for(Student *p=Head->next;p!=End;p=p->next)
out<<p->name<<"\t"<<p->id<<"\t"<<p->math<<"\t"<<p->chinese<<"\t"<<p->english<<"\t"<<p->sum<<'\n';
out.close();
}
void main()
{
int x ;
bool quit = false ;
cout<<"\n\n\n\n\n\n\n\n" ;
cout<<"\t\t********************************************"<<endl ;
cout<<"\t\t 欢迎使用学生成绩管理系统!"<<endl ;
cout<<"\t\t********************************************"<<endl ;
StudentMassage Grade ;
Sleep(1000) ;
while(!quit)
{
system("cls") ;
Grade.ShowMenu() ;
cin>>x ;
switch(x)
{
case 0:quit = true ; break ;
case 1:Grade.AddItem() ; break ;
case 2:Grade.RemoveItem() ; break ;
case 3:Grade.ModifyItem() ; break ;
case 4:Grade.Display() ; break ;
case 5:Grade.Find() ; break ;
case 6:Grade.Sort() ; break ;
case 7:Grade.Count() ; break ;
}
}
}
5、 试验总结
经过编写这个纯dos系统下控制台程序,加深了我对怎样用C++编写一个简单应用程序了解。首先要对程序设计要求有一个比较明确认识,然后系统分析和系统设计,最终是代码设计和调试。程序实现上,设计了简单菜单界面,将各个功效集中出来根据程序编写标准,便于查询。
有界面MFC项目
1、 设计内容
以学生成绩管理系统为例,经过对简单应用
展开阅读全文