资源描述
.湖北文理学院程序设计课程设计报告项目名称:竖式加法、乘法学生姓名:xx学 号:20111171xx班 级:计科1111班指导老师:xxx日 期:2013.6.251、项目描述使用字符数组存储整数,采用类似小学生进行竖式运算的方式,完成加法和乘法。2、项目的需求分析在软件工程中,需求分析指的是在建立一个新的或改变一个现存的系统或产品时,确定新系统的目的、范围、定义和功能时所要做的所有工作。需求分析是软件工程中的一个关键过程。在这个过程中,系统分析员和软件工程师确定顾客的需要。只有在确定了这些需要后他们才能够分析和寻求新系统的解决方法。需求按层次分为用户需求和系统需求:用户需求是用自然语言加图的形式给出的、关于系统需要提供哪些服务以及系统操作受到哪些约束的声明;系统需求详细地给出系统将要提供的服务以及系统所受到的约束,系统需求文档有时也称为功能描述,应该是精确的,它可能成为系统买方和软件开发者之间合同的重要内容。软件系统需求常常分为功能需求和非功能需求:功能需求包括对系统应该提供的服务、如何对特殊输入做出反应,以及系统在特定条件下的行为的描述,在某些情况下,功能需求可能还需声明系统不应该做什么;非功能需求是对系统提供的服务或功能的约束,包括时间约束、开发过程的约束和所受到的标准的约束,非功能需求经常适用于整个系统而不是个别的系统功能或服务,例如性能,可靠性,安全性和可用性等。非功能需求通常会比个别的功能需求更加关键,它会影响整个系统的体系结构,而不是个别的组件。例如,为了保证系统的性能需求,就必须合理组织系统使得组件之间的通信量达到最小。图 1 需求获取和分析的产品2.1、界面需求2.2、输入输出要求演示程序以用户和计算机的对话方式执行,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据(滤去输入中的非法字符)和运算结果显示在其后。2.3、功能需求使用字符数组存储整数,采用类似小学生进行竖式运算的方式,完成加法和乘法。2.4、程序的结构要求按面向对象结构化程序3、项目设计软件设计在软件工程过程中处于技术核心,并且它的应用与所使用的软件过程模型无关。一旦对软件需求进行分析和建模,软件设计就开始了。软件设计是建模活动的最后一个软件工程活动,接着便要进入构造阶段(代码生成和测试)。在软件系统设计的过程中,开发者定义项目的设计目标,将系统分解为更小的子系统,这些子系统可以由各个团队分别实现,开发者还要选择构建系统的策略,比如硬件/软件策略、持久性数据管理策略、全局控制流、访问控制策略、边界条件处理等。系统设计后得到的是一个包括子系统分解和每个策略都清晰描述的模型。系统设计是与算法无关的,它由一些活动组成,每一个活动都专注于分解系统整个问题中的某一部分:a) 标识设计目标。开发者标识并区分应进行优化的各种系统特征的优先顺序。b) 设计初始子系统分解。根据用例和分析模型将系统分解成一些小部分,在此活动中,开发者将采用标准的体系结构风格(分层体系结构,容器体系结构,客户机-服务器体系结构,管道和过滤器体系结构)作为起始点。c) 求精子系统分解以应对设计目标。初始的分解大都不满足所有的设计目标,必须不断分解和求精,直到所有的设计目标都满足了。3.1、总控流程设计编译预处理命令:#include#include#include#include定义类:class SeqStackclass counter函数申明:SeqStack()void Push(int x)int Pop()int Empty()counter(char bpN,char jpN,char yp )void add()void mul()3.2、程序结构设计主程序mian-cout输入被加(乘)数:cout输入加(乘)数:cout您想做的运算:counter(js,bjs,ysf);-结束;3.3、数据结构及类型设计1.基本类型:1)常量的使用const int maxsize=1002)整型(int)2、构造类型:1)数组类型:(datastacksize)3.4、功能模块设计输入两个数据,选择要进行的加法或乘法的算法4、测试用例设计软件工程中的测试用例是一组条件或变量(输入数据和期望结果的集合),测试者根据它来确定应用软件或软件系统是否正确工作。测试用例是通过实验达到引起构件失效和发现构件故障的目的。确定软件程序或系统是否通过测试的方法叫做测试准则。一个测试用例有5个属性:名称、可执行的路径全称、输入数据、测试预言(期望的测试结果与输出结果的比较)和日志(测试产生的输出)。4.1、输入/输出测试用例输入:输出:5、关键代码设计1. class SeqStack/栈的建立private:T dataStackSize;int top;public:SeqStack()top=-1;void Push(T x)if(top=StackSize-1)throw 上溢;data+top=x;T Pop()if(top=-1)throw下溢;T x=datatop-;return x;int Empty()if(top=-1)return 1;return 0;2. class counterprivate:int data1,data2;/数据的数值int data1sN,data2sN;/数据的逆序的整数存储int Maxlength;/输入的数据最大长度public:int length1,length2; counter(char bpN,char jpN,char yp )data1=atoi(bp);/被乘数data2=atoi(jp);/乘数int bound1=data1;int bound2=data2;int i,k1,k2;for(i=0;iN;i+)data1si=0;data2si=0;i=0;SeqStackd1;SeqStackd2;while(bound1!=0)data1si=bound1%10;d1.Push(data1si);bound1=bound1/10;i+;length1=i;i=0;while(bound2!=0)data2si=bound2%10;d2.Push(data2si);bound2=bound2/10;i+;length2=i;Maxlength=length1length2?length1:length2;if(yp=+)/加法k1=Maxlength+2-length1;for(i=0;ik1;i+)coutt;while(!d1.Empty()coutd1.Pop()t;coutendl;k1=Maxlength+1-length2;for(i=0;ik1;i+)coutt;cout+t;while(!d2.Empty()coutd2.Pop()t;coutendl;cout-endl;add();else if(yp=*)/乘法k2=Maxlength+length2-length1;for(i=0;ik2;i+)coutt;while(!d1.Empty()coutd1.Pop()t;coutendl;k2=Maxlength-1;for(i=0;ik2;i+)coutt;cout*t;while(!d2.Empty()coutd2.Pop()t;coutendl;cout-endl;mul();elsecout无此类运算!; void add()/加法int jw=0,i=0;SeqStackQ;while(i=Maxlength)int x=data1si+data2si+jw;jw=x/10;x=x%10;Q.Push(x);i+;coutt;while(Q.Empty()!=1)coutQ.Pop()t;void mul()/乘法int boundN,bsN;/记录第一步各个位乘法运算之后的数据int boundsN,sumN;int i,j,k,jw=0,step,ws=length2+Maxlength;i=0;while(ilength2)boundi=data2si*data1*pow(10,i);i+;for(i=0;iN;i+)sumi=0;boundsi=0;bsi=0;for( i=0;ilength2;i+)bsi=boundi;for(k=0;k=0;i-)coutboundsit;coutendl;for(i=0;i1)cout-=0;i-)coutsumit;5.1、总控程序关键代码int main()char jsN,bjsN;char ysf;cout输入被加(乘)数:js;cout输入加(乘)数:bjs;cout您想做的运算:ysf;counter(js,bjs,ysf);system(PAUSE);return 0;6、程序调试与测试测试活动技术主要包括:构件检查、可用性测试、单元测试、集成测试和系统测试。构件检查是通过对源代码的手工检查发现单个构件中的故障。可用性测试用于找出现实系统做了什么和用户所期望系统应该做什么之间的差异。单元测试通过使用测试桩程序和测试驱动程序来隔离单个构件的方法以发现故障,也可以通过对一个构件执行测试用例来完成这个功能。集成测试通过集成多个构件来查找故障。系统测试狐妖关注整个系统、系统的功能和非功能需求以及目标环境等。6.1、用例1测试结果6.2、用例2测试结果7、总结这个课程设计感觉好难,加法的还好点,乘法的太复杂了,感觉在两个数相加或者是相乘的时候的进位是最复杂的,在俩个数的相加的时候,设置了一个进位标志jw,当俩个数的相加大于10的时候,个位数进栈,十位数用jw来表示,与下一个数进行相加。8、附件:项目程序代码/竖式加法、乘法#include#include#include#includeusing namespace std;const N=10;const StackSize=100;/顺序栈templateclass SeqStackprivate:T dataStackSize;int top;public:SeqStack()top=-1;void Push(T x)if(top=StackSize-1)throw 上溢;data+top=x;T Pop()if(top=-1)throw下溢;T x=datatop-;return x;int Empty()if(top=-1)return 1;return 0;class counterprivate:int data1,data2;/数据的数值int data1sN,data2sN;/数据的逆序的整数存储int Maxlength;/输入的数据最大长度public:int length1,length2; counter(char bpN,char jpN,char yp )data1=atoi(bp);/被乘数data2=atoi(jp);/乘数int bound1=data1;int bound2=data2;int i,k1,k2;for(i=0;iN;i+)data1si=0;data2si=0;i=0;SeqStackd1;SeqStackd2;while(bound1!=0)data1si=bound1%10;d1.Push(data1si);bound1=bound1/10;i+;length1=i;i=0;while(bound2!=0)data2si=bound2%10;d2.Push(data2si);bound2=bound2/10;i+;length2=i;Maxlength=length1length2?length1:length2;if(yp=+)/加法k1=Maxlength+2-length1;for(i=0;ik1;i+)coutt;while(!d1.Empty()coutd1.Pop()t;coutendl;k1=Maxlength+1-length2;for(i=0;ik1;i+)coutt;cout+t;while(!d2.Empty()coutd2.Pop()t;coutendl;coutendl;add();else if(yp=*)/乘法k2=Maxlength+length2-length1;for(i=0;ik2;i+)coutt;while(!d1.Empty()coutd1.Pop()t;coutendl;k2=Maxlength-1;for(i=0;ik2;i+)coutt;cout*t;while(!d2.Empty()coutd2.Pop()t;coutendl;coutendl;mul();elsecout无此类运算!; void add()/加法int jw=0,i=0;SeqStackQ;while(i=Maxlength)int x=data1si+data2si+jw;jw=x/10;x=x%10;Q.Push(x);i+;coutt;while(Q.Empty()!=1)coutQ.Pop()t;void mul()/乘法int boundN,bsN;/记录第一步各个位乘法运算之后的数据int boundsN,sumN;int i,j,k,jw=0,step,ws=length2+Maxlength;i=0;while(ilength2)boundi=data2si*data1*pow(10,i);i+;for(i=0;iN;i+)sumi=0;boundsi=0;bsi=0;for( i=0;ilength2;i+)bsi=boundi;for(k=0;k=0;i-)coutboundsit;coutendl;for(i=0;i1)cout=0;i-)coutsumit;int main()char jsN,bjsN;char ysf;cout输入被加(乘)数:js;cout输入加(乘)数:bjs;cout您想做的运算:ysf;counter(js,bjs,ysf);system(PAUSE);return 0;.
展开阅读全文