高校学籍管理系统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
class COURSE //课程类
{
private:
static int coursenum; //课程数量
static char (*coursename)[20]; //课程名称
public:
static void LoadCourse() //从文件COURSE.DAT装入课程信息 {
ifstream f("course.dat");
f>>coursenum;
coursename=new char[coursenum][20];
for(int i=0; i f>>coursename; f.close(); } friend class STUDENT; friend class COLLEGE; }; int COURSE::coursenum=0; char (*COURSE::coursename)[20]=0; class STUDENT //学生类 { private: char num[20]; //学号 char name[20]; //姓名 char sex; //性别 char cname[20]; //班级 float *grade; //成绩(动态数组) float sum; //各科总分 STUDENT *next; public: STUDENT() { grade=new float[COURSE::coursenum]; next=0; } ~STUDENT() { delete []grade; } void Input() { sum=0; cout<<"学号:"; cin>>num; //输入学生一般信息 cout<<"姓名:"; cin>>name; cout<<"性别:"; cin>>sex; sex=toupper(sex); cout<<"班级:"; cin>>cname; for(int i=0; i { cout< sum+=grade; //计算总分 } } void Input(ifstream &f) { f>>num; f>>name; f>>sex; sex=toupper(sex); f>>cname; for(int i=0; i f>>grade; } f>>sum; } static void OutputT() { cout< for(int i=0; i cout< cout< } void Output() { cout< cout< cout< cout< for(int i=0; i cout< } cout< } void Output(ofstream &f) { f< f< f< f< for(int i=0; i f< } f< } friend class COLLEGE; }; class COLLEGE //学校类 { private: STUDENT *SL; //学生链表 void Clear(); int Find(char* ID,STUDENT **p1,STUDENT **p2); void COLLEGE::ValueS2ToS1(STUDENT &s1,STUDENT &s2); public: COLLEGE() { COURSEadCourse(); //装入课程信息 SL=new STUDENT(); //创建学生链表表头结点 } ~COLLEGE() { STUDENT *p=SL; //删除学生链表各个结点 while(p) { SL=p->next; delete p; p=SL; } } void Set(); //课程设置(增,删,改,存) void Add(); //增加学生 void Delete(); //删除学生 void Modify(); //修改学生 void Query(); //查询学生信息(按姓名,学号) void Print(); //输出所有学生信息 void Stat(); //统计课程平均成绩,课程合格率 void SumSort(); //按总分排名(高->低) void NumSort(); //按学号排序(低->高) void Save(); //学生数据存盘 void Load(); //装入学生数据 }; //增加学生 void COLLEGE::Add() { cout<<"\n** 增加学生信息**\n"; STUDENT *p=new STUDENT; //创建1个新学生结点 STUDENT *p2=SL; //查找学生链表表尾结点 while(p2->next)p2=p2->next; p2->next=p; //学生结点 p->Input(); //输入学生信息 } //查找学生结点(返回1-找到,0-未找到.结点指针由p1返回,p2为前看指针) int COLLEGE::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; } //删除学生 void COLLEGE:elete() { cout<<"\n** 删除学生**\n"; char No[20]; STUDENT *p1,*p2; cout<<"学号:"; cin>>No; if(!Find(No,&p1,&p2)) { cout<<"指定的学生没有找到!\n"; } else { p2->next=p1->next; //连接 delete p1; cout<<"正确删除!\n"; } } //修改学生 void COLLEGE::Modify() { cout<<"\n** 修改学生**\n"; char No[20]; STUDENT *p1,*p2; cout<<"学号:"; cin>>No; if(!Find(No,&p1,&p2)) { cout<<"指定的学生没有找到!\n"; } else { p1->Output(); //输出原来的学生信息(做提示) p1->Input(); //输入此学生信息(更新) cout<<"修改完成!\n"; } } /*承上*/ //查询学生信息 //按学号或姓名查找,如果找到显示该学生,如果未找到,也给出相应提示. void COLLEGE:uery() { cout<<"\n** 查询学生**\n"; STUDENT *p=SL->next; char No[20]; char Name[20]; char ch; do { cout<<"按学号查1,按姓名查2:"; cin>>ch; }while(ch!='1'&&ch!='2'); int flag=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"; } //输出所有学生信息 void COLLEGE:rint() { cout<<"\n** 输出学生信息**\n"; STUDENT *p=SL->next; STUDENT::OutputT(); //输出标题 while(p) //循环输出各位学生信息 { p->Output(); p=p->next; } } //学生数据存盘 void COLLEGE::Save() { ofstream f("student.dat"); STUDENT *p=SL->next; while(p) //遍历学生链表 { p->Output(f); //写入文件 p=p->next; } f.close(); cout<<"\n** 保存数据完成! **\n"; } void COLLEGE::Clear() { STUDENT *p=SL->next; while(p) { SL->next=p->next; delete p; p=SL->next; } } //装入学生数据 void COLLEGEad() { Clear(); ifstream f("student.dat"); STUDENT *p=SL; STUDENT *p2=new STUDENT; p2->Input(f); while(f) { p->next=p2; p=p->next; p2=new STUDENT; p2->Input(f); } delete p2; f.close(); } //统计课程平均成绩,课程合格率 void COLLEGE::Stat() { float *sum=new float[COURSE::coursenum]; //各科平均成绩 float *pass=new float[COURSE::coursenum]; //各科合格人数,/n=>合格率 int n=0; //学生人数 for(int i=0; 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 { cout< cout< } delete []sum; delete []pass; } void COLLEGE::ValueS2ToS1(STUDENT &s1,STUDENT &s2) { strcpy(s1.num,s2.num); //学号 strcpy(https://www.360docs.net/doc/134968632.html,,https://www.360docs.net/doc/134968632.html,); //姓名 s1.sex=s2.sex; //性别 strcpy(https://www.360docs.net/doc/134968632.html,ame,https://www.360docs.net/doc/134968632.html,ame); //班级 for(int i=0; i s1.grade=s2.grade; //成绩指针(动态数组) s1.sum=s2.sum; //各科总分 } //按总分排名(采用选择法排序),总分高->低 void COLLEGE::SumSort() { STUDENT *p1,*p2; p1=SL->next; while(p1) { p2=p1->next; while(p2) { if(p2->sum>p1->sum) { STUDENT t; ValueS2ToS1(t,*p1); ValueS2ToS1(*p1,*p2); ValueS2ToS1(*p2,t); } p2=p2->next; } p1=p1->next; } } void COLLEGE::NumSort() //按学号排序(低->高) { STUDENT *p1,*p2; p1=SL->next; while(p1) { p2=p1->next; while(p2) { if(strcmp(p2->num,p1->num)<0) //只要修改这里,其余同SumSort { STUDENT t; ValueS2ToS1(t,*p1); ValueS2ToS1(*p1,*p2); ValueS2ToS1(*p2,t); } p2=p2->next; } p1=p1->next; } } void main() { char ch; COLLEGE c; //定义大学对象 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 22 2 3、3运行结果参考 ☆☆ 高校学籍管理系统☆☆ 1-增加学生 2-删除学生 3-修改学生 4-查询学生 5-输出学生信息 6-综合统计(课程平均成绩,课程合格率 7-总分排序 8-学号排序 S-数据存盘 L-数据装入 Q-退出请选择(1-8,SLQ) ☆☆ 高校学籍管理系统☆☆ 1-增加学生 2-删除学生 3-修改学生 4-查询学生 5-输出学生信息 6-综合统计(课程平均成绩,课程合格率 7-总分排序 8-学号排序 S-数据存盘 L-数据装入 Q-退出请选择(1-8,SLQ):5 ** 输出学生信息** 学号姓名性别班级 C++ 英语高数总分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 ☆☆ 高校学籍管理系统☆☆ 1-增加学生 2-删除学生 3-修改学生 4-查询学生 5-输出学生信息 6-综合统计(课程平均成绩,课程合格率) 7-总分排序 8-学号排序 S-数据存盘 L-数据装入 Q-退出请选择(1-8,SLQ):7 ☆☆ 高校学籍管理系统☆☆ 1-增加学生 2-删除学生 3-修改学生 4-查询学生 5-输出学生信息 6-综合统计(课程平均成绩,课程合格率) 7-总分排序 8-学号排序 S-数据存盘 L-数据装入 Q-退出请选择(1-8,SLQ):5 ** 输出学生信息** 学号姓名性别班级 C++ 英语高数总分86103 wubin M M8601 85 87 92 264 86104 shijun M M8601 58 90 85 233 86101 chenkaijun M M8601 77 59 96 232 86105 wangzhuguo M M8601 66 70 86 222 86102 zhaowei F M8601 55 85 77 217 ☆☆ 高校学籍管理系统☆☆ 1-增加学生 2-删除学生 3-修改学生 4-查询学生 5-输出学生信息 6-综合统计(课程平均成绩,课程合格率) 7-总分排序 8-学号排序 S-数据存盘 L-数据装入 Q-退出请选择(1-8,SLQ):q Press any key to continun //查询学生信息 //按学号或姓名查找,如果找到显示该学生,如果未找到,也给出相应提示. void COLLEGE:uery() { cout<<"\n** 查询学生**\n"; STUDENT *p=SL->next; char No[20]; char Name[20]; char ch; do { cout<<"按学号查1,按姓名查2:"; cin>>ch; }while(ch!='1'&&ch!='2'); int flag=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"; } //输出所有学生信息 void COLLEGE:rint() { cout<<"\n** 输出学生信息**\n"; STUDENT *p=SL->next; STUDENT::OutputT(); //输出标题 while(p) //循环输出各位学生信息 { p->Output(); p=p->next; } } //学生数据存盘 void COLLEGE::Save() { ofstream f("student.dat"); STUDENT *p=SL->next; while(p) //遍历学生链表 { p->Output(f); //写入文件 p=p->next; } f.close(); cout<<"\n** 保存数据完成! **\n"; } void COLLEGE::Clear() { STUDENT *p=SL->next; while(p) { SL->next=p->next; delete p; p=SL->next; } } //装入学生数据 void COLLEGEad() { Clear(); ifstream f("student.dat"); STUDENT *p=SL; STUDENT *p2=new STUDENT; p2->Input(f); while(f) { p->next=p2; p=p->next; p2=new STUDENT; p2->Input(f); } delete p2; f.close(); } //统计课程平均成绩,课程合格率