比較演算子 vs 条件演算子 - JavaScriptの条件式の選び方

このQ&Aのポイント
  • JavaScriptで条件式を使ったプログラムを書く際に、比較演算子と条件演算子のどちらを使うべきか迷っている場合があります。この記事では、比較演算子と条件演算子の使い方について解説します。
  • 質問者はJavaScriptで条件式を書く際に、知識が足りずに行き詰まっています。質問の内容は、ある条件の式の記述方法と、得点に応じた結果を表示するプログラムの作り方です。この記事では、質問者の問題を解決するためのコードの記述方法を解説します。
  • 質問者が試みたコードは一部誤っており、正しい結果が表示されない原因として、比較演算子や条件式の記述方法に誤りがある可能性があります。この記事では、正しい比較演算子や条件式の使い方を説明し、質問者が望む結果を得る方法を解説します。
回答を見る
  • ベストアンサー

比較演算子?それとも条件演算子?それとも?

JavaScriptで、ある条件の式の記述がわからず困っています。 既存のJSを改修しようと思っていますが、知識が足らずに行き詰まりました。 内容 a,b,c,dと4つの箱があり、それぞれ最大3点ずつ得点が入れることができ,0~12点までの得点内容によって結果を5つ表示させたい。 条件 ・トータルポイントが0~1点の時、結果0を表示。 ・トータルポイントが2~12点の時、  aが一番得点が多い時、結果1を表示。  bが一番得点が多い時、結果2を表示。  cが一番得点が多い時、結果3を表示。  dが一番得点が多い時、結果4を表示。 ・得点が同点だった場合、a>b>c>dとなり、結果1を表示。 なんとか自力で下記のような記述をしましたが、結果表示が思ったようになりません。 また、初期変数の記述は省いています。 if(totalPoint <= 1){ resultNum = 0; } else if(totalPoint >= 2){ if(a >= b >= c >= d >= 1){ resultNum = 1; } else if(b >= c >= d >= 1){ resultNum = 2; } else if(c >= d >= 1){ resultNum = 3; } else if(d >= 1){ resultNum = 4; } 演算子も含め、どのような記述であればスマートでしょうか? ご教授いただけますと幸いです。 よろしくお願いいたします。

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

>if(a >= b >= c >= d >= 1){ 入門書を読んで、比較演算子の意味を理解しましょう。 if(totalPoint >=0 && totalPoint <= 1){ resultNum = 0; } else if(a >= b && a >=c && a>=d){ resultNum = 1; } else if(b >=c && b >=d && b >=a){ resultNum = 2; } else if(c >= d && c >=a && c >= b){ resultNum = 3; } else { resultNum = 4; }

code_typer
質問者

お礼

お早い回答ありがとうございます! なるほど、このような記述になるのですね。 入門書読んで修行します! ありがとうございますした!

その他の回答 (2)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.3

resultNum = 1; if(totalPoint <= 1){ resultNum = 0; } else if(totalPoint >= 2){ var maxPoint = Math.max(a, b, c, d); if (a === maxPoint) { resultNum = 1; } else if (b === maxPoint) { resultNum = 2; } else if (c === maxPoint) { resultNum = 3; } else if (d === maxPoint) { resultNum = 4; } }

code_typer
質問者

お礼

こういう書き方もあるんですね ありがとうございます!

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

こんな感じじゃない? switch(Math.max(a,b,c,d)){ case a: resultNum = 1; break; case b: resultNum = 2; break; case c: resultNum = 3; break; case d: resultNum = 4; break; }

code_typer
質問者

お礼

switch分を使用するとコンパクトですね。 ありがとうございます!

関連するQ&A

  • 条件演算子 ? :

    条件演算子 ”?:”をつかってif分と同じようなことができると知りました。 c = (a>b) ? a : 0 ; というようにスルのですが、ふと、条件に満たない場合はそのまま、という場合にはどう記述したらいいのかわかりません。ためしに c = (a>b) ? a : c ; としてみました。これで正しく動作したのですが、 //(a<=b)のときは c = c ; ということになるんですよね。これってなんとなく”無駄”な感じがします。 if文でいうと、"else"を記述しない場合の書き方で、スマートなものはないでしょうか?

    • ベストアンサー
    • Java
  • if文の演算子について

    if文の演算子について int a=0,b=1,c=1,d=1; if(a==1 && b==1 && c==1 ||d==1){ Printf("yes"); }else{ Printf("no"); } if((a==1 && b==1 && c==1 )||d==1){ Printf("yes2"); }else{ Printf("no2"); } } 上記のif文で出力結果が異なります。 if((a==1 && b==1 && c==1 )||d==1)の方はa=1、b=1、c=1の時もしくはd=1の時と 理解できるのですが、 if(a==1 && b==1 && c==1 ||d==1)の方は、どういう条件の時が当てはまるのでしょうか?

  • 3つの入力した数値の大小比較ができません。

    #include<stdio.h> int main() { int a,b,c; scanf("%d",&a); scanf("%d",&b); scanf("%d",&c); if(a<b) { if(b<c) { if(a<c) { printf("%d<%d<%d\n",a,b,c); } else { printf("%d%d%d",a,b,c); } } if(b>c) { if(a>c) { printf("%d<%d<%d\n",c,b,a); } else { printf("%d<%d<%d\n",a,c,b); } } } else if(a>b) { if(b>c) { if(a>c) { printf("%d>%d>%d\n",a,b,c); } else { printf("%d>%d>%d\n",a,c,b); } } else if(b>c) { if(a>b) { printf("%d>%d>%d\n",a,b,c); } else { printf("%d>%d>%d\n",b,a,c); } } else if(c>b) { if(c>a) { printf("%d<%d<%d\n",b,a,c); } else { printf("%d>%d>%d\n",a,c,b); } } else if(a<c) { if(a<b) { printf("%d<%d<%d\n",a,b,c); } else { printf("%d<%d<%d\n",b,a,c); } } else if(a>c) { if(a<b) { printf("%d>%d>%d\n",b,a,c); } else { printf("%d>%d>%d\n",a,b,c); } } else { printf("%d=%d=%d\n",a,b,c); } } 間違っている部分を教えてください。

  • 条件分岐(if)について

    条件分岐(if)についてお聞きしたことがあります。 例えば if($a == 'A' || $a == 'B'){ 処理 }else if($a == 'C' || $a == 'D' || $a == 'E'){ 処理 }............... といった条件分岐があったとて、お聞きしたいことが2点あります。 ・条件分岐この後も数十個続いたとします。その場合もelse ifで一つ一つ 条件を書かなければならないのでしょうか? ・条件式if($a == 'A' || $a == 'B'....)が長くなる場合プログラムが見にくくなるので 別途に条件式を書いておいてif文の所では($a == ◯)といったように簡潔に書くことは できないのでしょうか? 宜しくお願いします。

    • ベストアンサー
    • PHP
  • 条件式で差額

      A    B    C    D 1 2 1000              といった状態に、 B2に(B1に入力があればA2の3%の結果を、無ければ0を)の式を =IF(B1="","0",A2*0.03) C2に(C1に入力があればA2の10%の結果を、ただしB2に値が有ればその差額を、無ければ0を)の式を =IF(C1="","0",A2*0.1)-IF(B1="",0,B2) D2に(D1に入力があればA2の12%の結果を、ただしB2またはc2のどちらかに値が有ればその差額を、無ければ0を)の式を =IF(D1="","0",A2*0.12)-IF(B1="",0,B2)-IF(C1="",0,C2) と表記すると例えばB1とD1に入力があればB2=30,D2=90で結果は問題ないのですがC2に(-30)と表示され、同様にB1のみ入力だとC2:D2に(-30)と表示されて困ってます。 この(-30)の表示をさせない正しい条件式が見当もつかず今回投稿させてもらいました。どうか皆さんご助力お願いします。

  • 複数条件のIFの入れ子の方法

    Excel2010です。 複数グループの判定条件を入れ子で記述したいのですがうまくいきません。 1グループでは次のようにできました。 =IF(OR(A5=1,B5=1,C5=1,D5=,1),A10,0) A5からD5のうちどれかが1ならA10に表示されているテキストを表示せよ。 2グループでは次のように記述しましたがうまくいきません。 =IF(OR(A5=1,B5=1,C5=1,D5=,1),A10,IF(OR(E5=1,F5=1,G5=1,H5=,1),A15,0) ) これが5グループまで続きます。とりあえず1グループずつ確認しているのですが2グループでうまくいきません。教えてください。

  • 複数項目を他の行と比較して、判定を行いたい(Excel)

    複数項目を他の行と比較して、判定を行いたい(Excel) ご覧いただきまして、ありがとうございます。 タイトルにありますように、複数の項目を他の行のデータと比較して、全ての条件を満たした場合にそれを表示させたいと考えています。 例えば、   A    B   C    D  E 1 出場  回数  年齢  得点 2 A組   4   24   570 3 B組   4   21   480 4 A組   4   25   400 5 A組   3   29   470 このようなデータがあるとしてください。 それぞれの行を他の行と比べて、  出場組が同じ  回数が同じ  年齢がより若い  得点が50点以上高い という条件を満たしたら、E列に数値を表示させたいと考え、  {=(A1=A$1:A$5)*(B1<B$1:B$5)*(C1=C$1:C$5)*(D1>=D$1:D$5+50)} というような式をE列に入れました。 イメージとしては、   A    B   C    D   E 1 出場  回数  年齢  得点 2 A組   4   24   470  1 ←2行後に対して条件を満たす 3 B組   4   21   380  0 4 A組   4   25   300  0 5 A組   3   29   370  0 となってほしいのですが、実際は、   A    B   C    D   E 1 出場  回数  年齢  得点 2 A組   4   24   470  0 3 B組   4   21   380  0 4 A組   4   25   300  0 5 A組   3   29   370  0 となり、思ったような結果になりませんでした。 どのような式を入力すればよいかお分かりの方がいらっしゃいましたら、ご教示ください。よろしくお願いいたします。

  • C言語における複素数の四則演算について

    複素数の四則演算(a+biとc+diの四則演算)について、for文を用いて表示するプログラムについて、???の部分に何を入れたらよいかわからず、うまく実行することができません。和・差・積・商の計算種別を入れるみたいなのですが、何を入れたらいいのかわかりません。 #include <stdio.h> void fukuso(double a,double b,double c,double d,double *e,double *f,int keisan); int main(void) { double a=4, b=8, c=4, d=3, e, f; int i; for(i=1;i<5;i++){ fukuso(a,b,c,d,&e,&f,???); if(i==1) printf("和演算\n"); else if(i==2) printf("差演算\n"); else if(i==3) printf("積演算\n"); else printf("商演算\n"); printf("e=%f f=%f i\n",e,f); } return (0); } void fukuso(double a1,double b1,double a2,double b2,double *a3,double *b3,int keisan) { if(keisan==1){ *e=a+c; *f=a+c; } else if(keisan==2){ *e=a-c; *f=b-d; } else if(keisan==3){ *e=a*c-b*d; *f=a*d+c*b; } else{ *e=(a*c+b*d)/(c*c+d*d); *f=(-a*d+c*b)/(c*c+d*d); } }

  • Excel 条件付きの条件先が式の場合

    Excelでたとえば A1に入力された数値、B1にはA1を引数とした計算結果があるとします。B1の計算結果が0.09だった場合だけC1に1を、そのほかの場合は2を表示させようとしました。 C1に =if(B1=0.09,1,2) の式を入れましたが、B1の計算結果が0.09でもC1には2が表示されます。そこで、C1に =if(int(B1*100)=9,1,2) の式を入れても結果は同じで、D1に=text(int(B1*100),0) の式をいれてからC1に=if(D1="9",1,2) でやっと1が表示されました。 これは当たり前のことなんでしょうか。このような方法をとらないと、数字の認識は難しいのでしょうか? 教えてください。

  • 2つ分数の四則演算を行うプログラム

    <要求事項> 分数は、 例)1|3 のように表す。 1.分母がゼロの時はエラーとする。 2.除算において、除数がゼロの入力エラーに対しては、再入力するように促す。 3.以下範囲の整数(分子、分母にかかわらず)に対して、正しく計算できるようにする。   -2147483648 ~ 2147483647 4.計算結果については,分母が1の時には分子のみ表示。分数がの時には0のみを表示。最終計算結果は既約分数にする。分数が負数の場合、-を分数の前に表示。 #include <stdio.h> #include <math.h> int main(void) { int b,d; /* 分母*/ int a,c; /* 分子*/ int sign,sign2,sign3,sign4; int yakusu,yakusu2,yakusu3,yakusu4; /* 最大公約数*/ printf("分母= "); scanf("%d",&b); printf("分子= "); scanf("%d",&a); if(b==0){ printf("分母が0です。入力が誤っています。\n"); /*分母が0ならエラーとする*/ return 0; } if (a==0){ printf("分数1= 0\n"); /*分子が0のとき*/ } else{ printf("分数1=%d|%d\n",a,b); /*一つ目の分数*/ } printf("\n"); printf("分母= "); scanf("%d",&d); printf("分子= "); scanf("%d",&c); if(d==0){ printf("分母が0です。入力が誤っています。\n"); /*分母が0ならエラーとする*/ return 0; } if (c==0){ printf("分数2= 0\n"); /*分子が0のとき*/ } else{ printf("分数2=%d|%d\n",c,d); /*二つ目の分数*/ } printf("\n"); /* 足し算:a|b + c|d = (a*d + b*c) | (b*d) */ printf("足し算:%d|%d + %d|%d\n",a,b,c,d); yakusu = gcd(abs(a*d + b*c),abs(b*d)); /*最大公約数を求める*/ sign = (a*d + b*c)/abs(a*d + b*c) * (b*d/abs(b*d)); if(sign * abs(a*d + b*c)/yakusu == 0){ /*分子が0となる時*/ printf("0\n"); } if (abs(b*d)/ yakusu!= 1){ printf("既約分数は %d|%d\n" ,sign * abs(a*d + b*c)/yakusu , abs(b*d)/yakusu ); } else{ printf("既約分数は %d\n" ,sign * abs(a*d + b*c)/yakusu ); /*分母が1の場合*/ } printf("\n"); /* 引き算:a|b - c|d = (a*d - b*c) | (b*d) */ printf("引き算:%d|%d - %d|%d\n",a,b,c,d); yakusu2 = gcd(abs(a*d - b*c),abs(b*d)); /*最大公約数を求める*/ sign2 = (a*d - b*c)/abs(a*d - b*c) * (b*d/abs(b*d)); if(sign2 * abs(a*d - b*c)/yakusu2 == 0){ /*分子が0となる時*/ printf("0\n"); } if (abs(b*d)/ yakusu2!= 1){ printf("既約分数は %d|%d\n" ,sign2 * abs(a*d - b*c)/yakusu2 , abs(b*d)/yakusu2 ); } else{ printf("既約分数は %d\n" ,sign2 * abs(a*d - b*c)/yakusu2 ); } printf("\n"); /* 掛け算:a|b * c|d = (a*c) | (b*d) */ printf("掛け算:%d|%d * %d|%d\n",a,b,c,d); yakusu3 = gcd(abs(a*c),abs(b*d)); /*最大公約数を求める*/ sign3 = (a*c)/abs(a*c) * (b*d/abs(b*d)); if(sign3 * abs(a*c)/yakusu3 == 0){ /*分子が0となる時*/ printf("0\n"); } if (abs(b*d)/ yakusu3!= 1){ printf("既約分数は %d|%d\n" ,sign3 * abs(a*c)/yakusu3 , abs(b*d)/yakusu3 ); } else{ printf("既約分数は %d\n" ,sign3 * abs(a*c)/yakusu3 ); /*分母が1の場合*/ } printf("\n"); /* 割り算:a|b / c|d = (a*d) | (b*c) */ printf("割り算:%d|%d / %d|%d\n",a,b,c,d); yakusu4 = gcd(abs(a*d),abs(b*c)); /*最大公約数を求める*/ sign4 = (a*d)/abs(a*d) * (b*c/abs(b*c)); if(sign4 * abs(a*d)/yakusu4 == 0){ /*分子が0となる時*/ printf("0\n"); } if (abs(b*c)/ yakusu4!= 1){ printf("既約分数は %d|%d\n" ,sign4 * abs(a*d)/yakusu4 , abs(b*c)/yakusu4 ); } else{ printf("既約分数は %d\n" ,sign4 * abs(a*d)/yakusu4 );/*分母が1の場合*/ } return 0; } int gcd(int x,int y){ /* ユークリッド互除法*/ int z; if( (x <= 0) || (y <= 0) ){ return -1; } z = x % y; while (z != 0){ x = y; y = z; z = x % y; } return y; } >>大学の課題です。現在の状態は上記の通りです。このプログラムだと、答えの既約分数が0になると表示できなかったり、桁が大きい数で計算しようとすると値がおかしくなってしまいます。 どなたかプログラム改良にご助力願えないでしょうか?

専門家に質問してみよう