複雑な条件で処理を分岐する方法はどうすべきか

このQ&Aのポイント
  • c#初心者の方が複雑な条件で処理を分岐する方法について質問されています。質問文章では、条件分岐のコードの見やすさや再利用性について悩んでいる様子が伺えます。しかし、条件分岐のコードが複雑化している場合には、メソッドに分割してみることで可読性を向上させることができます。具体的な改善案やコード例も提示されていますので、参考にしてみてください。
  • また、条件分岐のコードが非常に複雑になりやすいため、適切なインデントや括弧の位置を工夫することも重要です。ただし、やりすぎて逆に見にくくなってしまう可能性もあるため、バランスを考慮しながらコードを整形することが求められます。
  • 最後に、条件分岐のコードが細かく分離できず、再利用される場所がない場合には、メソッドに分割せずにインデントなどを駆使して整形する方法もあります。ただし、見やすさや可読性を重視する場合には、メソッドに抽出して再利用性を高めることが望ましいです。このような場合でも、各自のコーディングスタイルやプロジェクトのルールに沿って書くことが重要です。
回答を見る
  • ベストアンサー

複雑な条件の書き方

 こんにちは。c#初心者です。(今回の質問はcに近い言語ならどれでも大差ないと思います)  複雑な条件を使って処理を分岐する場合、 if ( A || (B && (C || D || E)) && F) // A~Fは条件 else  のようになったりすることもあると思いますが、それがさらに複雑化して if ( value1 < A || (B && ( (value1 = values[index]) == C || D || E)) && (value1 = values[value2]) == F ) else ( A~Fはフィールド(インスタンス)変数やstaticな変数で、それ以外はローカル )  のように代入まで入ってきているようなコードがあった場合は、さら乱雑になるので bool satisfied(ref int value, int value2, int[] values, int index) {   if ( value1 < A ) return true;   if ( !B ) return false;   value1 = values[index];   if ( value1 != C && !D && !E ) return false;   value1 = values[value2];   return value1 = F; }  のようなメソッドに抽出して if ( satisfied(ref value1, value2, values, index) ) … else … のようにしたほうが良いのでしょうか?  ちなみにこれらの条件は(初心者が見る限り多分)これ以上細かく分離できず、再利用される場所がありません。  そのためメソッドにしてしまわず、インデントなどを駆使して if ( value1 < A ||   (     B &&     (       (value1 = values[index]) == C       || D || E     )   )   && (value1 = values[value2]) == F ) else  のようにするだけでも良いのでしょうか?(何だかやりすぎて、逆に見にくくなった気が…)  この辺の事はよくわからないので皆さんのご意見を伺わせてください。

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

  • ベストアンサー
  • kekyo0
  • ベストアンサー率62% (5/8)
回答No.6

最初の方の回答でもありましたが、やっぱりテスト可能性に着目するのが良いと思います。 今のままでは、漏れのないテストを行うのが、(このコード量にして)既に苦痛です。 #昔は書き方だけでパフォーマンスに影響がありましたが、今やそんな事を気にするのは #シェーダプログラムぐらいでしょう。 条件の判定を細かく分割するのは良いアイデアです。最も、分割すべき節は考える必要があります(その判定の意味が明確になるように分割することが重要だと考えます)。 そのように分割し、個々の式の「意味」が正しいかどうかを、ユニットテストでテストするようにします。 テストが通った個々の式を集成したテストを書く頃には、コード全体について安心感が得られるはずです。 既に見ているかもしれませんが、参考までに。 http://www.atmarkit.co.jp/fdotnet/nagile/nagile02/nagile02_03.html

koumei000
質問者

お礼

 ご指摘ありがとうございます。  NAgilerは初めて見ましたが、ためになりました。特にサイバラさんのは最高でした。  とりあえず、NAgilerは非常に有用だと思うのでこれから実践したいと思います。ありがとうございました。

その他の回答 (7)

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

ifの条件中に代入式を書けるのは、Cの特徴で、場合によってはすっきりとわかりやすく、また、「いかにもCのプログラム」という感じがあるのですが 例のように複雑になったら、そんなCらしさは捨てた方がいいです。 とりあえずは、別の言語のように「代入は文で、ifの条件式中に書けない」ものとして、条件を整理するのがいいのでは?

koumei000
質問者

お礼

 そうですよね。1つのステートメントにインクリメント程度ならまだしも、代入まで、それも複数あると読みにくいですよね。  日ごろからそんなコードにはならないように心がけてはいるので、自分は問題ないですが、他人さんの書いたコードだけはどうしようもないです。

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.7

本題とは関係ありませんが、 > ユニットテストですか。魅力的ではあるんですけどね。一度はNUnitに手を伸ばそうとしたのですが、 > >「使い方がイマイチ、アセンブリがどうとか」 >→「ユニットテストが無いならstaticチェッカー(Contract)を使えばいいじゃない」 ユニットテストとstaticチェッカーは用途が違いますよ。 またユニットテストはNUnitなど使えば便利なのは確かですが別に必須というわけではないです。 要は作ったクラスやメソッドが仕様通りに動作するのか確認できればいいだけなんで。

koumei000
質問者

お礼

 ご指摘ありがとうございます。  いえいえ、バグを減らすためのものと、仕様を明記するためのものということは知っていますが、原因不明のバグが発生したときがあって、そういうのを見つけるために使おうかと(結局使えずにひたすらステップインの連続)。  原因は本来変化するべきタイミングで変数が変化していなかった(ちゃんと連動していなかった)事なのですが、これがまた厄介で、 「正常値 → 不正値」の変化(明示的な不正値への変化)なら、 (バグ要因の変数を変化させている部分だけ)ざっと挙動を追うだけで見つけられるのですが、 「正常範囲 → 別の正常範囲」の変化(暗黙的な不正値への変化)の変化は、何しろバグ要因の値が一切変化していないわけで、探すのに苦労しました。  この場合、「UnderLimit <= Value && Value <= UpperLimit」が常に満たされているかどうかを確認すればよいので、Invariantな契約を使えばすぐに発見できたんですね(「Invariant」は静的チェッカー使わなくても十分役に立つし、比較的簡単に作れるので属性を駆使して、何とかもどきを作りました)。  また何かありましたら、ご指摘お願いします。

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.5

多分、私が書いたサンプルは、あなたのif文を読み違えているように思いますが、 それは難読だから、ということで(^^;) ともかく、trueになる条件をツラツラと書き連ねて行けば、どんなに条件が増えても、 怖くありません。

koumei000
質問者

お礼

 回答ありがとうございます。 > 多分、私が書いたサンプルは、 > あなたのif文を読み違えているように思いますが、  elseが使われていないので、検索を行う用な判定や、手前の判定でtrueの場合、後ろが例外をスローする場合があったりすればまずいかもしれません。 > ともかく、trueになる条件をツラツラと書き連ねて行けば、 > どんなに条件が増えても、怖くありません。  うまく使えば便利そうです。ただ、「&(&&)」を使う場合はfalseを返したほうがいい場合もあるかもしれません。

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.4

判定を関数化するのは、良いアイデアだと思います。 気になるのは、条件に応じて、trueやらfalseやらをバラバラに返そうとしているところです。 if文の判定条件は少し変更するだけでバグになってしまうので、複雑な判定は避けたほうが良いです。 例えば「trueになる条件に着目する」という方針で検討してみては? 1つずつの条件を読むなら簡単で、どういう条件ならsatisfiedなのか?が明確になります 。 bool satisfied(...) {  bool ret = false; // 初期条件  // 以下、retをtrueにする条件文だけ書く  //必要に応じてsatisfied条件を説明する  if ( value1 < A ) {   ret = true;  }  //必要に応じてsatisfied条件を説明する  value1 = values[index]);  if ( B && (value1 == C) || C || D || E ) {   ret = true;  }  //必要に応じてsatisfied条件を説明する  value1 = values[value2];  if ( value1 == F ) {   ret = true;  } //上記のsatisfied条件の判定に引っかからなければ、falseが返る  return ret; } 無駄な判定を避けたいなら、 ret = true; return; としても良いです。 こうしておくと、判定の優先順位の変更が必要になった場合も、入れ替えにより、容易に対応できます。

koumei000
質問者

お礼

 回答ありがとうございます。 > 判定を関数化するのは、良いアイデアだと思います。  人に言われると思いつきでも嬉しいものですね。 > if文の判定条件は少し変更するだけでバグになってしまうので、 > 複雑な判定は避けたほうが良いです。 > 例えば「trueになる条件に着目する」という方針で検討してみては?  一考の価値はありそうです。参考にさせてもらいます。

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.3

質問文に掲載された3例の中では,   if ( value1 < A ) return true;   if ( !B ) return false;   value1 = values[index];   if (!(value1 == C || value1 == D || value1 == E)) return false;   value1 = values[value2];   if ( value1 != F ) return false;   return true; という,真偽が決定したものから次々と振り分けていくコードが一番わかりやすかったです。 メソッドにするか否かは別の問題で,上記コードを例えばbool satisfied;という論理型変数に対する真偽値設定に置き換えても,判定の読みやすさは変わらないでしょう。

koumei000
質問者

お礼

 回答ありがとうございます。 > 上記コードを例えばbool satisfied;という論理型変数に対する真偽値設定に > 置き換えても,判定の読みやすさは変わらないでしょう。  そんな感じのことをしたかったのですが、最初はgoto使わないと判定なら抜けられないと諦めていたのですが、elseを使えば何とかなりそうですね。  そうすると bool statisfied; if ( value1 < A ) satisfied = true; else {   if ( !B ) satisfied = false;   else   {     value1 = values[index];     if ( value1 != C && !D && !E ) satisfied = false;     else     {       value1 = values[value2];       satisfied = value1 == F;     }   } }  のようになるのですが、if, elseが深くなってしまうのが嫌い(elseで階層にするぐらいならreturnで抜けたい)な性分で、if(else)が3つも階層になっていると、こう、なんと言うか、もやもやすると言うか、うずうずするタイプなんです。  やっぱり何ともならないものなんですかね?

回答No.2

条件文は 命題が真の場合と偽の場合の2つにわけ、そのツリー構造で分けていきます。 そうすれば、抜けるケースがなくなります。   複雑になってもツリー構造がわかれば、絵がかけます。 また、これが大事ですが、抜ける落ちるケースがなくなります。 きれいに求めようとすると、抜ける落ちるケースが、出て、それのバグ取りに時間がかかってしまうことが一番の問題です。

koumei000
質問者

お礼

 回答ありがとうございます。  ツリー構造ですか。最近は意識したことなかったですね。今後気をつけようと思います。

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.1

私ならユニットテストのやりやすさも考えてメソッド化します。

koumei000
質問者

お礼

 回答ありがとうございます。  ユニットテストですか。魅力的ではあるんですけどね。一度はNUnitに手を伸ばそうとしたのですが、 「使い方がイマイチ、アセンブリがどうとか」 →「ユニットテストが無いならstaticチェッカー(Contract)を使えばいいじゃない」 →「Expressには対応しておりません」 →「いいもん。自分で似たのを作るもん!(飽くまでお金払わない)」 →「ソースコードを読むためにkm(yacc)」 →「不可解なところでsyntax error」 →「レキサーは異常なし」 →「パーサを解読してやるぜ!」 →「高級言語とは思えぬ可読性」 →「とりあえず変数だけでも読みやすく」 →「とりあえずshift、reduceらしきものをメソッドに抽出」 →「―――見える!!」 →「ifがウルトラカオス」 →「OKWave行こうぜ!」 →「(今)やっぱり諦めようぜ!」  とりあえず、参考になりました。ありがとうございます。

関連するQ&A

  • 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); } }

  • javaについて質問です

    3つの整数の中央値を求めるメソッドについて質問です。 まずは以下の2つのコードをご覧ください --------------(1)------------------ static int med3(int a,int b,int c){ if(a>=b){ if(b>= c) return b; else if(a<=c) return a; else return c; }else if(a>c) return a; else if(b>c) return c; else return b; } -----------(1)----------- -----------(2)----------- static int med3(int a,int b,int c){ if((b>=a&&c<=a)||(b<=a&&c>=a)) return a; else if((a>b&&c<b)||(a<b&&c>b)) return b; else return c; } -----------(2)----------- 上記の2つのメソッドは参考書の問題に載っているものです。 因みに問題文は、 「中央値を求める手続きは(2)のようにも実現できる。しかしこれは(1)に比べると、実行効率が悪い。その理由を考察せよ」 です。 この問題の解説について質問があります。 解説には、こうあります。 「最初のif文の判定   if ((b >= a && c<= a) || (b <= a && c >= a) に着目します。ここでb >= aおよびb <= aの判定を裏返した判定(実質的に同一の判定)が、続くelse以降で   else if ((a > b && c < b) || (b <= a && c > b) と行われます。つまり、最初のifが成立しなかった場合、2番目のifでも(実質的に)同じ判定を行っているため、効率が悪くなるのです。」 そこで2つ質問があるのですが、まず一つ目から。 「ここでb >= aおよびb <= aの判定を裏返した判定(実質的に同一の判定)が、続くelse以降でelse if ((a > b && c < b) || (b <= a && c > b)と行われます。」の部分の日本語は、一体どういう意味なのでしょうか? b >= a,b <= aの判定を裏返したものはb < a,b > aとなると思うのですが、しかしそれだとその後に続くelse if文の条件、(a > b && c < b) || (b <= a && c > b)と合いません。 2つ目の質問です。 なぜ、ifが成立しなかった場合、何故2番目のifでも同じ判定を行っていると言えるのでしょうか?

    • ベストアンサー
    • Java
  • C言語の配列の使い方について質問です。

    以下のプログラムを配列を使って見やすくしたいのですが、どのように作ったら良いでしょうか? 宜しくお願いします。 #include<stdio.h> int main(void) { int a, b, c, d, e, f, g, h, i, j, k, l, m ,n, o; /*5段目の処理*/ for(a = 1; a <= 15; a++) { for(b = 1; b <= 15; b++) { if(a == b) continue; for(c = 1; c <= 15; c++) { if(a == c || b == c) continue; for(d = 1; d <= 15; d++) { if(a == d || b == d || c == d) continue; for(e = 1; e <= 15; e++) { if(a == e || b == e || c == e || d == e) continue; // printf("%d %d %d %d %d\n", a, b, c, d, e); ////4段目//// if(a>b){ f=a-b; } else if(a<b){ f=b-a; } if(b>c){ g=b-c; } else if(b<c){ g=c-b; } if(c>d){ h=c-d; } else if(c<d){ h=d-c; } if(d>e){ i=d-e; } else if(e<d){ i=e-d; } // printf(" %d %d %d %d \n", f, g, h, i); /////3段目//// if(f>g){ j=f-g; } else if(f<g){ j=g-f; } if(g>h){ k=g-h; } else if(g<h){ k=h-g; } if(h>i){ l=h-i; } else if(h<i){ l=i-h; } // printf(" %d %d %d \n", j, k, l); /////2段目//// if(j>k){ m=j-k; } else if(j<k){ m=k-j; } if(k>l){ n=k-l; } else if(k<l){ n=l-k; } // printf(" %d %d \n", m, n); /////三段目///// if(m>n){ o=m-n; } else if(m<n){ o=n-m; } // printf(" %d \n", o); if(a != b != c != d != e != f != g != h != i != j != k != l != m != n != o){ printf("%d %d %d %d %d\n", a, b, c, d, e); printf(" %d %d %d %d \n", f, g, h, i); printf(" %d %d %d \n", j, k, l); printf(" %d %d \n", m, n); printf(" %d \n", o); } } } } } } }

  • ''C++の条件分岐分からないんですが

    #include<iostream> using namespace std; int main(){ int a; cout << "数値を入力してください\n"; cin >> a; if( a > 30) cout <<"31以上ですね\n"; } else if(a<10){ cout <<"10未満ですね\n"; } else { cout <<"30以下で10以上ですね\n"; } return 0; } これが例文なんですが、 変数aの値がbより小さい場合には、『aはbより小さいです』と表示させ、大きい場合には"a=a+b"を計算させる 文字変数mの中身が'a'ならば、『aが格納されています』と表示させて、'a'でないならば『'a'でない文字が格納されています』と表示させたあと、変数bとcを使った『b=b+c』を計算する。 変数aが、変数bより小さい場合には、『aはbより小さいです』と表示し、変数bより大きい場合には、『aはbより大きいです』と表示し、変数bと等しい場合には、『aとbは等しいです』と表示する #include<iostream> using namespace std; int main(){ int a; if(a < b) { __cout("aはbより小さいです\n"); } else { __c = a + b; }return 0; } #include<iostream> using namespace std; int main(){ int a; if(m == 'a') __cout("aが格納されています\n"); } else { __cout("\'a\'でない文字が格納されています\n"); } return 0; } #include<iostream> using namespace std; int main(){ int a; if(a < b) { __cout("aはbより小さいです\n"); } else if(a == b) { __cout("aとbは等しいです\n"); } else { __cout("aはbより大きいです\n"); } return 0; } これ合ってますか?あとプログラミング環境すらないので実行結果教えてもらっていいですか?

  • 条件の配列

    表題の件に付いて質問させていただきます。 複数の条件分岐を簡便に記述する方法を探しております。 簡単な例でいいますと、 int main(){  int value=3;  if(value==0)std::cout <<"value="<<0 <<std::endl;  if(value==1)std::cout <<"value="<<1 <<std::endl;  if(value==2)std::cout <<"value="<<2 <<std::endl;  if(value==3)std::cout <<"value="<<3 <<std::endl; } 上記プログラムの複数の条件分岐をfor文をもちいてかきかえる場合、conditionクラスを作成して class condtion{ private:  int *a;  int b; public  void SetPointer(int* value){a=value}  void SetVal(int val){b=val}  bool isTrue(){   if(*a==b){return true;}   else{ return faulse;}  } } int main(){  int value=3;  condition c[4]; //クラス  for(int i=0;i<4;i++){   c[i]->SetPointer(&value);   c[i]->SetVal(i);  }  for(int i=0; i<4; i++){   if(c[i].isTrue())std::cout<<"i="<<i<<std::endl;  } } と実装できそうな気がするのですが、(上記プログラムは動作確認しておりません。) 変数が増えたり、条件が複雑になると少々繁雑になってしまいそうな気がしております。 もっと簡便に条件分岐を配列として処理する方法は存在しますか? 関数ポインタなどがつかえるのでしょうか? アドバイスよろしくお願いいたします。

  • 二分法のプログラムについて

    下の用なプログラムを作ったのですがどうしても正しい答えを導くことができません。自分でもいろいろ調べてみましたがわかりません。誰かご教授宜しくお願いします。 #include<stdio.h> #include<stdlib.h> #define MAX 10 int n , count; double c[MAX+1]; double a,b,e; void nyuuryoku(void) { int i; printf("nの入力>"); scanf("%d",&n); if(n>MAX){printf("最大次数を超えている");exit(1);} else if(n<0){printf("nが負");exit(2);} else{for(i=0;i<=n;i++){printf("係数の値>");scanf("%lf",&c[i]);} }} double f(double x) {double y; int i; y = c[0]; for(i=1;i<=n;i++){ y=y*x+c[i];} return y; } void hani(void){ printf("aの値>");scanf("%lf",&a); printf("bの値>");scanf("%lf",&b); printf("eの値>");scanf("%lf",&e); if(e<=0){printf("eが0または負"); exit(3);} if(f(a)==0){printf("%f",f(a)); exit(4);} if(f(b)==0){printf("%f",f(b)); exit(5);} if(f(a)*f(b)>0){printf("初期値異常"); exit(6);}} double nibun(void) {double c; if(b>a){ while(b-a>e){ count++; c=(a+b)/2; if(f(c)==0){ return c;} if(f(a)*f(c)<0){b=c;} if(f(b)*f(c)<0){a=c;} } return a;} if(a>b){ while(a-b>e){ count++; c=(a+b)/2; if(f(c)==0){ return c;} if(f(b)*f(c)<0){a=c;} if(f(a)*f(c)<0){b=c;} } return a;} } void syutsuryoku(double x){ printf("x=%lf\n",x); printf("f(x)=%lf\n",f(x)); printf("繰り返し回数=%d\n",count); } int main(void){ double ans; count=0; nyuuryoku(); hani(); ans = nibun(); syutsuryoku(ans); }

  • 長方形、円、三角形の計算するプログラムでエラーがでます

    タイトルの通りなんですがエラーがでます>< コンパイラはできたのですが、実行して二つ目の入力するとこで、入力したあと止まります。 どこがおかしいのでしょうか? #include <stdio.h> int sikaku(void); int en(void); int main(void) { char ch; int a,b; printf("円(A) 長方形(B) 三角形(C)\n"); printf("入力してください:"); ch = getche(); if(ch == 'C'){ printf("\n底辺を入力してください:"); scanf("%d ",a); printf("高さを入力してください:\n"); scanf("%d",b); printf("%dです",a * b); } else if(ch == 'B') sikaku(); else if(ch == 'A') en(); return 0; } int en(void) { int a; float f; printf("\n半径を入力してください:"); scanf("%d",a); printf("円周率を入力してください:"); scanf("%f",f); printf("%fです",a * a * f); return 0; } int sikaku(void) { int a,b; printf("\n縦を入力してください:"); scanf("%d",a); printf("横を入力してくさい:\n"); scanf("%d",b); printf("dです",a * b); return 0; }

  • 二分法のプログラム

    関数x^3-7x^2-6x+2を二分法で解くプログラムを作ったのですが、エラーが出てコンパイルできません。訂正箇所を教えて下さい。 宜しくお願い致します。 #include<stdio.h> #include<math.h> #define EPSILON 0.1E-5 #define TURE 1 #define FALSE 0 int kansu(int x); void Nibunho(left,right,sol,flag); double left,right; int flag; int main(void) { printf("区間の左端と右端は?\n"); scanf("%lf %lf",&left,&right); flag=FALSE; Nibunho(left,right,&root,&flag); if(flag) printf("解 = %e (繰り返し回数 = %d)\n",root,k); else { printf("入力した範囲で解は求まりませんでした。\n"); printf("f(%e) = %e \n",root,k); } return 0; } int kansu(int x) { int f(double x) f(x)=x*x*x-7.0*x*x-6.0*x+2.0; return(f(x)); } void Nibunho(left,right,sol,flag) { double left,right,*sol; int *flag; double a,b,c,fa,fb,fc; k=0; a=left; b=right; do { k++; c=(a+b)/2.0; fc=f(c); fa=f(a); fb=f(b); if(fabs(fc)<1.0e-10) { a=c; b=c; *flag=TRUE; } else { if( (fa * fc < 0.0) || (fb * fc < 0.0) ) { *flag = TRUE; if( (fa*fc) < 0.0 ) b=c; else a=c; } else { if( fabs(fa) > fabs(fb) ) a=c; else b=c; } } } while((b-a)>EPSILON) *sol=(a+b)/2.0; }

  • C言語 2次方程式の解を求めるプログラム

    ポインタを使った2次方程式の解を求めるプログラムを作りたいのですが、どこが間違っているのか分かりません。 #include<stdio.h> #include<math.h> int quadEq(int a, int b, int c, double *px1, double *px2) int main() { int a,b,c,s; double x1,x2; printf("?"); scanf("%lf",&a); printf("?"); scanf("%lf",&b); printf("?"); scanf("%lf",&c); if((s=quedEq(a,b,c, &x1, &x2))==2){ printf("%f %f", x1,x2); // 解が二つ } else if(s==1){ printf("%f", x1);// 重解 } else { printf("No real solution");// 虚数解 } } int quadEq(int a, int b, int c, double *px1, double *px2) { int d = b*b-4*a*c; if(d>0){ *px1 = (-b+sqrt(d))/(2*a); *px2 = (-b-sqrt(d))/(2*a); return 2; } else if(d==0) { *px1=-b/2*a; *px2=-b/2*a; return 1; } else { return 0; } } エラーは mondai.c: 関数 ‘quadEq’ 内: mondai.c:5:1: エラー: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before {’ token { ^ mondai.c:26:1: エラー: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token { ^ mondai.c:39:1: エラー: expected ‘{’ at end of input } ^ となりました。括弧の位置の間違いや入れ忘れはないと思うのですが、何か根本的なミスがあるのでしょうか。添削お願いします。

  • 1と0の文字列作成

    1の後には0.9の確率で1、0.1の確率で0 0の後には0.9の確率で0、0.1の確率で1 という条件で、1と0の文字列作成しようと下のプログラムを作ってみました。 しかし実行してみるとなぜか1の後には0がきてしまうことが多く、条件のようになりません。 どこがおかしいのででしょうか? public class Sample{ public static void main(String[]args){ int a[]=new int[50]; Kansuu1 b = new Kansuu1(); Kansuu2 e = new Kansuu2(); a[0] = 0; for(int i=0; i<50; i++){ if(i==0){ System.out.print(0); }else{ int c = 0; if(a[i-1]==0){ c = b.kan1(a[i]); }else { c = e.kan2(a[i]); }System.out.print(c); } } } } class Kansuu1{ int kan1(int a){ if(Math.random()>0.9){ return 1; }else { return 0; } } } class Kansuu2{ int kan2(int a){ if(Math.random()>0.9){ return 0; }else { return 1; } } }

    • ベストアンサー
    • Java

専門家に質問してみよう