南邮软件设计报告_第1页
南邮软件设计报告_第2页
南邮软件设计报告_第3页
南邮软件设计报告_第4页
南邮软件设计报告_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上精选优质文档-倾情为你奉上专心-专注-专业专心-专注-专业精选优质文档-倾情为你奉上专心-专注-专业软件设计报告姓名:郭靖 学号:B2010年5月11日2010年5月20日目 录 TOC o 1-3 h z u 3.6 第一周总程序分析3.6.1程序代码3.6.2运行结果第一章 软件设计介绍软件设计是一门年轻的学科,但它具有鲜明的实践性。近年来在计算机领域中,它的地位显得越来越重要,不仅大型软件项目离不开它, 就是一般的,甚至小型软件项目也必须运用它的概念、原则和方法。软件分析人员、软件设计、编程、测试、维护人员,以及软件管理人员都必须很好地掌握软件工程知识,才能适应

2、岗位工作的要求,事实证明,不掌握软件工程知识,不按照软件工程的要求去做项目,提供给用户的产品只能是低质量的、难于维护的。通过软件设计的学习,掌握软件生存期过程和软件工程、软件需求分析、软件复用技术、软件测试、软件维护、软件再工程、软件工具、软件开发环境、软件质量保证体系、软件工程标准化和软件文档、软件过程能力估计、软件工具项目管理等内容的基本概念、方法和原理,并运用可视化开发工具,结合软件设计方法,通过上机实验,提高应用系统的开发能力。本课程是一门技能训练课,为在校学生的必修课程。通过设计培养学生良好的编程习惯,使学生掌握编程的基本步骤,规范学生的编写程序的格式,锻炼学生编写程序的能力,为将来

3、编写较大程序的打好基础。第二章 软件开发平台简介Visual Studio是一套完整的开发工具集,它向开发的各个过程提供辅助工具。Visual Studio的主要功能,包括开发Windows窗体应用程序、开发ASP.NET Web应用程序、开发移动应用程序等。Visual Studio提供了开发应用程序的工具集。编写.NET程序最简单的环境其实有一个记事本和一个编译器就足够了,之所以需要工具集或者IDE是因为现在企业需要你快速、高效地开发出稳定、实用的计算机应用程序,而工具集的作用也在于帮助你快速、高效地开发。Visual Studio提供了在设计、开发、调试和部署应用程序时所需的工具,Vis

4、ual C#集成开发环境(IDE)是Visual Studio IDE中的一种。打开Visual Studio选择C#即可进入Visual C#集成开发环境,它里面有些工具是与其他 Visual Studio 语言共享的,还有一些工具(如C#编译器)是Visual C#特有的。Visual Studio Remote Tools,用于远程操作的工具集合。Visual Studio Tools,用于Visual Studio .NET开发的一些辅助工具,有一些工具是Visual Studio系列开发工具一直都有的,比如Spy+工具,用来监视系统的进程、线程、窗口和窗口消息等。MSDN,提供全方位

5、、丰富的帮助文档。软件设计的内容 第一周的五个实验我做成了一个总程序,通过一个主菜单来进行选择,下面先进行每一个小程序的分析,然后再进行总的分析。3.1分数统计软件3.1.1设计题目及要求分数统计要求:(1)输入某班级学生的姓名、分数;(2)对(1)的分数进行降幂排列并输出;(3)具有输入输出界面。3.1.2设计思想及程序流程框图问题分析:从题目的要求可知,本程序要能管理N个学生的成绩,同时区分每个学生的方法有两个,一个是学号,另一个是姓名。如果将每个学生的所有属性集合称为一个记录,那么每个记录应该包含一下属性:姓名,成绩仔细分析以上属性发现,每个属性需用不同的数据类型来表示,例如,学号可以用

6、整形数表示,姓名必须用字符串表示,功课的成绩可用整形数表示,所以每个学生的所有属性可以用一个结构来表示:struct peoplechar name10;/姓名int score;/成绩;选择数据类型后,需要对程序的结构进行分析,选择一个合理的结构是必需的。为了实现功能的选择,还需要一个菜单选择功能。菜单的选择形式确定后,从程序编制的角度,得到系统结构图如下:主菜单键盘输入选择功能数据录入数据显示成绩排序分数统计主菜单键盘输入选择功能数据录入数据显示成绩排序分数统计3.2打字软件3.2.1设计题目及要求打字程序要求:(1)随机产生一字符串,每次产生的字符串内容、长度都不同; (2)根据(1)的

7、结果,输入字符串,判断输入是否正确,输出正确率; (3)具有输入输出界面3.2.2设计思想及程序流程框图问题分析:从题目的要求可知,本程序要求随机产生字符串并且字符串的内容和长度都不相同,也就是说都是随机的!要产生随机数,可以使用函数rand,通过time函数来设置随机数种子,这样就能产生任意随机数了,然后再通过取余运算来限制产生随机数的范围,再做类型转换,从而产生任意长度的任意字符串。对于判断输入的字符串是否正确,可以将输入的字符串和随机的字符串进行逐个比较,记录下相同字符的个数,也就是正确数,然后就能够计算正确率了! 确认模块确认模块主菜单确认模块确认模块主菜单键盘输入选择功能输出随机字符

8、串字符串输入字符串判断正确率打字程序3.3文本编辑器3.3.1设计题目及要求文本编辑器要求:(1)编辑文本;(2)保存、打开指定位置的文本文件;(3)具有输入输出界面。3.3.2设计思想及程序流程框图数据的输入和输出是十分重要的操作,如从键盘读入数据,在屏幕上显示数据,把数据保存到文件中,从文件中取出数据,等等。C+系统提供了一个用于输入输出(I/O)操作的类体系,这个类体系提供了对预定义类型进行输入输出操作的能力。C+把文件看做字符序列,即文件是一个一个字符数据顺序组成的。要进行文件的输入输出,必须首先创建一个流,然后将这个流与文件相关联,即打开文件,此时才能进行读写操作,完成后再关闭这个文

9、件。根据设计题目的要求,考虑将整个程序分成四个模块:文件编辑模块、打开文件模块、输出文件模块以及退出DOS模块。文件编辑模块,即用户在提示输入下输入需要存储的文件,也就是用gets函数接受的系列字符串;打开文件模块,根据用户输入的文件地址,利用get()函数读取整个文件,并显示到屏幕上;输出文件模块,即是利用write()函数向指定位置写入文件其整个程序的结构图如下:主菜单主菜单键盘输入选择功能编辑新文本退出系统文本编辑器打开指定位置的文本3.4加密3.4.1设计题目及要求加密要求:(1)输入任意一段明文M,以及密钥K;(2)根据以下公式将其转换为密文C。 Ci = mi + K ,其中i =

10、 0,1,n-1 , K 为密钥;(3)具有输入输出界面。3.4.2设计思想及程序流程框图根据设计题目要求可知,要实现加密操作,实际上就是对一个任意的字符串进行操作,可以考虑将字符串存在一个数组中,然后类型转换成整数后与密匙相加即可得到加密后的字符串,再转换成字符型即可。但是,在实现Ci = mi + K的操作过程中,可能会出现整数超过ASCII码范围的情况,所以要进行求余运算,将加密后的整数限制在ASCII码的有效范围之类。采用这种算法后,考虑依旧采用用户选择操作界面,用户根据提示逐步实现所需操作。主菜单主菜单键盘输入选择功能 加密输入源码加密后的输出3.5进制转换器3.5.1设计题目及要求

11、进制转换器 要求:(1)可输入二进制、八进制、十进制、十六进制数; (2)将已输入的数转换成其余进制的数; (3)具有输入输出界面。3.5.2设计思想及程序流程框图根据设计题目的要求,可以知道要实现进制数的转换,可以将不同的进制数转换成字符串输出,即可以实现将不同进制数的显示。对于转换,可以考虑使用一个模块,将任意进制的数(程序接受时依然当作字符串接收)转换成十进制的整数,然后再从这个十进制整数出发转换成任意进制的数显示(也是一个字符串)。这个程序设计的关键在于任意进制的数转换成十进制数以及十进制数转换成任意进制数!转化成十进制时可以通过计算输入字符串的长度,在知道输入是几进制的前提下就可以将

12、不同位上的数转换成十进制求和就可以得到;转换成任意进制时可以使用短除法,不断相除取余数知道商为零为止,得到的字符串在翻转后即使得到的任意进制数对应的字符串。综上可以将整个程序分为四大模块:数据输入模块,转换成十进制模块,转换成任意进制模块,输出模块。从而其整个程序的结构图如下:主菜单主菜单键盘输入选择功能数据录入十进制转换任意进制转换输出数据退出系统进制转换器根据提示输入数据3.6第一周总程序分析3.6.1程序代码如下:#include#include#include#include#include#include #define MAX 100char digit17=ABCDEF;int

13、readJZS(int org_goal);/读取进制数int read_org_data(char *data, int org);/读取输入数据void shift_all(char *org_data, int org, char *goal_data, int goal);/完成进制的转换long other_to_ten(char *org_data, int org);/将其他进制的数转换为十进制数void ten_to_other(long ten, char *goal_data, int goal);/将十进制的数转换为其他进制的数/函数功能:读取初始和目标进制数/函数参数:

14、整数型数 org_goal/函数返回值:输入的进制int readJZS(int org_goal) int ret=0; while (1) if (org_goal=0) printf(请输入初始进制:); else printf(请输入目标进制:); scanf(%d,&ret); /接收输入的进制数 getchar(); if (ret=2 & ret=16) return ret; else if(ret!=0) printf(请输入0-16之间的整数!n); continue; else return 0; /函数功能:读取输入的要进行进制转换的数/函数参数:字符指针 data,接

15、收输入的数据,整数型数org/函数返回值:控制循环继续进行还是结束的整数int read_org_data(char *data, int org) int i; char *p; int f=0; int h=1; while (1) printf(请根据初始进制正确输入初始数据(整数):); /*gets(data);*/ scanf(%s,data); getchar(); p=data; if (strlen(data)=0) return 0; while (*p) f=0; for (i=0;i=48 & *p=65 & *p=97 & *p0) goal_datai+=digit

16、ten%goal; ten=ten/goal; strrev(goal_data); /把目标字符串的顺序颠倒 /函数功能:完成初始进制到目标进制的转换/函数参数:字符型指针 org_data,goal_data,整数型 org,goal/函数返回值:无void shift_all(char *org_data, int org, char *goal_data, int goal) long ten; ten=other_to_ten(org_data, org); ten_to_other(ten, goal_data, goal);/函数功能:进制转换器/(1)可输入二进制、八进制、十进

17、制、十六进制数;/(2)将已输入的数转换成其余进制的数;/(3)具有输入输出界面。/函数参数:无/函数返回值:无int jinzhi() int org; int goal; char org_data20=0; char goal_data20=0; int tmp; char c; while (1) he: org=readJZS(0); /读取初始进制数 if (org=0) goto he; / return 0;/ tmp=read_org_data(org_data, org);/读取待转换的数据 if (tmp=0) return 0; goal=readJZS(1);/接收目

18、标进制数,即要转换成的进制数 if (goal=0) return 0; shift_all(org_data, org, goal_data, goal); /完成进制的转换 printf(转换后的结果:%s,goal_data); /输出转换后的数据 printf(n按#号键结束进制转换进入主菜单,按其他任意键继续进制转换!n); c=getchar(); if (toupper(c)=#) /判断输入是否为#,决定继续还是退出 break; return 0; / 函数功能:加密/(1)输入任意一段明文M,以及密钥K;/(2)根据以下公式将其转换为密文C,Ci = mi + K ,其中i

19、 = 0,1,n-1 , K 为密钥;/(3)具有输入输出界面。/函数参数:无/函数返回值:无void miyao() char M100; char C100; int K,i; coutM; coutK; for(i=0;Mi!=0;i+) Ci=Mi+K; Ci=0; printf(结果是:n%sn,C);/函数功能:文本编辑器/(1)编辑文本;/(2)保存、打开指定位置的文本文件;/(3)具有输入输出界面。/函数参数:无/函数返回值:无void textedit() int m,n,i;char ch,str100,str2100,pp100,qq100,a;char *q,*p,te

20、mp;coutendlendl;do cout1:编辑新文本n; cout2:打开指定位置的文本(可追加)n; cout3:退出n; coutm; coutendl; if (m=1) / 编辑新文本 printf(请输入文本内容: ); gets(str); coutn; if(n=1) / 保存文本 coutendlpp; ofstream fout(pp); / 创建一个新文件保存文本 if(!fout) coutnCannot open output file.n; continue; foutstr; fout.close(); if(m=2) coutendlqq; ifstrea

21、m fin; fin.open(qq,ios:nocreate); /打开指定文本 if(!fin) coutCannot open input file.n; break; coutn文本内容为: ; while(fin.get(a) couta; /将文本内容输出到屏幕上 fin.close(); ofstream add(qq,ios:app); char yn; char addstr100; coutyn; if (yn=Y|yn=y) printf(n请输入您想追加的文本内容:); /追加文本 gets(addstr); addaddstr; add.close(); if(m=3

22、) break; while (1);/函数功能:分数统计/(1)输入某班级学生的姓名、分数;/(2)对(1)的分数进行降幂排列并输出;/(3)具有输入输出界面。/函数参数:无/函数返回值:无void xinmin()/姓名 struct people char name15; int sorce; students50,temp; int nums,i,j; printf(请输入人数n (n50)n); scanf(%d,&nums); for(i=0;i=0;j-) if(studentsj.sorcetemp.sorce) studentsj+1=studentsj; else brea

23、k; studentsj+1=temp; printf(n您所输入的学生名次如下nn); for(i=0;inums;i+) printf(第 %d 名n,i+1); printf(姓名t%sn,); printf(分数t%dn,studentsi.sorce); /函数功能:打字程序/(1)随即产生一字符串,每次产生的字符串内容、长度都不同;/(2)根据(1)的结果,输入字符串,判断输入是否正确,输出正确率;/(3)具有输入输出界面。/函数参数:无/函数返回值:无void dazichengxu() int i,k=0; float q; int n; char

24、ch30,sh30; / srand(unsigned)time(NULL); n=rand()%10; printf(a random numbers from a to znn); printf(输出随机字符串:); for(i=0; in; i+) shi=rand()%26+a; printf(%c, shi); printf(n); coutch; for(i=0;imm;/scanf(%d,&m);switch(mm)case 1:xinmin();break;/分数统计模块case 2:dazichengxu();break;/打字程序模块case 3:textedit();br

25、eak;/文本编辑器模块case 4:miyao();break;/加密模块case 5:jinzhi();break;/进制转换器模块case 0:exit(0);/退出default:printf(输入错误请重输n);while(mm!=0); 3.6.2将以上源程序编译、链接、运行后所得的结果如下:1程序选择界面2.选择“1”3.选择“2”4.选择“3”5选择“4”输入qer123,密钥为2,进行加密6选择“5”7选择“0”3.7学生成绩核算系统的设计与实现3.7.1设计题目及要求学生成绩核算系统的设计与实现要求:(1)按班级按课程从文件中读入相应的平时成绩、期中考试成绩和期末考试成绩。

26、(2)三个成绩对总评成绩的百分比被定义为常数,各占总成绩的30%、30%和40%。(3)计算每位学生的总评成绩。(4)计算该班级本课程的总平均成绩。(5)计算处于优、良、中、及格、不及格的学生人数以及占总人数的百分比。其中100-90为优,89-80为良,79-70为中,69-60为及格,60分以下为不及格。(6)按要求输出成绩在优、良、中、及格、不及格各区间的学生学号、成绩。3.7.2设计思想及程序流程框图建立文本文件 note.dat,第一行为学生的总人数,其后为每个学生的成绩,每个学生的信息占一行,格式为: 学号(9位) 平时成绩 期中考试成绩 期末考试成绩例如: 15B 88 75.5

27、 66 B 91 79.5 76B 85 75 77 B 79 82 80.5B 94 83.5 81.5 B 80 69 68B 82 77 71 B 77 57 58B 91 88 86 B 96 89 90B 70 45.5 50 B 74 65 66B 81 71 76 B 83 75 77B 85 78 79 2从文件中读入相应的平时成绩、期中考试成绩和期末考试成绩时,数据的读入方式可用C语言中的文件读入方式进行,也可用C+中的流实现。 4. 每次计算出的结果可在屏幕输出,并把每个学生的总评成绩输入到新文件out.dat文件中,格式为: 学生学号(9位) 总评成绩 成绩等级 例如:

28、B 88 B 为查询方便,可把总评成绩所处等级(优、良、中、及格、不及格)同时保存在文件out.dat中,分别用字母A、B、C、D、E表示。5. 数据结构(可用C+实现)两个类:学生(student)和学生成绩(marks)(1)学生类数据成员:学号、姓名、专业等数据类型属性(私有、保护、公有)方法: 构造函数和析构函数 设置学号void SetId( long );读取学号long GetId( ); 等等(2)学生成绩类 从学生类派生数据成员:平时成绩、期中考试成绩、期末考试成绩、总评成绩、成绩等级数据类型属性(私有、保护、公有)方法:读入成绩void In( ifstream& ); 或

29、 void In( FILE* ); 输出成绩void Out( ofstream& ); 或 void Out( FILE* ); 显示成绩void print( ); 求总评成绩void ComputeZP( ); 求等级void ComputeDJ( ); 读取总评成绩float GetZP( ); 读取等级char GetDJ( ); 等等6设计根据自顶向下,逐步细化的程序设计思想,考虑将程序分为七大模块:文件导入模块,计算模块,成绩分析模块,成绩导出模块,学号查询模块,等级查询模块以及确认退出模块。由此所得的程序结构图大致如下所示:开始开始键盘输入选择功能文件导入成绩计算成绩分析文件

30、导出退出系统查询7.实现 编程时要求每一个类建两个文件,即类的定义和实现文件。注意包含相关的文件。由系统结构图得到相应各个主要模块的的函数如下:1char Menu(char *ptr);/函数功能:菜单显示并获得键盘选择/函数参数:字符型指针ptr,表示菜单选择时输入字符串地址/函数返回值:输入的键盘的ASCII码对应字符Marks *In(int &total);/函数功能:导入文件数据,并初始化基本数据/函数参数:整形引用total,表示学生总人数/函数返回值:Marks型的指针,表示存储文件数据的对象数组的首地址其函数流程图如下:void CalData(Marks *point=NU

31、LL,int total=0);/函数功能:计算总的平均分以及输出总评成绩和总的平均分/函数参数:Marks指针,表示对象数组的首地址/ 整型total,表示学生总数/函数返回值:无void DataAnalysis(Marks *point=NULL,int total=0);/函数功能:统计各分数段人数,计算百分比,并格式输出/函数参数:Marks指针,表示对象数组的首地址/ 整型total,表示学生总数/函数返回值:无int Out(Marks *point=NULL,int total=0);/函数功能:导出数据到文件保存/函数参数:Marks指针,表示对象数组的首地址/ 整型tota

32、l,表示学生总数/函数返回值:整形,0表示正常输出;1表示异常输出int NumFind(Marks *point=NULL,int total=0);/函数功能:按照输入的六位学号查找相关数据/函数参数:Marks指针,表示对象数组的首地址/ 整型total,表示学生总数/函数返回值:整型,0表示找到数据;1表示没有找到数据int LevelFind(Marks *point=NULL,int total=0);/函数功能:按照等级查找相关数据/函数参数:Marks指针,表示对象数组的首地址/ 整型total,表示学生总数/函数返回值:整型,0表示该等级上没有数据7. void Exit(c

33、har *p1,Marks *p2);/函数功能:选择是否退回DOS,确定后释放相关内存/函数参数:字符型指针p1,表示Menu模块中输入选择字符串的首地址/Marks型指针p2,表示对象数组的首地址/函数返回值:无3.7.3逻辑功能程序#include#include#include#include#include#include#includeclass Marksprivate:char *Num;/学生学号float Amark;/平时成绩float Mmark;/期中成绩float Lmark;/期末成绩float Tmark;/总评成绩char Level;/成绩等级public:

34、Marks(float a=0.0,float m=0.0,float l=0.0,float t=0.0,char level=NULL,char *num=NULL);/构造函数Marks();/析构函数void Set(char *num=NULL,float amark=0.0,float mmark=0.0,float lmark=0.0);void printNAML( );/打印学号、平时成绩、期中成绩、期末成绩void ComputeZP( );/计算总评成绩void ComputeDJ( );/计算等级float GetZP( );/得到总评成绩char GetDJ( );/

35、得到等级friendMarks *In(int &total);/友元声明friend void CalData(Marks *point,int total);friend int Out(Marks *point,int total);friend int NumFind(Marks *point,int total);friend int LevelFind(Marks *point,int total);Marks:Marks(float a,float m,float l,float t,char level,char *num)/构造函数Amark=a;Mmark=m;Lmark=

36、l;Tmark=t;Level=level;Num=num;Marks:Marks()/析构函数delete Num;void Marks:Set(char *num,float amark,float mmark,float lmark)/成员函数定义Num=new charstrlen(num)+1;strcpy(Num,num);Amark=amark;Mmark=mmark;Lmark=lmark;void Marks:printNAML()cout Num tAmarkttMmarkttLmark=float(90)&Tmark=float(80)&Tmark=float(70)&T

37、mark=float(60)&Tmark=float(0)&Tmarkfloat(60)Level=E;void Marks:ComputeZP()Tmark=float(Amark*0.3+Mmark*0.3+Lmark*0.4);float Marks:GetZP()return Tmark;char Marks:GetDJ()return Level;char Menu(char *ptr);/函数声明Marks *In(int &total);void CalData(Marks *point=NULL,int total=0);void DataAnalysis(Marks *poi

38、nt=NULL,int total=0);int Out(Marks *point=NULL,int total=0);int NumFind(Marks *point=NULL,int total=0);int LevelFind(Marks *point=NULL,int total=0);void Exit(char *p1,Marks *p2); int main()char c;/接受菜单选择字符int Total=0;/学生总人数Marks *ptr=NULL;char *pt=NULL;while(1)c=Menu(pt);/调用菜单函数switch(c)case 1:ptr=I

39、n(Total);/文件导入模块break;case 2:CalData(ptr,Total);/计算模块break;case 3:DataAnalysis(ptr,Total);/成绩分析模块break;case 4:Out(ptr,Total);/成绩导出模块break;case 5:NumFind(ptr,Total);/按照学号查询模块break;case 6:LevelFind(ptr,Total);/按照等级查询模块break;case 7:Exit(pt,ptr);/退出模块break;default:coutInput Error!;break;coutnPress anyke

40、y to main menu.endl;getch();/while (!kbhit(); /检查当前是否有键盘按下(有回显)return 0;/函数功能:菜单显示并获得键盘选择/函数参数:字符型指针ptr,表示菜单选择时输入字符串地址/函数返回值:输入的键盘的ASCII码对应字符BACK:cout请按照序号选择操作:sign;ptr=sign;if(strlen(sign)1)coutInput Error!n;goto BACK;return *(sign);/函数功能:导入文件数据,并初始化基本数据/函数参数:整形引用total,表示学生总人数/函数返回值:Marks型的指针,表示存储文

41、件数据的对象数组的首地址Marks *In(int &total)char *add=new char20;/申请空间存放待打开文件地址coutPlease input the files address:endl;gets(add);cout 学号 平时成绩 期中成绩 期末成绩endl;ifstream fin(add);if(!fin)coutCant open the file!total;Marks *ptr=new Markstotal;for(int i=0;inum;finamark;finmmark;finlmark;(ptr+i)-Set(num,amark,mmark,lm

42、ark);(ptr+i)-ComputeZP();(ptr+i)-ComputeDJ();(ptr+i)-printNAML();fin.close();return ptr;/函数功能:计算总的平均分以及输出总评成绩和总的平均分/函数参数:Marks指针,表示对象数组的首地址/ 整型total,表示学生总数/函数返回值:无void CalData(Marks *point,int total)if(total=0|point=NULL)cout学生总数为零,无数据!endl;return;cout 学号 总评成绩 等级endl;float ALL=0;for(int i=0;iGetZP()

43、;cout Num GetZP()tGetDJ()endl;/格式输出float Average=ALL/float(total);coutn总的平均成绩: Averageendl;/函数功能:统计各分数段人数,计算百分比,并格式输出/函数参数:Marks指针,表示对象数组的首地址/ 整型total,表示学生总数/函数返回值:无void DataAnalysis(Marks *point,int total)if(total=0|point=NULL)cout学生总数为零,无数据!endl;/异常处理return;int a=0,b=0,c=0,d=0,e=0; /分别表示A、B、C、D、E等

44、级人数for(int i=0;iGetDJ();if(level=A)a+;else if(level=B)b+;else if (level=C)c+;else if(level=D)d+;else if(level=E)e+;float aper=0,bper=0,cper=0,dper=0,eper=0;aper=a/float(total);bper=b/float(total);cper=c/float(total);dper=d/float(total);eper=e/float(total);cout成绩分析:endl;couttt人数t 百分比endl; /设计精度,格式输出c

45、out优秀(等级A) atsetprecision(4)aper*100 %endl;cout良好(等级B) btsetprecision(4)bper*100 %endl;cout中等(等级C) ctsetprecision(4)cper*100 %endl;cout及格(等级D) dtsetprecision(4)dper*100 %endl;cout不及格(等级E) etsetprecision(4)eper*100 %endl;/函数功能:导出数据到文件保存/函数参数:Marks指针,表示对象数组的首地址/ 整型total,表示学生总数/函数返回值:整形,0表示正常输出;1表示异常输出

46、int Out(Marks *point,int total)if(total=0|point=NULL)cout学生总数为零,无数据!endl;return 1;char *add=new char20;coutPlease input the address you want to store:endl;gets(add);ofstream fout(add);/打开文件输出流if(!fout)coutCant open output file!endl;return 1;fout 学生学号 总评成绩 等级endl;for(int i=0;itotal;i+)fout Num tTmark

47、 tLevelendl;fout.close();cout文件成功已输出到:addendl;delete add;return 0;/函数功能:按照输入的六位学号查找相关数据/函数参数:Marks指针,表示对象数组的首地址/ 整型total,表示学生总数/函数返回值:整型,0表示找到数据;1表示没有找到数据int NumFind(Marks *point,int total)char *string=new char10;BEFORE:cout请输入你需要查找的学生学号(9位):endl;gets(string);if(strlen(string)!=9)coutInput Error!;go

48、to BEFORE;for(int i=0;iNum,string)=0)cout数据已找到:endl;cout学号 总评成绩 等级endl;coutNumtGetZP()tGetDJ()endl;return 0;/跳出循环cout没有找到你所需要的数据,请查证后重新查询!endl;return 1;/函数功能:按照等级查找相关数据/函数参数:Marks指针,表示对象数组的首地址/ 整型total,表示学生总数/函数返回值:整型,0表示该等级上没有数据int LevelFind(Marks *point,int total)char *sign=new char10;SNOW:cout请输入

49、需要查询的等级(A、B、C、D、E):endl;gets(sign);if(strlen(sign)=1&(*sign=A|*sign=B|*sign=C|*sign=D|*sign=E)/异常处理条件判断int theme=0;for(int i=0;iLevel=*(sign)coutNumtGetZP()tGetDJ()endl;theme+;if(theme=0)cout该等级上无成员!endl;return 0;elsecoutInput Error!endl;goto SNOW;/函数功能:选择是否退回DOS,确定后释放相关内存/函数参数:字符型指针p1,表示Menu模块中输入选择

50、字符串的首地址/Marks型指针p2,表示对象数组的首地址/函数返回值:无void Exit(char *p1,Marks *p2)char c;A:coutnDo you really want to return to DOS?(y/n)c;if(c=y|c=Y)delete p1;/释放内存delete p2;exit(0);else if(c=n|c=N)return;elsecoutInput error!endl;goto A;/对输入错误进行提示,并重新输入3.7.4结果及完善方向将以上源程序编译、链接、运行后所得的结果如下:程序选择界面在D盘下新建一个测试文件note.dat,

51、内容与前面成绩设计思路中相同。选择“1”,输入文件地址D:note.dat选择“2”,计算总评成绩和总平均成绩选择“3”,进入成绩分析菜单选择“4”在D盘下打开导出的out.dat文件,其结果如下:学生学号 总评成绩 等级 B 75.45 C B 81.55 B B 78.8 C B 80.5 B B 85.85 B B 71.9 C B 76.1 C B 63.4 D B 88.1 B B 91.5 A B 54.65 E B 68.1 D B 76 C B 78.2 C B 80.5 B选择菜单“5”,进入按照学号查询界面,输入学号:“B”选择菜单“6”,进入等级查询界面,输入“B”选择“

52、7”成绩核算系统与之前的五个程序相比更加复杂,虽然在程序的设计过程中定义了类,建立的类的对象数组,引入了面向对象的概念。但是在各个模块的实现过程中引入了较多的友元函数,感觉整体过程仍然是采用面向过程的编程方法,以选择菜单为模板划分,逐步完善各个模块的功能。所以这个程序的主要完善方向就是优化设计方法,尽量使用面向对象的编程方法。另外,就程序的功能实现而言,可以考虑增加一个修改模块,修改导入的文件原始数据,并能够返回到原始文件中。还有个人感觉需要完善的依然上前面已经提的很多的异常处理,虽然在编程的过程中相对上面五个程序已经考虑了很多异常处理的情况,但终究水平有限,未能做到对各个异常情况的处理。3.

53、8模拟电信计费系统的设计与实现3.8.1设计题目及要求模拟电信计费系统的设计与实现要求:(1) 计费功能。根据存放在源数据文件中的通话记录和长途费率文件对每一条通话记录计算其通话费用,并将结果保存在费用文件中。其中:通话费的计算方法如下:通话费长途电话费本地电话费长途电话费费率(元/分钟)通话时长(分钟) (通话时长不满1分钟的按1分钟计算)本地电话费为:3分钟以内0.5元,以后每3分钟递增0.2元。(2) 话费查询。输入一个电话号码,从费用文件中统计该电话号码的所有本地话费、长途话费,并从用户文件中查找其用户名,最后在屏幕上显示:用户名 电话号码 本地话费 长途话费 话费总计(3) 话单查询

54、。输入一个电话号码,查询并在屏幕显示该用户的所有通话记录,格式为:用户名 主叫电话号码 被叫电话号码 通话时长3.8.2设计思想及程序流程框图程序设计大致思路:1.本系统的输入输出文件本系统的输入文件有三个:(1) 源数据文件(hd.dat)存放:主叫区号 主叫电话号码 被叫区号 被叫电话号码 通话时长(秒)每次通话作为一条记录,占源数据文件的一行。每条记录中各数据之间以空格间隔,例如:025 010 90每个电话号码可以有多次通话记录。如果主、被叫区号相同,则通话记录为本地通话记录;否则为长途通话记录。(2) 长话费率文件(fl.dat)存放:区号 费率例如:010 1.20 表示从本地打往

55、区号为010的地区每分钟收费1.20元。(3) 用户文件(yh.dat)存放: 电话号码 用户姓名例如: 张明 本系统的输出文件有一个:费用文件(fy.dat)存放:主叫电话号码 通话类型 话费金额其中,通话类型表示本次通话是长途还是本地。2.系统输入数据hd.dat有20条通话记录,分别是:fl.dat 有4条记录 025 025 70 010 1.20 025 010 236020 1.20 025 025 310 021 0.80025 0571 1000571 1.00025 021 50 025 025 80 025 025 115 yh.dat有5条记录025 025 47 张明0

56、25 010 93 李小红025 010 792 王励025 0571 931 赵强025 025 580 杨冬025 025 358 025 021 197025 025 256 025 010 193025 025 320 025 025 270025 025 231 025 025 723.数据结构(可用C+实现)三个类:话单(callist)、费用(charge)和用户(user)两个常量:存放本地费率和递增量(1)话单类数据成员:主叫区号、主叫电话号码、被叫区号、被叫电话号码、通话时长数据类型属性(私有、保护、公有)方法:构造函数和析构函数 从源数据文件读入通话数据显示一次通话数据取

57、主叫区号取主叫电话号码等等(2)费用类 从话单类派生数据成员: 通话类型、通话费用数据类型属性(私有、保护、公有)方法: 构造函数和析构函数 从费用文件读入费用数据 向费用文件输出数据 屏幕显示费用 求通话费用 求通话类型 取(返回)通话类型 取通话费用等等(3)用户类数据成员:姓名、电话号码数据类型属性(私有、保护、公有)方法: 设置用户的电话号码 查询用户名设置用户名 查询用户的电话号码显示用户名和电话号码 等等话单类(CallList)class CallListprotected:char *ZCode;/主叫区号char *ZNum;/主叫号码char *BCode;/被叫区号cha

58、r *BNum;/被叫号码int Time;/通话时长(秒)public:CallList(char *zcode=NULL,char *znum=NULL,char *bcode=NULL,char *bnum=NULL,int time=0);CallList();void Set(char *zcode=NULL,char *znum=NULL,char *bcode=NULL,char *bnum=NULL,int time=0);void Print();char *getZC();char *getZN();char *getBC();char *getBN();int getTi

59、me();费用类(Charge) 从话单类派生class Charge:public CallList/公有继承protected:int CallStyle;/为0时表示本地通话,为1时表示长途通话float Expense;/话费public:Charge(char *zcode=NULL,char *znum=NULL,char *bcode=NULL,char *bnum=NULL,int time=0,int callstyle=0,float exp=0);void Set(char *zcode=NULL,char *znum=NULL,char *bcode=NULL,char

60、 *bnum=NULL,int time=0);void ComputeSty();int GetStyle();float GetExp();void PrintExp(); (3)用户类(Consumer)class Consumerprotected:char *Name;/用户姓名char *Num;/用户电话号码public:Consumer(char *name=NULL,char *num=NULL);Consumer();void SetName(char *name=NULL);void SetNum(char *num=NULL);char *GetName();char

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论