LoginSignup
shica
@shica (か し)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Java 電卓プログラム

Q&AClosed
static String[] p_notation; //後置記法の式
static int p_idx=0;

public static void main(String[] args) {
    // TODO 自動生成されたメソッド・スタブ

    Scanner scan=new Scanner(System.in);
    String s=scan.next();

    try {
        int cnt=0;
        if(Character.isLetter(s.charAt(cnt))){
            cnt+=1;
            while(Character.isLetter(s.charAt(cnt)))
                cnt+=1;
        }else {
            throw new ArithmeticException("入力エラー");
        }
        String var=""; //変数のみ
        var+=s.substring(0,cnt);

        String[] fomula; //'='と変数以外
        fomula=split_infix(s.substring(cnt+1,s.length()));

        E(fomula); //後置記法に変換

        System.out.println(var+"="+Keisan(p_notation)); //計算結果の出力

    }catch(ArithmeticException e) {
        System.out.println(e);
        System.exit(1);
    }
}

public static String Keisan(String[] s) { //後置記法を計算
    // TODO 自動生成されたメソッド・スタブ
    Deque<String> stack = new ArrayDeque<>(); //スタック

    try {
        for(int i=0;i<s.length;i++) {
            if(s[i].equals("+")) {
                int a=Integer.valueOf(stack.pop());
                int b=Integer.valueOf(stack.pop());
                int sum=a+b;
                stack.push(String.valueOf(sum));
            }
            else if(s[i].equals("-")) {
                int a=Integer.valueOf(stack.pop());
                int b=Integer.valueOf(stack.pop());
                int sum=a-b;
                stack.push(String.valueOf(sum));
            }
            else if(s[0].equals("*")) {
                int a=Integer.valueOf(stack.pop());
                int b=Integer.valueOf(stack.pop());
                int sum=a*b;
                stack.push(String.valueOf(sum));
            }
            else if(s[i].equals("/")) {
                int a=Integer.valueOf(stack.pop());
                int b=Integer.valueOf(stack.pop());
                int sum=a/b;
                stack.push(String.valueOf(sum));
            }
            else {
                stack.push(String.valueOf(s.charAt(i)));
            }
        }
        System.out.println(p_notation);



    }catch(ArithmeticException e) {
        System.out.println("除算エラーです。");
        System.exit(1);

    }catch(Exception e) {
        System.out.println("式が不正です。");
        System.exit(1);
    }
    String st=stack.pop();
    return st;
}

public static void E(String[] s) {
    // TODO 自動生成されたメソッド・スタブ
    s=T(s);

    while(s!=null && s[0]=="+" || s[0]=="-") {
        List<String> list = Arrays.asList(s);
        String ch="";
        ch=s[0];
        list.remove(0);
        s=T(s=list.toArray(new String[list.size()]));
        p_notation[p_idx]=s[0];
        p_idx++;
    }
}

public static String[] T(String[] s) {
    // TODO 自動生成されたメソッド・スタブ
    s=F(s);

    while(s!=null && s[0]=="*" || s[0]=="/") {
        List<String> list = Arrays.asList(s);
        String ch="";
        ch=s[0];
        list.remove(0);
        s=T(s=list.toArray(new String[list.size()]));
        p_notation[p_idx]=s[0];
        p_idx++;
    }
    return s;
}

public static String[] F(String[] s) {
    // TODO 自動生成されたメソッド・スタブ

    List<String> list = Arrays.asList(s);

    if(Character.isDigit(s[0].charAt(0))) { //数値か判定
        p_notation[p_idx]=s[0];
        p_idx++;
        list.remove(0);
        s=list.toArray(new String[list.size()]);
        return s;
    }
    else if(s[0]=="(") {
        Deque<String> tmp = new ArrayDeque<>();
        Deque<String> stack = new ArrayDeque<>();

        stack.push(s[0]);
        list.remove(0);
        s=list.toArray(new String[list.size()]);

        while(stack.peek()!="") { //stackの中身があるならループ
            if(s[0]=="(") {
                stack.push(s[0]);
                list.remove(0);
                s=list.toArray(new String[list.size()]);
            }

            else if(s[0]==")") {
                stack.pop();
                list.remove(0);
                s=list.toArray(new String[list.size()]);
            }

            else {
                tmp.push(s[0]);
                list.remove(0);
                s=list.toArray(new String[list.size()]);
            }
        }
        E(tmp.toArray(s));
        return s;
    }
    return s;
}

public static String[] split_infix(String s) {
    // TODO 自動生成されたメソッド・スタブ
    String[] token=new String[s.length()];
    int idx=0;
    int cnt=0;

    while(true) {
        if(cnt==s.length()) break;
        else if(Character.isDigit(s.charAt(cnt))){ //数値か判定
            String tmp="";
            tmp+=s.charAt(cnt);
            cnt+=1;
            while(cnt!=s.length() && Character.isDigit(s.charAt(cnt))) {
                tmp+=s.charAt(cnt);
                cnt+=1;
            }
            token[idx]=tmp;
            idx+=1;
        }
        else {
            token[idx]=String.valueOf(s.charAt(cnt));
            cnt+=1;
            idx+=1;
        }

    }
    return token;
}

javaで括弧()つきでの四則演算ができる電卓のプログラムを書いています。
入力は
x=1+2
みたいな形で
出力は
12+
x=3
のように中置記法を後置記法にした形と、計算結果を出力したいです。

現在の出力結果は
$java Dentaku
x=1+2
Exception in thread "main" java.lang.NullPointerException
at Gengo_ensyu2.F(Gengo_ensyu2.java:132)
at Gengo_ensyu2.T(Gengo_ensyu2.java:112)
at Gengo_ensyu2.E(Gengo_ensyu2.java:97)
at Gengo_ensyu2.main(Gengo_ensyu2.java:35)
となります。

0

1Answer

Your answer might help someone💌