質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1815閲覧

二分法で求めた近似解の格納

zatta

総合スコア11

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/05/20 05:54

編集2019/05/20 06:16

前提・実現したいこと

c++で二分法の計算をするプログラムを作っています。
ループで演算した近似解aをxに格納したいのですが、エラーが出てその文以下のデバッグがうまくいきません。

発生している問題・エラーメッセージ

44行目if文で止まってしまい、/結果の出力/の部分が出力されない。

エラーメッセージ Run-Time Check Failure #3 - The variable 'x' is being used without being initialized.

該当のソースコード

C++

1ソースコード 2/* 二分法のプログラム*/ 3 4#include <stdio.h> 5#include <math.h> 6 7/* プロトタイプ宣言 */ 8double func(double); 9 10int main() 11{ 12 /* 変数宣言 */ 13 int iter; 14 double a, b, c, s, eps, x; 15 16 /* 初期化 */ 17 a = 1.5; 18 b = 3.0; 19 eps = 1.0e-12; 20 iter= 0; 21     x = 0; 22 23 printf("初期区間は[%f, %f]\n", a, b); 24 printf("二分法を実行します\n\n"); 25 26 /* 二分法 */ 27 while( eps < fabs(b-a) ) { 28 29 iter++; 30 31 c = (a+b)/2; 32 33 s = func(a) * func(c) ; 34 35 if ( s > 0 ) a = c ; 36 else if ( s < 0 ) b = c ; 37 else{ x = c ; break ;} 38 39 printf("反復回数%d回\n",iter); 40 printf("近似解は%.16fです\n",a); 41 printf("残差は %.2e です\n", fabs(func(a))); /*確認*/ 42 43 } 44 45 if ( x != c ) x = a; 46 47 48 /* 結果の出力 */ 49 printf("反復回数 %d 回\n", iter); 50 printf("近似解は %.16f です\n", x); 51 printf("残差は %.2e です\n", fabs(func(x))); 52 53 return 0; 54} 55 56/* 関数値の計算 */ 57double func(double x){ 58 59 return x*x*x -2*x*x -x +2 ; 60 61}

試したこと

エラーメッセージから、xを初期化すべきなのかと考えx=0を入れましたがうまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

Microsoft Visual C++ 2010 Express

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zatta

2019/05/20 06:44

追記 xを初期化せずに行った場合の、ループ内で得られた計算結果は以下になりました。 反復回数 41回 近似解 1.9999999999995453 残差 1.36e-12 これを、ループを抜けたあとの/*結果の出力*/部で表示したいのですが、x=aと置くためのIf文でエラーが出てしまいできません。 また、x=0で初期化するとループ内の計算結果すら表示がされません。 近似解がcになる場合とaになる場合を区別したいため変数xを使いましたが、xにaを格納するためのIf文がおかしいのでしょうか?
guest

回答1

0

ベストアンサー

x0なりで初期化したうえで…s = func(a) * func(c);s = func(a) - func(c);では?

投稿2019/05/20 06:02

編集2019/05/20 06:12
can110

総合スコア38233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zatta

2019/05/20 06:10

回答頂きありがとうございます。 初期化はすべきなんですね。 sの計算ですが、かけ合わせた際の符号で近づけていく解を決めるため、そこはあっていると思います。
can110

2019/05/20 06:11

そうなのですね。失礼しました。回答は修正しておきます。 値は参照される前には初期化しておかないといけません。でないと不定値と比較してしまいます。
zatta

2019/05/20 06:26

いただいた回答を元に少し調べてみて、初期化の必要性がわかりました。 x=0;を追加してみましたが、依然うまく動いてくれません…。 他になにかお気づきの点がありましたらご指導お願いします。
can110

2019/05/20 06:29

どういうふうにうまく動かないのか、現在の出力結果と理想の出力結果を質問本文に追記されるべきかと思います。ちなみに当方環境では最終結果として 反復回数 41 回 近似解は 1.9999999999995453 です 残差は 1.36e-12 です という合っていそうな結果が得られましたが、これは求める結果とは異なりますか?
zatta

2019/05/20 06:53

稚拙ながら追記させていただきました。 求めたい結果はそちらになります。 ループ内では関数にaを代入し、正しい結果が出ています。 しかし、ループを脱出したあと、xにaまたはcを格納する時点でエラーとなり、反復回数、近似解、残差を表示することができません。 ループ内の出力はあくまで途中の計算を確かめるためであり、最終結果はループ脱出後に得たいです。
can110

2019/05/20 07:02 編集

質問本文に「x=0を入れましたがうまくいきませんでした。」とありますが、どんなエラーになるのでしょうか? 当方環境では途中でも最後でも結果が出力されております。
fana

2019/05/20 08:30

現象はよくわかりませんが,変数を一通り初期化してみたらどうでしょう? ( whileのブロックを一度も通らない場合,cの未初期化が問題になりそうですし)
zatta

2019/05/20 10:16

質問本文のエラー#3はx=0で初期化することで解決しました。 また、アドバイスいただいた通り残りの変数も初期化いたしました。 とてもお恥ずかしい限りですが、_getchでデバッガーを止めたところ最後まで結果が出力されました。 つまり、初期化を行った時点で全て解決しており、私の確認不足であったということです。 お二人のお時間をいただいてしまい申し訳ありません…。 特に、can110さん、丁寧に対応していただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問