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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

2回答

1042閲覧

関数内で値の更新がうまくできていないと思われます。

chocopon

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2021/05/25 05:51

編集2021/05/25 07:54

前提・実現したいこと

二分法というものを使って x - cos(x) = 0 の近似解を求めようとしています。
作ったプログラミングでエラーは発生していないのですが、出力される値が想定しているものではありません。

二分法の原理はとある値a, b と c = (a + b) / 2 を用いてf(a)とf(c)を計算し、f(a)とf(c)が異符号だったらaとcの間に解があるので新たにb = cとし、同符号だったらaとcの間に解はないので新たにa = cとする、というものを繰り返して設定した誤差の値より小さくなったら終わりという形になります。

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

プログラムを実行すると実行結果が2.50をずっと繰り返しているだけになります。
誤差の設定がうまくいっていないのか、a,b,cそれぞれの値をうまく更新できないないのかのどちらかだと思われます。

該当のソースコード

c

1#include <stdio.h> 2#include <math.h> 3 4/*与えられた式の右辺を計算する関数*/ 5double func(double hensu) 6{ 7 double migi; 8 migi = hensu - cos(hensu); 9 10 return migi; 11} 12 13 14/*二分法を計算する関数*/ 15double bisec(double a, double b, double c) 16{ 17 double kekka, gosa; 18 19 c = (a + b) / 2; 20 kekka = func(a) * func(c); 21 22 23 if (kekka < 0){ 24 b = c; 25 } else { 26 a = c; 27 } 28 29 return kekka; 30} 31 32/*初期値はa = 0, b = 5 , gosa = 1.0*10^-8 */ 33int main(void) 34{ 35 double fx, kekka, seido, hensu, atai, gosa; 36 37 seido = pow(1.0, -8); 38 39 do { 40 double a = 0.0, b = 5.0, c = (a + b) / 2; 41 42 bisec(a, b, c); 43 44 if (a > b){ 45 gosa = a - b; 46 } else { 47 gosa = b - a; 48 } 49 50 printf("%lf\n", c); 51 52 } while (gosa > seido); 53 54 return 0; 55 56}

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

https://replit.com/languages/c
このサイトでコードを書いて実行しています。

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

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

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

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

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

m.ts10806

2021/05/25 06:10

質問は編集できます。間違えたのであれば新しく投稿するのではなく質問を修正してください。 回答つく前に削除依頼を。 またコードはマークダウンのcode機能にてご提示ください
fana

2021/05/25 06:26

> x - cos(x)の近似解 という言葉で一般的に通用するのでしょうか? 解こうとしている方程式は, x - cos(x) = 0 ですか?
guest

回答2

0

ベストアンサー

関数 bisec は何一つ有益な仕事をしていません.

※また,仮に関数 bisec が何かしらの「更新」をしてくれたとしても,
main関数側のdo~while内で毎回 ab の値を初期化しているので,やはりうまいこと動かないでしょう.

問題に取り組むよりもまえに,まずはC言語の基礎的な知識を習得する必要があるでしょう.


やさしさに満ち溢れたヒント:

とりあえずこのあたりの事柄から復習なりすれば良いのではないかな,と.

C

1void f( int a ) 2{ a = 800; } //←この処理は,main関数側の変数の値に全く影響を与えない. 3 4int main() 5{ 6 int a = 1; //aの値は1である 7 f( a ); //関数fにaの値を引数として渡す 8 printf( "%d", a ); //←これは 1 と表示される.800 ではない. 9}

投稿2021/05/25 07:40

編集2021/05/25 08:09
fana

総合スコア11708

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

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

0

まず、このプログラムがどう動くのかを考えてみてください。
「実行するとまず〇〇行が動いて次に△△行が動いてこの変数がXXになって次に・・・」
という感じです。
そして、各行の前か後に printf で "A""B""C" とか "あ""い""う" とか(他の printf と区別するための文字)と共に 変化するはずの変数の値 を表示する行を追加して実行してみて、
想定した通りに動作しているかを確認(「A通ってB通って変数がこうなってCのif文で…あれ?」と行った感じ)しては如何でしょう。

関数で値の更新がうまく出来ていないと思われるのなら、関数を呼ぶ前後で変数の値を表示してみたり、関数内の最初と最後で表示してみる等で確認できると思います。

全体を動かしてから考えるよりも、少しずつ動かして確認していくほうが良い場合が多いかと思います。

投稿2021/05/27 07:13

jimbe

総合スコア12744

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問