ここから本文です

JavaScript について 以下の問題で if文条件式 についての質問 2枚のカー...

inv********さん

2019/6/321:24:05

JavaScript について

以下の問題で if文条件式 についての質問


2枚のカードの強弱関係は、次のルールによって決まります。

・1つ目の番号が大きいカードのほうが強い
・1つ目の番号が同じ場合、2つ目の番号が小さいカードのほうが強い

親カードと子カードの情報が与えられるので、それらの強弱関係を調べるプログラムを作成してください。

どのカードにも2つの番号が書かれています。
1つ目の番号は1から10の整数、2つ目の番号は1から4の整数で表されます。
また、2つの番号の各組み合わせは1枚だけカードの束に含まれています。(同じカードが2枚以上存在しません)


情報は配列として以下のように与えられます。

line[]
[0] 親カード (例 1 5等)
[1] 子カードの枚数 (2)
[2] 子カードの情報 (1 4)
[3] 子カードの情報 (6 7)
などと与えられます。


強弱関係のみであれば
for(i=0; i < line[1]; i++){
if(line[0] > line[2+i]){

}
}

で表すことができますが、一つ目の数字が同じ場合、二つ目の数字が小さい方が強いとする条件式がわかりません。

閲覧数:
23
回答数:
2
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

ois********さん

2019/6/511:47:08

まず、
Javascript はスクリプト言語だからプログラムは作れない。
それが何かの問題集の問題文だとしたら、
それの著者もかなりいい加減な知識で執筆しているものやね。

それに、
質問のルール説明では2つめの数字は1~4といっているのに、
例示されているコードでは、
親カード(15)や子カード(67)になっているんで、
その例の時点ですでにおかしい。


さて本題。

────────────────
for( i=0; i<line[1]; i++ ){
if( line[0] > line[ 2+i ] ){ }
}
────────────────

というコードの場合、
比べているのは1つ目の数字じゃなくて、
比較としては2桁の数字の大小を比べている事になる。
1桁目と2桁目を分けて比べるんだから、分けないと。


各カードの「情報」というのが文字列なら、
[] を使ったインデックス番号で、
1文字目なら [0]、
2文字目なら [1] というように指定できる。

────────────────
// 配列
var line = new Array()
// 親カード
line[ 0 ] = "13";
// 子カードの枚数
line[ 1 ] = 2;
// 子カード
line[ 2 ] = "31";
line[ 3 ] = "14";

// 親カード vs 子カード
for( let i=0; i<line[ 1 ]; i++ ){
if( line[ 0 ][ 0 ] > line[ 2+i ][ 0 ] ){ console.log( "親の勝ち" ) }
else if( line[ 0 ][ 0 ] < line[ 2+i ][ 0 ] ){ console.log( "子の勝ち" ) }
else if( line[ 0 ][ 1 ] > line[ 2+i ][ 1 ] ){ console.log( "子の勝ち" ) }
else if( line[ 0 ][ 1 ] < line[ 2+i ][ 1 ] ){ console.log( "親の勝ち" ) }
else{ console.log( "引き分け" ) }
}
────────────────

if() 文を使わなくてもいいのなら、3項演算子の方が楽。

────────────────
// 親カード vs 子カード
for( let i=0; i<line[ 1 ]; i++ ){
console.log(
( line[ 0 ][ 0 ] > line[ 2+i ][ 0 ] ) ? "親の勝ち" :
( line[ 0 ][ 0 ] < line[ 2+i ][ 0 ] ) ? "子の勝ち" :
( line[ 0 ][ 1 ] > line[ 2+i ][ 1 ] ) ? "子の勝ち" :
( line[ 0 ][ 1 ] < line[ 2+i ][ 1 ] ) ? "親の勝ち" :
"引き分け" );
}
────────────────

カードの情報が文字列ではなく2桁の整数値の場合は、
1桁目と2桁目を分けるのがちょっと面倒くさい。
1桁目は、値を 10 で割った商の小数部分を切り捨てた整数。
2桁目は、値を 10 で割ったときの余り。

────────────────
// 配列
var line = new Array()
// 親カード
line[ 0 ] = 13;
// 子カードの枚数
line[ 1 ] = 2;
// 子カード
line[ 2 ] = 31;
line[ 3 ] = 14;

// 親カード vs 子カード
for( let i=0; i<line[ 1 ]; i++ ){
if( Math.floor( line[ 0 ]/10 ) > Math.floor( line[ 2+i ]/10 ) ){
console.log( "親の勝ち" );
} else if( Math.floor( line[ 0 ]/10 ) < Math.floor( line[ 2+i ]/10 ) ){ console.log( "子の勝ち" );
} else if( line[ 0 ]%10 > line[ 2+i ]%10 ){
console.log( "子の勝ち" );
} else if( line[ 0 ]%10 < line[ 2+i ]%10 ){
console.log( "親の勝ち" );
} else { console.log( "引き分け" ) }
}
────────────────

だから、
あえて文字列に直してから比較する方が簡単。

────────────────
// 親カード vs 子カード
for( let i=0; i<line[ 1 ]; i++ ){
let parent = line[ 0 ].toString();
let child = line[ 2+i ].toString();
if( parent[ 0 ] > child[ 0 ] ){ console.log( "親の勝ち" ) }
else if( parent[ 0 ] < child[ 0 ] ){ console.log( "子の勝ち" ) }
else if( parent[ 1 ] > child[ 1 ] ){ console.log( "子の勝ち" ) }
else if( parent[ 1 ] < child[ 1 ] ){ console.log( "親の勝ち" ) }
else { console.log( "引き分け" ) }
}
────────────────

3項演算子を使えばもっとシンプル。

────────────────
// 親カード vs 子カード
for( let i=0; i<line[ 1 ]; i++ ){
let parent = line[ 0 ].toString();
let child = line[ 2+i ].toString();
console.log(
( parent[ 0 ] > child[ 0 ] ) ? "親の勝ち" :
( parent[ 0 ] < child[ 0 ] ) ? "子の勝ち" :
( parent[ 1 ] > child[ 1 ] ) ? "子の勝ち" :
( parent[ 1 ] < child[ 1 ] ) ? "親の勝ち" :
"引き分け" );
}
────────────────

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜1件/1件中

y_h********さん

2019/6/405:16:01

それぞれのカードのふたつの数字をどうやって分けて比べているのかはわかりませんが、ひとつめのifが終わったあとにelse if~で、ひとつめの数字が同じであるという条件を作ればいいのではないでしょうか。
ところで
line[0] > line[2+i]
これで1番目の数字だけ比べられますか……?

あわせて知りたい

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる