四则运算式自动生成
0.题目
我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
· 能够自动生成四则运算练习题
· 可以定制题目数量
· 用户可以选择运算符
· 用户设置最大数(如十以内、百以内等)
· 用户选择是否有括号、是否有小数
· 用户选择输出方式(如输出到文件、打印机等)
· 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主
1.前言
这次工程是结对编程,我是驾驶员角色,顾同学是领航员角色。
代码地址: 四则运算式自动生成
2.需求分析
从题目可以大概了解到面向的服务群体是老师,小学生,和学生家长等,是一个自动生成小学四则运算的程序。考虑到小学生是为了课后练习,提高计算能力,所以还需要显示答案
的功能。
3.产品设计
根据这个题目,做一下简单的产品设计,用户可以输入题目数量
。
然后选择运算符
,由于是服务群体是小学,所以考虑加减乘除四个运算符。
用户根据自身水品,选择所要生成的运算范围,所以需要有一个最大值
和最小值
的输入,这个可以考虑负数的情况。
用户进阶可以选择小数运算
和多项式运算
,这里考虑用两个开关来控制。
计算自动生成的运算式的结果
,供用户参考。
暂时就先考虑这么些。
4.编码
这里就简单介绍一下我们的思路和主要方法,代码源码已提供,具体方法功能都有注释,需求请在上方链接自取。
下面是我们的思路:
1.首先,我们把四则运算分为了三种,整数型运算式
,小数型运算式
和整数多项式
。
2.然后就是分别考虑这三种情况,这里我讲解一下小数型运算式
我们的思路,关于随机小数的生成,我们采用了随机整数拼接小数点在拼接随机0到9的方法,这样可以得到随机一位小数,然后将用户所选择的不同运算符存入数组,进行随机运算符,最后就是简单的拼接小数与运算符达到自动生成小数型运算式的目的。
//生成随机小数
- (float)decimal:(int)maxNum min:(int)minNum{
int first;
int second;
first = [self getRandomNumber:minNum to:maxNum];
second = [self getRandomNumber:0 to:10];
decimal = [NSString stringWithFormat:@"%d.%d",first,second];
return [decimal floatValue];
}
//小数四则运算
- (void)decimalArithmetic{
int temp;
float first;
float second;
NSString *string;
NSString *key;
DecimalNumber *decimalNumber = [[DecimalNumber alloc]init];
_dic = [NSMutableDictionary dictionary];
for (int i=0; i<count; i++) {
//生成随机运算符
temp = [self getRandomNumber:0 to:(int)signArray.count-1];
//NSLog(@"temp is %d",temp);
//生成随机小数
first = [decimalNumber decimal:maxValue min:minValue];
second = [decimalNumber decimal:maxValue min:minValue];
NSLog(@"(%.1f) %@ (%.1f)",first,[signArray objectAtIndex:temp],second);
string = [NSString stringWithFormat:@"(%.1f) %@ (%.1f)",first,[signArray objectAtIndex:temp],second];
key = [NSString stringWithFormat:@"%d",i];
[_dic setValue:string forKey:key];
}
}
3.关于求和,我们将随机生成的运算式存入了字典类型,并将运算结果也存入了字典类型。
//运算式存入_dic字典
NSLog(@"%d %@ %d",first,[signArray objectAtIndex:temp],second);
string = [NSString stringWithFormat:@"%d %@ %d",first,[signArray objectAtIndex:temp],second];
key = [NSString stringWithFormat:@"%d",i];
[_dic setValue:string forKey:key];
//运算式结果存入_answerDic字典
NSString *sign = [NSString stringWithFormat:@"%@",[signArray objectAtIndex:temp]];
//计算运算结果函数
answer = [self answerFirst:first Sign:sign Second:second];
NSString *strAnswer = [NSString stringWithFormat:@"%d",answer]; [_answerDic setValue:strAnswer forKey:key];
4.展示部分,我们选择了常见的tableview去展示运算式,当用户点击运算式,便可以得到正确答案。
关于这个展示部分我不得不多说两句,这里我写完展示代码之后却一直没有效果,展示的内容不是应该输出的运算式而是一片空白,我一直调试到深夜,最后我才发现我将tableview定义了两次,给tableview传值之后又重新定义了一次。。。哇,我是在用生命写bug。。。
5.测试
这里就交给了我的导航员了,想看bug请移步--->我写的代码怎么可能有bug之烫烫烫烫
6.成果展示
启动动画
正常输入
小数式生成
多项式生成
计算结果
输入异常处理
运算符异常处理
最值异常处理
6.对领航员的评价
这次的结对编程较之上次,合作关系更为紧密,虽然自己之前也有过结对编程的经验,全是男的啊,怎么能跟女生相提并论呢,2333,开个玩笑。所以评价谈不上,更贴切的词语应该是感谢吧,我的结对伙伴----顾同学,初期邀请我为结对伙伴,让我脱离了没有结对伙伴的尴尬境地,中期一起进行的需求分析,产品设计,代码编写,尤其是测试部分,都给予了很多帮助,比如,编写代码时当我实现了某个功能而沾沾自喜时,能够真心的与我体会快乐,而不是泼冷水;当我为某个实现低头懊恼,她能为我加油鼓劲,转移我的负面情绪,当然,不仅限于此,也检测出了代码的很多bug,页面的适配问题,输入异常值的崩溃,而且UI方面也提供了很多建议,应用开启闪屏图片的挑选,界面的整体布局,颜色的搭配...诸如此类,不胜枚举。整个工程在这样积极的氛围中提前完成了,也完成了最后一次结对作业,最后再次感谢顾同学,谢谢。附上结对编程纪念:
7.总结
这次的工程整个过程还是相当愉快的,因为之前有开发的基础,所以这个项目对我来说难度不是很大。一些学习经验在这个工程中也得到了良好的应用,之前的开发中自己作为一个被动者,虽然在一些前辈的引导下一直规范自己,但一直对一些软件工程方面的理解不是很到位,这次自己转被动为主动,对这些知识有了深刻的理解,为什么必须先进行项目需求分析,是为了化抽象为客观,不仅编码时有助于梳理自己的思路,而且系统设计时也能考虑到一些可能的变更预留接口;编码过程中应及时注释而不是整个工程完毕之后再写,不仅可以及时定位方法函数,而且可以记录自己的一些灵感;开发工程中及时上传Git,防止一些不可预估原因导致前功尽弃等等。路漫漫其修远兮,吾努力当加之。