[solveLEq.java] -- //一元一次方程式を解く import java.io.*; class LinearEq { private double a, b; //方程式 aX+b=0 の係数 char var; //未知変数文字 private boolean v; //var がセットされたかどうかを保持する public LinearEq() { v = false; } public int set(String str){ //文字列を解析し、方程式の係数を設定し、解けるかどうかを判定する int num=str.indexOf('='); //=で右辺と左辺を分離する if (num==-1) return 3; //=が無いとき 3を返す String str1 = str.substring(0, num); //右辺と左辺を得る String str2 = str.substring(num+1); if (!parse(str1, 1)) //左辺を処理する return 3; //処理できなかったとき 3を返す if (!parse(str2, -1)) //右辺を処理する return 3; //処理できなかったとき 3を返す if (!v) return 3; //未知変数が無いとき 3を返す if (a==0){ //解けるかどうか判定する if (b==0) return 1; //不定解のとき 1を返す else return 2; //不能解のとき 2を返す } return 0; //解が求まるとき 0を返す } boolean parse(String str, int sgn){ //多項式文字列を処理する int num1, num2, num, numi, sgni; String strw=str, strh; char ch; do{ strw.trim(); //+または-で先頭の項を分離する num1=strw.indexOf('+', 1); num2=strw.indexOf('-', 1); if (num1 == -1){ if(num2==-1) num=0; //項が一つになった else num=num2; //-しか無いので-で先頭の項を切り離す } else{ if(num2 == -1) num=num1; //+しか無いので+で先頭の項を切り離す else{ if(num1>num2) num=num2; //-が先にあるので-で先頭の項を切り離す else num=num1; //+が先にあるので+で先頭の項を切り離す } } if(num==0){ strh=strw; } else{ strh = strw.substring(0, num).trim(); //実際に分離する strw = strw.substring(num); } if (strh.charAt(0) =='-'){ //符号を除去する sgni = -sgn; strh = strh.substring(1); } else{ sgni = sgn; if(strh.charAt(0) =='+') strh = strh.substring(1); } numi = strh.indexOf('*'); //単項式文字列の解釈 try{ if(numi == -1) b+= Double.parseDouble(strh) * sgni; //*ないとき定数項と見なす else{ //*あれば一次の項と見なす a+= Double.parseDouble(strh.substring(0, numi)) * sgni; ch = strh.substring(numi+1).trim().charAt(0); if (v){ if(var != ch) return false; //未知変数が2種類以上あるとき偽を返す } else{ v = true; var = ch; } } } catch(NumberFormatException e){ return false; //数字部分が数字でないとき偽を返す } }while(num != 0); //項が一つになったら終える return true; } public double solution(){ //方程式の解を求める return ((-b)/a); } } class solveLEq { public static void main(String args[])throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); LinearEq equ = new LinearEq(); System.out.println("解くべき一元一次方程式を入力してください"); String str = br.readLine(); switch(equ.set(str)){ case 0: System.out.println("解は " + equ.var + "=" + equ.solution() + " です。"); break; case 1: System.out.println("不定解です。"); break; case 2: System.out.println("不能解です。"); break; case 3: System.out.println("入力が正しくありません。"); break; } } } -- Copyright (C) Junro YOSHINO