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

締切り済みの質問

プログラミングで・・・

以下のプログラムにおいて,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);
}

投稿日時 - 2009-04-29 17:56:20

QNo.4918544

すぐに回答ほしいです

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

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

回答(4)

ANo.4

おっと失敬。
forで包む部分間違えてました(苦笑)。
こうでしょうね。

/*台形公式*/

#include <stdio.h>
#include <math.h>

doublef(double x);

int main(void){

/*Define variablest*/
inti, j, N;/* 変数jを増やす */
doublea, b;
doubledx, 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);
}

/* ここまで */

これでいいんじゃないかな?多分(笑)。

投稿日時 - 2009-04-29 21:03:27

ANo.3

>以下に,補足させていただきました.

うん、多分そうじゃないか、とは思ってたんですが……。
まあ、こう言う場合、「要求仕様以上は書かない」ってのがある種ルールなんで(笑)。「求められているもの」がどのくらいなのか、普通は分かんない、んですよ。よって先走ってもしゃーない。

>for文の中に入れるだけでは,望む答えが出てこない

こう言う場合は、台形公式のロジックそのものをfor文で包んじゃう、ってのがテでしょうね。
以下のようにしてみました。

/*台形公式*/

#include <stdio.h>
#include <math.h>

doublef(double x);

int main(void){

/*Define variablest*/
inti, j, N;/* 変数jを増やす */
doublea, b;
doubledx, 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が意味を成していません。多分、これも「解析的積分結果」と「数値積分の結果」との差を出したいんじゃないか、とは思ってるんですが、それは今のとこ、コードには反映されていませんね。

投稿日時 - 2009-04-29 20:56:51

ANo.2

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

投稿日時 - 2009-04-29 19:51:12

ANo.1

ちょっと明瞭じゃないかも。

>N回表示させる

とは言っても「同じ出力を」N回表示させたいわけじゃないですよね?
もし、単に「N回表示させる」んだったら、単に最後の出力をfor文ででも囲めば良いだけ、です。このように。

for (i = 1; i <= N; i++) {
printf("s = %6.3e err = %6.3e\n", s, err);
}

でも、これじゃあ、貴方の望む結果じゃないんじゃないんですか?
もうちょっと補足が必要ですね。

投稿日時 - 2009-04-29 19:49:47

補足

まず,ご回答ありがとうございます.
質問が不明瞭だったことをご指摘ありがとうございます.
以下に,補足させていただきました.
もしお時間ありましたら,ご回答お願いします.
----------------------
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文の中に入れるだけでは,望む答えが出てこないので手詰まりになってしまったという状況です.

投稿日時 - 2009-04-29 20:15:33

あなたにオススメの質問