みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

下の用なプログラムを作ったのですがどうしても正しい答えを導くことができません。自分でもいろいろ調べてみましたがわかりません。誰かご教授宜しくお願いします。

#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);

}

投稿日時 - 2009-07-17 21:42:33

QNo.5133797

困ってます

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

コードを見た限りでは問題なさそうです。
あとは、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]
と定義しているようですが、この部分に勘違いはないですか?

投稿日時 - 2009-07-18 01:02:10

お礼

解答していただきありがとうございます。定義は間違ってないと思うのですが自分の作成したプログラムのどこが違っているかもう一度しっかり確認して正しいプログラムができるようがんばります。わかりにくい質問の仕方をしてすいませんでした。

投稿日時 - 2009-07-19 02:36:48

ANo.2

うん、やっぱり予想通りかも。

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();以降は永久に実行されない、って事でしょうね。

投稿日時 - 2009-07-18 00:15:46

お礼

アドバイスありがとうございます。
してきしていただいた部分を見直して正しく動くようにがんばってみます

投稿日時 - 2009-07-19 02:25:40

ANo.1

どう言う結果が出るべきなのか、しかしどう言う結果になってしまうのか、と言う説明が無いと答え辛いんですけどね。

「こう動くべき」

と言うのは貴方の頭の中にある事なんで、他の人には分からないんですよ。
それがたとえ「二分法」と言う一般的なアルゴリズムに付いて、でもです。

まあ、でもこっちで確かめてみた限り、恐らくhani関数の設定がおかしいような気がしますね。何故なら、haniを「無事クリアした時の」条件が無いような気がします。そのまま異常終了で終わってるから、じゃないんですか?

投稿日時 - 2009-07-18 00:08:08

お礼

わかりにくい質問をしてしまいすいませんでした><
しっかりした文章を書いて質問しないと相手にも伝わらず結果的に、自分も問題の改善につながりませんね。
それでも解答していただきありがとうございました。
もう一度プログラミングを一から確認していきたいと思います。

投稿日時 - 2009-07-19 02:23:41

あなたにオススメの質問