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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C++

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

Q&A

解決済

1回答

739閲覧

同じ出力の値を二度表示しないようにするプログラミング

KeiD

総合スコア26

C++

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

0グッド

0クリップ

投稿2020/07/24 16:02

以下の近似値を求めるプログラムを実行し
x0=1,xn=2を入力すると

範囲[x0,xn]
x0=1
xn=2
x0 xn
1.000000 2.000000
1.500000 2.000000
1.500000 1.750000
1.500000 1.750000
1.625000 1.750000
1.625000 1.687500
1.625000 1.687500
1.656250 1.687500
1.671875 1.687500
1.671875 1.679688
1.671875 1.679688
1.671875 1.675781
1.671875 1.675781
1.671875 1.673828
1.671875 1.673828
1.672852 1.673828

と出力されますが下記太字のように同じ値が出力されています。

x0 xn
1.000000 2.000000
1.500000 2.000000
1.500000 1.750000
**1.500000 1.750000 **
1.625000 1.750000
1.625000 1.687500
1.625000 1.687500
1.656250 1.687500
1.671875 1.687500
1.671875 1.679688
1.671875 1.679688
1.671875 1.675781
**1.671875 1.675781 **
1.671875 1.673828
**1.671875 1.673828 **
1.672852 1.673828

同じ値が2度以上表示されないようにするにはどう変更すればよいか
ご存じの方ご教示お願い致します。

#include<stdio.h> #include<math.h> #include<stdlib.h> //exit関数のために必要 #define IMAX 1000 //計算回数 #define EPS 1.0e-5 //収束条件 double f(double x); int main(void){ double x0,xn,xc; int i; printf("範囲[x0,xn]\nx0="); scanf("%lf",&x0); printf("xn="); scanf("%lf",&xn); printf(" x0 xn\n"); printf("%.6f %.6f\n",x0,xn); xc=(x0+xn)/2; if(f(x0)*f(xn)<0.0){ //範囲の中に解があれば計算開始 for(i=0;i<IMAX;i++){ if( f(x0)*f(xc)<0.0 ){ //範囲を縮める方向の判定 xn=xc; printf("%.6f %.6f\n",x0,xn); }else x0=xc; printf("%.6f %.6f\n",x0,xn); xc=(x0+xn)/2; if( fabs(x0-xn) < 0.001) { exit(1); } }printf("解が収束しませんでした\n"); }printf("[x0,xn]には解が存在しません\n"); return 0; } double f(double x){ return x*x*x-3*x*x+7*x-8; }

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

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

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

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

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

guest

回答1

0

ベストアンサー

中括弧の付け忘れのようですね。
(x0=xc; の後のprintfが毎回実行されていますよ。)

C

1 if( f(x0)*f(xc)<0.0 ){ //範囲を縮める方向の判定 2 xn=xc; 3 printf("N:%.6f <%.6f\n",x0,xn); 4 5 }else{ 6 x0=xc; 7 printf("0:%.6f> %.6f\n",x0,xn); 8 }

ついでながら、同じフォーマットの表示には「見分けるための目印」を付けておくと
デバッグがはかどりますよ。

Console

1 x0 xn 2s:1.000000 2.000000 30:1.500000> 2.000000 4N:1.500000 <1.750000 50:1.625000> 1.750000 6N:1.625000 <1.687500 70:1.656250> 1.687500 80:1.671875> 1.687500 9N:1.671875 <1.679688 10N:1.671875 <1.675781 11N:1.671875 <1.673828 120:1.672852> 1.673828

どちらから寄せたか判りやすい…んじゃないかと思います。
元のロジック(括弧なし)で実行すると、
「(小さい方から)寄せてないのに表示が出た」と気付けます(たぶん)

投稿2020/07/24 16:36

編集2020/07/24 18:44
e-watt

総合スコア84

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

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

KeiD

2020/07/24 23:38 編集

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問