1、第24章 信息管理不用愁信息管理系统实战p 日历系统p 学生成绩管理系统p 银行卡管理系统第24章 信息管理不用愁信息管理系统实战 日历系统p 学生成绩管理系统p 银行卡管理系统第24章 信息管理不用愁信息管理系统实战 日历系统 学生成绩管理系统p 银行卡管理系统第24章 信息管理不用愁信息管理系统实战 日历系统 学生成绩管理系统 银行卡管理系统24.1 日历系统 本系统实现了控制台下打印日历。只要输入指定年份,就能打印出该年的日历,包括星期。通过本例的学习,培养读者在VC+6.0环境中,学会调试程序的能力,巩固分支结构和循环结构的知识,让读者形成C+模块化设计的思想。24.1 日历系统 24
2、.1.1 系统分析 24.1.2 功能分析及实现 24.1.3 开发常见问题及解决24.1.1 系统分析 1.需求分析u 随意给出某年(如2003年),可以显示该年的日历(包括每月的天数和对应的星期几),并且在每月的左上角或右上角打印出相应的年份和月份,要求输出界面尽可能整齐,美观。24.1.1 系统分析 2.系统分析u 根据问题描述,整个系统包含2个模块,为了体现模块化编程的思想,对每一个模块都分别编写函数来实现。系统流程图如下。输入年份显示日历开始结束输入年份显示日历开始结束24.1.2 功能分析及实现 1.定义日历类 01 class calendar02 03 int weekday;
3、04 int year;05 public:06 void printmonthdays();/打印每月的日历07 void printtitle(int m);/打印日历头08 int monthdays(int m);/计算每月的天数09 int firstday(int y);/计算每年的第一天是周几10 ;24.1.2 功能分析及实现 2.计算每月的天数u 在一年中有的月份是30天,有的是31天,2月份的天数根据是否是闰年不同,又有28天和29天的区别。24.1.2 功能分析及实现01 int calendar:monthdays(int m)/判断每月的天数02 03 switch(
4、m)04 05 case 1:06 case 3:07 case 5:08 case 7:09 case 8:10 case 10:11 case 12:12 return 31;/1,3,5,7,8,10,12每月有31天13 case 4:14 case 6:15 case 9:16 case 11:17 return 30;/4,6,9,11每月有30天18 case 2:19 if(year%4=0&year%100!=0)|year%400=0)/判断是否闰年。20 return 29;21 else 22 return 28;23 default:return 0;24 25 24
5、.1.2 功能分析及实现3.打印日历01 void calendar:printmonthdays()02 03 int days;04 for(int n=1;n=12;n+)/12个月份05 06 printtitle(n);/打印日历头07 days=monthdays(n);08 for(int i=1;i=days;i+)09 10 printf(%5d,i);11 weekday=(weekday+1)%7;12 if(weekday=0)printf(n );13 14 printf(n);15 16 24.1.2 功能分析及实现 4.打印每月的日历头01 void calend
6、ar:printtitle(int m)/02 03 int i;04 printf(n%d月 日 一 二 三 四 五 六n,m);05 printf();06 for(i=0;iweekday;i+)07 printf();08 24.1.2 功能分析及实现 5.判断每年的第一天是星期几int firstday(int year)/判断元旦是星期几double s;s=floor(year-1+(year-1)/4.0-(year-1)/100.0+(year-1)/400.0+1);return(int)s%7;24.1.2 功能分析及实现6.提示打印模块01 void main(int
7、argc,char*argv)02 03 04 int year;05 int weekday;06 calendar cal;07 printf(请输入你要查看的年份:);08 scanf(%d,&year);09 weekday=cal.firstday(year);10 printf(nn);11 printf(%d年n,year);12 cal.printmonthdays();/打印日历13 printf(nn);14 24.1.3 开发常见问题及解决 从公元01年的第一天开始考虑(01年1月1日对应星期一),以计算从01年至该年开始的总天数;注意每月的天数不同,并且二月分有2种情况
8、:是否是闰年 为了将每月的日期和星期对应,用从显示月份开始的总天数除7取余,控制日期和星期几的对应关系;可以构造一个逻辑表达式来判断该年是否是闰年:if(year%4=0&year%100!=0)|year%400=0);为判断每月的天数,可以用switch-case分支结构。24.2 学生成绩管理系统本例是一个简单的学生成绩管理系统,所实现的功能有如下几个:设计一个功能显示菜单,并有选择提示;建立学生信息数据,包括学号、姓名、三门课(语文、数学和英语)的成绩;能实现学生信息增加、删除和修改;统计每个学生的总分和平均分;按照总分从小到大排出名次;任意输入一个学好,能够查出该学生在班级中的排名及
9、其考试成绩。通过本例,读者可以更进一步的学习类和结构体的使用,以及C+中STL编程快捷与高效。24.2 学生成绩管理系统 24.2.1 系统分析 24.2.2 功能分析及实现 24.2.3 开发常见问题及解决24.2.1 系统分析 1.需求分析u 学生成绩管理系统主要提供学生资料的输入,学生资料的输出,学生资料的查询,学生资料删除,以及学生成绩的排序等。通过这次对学生成绩管理系统的编写,使读者对现在所学的东西和以前所学的东西有了同一的了解,综合的运用。通过本例的学习,读者对结构体以及类的使用有了更进一步的认识。24.2.1 系统分析 2.系统分析u 整个系统包含六个模块,为了体现模块化编程的思
10、想,对每一个模块都分别编写函数来实现。学生信息的包括学号、姓名以及三门功课的成绩,在本例中用一个结构体来表示学生信息。在实际工作中,输入的学生信息需要更新,本例子需要有一个对学生信息进行编辑的模块。为了更好的体现C+编程的优越性,在排序的时候,用到了STL 编程中的sort方法。学生成绩管理系统增加信息模块修改信息模块删除信息模块查询信息模块保存信息模块浏览信息模块排序信息模块主菜单模块24.2.2 功能分析及实现输入指令是否继续开始增加信息模块修改信息模块删除信息模块查询信息模块保存信息模块浏览信息模块排序信息模块结束24.2.2 功能分析及实现1.定义类01 class student02
11、 03 public:04 char code5;/学号05 char name20;/姓名06 double math,chinese,english,average,sum;/三门功课成绩平均分 总分07 public:08 student();09 student(char cd,char n,double ma,double chin,double eng);10 double getsum();/计算总分11 double getaver();/计算机平均分12 ;24.2.2 功能分析及实现 2.主菜单的设计与实现u 主菜单显示,主菜单的选项的输入选择,不同功能模块的调用,从而达到
12、用户与该系统的交互。01 void control:jiemian()02 03 coutendl;04 coutendl;05 cout*endl;06 cout*请选择您需要的操作!*endl;07 cout*(1)增加人员 *endl;08 cout*(2)删除人员 *endl;09 cout*(3)修改数据 *endl;10 cout*(4)查询 *endl;11 cout*(5)输出所有学生的数据 *endl;12 cout*(6)按成绩排序 *endl;13 cout*(0)退出 *endl;14 cout*选择相对的括号里的阿拉伯数字!*endl;15 cout*;16 cout
13、endl;17 coutendl;18 return;19 20 24.2.2 功能分析及实现 3.增加人员功能的实现。u 选择功能主菜单1,可以增加新的学生信息,包括学号、姓名以及三门功课的成绩。void control:insert(std:vector&ver)student stu;char code5;char name20;double math,chinese,english;coutcode;coutendlname;coutendlmath;coutendlchinese;coutendlenglish;strcpy(stu.code,code);strcpy(stu.nam
14、e,name);stu.math=math;stu.chinese=chinese;stu.english=english;stu.sum=math+chinese+english;stu.average=stu.sum/3;ver.push_back(stu);return;24.2.2 功能分析及实现 4.删除人员功能的实现u 输入待删除学生的学号和姓名,系统就可以删除该学生的所有信息。01 void control:del(std:vector&ver)02 03 char code5;04 char name20;05 coutcode;07 coutendlname;09 vecto
15、r:iterator i;10 for(i=ver.begin();i!=ver.end();+i)11 12 if(!strcmp(*i).code,code)&!(strcmp(*i).name,name)13 14 ver.erase(i);15 return;16 17 18 19 return;20 21 24.2.2 功能分析及实现 5.编辑人员功能的实现01 void control:edit(std:vector&ver)02 03 04 char code5;05 char name20;06 cout请输入学号:code;08 cout请输入姓名name;10 vector
16、:iterator i,cur;11 for(i=ver.begin();i!=ver.end();+i)12 13 if(!strcmp(*i).code,code)&!(strcmp(*i).name,name)14 cur=i;15 16 cout旧的数据endl;17 cout学号:(*cur).code 姓名:(*cur).name 数学:(*cur).math 语文:(*cur).chinese 外语:(*cur).english 平均值:(*cur).average 总合:(*cur).sumendl;18 cout请输入新数据.;19 coutendl(*cur).name;2
17、1 coutendl(*cur).math;23 coutendl(*cur).chinese;25 coutendl(*cur).english;27 (*cur).sum=(*cur).math+(*cur).chinese+(*cur).english;28 (*cur).average=(*cur).sum/3;29 return;30 24.2.2 功能分析及实现 6.排序功能的实现01 void control:st(std:vector&ver)02 03 char fg;04 cout*endl;05 cout*(1)按总分查询排名 *endl;06 cout*(2)按语文查询
18、排名 *endl;07 cout*(3)按数学查询排名 *endl;08 cout*(4)按英语查询排名 *endl;09 cout*(5)按平均分查询排名*endl;10 cout*(0)返回上一层菜单 *endl;11 cout*fg;13 14 if(fg=0)/返回上一层菜单15 return;16 if(fg=1)/按总分查询排名17 18 std:sort(ver.begin(),ver.end(),greatesum);19 list(ver);20 21 22 23 if(fg=2)/按语文查询排名24 25 std:sort(ver.begin(),ver.end(),gre
19、atechinese);26 list(ver);27 28 29 if(fg=3)/按数学查询排名30 31 std:sort(ver.begin(),ver.end(),greatemath);32 list(ver);33 34 35 if(fg=4)/按英语查询排名36 37 std:sort(ver.begin(),ver.end(),greateenglish);38 list(ver);39 40 41 if(fg=5)/按平均分查询排名42 43 std:sort(ver.begin(),ver.end(),greateaverage);44 list(ver);45 46 4
20、7 return;48 24.2.2 功能分析及实现 7.其他功能u 查询功能:在主菜单界面选择4,进入查询功能模块,输入要查询的学号和姓名,即可输出相应的信息 24.2.2 功能分析及实现u 输出所有信息功能:24.2.3 开发常见问题及解决 为了在程序中使用向量,需要包含头文件#include 例子中的排序算法,使用了STL编程中的sort()方法,避免了我们重复编写排序代码,需要包含头文件#include 24.3 银行卡管理系统 本例子实现了一个简单的银行卡管理系统。功能主要包括创建新卡,卡号登录。每个卡片信息包括有卡号以及用户名信息。输入卡号后可以对银行卡进行管理,包括存款、取款以及
21、每次操作的日志。通过本例的学习,读者能够进一步的学习结构体和类的使用,并且能够学习到二进制文件的读写方法。24.3 银行卡管理系统 24.3.1 系统分析 24.3.2 功能分析及实现 24.3.3 开发常见问题及解决24.3.1 系统分析 1.需求分析u 银行卡管理系统应该能实现,新卡的录入,以及卡号的登录功能。卡号登录后,应该可以进行存款、取款以及用户每次操作日志的浏览。24.3.1 系统分析 2.系统分析u 卡的信息包含有卡号以及用户名称,用一个结构体struct Card来表示银行卡信息。处于保密性的考虑,银行卡的信息以二进制的文件进行存放。u 本系统分为以下几大模块:主菜单模块、创建
22、新卡模块、卡号登录模块、存款模块、取款模块、日志浏览模块。银行卡管理系统卡号登录存款模块取款模块创建新卡日志浏览模块24.3.2 功能分析及实现显示主界面输入指令是否继续开始创建新卡卡号登录结束24.3.2 功能分析及实现 1.定义类01 struct Card02 03 int cardno;/卡号04 char usernameLENGTH;/用户名05 double sum;/存款金额06 ;07 08 struct Log09 10 int cardno;/卡号11 char date64;/日期12 char type6;13 double money;/存钱输入金额14 doubl
23、e sum;/总金额15 ;24.3.2 功能分析及实现 2.主菜单的设计及实现01 void mainjiemian()02 03 cout*endl;04 cout*银行卡管理软件 *endl;05 cout*endl;06 cout*(1)创建新卡 *endl;07 cout*endl;08 cout*(2)卡号登录 *endl;09 cout*endl;10 cout*(0)退出 *endl;11 cout*endl;12 24.3.2 功能分析及实现 3.创建新卡模块的实现01 char filenameLENGTH;/定义一个字符数组,来表示文件名02 Card t_cd;/定义一
24、个结构体对象03 int i_cd;/定义卡号04 char s_nameLENGTH;/定义 用户名05 couti_cd;/输入卡号07 couts_name;/输入用户名09 t_cd.cardno=i_cd;10 strcpy(t_cd.username,s_name);11 t_cd.sum=0;12 itoa(t_cd.cardno,filename,10);/把卡号转换成字符串13 fstream writefile(strcat(filename,.txt),ios:out);14 writefile.write(char*)&t_cd,sizeof(t_cd);/写入文件15
25、 writefile.close();24.3.2 功能分析及实现 4.卡号登录功能的实现 01 void logcard()02 03 cout*endl;04 cout*(1)存 款 *endl;05 cout*(2)取 款 *endl;06 cout*(3)读取日志*endl;07 cout*(0)返 回 *endl;08 cout*in;09 switch(in)10 11 case 1:12 coutmoney;14 cdop.Cardin(money);15 break;16 case 2:17 coutmoney;19 cdop.Cardout(money);20 break;2
26、1 case 3:22 cdop.listlog();23 break;24 case 0:25 break;26 default:cout输入错误,请从新输入。endl;27 28 while(in!=0);29 return;30 24.3.2 功能分析及实现 6.存款功能的实现01 void Cardin(double m)02 03 t=time(0);04 card.sum+=m;05 lg.cardno=card.cardno;06 strftime(datatime,sizeof(datatime),%Y年/%m月/%d日%H时%M分%S秒,localtime(&t);07 st
27、rcpy(lg.date,datatime);08 strcpy(lg.type,存钱);09 lg.money=m;10 lg.sum=card.sum;11 coutsetiosflags(ios:fixed);12 coutendl卡号:card.cardno 当前总金额:setprecision(2)card.sum=m)04 05 t=time(0);06 card.sum-=m;07 lg.cardno=card.cardno;08 strftime(datatime,sizeof(datatime),%Y年/%m月/%d日%H时%M分%S秒,localtime(&t);09 st
28、rcpy(lg.date,datatime);10 strcpy(lg.type,取钱);11 lg.money=m;12 lg.sum=card.sum;13 coutsetiosflags(ios:fixed);14 coutendl卡号:card.cardno 当前总金额:setprecision(2)card.sumendl;15 Logoperate l_file(card.cardno);16 l_file.writelog(lg);17 18 else19 20 cout警告:交易失败!您的户面余额已不足!请续存!endl;21 22 24.3.2 功能分析及实现 8.查询存取记录功能的实现24.3.3 开发常见问题及解决 为了记录每张卡的信息,例子中用一个结构体来记录卡的信息.为了记录用户的操作时间,例子中使用了strftime()函数将时间格式化u strftime(datatime,sizeof(datatime),%Y年/%m月/%d日%H时%M分%S秒,localtime(&t);由于银行卡的保密性,卡片信息读写,都是以二进制文件的读写形式进行。