当前位置:文档之家› c++课程设计之学生选修课程系统设计之令狐文艳创作

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<iostream>#include<vector>#include<set>#include<string>#include<conio.h>#define N 10using 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 <subject> v; //声明一个指向课程信息的向量vector <student> z; //声明一个指向学生信息的向量set <int> T; //建立一个集合vector <set<int> > TT; //建立一个向量集合set <int> ::iterator it; //建立一个迭代器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<<endl<<endl<<endl<<endl<<endl;cout<<"\t\t***************************************************"<<endl;cout<<"\t\t***************** 学生选课系统******************"<<endl;cout<<"\t\t***************************************************"<<endl<<endl;cout<<"\t\t\t请输入学号:";cin>>Stu.num;cout<<"\t\t\t请输入姓名:";cin>>Stu.nam;t=Stu.zxf=0;fprintf(fp,"%s %s %d %d\n",Stu.num,Stu.nam,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<<endl<<endl<<endl;cout<<"\t****************************************************** **"<<endl;cout<<"\t ********************** 课程信息*******************"<<endl;cout<<"\t****************************************************** **"<<endl<<endl;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<<endl<<endl<<endl;cout<<"\t****************************************************** **"<<endl;cout<<"\t ********************** 课程信息*******************"<<endl;cout<<"\t****************************************************** **"<<endl<<endl;cout<<"\t 请输入密码:";int x=_cnt;while(x--)cout<<"*";}}}if(password1 != password2){ cout<<"\n\n\t\t\t 密码错误!!!";getch(); MainMenu(); }A: system("cls");cout<<endl<<endl<<endl;cout<<"\t****************************************************** **"<<endl;cout<<"\t ********************** 课程信息*******************"<<endl;cout<<"\t****************************************************** **"<<endl<<endl;cout<<"\t\t\t请输入课程编号:";cin>>S.num;cout<<"\t\t\t请输入课程名称:";cin>>;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<<endl<<"\t 是否继续添加[Y/N]:";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<v.size();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<z.size();i++){fprintf(fp,"%s %s %d %d",z[i].num,z[i].nam,z[i].cn t,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<<endl<<endl<<endl;cout<<"\t****************************************************** **"<<endl;cout<<"\t ********************** 课程信息*******************"<<endl;cout<<"\t****************************************************** **"<<endl<<endl;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<<endl<<endl<<endl;cout<<"\t****************************************************** **"<<endl;cout<<"\t ********************** 课程信息*******************"<<endl;cout<<"\t****************************************************** **"<<endl<<endl;cout<<"\t 请输入学分:";int key;cin>>key;cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 "<<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"<<endl;cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时"<<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"<<endl<<endl;for(int i=0;i<v.size();i++){if(cnt&&cnt%10==0){cout<<endl<<"\t====================================================== =="<< endl;cout<<"\t 按任意键查看下一页"; getch();system("cls");cout<<endl<<endl<<endl;cout<<"\t****************************************************** **"<<endl;cout<<"\t ********************** 课程信息*******************"<<endl;****************************************************** **"<<endl<<endl;cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 "<<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"<<endl;cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时"<<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"<<endl<<endl;}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].kkxq);}}cout<<endl<<"\t 是否继续查询[Y/N]:";string s; cin>>s;if(s[0]=='Y'||s[0]=='y') chaxun1();else MainMenu();}void chaxun2() //按课程性质查询{system("cls");int cnt=0;cout<<endl<<endl<<endl;cout<<"\t****************************************************** **"<<endl;cout<<"\t ********************** 课程信息*******************"<<endl;****************************************************** **"<<endl<<endl;cout<<"\t 请输入课程性质:";char key[20];cin>>key;cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 "<<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"<<endl;cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时"<<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"<<endl<<endl;for(int i=0;i<v.size();i++){if(cnt&&cnt%10==0){cout<<endl<<"\t====================================================== =="<< endl;cout<<"\t 按任意键查看下一页"; getch();system("cls");cout<<endl<<endl<<endl;cout<<"\t****************************************************** **"<<endl;cout<<"\t ********************** 课程信息*******************"<<endl;cout<<"\t****************************************************** **"<<endl<<endl;cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 "<<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"<<endl;cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时"<<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"<<endl<<endl;}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].kkxq);}}cout<<endl<<"\t 是否继续查询[Y/N]:";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<<t<<"";system("pause");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<<endl<<endl;cout<<"\t****************************************************** **"<<endl;cout<<"\t ********************** 课程信息*******************"<<endl;cout<<"\t****************************************************** **"<<endl<<endl;cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 "<<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"<<endl;cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时"<<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"<<endl<<endl;for(int i=0; i<v.size(); i++){if(i&&i%10==0)cout<<endl<<"\t====================================================== =="<< endl;cout<<endl<<"\t 请输入所选课程编号:";gets(str);if(strcmp(str,"")) tq1(str);//,system("cls");cout<<endl<<endl;cout<<"\t****************************************************** **"<<endl;cout<<"\t ********************** 课程信息*******************"<<endl;cout<<"\t****************************************************** **"<<endl<<endl;cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 "<<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"<<endl;cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时"<<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"<<endl<<endl;}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].kkxq);}cout<<endl<<"\t====================================================== ==";cout<<endl<<"\t 请输入所选课程编号:";gets(str);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<v.size();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].kkxq);}void XuanKeMenu() //选课菜单函数{system("cls");int choice,l=0;cout<<endl<<endl;cout<<"\t****************************************************** **"<<endl;cout<<"\t ********************** 学生选课*******************"<<endl;****************************************************** **"<<endl<<endl;cout<<"\t 姓名:"<<z[F].nam<<" 学号:"<<z[F].num<<" 已选 "<<z[F].cnt;cout<<"门课程"<<" 已选课程总学分:"<<z[F].zxf<< endl;cout<<"\t====================================================== =="<<endl;cout<<"\t 已选课程信息:\n";cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 "<<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"<<endl;cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时"<<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"<<endl<<endl;for(it=TT[F].begin();it!=TT[F].end();it++,l++){if(l&&l%10==0){cout<<endl<<"\t====================================================== =="<< 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<<endl<<endl;****************************************************** **"<<endl;cout<<"\t ********************** 学生选课*******************"<<endl;cout<<"\t****************************************************** **"<<endl<<endl;cout<<"\t 姓名:"<<z[F].nam<<" 学号:"<<z[F].num<<" 已选 "<<z[F].cnt;cout<<"门课程"<<" 已选课程总学分:"<<z[F].zxf<< endl;cout<<"\t====================================================== =="<<endl;cout<<"\t 已选课程信息:\n";cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 "<<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"<<endl;cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时"<<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"<<endl<<endl;}display(find(*it));}cout<<endl<<"\t====================================================== =="<< 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<int>::iterator _t=TT[F].find(tmp);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<int>::iterator _t=TT[F].find(tmp);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<<endl<<endl;cout<<"\t****************************************************** **"<<endl;cout<<"\t ********************** 学生选课*******************"<<endl;cout<<"\t****************************************************** **"<<endl<<endl;cout<<"\t 姓名:"<<z[F].nam<<" 学号:"<<z[F].num<<" 已选 "<<z[F].cnt;cout<<"门课程"<<" 已选课程总学分:"<<z[F].zxf<< endl;cout<<"\t====================================================== =="<<endl;cout<<"\t 已选课程信息:\n";cout<<"\t 课程"<<" "<<" 课程 "<<"课程"<<" "<<" 总 "<<" "<<"授课"<<" "<<" 实验或 "<<" "<<"学分"<<" "<<"开课"<<endl;cout<<"\t 编号"<<" "<<" 名称 "<<"性质"<<" "<<"学时"<<" "<<"学时"<<" "<<"上机学时"<<" "<<"学分"<<" "<<"学期"<<endl<<endl;for(it=TT[F].begin();it!=TT[F].end();it++,l++){if(l&&l%10==0){cout<<endl<<"\t====================================================== =="<< endl;令狐文艳cout<<"\t\t\t\t请输入要删除的课程的编号:";gets(str);if(strcmp(str,"")) tq2(str);system("cls");cout<<endl<<endl;cout<<"\t****************************************************** **"<<endl;令狐文艳。

相关主题