• 締切済み

二分法のプログラム

関数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; }

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★アドバイス  main() 関数の上にある >double left, right; >int flag;  ↑  この2行はグローバル変数ではなく main() 関数のローカル変数として宣言すれば良いんじゃないの?  っと思った。それから >int kansu(int x); >void Nibunho(left,right,sol,flag);  ↑  プロトタイプ宣言するなら引数名よりも『型』を記述して下さい。  その他、Nibunho() 関数の定義部分にも仮引数の型がありません。  記述して下さい。記述するとき Nibunho() 関数の最初にある >double left,right,*sol; >int *flag;  ↑  この2行の宣言は Nibunho() 関数の仮引数の型ですよね。  それなら   ↓  void Nibunho( double left, double right, double *sol, int *flag )  {   double a, b, c, fa, fb, fc;   k = 0;   a = left;   b = right;      do {    :    省略    :   } while( (b-a) > EPSILON ); ←セミコロンを追加。      *sol = (a+b) / 2.0;  }  こんな感じで修正してみて下さい。 ・他の修正部分はご自分でチェックして下さい。 ・以上。

G-Falcon07
質問者

お礼

丁寧に回答していただき、ありがとうございました。 解決することができました。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

>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)); >} この辺に顕著に出ていますが、C 言語の文法がまったく習得できていないようです。 まずは、超初心者向けの C の参考書(なるべくペラペラのやつ)を最初から読んで、そこに書かれているサンプルプログラムを手打ち(これ重要)して、コンパイルして、動作を確認して下さい。

G-Falcon07
質問者

補足

ご指摘ありがとうございます。 コンパイルエラーに気を取られていたため、こんな所まで間違っていたことに気が付きませんでした。ご指摘いただいた所は訂正しました。 まだ訂正する所があると思いますので、宜しくお願いします。

noname#43437
noname#43437
回答No.1

エラーの内容をちゃんと読みましょう! そんなに難解なエラーは出てません。 変数がいくつか定義されていなかったり、 定義の仕方がおかしかったり、 グローバル変数と同じ変数名でローカル変数を定義しようとしていたり、 しているだけです。

G-Falcon07
質問者

補足

エラーの内容も見たのですが、訂正するほど多くのエラーが 出てしまいます。プログラミングも8ヶ月ほど勉強しただけ なのでエラーの内容を見ただけでは訂正する内容まで まだ理解できません。 それとグローバル変数とローカル変数とは何ですか?

関連するQ&A

  • c言語について

    このプログラムであと2行削れるとこがあるそうです。 どこがけずれますか? #include <stdio.h> #include <math.h> #define f(x) ((x)+(log(x))) #define EPS 1e-8 main( ) { double a, b, c, fa, fb, fc; int i=1; printf("input a and b: "); /*区間[a,b]の入力, a<b とする*/ scanf("%lf%lf", &a, &b); fa = f(a); fb = f(b); do { c = (a+b) / 2; /*cの値の更新*/ fc = f(c); printf(" %2d : a = %f, b = %f, c = %f, fc = %f\n", i, a, b, c, fc); if (fb*fc < 0){ a = c; fa = fc; } if (fa*fc < 0) { b = c; fb = fc; } if(fabs(fc) < EPS ) break; }while(++i<100); /*iが100以上になったら繰り返し終了*/ }

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

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

  • javaのプログラムで・・・

    以下に示すプログラムの出力結果がなぜこうなるのか教えてください。メソッドaction1()あたりからどういう風に処理されているのか分かりません・・・。 class AA{ int fa,fb; AA(int a,int b){ fa=a; fb=b; } void action1(){ fa++; int fb=fa; } void action2(int fa){ fa=fa*100; } } class workg2{ public static void main(String[] args){ AA a1=new AA(10,200); System.out.println(a1.fa+","+a1.fb); a1.action1(); System.out.println(a1.fa+","+a1.fb); a1.action2(a1.fb); System.out.println(a1.fa+","+a1.fb); } } 出力結果: 10,200 11,200 11,200

    • ベストアンサー
    • Java
  • 二分法のC++プログラム

    #include<iostream> #include<cmath> using namespace std; int main(){ double x1, x2, c; cout <<"x1:"; cin >> x1; cout <<"x2:"; cin >> x2; while(fabs(x2-x1) > 0.00001){ c=(x1+x2)/2; if(cos(x1/2.0)*cos(c/2)>=0) x1 = c; else x2 = c; } cout << "x=" << x1 <<endl; return 0; } cos(x/2)=0の解となるxを挟んでいないx1,x2を与えると、結果は保証できないですが、それは別にいいんですか?それはダメだとするとどこを訂正すればいいんですか

  • C言語プログラム(二分法)について質問です。

    C言語プログラム(二分法)について質問です。 以下作成したプログラムでは、aを入力すると, x=b - (log(a)) - (a+x)/2の解が求まります。(今回式は適当ですが。) 二分法で解を求めるというプログラムは作成できたのですが、 このプログラムで、aを1~10まで変化させたときのxの値というようなループをプログラムでしたうえで、 a*xの値がもっとも大い点を求めるためにはどのようなプログラムを組めば(これを改良すれば)いいのでしょうか? 具体的に行いたいことは、この二分法のプログラムをaとxの関数とし、a*xの最大点を求めたいのです。 質問が分かりにくいかもしれませんが、お願いします。 以下作成したプログラムです。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define eps 1.0e-6 double b=0.3; double a=0; double f(double x); void nibun(void); int main() { nibun(); return 0; } void nibun(void) { int count; double x0,x1,m; printf("aの値\n"); scanf("%lf",&a); count=0; x0=-2*b; x1=b; do { count++; m=(x0+x1)/2.0; if(f(m)*f(x0)<0) x1=m; else x0=m; if(count==700) { printf("Error\n"); exit(1); } } while (!(fabs(x0-x1)<eps)); printf("解の値は %f\n",m); } double f(double x) { return(b - (log(a)) - (a+x)/2); }

  • 二分探索木のプログラム

    2分探索木のプログラムを作っているのですが、実行するとセグメテーション違反がでます。何が間違っているんでしょうか? #include<stdlib.h> struct node{ struct node *left,*right; int datum; }; struct bintree{ struct node *root; }; /*空木を作成*/ void InitTree(struct bintree *p) { p->root=NULL; } /*木全体を削除*/ void ClearTree(struct bintree *p) { struct bintree *q,*r; if(p->root!=NULL){ q->root=p->root->left; ClearTree(q); r->root=p->root->right; ClearTree(r); free(p->root); } } /*第二引数で指定された値が木の節点のラベルに存在すれば、その節点へのポインタを返す。なければ、NULLを返す。*/ struct node * SearchNode(struct bintree *p,int x) { struct bintree *q,*r; struct node *a=p->root; int cond=x-(a->datum); if(a==NULL) return NULL; else if(cond==0) return a; else if(cond<0){ q->root=p->root->left; SearchNode(q,x); } else{ r->root=p->root->right; SearchNode(r,x); } } /*第二引数で指定された値が木の節点のラベルに存在すれば、NULLを返す。なければ、追加して、新たに作成された節点へのポインタを返す。*/ struct node * InsertNode(struct bintree *p,int x) { struct bintree *q,*r; struct node *a=p->root; int cond=x-(a->datum); if(a==NULL){ a=(struct node *)malloc(sizeof(struct node)); a->datum=x; a->left=a->right=NULL; return a; } else if(cond==0) return NULL; else if(cond<0){ q->root=p->root->left; a->left=InsertNode(q,x); } else{ r->root=p->root->right; a->right=InsertNode(r,x); } } int main() { struct bintree *p; struct node *a; InitTree(p); a=InsertNode(p,5); InsertNode(p,3); InsertNode(p,0); InsertNode(p,10); SearchNode(p,5); ClearTree(p); return 0; }

  • 2分法で方程式の複数の解を自動的に求めるには?

    2分法を授業で習い、アルゴリズムは理解できました。 そして、2分法で方程式の解を求めるプログラムも完成したのですが、 3次方程式などの全ての解を2分法で求める場合、本来ならば、 グラフなどを描き、適切な初期値を自分で変更していく必要があると思います。 しかし、方程式の複数の解を自動的に求めたいのです。 もし、2分法で方程式の複数の解を自動的に求めるアルゴリズムがあれば教えていただけないでしょうか。 よろしくお願いします。 ※ 私が作成したプログラム(C言語)も載せておきます。 #include <stdio.h> #include <math.h> double f(double x) { return ((x-1.0)*(x-2.0)*(x-3.0)); } int main () { int i; double a,b,x; double gosa = 1.0e-14; printf("aの値を入力してください。\n"); scanf("%lf",&a); printf("bの値を入力してください。\n"); scanf("%lf",&b); if(f(a)*f(b) >0) printf("aとbの範囲の中に適切な解が存在しません。\n"); while(1){ x = (a+b)/2.0; printf("%.14f\n",x); if(fabs(b-a)<gosa) break; if(f(a)*f(x)<=0){ b = x; } else{ a = x; } } return(0); }

  • プログラム

    アドバイスをもとにいろんなサイトを見てみたんですが、なんとなくはわかるんですがこれから先どうしたら良いかわかりません。a,bを入力する画面まではいくんですが、それから先の結果がでないんです。何がいけないんですか? #include <stdio.h> double func(double x){ double y; y=x*x*x-3*x*x+9*x-8; return(y); } int main(){ double EPS=0.00005; double a, b, c; char t; int i=0; do{ printf(" a = "); scanf("%lf%c", &a, &t); printf(" b = "); scanf("%lf%c", &b, &t); if(func(a)*func(b) >= 0){ printf(" f(a)*f(b)>0\n\n"); } }while(func(a)*func(b) >= 0); if(b-a<0){ c=a; a=b; b=c; } while(b-a>EPS){ c=a-((b-a)/(func(b)-func(b)))*func(a); if(func(c)*func(a)<0){ b=c; }else{ a=c; } i++; printf(" %d\t%20.15f\n",i,c); }

  • 関数のプログラムについて

    任意の二次方程式ax^2+bx+c=0をとくプログラムの作成です 引数をa,b,cとして、解の大きい方を返すというものなのですが、 僕は以下のようにして組んだのですが、うまくいきません。 と、いうより、関数の作り方がいまいちわからないです。 どこが駄目なのか教えてください。 作ってみたやつ↓ #include<math.h> #include<stdio.h> int a,b,c; double d; double x,y,z; int main(void) { a=1; b=2; c=1; printf("ax^2+bx+c=0\n "); d=b^2-4*a*c; if (d<0){printf("kyosuukai\n)} else if(d>=0) { x=(b+sqrt(b^2-4*a*c))/2*a; y=(b-sqrt(b^2-4*a*c))/2*a; if(x>=y){z=x} else if(x<y){z=y} printf("x= %f\n",z); } }

  • プログラム エラー BCC Developer

     BCC DeveloperでC言語のプログラミングの勉強をしようとしているのですが、エラーの原因が分かりません  初心者で、この文に関しても本の丸写しなのですが(”河西メソッド C言語プログラミング学習の方程式”という本です)  エラー内容は Error 3-10.rc 4 10: Expecting filename or BEGIN ** error 20018 ** deleting Debug\\3-10.res Make End !! (Elapsed time 0:00.120) というものです 本文は /* 3-10 */ #include<math.h> float EPS=1e-8 float s,d,e,x=60*3.14159/180; int k, flag=0; s=1.0;e=1.0; for(k=1;k<=200;k=k+2){ d=s; e=-e*x*x/(k=k+2){ s=s+e; if(fabs(s-d)<=EPS*fabs(d)){ flag=1; break; } } if(flag==1) printf(\"%f\\n\",s); else printf(\"収束しない\\n\"); } です cos(X)のテーラー展開に関するものです この原因をご指摘いただければ幸いです

専門家に質問してみよう