当前位置:文档之家› 高校学籍管理系统C++程序设计

高校学籍管理系统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 <fstream.h>#include <iomanip.h>#include <string.h>#include <ctype.h>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<coursenum; 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<COURSE::coursenum; i++) //输入学生各科成绩{cout<<COURSE::coursename<<"成绩:"; cin>>grade;sum+=grade; //计算总分}}void Input(ifstream &f){f>>num;f>>name;f>>sex; sex=toupper(sex);f>>cname;for(int i=0; i<COURSE::coursenum; i++) //输出学生各科成绩,总分{f>>grade;}f>>sum;}static void OutputT(){cout<<setw(10)<<"学号"<<setw(20)<<"姓名"<<setw(5)<<"性别"<<setw(10)<<"班级";for(int i=0; i<COURSE::coursenum; i++)cout<<setw(7)<<COURSE::coursename;cout<<setw(10)<<"总分"<<endl;}void Output(){cout<<setw(10)<<num; //输出学生一般信息cout<<setw(20)<<name;cout<<setw(5)<<sex;cout<<setw(10)<<cname;for(int i=0; i<COURSE::coursenum; i++) //输出学生各科成绩,总分{cout<<setw(7)<<grade;}cout<<setw(10)<<sum<<endl;}void Output(ofstream &f){f<<setw(10)<<num; //输出学生一般信息f<<setw(20)<<name;f<<setw(5)<<sex;f<<setw(10)<<cname;for(int i=0; i<COURSE::coursenum; i++) //输出学生各科成绩,总分{f<<setw(7)<<grade;}f<<setw(10)<<sum<<endl;}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,找到1if(ch=='1') //按学号查{cout<<"学号:"; cin>>No;while(p)if(strcmp(p->num,No)==0){flag=1; break;}elsep=p->next;}else //按姓名查{cout<<"姓名:"; cin>>Name;while(p)if(strcmp(p->name,Name)==0){flag=1; break;}elsep=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<COURSE::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<COURSE::coursenum; i++){cout<<setprecision(4)<<setiosflags(ios::showpoint);cout<<COURSE::coursename<<"平均:"<<sum/n<<",合格率:"<<pass/n*100.<<"%"<<endl;}delete []sum;delete []pass;}void COLLEGE::ValueS2ToS1(STUDENT &s1,STUDENT &s2) {strcpy(s1.num,s2.num); //学号strcpy(,); //姓名s1.sex=s2.sex; //性别strcpy(ame,ame); //班级for(int i=0; i<COURSE::coursenum; 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:3C++英语高数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 23、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):qPress 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,找到1if(ch=='1') //按学号查{cout<<"学号:"; cin>>No;while(p)if(strcmp(p->num,No)==0){flag=1; break;}elsep=p->next;}else //按姓名查{cout<<"姓名:"; cin>>Name;while(p)if(strcmp(p->name,Name)==0){flag=1; break;}elsep=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<COURSE::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<COURSE::coursenum; i++){cout<<setprecision(4)<<setiosflags(ios::showpoint);cout<<COURSE::coursename<<"平均:"<<sum/n<<",合格率:"<<pass/n*100.<<"%"<<endl;}delete []sum;delete []pass;}void COLLEGE::ValueS2ToS1(STUDENT &s1,STUDENT &s2){strcpy(s1.num,s2.num); //学号strcpy(,); //姓名s1.sex=s2.sex; //性别strcpy(ame,ame); //班级for(int i=0; i<COURSE::coursenum; 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:3C++英语高数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 23、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-增加学生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-修改学生5-输出学生信息6-综合统计(课程平均成绩,课程合格率) 7-总分排序8-学号排序S-数据存盘L-数据装入Q-退出请选择(1-8,SLQ):qPress any key to continun[/code] 页: [1]。

相关主题