質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

2606閲覧

Java超初心者・虫食い算

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2017/08/17 14:21

###問題
1+a=3
a+2=3
1+2=a
のように、足し算か引き算の3つの数字のうち1つだけaに置き換えたような虫食い算を作ります。
aに代入すべき値を出力させます。

(1つめなら2、2つめなら1、3つめなら3)

以下のコードを書いたのですが、エラーは出ないのですが0になってしまいます。
このコードの問題点と、恐らく余りにも醜いこのコードを改良していただけたらと思います。
どちらかでも構いませんので、お教えくだされば幸いです。

lang

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) { 5 6 Scanner sc = new Scanner(System.in); 7 String line = sc.nextLine(); 8 String[] strarray1 = line.split(" ");//分割したつもり 9 int num[] = new int[2];//数字のための配列 10 String kigou[] = new String [3];//記号のための配列 11 int ans = 0 ; 12 13// 数字と記号を分けたつもり 14 for(int i=0;i<5;i++){ 15 if(isNum(strarray1[i])==true){ 16 try{ 17 kigou[i]=strarray1[i]; 18 }catch(NumberFormatException e) { 19 e.printStackTrace(); 20 } 21 }else{ 22 23 } 24 } 25 26 27//記号の位置によって場合分けしてxを求めたつもり 28 if("a".equals(kigou[0])){ 29 if("+".equals(kigou[1])){ 30 ans = num[0]-num[1]; 31 }else if("-".equals(kigou[1])){ 32 ans = num[0] + num[1]; 33 34 35 }else if("+".equals(kigou[0])){ 36 ans = num[0]+num[1]; 37 } 38 39 }else{ 40 if("+".equals(kigou[0])){ 41 ans = num[0]+num[1]; 42 }else if("-".equals(kigou[0])){ 43 ans = num[0]-num[1]; 44 } 45 } 46 47 System.out.println(ans); 48 } 49 50 //文字列が整数か判定するメソッドのつもり 51 public static boolean isNum(String number){ 52 try { 53 Integer.parseInt(number); 54 return true; 55 } catch (NumberFormatException e) { 56 return false; 57 } 58} 59} 60

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iwamoto_takaaki

2017/08/17 14:30

醜いと思う部分はどこでしょうか?いきなり模範解答をだされても参考にならなかったりするので、ポイントを絞った方がわかりやすい回答が得られると思います。
退会済みユーザー

退会済みユーザー

2017/08/23 01:27

その通りですね。次回から訂正いたします。
guest

回答1

0

ベストアンサー

必ず0になるのは、配列numに一切値を代入していないためです。
あらゆるパターンの計算が0同士の計算になるため、どう計算しても答えは0です。
なので、切り分けた文字列から数値変換して配列に格納するところからですね。

そのほか、いくつかヒントを

  • 左辺の記号"+"か"-"かは、x-yをx+(-y)とすれば、"+"の場合に統一できる。
  • 上記のようにすれば、分岐条件は「aが左辺にあるか右辺にあるか」だけで済む。

投稿2017/08/17 15:13

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/18 00:04

ご指摘ありがとうございます。 初歩的な質問で申し訳ないのですが、ご指摘の通りfor文の部分を for(int i=0;i<5;i++){ if(isNum(strarray1[i])==true){ try{ num[i]=Integer.parseInt(strarray1[i]); }catch(NumberFormatException e) { e.printStackTrace(); } }else{ kigou[i]=strarray1[i] } } としますと、num[i]~の行にArrayIndexOutOfBoundsException: 2のエラーが出てしまうのですが、そうしてそうなるのでしょうか?
Tak1016

2017/08/18 01:05

step実行してdebugしてみたら原因分かるのではないの? debugせずに実行して、エラー出ました。って言われても ほーん としか。
退会済みユーザー

退会済みユーザー

2017/08/18 03:37

配列のそもそもがよくわかっていなくて、 num[i]=Integer.parseInt(strarray1[i]);がうまく機能しているのかすらよくわからないんですが・・・・・・
swordone

2017/08/18 04:31

そもそも入力例が最初の例のような"1+a=3"のような形式だと、" "(半角スペース)がないので分割自体出来ていないことになりますが。
退会済みユーザー

退会済みユーザー

2017/08/18 04:56

すみません、書き添えるのを忘れてしまいましたが、虫食い算の式は、それぞれの文字間に半角スペースが空いています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問