github项目地址 : FundamentalOperationshtml
演示地址:小学生四则运算在线测试 git
测试帐号:admin 、admin一、admin二、admin三、admin4程序员
密码:111github
注:因为服务器环境缘由,请忽略验证码,直接登录数据库
结对同伴的园子:城尘
express
实验要求编程
在《实验二 软件工程我的项目》中,同窗们实现了一个命令行四则运算出题小程序,本次实验采用结对编程方式,设计开发一个小学生四则运算练习软件,使之具备如下功能:小程序
(1)由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分;服务器
(2)题库文件可采用实验二的方式自动生成,也能够手工编辑生成,文本格式以下:session
(3)程序为用户提供三种进阶四则运算练习功能选择:百之内整数算式(必作)、带括号算式、真分数算式练习;
(4)程序容许用户进行多轮测试,提供用户多轮测试分数柱状图,示例以下:
(5)程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户能否进行新一轮的测试;
(6)测试有计时功能,测试时动态显示用户开始答题后的消耗时间。
(7)程序人机交互界面是GUI界面(WEB页面、APP页面均可),界面支持中文简体(必作)/中文繁体/英语,用户能够进行语种选择。
一、需求分析
二、功能分析
三、设计实现
四、运行测试
选择试题类型后,进行答题,并计时
五、核心代码
/** * 该类 从数据库中 以不一样的类别 随机抽取试题 */ @Controller @RequestMapping(value = "/expression") public class ExpressionController { @Autowired private ExpressionRepository expressionRepository; @RequestMapping(value = "/{type}") public String getExpressionPage(@PathVariable(value = "type") String type, Model model){ List<ExpressionEntity> expressionEntityList = expressionRepository.findByTypeTwenty(type); model.addAttribute("expressions",expressionEntityList); return "views/expressionPage"; } }
/** * 运算式的接口 */ public interface ExpressionRepository extends JpaRepository<ExpressionEntity,String>{ List<ExpressionEntity> findAll(); List<ExpressionEntity> findAllByType(@Param(value = "type") String type); @Query(value = "select * from expression where type = ?1 order by rand() limit 20",nativeQuery = true) List<ExpressionEntity> findByTypeTwenty(String type); }
@RequestMapping("/chart") public List<VisualizationEntity> getChartData(HttpServletRequest httpServletRequest){ HttpSession session = httpServletRequest.getSession(); UserEntity userEntity = (UserEntity) session.getAttribute("user"); List<VisualizationEntity> visualizationEntities = visualiRepository.findByUsername(userEntity.getUsername()); return visualizationEntities; }
//计算逆波兰式的结果 private static boolean evoe(ArrayList<String> strArr){ String str = ele.getOperations(); boolean flag = true;//判断过程当中是否有负数或小数点 int temp = 0;//存放临时计算结果 Stack<String> stack = new Stack<String>(); for(String s : strArr){ if(!str.contains(s)){//若是是数字,放入栈中 stack.push(s); }else{ int a = Integer.valueOf(stack.pop()); int b = Integer.valueOf(stack.pop()); try { switch(s){ case "+" : stack.push(String.valueOf(a+b)); break; case "-" : temp = b-a; if(temp < 0) flag=false; stack.push(String.valueOf(temp)); break ; case "*" : stack.push(String.valueOf(a*b)); break; case "/" : if(a == 0) {a = 1;flag = false;} temp = b/a; if(a*temp != b) flag = false; stack.push(String.valueOf(temp)); break ; } } catch (Exception e) { } } } ele.setResult(Integer.parseInt(stack.pop())); return flag; } //将逆波兰式转化为运算式 private static void pro_exp(ArrayList<String> strArr){ String str = ele.getOperations(); String ea,eb; String fh = " ";//临时的符号 boolean lastisnum = false;//记录临时符号后的一位是否为数字 Stack<String> expstack = new Stack<String>(); for(String s : strArr){ if(!str.contains(s)){//若是是数字,放入栈中 expstack.push(s); lastisnum = true; }else{ ea = expstack.pop(); eb = expstack.pop(); switch(s){ case "+" : expstack.push(eb+"+"+ea); break; case "-" : expstack.push(eb+"-"+ea); break ; case "*" : if("+-".contains(fh)){ if(!lastisnum) ea = "("+ea+")"; else eb = "("+eb+")"; } expstack.push( eb+"*"+ea); break; case "/" : if("+-".contains(fh)){ if(!lastisnum) ea = "("+ea+")"; else eb = "("+eb+")"; } expstack.push( eb+"/"+ea); break ; } fh = s; lastisnum = false; } } ele.setExp(expstack.pop()); } //随机生成逆波兰式 public static void test(){ ArrayList<String> strArr=new ArrayList<String>(); List list = Collections.synchronizedList(strArr); N = new Random().nextInt(4)+2; synchronized(list) { strArr.clear(); for (int i = 0; i < N; i++) { strArr.add(ele.random_N()); } for (int i = 0; i < N - 2; i++) { strArr.add(new Random().nextInt(strArr.size() - N + 1) + N - 1, ele.random_E()); } strArr.add(strArr.size(), ele.random_E()); } ele.setStrArr(strArr); }
6.结对编程过程
七、展现PSP
PSP2.1 |
任务内容 |
计划完成须要的时间(min) |
实际完成须要的时间(min) |
Planning |
计划 |
30 |
30 |
Estimate |
估计这个任务须要多少时间,并规划大体工做步骤 |
30 |
30 |
Development |
开发 |
360 |
300 |
Analysis |
需求分析 (包括学习新技术) |
100 |
60 |
Design Spec |
生成设计文档 |
10 |
10 |
Design Review |
设计复审 (和同事审核设计文档) |
20 |
10 |
Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
10 |
5 |
Design |
具体设计 |
60 |
35 |
Coding |
具体编码 |
120 |
120 |
Code Review |
代码复审 |
10 |
20 |
est |
测试(自我测试,修改代码,提交修改) |
30 |
40 |
Reporting |
报告 |
30 |
43 |
Test Report |
测试报告 |
25 |
30 |
Size Measurement |
计算工做量 |
2 |
3 |
Postmortem & Process Improvement Plan |
过后总结 ,并提出过程改进计划 |
3 |
10 |
八、对小伙伴的评价
此次合做的小伙伴是个人舍友@城尘。每当个人双手中止敲击键盘,沉浸在对于项目完成品幻想中时(误),小伙伴认真的态度以及对于项目内容的坚持老是能把我带回现实世界(继续敲代码)。小伙伴对于项目的态度,对我产生了极大的影响。为何这么说呢?由于我自己是一个很容易受到周围氛围影响的人。此次的项目我原本准备下降对于交互界面的追求,让小学生在白色和黑色交织的题海里徜徉一下。可是在小伙伴跟我提出了多个界面方案以后,我只能将个人想法压制在了内心,并无说。毕竟另外一我的在坚持,我又凭什么轻言放弃(毕竟舍友,万一被。。。)。
总而言之,小伙伴是一个能经过规范自身行为来影响他人的准程序员,我也于这种影响力中受到了极大的鼓舞。
九、 结对编程真的可以带来1+1>2的效果吗?经过此次结对编程,请谈谈你的感觉和体会。
首先1+1>2是一个抽象的概念,难道说是两我的结对编程的代码多于两人单干的代码量就是>2吗?我想应该不是这样的。结合此次项目来看,我最满意的功能是查看答案模块,点击查看答案后题目下方浮现出答案模块,其中白色背景是正确的题目答案,红色背景则相反。我在对小伙伴的评价中说过我一开始实际上是准备放弃界面的,然后面受到了伙伴的影响才选择认真完成界面内容。
若是没有合做,我想就是十个我也作不出这个效果。不是由于技术水平不够,而是当你一我的思考时,老是会陷入偏执。合做则让多我的的思想交融,固然前提是这些人内心的真实目标是一致的,这样才是一个团体。此次项目的效果在我看来,显然是1+1>10个我,由于显然十个我在一块儿,怕是会更加坚决的放弃界面(笑)。