現在JAVAでランダムに重複しない4つの数字(a)を設定し、Scannerで数字を4つ打ち込んでaとすべて一致したらOKと表示するコードを書いています
そこまでは行けたのですがたとえば
aが1234でScannerで1524
と打ち込んだ時に一致している部分は○、間違えている部分は×と表示したいです
例)上記のだと1、4が一致しているので
○2、×2という風にしたいです
答えではなくヒントといいますか手引きをしてほしいです
よろしくお願いします
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
if(num[1] == ans[0] && num[2] == ans[1] && num[3] == ans[2] && num[4] == ans[3]){
System.out.println("OK");
}else{
System.out.println("bat");
}
ここをfor文にすると良いと思います。
for()
{
if()
○++;
else
×++;
}
このようにすると良いのではないでしょうか?
投稿2015/06/07 14:38
総合スコア1021
0
こんにちは。
答えではなくヒントといいますか手引きをしてほしいです
とのことなので、現状のコードの修正を最小限にする方針でいくとして
例えば、以下のようなメソッドを追加するというのはいかがでしょうか。
lang
1private static int countMatches(int[] a, int b[])
このメソッドは、整数の配列 a と配列 b を比較して、同じ位置に同じ
数がある要素の数を返します。たとえば
a が、{ 1, 2, 3, 4 } で、b が { 1, 5, 2, 4 } のときに
countMatches(a, b)
は、2 を返すようなものです。countMatchesメソッドをこのように作成して、
このメソッドの返す値を◯の数にするという方針です。
main の中に直接、countMatchesの中でやることを書かないで
メソッドとして切り分けてることで、どこで何をやるかを切り分
けます。
このようなcountMatchesを作成して、a として最初にランダムに
生成した値の配列を渡し、b としてScannerで取得した値の配列
を渡します。
ただ、もしこれでいくなら、現状、num を長さ5の配列にして
num[0]にユーザーが入力した値を入れ、num[1]からnum[4]で
1000の位から1の位までを入れていますが、これを改めて、
現状のnum[0]に変わる変数をひとつ追加して、(たとえば、inputValue とか。)
num[0]からnum[3]までに1000の位から1の位までを入れて
countMatches(ans, num)
として一致している数字の数を求めます。
countMatchesメソッドの詳細は、
答えではなくヒント
とのことなので書かないでおきます。
以上が「こうしてみては?」というひとつの考え方です。
以下は蛇足ですが、現状のソースをみて少し気になった部分です。
(1) クラス名が hitblow となっていますが、クラス名は先頭を
大文字にするのが通例となっています。
なので、Hitblow とかHitBlow とする方が良いかと思います。
(2)余りを入れておく変数が t_much となっていますが、
割り算の余りは英語で
remainder
ですので、このまま変数名として使って、さきほど挙げた
inputValue
と併せて、
int remainder = inputValue % 1000;
とするのがよいと思います。
少なくとも、 t_much という名前からは、これが
割り算の余りであることが読み取れません。
変数やメソッドなどの名前にこだわりを持つ習慣をつけると、
今後プログラミングを続けていくときに、綺麗なコードを
書くための良い下地になっていきます。
ちなみに私は、この回答を書いているときに
追加することを提案したメソッド名を
countMatch
にするのか、
countMatches
にするのか、はたまた
matchCount
にするのかで、少し悩みました。
以上ご参考になれば幸いです。
追記(1)
(以下の懸案事項ですが、もし、すでに認識されている問題なら、すみません。)
現状のコードだと、ユーザーからの入力も4桁であることを前提にして
しまっているように思えますが、4桁よりも少ない桁の数(たとえば、
100とか)または大きい桁の数字(たとえば、9999999)を入力された場合に、
どのように対応するのかも、要検討かもしれませんね。
たとえば、ランダム生成したans が 1234 のときに、ユーザーからの入力が
134 だったとすると、
・両者をいわば"1234"と"134"という文字列と考えて、
先頭からの同じ位置の数字が一致するものを数えたい。
=>この例では、"1"だけが一致しているので、一致しているものの数は1
なのか
・ユーザーから入力された134は、整数の値の百三十四であるとして
1234と134の各位の数字が一致しているものの数を数えたい。
=> この例では、十の位の3と、一の位の4が一致するので、
一致しているものの数は2
なのかで、書くべきプログラムも変わってきます。
今回の数あてプログラムのようなものでも、考えるべきことは
たくさんありますね。がんばってください!
追記(2)
ランダム生成する数も、入力される数も4桁と決まっていて、
それら2つの4桁の数について、同じ位に同じ数字がいくつ
あるかを数えることが目的で、それを果たせればそれぞれの
位の数字を配列にする必要が特にないのであれば、
以下のメソッド
int countMatchedDigits(int a, int b)
のようにシンプルに書けます。
lang
1public class Hitblow2 { 2 3 // 2つの4桁の整数、a と bについて、同じ桁に同じ数が 4 // いくつあるかを返す。 5 private static int countMatchedDigits(int a, int b) 6 { 7 int count = 0; 8 9 for ( int divisor = 1000; divisor >= 1; divisor /= 10 ) { 10 if ( a / divisor == b / divisor) 11 count ++; 12 a %= divisor; 13 b %= divisor; 14 } 15 16 return count; 17 } 18 19 // 上記のメソッドのテスト 20 public static void main(String[] args) 21 { 22 System.out.println(countMatchedDigits(1234, 1234)); // 4と表示される。 23 System.out.println(countMatchedDigits(1234, 2345)); // 0と表示される。 24 System.out.println(countMatchedDigits(1234, 9234)); // 3と表示される。 25 } 26 27}
以上、参考になれば幸いです。
追記(3)
もう1つ、
「4桁の数字が2つあったときに、同じ位の数字が一致しているかを判定する方法」
を思いついたので、挙げておきますね。
まず前提として、今回の場合、ランダム生成する4桁の数字は、各桁が
ans[i] = (int)(Math.random() * 9) + 1;
という作成のされ方をするので、どの桁も1以上9以下ですので、
数字0を含まない4桁の整数として、aとbを検証の対象とします。
このとき、
(1) aとbを文字列として連結した文字列s を作成します。
たとえば、
a=1234, b=1784 なら、s="12341784" です。
(2)このように s を作ると、 a と b の千の位の数字が一致するか
どうかを判定するには、文字列 s の一番左の数字と、左から
5番目の数字が一致するかどうかを調べればよいことになります。
(3) 上記(2)を調べるには、文字列s が正規表現
^([1-9])[1-9]{3}\1[1-9]{3}$
にマッチするかどうかを調べればよいです。
この正規表現は、
「1以上9以下の数字だけで構成された、長さ8の文字列で、
かつ、一番左の数字と左から5番目の数字が同じもの」
を表しています。
たとえば、
- a=1234, b=1784 のときの s="12341784" はこの正規表現にマッチしますが、
- a=5678, b=9876 のときの s="56789876" はこの正規表現にマッチしません。
(4) 同様に、aとbの百の位、十の位、一の位の数字が一致するかどうかを
判定するための、sに対する正規表現を、各々作ることができて、これら4つの
正規表現のうち、s にマッチするものの個数が、aとbとで数字が同じ桁の個数
になります。
正規表現の学習はこれからかもしれませんが、こんな感じにも
書けますということで、参考に留めて頂ければ幸いです。
投稿2015/06/07 01:12
編集2015/06/07 13:19総合スコア9058
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
擬似的なコードで示します。
count_x = 0 // 不一致の数
count_o = 0 // 一致のかず
i = [0, 1, 2, 3] でループする。
if num[i] == ans[i]
count_o += 1 // 一致の数を +1 する
else
count_x += 1 // 不一致の数を +1 する
投稿2015/06/07 00:36
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/06/07 01:56
2015/06/07 02:02
2015/06/07 02:28
2015/06/07 02:32
2015/06/07 02:43
2015/06/07 02:53
2015/07/29 13:56 編集
0
一致した桁の数を保持する変数を用意し、
桁ごとに比較し一致したら変数に1を加え、
その結果をもとに表示すればいい。
4桁の乱数生成方法もちょっと気になるので私なりに書いてみます
lang
1for(int i = 0; i < 4; i++){ 2 check: while(true){ 3 int n = (int)(Math.random() * 9) + 1; 4 for(int j = 0; j < i; j++){ 5 if(n == ans[j]) continue check; //一致したら乱数生成に戻る 6 } 7 ans[i] = n; 8 break; 9 } 10}
投稿2015/06/07 00:34
編集2015/06/07 01:23総合スコア20651
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。