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

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

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

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

1回答

1714閲覧

ソースコードのどこに問題があるのか、どう式または文を書けばいいのかが分かりません。

bjbjeknr

総合スコア26

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/10/21 12:49

編集2016/10/21 12:50

テーマ:四半期GDPと年率換算の成長率
四半期(4月6月、7月9月など)のうち、ある期の四半期GDPをx[t]、その前期の
四半期GDPをx[t-1]とする。このとき、対前期比は、以下の式で表すことができる。

x[t]/x[t-1]

年率に換算したパーセント表示の成長率yは、以下の式で表すことができる。

y = ((x[t]/x[t-1])^4 - 1)*100

(^n はn乗の意味 * は掛けるの意味)

今期の四半期GDPと前期の四半期GDPを入力させ、年率換算の成長率(パーセント
表示)を求めるプログラムを作りたい。
(実行例)端末にて
$ ./a.out
Input QGDP(t),trillion yen :139.8884 [Enter]
Input QGDP(t-1),trillion yen :137.9553 [Enter]
QGDP(t) = => 139.888400
QGDP(t-1) = => 137.955300
Growrh rate ( annualized basis ) = => 5.723919%

しかし私のこのソース(↓)

int main(void) { int i,num,power; double growthRateYear = 0.0,qgdp_t = 0.0,qgdp_t_1 = 0.0; double ratio = 0.0; /*今期と前期の四半期GDPを入力*/ printf("Input QGDP(t),trillion yen :"); scanf("%lf",&qgdp_t); printf("Input QGDP(t-1),trillion yen :"); scanf("%lf",&qgdp_t_1); /*対前期比を求める*/ ratio = qgdp_t/qgdp_t_1; /*対前期比を4乗した値を求める(この伸びが4回続くと想定)*/ power = 4; for(i=1;i<=power;i++){ power *= ratio; /* power = power * ratio */ } growthRateYear = (power-1)*100; printf("\n"); printf("QGDP(t) ==> %f\n",qgdp_t); printf("QGDP(t-1) ==> %f\n",qgdp_t_1); printf("\n"); printf("Growrh rate (annualized basis ) ==> %f%%\n",growthRateYear); return 0; }

これを端末で実行すると、こうなります。
$ ./a.out
Input QGDP(t),trillion yen :139.8884
Input QGDP(t-1),trillion yen :137.9553

QGDP(t) ==> 139.888400
QGDP(t-1) ==> 137.955300

Growrh rate (annualized basis ) ==> 300.000000%

5.723919% のはずが 300.000000% になってしまいます。

私のソースのどこがおかしいのか、どう書けばいいのか分かりません。

どうかおしえてください。お願いします。。

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

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

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

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

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

guest

回答1

0

C/C++のソースで質問する場合はタグにC#ではなくC/C++を指定してください。

では本題を。
まず、問題があると思われるのは以下の箇所です。

C

1 /*対前期比を4乗した値を求める(この伸びが4回続くと想定)*/ 2 power = 4; 3 4 for(i=1;i<=power;i++){ 5 power *= ratio; /* power = power * ratio */ 6 } 7 growthRateYear = (power-1)*100;

恐らくここでは、ratioを4乗し、その結果を1から引いてその百分率を求めたいのだと思われます。
しかし、forループの中ではratioの4乗はできていません。
まずi=1のとき、powerには4が入っていますから、powerに代入されるのは4ratioとなりこの時点で求めている結果(ratioの4乗)が得られることがないことがわかると思います。(powerに何回ratioを掛けようが最終的にpowerに格納されるのは4(ratio^n)となるため)

さらに、powerはforループの回数を制御していますが(i<=powerの時のみループ継続)、ループ内でpowerが変更されているために実際はループの実行回数は4回ではなくなります。
(基本的に回数を制御する変数をループ内でいじるべきではないです)

このような処理記述の混乱を避けるため、またコードの意図を分かりやすくするためにも、累乗などの数学的処理は標準ライブラリに用意されている関数を使用するべきです。
今回の累乗処理ではpow関数というものが用意されています。(math.hインクルードの必要あり)
参考 - http://www9.plala.or.jp/sgwr-t/lib/pow.html

pow関数を使って上記部分を書き直したコードは以下の通りです。

C

1#include <stdio.h> 2#include <math.h> 3 4int main(void) 5{ 6 int i,num,power; 7 double growthRateYear = 0.0,qgdp_t = 0.0,qgdp_t_1 = 0.0; 8 double ratio = 0.0; 9 double qratio = 0.0f; // ratioの累乗 10 /*今期と前期の四半期GDPを入力*/ 11 printf("Input QGDP(t),trillion yen :"); 12 scanf("%lf",&qgdp_t); 13 printf("Input QGDP(t-1),trillion yen :"); 14 scanf("%lf",&qgdp_t_1); 15 16 /*対前期比を求める*/ 17 ratio = qgdp_t/qgdp_t_1; 18 19 /*対前期比を4乗した値を求める(この伸びが4回続くと想定)*/ 20 power = 4; 21 22 qratio = pow(ratio, power); //ratioをpower乗(今回は4乗) 23 growthRateYear = (qratio-1)*100; 24 25 printf("\n"); 26 printf("QGDP(t) ==> %f\n",qgdp_t); 27 printf("QGDP(t-1) ==> %f\n",qgdp_t_1); 28 29 30 printf("\n"); 31 printf("Growrh rate (annualized basis ) ==> %f%%\n",growthRateYear); 32 33 return 0; 34}

最初にqratioという変数を新たに宣言していますが、これはratioを累乗した結果を格納するための変数です。
このコードにおいては期待した通りの結果が得られるはずです。

投稿2016/10/21 13:23

grainrigi

総合スコア43

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問