zoukankan      html  css  js  c++  java
  • 四则运算-

    四则运算

     

    项目总结

    李瑞超

    软件工程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

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

  • 相关阅读:
    PAT 甲级 1129 Recommendation System
    PAT 甲级 1129 Recommendation System
    PAT 甲级 1128 N Queens Puzzle (20 分)
    PAT 甲级 1128 N Queens Puzzle (20 分)
    PAT 甲级 1096 Consecutive Factors (20 分)
    PAT 甲级 1096 Consecutive Factors (20 分)
    PAT 甲级 1135 Is It A Red-Black Tree (30 分)
    PAT 甲级 1135 Is It A Red-Black Tree (30 分)
    AcWing 900. 整数划分
    AcWing 899. 编辑距离 线性dp
  • 原文地址:https://www.cnblogs.com/lirc331/p/8647537.html
Copyright © 2011-2022 走看看