合計 昨日 今日

無限ループになってしまいます。

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: propane
[URL]
ぴよぴよ(408 ポイント)
Date: 2017年5月14日(日) 02:25
No: 1
(OFFLINE)

 無限ループになってしまいます。

ありがとうございました

わかりました
最後に編集したユーザー propane [ 2017年5月14日(日) 04:47 ], 累計 1 回

Name: かずま
[URL]
Date: 2017年5月14日(日) 03:09
No: 2
(OFFLINE)

 Re: 無限ループになってしまいます。

propane さんが書きました:無限ループになってしまいます。
どうなおしたらよいでしょうか。。

無限ループになると分かっているのなら、
for文の中に printf("k=%d\n", k); や printf("start=%g\n", start); を
入れてみるぐらいのことをしてみましょう。
すぐに原因が分かりますよ。
double length = 1 / k; で、1 / 2 は 0 だからです。
1.0 / k にしましょう。
でも、そこを直したとしても、他のところに重大な間違いがありますよ。

Name: かずま
[URL]
Date: 2017年5月14日(日) 10:16
No: 3
(OFFLINE)

 Re: 無限ループになってしまいます。

propane さんが書きました:ありがとうございました

わかりました

回答が付いた時、質問を消すというのは、
やってはいけないことです。
なぜなら、この掲示板を読んでいる多くの人が、
回答の意味を理解できないからです。

もう一度、質問のプログラムを返信で投稿してください。
と言っても、おそらくやってくれそうにないので、
元のプログラムを codeタグをつけて示します。
コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>
#include <math.h>
#include <float.h>
 
//プロトタイプ宣言//
float integrand(float x);
double trapezoid();
 
int main(void)
{
    trapezoid();
    return 0;
}
 
//4 / ( 1 + x * x)の値を返すintegrand関数//
float integrand(float x)
{
    float fx;
    fx = 4 / (1 + x * x);
    return fx;
}
 
//台形公式を使った積分を計算するtrapezoid関数//
double trapezoid()
{
    int k = 2;                  //台形の分割数の初期値//
//1つの分割数に対する答え//
    double sum[100];
    sum[1] = 3;
    double start = 0;
    double length = 1 / k;      //台形の一つの高さ//
    double area = (integrand(start) + integrand(start + length)) * length / 2;  //一つの台形の面積を求める//
//精度を求める式err//
    double err = fabs((sum[k] - sum[k - 1]) / sum[k - 1]);
//kを大きな数に設定して、k分割した分のk個の台形の面積の合計をgoukeiに入れていく//
    for (k = 2; k < 100; k++) {
        for (start = 0; start < 1; start = start + length) {
 
            sum[k] = sum[k] + area;
        }
        printf("%8d/%8f/%8f/%8f\n", k, sum[k], sum[k - 1], err);
 
        if (err <= 1.0e-10) {
            break;
        }
    }
    return 0;
}

無限ループを解消し、少しでも改善したプログラムを示してくれたら、
まともな台形公式のプログラムを見せてあげましょう。

Name: かずま
[URL]
Date: 2017年5月19日(金) 18:48
No: 4
(OFFLINE)

 Re: 無限ループになってしまいます。

かずま さんが書きました:無限ループを解消し、少しでも改善したプログラムを示してくれたら、
まともな台形公式のプログラムを見せてあげましょう。

質問を削除するような人に、改善したプログラムは期待できないでしょう。

次のようなプログラムを用意していました。
コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <math.h>  // sqrt
 
const int N = 1024; // 分割数
 
double trapezoid(double f(double), double a, double b, int n)
{
    double h = (b - a) / n, s = (f(a) + f(b)) / 2;
    for (int i = 1; i < n; i++) s += f(a + h * i);
    return s * h;
}
 
double f1(double x) { return x; };
double f2(double x) { return x*x; };
double f3(double x) { return sqrt(1 - x*x); }
double f4(double x) { return 4 / (1 + x*x); }
 
int main(void)
{
    printf("∫x dx = %g\n", trapezoid(f1, 0, 1, N));
    printf("∫x^2 dx = %g\n", trapezoid(f2, 0, 1, N));
    printf("∫sqrt(1 - x^2) dx = %g\n", trapezoid(f3, 0, 1, N));
    printf("∫4 / (1 + x^2) dx = %g\n", trapezoid(f4, 0, 1, N));
    return 0;
}

積分区間は [0, 1] です。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[13人]