• 締切済み

プログラミングで・・・

以下のプログラムにおいて,N回 s=--- s=---  ・  ・  ・ と表示させるにはどうしたらよいでしょか. ----------------------------------------- /*台形公式*/ #include<stdio.h> #include<math.h> double f(double x); int main(void){ /*Define variablest*/ int i,N; double a,b; double dx,xi,s,err; /*Function*/ printf("f=sin(x)+1/2cos10x\n"); /*Integral Field*/ a=0; b=M_PI; printf("a=0\n"); printf("b=pai\n"); /*Inputs data*/ printf("N="); scanf("%d",&N); /*width of integral's range*/ dx=(b-a)/(double)N; s=f(a)*0.5; /*for Loop*/ s=0; for(i=1;i<=N; i++){ xi=a+dx*(double)i; s=s+f(xi); } s=s+f(b)*0.5; s=s*dx; printf("s=%6.3e err=%6.3e\n",s,err); return 0; } double f(double x){ return sin(x)+1/2*cos(10*x); }

  • xmasu
  • お礼率10% (1/10)

みんなの回答

回答No.4

おっと失敬。 forで包む部分間違えてました(苦笑)。 こうでしょうね。 /*台形公式*/ #include <stdio.h> #include <math.h> double f(double x); int main(void){ /*Define variablest*/ int i, j, N; /* 変数jを増やす */ double a, b; double dx, xi, s, err; /*Function*/ printf("f = sin(x) + 1/2cos10x\n"); /*Integral Field*/ a = 0; b = M_PI; printf("a = 0\n"); printf("b = pi\n"); /*Inputs data*/ printf("N = "); scanf("%d", &N); for (j = 1; j <= N; j++) { /* 外部にfor文を置く */ /*width of integral's range*/ dx = (b - a) / (double)j; /* jで割る */ s = f(a) * 0.5; /*for Loop*/ s = 0; for (i = 1; i <= j; i++){ /* ここの上限値をjに委ねる */ xi = a + dx * (double)i; s = s + f (xi); } s = s + f(b) * 0.5; s = s * dx; printf("N = %d のときの s = %6.3e err = %6.3e\n", j, s, err); /* ちょっと修正 */ } return 0; } double f(double x){ return sin(x) + 1/2 * cos(10 * x); } /* ここまで */ これでいいんじゃないかな?多分(笑)。

回答No.3

>以下に,補足させていただきました. うん、多分そうじゃないか、とは思ってたんですが……。 まあ、こう言う場合、「要求仕様以上は書かない」ってのがある種ルールなんで(笑)。「求められているもの」がどのくらいなのか、普通は分かんない、んですよ。よって先走ってもしゃーない。 >for文の中に入れるだけでは,望む答えが出てこない こう言う場合は、台形公式のロジックそのものをfor文で包んじゃう、ってのがテでしょうね。 以下のようにしてみました。 /*台形公式*/ #include <stdio.h> #include <math.h> double f(double x); int main(void){ /*Define variablest*/ int i, j, N; /* 変数jを増やす */ double a, b; double dx, xi, s, err; /*Function*/ printf("f = sin(x) + 1/2cos10x\n"); /*Integral Field*/ a = 0; b = M_PI; printf("a = 0\n"); printf("b = pi\n"); /*Inputs data*/ printf("N = "); scanf("%d", &N); /*width of integral's range*/ dx = (b - a) / (double)N; s = f(a) * 0.5; /*for Loop*/ for (j = 1; j <= N; j++) { /* 外部にfor文を置く */ s = 0; for (i = 1; i <= j; i++){ /* ここの上限値をjに委ねる */ xi = a + dx * (double)i; s = s + f (xi); } s = s + f(b) * 0.5; s = s * dx; printf("N = %d のときの s = %6.3e err = %6.3e\n", j, s, err); /* ちょっと修正 */ } return 0; } double f(double x){ return sin(x) + 1/2 * cos(10 * x); } /* ここまで */ ちょっとした改造ですけど、多分これが貴方の要求したものじゃないんですか? 計算結果は確かめてませんが、まあ、これで何か問題を発見したらまた投稿してみて下さい。 ちなみに、今のままの状態では、変数errが意味を成していません。多分、これも「解析的積分結果」と「数値積分の結果」との差を出したいんじゃないか、とは思ってるんですが、それは今のとこ、コードには反映されていませんね。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

for文によるループの中で、printfを使うだけです。

回答No.1

ちょっと明瞭じゃないかも。 >N回表示させる とは言っても「同じ出力を」N回表示させたいわけじゃないですよね? もし、単に「N回表示させる」んだったら、単に最後の出力をfor文ででも囲めば良いだけ、です。このように。 for (i = 1; i <= N; i++) { printf("s = %6.3e err = %6.3e\n", s, err); } でも、これじゃあ、貴方の望む結果じゃないんじゃないんですか? もうちょっと補足が必要ですね。

xmasu
質問者

補足

まず,ご回答ありがとうございます. 質問が不明瞭だったことをご指摘ありがとうございます. 以下に,補足させていただきました. もしお時間ありましたら,ご回答お願いします. ---------------------- N=1のときのs=・・・ N=2のときのs=・・・ と表示させたいのですが, s=s+f(b)*0.5; s=s*dx; printf("s=%6.3e err=%6.3e\n",s,err); を,for文の中に入れるだけでは,望む答えが出てこないので手詰まりになってしまったという状況です.

関連するQ&A

  • 定積分のプログラミングについて

    刻み幅dxを入力し、f(x)=4/(1+x^2)を0~1まで定積分するというプログラムを作ったんですが、なぜか、刻み幅を入力してENTERを押すと、 ずら~~~~~っと無限に結果の文字列が出てきてしまいます。 書いたプログラムを載せるので、間違っている箇所を教えてもらえませんか。お願いします。 #include <stdio.h> #include <math.h> double f(double m); main(){ double x,F,dx; printf("Numerical integration of y=4/(1+x^2).\n"); /*刻み幅の入力*/ scanf("%lf,&dx:"); /*aとbと刻み幅*/ printf("The lowwer bound:0.0\n"); printf("The upper bound:1.0\n"); printf("The meth width:dx\n"); /*関数*/ for(x=0.0;x<1.0;x+=dx) { F=f(x); /*計算結果を出力*/ printf(" f(%lf)= 4/(1+x^2) =%lf\n",x,F); } } double f(double m) { double y; y=4/(1+m*m); return y; }

  • C言語でプログラミングしました。違うとこを指摘してくれませんか?

    ∫(e^(-n)^x)cosx*cosxdx n=19/20 積分範囲は0~10です #include <stdio.h> #include<math.h> int main(void) { double left,right,n,s; left=0,right=10.0; double integral(double,double,double); s=integral(left,right,n); printf(“%14.10f\n”,s); } double formula (double x) { int a,b,c,d; a=(-19/20)^x; b=e^a; c=cosx*cosx; d=b*c; return d=b*c; } double integral(double l,double r,double n) { double x,s2,s4,h; n=352; double formula(double); h=(r-1)/h: s2=0.0; s4=formula(1+h); for(x=1+2.0*h;x<=r-h+0.000001;x+=2.0*h); { s2+=formula(x); s4+=formula(x+h); } return(h*(formula(l)+formula(r)+4.0*s4+2.0:s2)/3.0); }

  • 2次方程式の解 Cプログラミング

    C言語でのプログラムの添削をお願いします。 2次方程式の解を求めるものなのですが。 #include<stdio.h> #include<math.h> main(){ double a,b,c,d; double x1=0; double x2=0; scanf("%lf %lf %lf" ,&a,&b,&c); printf("a=%f b=%f c=%f\n" ,a,b,c); d=b*b-4*a*c; if(d>0){ x1=(-b+sqrt(d))/2*a; x2=(-b-sqrt(d))/2*a; printf("x=%f,%f\n" ,x1,x2); }else if(d<0){ x1=-b/2*a; x2=sqrt(-d)/2*a; printf("x=%f+%fi,%f-%fi\n" ,x1,x2,x1,x2); }else{ printf("x=%f\n" ,x1); } return 0; } このとき、 a=-7,b=2,c=-1 を与えると x=7.000000+-17.146428i,7.000000--17.146428i という値が返ってきます。 他にも、虚数解のときに間違った値が返ってきてしまう気がするのですが、いかがでしょうか? 実数解のときは正しいようです。 回答よろしくお願いします。

  • C言語の質問です

    ニュートン法のプログラムを組んだのですがPAD図が描けなくて困ってます どなたか回答お願いします /* newton.c: ニュートン法 */ #include <stdio.h> // printf, fprintf, fgets, sscanf #include <math.h> // fabs double a;    //グローバル変数 double f(double x)  //fは関数f(x) { return x * x - a; //f(x)=x~2-a } double df(double x)  //dfはf(x)の導関数f’(x) { return 2 * x; //df(x)/dx = 2x } double newton(double x, double (*f)(double), double (*df)(double), double eps) { int n = 0;     //初期化 double x0, err;    //x0は初期値 printf("# n, x, err\n"); printf("%4d, % .15e\n", n, x); do { n++; x0 = x; x = x0 - f(x0) / df(x0); //切片でy=0、x=x1 err = fabs(x-x0); printf("%4d, % .8e, % .15e\n", n, x, err); } while (err >= eps); return x; } /*メインルーチン*/ int main(void) { double x, eps = 1.0e-10; //収束条件 char s[128]; fprintf(stderr, " a = "); fgets(s, 128, stdin); sscanf(s, "%lf", &a); while (a <= 0.0) { fprintf(stderr, "'a' には正の数を入れてください。\n"); fprintf(stderr, " a = "); fgets(s, 128, stdin); sscanf(s, "%lf", &a); } x = (a + 1.0) / 2.0; x = newton(x, f, df, eps);   //ニュートン法の実装 printf("\n# √(%e) = % .15e\n", a, x); return 0; }

  • プログラミング 関数について教えて下さい。

    プログラミングについての質問です。 関数を使った以下のプログラムを作成し、実行してみたのですが、上手くいきません。 どこかおかしいのでしょうか? 教えていただけると幸いです。ご回答お待ちしております。 #include <stdio.h> double add (double x,double y); int main(void) { double a,b,c; printf("double型の数を入力して下さい。\n"); scanf("%f\n",&a); printf("もうひとつdouble型の数を入力してください\n"); scanf("%f\n",&b); c=add(a,b); printf("入力された2数の和は%fです。\n",c); return 0; } double add(double x,double y) { double z; z=x+y; return z; }

  • C言語 ニュートン法

    何をすればいいかよくわからなくて躓きました わかる方どうかお願いします 問 以下に示すプログラムで、x1 = x0 - f (x0) / f '(x0)を用いて、方程式の左辺関数 f (x) (= x 2 - a ) およびその導関数 f '(x) を独立させろ。 入力変数 a はグローバル変数としてよい。 導関数 f '(x)はプログラム内ではdfと表記することとする。 また、適切なコメントも追加すること。 /* newton.c: ニュートン法 */ #include <stdio.h> // printf, fprintf, fgets, sscanf #include <math.h> // fabs double newton(double x, double (*f)(double), double (*df)(double), double eps) {   int n;   double a = 0, x, x0, err, eps = 1.0e-10;   printf("# n, x, err\n");   printf("%4d, % .15e\n", n, x);   do {     n++;     x0 = x;     x = (x0 + a/x0) / 2;     err = fabs(x-x0);     printf("%4d, % .8e, % .8e\n", n, x, err);   } while (err > eps);     return x; } int main(void) {    double a = 0, x, x0, err, eps = 1.0e-10;    char s[128];   fprintf(stderr, " a = "); fgets(s, 128, stdin); sscanf(s, "%lf", &a);   while (a <= 0.0) {    fprintf(stderr, "'a' には正の数を入れてください。\n");   fprintf(stderr, " a = "); fgets(s, 128, stdin); sscanf(s, "%lf", &a);   }   x = (a + 1.0) / 2.0;   printf("\n# sqrt(%e) = % .15e\n", a, x);    return 0; }

  • γ関数のプログラム(初心者です)

    以下のようにγ関数のプログラムを組みました。 とりあえず整数値を入力すれば、正しい値は返しているということがprintfの4で確認できました。 もとはfortranで組んだプログラムをCに置き換えました。 ですが、実際走らせてみると、4で値は確認できますがsegmentation faultが出てしまいます。 ですからサブルーチンファイル(ユーザー関数?)として利用できません。 何がいけないのでしょうか? 正しくyが帰ってくるようにどうなおしたらよいのか教えてください。 #include <stdio.h> #include <math.h> double gamma(double x) { double c[8],y,a,r,b,s; int i; a=1.; r=1.; c[1]=5.771916e-01; c[2]=9.882058e-01; c[3]=8.970569e-01; c[4]=9.182068e-01; c[5]=7.567040e-01; c[6]=4.821993e-01; c[7]=1.935278e-01; c[8]=3.586834e-02; printf("0 %f\n",x); while(1){ if(x>2.){ x=x-1.; a=a*x; printf("1 %f %f\n",x,a); } else if(x<1.){ a=a/x; x=x+1.; printf("2 %f %f\n",x,a); } else{ break; } } x=x-1.; for(i=1;i<8;i++){ b=(double)(i); s=(c[i]*((double)(pow(-1,b))) *((double)(pow(x,b)))); printf("3 %d %f\n",i,c[i]); r=r+s; } y=a*(r+(0.03586834*((double)(pow(-1,8)))*((double)(pow(x,8))))); printf("4 %f\n",y); return y; } main() { double x,y; printf("数字を入力してください。"); scanf("%lf",&x); printf("メインプログラム %lf\n",x); y=gamma(x); printf("%f\n",y); }

  • 値の渡し方?(初心者)

    以前質問したプログラムについて、新たに質問です。 メインプログラムと、関数プログラムを組みました。 関数の中では、print文を使うと計算は正しく行われていて、結果が正しいことが分かりました。 でうが、メイン文の出力では、どこにも出てこない変な値が出てきてしまいます。 値の渡し方がおかしいのでしょうか? 誰か、アドバイスをお願いします。 ***以下プログラムです。*** #include <stdio.h> #include <math.h> double gamma(double x) { double c[9],y,a,r,b,s,z; int i; a=1.; r=1.; c[1]=5.771916e-01; c[2]=9.882058e-01; c[3]=8.970569e-01; c[4]=9.182068e-01; c[5]=7.567040e-01; c[6]=4.821993e-01; c[7]=1.935278e-01; c[8]=3.586834e-02; printf("0 %f\n",x); while(1){ if(x>2.){ x=x-1.; a=a*x; printf("1 %f %f\n",x,a); } else if(x<1.){ a=a/x; x=x+1.; printf("2 %f %f\n",x,a); } else{ break; } } x=x-1.; for(i=1;i<9;i++){ b=(double)(i); s=(c[i]*((double)(pow(-1.,b)))*((double)(pow(x,b)))); printf("3 %d %f\n",i,c[i]); r=r+s; } y=a*r; printf("4 %lf\n",y); return y; } main() { double x,y; printf("数字を入力してください。"); scanf("%lf",&x); printf("メインプログラム x= %lf \n",x); y=gamma(x); printf("x= %f y= %f\n",x,y); }

  • シンプソン則について

    大学の課題で ∫0~5 e^(-3t) * cos^2 *(2t) をシンプソン則を用いて求めるプログラムを作成せよ。積分の刻みは0.01毎  という課題がでました。 私は授業で作ったプログラムを元に、以下のプログラムを作ったのですが、答えが大きすぎて(5より大きいと間違いと言っていました)受け取ってもらえません。どこがいけないのでしょうか? あと、nには どのような数字をいれればよいのでしょうか?nは使わないのでしょうか。 お願いします。 #include "stdio.h" #include "math.h" void main() { int n; double i, a, b, h, S, S1, S2, S3; double f (double); a = 0.; b = 5.; printf ("N="); scanf ("%d", &n); h = (b - a) / (double)n; S1 = 0.; S2 = 0.; S3 = f (a) + f (b); /* 両端の値*/ /* 奇数番目の値*/ for (i = 0.01; i < 5; i = i + 0.02) { S1 = S1 + 4. * (f (a + (double)i * h)); } /* 偶数番目の値*/ for (i = 0.0; i < 5; i = i + 0.02) { S2 = S2 + 2. * (f (a + (double)i * h)); } S = (h / 3.) * (S1 + S2 + S3); printf ("%d %lf\n", n, S); } double f (double t) { double y; y = (exp(-3. * t) / 2.) + ((exp(-3.* t) * cos(4. * t)) / 2.); return y; }

  • C言語 二分法

    初投稿です。 お恥ずかしながらパソコンが苦手で、Cゲッが難しくてできません。 今回二分法です。 途中まではやったのですができません。 演習 0~1の乱数を12個発生させ,これらの平均をxi,yi とする。(s,tは乱数) xi=1/12(x1i+x2i+....x12i) yi=1/12(y1i+y2i+....y12i) このようなを1000個作り,(xi,yi)で散布図 を作りなさい。またx,yのそれぞれの平均を求 めよ。 この演習で #include<stdio.h> #include<stdlib.h> #include<math.h> #define eps 1.0e-5 float f(double x); void nibuin(void); int main () { int count; double a,b,m; count=0; printf("範囲の左の値を入力してください。\n"); scanf("%lf",&a); printf("範囲の右の値を入力してください。\n"); scanf("%lf",&a); if(count==1000){ printf("収束しませんでした。\n"); exit(1); } } while(!(fabs(a-b)<eps)); printf("解の値は%f\n収束するのに%d回かかりました。"m,count); } float f(double x) { reurn x*sin(x)+log(x); } まではできたのですが、 scanf("%lf",&a);とif(count==1000){の間に入る命令が打てません。 よろしくお願いします。