Javaの課題電卓で答えが誤っている問題

このQ&Aのポイント
  • 現在学校のjavaの課題電卓を作っていますが、実行すると答えが誤っています。
  • 1+1+1を計算しても答えが23になってしまいます。どのように修正すれば良いでしょうか?
回答を見る
  • ベストアンサー

現在学校のjavaの課題電卓を作っています

import java.io.*; class dentaku { public static void main(String[] args)throws IOException { BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); System.out.print("式を入力"); String input = r.readLine(); String sum[] = new String[input.length()]; String number = ""; int s = 0; int goukei =0; char enzan = ' '; for(int i=0; i < input.length(); i++) { //System.out.print(str[i]); //文字列から1文字ずつ抽出 char num = input.charAt(i); if(i == input.length()-1) { sum[s] = number; } else { if(num == '+' || num == '-'|| num == '*'|| num == '/') { //配列sumに代入 sum[s] = number; s++; sum[s] = String.valueOf(num); s++; } else { //変数numberにnumを代入 number = number + num; } } } for(int j=0; j<sum.length; j++) { if(sum[j] == null) { break; } if(j == 0) { goukei = Integer.parseInt(sum[j]); } else { if(sum[j].equals("+") || sum[j].equals("-")|| sum[j].equals("*")|| sum[j].equals("/")) { enzan = sum[j].charAt(0); } else { switch(enzan) { case '+': goukei += Integer.parseInt(sum[j]); break; case '-': goukei -= Integer.parseInt(sum[j]); break; case '*': goukei *= Integer.parseInt(sum[j]); break; case '/': goukei /= Integer.parseInt(sum[j]); break; } } } } System.out.print(goukei); } } までできたのですが 実行し 実際に 1+1+1とうってみると答えが23になってしまいます。 どのようにしたらいいのでしょうか

  • Java
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • NNori
  • ベストアンサー率22% (377/1669)
回答No.1

プログラムを見ると 前半:式を分解してsum[] という配列にいれている。 後半:sum[]という配列から前から読み取って演算している。 というようですね。 こういうときは、一度に作らずに前半だけ作ってから後半を作りましょう。 前半が終わったところで、sum[]という配列にちゃんと思ったような文字が入っていることを 確認すべきです。sum[]を確認してNULLを入れているところで、sum[]の内容を出力してみましょう。 sum[]に自分が思ったような文字列が入力できるようになったら、演算の部分を見ていきましょう。 switch で演算しているところで、goukei と sum[j]の内容を出力して思ったように動作しているか を確認しましょう。 以下、怪しいところを列挙してみます。 //変数numberにnumを代入 number = number + num; ⇒これって、文字列型の number に読み取った文字列 num を連結(結合)しているのですが、注釈が「代入」となっていて気持ち悪いです。 //配列sumに代入 sum[s] = number; s++; sum[s] = String.valueOf(num); s++; ⇒たぶん、ここが間違い。sum[s]にnumberを代入したところで、次に備えてnumber = "" とする必要がある。 あと、全体に非常に見にくい。 sum という配列は、合計を意味するので文字列を格納するのはやめたほうがいい。 number num といういかにも数字が入りそうな変数名に文字列を格納するのはやめたほうがいい。 まあコンピュータは、忠実なので、宣言された変数の型にはなるのだけど、人間は読みにくいですねぇ。 自分も間違えちゃうので早めに癖は直した方がいいですよ。

関連するQ&A

  • javaプログラミングの質問です。

    プログラムで数値の奇遇、合計値、最大値までは出せたのですが平均値の出し方がわかりません。 どこに何を入れればいいかを教えてください。お願いします。 public class pazu{ public static void main(String[] args){ int sum =0,saidai; System.out.println("コマンドラインパラメータは"+args.length+"個です"); for(int i=0;i<args.length;i++){ int x=Integer.parseInt(args[i]); if(pazu.is_even(x)) System.out.println(args[i]+"は偶数です"); else System.out.println(args[i]+"は奇数です"); sum+=x; } saidai=pazu.max(args); System.out.println("合計:"+sum); System.out.println("最大:"+saidai); } static boolean is_even(int number){ return number%2==0; } static int max(String[] number){ int max =0; for(int i=0;i<number.length;i++){ if(max<Integer.parseInt(number[i])){ max=Integer.parseInt(number[i]); } } return max; } }

    • ベストアンサー
    • Java
  • 数値⇒漢数字変換 java

    こんにちは。java初心者の学生です。 実行時引数で得た数値を漢数字に変換するコードを書いているのですがif構文の&&のところで実行時エラーが出てしまいます。 原因としては1200001234と入力した時に”args[0].length()-12が存在しない”などがあげられると思いますが、下に載せたコード以外で兆、億、万桁が0の場合の対処方がわかりません。 御享受いただけると助かります。よろしくお願いします! public class Question14 { /** * 実行時引数で得た数字の漢数字変換 * @param args 数字 */ public static void main(String[] args) { StringBuffer num = new StringBuffer(args[0]); if(num.length()>20){ System.out.println("0~99999999999999999999の数値で入力してください。"); } else{ StringBuffer sb = new StringBuffer(); if(num.equals("0")){ System.out.println("零"); } else{ for(int keta = num.length()-1; keta>=0; keta--){ if(keta==args[0].length()-5 && !((num.substring(args[0].length()-8,args[0].length()-4).equals("0000")))){ sb.insert(0,'万'); } else if(keta==args[0].length()-9 && !((num.substring(args[0].length()-12,args[0].length()-8).equals("0000")))){ sb.insert(0,'億'); } else if(keta==args[0].length()-13 && !((num.substring(args[0].length()-16,args[0].length()-12).equals("0000")))){ sb.insert(0,'兆'); } else if(keta==args[0].length()-17){ sb.insert(0,'京'); } switch(num.charAt(keta)){ case'1': sb.insert(0,"一"); break; case'2': sb.insert(0,"二"); break; case'3': sb.insert(0,"三"); break; case'4': sb.insert(0,"四"); break; case'5': sb.insert(0,"五"); break; case'6': sb.insert(0,"六"); break; case'7': sb.insert(0,"七"); break; case'8': sb.insert(0,"八"); break; case'9': sb.insert(0,"九"); break; case'0': continue; default: System.out.println("数値を入力してください"); break; } if(keta==num.length()-2||keta==num.length()-6||keta==num.length()-10||keta==num.length()-14||keta==num.length()-18){ sb.insert(1,"十"); } else if(keta==num.length()-3||keta==num.length()-7||keta==num.length()-11||keta==num.length()-15||keta==num.length()-19){ sb.insert(1,"百"); } else if(keta==num.length()-4||keta==num.length()-8||keta==num.length()-12||keta==num.length()-16||keta==num.length()-20){ sb.insert(1,"千"); } } } System.out.println(sb); } } }

  • このJAVAの課題について教えてください

    package input; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class jspmodai4Servlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("Windows-31J"); response.setContentType("text/html; charset=Windows-31J"); PrintWriter out = response.getWriter(); String[] nam = request.getParameterValues("text1"); int x = Integer.parseInt(nam[0]); int y = Integer.parseInt(nam[1]); String ans = request.getParameter("radio1"); int z = 0; for(int i = 0; i < z; i++){ } if(ans.equals("value1")){ z = x + y; out.println("奇数の結果は" + z); } }else if (ans.equals("value2") && z%2==0 ){ z = x + y; out.println("偶数の結果は" + z); }else if(x == y){ out.println("エラー"); }else{ out.println("エラー"); } } } 入力フォームから二つの数値を入力させ、「計算」ボタンを押すと、 二つの数値を含む数値間の奇数のみ足し算するプログラム。 でif値がおかしいので奇数と偶数の判定ができません テキストの問題の答えがないので、 なんともいえませんが、 友達に聞いたら、例えば2つの入力フォームで1と4を記述したら、 偶数なら2と4で6となり、奇数なら1と3で4になるそうです。 よろしくお願いします

  • プログラムの平均値の出し方。

    プログラムの平均値の出し方。 public class pazu{ public static void main(String[] args){ int sum =0,saidai; System.out.println("コマンドラインパラメータは"+args.length+"個です"); for(int i=0;i<args.length;i++){ int x=Integer.parseInt(args[i]); if(pazu.is_even(x)) System.out.println(args[i]+"は偶数です"); else System.out.println(args[i]+"は奇数です"); sum+=x; } saidai=pazu.max(args); System.out.println("合計:"+sum); System.out.println("最大:"+saidai); } static boolean is_even(int number){ return number%2==0; } static int max(String[] number){ int max =0; for(int i=0;i<number.length;i++){ if(max<Integer.parseInt(number[i])){ max=Integer.parseInt(number[i]); } } return max; } } このプログラムで数値の奇遇、合計値、最大値までは出せたのですが平均値の出し方がわかりません。 どこに何を入れればいいかを教えてください。お願いします。

  • JSPで15ゲーム作る課題なんだけど・・・・

    全部そろってクリア表示をさせたいのですが、完成判定がうまくできません。 どなたか助けて・・・ //完成判定 int cnt=1,k=0,clear=0; for(i = 0; i < ss.length; i++){ for(j = 0; j < ss[i].length; j++){ if(Integer.toString(cnt)==ss[i][j]){ k = 1; break; } cnt++; } if(k == 1){ break; } } ここに完成判定させるif文を書いていました・・・ どこがいけなくて、どこがたりないのでしょうか? ちなみに、if(Integer.toString(cnt)==ss[i][j]){ は、System.outすると機能していません。でも、コンパイルエラーにもなりません。

  • javaプログラムについて

    コマンドライン引数から複数の値を受け取り、それらの最大と最小を表示する、というプログラムなのですが。 class Maxmin{   public static void main (String[] args) {    int max=Integer.MIN_VALUE;    int min=Integer.MAX_VALUE;    for (int i=0; i<args.length; i++){     int num= Integer.parseInt(args[i]);     if(num>max)     max=num;     if(num<min)     min=num;    }    System.out.println("最大値は" + max + "です。");    System.out.println("最小値は" + min + "です。");  } } このプログラムでも問題なく表示されるのですが、MIN_VALUEとMAX_VALUEを使用せずに表示する事、と指摘を受けました。自分の中でぱっと思いついたのがこれだったのですが、他にはどのような方法があるのでしょうか?

    • ベストアンサー
    • Java
  • javaの課題・・

    package jp.tuyano; import java.applet.Applet; import java.awt.Color; public class TestApplet19_07 extends Applet{ public void init(){ /* 普通の文字列を所得する場合 */ String strAddress = getParameter("ADDRESS"); if( strAddress == null ) strAddress = new String("住所不定"); /* WORD0, WORD1, ・・・, WORD20のパラメータを取得する場合 */ /* ただし、WORD20までは無いかもしれない */ String[] strWord = new String[20]; for(int i = 1 ; i < 20 ; i++ ){ strWord[i] = getParameter("WORD"+i); if ( strWord[i] == null ) break; } /* 色を"FFFF00"(黄色)のようなフォーマットで取得する場合 */ String strColor = getParameter("COLOR"); Color clr; try{ int r = Integer.parseInt( strColor.substring(0,2), 16 ); int g = Integer.parseInt( strColor.substring(2,4), 16 ); int b = Integer.parseInt( strColor.substring(4,6), 16 ); clr = new Color(r,g,b); }catch(Exception e){ System.err.println("カラーの設定が不正です:"+e); clr = new Color(0,0,0); } /* 数字を取得する場合 */ int n; try{ n = Integer.parseInt( getParameter("SIZE"), 10 ); }catch(Exception e){ n = 0; } } } あるサイトの例のソースを試しにeclipseに貼ってみたのですがどうも実行がうまくできません。 出たエラーが     この行に複数マーカーがあります - ローカル変数 clr は読み取られません - ローカル変数 clr は読み取られません Color clr; に黄色線が出て上記のような警告 この行に複数マーカーがあります - ローカル変数 n は読 み取られません int n;に黄色線がでて上記のような警告 またシリアライズ可能クラス TestApplet19_07 は long 型の static final serialVersionUID フィールドを宣言していません と public class TestApplet19_07 extends Applet{ の行に出ます ちなみに参考にしたサイトはhttp://www5c.biglobe.ne.jp/~ecb/java/19_07.htmlです 誰か教えてくれませんか><

  • javaプログラムについて

    */コマンドライン引数で2つの数字と1つの記号を受け取ります。 * //受け取った記号が『+』ならplusメソッドを呼び出し、 * //受け取った記号が『-』ならminusメソッドを呼び出し、 * //受け取った記号が『×』ならmultiplyメソッドを呼び出し、 * //受け取った記号が『÷』ならdivideメソッドを呼び出し、 * //それ以外が入力された場合は『計算できません。』と表示する * //プログラムを作成してください。 * */ public class MethodAdd9 { public static void main(String[] args) { int input1 = Integer.parseInt(args[0]); int input2 = Integer.parseInt(args[1]); String sign = args[2]; //ここにプログラムを追加してください if(sign.equals("+")){ plus(input1,input2);//プラスメソッドへ } if(sign.equals("-")){ minus(input1,input2);//マイナスメソッドへ } if(sign.equals("*")){ multiply(input1,input2);//掛算メソッドへ } if(sign.equals("/")){ divide(input1,input2);//割算メソッドへ } } // 四則演算を行うメソッドを追加 //プラスメソッド表示 public static void plus(int a,int b){ int c=a+b; System.out.println(a+b); } //マイナスメソッド表示 public static void minus(int d,int e){ int f=d-e; System.out.println(d-e); } //掛算メソッド表示 public static void multiply(int g, int h){ int i=g*h; System.out.println(g*h); } //割算メソッド表示 public static void divide(int j,int k){ int l=j/k; System.out.println(j/k); } } ここまで出来て、記号を認識してくれるようにはなったのですが、何故か"*"掛算の記号だけ読み込んでくれません。また、ここから「計算出来ません」と表示させるにはどうすれば良いでしょうか。知恵をお貸しください。

  • java 電卓のプログラム

    或る程度まで進みましたが、 ソースコードが分からず困っています;; こんな問題なのですが・・・ 課題1 以下の要件を満たす電卓のプログラム Calculatorクラスを作成し、ソースコードを 示せ。 1.最初に標準入力から文字を1文字入力し 計算の種類や動作を決定する。 必要な入力文字と動作の種類の対応を下記に示す。 入力文字  動作   +    数値a,bを受け取りa+bの結果を表示する   -    数値a,bを受け取りa-bの結果を表示する   *    数値a,bを受け取りa*bの結果を表示する   /   数値a,bを受け取りa/bの結果を表示する       ただし、b=0の時は「Infinity」と表示する   !    数値aを受け取りaの階乗を計算し表示する   q   終了する 2. 計算の種類が決定した後、標準入力から計算に必要な数字を入力する 3.計算が終了した後、再度、標準入力からの動作の 種類を受け付ける。 こんな感じです。 で、一応ここまで進んでいます。 import java.io.*; public class Calculator { public static void main(String[] args) throws IOException { BufferedReader buf = new BufferedReader( new InputStreamReader(System.in)); int i = 0; int answer = 1; System.out.println("+、-、*、/、!、qから選んで入力してください"); String s = buf.readLine(); System.out.println("数字を二つ入力してください"); int a = Integer.parseInt(buf.readLine()); int b = Integer.parseInt(buf.readLine()); if (s.equals("+")) { System.out.println(a + b); } if (s.equals("-")) { System.out.println(a - b); } if (s.equals("*")) { System.out.println(a * b); } if (s.equals("/")) { System.out.println(a / b); } if (s.equals("!")) { System.out.println("階乗の計算をします。数字を一つ入力してください"); while (i < a) { i++; answer = i * answer; System.out.println("a!=" + answer); } } if (s.equals("q")) { //終了する処理 } } } とりあえず、自分でなんとか・・・。 後、残ったのは割り算で bに0が入力された時にInfinityと表示するのと、 階乗と終了する処理・・・・。 そして、終了の命令があるまで計算を続ける ソースを書く・・・。 ここからどのようにすればいいのでしょうか・・・ 教えてください。お願いします!

    • ベストアンサー
    • Java
  • Java for文

    for文について、キーボードで入力して、その数が素数(1またはその数以外で割り切れない数)であるかを判断するコードですが、for文とif文の関係が良くわかりません。ご教示ください。 <サンプル> public static void main(String[] args) throws IOException{ System.out.println("2以上の整数を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int num = Integer.parseInt(str); ※1 for(int i=2; i<=num; i++){ if(i == num){ System.out.println(num + "は素数です。"); ※2 }else if(num % i == 0){ System.out.println(num + "は素数ではありません。"); break; ※1と※2の処理について初心者でもわかるような解説をおねがいできますでしょうか? よろしくお願いいたします。

専門家に質問してみよう