zoukankan      html  css  js  c++  java
  • 2016012074+小学四则运算练习软件项目报告

    代码仓库:https://git.coding.net/theMostCute/sizeYunSuanO.git

    需求分析:

    1. 程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间
    2. 每个练习题至少要包含2种运算符。不能存在分数、负数与非整数。
    3. 练习题生成好后,将你的学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致

    功能设计:

    1. 判断n是否合法
    2. 生成n个题目,题目满足要求
    3. 判断题目的结果是否为分数、负数与非整数

     

    设计实现:

    由于自己大部分时间都是学习的前端开发,对JavaScript比对Java熟悉,所以采取的方法为先用JavaScript写出功能,再转为Java。在下面的算法解说中,也会采取分开JavaScript解说和Java解说

    因为对Java语言的不熟悉,有很多细节进行了阉割。

     

    四则运算式求出的思路:用一组数组取随机个数的运算符,再用另一个数组取随机数,再混合两个数组,把混合后的数组转换为字符串,然后用后缀表达式进行求出

    需要:

    设计能随机取符号的方法

    Java中没有eval函数,所以要宁外写后缀表达式。

     

    算法详解:

    1.判断输入的n为正整数:

    JavaScript版:通过正则表达式

     var r = /^+?[1-9][0-9]*$/ ;//正整数+0
        if(r.test(n)){
             chuti(n);
        }else{
             alert("请输入正确正整数!!!");

    由于对Java语言不熟悉,在Java版只添加了0<n<1000

    2.生成题目:用一组数组取随机个数的运算符,再用另一个数组取随机数,再混合两个数组,把混合后的数组转换为字符串

    这个部分的算法思路都是一样的:

    JavaScript:

    for(i=0;i<n;i++){   
         var oo=Math.floor((Math.random()*10+4)/2);//有多少个符号
        var aAarr=[];//符号数组
        for(q=0;q<oo;q++){
            var m=Math.floor(Math.random()*100+1);//随机符号
            aAarr[q]=fuhao(m);
        }
       
        var oo1=oo+1;//有多少数字
        var oAarr=[];//随机数数组
        for(z=0;z<oo1;z++){
            oAarr[z]=Math.floor(Math.random()*100+1);//随机数
        }
        
        var bigArarr=[];
        
        for(p=0;p<oo1;p++){    //将符号与随机数混合
               j=2*p;
               bigArarr[j]=oAarr[p];   
               l=j+1;
               bigArarr[l]=aAarr[p];
          
        }
        var suanshi=bigArarr.toString();
    var osuan=suanshi.replace(/,/g,'');

    Java:Java的数组要求比JavaScript严格很多,在这个部分一直报错

     for(int i=0;i<no;i++){   
             
                 
                 int oo=(int)Math.floor((Math.random()*10+4)/2);//有多少个符号
                 String aAarr[]=new String[oo];//符号数组
                 for(int q=0;q<oo;q++){                    
                        int m=(int)Math.floor(Math.random()*100+1);//随机符号
                        aAarr[q]=a.fuhao(m);                  
                    }
                
                 int ooo=oo+1;//有多少数字
                    int oAarr[]=new int[ooo];//随机数数组
                    for(int z=0;z<ooo;z++){
                        oAarr[z]=(int)Math.floor(Math.random()*100+1);//随机数
                       
                    }
                  int aaa=oAarr.length+aAarr.length;
                  //System.out.println(aaa);
                  String bigArarr[]=new String[aaa];
                  for(int p=0;p<aaa;p++){    //将符号与随机数混合
                       int j=2*p;
                       int l=j+1;
                       if(p<oAarr.length){
                       bigArarr[j]=oAarr[p]+"";
                       }
                       if(p<aAarr.length){
                        bigArarr[l]=aAarr[p];   
                       }
                      // System.out.print(bigArarr[p]);                     
                      }
                  StringBuffer sbb = new StringBuffer();
                  for(int wq = 0; wq < bigArarr.length; wq++){
                   sbb. append(bigArarr[wq]);
                  }
                 

    3.算出结果

    JavaScript:eval函数超级强大,只需要一行代码

    osan=eval(osuan);

    Java:没有eval函数,所以用了后缀表达式,在童宇欣小姐姐的帮忙下,并参考了她的代码,搞定了它

    for (int j = -1; j < len - 1; j++) {//把题目字符串进行拆分,拆分出数字和运算符,分别进行存储
                if (question.charAt(j + 1) == '+' || question.charAt(j + 1) == '-' || question.charAt(j + 1) == '*'
                        || question.charAt(j + 1) == '÷' || question.charAt(j + 1) == '(' || question.charAt(j + 1) == ')'
                        || j == len - 2) {
                    if (j == -1) {//如果第一个就是运算符,即左括号,存储在操作符栈中
                        operate.push(question.charAt(0));
                    } else if (j == len - 2) {//如果到字符串的最后了,直接存储到数字栈中
                        number.push(question.substring(k));
                        break;
                    } else {
                        if (k <= j) {
                            number.push(question.substring(k, j + 1));//是数字的话存储到数字这个栈中
                        }
                        if (operate.empty() || question.charAt(j + 1) == '(') {
                            operate.push(question.charAt(j + 1));
                        } else if ((operate.peek() == '+' || operate.peek() == '-')
                                && (question.charAt(j + 1) == '*' || question.charAt(j + 1) == '÷')) {
                            operate.push(question.charAt(j + 1));
                        } else if (operate.peek() == '(') {
                            operate.push(question.charAt(j + 1));
                        } else if (question.charAt(j + 1) == ')') {
                            number.push(String.valueOf(operate.pop()));
                            if (!operate.empty()) {
                                operate.pop();
                            }
                        } else {
                            if(operate.peek()==question.charAt(j + 1)){
                                same++;
                            }
                            number.push(String.valueOf(operate.pop()));
                            operate.push(question.charAt(j + 1));
                        }
                    }
                    k = j + 2;
                }
            }
            
          

    4.判断题目的结果是否为分数、负数与非整数

    JavaScript:正则表达式

    var r = /^+?[1-9][0-9]*$/ ;//正整数+0
        if(osan<0){     //判断为非负数
            i=i-1;
        }else if(r.test(osan)){    //判断为正整数+0
           var para=document.createElement("p");
           var node=document.createTextNode(osuan+"="+(osan));
               para.appendChild(node);
           timu.appendChild(para);
        }else{
            i=i-1;
        }   

    5.随机取符号的方法:利用取随机数的方法,进行范围规范

    JavaScript:

     
    function fuhao(o){
        var oyo;
        if(0 <o&&o<25){
            oyo="+";
        }else if(25<o&&o<50){
            oyo="-";
        }else if(50<o&&o<75){
            oyo="*";
        }else{
            oyo="/";
        }
        return oyo;
    }  

    Java:原理一样

    public static String fuhao(double o){
            String oyo;
            if(0<o&&o<25){
                oyo="+";
            }else if(25<o&&o<50){
                oyo="-";
            }else if(50<o&&o<75){
                oyo="*";
            }else{
                oyo="÷";
            }
            return oyo;
        }

    6.Java文件导出

    try {
                    ps = new PrintStream("result.txt");
                    System.setOut(ps);// 把创建的打印输出流赋给系统。即系统下次向 ps输出
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }// 创建一个打印输出流

     测试运行

     

     

     JavaScript的页面展示:

     总结:

         本次作业暴露出了我自身Java能力的欠缺,以及感受到了不同语言之间的强大差异,用JavaScript写,包含了必要的HTML代码一起才90+行代码,而用Java得用150+行代码才可以出来。

         最大的区别是在于eval函数和正则表达式的应用上。

         用JavaScript写出所有功能花了一个多小时,而把JavaScript转为Java却花了我一天多,这还是我求助各位大佬和度娘的结果,但还是有很多细节并没有处理好。

         所以,经过本次学习,我深刻的知道自己该好好的复习复习Java了

     

    PSP  

    PSP2.1

    任务内容

    计划共完成需要的时间(min)

    实际完成需要的时间(min)

    Planning

    计划

    10

    10

    Estimate

    估计这个任务需要多少时间,并规划大致工作步骤

    10

    10

    Development

    开发

    500

    2000+

    Analysis

    需求分析 (包括学习新技术)

    20

    20

    Design Spec

     生成设计文档

    10

    10

    Design Review

    设计复审 (和同事审核设计文档)

    5

    5

    Coding Standard

     代码规范 (为目前的开发制定合适的规范)

    1

    1

    Design

    具体设计

    20

    40

     Coding

    具体编码

    400

    2000+

    Code Review

    代码复审

    20

    20

     Test

    测试(自我测试,修改代码,提交修改)

    15

    30

    Reporting

    报告

    20

    30

    Test Report

    测试报告

    10

    20

       Size Measurement

    计算工作量

    1

    1

    ·     

    ·     

     

     

     

  • 相关阅读:
    SpringBoot java.lang.IllegalArgumentException: Request header is too large
    (转)以太坊 钱包 创建 导入 Keystore
    (转)以太坊数据同步常见问题集锦
    以太坊nonce
    (转)Fabric 1.0 读写集
    (转)Fabric CA环境的集成
    Hyperledger Fabric CA的命令行用法
    oracle新建表空间与用户
    积分智能合约
    远程桌面,身份验证错误:要求的函数不正确等解决办法
  • 原文地址:https://www.cnblogs.com/Dear-Demon/p/8640935.html
Copyright © 2011-2022 走看看