2017-02-24 2 views
0

私はJavaの初心者です。そして、私はJavaで複雑なコーディングの能力を持っていません。 数値と4つの基本的な算術演算子だけを含んでいなければならない文字列形式の数式を解決するプログラムを作りたいと思います。 私は以下のコードを、私が知っている小さな基本で書いています。しかし、コードを実行すると、エラーが表示されます。それは私がオブジェクトを2倍に解析することはできないと言います...私はJavaプログラムを解決する数学的な表現で解析のエラーを二重に修正したい

私はBODMASルールに従って4つの基本演算子に優先順位をつけようとしました。 しかし、ユーザーが角括弧内の式を囲む場合、角括弧に優先順位を付ける方法はわかりません。

以下のコードは、わずか数行で作成できる専門家にとって面白いかもしれませんが、私は初心者です。 (コメントは、このコードのように記述されていないシンプルで、誰もが理解できる)

import java.util.*; 
import java.util.concurrent.TimeUnit; 
class Calculator 
{ 
public static void main(String[] args) 
throws Exception 
{ 
    int aaa =0; 
    while(aaa==0){ 
     Scanner sc = new Scanner(System.in); 
     System.out.println("\nEnter expression to solve : "); 
     String expression = sc.nextLine(); 
     if(!expression.isEmpty()){ 
      int charlength = expression.length(); 
      String charat0 = ""+expression.charAt(0); 
      String charatlast = ""+expression.charAt(charlength-1); 
      ArrayList forops = new ArrayList(); 
      ArrayList forchars = new ArrayList(); 
      if(expression.contains(" ")){ 
       pWD("\nSpaces are not allowed",TimeUnit.MILLISECONDS,30); 
      }else if(!expression.matches("[-+/*0-9]+")){ 
       pWD("\nEnter only numbers and operators",TimeUnit.MILLISECONDS,30); 
      }else if(!charat0.matches("[0-9]+")||!charatlast.matches("[0-9]+")){ 
       pWD("first and last characters must be\nnumbers",TimeUnit.MILLISECONDS,30); 
      }else if(expression.contains("//")||expression.contains("**")||expression.contains("--")||expression.contains("++")|| 
        expression.contains("/+")||expression.contains("*/")||expression.contains("-*")||expression.contains("+-")|| 
        expression.contains("/-")||expression.contains("*+")||expression.contains("-/")||expression.contains("+*")|| 
        expression.contains("/*")||expression.contains("*-")||expression.contains("-+")||expression.contains("+/")){ 
       pWD("There must be SINGLE operator between\ntwo adjacent numbers",TimeUnit.MILLISECONDS,30); 
      }else{ 
       String[] chararr = expression.split("(?<=[-+*/])|(?=[-+*/])"); 
       int chararrl =chararr.length; 
       for(int nn=0;nn<chararrl;nn++){ 
        forchars.add(chararr[nn]); 
       }for(int mn=0;mn<chararrl;mn+=2){ 
        String willparse = ""+forchars.get(mn); 
        double parseint= Double.parseDouble(willparse); 
        forchars.set(mn,parseint); 
       }while(forchars.contains("/")){ 
        int divindex = forchars.indexOf("/"); 
        double prediv = forchars.get(divindex-1); 
        double nexdiv = forchars.get(divindex+1); 
        forchars.set(divindex,(prediv/nexdiv)); 
        forchars.remove(forchars.indexOf(prediv)); 
        forchars.remove(forchars.indexOf(nexdiv)); 
       }while(forchars.contains("*")){ 
        int mulindex = forchars.indexOf("*"); 
        double premul = forchars.get(mulindex-1); 
        double nexmul = forchars.get(mulindex+1); 
        forchars.set(mulindex,(premul*nexmul)); 
        forchars.remove(forchars.indexOf(premul)); 
        forchars.remove(forchars.indexOf(nexmul)); 
       }while(forchars.contains("-")){ 
        int subindex = forchars.indexOf("-"); 
        double presub = forchars.get(subindex-1); 
        double nexsub = forchars.get(subindex+1); 
        forchars.set(subindex,(presub-nexsub)); 
        forchars.remove(forchars.indexOf(presub)); 
        forchars.remove(forchars.indexOf(nexsub)); 
       }while(forchars.contains("+")){ 
        int addindex = forchars.indexOf("+"); 
        double preadd = forchars.get(addindex-1); 
        double nexadd = forchars.get(addindex+1); 
        forchars.set(addindex,(preadd+nexadd)); 
        forchars.remove(forchars.indexOf(preadd)); 
        forchars.remove(forchars.indexOf(nexadd));} 
       double answer1 = forchars.get(0); 
       String answer = Double.toString(answer1); 
       pWD("\nFinal answer is : "+answer,TimeUnit.MILLISECONDS,80); 
      }}else{ 
      pWD("Please enter something",TimeUnit.MILLISECONDS,30); 
     }} 
}public static void pWD(String data, TimeUnit unit, long delay) 
throws InterruptedException { 
    for (char ch:data.toCharArray()) { 
     System.out.print(ch); 
     unit.sleep(delay); 
     } 
    } 
} 

をダブルにパースのエラーを修正する方法を私を助けてください:ここでは

私が作ったコードです。 そして、ユーザーが式を括弧で囲むと、式を解決する方法について少し詳しく説明します。

ありがとうございます。

+0

エラーはどの行で発生しますか?さらに、コードが少なくても、エラーが発生する箇所を特定することができますか? –

+0

'split'操作の結果を表示する必要があります。おそらく部分文字列の1つを数値に変換できません。 –

答えて

0

double変数を宣言しているので、int値を代入することはできません。だから私はにあなたが持つべき最良の選択肢があると仮定します。

キャストあなたint

double prediv = (double) forchars.get(divindex - 1); 

それはあなたが考慮すべきちょうど型の不一致であるdoubleします。

+0

キャスティングの詳細については、[this](http://stackoverflow.com/questions/5289393/casting-variables-in-java)のリンクを参照してください。 –

+0

はい、それは働いた。しかし、これをコマンド・プロンプトで実行すると、次のように表示されます。注意:Calculator.javaは未チェックまたは安全でない操作を使用します。 注:詳細については、-Xlint:uncheckedを指定して再コンパイルしてください。私は何をすべきかわからない。助けてください... – Abhilash

+0

私が見ることができるのは、タイプを指定せずにArrayListを使用していることです。あなたはそれを取り除きたい場合は、この[リンク](http://stackoverflow.com/questions/197986/what-c​​auses-javac-to-issue-the-uses-unchecked-or-unsafeに従ってコードを操作しようとする - 操作 - 警告)。あなたのコードは 'Eclipse' IDEで動作していました! –

関連する問題