在進行Java學習時要寫一個實現計算器功能的程式碼,由於沒有學習到視覺化so...

2020-10-20 13:00:33

求大神指教!!!

在進行Java學習時要寫一個實現計算器功能的程式碼,由於沒有學習到視覺化so…

計算器程式碼1.0

import java.util.Scanner;
import java.util.concurrent.atomic.AtomicInteger;

public class Mathwork {
    public static void main(String[] args) {
        System.out.println("請進行您的運算:(以數位、運運算元之間以空格隔開)");
        Scanner sc=new Scanner(System.in);//鍵入第一個引數
        String s=sc.next();//將第一個引數賦予s
        double s1=Double.valueOf(s);//進行字串轉化為double

        Scanner ac=new Scanner(System.in);//鍵入第二個引數
        String a=sc.next();//將引數輸入字串a

        Scanner bc=new Scanner(System.in);//鍵入第三個引數
        String b=sc.next();//將引數賦值字串b
        double b1=Double.valueOf(b);//字串轉化為double
        sc.close();//結束輸入
        switch (a){
            case "+":
                System.out.println(add(s1,b1));//若第二個引數為+則返回s1+b1
                break;
            case "-":
                System.out.println(sub(s1,b1));//若第二個引數為-則返回s1-b1
                break;
            case "*":
                System.out.println(mul(s1,b1));
                break;
            case "/":
                System.out.println(div(s1,b1));
                break;
            default:
                System.out.println("您輸入的運運算元不合法!");
        }

    }
    public static double add(double a,double b){
        return a+b;
    }
    public static double sub(double a,double b){
        return a-b;
    }
    public static  double mul(double a,double b){
        return a*b;
    }
    public static double div(double a,double b){
        return a/b;
    }
}

實現了一個兩個資料之間的運算,還必須在每次輸入後以空格或回車結尾,所以進行了改進。

計算器程式碼2.0

import java.util.Scanner;

public class Mathwork2 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String str=sc.nextLine();
        for (int i = 0; i < str.length(); i++) {
            char chr=str.charAt(i);//迴圈提取字串中的字元
            if('+'==chr){//判斷如果為+則進行
                double a=Double.valueOf(str.substring(0,str.indexOf("+")));
                //將字串中從頭到運運算元的字元變成double賦值給a
               double b=Double.valueOf(str.substring(str.indexOf("+")+1,str.length()));
               //將字串中從運運算元到結束的字串double並賦值給b
                System.out.println(add(a,b));
            } else if('-'==chr){
                double a=Double.valueOf(str.substring(0,str.indexOf("-")));
//              String b=  str.substring(str.indexOf("-")+1,str.length());
//              String b=  str.substring(str.indexOf("-")+1),;
                double b=Double.valueOf(str.substring(str.indexOf("-")+1,str.length()));
                System.out.println(sub(a,b));
            }else if ('*'==chr){
                double a=Double.valueOf(str.substring(0,str.indexOf("*")));
//              String b=  str.substring(str.indexOf("*")+1,str.length());
//              String b=  str.substring(str.indexOf("*")+1),;
                double b=Double.valueOf(str.substring(str.indexOf("*")+1,str.length()));
                System.out.println(mul(a,b));
            }else if ('/'==chr){
                double a=Double.valueOf(str.substring(0,str.indexOf("/")));
//              String b=  str.substring(str.indexOf("/")+1,str.length());
//              String b=  str.substring(str.indexOf("/")+1),;
                double b=Double.valueOf(str.substring(str.indexOf("/")+1,str.length()));
                System.out.println(div(a,b));
            }


        }


    }
    public static double add(double a,double b){
        return a+b;
    }
    public static double sub(double a,double b){
        return a-b;
    }
    public static  double mul(double a,double b){
        return a*b;
    }
    public static double div(double a,double b){
        return a/b;
    }
}

實現了兩個資料之間的加減乘除運算,但是還是不能進行多個資料間的操作,所以進行了改進。

計算機程式碼3.0

在3.0 中發現了一處bug無法改正,如果有大佬的話希望能提出些修改意見,下面是我的思路:
1.對鍵入的字串進行挨個字元的提取(str.charAt(i))。
2.對該字元是否為運運算元做判別,若為運運算元,則count+1,並且將該運運算元的位置賦值給陣列arr[]。
3.建立一個陣列int b[]=new b[count+1],陣列長度為運運算元個數加一。for (i=0;i<count ;count++),分別將第一個運運算元位置前的字元、第一個到第二個運運算元間的…一直到最後一個運運算元到整個字串長度的字串分別放入陣列b中;
4.從第一個運運算元一直往後迴圈運算(運算後將值先放入一個臨時變數中進行下一次的運運算元運算)

import java.util.Scanner;

public class Mathwork3 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
//        String sc1=sc.nextLine();
        String sc1="9*9*9*9*";
        int count=0;
        int place=0;

        int[] arr= new int[100];
        arr[0]=0;
        for (int i = 0; i < sc1.length(); i++) {
            char chr=sc1.charAt(i);
            if(chr=='*'||chr=='+'||chr=='-'||chr=='/'){
                 if (count==0){
                     count=1;
                 }
                arr[count]=sc1.indexOf(chr,arr[count-1]+1);
                count++;
            }else {
                continue;
            }
        }System.out.println(count);
        for (int i = 0; i < count; i++) {
            System.out.println("第"+(i+1)+"個位置是"+arr[i]);
        }

    }
    public static double add(double a,double b){
        return a+b;
    }
    public static double sub(double a,double b){
        return a-b;
    }
    public static  double mul(double a,double b){
        return a*b;
    }
    public static double div(double a,double b){
        return a/b;
    }
}

但進行到提取運運算元位置的時候,就不行了,一旦前一個運運算元與一個運運算元相同的話,就一直會輸出前一個運運算元的位置,因為indexof提取從一開始到當前第一個的位置,所以我將第一個運運算元位置加入indexof程式碼中,表示在第一個運運算元的後面出現的第一個運運算元的位置,記錄到陣列的下一個元素中,結果輸出時還是一直是第一個運運算元位置,為什麼啊,求大神指教。。。。。。
Thanks vary much…

更新程式碼(10/19)

import java.util.Scanner;

public class Mathwork3 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String sc1 = sc.nextLine();
        int count = 0;
        int[] arr = new int[100];
        arr[0] = 0;
        int place1 = 0;
        loop:
        for (int i = 0; i < sc1.length(); i++) {
            char chr = sc1.charAt(i);
            if (chr == '1' || chr == '2' || chr == '3' || chr == '4' || chr == '5' || chr == '6' || chr == '7' || chr == '8' || chr == '9' || chr == '0' || chr == '+' || chr == '-' || chr == '*' || chr == '/') {

                if (chr == '*' || chr == '+' || chr == '-' || chr == '/') {
                    arr[count] = sc1.indexOf(chr, place1 + 1);
                    place1 = arr[count];
                    count++;
                }
            } else {
                System.out.println("輸入非法字元!");
                break loop;
            }
        }
        double[] brr = new double[count + 1];
        double[] crr = new double[count];
        brr[0] = Double.valueOf(sc1.substring(0, arr[0]));
        for (int i = 1; i < count; i++) {
            brr[i] = Double.valueOf(sc1.substring((arr[i])+1, arr[i+1])+1);

        }
        brr[count + 1] = Double.valueOf(sc1.substring((arr[count])+1 , sc1.length()+1));
        if (count == 1) {
            if (sc1.indexOf(arr[0])=='+'){
                crr[0]=add(brr[0],brr[1]);
            }
            if (sc1.indexOf(arr[0])=='-'){
                crr[0]=sub(brr[0],brr[1]);
            }
            if (sc1.indexOf(arr[0])=='*'){
                crr[0]=mul(brr[0],brr[1]);
            }
            if (sc1.indexOf(arr[0])=='/'){
                crr[0]=div(brr[0],brr[1]);
            }
        }else
        for (int i = 1; i < count; i++) {
            if (sc1.indexOf(arr[i])=='+'){
                brr[i]=crr[i-1];
                crr[i]=add(brr[i],brr[i+1]);
            }
            if (sc1.indexOf(arr[i])=='-'){
                brr[i]=crr[i-1];
                crr[i]=sub(brr[i],brr[i+1]);
            }
            if (sc1.indexOf(arr[i])=='*'){
                brr[i]=crr[i-1];
                crr[i]=mul(brr[i],brr[i+1]);
            }
            if (sc1.indexOf(arr[i])=='/'){
                brr[i]=crr[i-1];
                crr[i]=div(brr[i],brr[i+1]);
            }
        }
        System.out.println(crr[count]);


    }



    public static double add(double a,double b){
        return a+b;
    }
    public static double sub(double a,double b){
        return a-b;
    }
    public static  double mul(double a,double b){
        return a*b;
    }
    public static double div(double a,double b){
        return a/b;
    }
    }

new problem:

8*8*8
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: begin 4, end 0, length 5
	at java.base/java.lang.String.checkBoundsBeginEnd(String.java:3734)
	at java.base/java.lang.String.substring(String.java:1903)
	at Mathwork3.main(Mathwork3.java:30)

Process finished with exit code 1

記錄一下。。