C言語で、以下の漸化式について
T(0)=1
T(1)=X のとき
T(k+1)=2XT(k)-T(k-1) (k = 0,1,2...,20)
を、kを20以下の自分の好きな値を入力して、計算を回して出力するプログラムを以前作りました。
以下にプログラムの内容と結果を書きます。
#include <stdio.h>
#include <math.h>
int main()
{
double x ;
int k ;
int K ;
double T[20] ;
printf("k = ") ;
scanf("%d", &K) ;
printf("x = ") ;
scanf("%lf", &x) ;
T[0] = 1 ;
T[1] = x ;
for (k = 1; k < K; k++) {
T[k+1] = 2 * x * T[k] - T[k - 1];
}
for (k = 0; k <= K; k++) {
printf("T[%2d] = %f\n",k,T[k]);
}
return 0 ;
}
//結果//
k = 5
x = 2
T[ 0] = 1.000000
T[ 1] = 2.000000
T[ 2] = 7.000000
T[ 3] = 26.000000
T[ 4] = 97.000000
T[ 5] = 362.000000
k = 4
x = 3
T[ 0] = 1.000000
T[ 1] = 3.000000
T[ 2] = 17.000000
T[ 3] = 99.000000
T[ 4] = 577.000000
今回は上記のプログラムを、関数を使って作りました。
以下にプログラムの内容と結果を書きます。
#include <stdio.h>
#include <math.h>
double t[20];
double T(double x, int k)
{
if (k = 0)
{
return 1 ;
}
if (k = 1)
{
return x ;
}
else
{
return 2 * x * t[k] - t[k - 1];
}
}
int main()
{
double x ;
int k, K ;
double t[20];
printf("k = ") ;
scanf("%d", &K) ;
printf("x = ") ;
scanf("%lf", &x) ;
for (k = 0; k <= K; k++)
{
printf("T[%2d] = %lf\n",k,T(x,k));
}
return 0;
}
//結果//
k = 5
x = 2
T[ 0] = 2.000000
T[ 1] = 2.000000
T[ 2] = 2.000000
T[ 3] = 2.000000
T[ 4] = 2.000000
T[ 5] = 2.000000
k = 4
x = 3
T[ 0] = 3.000000
T[ 1] = 3.000000
T[ 2] = 3.000000
T[ 3] = 3.000000
T[ 4] = 3.000000
このように、計算がうまくいきません。
何を直せばうまくいくかなど教えていただけると嬉しいです。
また、C言語、プログラミング初心者なので、わかりやすく丁寧に教えていただけると助かります。
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
C言語における比較演算子は"=="
"="は代入演算子。
if文の()の中が全て"="になっていますね。これを全て"=="に変えましょう。
if(k=0)
はkに0を代入。そしてその代入した値がその式の値として評価されます。
つまり、k=0は偽として処理される。(C言語において式の値が"0"=偽)
kの値はこの時点で"0"になっている。
if(k=1)
kに1が代入される。そしてその式の値は"1"であり真(C言語において式の値が"0"以外=真)
真であるため、ifの後の{}中の式が実行される。return文なのでここでこの関数は終了される。
要するにxの値がそのまま出力される。
当然それ以下の式は実行されない。
No.5
- 回答日時:
誰も漸化式の配列tに代入しないのだから答がでるはず有りません。
それに
if (k=1)
は誤りでしょう。
if (k == 1) ですね。
配列を使うなら素直にループで
関数を使うなら再帰で書きましょう。
No.4
- 回答日時:
典型的な再帰を適用すべきパターンです
https://ja.wikipedia.org/wiki/%E5%86%8D%E5%B8%B0
T(x,k) ただし (k>=2) の値は、
T(x,k-1) と
T(x,k-2) を
再帰呼び出しして計算しましょう。
No.2
- 回答日時:
全体は見ていませんけども…。
>if (k = 0)
>{
> return 1 ;
>}
>if (k = 1)
>{
> return x ;
>}
上記のif文で「どのような挙動を期待している」のか説明してください。
# 他の言語とごっちゃになっているんでしょうかね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C言語のプログラムで#include<m...
-
C 開放してるのにエラー(doubl...
-
C言語を実行すると-infが出てき...
-
C言語でdouble型の小数点の引き...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
C++で外積
-
float?数字の後にLがつくもの
-
-1.#IND00と出てしまうのですが...
-
関数におけるif文とreturn文に...
-
c言語で、繰り返し文の中で、0....
-
極座標から直交座標に変換
-
qsortと動的確保の2次元配列
-
c言語のプログラミングについて...
-
正規分布の乱数生成
-
浮動小数点数が表示されないん...
-
Cで3乗根を求める方法
-
Cプログラミングの質問です。
-
C言語の型による処理速度の違い
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
c言語で、繰り返し文の中で、0....
-
C言語を実行すると-infが出てき...
-
C言語 関数プロトタイプ宣言の...
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
至急です! マクロ定義で #defi...
-
関数におけるif文とreturn文に...
-
c言語のプログラミングについて...
-
2分法で方程式の複数の解を自...
-
-1.#IND00と出てしまうのですが...
-
doubleは常に%lfとするべきなのか
-
C言語のpow関数の不具合
-
C言語で-23乗を取り扱うには
-
C言語で台形公式を使った二重積...
-
Cで3乗根を求める方法
-
sin(x)の近似について
-
2次方程式の解を求めるプログ...
おすすめ情報