四则运算-

四则运算

 

项目总结

李瑞超

软件工程2016012038

2018年3月25号

原码仓库地址:https://git.coding.net/lrc331/four.git

一、前言

这个项目对我来说难度还挺大的,其实当初学前端所以Java课并没有投入很多时间去学习,在最开始我一直在研究用JavaScript来实现,并且实现了不带扩号、题目和答案分开。后来老师强调只能用Java,但是对我来说很有难度。

二、需求分析

数字在0~100之间,运算符在3~5个,每个练习题至少含有两个运算符。

程序接收参数n,然后随机产生n到四则运算题目,例如当接收参数为4是,输出:

2018012023

13+17-1=19

11*15-5=160

3=10+4-16=1

15÷5+3-2=4

练习题生成好后,将你的学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致;

使用Java语言,生成文件时请使用相对路径,生成的TXT文件需要在项目的根目录下,可直接查看演示示例。

使用的JDK版本是jdk8u161,使用的JRE版本为jre8u161。

不得使用除限定版本jdk与jre外的额外依赖包。

三、功能设计

  1. 基本功能:实现四则混合运算出题,计算完成,使答案和题目分开。
  2. 扩展功能:未实现。

四、算法详解

1.生成固定范围随机数

private static int rand(int min,int max){
        return (int)(min)+(int)Math.round(Math.random()*(max-min)+min);
    }

2..创建两个栈类,数字栈:

复制代码
package src;
public class MyStack {
    private int array[]=new int [20];
    private int index=-1; 
    public void push(int i){ 
        index++; 
        array[index]=i; 
    } 
    public int getTop(){ 
        return array[index]; 
    }
    public int pop(){ 
        int j=array[index];
        index--; return j; 
    } 
    public int getIndex() { 
        return index; } 
    public void setIndex(int index) { 
        this.index = index; 
    } 
} 
复制代码

运算符栈:

复制代码
package src; 
    public class MyStackChar { 
        private char array[] = new char[20]; 
        private int index = -1; 
        public void push(char i) { 
            index++; array[index] = i; 
        }
        public char getTop() { 
            return array[index]; 
        } 
        public char pop() { 
            char j = array[index]; 
            index--; return j; 
        } 
        public int getIndex() {
            return index; 
        } 
        public void setIndex(int index) { 
            this.index = index;
        } 
    }                    
复制代码
复制代码
package src;

import java.util.Scanner;

public class SiZeYunSun {
    public static void main(String[] args) {
        Scanner sca = new Scanner(System.in);
        String str = sca.nextLine();
        MyStack num = new MyStack();
        MyStackChar fuhao = new MyStackChar();
        String digit = "";
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (Character.isDigit(c)) {
                digit += c;
            } else {
                num.push(Integer.parseInt(digit));
                digit = "";
                if (c == '=') {
                    int after = num.pop();
                    int before = num.pop();
                    char fu = fuhao.pop();
                    // 运算
                    int jieguo = yunsuan(after, fu, before);
                    num.push(jieguo);
                    if(fuhao.getIndex()==-1){
                        System.out.println(num.getTop());
                    }else{
                        int after1 = num.pop();
                        int before1 = num.pop();
                        char fu1 = fuhao.pop();
                        // 运算
                        int jieguo1 = yunsuan(after1, fu1, before1);
                        System.out.println(jieguo1);
                    }

                } else {
                    if (fuhao.getIndex() == -1) {
                        fuhao.push(c);
                    } else {
                        // 判断入栈出栈并将需要计算的进行计算。

                        // 如果符号栈有内容,将c与栈顶内容进行比较优先级
                        // 如果c比栈顶内容高 (true) 将c压栈
                        // 从栈顶开始取出两个数字,将两个数字与符号栈取出符号进行计算。
                        // 如果c没有符号栈栈顶内容高(包括同等级别和优先级低)(false)则将符号栈内容取出,数字栈
                        // 从栈顶开始取出两个数字,将两个数字与符号栈取出符号进行计算。
                        jisuan(num, fuhao, c);
                    }
                }
            }
        }


    }

    public static void jisuan(MyStack num, MyStackChar fuhao, char c) {

        if (fuhao.getIndex() == -1) {
            fuhao.push(c);
        } else {
            char top = fuhao.getTop();
            if (youXianji(c, top)) {
                // true的情况
                fuhao.push(c);
            } else {
                // false的情况
                int after = num.pop();
                int before = num.pop();
                char fu = (char) fuhao.pop();
                // 运算
                int jieguo = yunsuan(after, fu, before);
                num.push(jieguo);
                jisuan(num, fuhao, c);
            }
        }

    }

    public static int yunsuan(int after, char top, int before) {
        int result = 0;
        switch (top) {
        case '+':
            result = before + after;
            break;
        case '-':
            result = before - after;
            break;
        case '*':
            result = before *after;
            break;
        case '/':
            result = before / after;
            break;
        }
        return result;
    }

    public static boolean youXianji(char c, char top) {
        if (top == '*' || top == '/') {
            return false;
        } else if (c == '*' || c == '/') {
            return true;
        } else {
            return false;
复制代码

 五、运行测试

六、总结 

上面的截图是我JavaScript的最后结果,Java的完整程序我并没有写完,只完成了上面的代码学习。我已经尽力把我能做到的都做出来了。没有达到老师的要求我很遗憾,说实话,最近几天挺折磨的,因为不止要为这一件事忙。但我付出了很多努力在这上面,因为一开始在研究js的写法,做好之后发现不可以,又重新学Java,赶得很紧,希望下次提前看好需求,从头一点一点努力吧。

 

 七、psp

PSP2.1

任务内容

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

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

Planning

计划

495

·        Estimate

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

20

Development

开发

100

·        Analysis

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

30

·        Design Spec

·         生成设计文档

30

·        Design Review

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

20

·        Coding Standard

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

·        Design

·         具体设计

40

·        Coding

·         具体编码

120

·        Code Review

·         代码复审

30

·        Test

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

30

Reporting

报告

60

·         Test Report

·         测试报告

0

·         Size Measurement

·         计算工作量

10

·         Postmortem & Process Improvement Plan

·         事后总结, 并提出过程改进计划

5

  实际开发过程中并没与统计时间用量,一直都在用很多零碎的时间做这个事,包括晚上原本很多计划要做的事都没有去做完。感觉还挺成长的把。

原文地址:https://www.cnblogs.com/lirc331/p/8647537.html