《C++学生选课系统(25页).doc》由会员分享,可在线阅读,更多相关《C++学生选课系统(25页).doc(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-C+学生选课系统-第 23 页摘要本课程设计的目的是设计一个学生选修课程系统的程序,用来实现对学生成绩的管理,其中包括学生信息的文件读入、添加、查询、保存、删除以及相应的课程信息管理。程序设计了两个类,其中一个包含学生的学号、姓名、选课数以及选修总学分,另一个则包含了课程的信息,包括课程编号、课程名称、课程性质、课时等等。然后通过数组、向量、集合等来实现学生选课信息的记录、保存,删除等相关操作从而达到管理学生选课的。因为这次课程设计,我们可以熟练的使用C+语言来完成一个学生选课管理系统。但是编写过程中难免会遇到错误,希望老师给予指导。目 录1 需求分析12 概要设计12.1 对象设计12.2
2、 设计优缺点13 详细设计23.1总体设计思路23.2 类定义23.3 宏定义33.4文件操作函数33.5用户操作函数33.6 其他重要函数34测试结果及运行效果45系统开发所用到的技术6参考文献7附录 全部代码81 需求分析 计算机技术作为信息化的核心技术受到全社会的普遍重视。如今,计算机的使用也已不再局限于科学计算,它已进入人类社会的各个领域并发挥着越来越重要的作用。深入掌握计算机专业知识、具有良好系统设计与分析能力的计算机高级专业人才在社会上深受欢迎。而系统设计与分析能力的培养需要通过实践训练才能获得。通过计算机对一些系统的管理已经成为一种系统、便捷的方式。本课程设计就是用C+设计学生选
3、课系统的问题,实现对学生选课的管理操作。本课程设计的目的是设计一个学生选修课程系统的程序,用来实现对学生成绩的管理,其中包括学生信息的文件读入、添加、查询、保存、删除以及相应的课程信息管理。程序设计了两个类,其中一个包含学生的学号、姓名、选课数以及选修总学分,另一个则包含了课程的信息,包括课程编号、课程名称、课程性质、课时等等。然后通过数组、向量、集合等来实现学生选课信息的记录、保存,删除等相关操作从而达到管理学生选课的。2 概要设计2.1 对象设计把学生和学科信息设计成类student和类subject,通过文件操作函数对输入的学生和学科信息进行读取和存放。2.2 设计优缺点优点:1. 人性
4、化的程序提示语言,程序提示语言较人性化,不仅大多为祈使语句、疑问句,而且提示明确,具有较强的明确的指导作用。程序提示不仅层次分明,提示方式多样,而且提示信息井然有序,更加有利于用户顺利、准确地进行程序的操作。2.所有的操作大多是在内存中实现,增加操作的速度,十分的方便。 缺点:1. 程序虽然经过多次精简,但仅仅是形式上、小范围的精简,仍未得到本质上的精简,即未找到更加简单、更加高效、更加合理、更小占用的资源的算法。2. 程序仍然存在不合理的地方,例如程序某些部分输入错误会导致程序中止或转向其他功能模块,即程序建议用户注意提示,进行合理的准确的输入,这样更有利于管理工作。3 详细设计3.1总体设
5、计思路通过对课题的分析,程序的要求是设计选修课管理系统,对选修课程能够进行录入和修改操作等,要求有主界面和退出功能。首先,考虑到程序的数据输入,可以设置一个课程增加选项,通过该界面,进行选修课的录入和修改操作,最后将录入的课程存到相应的文件中。然后定义各种函数的功能包括:查看、查询、删除等。另一个为选课界面,该界面学生可以进行课程选择和浏览查询等操作。在进行该操作之前需要对保存的文件进行读取,然后对其中的东西进行查询等。在学生选好课程以后,可以将选好的课程保存于相应的文件中,以便下次进行修改。通过函数的层层调用来实现程序的逻辑结构。中间通过文件的打开和关闭实现对文件内部所包含的数据操作。为了方
6、便用户控制管理,又添加了一些更人性化的功能如人工调试,运行配置等功能。文件存储信息的方式更是简化了程序结构,使程序读起来更容易懂。除此之外,本系统采用分块实现功能,将要实现的增加课程信息、修改课程信息、删除课程信息、增加学生信息和修改学生信息等功能分别用不同的子程序来完成,这样不仅方便了我们程序调试,更提高了程序的移植性。3.2 类定义class subject /建立一个课程类,保存课程信息class student /建立一个学生类,保存学生信息函数:该程序包含的主要函数功能说明:void XuanKeMenu(); / 选课主菜单函数int find(int no); void Save
7、(); 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();/删除已选课程信息的函数void sum();3.3
8、宏定义#define N 103.4文件操作函数void AddStuInfo();/添加学生信息的函数void SaveStuInfo();/保存学生信息到文件中3.5用户操作函数/该函数根据用户的选择,完成指定的操作void DL()/登录界面void MainMenu()/系统主菜单void output()/显示函数:将课程信息输出到屏幕void AddStuInfo()/增加学生信息,并保存在文件中void add()/增加课程信息,并保存在文件中void del()/删除已选课程信息void ChaXun() /查询主菜单函数void xuanke() /选课函数:执行选课功能vo
9、id sum()/统计函数,统计并输出文件中的数据3.6 其他重要函数void Load()/载入函数:载入课程信息(文件此前已建立)void Load2()/载入学生信息(文件此前已建立)void Save()/保存已选的课程信息void SaveStuInfo()/保存学生信息void quit()/退出函数void chaxun1()/按学分方式查询void chaxun2()/按课程性质查询void tq1(char *str)/提取出选课时输入的课程编号int find(int no)/寻找函数,找到想要的课程编号void display(int i)/输出函数void tq2(ch
10、ar *str)/提取函数:提前删除时输入的课程编号4 测试结果及运行效果运行程序后,登陆界面登陆学号,进入登陆后的界面,在其中可以选择查看课程信息、添加课程信息、查询课程信息、学生选课、统计情况和退出。按照提示输入0-5和Enter键进入下级菜单,或者退出程序。图4-1登陆后的界面输入1进入查看课程信息页面后,给出存放在文件类的所有课程信息,按y和Enter键停留界面,按n和Enter退出。图4-2 进入查看课程信息界面在主菜单中选择2,进入添加课程信息界面。图4-3 添加课程时的界面在主菜单中选4,学生选课界面。图4-4 学生选课时的界面在登陆界面输入exit退出系统。图4-5 退出系统时
11、的界面5 系统开发所用到的技术操作系统: Windows 7开发软件: Microsoft Visual Studio 2013技术:功能模块(函数);向量;文件保存及读取。模块:是抽象的概念,按照功能划分模块,尽可能保证每个模块互相独立。这个一般同程序的逻辑设计有关,同具体语言关系不大。函数:一般都有有明确的定义,有明确的语法。用来完成相对独立功能和程序。向量(Vector):Vector 是C+标准程序库中的一个类,可视为会自动扩展容量的数组,以循序(Sequential)的方式维护变量集合。vector的特色包括支持随机存取,在集合尾端增删元素很快,但是在集合中间增删元素比较费时。vec
12、tor是C+标准程序库中的众多容器(container)之一,除此之外还有list、set、map、等等。 vector以模板(泛型)方式实现,可以存储任何类型的变量,包括用户自定义的数据型态。文件操作:C语言对文件的处理一般有两种方法,缓冲文件系统和非缓冲文件系统。在文件系统中,系统对文件进行读写之前首先在内存区开辟一个称作缓冲区的专用内存区域。在缓冲文件系统中,系统对文件进行读写之前首先在内存区开辟一个称作缓冲区的专用内存区域。从内存向磁盘写文件时必须先写入缓冲区,装满缓冲区后才一起写到磁盘上去;从磁盘读文件时必须先把一批数据读到缓冲区(充满缓冲区),然后再从缓冲区将数据逐个送到用户数据区
13、。在非缓冲文件系统中,文件的处理不自动开辟确定大小的缓冲区,而是由程序设定的缓冲区。一般用缓冲文件系统进行的输入/输出。用非缓冲文件系统进行的输入/输出称为低级(低层)输入/输出。ANSI C标准采用缓冲文件系统,现代的操作系统也广泛采用缓冲型文件系统。参考文献1 李素若. C+面向对象程序设计.北京:中国水利水电出版社,2013.2 曾辉.王更生. C+程序设计实训教程.北京:北京邮电大学出版社,20113 揣锦华等编.C+程序设计语言.西安: 西安电子科技大学出版社,20114 张素琴主编.C+程序设计语言.北京:清华大学出版社,20105 邓飞,李瑶主编C+程序设计.北京科海电子出版社
14、20096 李军民等编.C+程序设计语言.西安: 西安电子科技大学出版社,2011附录 全部代码#include#include#include#include#include#include #include#define N 10using namespace std;int F;class subject /建立一个课程类,保存课程信息public:int num;char name30;char cha20;int Time, time1, time2, xf;char kkxq20;S;class student /建立一个学生类,保存学生信息public:char nam10;ch
15、ar num15;int zxf;int cnt;Stu;vector v; /声明一个 指向课程信息的向量vector z; /声明一个 指向学生信息的向量set T; /建立一个 集合vector set TT; /建立一个 向量集合set :iterator it; /建立一个 迭代器void XuanKeMenu(); /声明一个 选课主菜单函数int find(int no);void Save();void DL(); /声明一个登录界面的函数void MainMenu();void output();void Load(); /声明载入文件信息的函数void Load2();vo
16、id quit();void add();void ChaXun();void chaxun1();void chaxun2();void xuanke();void tq1(); /声明提取信息的函数void tq2();void AddStuInfo(); /声明添加学生信息的函数void del();void sum();void AddStuInfo()FILE *fp;fp = fopen(d:student.txt, a); fseek(fp, 0, 2); /打开学生信息文件system(cls);cout endl endl endl endl endl;cout tt* en
17、dl;cout tt* 学生选课系统 * endl;cout tt* endl endl;cout Stu.num;cout Stu.nam;St = Stu.zxf = 0;fprintf(fp, %s %s %d %dn, Stu.num, Stu.nam, St, Stu.zxf); /存入文件z.push_back(Stu); T.clear(); TT.push_back(T); /用向量指向学生信息fclose(fp);void add()A: system(cls);cout endl endl endl;cout t * endl;cout t * 课 程 信 息 * endl
18、;cout t * endl endl;cout S.num;cout S.name;cout S.cha;cout S.Time;cout S.time1;cout S.time2;cout S.xf;cout S.kkxq;v.push_back(S);Save();cout endl s;if (s0 = Y | s0 = y) goto A;else MainMenu();void Save() /保存已选的课程信息FILE *fp;fp = fopen(d:subject.txt, w);for (unsigned int i = 0; iv.size(); i+)fprintf(f
19、p, %d %s %s %d %d %d %d %sn, vi.num, vi.name,vi.cha, vi.Time, vi.time1, vi.time2, vi.xf, vi.kkxq);fclose(fp);void SaveStuInfo() /保存学生信息FILE *fp;fp = fopen(d:student.txt, w);for (unsigned int i = 0; iz.size(); i+)fprintf(fp, %s %s %d %d, zi.num, zi.nam, t, zi.zxf);for (it = TTi.begin(); it != TTi.end
20、(); 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 tttt请选择查询方式:ntttt1学分查询ntttt2课程性质查询ntttt0返回主菜单nn;cout choice;if (choice = 0 & choice3)if (choice = 1) cha
21、xun1();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 key;cout t 课程 课程 课程 总 授课 实验或 学分 开课 endl;cout t 编号 名称 性质 学时 学时 上机学时 学分 学期 endl endl;for (unsigned
22、 int i = 0; iv.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 (vi.xf = key)cnt+;printf(t %3d%12s%8
23、s%4d%6d%8d%8d%7sn,vi.num, vi.name, vi.cha, vi.Time, vi.time1, vi.time2, vi.xf, vi.kkxq);cout endl s;if (s0 = Y | s0 = y) chaxun1();else MainMenu();void chaxun2() /按课程性质查询system(cls); int cnt = 0;cout endl endl endl;cout t * endl;cout t * 课 程 信 息 * endl;cout t * endl endl;cout key;cout t 课程 课程 课程 总 授
24、课 实验或 学分 开课 endl;cout t 编号 名称 性质 学时 学时 上机学时 学分 学期 endl endl;for (unsigned int i = 0; iv.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 编号
25、 名称 性质 学时 学时 上机学时 学分 学期 endl endl;if (!strcmp(vi.cha, key)cnt+;printf(t %3d%12s%8s%4d%6d%8d%8d%7sn,vi.num, vi.name, vi.cha, vi.Time, vi.time1, vi.time2, vi.xf, vi.kkxq);cout endl s;if (s0 = Y | s0 = y) chaxun2();else MainMenu();void tq1(char *str) /提取出选课时输入的课程编号string t = ;int i = 0, cont = 0;while
26、(stri)if (isalnum(stri) t += stri;elseint tmp = atoi(t.c_str();if (TTF.find(tmp) != TTF.end() t = ; i+; continue; zF.zxf += vfind(tmp).xf;TTF.insert(tmp); t = ; cont+;i+;int tmp = atoi(t.c_str();if (TTF.find(tmp) = TTF.end()cont+;TTF.insert(tmp);zF.zxf += vfind(tmp).xf;zF.cnt += cont;void xuanke() /
27、选课函数:执行选课功能char str100;system(cls);cout endl endl;cout t * endl;cout t * 课 程 信 息 * endl;cout t * endl endl;cout t 课程 课程 课程 总 授课 实验或 学分 开课 endl;cout t 编号 名称 性质 学时 学时 上机学时 学分 学期 endl endl;for (unsigned int i = 0; iv.size(); i+)if (i&i % 10 = 0)cout endl t = endl;cout endl t 请输入所选课程编号:; gets(str);if (s
28、trcmp(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%7sn,vi.num, vi.name, vi.cha, vi.Time, vi.time1, vi.time2, vi.xf, vi.kkxq);cout endl t =;cout endl t 请输入所选课程编号:; gets(str);if (strcmp(str, ) tq1(str);SaveStuInfo();cout x;if (x0 = y | x0 = Y) xuanke();else XuanKeMenu();int find(int no) /寻找函数,找到想要的课程编号for (unsi