- 締切済み
二分法のプログラムについて
下の用なプログラムを作ったのですがどうしても正しい答えを導くことができません。自分でもいろいろ調べてみましたがわかりません。誰かご教授宜しくお願いします。 #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); }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- nag0720
- ベストアンサー率58% (1093/1860)
コードを見た限りでは問題なさそうです。 あとは、f(a)*f(b)<0となるような値をきちんと入力しているかどうかでしょうね。 f(a)*f(b)<0となっていればhani関数は正常終了するので、nibun関数は実行されます。 正しい答にならない場合の具体的な入力値と出力値を示してくれませんか。 f(x)=c[0]*x^n+c[1]*x^(n-1)+・・・・+c[n-1]*x+c[n] と定義しているようですが、この部分に勘違いはないですか?
- cametan_42
- ベストアンサー率62% (162/261)
うん、やっぱり予想通りかも。 gdbと言うデバッガで走らせてみた結果がこれです。 ============================================================= Current directory is /home/cametan/ GNU gdb 6.8-debian Copyright (C) 2008 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i486-linux-gnu"... (gdb) run Starting program: /home/cametan/5133797.o nの入力>2 係数の値>1 係数の値>-2 係数の値>1 aの値>0 bの値>2 eの値>0.0001 初期値異常 Program exited with code 06. (gdb) ============================================================= だから正しく入力していっても、「必ず」exit 6 で終わっちゃうんですよ。0以外が異常終了な以上、main関数内のans = nibun();以降は永久に実行されない、って事でしょうね。
お礼
アドバイスありがとうございます。 してきしていただいた部分を見直して正しく動くようにがんばってみます
- cametan_42
- ベストアンサー率62% (162/261)
どう言う結果が出るべきなのか、しかしどう言う結果になってしまうのか、と言う説明が無いと答え辛いんですけどね。 「こう動くべき」 と言うのは貴方の頭の中にある事なんで、他の人には分からないんですよ。 それがたとえ「二分法」と言う一般的なアルゴリズムに付いて、でもです。 まあ、でもこっちで確かめてみた限り、恐らくhani関数の設定がおかしいような気がしますね。何故なら、haniを「無事クリアした時の」条件が無いような気がします。そのまま異常終了で終わってるから、じゃないんですか?
お礼
わかりにくい質問をしてしまいすいませんでした>< しっかりした文章を書いて質問しないと相手にも伝わらず結果的に、自分も問題の改善につながりませんね。 それでも解答していただきありがとうございました。 もう一度プログラミングを一から確認していきたいと思います。
お礼
解答していただきありがとうございます。定義は間違ってないと思うのですが自分の作成したプログラムのどこが違っているかもう一度しっかり確認して正しいプログラムができるようがんばります。わかりにくい質問の仕方をしてすいませんでした。