软工第二次作业——熟悉使用工具

GIT地址 我的GITHUB地址
GIT用户名 NyimaC
学号后五位 61111
博客地址 我的博客地址
作业链接 链接

Part1.环境配置

因为之前已经用JAVA写过程序,所以环境是已经配好了的,在此没有遇到太大的问题。
JAVA版本是JAVA8.0 编译器使用的是IDEA

软工第二次作业——熟悉使用工具_第1张图片

软工第二次作业——熟悉使用工具_第2张图片

软工第二次作业——熟悉使用工具_第3张图片


Part2.代码编写

编码题目:

阿超家里的孩子上小学一年级了,这个暑假老师给家长们布置了一个作业:家长每天要给孩子出一些合理的,但要有些难度的四则运算题目,并且家长要对孩子的作业打分记录。

作为程序员的阿超心想,既然每天都需要出题,那何不做一个可以自动生成小学四则运算题目与解决题目的命令行 “软件”呢。他把老师的话翻译一下,就形成了这个软件的需求:

程序接收一个命令行参数 n,然后随机产生 n 道加减乘除(分别使用符号+-*/来表示)练习题,每个数字在 0 和 100 之间,运算符在 2 个 到 3 个之间。

由于阿超的孩子才上一年级,并不知道分数。所以软件所出的练习题在运算过程中不得出现非整数,比如不能出现 3÷5+2=2.6 这样的算式。

练习题生成好后,将生成的 n 道练习题及其对应的正确答案输出到一个文件 subject.txt 中。

使用语言:JAVA

与题目不同的地方的声明:

1、运算符存在差异。题目上的是(+-*/) 我的是(+-×÷)

2、我的文件名为“题目.txt”

编码思路:

思维导图:

软工第二次作业——熟悉使用工具_第4张图片

代码部分(主要部分):

"Talk is cheap. Show me the code."

结构

软工第二次作业——熟悉使用工具_第5张图片

生成题目的类

public class FormulaMakerTest {
/**
 * 生成题目的类
 */

public LinkedList questionMaker(int total)
{
    //用于存放生成的运算式
    String[] formulas = new String[total];
    LinkedList questionList = new LinkedList<>();
    Numbers numbers = new Numbers();
    OperationImpl operation = new OperationImpl();
    OperationStringImpl operationString = new OperationStringImpl();

    //循环开始的参数(一个用于外循环,一个用于循环)
    int start1;
    int start2;
    //用于保存每次运算的结果
    int result;
    //用于标识运算是否会出现小数
    int judge = 0;
    for(start1=0; start1 queue = new LinkedList<>();
        queue = maker.calculateResult(numbers.numbers, numbers.operations);
        result = maker.calculate(queue);
        formulas[start1] += String.valueOf(result);
        questionList.add(formulas[start1]);
    }
    return questionList;
    }
}

栈进行四则运算的类

public class CalculateMaker {
/**
 * 用于获得后缀表达式
 * @return
 */
public Queue calculateResult(Integer[] num, Integer[] operations) {
    //用于存放之前的算式
    Queue queue1 = new LinkedList<>();
    //用于存放后缀表达式
    Queue queue2 = new LinkedList<>();
    int i;
    //把运算式放入队列
    for(i=0; i stack = new Stack<>();
    //用于标注队列中运算符的位置
    i = 2;
    while(!queue1.isEmpty()) {
        //此位置是运算符
        if(i%2==1) {
            i++;
            int num1, num2;
            //把运算符放进去
            if(stack.empty()) {
                stack.push(queue1.poll());
            }else {
                //取队首元素的值(用Unicode码来判断,加减号的值小于100,乘除号的值大于100)
                num1 = Translate.translateToInt(queue1.poll());
                if(num1<100) {
                    while (!stack.isEmpty()) {
                        queue2.offer(stack.pop());
                    }
                    stack.push(Translate.translateToString(num1));
                }else {
                    num2 = Translate.translateToInt(stack.peek());
                    if(num2<100) {
                        stack.push(Translate.translateToString(num1));
                    }else {
                        queue2.offer(stack.pop());
                        if(stack.isEmpty()) {
                            stack.push(Translate.translateToString(num1));
                        }else {
                            while(!stack.isEmpty()) {
                                if(stack.isEmpty()) {
                                    stack.push(Translate.translateToString(num1));
                                    break;
                                }
                                num2 = Translate.translateToInt(stack.peek());
                                if(num2<100) {
                                    stack.push(Translate.translateToString(num1));
                                    break;
                                }else {
                                    queue2.offer(stack.pop());
                                }
                            }
                        }
                    }
                }
            }
        }else {
            i++;
            queue2.offer(queue1.poll());
            if(queue1.isEmpty()){
                while(!stack.isEmpty()) {
                    queue2.offer(stack.pop());
                }
            }
        }
    }
    //打印后缀表达式并返回
    return queue2;
}

/**
 * 根据后缀表达式计算结果
 * @param queue2
 * @return
 */
public int calculate(Queue queue2) {
    /**
     * 用于进行后缀计算
     */
    OperationImpl operation = new OperationImpl();
    //保存计算结果
    int x = 0;
    int y = 0;
    int result = 0;
    Stack stack = new Stack<>();
    stack.push((String)queue2.poll());
    while(!queue2.isEmpty()) {

        String str = (String) queue2.poll();
        //遇到运算符,出栈运算,结果入栈
        if(!operation.judgeOperation(str)) {
            stack.push(str);
        }else {
                 y = Integer.valueOf(stack.pop());
                 x = Integer.valueOf(stack.pop());
                 result = operation.calculateNumber(x, y, str);
                 stack.push(String.valueOf(result));
                 //如果最终只有一个元素,则为计算的结果
                 if(stack.size() == 1 && queue2.isEmpty()) {
                    return Integer.valueOf(stack.pop());
                }
        }
    }
    return y;
}

}

主函数

public static void main(String[] args) {
    //输入想要的题目数
    System.out.println("请输入想要创建题目的数目:");
    //生成题目的数目
    Scanner scanner = new Scanner(System.in);
    int total = scanner.nextInt();
    //生成题目生成器
    FormulaMakerTest maker = new FormulaMakerTest();
    //题目集
    LinkedList questionList =   maker.questionMaker(total);
    System.out.println(questionList);
    //将题目存入文件中
    FileWriting writing = new FileWriting();
    writing.WriteStringToFile(questionList);
}

控制台打印的题目

软工第二次作业——熟悉使用工具_第6张图片

文件中保存的题目
软工第二次作业——熟悉使用工具_第7张图片


Part3.使用github克隆项目以及提交代码

下载与安装

官网上下确实有点慢,找同学要的其他资源下的。
软工第二次作业——熟悉使用工具_第8张图片

软工第二次作业——熟悉使用工具_第9张图片

配置个人信息

指令:

git config --global user.name "用户名"

git config --global user.email 邮箱

克隆项目

进入这里
点这里,复制这里的url
软工第二次作业——熟悉使用工具_第10张图片
软工第二次作业——熟悉使用工具_第11张图片

在Git的文件夹下创建一个新的文件夹,在新的文件夹内右键选择Git Bash Here, 然后再在界面上输入git clone + 刚才复制网址,即 https://github.com/Cherish599/AchaoCalculator

软工第二次作业——熟悉使用工具_第12张图片

软工第二次作业——熟悉使用工具_第13张图片

提交代码

成功后便会多出一个文件夹,在里面创建一个和自己github用户名一致的文件,将程序源码放进去。

然后转到AchaoCalculator文件目录下(cd 文件的路径)
然后输入git add . , 再输入git commit -m "分支名称",最后输入 输入 git push,在这里会弹出框让你输入GitHub的用户名和密码即可

软工第二次作业——熟悉使用工具_第14张图片

最后在GitHub上就能看到你提交的文件啦

软工第二次作业——熟悉使用工具_第15张图片

遇到的问题

1、第一次接触GitHub,大多是看着教程操作的,以后需要多多熟悉

2、很多指令不熟悉,有的教程上的地方我用起来会出现错误,在其他地方找了解决的办法


Part4.单元测试

因为在编程过程中有很多需要单元测试的地方,也有很多bug需要及时修改,所以没有细致的记录,在此简单的描述一下

JAVA的单元测试可以基于Junit,并需要在测试的方法前加上@Test注解且测试方法不能存在参数

软工第二次作业——熟悉使用工具_第16张图片

同时也可以基于main()方法来测试,并在需要的地方输出语句

软工第二次作业——熟悉使用工具_第17张图片

主要遇到的问题

1、表达式的生成(字符串的拼接)出现错误。因为运算符是运用1~4的随机数来保存的,所以生成算式时需要转化为加减乘除对应的符号,思考后得以解决。

2、后缀表达式生成出现错误。因为对中缀表达式转化为后缀表达式的理解还存在一些偏差。在仔细阅读概念,并不断得打印后缀表达式后,找出了代码中出现的问题,最后得以解决

3、得到后缀表达式后计算结果出现错误。后缀表达式存在一个队列中,队列中元素的出队,以及数字元素的压栈、出栈操作出现问题。在条件语句中多次进行打印操作后,找出了错误出现的位置,找到原因,最终得以解决。

4、如果除法存在小数如何解决。我才用的方法是将此次循环作废,即将循环因子的值减一,并不进行拼接操作。


Part5.回归测试

单元测试时会存在许多问题,解决了这些问题,也就是进行了回归测试,同样在编程过程中有很多的回归测试,所以没有过多去记录

这是进行单元测试后,再进行回归测试才得出的判断运算结果是否为小数的方法。

软工第二次作业——熟悉使用工具_第18张图片

得出的判断方法:看两个整数相除后的结果与其强转成浮点型后的结果是否一样,一样则是整数,反之则是小数


Part6.总结

说实话感觉这次作业还是很有难度的。主要是编写代码部分就需要大量的时间与精力。数据结构在学栈的部分学习过四则运算优先级判断,但是当时没有用代码实现,所以还花时间去学习了一下。

学习Git的使用过程中,好在有很多文章可以参考,虽然陌生但是操作起来还是比较容易。

环境因为是以前就配好的,同时单元测试和回归测试其实在代码的编写中以及有所使用了,这方面进行的还是比较顺利。

总之这次作业还是让我收获颇丰,无论是对编程语言JAVA,还是数据结构中栈和队列,以及Git的使用都得到了很好的练习

你可能感兴趣的:(软工第二次作业——熟悉使用工具)