一个简单的计算器功能,我是按照老师的课程设计指导书分步骤来的,所以写的垃圾代码比较多,形成了一座“大屎山”,如果正常写的话,完全可以用最后一步将输入数字以及操作符放在栈中进行操作,当select=3时的代码会有一些帮助,输入格式都是带空格的,这里面也包含了一些其他功能:

1.存储最近计算结果

2.浏览所有计算历史

3.根据id查找结果

4.清空历史记录

5.与最近计算结果进行二次运算(支持(opera n)形式)

6.进行带括号运算(但只支持(n opera n) opera (n opera n)形式)

7.包含很多对于输入格式不正确的异常捕捉

这是我写的第一个略微长一点的java程序,垃圾代码比有用代码多哈哈哈


package shiyan.Project;

import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;

class calculator {   //计算器类
    String expre;             //表达式
    int type=0;               //表达式是double型运算还是int型运算,type为0,int;为1,double
    int div0=0;               //evaluate中div0>0,则第二个数字为0
    int div1=0;               //evalua1中判断除数是否为0
    double recent=0;          //最近存储
    public static ArrayList list=new ArrayList<>();           //集合声明,存储列表
    float result=0;
    double firstDouble;
    double secondDouble;
    //构造函数初始化
    public calculator(){}   //创建存储列表
    public calculator(String expre){
        this.expre=expre;
    }
    //判断表达式是否合法
    public float evaluate(String expression) {
        //以空格为分界符分割
        String[] str = expression.split(" ");
        //判断str数组长度,不等于3,则error
        if (str.length != 3 ) {
            System.out.println("Invaild input.");
            return Float.MIN_VALUE;
        }
        //判断是浮点型还是整形
        int flag = 0;                   //标志位,判断是否有小数点,flag=0,则为int
        char[] num1 = str[0].toCharArray();             //第一数字字符串,检查是否有小数点
        for (int i = 0; i < num1.length; i++) {
            if (num1[i] == '.') {
                flag++;
            }
        }
        char[] num2 = str[2].toCharArray();            //第二数字字符串,检查是否有小数点
        for (int i = 0; i < num2.length; i++) {
            if (num2[i] == '.') {
                flag++;
            }
        }
        //判断flag
        if (flag == 0) {
            type = 0;
        } else {
            type = 1;
        }
        //转换为数字
        //将字符串转换成double形式,若错误输入如:9@ + 9等等,会报错,所以采用异常处理
        try{
            firstDouble = Double.parseDouble(str[0]);
            secondDouble = Double.parseDouble(str[2]);
        }
        catch(Exception ex){                                   //若转换出现异常,则报错
            System.out.println("Invaild input.");
            return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
        }
        if (secondDouble == 0) {
            div0++;       //判断第二个数字是否为0
        }
        //判断运算符是否有效 and 计算结果,暂时都是double型
        switch (str[1]) {
            case "+": {
                result = (float) (firstDouble + secondDouble);
                break;
            }
            case "-": {
                result = (float) (firstDouble - secondDouble);
                break;
            }
            case "*": {
                result = (float) (firstDouble * secondDouble);
                break;
            }
            case "/": {
                if (div0 != 0) {                   //判断第二个数字是否为0
                    System.out.println("Invaild input.");
                    return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
                } else {
                    result = (float) (firstDouble / secondDouble);
                    break;
                }
            }
            default:{System.out.println("Invaild input.");
                return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
            }
        }
        return 1;
    }
    //返回运行结果
    public float getCurrentValue(){
        if (type==0){                         //int型输出
            int FianlResult=(int)(result);
            System.out.println("运算结果为"+FianlResult);
            return  FianlResult;
        }
        else{                                 //double型输出
            System.out.println("运算结果为"+result);
            return (float)(result);
        }
    }
    //设置最近存储结果
    public void setMemoryValue(float memval){
        recent=memval;
        list.add(recent);
        //System.out.println("历史记录为"+list);
    }
    //清空列表
    public void clearMemory(){
        list.clear();
    }
    //获取全部存储结果
    public float getMemoryValue(){
        for (int i=0;i<list.size();i++){
            System.out.print(list.get(i));
            System.out.print(" ");
        }
        return 0;
    }
    //获得某个存储结果
    public float getHistoryValue(int index){
        try{                                  //可能出现数组越界,有异常捕捉
            System.out.println(list.get(index));
        }catch(Exception ex){
            System.out.println("数组越界,输入错误");
        }
        return 0;
    }
    //再次计算
    public float evaluate1(String expression1,float m){
        String[] str1=expression1.split(" ");
        if (str1.length != 2) {
            System.out.println(expression1);
            System.out.println("Invaild input.");
            return Float.MIN_VALUE;
        }
        //判断是浮点型还是整形
        int flag = 0;                   //标志位,判断是否有小数点,flag=0,则为int
        char[] num1 = str1[1].toCharArray();
        for (int i = 0; i < num1.length; i++) {
            if (num1[i] == '.') {
                flag++;
            }
        }
        //判断flag
        if (flag == 0) {
            type = 0;
        } else {
            type = 1;
        }
        try {
            firstDouble = Double.parseDouble(str1[1]);
        }
        catch(Exception ex){                                   //若转换出现异常,则报错
            System.out.println("Invaild input.");
            return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
        }
        if (firstDouble == 0) {
            div1++;       //判断第二个数字是否为0
        }
        //判断运算符是否有效 and 计算结果,暂时都是double型
        switch (str1[0]) {
            case "+": {
                result = (float) (firstDouble + m);
                break;
            }
            case "-": {
                result = (float) (m-firstDouble );
                break;
            }
            case "*": {
                result = (float) (firstDouble * m);
                break;
            }
            case "/": {
                if (div1 != 0) {                   //判断第二个数字是否为0
                    System.out.println("Invaild input.");
                    return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
                } else {
                    result = (float) (m/firstDouble);
                    break;
                }
            }
            default:{System.out.println("Invaild input.");
                return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
            }
        }
        return result;
    }
    //带括号计算
    public float evaluate2(String expression){
        //以空格为分界符分割
        String[] str = expression.split(" ");
        //判断str数组长度,不等于7,则error
        //System.out.println(str.length);
        if (str.length != 7 ) {
            System.out.println("Invaild input1.");
            return Float.MIN_VALUE;
        }
        //处理括号
        str[0]= str[0].substring(1);
        str[2]=str[2].substring(0,str[2].length()-1);
        String opera=str[3];
        str[4]= str[4].substring(1);
        str[6]=str[6].substring(0,str[6].length()-1);
        //转换为数字
        //将字符串转换成double形式,若错误输入如:9@ + 9等等,会报错,所以采用异常处理
        try{
            firstDouble = Double.parseDouble(str[0]);
            secondDouble = Double.parseDouble(str[2]);
        }
        catch(Exception ex){                                   //若转换出现异常,则报错
            System.out.println("Invaild input2.");
            return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
        }
        //System.out.println(str[1]);
        //判断运算符是否有效 and 计算结果,暂时都是double型
        switch (str[1]) {
            case "+": {
                result = (float) (firstDouble + secondDouble);
                break;
            }
            case "-": {
                result = (float) (firstDouble - secondDouble);
                break;
            }
            case "*": {
                result = (float) (firstDouble * secondDouble);
                break;
            }
            case "/": {
                if (div0 != 0) {                   //判断第二个数字是否为0
                    System.out.println("Invaild input3.");
                    return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
                } else {
                    result = (float) (firstDouble / secondDouble);
                    break;
                }
            }
            default:{System.out.println("Invaild input5.");
                return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
            }
        }
        float r1=result;
//处理第二个表达式
        try{
            firstDouble = Double.parseDouble(str[4]);
            secondDouble = Double.parseDouble(str[6]);
        }
        catch(Exception ex){                                   //若转换出现异常,则报错
            System.out.println("Invaild input2.");
            return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
        }
        //判断运算符是否有效 and 计算结果,暂时都是double型
        switch (str[5]) {
            case "+": {
                result = (float) (firstDouble + secondDouble);
                break;
            }
            case "-": {
                result = (float) (firstDouble - secondDouble);
                break;
            }
            case "*": {
                result = (float) (firstDouble * secondDouble);
                break;
            }
            case "/": {
                if (div0 != 0) {                   //判断第二个数字是否为0
                    System.out.println("Invaild input3.");
                    return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
                } else {
                    result = (float) (firstDouble / secondDouble);
                    break;
                }
            }
            default:{System.out.println("Invaild input4.");
                return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
            }
        }
        float r2=result;

        switch (opera) {
            case "+": {
                result = r1 + r2;
                break;
            }
            case "-": {
                result = r1 - r2;
                break;
            }
            case "*": {
                result = r1 * r2;
                break;
            }
            case "/": {
                if (div0 != 0) {                   //判断第二个数字是否为0
                    System.out.println("Invaild input3.");
                    return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
                } else {
                    result = r1 / r2;
                    break;
                }
            }
            default:{System.out.println("Invaild input5.");
                return Float.MIN_VALUE;//若不合法,则输出MIN_VALUE
            }
        }
        System.out.println("运算结果为:"+result);
        return result;
    }
}

public class Homework {
    //main 函数
    public static void main(String[] args) {
        Stack s1=new Stack<>();//运算栈
        Stack s2=new Stack<>();//中间结果栈
        Stack s3=new Stack<>();
        calculator c=new calculator();//存储对象,用来存储计算记录
        float m=0;            //存储最近一次计算结果
        while (true){
            System.out.println();
            System.out.println("输入表达式:");
            Scanner input=new Scanner(System.in);
            String expression= input.nextLine();   //输入带空格表达式
            System.out.println("选择模式:(1-不带括号的简单运算,2-带括号的多值运算,3-不带括号的多值运算)");
            int select=input.nextInt();
            if (select==2){
                calculator d=new calculator(expression);
                m=d.evaluate2(expression);
            }
            else if (select==1){
                calculator d=new calculator(expression);
                double Isok=d.evaluate(expression);    //判断是否有效
                if (Isok==1) {                          //有效继续
                    m=d.getCurrentValue();              //返回计算结果
                }
            }
            else if (select==3){
                String[] opera=expression.split(" ");
                //System.out.println(opera.length);
                for (int i=0;i< opera.length;i++){
                    if (i%2==0){
                        try{
                            float temp=Float.parseFloat(opera[i]);
                            s2.push(temp);
                        }catch(Exception ex){
                            System.out.println("Input Illegelly");
                        }
                    }
                    else{
                        if (s1.isEmpty()){
                            s1.push(opera[i]);
                        }
                        else if ((opera[i].equals("*") || opera[i].equals("/")&&(s1.peek().equals("+")||s1.peek().equals("-")))){
                            s1.push(opera[i]);

                        }
                        else{
                            s2.push(s1.pop());
                            i--;
                        }
                    }
                }
                while (!s1.isEmpty()){
                    s2.push(s1.pop());
                }
                while(!s2.isEmpty()){
                    s1.push(s2.pop());
                }
                while (!s1.isEmpty()){
                    String op="";
                    float result=0;
                    try{
                        op=s1.pop().toString();
                        float temp=Float.parseFloat(op);
                        s3.push(temp);
                    }catch(Exception exception){
                        float op1= Float.parseFloat(s3.pop().toString());
                        float op2= Float.parseFloat(s3.pop().toString());
                        switch (op){
                            case "+":{result=op2+op1;break;}
                            case "-":{result=op2-op1;break;}
                            case "*":{result=op1*op2;break;}
                            case "/":{result=op2/op1;break;}
                        }
                        s3.push(result);
                    }
                }
                m=(float)(s3.pop());
                System.out.println(m);
            }
            System.out.println("解下来的操作(m-存储、c-清空、mr-历史结果、h-查找、over-结束任务):");
            Scanner next=new Scanner(System.in);
            String key=next.next();                //输入接下来的操作
            switch (key){
                case "m":{c.setMemoryValue(m);     //存储并且选择实现第二次运算
                    System.out.println("接下来的操作(i-输入表达式、n-取消):");
                    String n= input.next();
                    switch (n){
                        case "n":{continue;}       //不进行运算
                        case "i":{                 //进行运算并输入表达式
                            System.out.println("上一次运算结果为"+m);
                            System.out.println("输入表达式(operator[space]operand):");
                            Scanner input1=new Scanner(System.in);
                            String expression1=input1.nextLine();
                            float k =c.evaluate1(expression1,m);       //返回结果
                            if (k!=Float.MIN_VALUE){
                                System.out.println("运算结果为"+k);
                            }
                            break;}
                    }
                    break;}
                case "c":{c.clearMemory();break;}  //清空
                case "mr":{c.getMemoryValue();break;}
                case "h":{
                    System.out.println("选择你想要查找的id:");
                    int id=next.nextInt();                   //输入想要查找的id
                    c.getHistoryValue(id);break;}
                case "over":{return;}
                default:{System.out.println("Invaild input.");}
            }
        }}}

java计算器实现计算功能 java中计算器功能的实现_java