201571030138《小学四则运算练习软件》结对项目报告

github项目地址 : FundamentalOperationshtml

演示地址:小学生四则运算在线测试  git

测试帐号:admin 、admin一、admin二、admin三、admin4程序员

密码:111github

注:因为服务器环境缘由,请忽略验证码,直接登录数据库

结对同伴的园子:城尘
express

实验要求编程

软件基本功能要求以下:

 在《实验二 软件工程我的项目》中,同窗们实现了一个命令行四则运算出题小程序,本次实验采用结对编程方式,设计开发一个小学生四则运算练习软件,使之具备如下功能:小程序

(1)由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分;服务器

(2)题库文件可采用实验二的方式自动生成,也能够手工编辑生成,文本格式以下:session

(3)程序为用户提供三种进阶四则运算练习功能选择:百之内整数算式(必作)、带括号算式、真分数算式练习;

(4)程序容许用户进行多轮测试,提供用户多轮测试分数柱状图,示例以下:

           

(5)程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户能否进行新一轮的测试;

(6)测试有计时功能,测试时动态显示用户开始答题后的消耗时间。

(7)程序人机交互界面是GUI界面(WEB页面、APP页面均可),界面支持中文简体(必作)/中文繁体/英语,用户能够进行语种选择。

一、需求分析

  该项目要求程序有人机交互界面,且可评判成绩。可为用户提供百之内整数算式、带括号算式、真分数算式三种练习,可为进行多轮测试并记录成绩生成柱状图而且记录用户消耗的时间。

二、功能分析

  • 可实现基本要求,便可生成数字在 0 和 100 之间,运算符在3个到5个之间的计算表达式,并计算出表达式的结果。
  • 随机可生成带括号的运算式。

三、设计实现

四、运行测试

  • 登陆页面

 

  • 登录成功后,跳转主页面,选择题目,下方的柱状图为用户第一次进行答题到目前答题状况的汇总。

  • 选择试题类型后,进行答题,并计时

  • 答题结束后,提交并获取分数,也可查看错误答案

  • 颜色为红色的是回答错误的问题答案,白色为回答正确问题答案。

五、核心代码

/**
 * 该类 从数据库中 以不一样的类别 随机抽取试题
 */
@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";
    }
}
表达式http请求接口
/**
 * 运算式的接口
 */
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个我,由于显然十个我在一块儿,怕是会更加坚决的放弃界面(笑)。

相关文章
相关标签/搜索