软件工程作业1——四则运算
coding 地址:http://git.oschina.net/lsrd
1、需求分析
设计一个小学生四则运算,符合加减乘除四则运算,不仅符合整事运算,还要能够进行真分数运算。整体都需求有:题数的统计,正确率的统计。
2、功能设计
主要功能设计的难点在于真分数的运算,随机生成分数进行转换成真分数,对于分数答案转换成真分数。运用一个循环体来控制生成题数及统计正确率。
3.设计实现
对于整数的四则运算设计比较简单,所以主要设计了真分数的四则运算。如果随机生成一个数为整数将其转化成真分数进行计算,如生成56,将其转换成56/1进行计算。
真分数的随机生成:随机生成两个整数让其相除形成一个分数,然后通过setNumeratorAndDenominator(int a, int b)算出分子分母的最大公因数,进行化简成真分数。答案生成的分数也用此方法进行化简成真分数,如出现67/1形式,直接以整数67形式输出。
真分数间的四则运算:加法将分子分母交叉相乘做分子,分母相乘做分母得出分数形式的答案在通过setNumeratorAndDenominator(int a, int b)化简为真分数输出。减法、乘法及除非也是类似的。
4.代码说明
代码方面分为两方面一个是主函数一个是算法的具体实现。主函数主要是一些输出格式形式的设计以及算法的引用。用switch随机选择产生整数或分数,如选择生成分数则产生两个随机数构成分数传入算法函数:
switch(x){ case 0: a=(int)(1+Math.random()*100);a1=a+"/"+1;a2=a+"";break; case 1: a1=(int)(1+Math.random()*100)+"/"+(int)(1+Math.random()*100); a2=a1;break; } int y=(int)(Math.random()*2); switch(y){ case 0: c=(int)(1+Math.random()*100);c1=c+"/"+1;c2=c+"";break; case 1 : c1=(int)(1+Math.random()*100)+"/"+(int)(1+Math.random()*100); c2=c1;break; } String chars = "+-*/"; char b=(chars.charAt((int)(Math.random() * 4)));
5、算法实现:
1、计算公因数化简分数为真分数
void setNumeratorAndDenominator(int a, int b){ // 设置分子和分母 int c = f(Math.abs(a),Math.abs(b)); // 计算最大公约数 numerator = a / c; denominator = b / c; if(numerator<0 && denominator<0){ numerator = - numerator; denominator = - denominator; } } int getNumerator(){ return numerator; } int getDenominator(){ return denominator; } int f(int a,int b){ // 求a和b的最大公约数 if(a < b){ int c = a; a = b; b = c; } int r = a % b; while(r != 0){ a = b; b = r;; r = a % b; } return b; } 2、四则运算算法实现: Calculator add(Calculator r){ // 加法运算 int a = r.getNumerator(); int b = r.getDenominator(); int newNumerator = numerator * b + denominator * a; int newDenominator = denominator * b; Calculator result = new Calculator(newNumerator,newDenominator); return result; } Calculator sub(Calculator r){ // 减法运算 int a = r.getNumerator(); int b = r.getDenominator(); int newNumerator = numerator * b - denominator * a; int newDenominator = denominator * b; Calculator result = new Calculator(newNumerator,newDenominator); return result; } Calculator muti(Calculator r){ // 乘法运算 int a = r.getNumerator(); int b = r.getDenominator(); int newNumerator = numerator * a; int newDenominator = denominator * b; Calculator result = new Calculator(newNumerator,newDenominator); return result; } Calculator div(Calculator r){ // 除法运算 int a = r.getNumerator(); int b = r.getDenominator(); int newNumerator = numerator * b; int newDenominator = denominator * a; Calculator result = new Calculator(newNumerator,newDenominator); return result; }
6.测试运行
7、
PSP2.1 |
Personal Software Process Stages | Time (%) Senior Student | Time (%) |
Planning | 计划 | 1 | 1 |
· Estimate | 估计这个任务需要多少时间 | 3 | 2 |
Development | 开发 | 4 | 5 |
· Analysis | 需求分析 (包括学习新技术) | 1 | 2 |
· Design Spec | 生成设计文档 | 1 | 1 |
· Design Review | 设计复审 | 1 | 1 |
· Coding Standard | 代码规范 | 1 | 1 |
· Design | 具体设计 | 3 | 1 |
· Coding | 具体编码 | 4 | 4 |
· Code Review | 代码复审 | 1 | 2 |
· Test | 测试(自我测试,修改代码,提交修改) | 2 | 3 |
Reporting | 报告 | 1 | 1 |
· | 测试报告 | 1 | 1 |
· | 计算工作量 | 2 | 2 |
· | 并提出过程改进计划 | 3 | 2 |
8、小结
这次作业是第一次以这种形式提交,很新颖。对于实验内容,四则运算的整数算法还算简单,主要是真分数的处理。随机真分数的产生、运算比较复杂。出现的问题是参数的传导比较乱,错了好久才解决,还是要多理解代码原理才行。