




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
23C+程序设计第14章 C+课程设计本章主要内容l 秒表程序设计l 万年历程序设计l 学生成绩管理系统设计l 教工趣味抽奖程序本章教学目标l 掌握C+程序的设计方法和步骤。l 熟悉C+实用程序组成及设计方法。14.1 秒表程序设计14.1.1 设计目的通过开发秒表程序,进一步熟悉C+语言标准函数的使用,掌握类和对象的定义和使用方法。14.1.2 设计要求1设计一个径赛分组计时用的秒表程序。2程序主要功能是:先确定本组比赛的人数;按任意键开始计,再按任意键依次记录每个人的时间;最后,显示每个人的时间。3随时显示秒表的时间。14.1.3 设计内容1方法一:按一般程序设计(1)分析通过系统时间来完成计时。开始计时时,取系统时间,按任意键分别取第1个人、第2个人的系统时间,与开始时的系统时间相减,即可得到每个人的时间。把每个人的时间存放到一个数组中。程序最后显示每个人的时间。数组totaltime存储每个人的时间(单位:秒)。系统时间通过系统函数clock()函数获取,此函数在time.h中。开始时的按任意键,通过getch()函数实现;取每个人时间的任意键,通过kbhit()函数实现;这两个函数都在conio.h中。清除显示的时间用b实现。(3)程序执行说明程序执行时,提示输入每组竞赛的人数,如图14-1所示。图14-1 初始界面输入人数后,提示“按任意键开始!”屏幕更新显示时间(单位秒),提示“按任意键取时间,按n/N键终止!”,如图14-2所示。图14-2 取成绩界面取完每个人的成绩后,最后显示本组所有人的成绩,如图14-3所示。在取成绩的过程中,可以随时按n键终止。图14-3 最后界面(4)程序的完善此程序基本上完成了设计要求,但还可以从一下几个方面进行完善:l 运行一次可以取多组成绩;l 对输入的人数进行越界检查;l 采用类和对象。2方法二:按类和对象设计(1)分析定义一个秒表类StopWatch,其数据成员为:时Hour、分Min、秒Sec、百分秒Psec,存储每个人的时间数据:H10、M10、S10、P10,记录每组人数Num及实际人数Numsj。其主要成员函数为:取成绩函数GetTime()、打印成绩函数PrintTime()、更新时间函数Update()、显示时间函数Display()等。主函数的功能是:输入每组的人数,然后取每个人的成绩,最后打印每个人的成绩。时间取自系统,通过clock()函数实现,通过更新函数Update()把时间转换为时分秒和毫秒。Display()在屏幕的同一行显示时间。颜色设置通过系统函数system(color att)实现。color att是设置屏幕的前景色和背景色,其使用格式为:color attr。attr指定屏幕输出的颜色属性。颜色属性由两个十六进制数组成,第一个是前景色,第二个是背景色。每个数字的取值含义如表14-1所示。表14-1 color命令参数值的颜色含义attr 的值颜色attr 的值颜色attr 的值颜色0黑色6黄色C淡红色1蓝色7白色D淡紫色2绿色8灰色E淡黄色3湖蓝色9淡蓝色F亮白色4红色A浅绿色5紫色B淡浅绿色(2)程序代码(3)程序执行说明程序执行时,提示输入每组竞赛的人数。输入人数后,提示“按任意键开始!”屏幕更新显示时间(单位秒),提示“按任意键取时间,按n/N键终止!”,取完每个人的成绩后,最后显示本组所有人的成绩,最后提示是否继续下一组,如图14-4所示。图14-4 秒表2界面另外,当输入人数不在1-10之间时,会提示重新输入;在取成绩过程中,可以随时按n键终止。(4)程序的完善此程序较好地完成了设计要求,但还可以从一下几个方面进行完善:l 对于短跑径赛,可以事先把每个跑道上的人员姓名录入。本组结束后,根据名次确定每个跑道上人员的成绩,并把这个成绩保存。本次径赛结束时,可以把所有参加径赛的前n名找出来。l 对于长跑径赛,只需要记录每个名次上的人员姓名。源程序说明:1.程序的流程程序的流程(主函数的流程和功能)如图所示:输入班级信息主界面输入基本信息分组计时显示成绩退出系统结束用户登陆开始主函数代码如下:#include#include#include #include#include#includeusing namespace std; string user=Admin;string password=123;char filename15=; / 存放文件名struct stuint xh;char xm10;float cj;x61=0,0;int num;void main() char yn,choice;system(color F9);coutnnnttt欢 迎 登 陆 径 赛 成 绩 管 理 系 统 endlendlendl; InputUserName();InputPassWord();Inputbjxx(); / 输入班级基本信息dosystem(cls);system(color 1f);cout*endl;cout* 欢 迎 使 用 径 赛 程 序 *endl;cout*endlendl;cout 1. 输入学生基本信息 endlendl;cout 2. 分组计时 endlendl;cout 3. 显示径赛成绩 endlendl;cout 0. 退出系统 endlendl;cout*endl;coutchoice;switch(choice)case 1:Inputxsxx();break;case 2:fzjishi();break;case 3:Printxx();case 0:break;coutyn; while(yn=n | yn=N);2.数据设计(1)学生信息:学号、姓名和成绩存放在一个结构体数组x中,数组x为全局变量,可以供每个功能使用。struct stuint xh;char xm10;float cj;x61=0,0;(2)用户名和密码:存放在全局对象user和password中。string user=Admin;string password=123;(3)文件名:存放在一个全局字符型数组filename中。3.程序的功能程序的功能:用户登陆、输入班级信息、学生基本信息输入、分组计时和显示学生成绩。(1)用户登陆:是操作的安全措施,通过输入用户名和密码来实现的。(2)输入班级信息:是为了产生存放学生信息的文件名。(3)学生基本信息输入:输入学生的学号和姓名。(4)分组计时:按组取每个人的径赛成绩。(5)显示学生成绩:按要求输出学生的径赛成绩。4.程序功能及代码(1)用户登陆用户登陆功能由用户名输入函数InputUserName()和密码输入函数InputPassWord()实现。用户名输入函数InputUserName()的流程如图所示:与设置的用户名比较三次不对就结束程序提示输入用户名函数代码如下:void InputUserName()string str; int check=0; printf(ntttt 用户名: ); for(int n=3;n0;n-)cinstr; if(!pare(user) check=1; break;else printf( 用户名不正确, 请重新输入: ); if(!check)coutendl对不起,您已经输入了三次, ;cout请查证后再进入!endlendl; exit(1);密码输入函数InputPassWord()的流程如图所示,该函数在输入密码时,调用了hide()函数,使输入的密码在屏幕上显示为“*”。与设置的密码比较三次不对就结束程序提示输入密码函数代码如下:string hide()string str; char mm20; int index=0; while(1) char ch; ch=getch(); if(ch=8) if(index!=0) coutchar(8) char(8); index-; else if(ch=r) mmindex=0; coutendl; break; else cout*; mmindex+=ch; str=mm; return str;void InputPassWord()string pw; int check=0; int n=3;printf(ntttt 密 码: ); dopw=hide(); if(!pare(password) system(cls); coutnnnttt欢迎进入径赛成绩管理系统!endl0); if(!check)coutendl对不起,您已经输入了三次, cout请查证后再进入!endltm_year+1900;if(tblock-tm_mon8)docout 请输入年级(year-1或;coutyear-2或;coutyear-3nj;if(atoi(nj)year-1 | atoi(nj)year-3)coutyear-1 | atoi(nj)year-3 );elsedocout 请输入年级(year或;coutyear-1或;coutyear-2nj;if(atoi(nj)year | atoi(nj)year-2)coutyear | atoi(nj)year-2 );void Inputxbzy(char xbzy) / 输入系别、专业编号fstream outfile;struct xuexchar xiname20,zhuanye1020; xx10;int i,j;char xb3,zy3;outfile.open(Xuexiaoxinxi.dat,ios:in);if(!outfile)coutXuexiaoxinxi.dat cant open.n;abort();outfile.read(char *)xx,sizeof(xx);coutnnt编号t系名n ;i=0;while(strcmp(xxi.xiname,)!=0)coutti+1txxi.xinamen;i+;coutxb;coutnnt编号t专业名n ;i=atoi(xb)-1;j=0;while(strcmp(xxi.zhuanyej,)!=0)couttj+1txxi.zhuanyejn;j+;coutzy;strcat(xbzy,xb);strcat(xbzy,zy);outfile.close();void Inputxxjbxx() / 输入学校基本信息,存入数组xx中fstream outfile;struct xuexchar xiname20,zhuanye1020;xx10=;int i,j,num,zynum;outfile.open(Xuexiaoxinxi.dat,ios:out);if(!outfile)coutXuexiaoxinxi.dat cant open.n;abort();cout 您是第一次使用本系统,请建立教学系的有关信息!nn;do / 限制输入的系数 coutnum;if(num10)coutt 系数越界,请输入1-10!endl;while(num10);for(i=0;inum;i+)cout 请输入第 i+1xxi.xiname;coutnn 请输入各系的专业名称!n;for(i=0;inum;i+)coutn 下面输入 xxi.xiname 各专业的名称nn;do / 限制输入的专业数 coutzynum;if(zynum10)coutt 专业数越界,请输入1-10!endl;while(zynum10);for(j=0;jzynum;j+)cout 请输入第 j+1xxi.zhuanyej;outfile.write(char *)xx,sizeof(xx);outfile.close();system(color F9);coutnnnttt欢 迎 登 陆 径 赛 成 绩 管 理 系 统 endlendlendl;void Inputbjxx() / 输入班级基本信息产生文件名char nianji5,xbzy6=,bj3;fstream outfile;outfile.open(Xuexiaoxinxi.dat,ios:in);if(!outfile)Inputxxjbxx(); / 输入学校基本信息strcpy(filename,);cout 请输入班级基本信息:n;Inputnjxx(nianji);strcat(filename,nianji);Inputxbzy(xbzy);strcat(filename,xbzy);coutbj;strcat(filename,bj);班级信息输入后显示系统的主菜单:1. 输入学生基本信息2. 分组计时3. 显示径赛成绩0. 退出系统可以根据需要是执行相应的功能。(3)输入学生基本信息输入学生基本信息由函数Inputxsxx()实现,其流程如图所示:提示输入班级人数循环输入学生姓名,学号可以自动产生数组x打开学生信息文件保存学生信息,关闭文件函数代码如下:void Inputxsxx() / 输入学生基本信息fstream outfile;int i,num;outfile.open(filename,ios:out);if(!outfile)coutfilename cant open.n;abort();x0.xh=1;coutnum;cout下面请输入每个人的姓名。n;cout学号t姓名n;for(i=0;inum;i+)coutxi.xhxi.xm;xi+1.xh=xi.xh+1;xi.xh=0;outfile.write(char *)x,sizeof(x);outfile.close();(4)分组计时分组计时功能由函数fzjishi()实现,其流程如图所示:提示输入组人数循环获取每个学生的成绩数组totaltime打开学生信息文件循环输入每个名次的学号循环输出每个学生的成绩,并把成绩数组x关闭文件函数代码如下:void fzjishi() / 分组计时int i,rs,xh11;char anykey;clock_t start,finish;double totaltime11=0,tim;fstream outfile;outfile.open(filename,ios:in|ios:out); outfile.read(char *)x,sizeof(x); /读数据do / 限制输入的人数 coutrs;if(rs10)cout每组人数越界,请输入1-10!endl;while(rs10);cout按任意键开始! n按任意键取时间,按n/N键终止! endl; anykey=getch();start=clock(); / 取机器时间for(i=1;i=rs;i+) while(!kbhit() / 若没有键按下coutr;finish=clock(); / 再取机器时间tim=(double)(finish-start)/1000; / 计算时间couttim;totaltimei=tim; / 记录时间coutt第 i 名 endl;anykey=getch();if(anykey=n|anykey=N) / 按n/N键终止break;for(i=1;i=rs;i+)cout请输入第 ixhi;coutnn 成绩endlendl;for(i=1;i=rs;i+)cout 第 i 名 的成绩为 totaltimei 秒!学号:;coutxhi 姓名:xxhi-1.xmendl; xxhi-1.cj=totaltimei;outfile.seekp(0,ios:beg);outfile.write(char *)x,sizeof(x); / 回写数据 outfile.close();该系统计时的核心算法是:循环前取系统时间:start=clock(); 循环获取每个人的时间:在循环中再次取系统的时间finish=clock(); tim=(double)(finish-start)/1000; / 计算时间显示在屏幕上。通过coutr;实现在屏幕上某行滚动显示时间。(5)显示学生成绩显示学生成绩功能由函数Printxx()实现,其流程如图所示:显示输出成绩菜单根据选择显示某些学生的成绩打开学生信息文件关闭文件输出成绩菜单包括:1. 显示所有学生成绩2. 显示部分学生成绩3. 显示某个学生成绩4. 显示前n名学生成绩;0. 退出输出函数代码如下:void Printxx()fstream outfile;outfile.open(filename,ios:in); outfile.read(char *)x,sizeof(x); / 读数据char ynn,choice;int i;dosystem(cls);cout*endl;cout* 输 出 程 序 *endl;cout*endlendl;cout 1. 显示所有学生成绩 endlendl;cout 2. 显示部分学生成绩 endlendl;cout 3. 显示某个学生成绩 endlendl;cout 4. 显示前n名学生成绩 endlendl;cout 0. 退出输出 endlendl;cout*endl;coutchoice;switch(choice)case 1:i=0;coutnn filename 班径赛成绩endlendl;cout学号t姓名t成绩n;while(xi.xh!=0)coutxi.xhtxi.xmtxi.cjendl;i+;num=i;break;case 2: int startxh,endxh;coutstartxh;coutendxh;cout学号t姓名t成绩n;for(i=startxh;i=endxh;i+)coutxi-1.xhtxi-1.xmtxi-1.cjendl;break;case 3: int mxh;coutmxh;cout学号t姓名t成绩n;coutxmxh-1.xhtxmxh-1.xmtxmxh-1.cjendl;break;case 4: /对数组先排序再输出int j,n;struct stu t;for(i=0;inum-1;i+)for(j=i+1;jxj.cj)t.xh=xi.xh; xi.xh=xj.xh; xj.xh=t.xh;strcpy(t.xm,xi.xm); strcpy(xi.xm,xj.xm); strcpy(xj.xm,t.xm);t.cj=xi.cj; xi.cj=xj.cj; xj.cj=t.cj;coutn;cout学号t姓名t成绩n;for(i=0;in;i+)coutxi.xhtxi.xmtxi.cjendl;break;case 0: break;outfile.close();coutynn;while(ynn=n|ynn=N);程序改进:l 在学生信息中,增加一项成绩,根据时间计算成绩。如时间为10.5秒,成绩95分。14.2 万年历程序设计14.2.1 设计目的通过开发万年历程序,进一步熟悉C+中类和对象的定义与使用,掌握程序控制的方法,掌握历法的基本知识。14.2.2 设计要求1设计一个“万年历”的日历程序。2把日历设计成一个类,把对日历处理的程序设计成它的成员函数。3万年历的主要功能有:判断某年某月某日是星期几,输出某年的年历,分栏输出某年的年历等。14.2.3 设计内容1分析定义一个万年历类class,其数据成员为:年Year、月Month、日Day,存储日期数据。其主要成员函数为:设置日期函数SetDate()、打印日期函数函数PrintDate()、打印日历函数RL()、分栏打印日历函数FLDY()等。主函数的功能是:显示万年历查询菜单:查询某年某月某日是星期几、打印某年的年历、分栏打印某年的年历;根据用户的选择,执行相应的功能。选择0退出程序。2程序代码3程序执行说明运行程序,显示万年历查询主界面,如图14-5所示。图14-5 万年历查询主界面根据需要可以选择相应的功能。如果选择1,提示输入年月日,输出该日是星期几。最后输入y可以继续执行程序,输入n退出程序。如图14-6所示。图14-6 星期查询界面如果选择2,提示输入年号,输出该年的年历。最后输入y可以继续执行程序,输入n退出程序。如图14-7所示。如果选择3,提示输入年号和分栏数,分栏输出该年的年历。最后输入y可以继续执行程序,输入n退出程序。如图14-8所示。所有输入的数据都设置了有效性校验。程序可以反复执行,选择0退出。在分栏显示时,如果输出界面的宽度不足,右击输出窗口的标题栏,打开“属性”对话框,单击“布局”选项,改变屏幕的大小,如图14-9所示。最后单击“确定”按钮即可。4程序的完善此程序较好地完成了设计要求,但还可以从一下几个方面进行完善:l 对输入的年份设置上限。l 增加判断星座的功能。对输入的出生日期,输出相应的星座名。l 增加农历查询的功能。对输入的日期,输出其对应的农历日期。或对输入的年份,直接输出其农历年历。l 增加判断闰年的功能。对输入的年份,输出是否闰年。图14-7 某年年历查询部分界面图14-8 分栏打印某年年历界面图14-9 输出窗口“属性”对话框14.3 学生成绩管理系统设计14.3.1 设计目的 通过开发学生成绩管理系统,进一步熟悉C+语言的基本知识,掌握面向对象程序设计的基本方法和基本技巧,特别是类的定义与使用。14.3.2 设计要求1程序中尽可能多地使用C+语言的标准函数、数据类型和程序结构。2程序设计针对一个班一个学期的成绩进行统计,进而修改为一个班6个或8个学期的成绩统计,最后定稿为全校学生的成绩统计。3程序流程如图14-10所示:退出界面登录界面输入密码或口令欢迎界面主菜单选择子菜单执行图14-10 程序流程示意图4学生的所有信息只从键盘输入一次,以后可以从文件中调用。所有录入数据要进行有效性校验。有效性校验是指录入的数据必须在指定的范围内,否则拒绝接受并重新录入。如每门课程的成绩只能在0100分之间,学生性别只能是“男”或“女”。5操作界面要求提示清晰、操作简单、颜色搭配合理,利用C+的I/O流实现。6能让计算机做的,就不要让用户做。比如计算每个人的总分和平均分,每门课程的平均分,都可以通过计算产生。7设计一个密码类,可以对用户名和密码进行处理(增加、删除、修改、显示等)。8设计一个日志类,记录每个用户的登陆时间、离开时间和操作的功能。9设计一个学生成绩类:数据为一个班一个学期的成绩信息,函数为对它的操作。10对存储到磁盘上的所有信息加密。14.4.3 课程设计内容1软件设计说明(1)软件的主菜单,如图14-11所示。学生成绩处理系统1学生基本信息录入2开设课程门数及名称录入3学生成绩录入4学生成绩修改5学生成绩查询0退出系统请选择(0-5):图14-11 主菜单示意图说明:l 学生基本信息:学号、姓名、性别l 学生的某一学期成绩表的信息:学号、姓名、性别、英语、高等数学、C+程序设计、计算机网络、总分、平均分(2)学生成绩录入子菜单,如图14-12所示。学生成绩录入1根据学号录入2根据课程录入0返回主菜单请选择(0-2):图14-12 学生成绩录入子菜单示意图说明:l 根据学号录入:显示学号、姓名,根据课程提示录入这个学生的几门课程的成绩。l 根据课程录入:显示课程名称,根据学号、姓名提示录入这个学生的几门课程的成绩。(3)学生成绩修改子菜单,如图14-13所示。 学生成绩修改1二次录入修改2修改某个学生的成绩0返回主菜单请选择(0-2):图14-13 学生成绩修改子菜单示意图说明:l 二次录入修改:对同一个班的学生成绩进行第2次录入。录入时与第1次录入的学生成绩进行对比,若相同认为是正确的,若不同,显示两次的录入的成绩,让用户选择
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届湖北省宜昌市示范高中教学协作体化学高二上期中复习检测试题含解析
- 2025年知名企业招聘笔试模拟题财务分析师岗位解析
- 2025年人力资源管理实战手册招聘与面试技巧模拟题集
- 2025年建筑工程师面试宝典模拟题与答案详解
- 建筑施工企业项目质量效益技术管理措施
- 2025年村级碳汇管理员专业知识模拟题集
- 改装商务车专业知识培训课件
- 7年级下册美术技能提升计划
- 统编版语文五年级下册教学计划模板下载
- 节前消防安全知识培训课件会
- 新生儿窒息复苏指南
- 眼的生物化学讲义
- GB/T 3098.15-2023紧固件机械性能不锈钢螺母
- 陈琦《教育心理学》课件
- 封头理论重量计算公式
- 护理副高职称答辩5分钟简述范文
- (3)-2-1-药物的跨膜转运
- 幼小衔接资料合集汇总
- 八年级数学平面直角坐标系测试题
- GB/T 28575-2020YE3系列(IP55)三相异步电动机技术条件(机座号63~355)
- 储油罐有限空间作业安全技术措施表
评论
0/150
提交评论