一.题目要求
本次作业要求两个人合作完成,驾驶员和导航员角色自定,鼓励大家在工作期间角色随时互换,这里会布置两个题目,请各组成员根据自己的爱好任选一题。
这次我和我的小伙伴选择了题目一。
- 题目1:
- 实现一个小学四则运算自动生成程序,要求:
- 能够自动生成四则运算练习题
- 可以定制题目数量
- 用户可以选择运算符
- 用户设置最大数(如十以内、百以内等)
- 用户选择是否有括号、是否有小数
- 用户选择输出方式(如输出到文件、打印机等)
- 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
- 实现一个小学四则运算自动生成程序,要求:
二.分工
此次结队编程,我身份为驾驶员,我的小伙伴姜同学身份为领航员。
在这里贴上我们的工作照
三.开发环境、设计思路
- IDE:Android Studio 3.1
- 开发语言:java
- 软件运行环境:android6.0及以上
- 设计思路:用listview来显示随机生成的四则运算,editview来获取输入条件,checkbox供用户选择操作符、括号或小数,一个button来生成随机四则运算到listview上显示,生成后点击listview的项,即在该项上显示该项算式所对应的结果。
四.代码
代码地址:https://github.com/xiepeiliang/Pair_Programming/tree/master/Pair_Programming
为了避免篇幅太长,我就在这里展示部分功能代码
生成随机的四则运算,里面的step1()、step2()、step3()是我写的生成随机算式的三个步骤,详细可见上方代码地址。
//构建随机式,成功则返回1,失败则返回0
public int buildItems(int sum) {
if(sum<=0)return 0;
items = new String[sum];
itemLen = new int[sum];
leftbra = new boolean[sum];
rightbra = new boolean[sum];
result = new double[sum];
Random random1 = new Random();
///items初始化,与每个items长度,以及括号状态
for (int i = 0; i < sum; i++) {
items[i] = "";
///定义式子最多有4个数,最少2个,括号情况下3个或4个
if (bracker==false)
itemLen[i] = random1.nextInt(3) + 2;
else
itemLen[i] = random1.nextInt(2) + 3;
///括号状态
leftbra[i] = false;
rightbra[i] = false;
result[i] = -1;
}
try {
step1();
step2();
step3();
} catch (Exception e) {
return 0;
}
return 1;
}
出错逻辑处理,返回出错类型并返回出错类型,返回0则无错,1为max、sum输入不合法,2为sum
public int dealError(String sum_str, String max_str, boolean checked) {
//editview非法输入捕捉
try {
sum = Integer.parseInt(sum_str);
max = Float.parseFloat(max_str);
} catch (Exception e) {
return 1;
} finally {
if(max<=0||sum<=0)
return 1;
}
if (sum >= 100000) {
return 2;
}
if (checked == false) {
return 3;
}
return 0;
}
生成按钮监听,按下根据条件生成随机算式,装入字符串数组items[]中,在将items[]装入listview的适配器中以达到在listview中显示的功能。
//悬浮按钮点击监听
@Override
public void onClick(View v) {
if (v.getId() == R.id.fab) {
int mark = dealError(editText1.getText().toString(), editText2.getText().toString(), getOperatorArray(add,sub,mul,div));
//无错
if (mark == 0) {
int temp = buildItems(sum);
if (temp == 1) {
//listview装入数据
adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, items);
listView.setAdapter(adapter);
listView.setOnItemClickListener(this);
Snackbar.make(v, "已生成你的四则运算啦^_^", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
} else {
Snackbar.make(v, "生成失败^_^", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
}
//sum,max不合法
else if (mark == 1) {
Snackbar.make(v, "请检查下条件是否合理哟^_^", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
//sum和法,但太大
else if (mark == 2) {
Snackbar.make(v, "生成题目数量太多小朋友消化不了哟^_^", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
//没有选操作符
else if (mark == 3) {
Snackbar.make(v, "您忘了选操作符哟^_^", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
}
}
五.app展示
安装包已经上传到我的百度网盘。
apk下载地址:https://pan.baidu.com/s/1R-Xbc7ExrmjgjnW0BYM_Xg
进入app
非法输入处理
生成题目
六. 对小伙伴的评价及总结
这是第二次和姜同学合作了,姜同学作为领航员,辅助我完成了这个App的设计与编写。驾驶员能不能到达目的地,除了看驾驶员的驾驶技巧之外,还是得靠领航员的指引与辅助。我的小伙伴就在这次的结队编程中给了我莫大的鼓励与引导。比如在设计UI界面的时候,作为女生对美具有天生的感受,姜同学给了我一些设计上的很好的意见,使得原本生硬的界面看起来美观了些。在我编写代码的时候,我无意之中犯的不管是语法上的还是逻辑上的错误在经过她清晰的思维后都能及时反馈给我,使我少走了些弯路。合作很愉快,男女搭配干活不累吧,这次的编码工作也不像原来自己那样一个人憋在宿舍自己敲键盘那样枯燥与乏味。尤其是在测试阶段,经过姜同学的分析后,发现我的代码的函数里有些地方冗杂且不清晰,复杂或重复的地方应该设计另外的函数然后使之耦合,所提的建议我觉得是对我写代码很好的提高与促进。所以,评价谈不上,更多的是感谢吧_
因为此前有过开发android应用的经历,android开发也一直在捣鼓,所以此次的设计与编写代码没有遇到太大的阻碍。就是在设计过程中大问题没有,倒是被一些小细节绊脚,比如ListView中对item的监听,误用方法setOnClickListener(),实则该用setOnItemClickListener(),这个小错误就浪费了很多时间和精力。这就暴露出了问题:对控件的方法的不熟悉---还不清楚混凝土是怎么和的就去造房233。自己在知道怎么用的同时也需要去知道它里面是怎么实现的这是更重要的。总之,这是一次很有价值的能够提高自我的结对编程经历。
不足的地方:对于这款应用的屏幕适配我没有做广泛的适配,在1080*1920分辨率的手机上可以正常显示界面,在高于或低于1080*1920分辨率的手机上显示可能会出现界面布局拉伸或挤压或重叠的异常,在具有类似华为手机的屏幕内虚拟按键的手机上,listview会被虚拟按键顶上去从而可能挡住其他控件。而后对于设计上可能有点用户不友好,比如设计的listview是可以点击显示答案的,可是没有提示让用户去点啊,用户不知道有这个功能啊等等,由于时间急迫,就这样先交了作业。等等这些都是值得改进的地方。