• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:条件分岐が多いIF分の書き方について。)

条件分岐が多いIF文の書き方について

kmeeの回答

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

> 条件がかなり多くても対応できますでしょうか?? できます。 > それか大きなグループとしては3通りありますので > IF分をおおきつ3つに分け > その中に各条件を指定し対応するようなことは可能でしょうか?? できます。 > switchの中にIF分を書いたりすることは出来るのでしょうか?? できます。 プログラミングのコツは「楽する方法を考える。そのためにはどんな努力も惜しまない」です。 今のコードは「まじめ過ぎ」です。 > ・制度コード=”04”または”08”または”09”以外で > A種コードが01の場合 .... 「制度コード=”04”または”08”または”09”以外」が共通してますから if( (制度コード.compareTo(”04”)!=0) && (制度コード.compareTo(”08”)!=0) && (制度コード.compareTo(”09”)!=0) ){  if( A種コード.compareTo("01")) {~ } とまとめられます。 ※ 日本語にだまされないでください。 「または」ということで ||を使っていますが、意味を考えれば 「(”04”または”08”または”09”)ではない」 です。 (制度コード.compareTo(”04”)!=0) || (制度コード.compareTo(”08”)!=0) || (制度コード.compareTo(”09”)!=0) は 「(”04”でない)または(”08”でない)または(”09”でない)」 ⇒ 常に真です。(04→「08でない」ので真、04以外→「04でない」ので真、すなわち、全てで真) 「(”04”または”08”または”09”)ではない」のままに ! ((制度コード.compareTo(”04”)==0) || (制度コード.compareTo(”08”)==0) || (制度コード.compareTo(”09”)==0)) にするか、ドモルガンの法則を使って 「(”04”でない)かつ(”08”でない)かつ(”09”ではない)」にするか、です。 制度コードで分類できるなら if (制度コード.compareTo(”04”)==0) { // 04関連 } else if (制度コード.compareTo(”08”)==0) { // 08関連 } else if (制度コード.compareTo(”09”)==0)) { // 09関連 } else { //ここは「(”04”または”08”または”09”)ではない」 } とすれば、大分すっきりします。なにより ! ((制度コード.compareTo(”04”)==0) || (制度コード.compareTo(”08”)==0) || (制度コード.compareTo(”09”)==0)) みたいな長々しい条件を何度も書かずにすみます。 これができるかどうかは、条件を解析する必要があります。 その努力は惜しんではいけません。

yairi1106
質問者

お礼

下記のコードで大きなグループを2つ合わせて 結果を得ることが出来ました。 これを応用してさらに仕様を増やして 検証していきたいと思います。 どうもありがとうございました。 int lot = Integer.valueOf(年金種類a種コード).intValue(); switch (lot) { case 1: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print("老齢   ");break;} case 2: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("通算老齢 ");break;} case 3: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("障害   ");break;} case 4: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("遺族   ");break;} case 5: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("寡婦   ");break;} case 6: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("かん夫  ");break;} case 7: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("遺児   ");break;} case 8: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("特例老齢 ");break;} case 9: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("通算遺族 ");break;} case 10: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("特例遺族 ");break;} case 11: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("養老   ");break;} case 12: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("母子   ");break;} case 13: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("準母子  ");break;} case 14: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("障害基礎 ");break;} case 15: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("遺族基礎 ");break;}} int lot2 = Integer.valueOf(年金コード.substring(0,2)).intValue(); switch (lot2) { case 01: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0) ){ out.print("退職  ");break;} case 2: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0) ){ out.print ("通算退職");break;} case 3: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0) ){ out.print ("障害  ");break;} case 4: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0) ){ out.print ("遺族  ");break;} case 9: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0) ){ out.print ("通算遺族");break;} case 11: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0) ){ out.print ("退職共済");;break;} case 13: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0) ){ out.print ("障害共済");break;} case 14: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0) ){ out.print ("遺族共済");break;} } }

yairi1106
質問者

補足

アドバイス参考になってます。 > switchの中にIF分を書いたりすることは出来るのでしょうか?? できます。 こちらから考えて作業を進めてます。 int lot = Integer.valueOf(年金種類a種コード).intValue(); switch (lot) { case 1: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print("老齢   ");break;} case 2: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("通算老齢 ");break;} case 3: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("障害   ");break;} case 4: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("遺族   ");break;} case 5: if( (制度コード.compareTo("04")!=0) && (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("寡婦   ");break;} とswitchの中にIF分を書くことで私がチェックしやすいという理由で 作業しているのですが 大きなグループごとでは反応するようになりました。 これを下記のように別のグループを追加すると int lot2 = Integer.valueOf(年金コード.substring(0,2)).intValue(); switch (lot2) { case 01: if( (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print("退職  ");break;} case 02: if( (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("通算退職");break;} case 03: if( (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("障害  ");break;} case 04: if( (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("遺族  ");break;} case 9: if( (制度コード.compareTo("08")!=0) && (制度コード.compareTo("09")!=0) ){ out.print ("通算遺族");break;} 追加コードが反応しないのですが すべてのグループを反応させるにはどのような事に気をつければ よいのでしょうか?? 何か注意すべきことが分かればご教授頂きたいのですが・・・ よろしくお願いします。

関連するQ&A

  • 条件分岐が多いIF分の書き方について_2

    if (制度コード.compareTo ("08") == 0 && 旧共済従前額保障表示 .compareTo ("1") == 0) { out.print ("*"); } else if (制度コード.compareTo ("09") == 0 && 上乗有無表示 .compareTo ("1") == 0 && 上乗従前額保障表示 .compareTo ("1") == 0) { out.print ("*"); } else if (制度コード.compareTo ("09") == 0 && 独自有無表 .compareTo ("1") == 0 && 独自従前額保障表示 .compareTo ("1") == 0) { out.print ("*"); } else { out.print(" ");} } この条件の中に 新たな条件の ただし共通退職時共済識別表示が4の場合だけout.print (" ");とするを 加えたいのですが 普通に加えると 反応しません。 過去の投稿のアドバイスから色々と試したのですが どなたかアドバイスお願い致します。 } else if ( 共通退職時共済識別表示.compareTo ("4") == 0) { out.print (" ");

    • ベストアンサー
    • Java
  • switchの中にIF分の条件分岐について

    int lot2 = Integer.valueOf(年金コード).intValue(); switch (lot2) { case 1: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0) && 旧共済退職年金減額該当表示.compareTo("0")==0 ){ out.print("退職  ");break;} case 2: if( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0)){ out.print ("通算退職");break;} 上記のコードは 年金コードが1の場合 制度コード8なおかつ9または旧共済退職年金減額該当表示が0のとき"退職  "を表示 年金コードが2の場合 制度コード8なおかつ9のとき"通算退職"を表示するコードになります。 このコードの条件に下記のコード } else if ( (制度コード.compareTo("08")==0) || (制度コード.compareTo("09")==0)&& 旧共済退職年金減額該当表示.compareTo("1")==0 ){ out.print ("減額退職"); 年金コードが1の場合 制度コード8なおかつ9または旧共済退職年金減額該当表示が1のとき"減額退職"を表示 とcase 1の中で 旧共済退職年金減額該当表示が1と0で条件判定したいのですが スイッチ文の中のcase 1を複数使用したい場合 どのようにすれば良いのでしょうか? どうぞよろしくお願いします。

    • ベストアンサー
    • Java
  • 条件分岐(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
  • if分岐が上手くいかない。

    if分岐が上手くいかない。 お世話になっております。 基本的なif分岐だと思うのですが、 なぜ動かないのか、どうしても理解できずにいます。 目的は勤務表の作成で、 数値型で取得している外出時間(例.1時間15分⇒1.25) この分の部分を、 0分なら0,(1時間0分⇒1.0なのでそのまま)、 1分から30分までは30分扱い、(0.01⇒0.5,1.01⇒1.5) 31分から60分までは1時間扱い、(0.51⇒1.0,0.9⇒1.0) と、判断する部分を書いているのですが、 何故か分岐が上手くいきません。 下記のように、時間を一度文字列型に変換し、 小数点を条件に分割、 分割した分の部分を数値型にし、その値で比較する。 そんなソースを書いているのですが、 常に1の分岐に入ってしまうのです。 更に1.0時間など、0の分岐を追加するとエラーとなり動きません。 基本的なif分岐だとは思うのですが なぜ上手く行かないのか、 自力でどうしても解決できず相談致します。 よろしくお願いします。 temp = 1.75; alert(temp + "この数字は1時間45分数値型"); //外出時間に関しては、小数部分を0.5単位で切り上げる str = new String(temp); tempstr = str.split('.'); alert(tempstr[0] + "外出時間、HH"); hun_str = tempstr[1].substring(0,2); alert(hun_str + "外出時間、MI"); //hun_strを数値型に hun_int = hun_str - (-0); alert(hun_int + "外出時間、MI(この値で判定)"); if( 0 < hun_int <= 50 ){  //分岐1  alert("1分以上、30分以下。0.5時間とする。"); }else if( hun_int > 50){  //分岐2  alert("30分以上は1時間扱い"); }

  • ifでの条件分岐

    .net vb2005でプログラミングしています。 2つのテキストボックスがあり、その名前をtextbox1,textbox2 , 変数の代入をtx1、tx2とします。 どちらも半角数字で300までしか入力できません。 さらに、tx1に入力されるとtx2も必ず入力される必要があります。 tx1が未入力の場合はtx2も未入力である必要があります。 最初にtx1の文字数が0か確認し、入っている場合、居ない場合と ifで条件分岐させましたが うまくいきません。。 アドバイスいただきたいと思います。 Dim tx1,tex2 As Integer If Len(TextBox1.Text) = 0 Then flg = 0 ElseIf Regex.IsMatch(TextBox1.Text, "^[0-9]{1,3}$") Then tx1= Val(TextBox1.Text) tx1 = Convert.ToInt32(iptx5) '文字列をInteger型(数字型)に変換 Else MsgBox("300までの数字で入力して下さい", vbCritical, "入力エラー") TextBox1.Clear() Exit Sub End If If tx1 > 255 Then flg = 1 MsgBox(ipm_msg2, vbCritical, "入力エラー") TextBox1.Clear() End If '********************************************************************** If Len(TextBox1.Text) = 0 Then flg = 0 exit sub ElseIf Regex.IsMatch(TextBox2.Text, "^[0-9]{1,3}$") Then tx2 = Val(TextBox2.Text) tx2 = Convert.ToInt32(tex2) Else MsgBox(ipm_msg1, vbCritical, "入力エラー") TextBox2.Clear() Exit Sub End If '**255以上なら入力不可** If iptx6 > 255 Then flg = 1 MsgBox(ipm_msg2, vbCritical, "入力エラー") TextBox6.Clear() Exit Sub End If

  • if文の条件分岐

    お世話になっております。 VBについて初心者なので、参考書を見て勉強しております。 if文の条件分岐についてイメージが出来なくて困っています。 例えば、 (1)Windows XPのインストールのVBS、パラメーター用のbat (2)Windows VistaのインストールのVBS、パラメーター用のbat があるとします。 if文を使って、VBSを開いた時に(1)か(2)の分岐を選択するように書くには「if・・・Then・・・Else」を使って書くのが良いのでしょうか? 勉強不足で自己解決ができません・・・ 宜しく御願いします。

  • 文字数カウント(ifで分岐)

    文字数を数えて分岐させたいと思い以下のようにしました。 if ((length($NAIYOU)) < 32){ &ok; } else { &ng; } OKの場合はすんなりいきますが、NGの場合がエラー(Internal Server Error)になります。 何がダメなのでしょうか?

    • ベストアンサー
    • CGI
  • 【Excel2003VBA】セルの文字で条件分岐

    基本的な質問で恐縮ですが、Excel2003のVBAで条件分岐をするときの方法について質問です。 例えば、A1に文字列の「当選」と「あたり」があった場合は、真の処理を、それ以外の場合は偽の処理をする場合は条件式にどのように書けば良いのでしょうか? 次の【条件式】に入る書き方を教えてください。 sub 条件分岐()   If 【 条件式 】 Then     真の場合   Else     偽の場合 End sub

  • 文字列で条件分岐 if swtich

    C言語でifやswitch文の条件式でキーボード入力からの複数文字列(char型)に対して条件分岐をしたいのですが、どなたか具体例を教えていただけないでしょうか?またscanfでキーボード入力を読み込む場合、Enterを押さないと実行されませんが、Enterを押さないでもいい関数や方法があれば教えて下さい。宜しくお願いします。

  • 条件分岐

    以下の条件分岐について教えてください。 条件:str の 文字に ”0.0”や”0000”などの入力があっ   た場合、NG_FLAGを返したいのです。 どこがいけないのか、教えてください。 int CheckData2(char *str) {  if (str[0] == '0');{   printf("%c", str[0]);   if (str[0] == '0' && str[1] == '.'){    puts("CheckData2はOK_FLAG");    return OK_FLAG;   } else if (str[0] == '0' && str[1] == '.'){    puts("CheckData2はNG_FLAG;");   return NG_FLAG; } } puts("CheckData2はOK_FLAG"); return OK_FLAG; }