c++课程设计之学生选修课程系统设计
《C++程序设计》课程设计报告学生选修课程系统设计
一、需求分析
计算机技术作为信息化的核心技术受到全社会的普遍重视。如今,计算机的使用也已不再局限于科学计算,它已进入人类社会的各个领域并发挥着越来越重要的作用。深入掌握计算机专业知识、具有良好系统设计与分析能力的计算机高级专业人才在社会上深受欢迎。而系统设计与分析能力的培养需要通过实践训练才能获得。通过计算机对一些系统的管理已经成为一种系统、便捷的方式。本课程设计就是用C++设计学生选课系统的问题,实现对学生选课的管理操作。
本课程设计的目的是设计一个学生选修课程系统的程序,用来实现对学生成绩的管理,其中包括学生信息的文件读入、添加、查询、保存、删除以及相应的课程信息管理。程序设计了两个类,其中一个包含学生的学号、姓名、选课数以及选修总学分,另一个则包含了课程的信息,包括课程编号、课程名称、课程性质、课时等等。然后通过数组、向量、集合等来实现学生选课信息的记录、保存,删除等相关操作从而达到管理学生选课的。
二、设计要求
假定有n门课程,每门课程有课程编号、课程名称、课程性质、总学时、授课学时、实验学时、学分、开课学期等信息。学生可以按要求(如每个学生总学分不得少于20、没学期不能超过3门课程,每门课程不得超过50个人,但不能少于10否则该课程不开设)自由选课。使之能提供一些功能:
1)课程信息录入功能
2)课程信息浏览功能
3)查询功能:(按课程性质查询、按课程学分查询,查询每个学生的选修信息、查询每门
课程的选修信息等)
4)学生选修课程
5)修改课程或选课信息(根据课程编号或名称修改课程信息、根据学生姓名修改选课信
息);
6)删除课程或选课信息(根据课程编号或名称删除课程信息、根据学生姓名删除选课信
息);
三、总体设计
我们设计一个程序对学生选课信息进行保存,对学生的选课信息进行可执行操作,如添加、删除、查询等等。
该程序包括以下功能模块:
1)学生信息添加模块:能够输入学生基本信息并保存到文件中。
2)查看模块:显示所有可选修课程的信息。
3)查询:显示所有符合要求的课程信息。
4)选课:显示学生已选课程信息和选课,删除已选课程信息。
5)退出系统。
为了完善系统,我们还添加了一个登录界面。考虑到添加课程信息的功能只适合老师,因此我们设置了添加课程的权限设置(必须输入密码)。我们建立了两个文件用来保存学生信息和课程信息。(student.txt和subject.txt)
该系统功能说明:
1)系统以菜单方式工作
2)课程信息录入功能(课程信息用文件保存)--输入
3)课程信息浏览功能--输出
4)查询功能:(至少一种查询方式)--算法
5)按学分查询
6)按课程性质查询
7)学生选修课程(可选项)
四、详细设计
该成序包含的主要函数功能说明:
void XuanKeMenu(); // 选课主菜单函数
int find(int no);
void Save();
void DL(); //登录界面的函数
void MainMenu();
void output();
void Load(); //载入文件信息的函数
void Load2();
void quit();
void add();
void ChaXun();
void chaxun1();
void chaxun2();
void xuanke();
void tq1(); //提取选课编号的函数
void tq2();
void AddStuInfo(); //添加学生信息的函数
void SaveStuInfo(); //保存学生信息到文件中
void del(); //删除已选课程信息的函数主要的数据结构表:
五、程序代码
#include
#include
#include
#include
#include
#define N 10
using namespace std;
int F;
class subject //建立一个课程类,保存课程信息{
public:
int num;
char name[30];
char cha[20];
int Time,time1,time2,xf;
char kkxq[20];
}S;
class student //建立一个学生类,保存学生信息{
public:
char nam[10];
char num[15];
int zxf;
int cnt;
}Stu;
vector
set
vector
set
void XuanKeMenu(); //声明一个选课主菜单函数
int find(int no);
void Save();
void DL(); //声明一个登录界面的函数
void MainMenu();
void output();
void Load(); //声明载入文件信息的函数
void Load2();
void quit();
void add();
void ChaXun();
void chaxun1();
void chaxun2();
void xuanke();
void tq1(); //声明提取信息的函数
void tq2();
void AddStuInfo(); //声明添加学生信息的函数
void del();
void AddStuInfo()
{
FILE *fp;
fp=fopen("d:\\student.txt","a");fseek(fp,0,2); //打开学生信息文件system("cls");
cout< cout<<"\t\t***************************************************"< cout<<"\t\t***************** 学生选课系统 ******************"< cout<<"\t\t***************************************************"< cout<<"\t\t\t请输入学号:";cin>>Stu.num; cout<<"\t\t\t请输入姓名:";cin>>Stu.nam; https://www.360docs.net/doc/749470843.html,t=Stu.zxf=0; fprintf(fp,"%s %s %d %d\n",Stu.num,Stu.nam,https://www.360docs.net/doc/749470843.html,t,Stu.zxf); //存入文件z.push_back (Stu); T.clear(); TT.push_back(T); //用向量指向学生信息fclose(fp); } void add() { string password1,password2; char password[20];int _cnt=0; FILE *fp; fp=fopen("d:\\password","r"); fscanf(fp,"%s",password); password2=password; fclose(fp); system("cls"); cout< cout<<"\t ********************************************************"< cout<<"\t ********************** 课程信息 *******************"< cout<<"\t ********************************************************"< cout<<"\t 请输入密码:"; //对添加课程进行权限设置char ch; while(ch=getch()) { if(ch==13) break; if(ch != 8) { putchar('*'); password1 += ch;_cnt++;} else { if(_cnt) { password1.erase(password1.end()-1); _cnt--; system("cls"); cout< cout<<"\t ********************************************************"< cout<<"\t ********************** 课程信息 *******************"< cout<<"\t ********************************************************"< cout<<"\t 请输入密码:"; int x=_cnt; while(x--)cout<<"*"; } } } if(password1 != password2){ cout<<"\n\n\t\t\t 密码错误!!!";getch(); MainMenu(); } A: system("cls"); cout< cout<<"\t ********************************************************"< cout<<"\t ********************** 课程信息 *******************"< cout<<"\t ********************************************************"< cout<<"\t\t\t请输入课程编号:"; cin>>S.num; cout<<"\t\t\t请输入课程名称:"; cin>>https://www.360docs.net/doc/749470843.html,; cout<<"\t\t\t请输入课程性质:"; cin>>S.cha; cout<<"\t\t\t请输入总课时:"; cin>>S.Time; cout<<"\t\t\t请输入授课学时"; cin>>S.time1; cout<<"\t\t\t请输入上机学时(实验学时):"; cin>>S.time2; cout<<"\t\t\t请输入学分:"; cin>>S.xf; cout<<"\t\t\t请输入开课学期:"; cin>>S.kkxq; v.push_back(S); Save(); cout< string s; cin>>s; if(s[0]=='Y'||s[0]=='y') goto A; else MainMenu(); } void Save() //保存已选的课程信息 { FILE *fp; fp=fopen("d:\\subject.txt","w"); for(int i=0;i fprintf(fp,"%d %s %s %d %d %d %d %s\n",v[i].num,v[i].name, v[i].cha,v[i].Time,v[i].time1,v[i].time2,v[i].xf,v[i].kkxq); fclose(fp); } void SaveStuInfo() //保存学生信息 { FILE *fp; fp=fopen("d:\\student.txt","w"); for(int i=0;i { fprintf(fp,"%s %s %d %d",z[i].num,z[i].nam,z[i].cnt,z[i].zxf); for(it=TT[i].begin(); it!=TT[i].end(); it++) fprintf(fp, " %d",*it); fprintf(fp,"\n"); } fclose(fp); } void quit() //退出函数 { exit(1); } void ChaXun() //查询主菜单函数 { system("cls"); cout< cout<<"\t ********************************************************"< cout<<"\t ********************** 课程信息 *******************"< cout<<"\t ********************************************************"< cout<<"\t\t\t\t请选择查询方式:\n\t\t\t\t[1]学分查询\n\t\t\t\t[2]课程性质查询\n\t\t\t\t[0]返回主菜单\n\n"; cout<<"\t\t\t\t请选择[0-2]:"; int choice; cin>>choice; if(choice>=0&&choice<3) { if(choice==1) chaxun1(); if(choice==2) chaxun2(); if(choice==0) MainMenu(); } else ChaXun(); } void chaxun1() //按学分方式查询 { system("cls");int cnt=0; cout< cout<<"\t ********************************************************"< cout<<"\t ********************** 课程信息 *******************"< cout<<"\t ********************************************************"< cout<<"\t 请输入学分:"; int key; cin>>key; cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 " <<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"< cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时" <<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"< for(int i=0;i { if(cnt&&cnt%10==0) { cout< ========================================================"<< endl; cout<<"\t 按任意键查看下一页"; getch(); system("cls"); cout< cout<<"\t ********************************************************"< cout<<"\t ********************** 课程信息 *******************"< cout<<"\t ********************************************************"< cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 " <<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"< cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时" <<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"< } if(v[i].xf==key) { cnt++; printf("\t %3d%12s%8s%4d%6d%8d%8d%7s\n", v[i].num,v[i].name,v[i].cha,v[i].Time,v[i].time1,v[i].time2,v[i].xf,v[i].kk xq); } } cout< string s; cin>>s; if(s[0]=='Y'||s[0]=='y') chaxun1(); else MainMenu(); } void chaxun2() //按课程性质查询 { system("cls");int cnt=0; cout< cout<<"\t ********************************************************"< cout<<"\t ********************** 课程信息 *******************"< cout<<"\t ********************************************************"< cout<<"\t 请输入课程性质:"; char key[20]; cin>>key; cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 " <<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"< cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时" <<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"< for(int i=0;i { if(cnt&&cnt%10==0) { cout< ========================================================"<< endl; cout<<"\t 按任意键查看下一页"; getch(); system("cls"); cout< cout<<"\t ********************************************************"< cout<<"\t ********************** 课程信息 *******************"< cout<<"\t ********************************************************"< cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 " <<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"< cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时" <<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"< } if(!strcmp(v[i].cha,key)) { cnt++; printf("\t %3d%12s%8s%4d%6d%8d%8d%7s\n", v[i].num,v[i].name,v[i].cha,v[i].Time,v[i].time1,v[i].time2,v[i].xf,v[i].kk xq); } } cout< string s; cin>>s; if(s[0]=='Y'||s[0]=='y') chaxun2(); else MainMenu(); } void tq1(char *str) //提取出选课时输入的课程编号 { string t=""; int i=0,cont=0; while(str[i]) { if(isalnum(str[i])) t += str[i]; else { int tmp=atoi(t.c_str()); if(TT[F].find(tmp)!=TT[F].end()) {t="";i++; continue;} z[F].zxf += v[find(tmp)].xf; TT[F].insert(tmp); t="";cont++; } i++; // } int tmp=atoi(t.c_str());//cout< if(TT[F].find(tmp)==TT[F].end()) { cont++; TT[F].insert(tmp); z[F].zxf += v[find(tmp)].xf; } z[F].cnt += cont; } void xuanke() //选课函数:执行选课功能{ char str[100]; system("cls"); cout< cout<<"\t ********************************************************"< cout<<"\t ********************** 课程信息 *******************"< cout<<"\t ********************************************************"< cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 " <<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"< cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时" <<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"< for(int i=0; i { if(i&&i%10==0) { cout< ========================================================"<< endl; cout< if(strcmp(str,"")) tq1(str);//, system("cls"); cout< cout<<"\t ********************************************************"< cout<<"\t ********************** 课程信息 *******************"< cout<<"\t ********************************************************"< cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 " <<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"< cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时" <<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"< } printf("\t %3d%12s%8s%4d%6d%8d%8d%7s\n", v[i].num,v[i].name,v[i].cha,v[i].Time,v[i].time1,v[i].time2,v[i].xf,v[i].kk xq); } cout< ========================================================"; cout< if(strcmp(str,"")) tq1(str); SaveStuInfo(); if(z[F].zxf<60) { cout<<"\t\t你所选课程的总学分少于60,是否继续选课![Y/N]"; string x; cin>>x; if(x[0]=='y'||x[0]=='Y') xuanke(); else XuanKeMenu(); } else XuanKeMenu(); } int find(int no) //寻找函数,找到想要的课程编号{ for(int i=0;i if(v[i].num==no) return i; } void display(int i) { printf("\t %3d%12s%8s%4d%6d%8d%8d%7s\n", v[i].num,v[i].name,v[i].cha,v[i].Time,v[i].time1,v[i].time2,v[i].xf,v[i].kk xq); } void XuanKeMenu() //选课菜单函数 { system("cls"); int choice,l=0; cout< cout<<"\t ********************************************************"< cout<<"\t ********************** 学生选课 *******************"< cout<<"\t ********************************************************"< cout<<"\t 姓名:"< cout<<"门课程"<<" 已选课程总学分:"< cout<<"\t ========================================================"< cout<<"\t 已选课程信息:\n"; cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 " <<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"< cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时" <<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"< for(it=TT[F].begin();it!=TT[F].end();it++,l++) { if(l&&l%10==0) { cout< ========================================================"<< endl; cout<<"\t [1 ]开始选课 [2] 删除已选课程 [3] 下一页 [0] 返回请选择[0/3]:"; cin>>choice; getchar(); if(choice==1) xuanke(); else if(choice==2) del(); else if(choice==0) MainMenu(); else if(choice==3) ; else XuanKeMenu(); system("cls"); cout< cout<<"\t ********************************************************"< cout<<"\t ********************** 学生选课 *******************"< cout<<"\t ********************************************************"< cout<<"\t 姓名:"< cout<<"门课程"<<" 已选课程总学分:"< cout<<"\t ========================================================"< cout<<"\t 已选课程信息:\n"; cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 " <<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"< cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时" <<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"< } display(find(*it)); } cout< ========================================================"<< endl; cout<<"\t [1] 开始选课 [2] 删除已选课程 [0] 返回请选择[0/2]:"; cin>>choice; getchar(); if(choice==1) xuanke(); else if(choice==2) del(); else if(choice==0) MainMenu(); else XuanKeMenu(); } void tq2(char *str) //提取函数:提前删除时输入的课程编号{ string t=""; int i=0,cont=0; while(str[i]) { if(isalnum(str[i])) t += str[i]; else { int tmp=atoi(t.c_str()); set if(_t!=TT[F].end()) { t=""; TT[F].erase(_t); z[F].cnt--; z[F].zxf-=v[find(tmp)].xf; } } i++; } int tmp=atoi(t.c_str()); set if(_t!=TT[F].end()) { t=""; TT[F].erase(_t); z[F].cnt--; z[F].zxf-=v[find(tmp)].xf; } } void del() //删除已选课程信息 { int m,l=0,k=0; char str[100]; system("cls"); cout< cout<<"\t ********************************************************"< cout<<"\t ********************** 学生选课 *******************"< cout<<"\t ********************************************************"< cout<<"\t 姓名:"< cout<<"门课程"<<" 已选课程总学分:"< cout<<"\t ========================================================"< cout<<"\t 已选课程信息:\n"; cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 " <<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"< cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时" <<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"< for(it=TT[F].begin();it!=TT[F].end();it++,l++) { if(l&&l%10==0) { cout< ========================================================"<< endl; cout<<"\t\t\t\t请输入要删除的课程的编号:";gets(str); if(strcmp(str,"")) tq2(str); system("cls"); cout< cout<<"\t ********************************************************"< cout<<"\t ********************** 学生选课 *******************"< cout<<"\t ********************************************************"< cout<<"\t 姓名:"< cout<<"门课程"<<" 已选课程总学分:"< cout<<"\t ========================================================"< cout<<"\t 已选课程信息:\n"; cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 " <<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"< cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时" <<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"< } display(find(*it)); } cout<<"\t\t\t\t请输入要删除的课程的编号:";gets(str); if(strcmp(str,"")) tq2(str); SaveStuInfo(); XuanKeMenu(); } void Load() //载入函数:载入课程信息(文件此前已建立){ FILE *fp1; bool f=1; fp1=fopen("d:\\subject.txt","r");if(fp1==NULL) f=0; while(f&&!feof(fp1)) { fscanf(fp1,"%d%s%s%d%d%d%d%s",&S.num,https://www.360docs.net/doc/749470843.html,,S.cha,&S.Time,&S.time1,&S.time2 ,&S.xf,S.kkxq); v.push_back(S); } fclose(fp1); } void Load2() //载入学生信息(文件此前已建立){ FILE *fp; fp=fopen("d:\\student.txt","r"); while(!feof(fp)) { int x; fscanf(fp,"%s%s%d%d",Stu.num,&Stu.nam,&https://www.360docs.net/doc/749470843.html,t,&Stu.zxf); z.push_back(Stu); T.clear(); for(int j=0;j fscanf(fp,"%d",&x),T.insert(x); TT.push_back(T); } fclose(fp); } void output() //显示函数:将课程信息输出到屏幕{ system("cls"); cout< cout<<"\t ********************************************************"< cout<<"\t ********************** 课程信息 *******************"< cout<<"\t ********************************************************"< cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 " <<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"< cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时" <<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"< for(int i=0; i { if(i&&i%10==0) { cout< ========================================================"<< endl; cout<<"\t 按任意键查看下一页"; getch(); system("cls"); cout< cout<<"\t ********************************************************"< cout<<"\t ********************** 课程信息 *******************"< cout<<"\t ********************************************************"< cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 " <<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"< cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时" <<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"<