• ベストアンサー

複利の利率を求めるプログラムをC言語で作りたいんですが、、、

計算を始める値、最終的な結果、計算回数(期間)、の3つから利率を求めたいんですが、、 単利の利率を求める公式から、利率を0.001ずつ減らすループを作れば、誤差0.001以内の値が出るのではないかと思ったんですが、、全く動いてくれなせん、何故でしょうか?? #include<stdio.h> double main() { double x; double s; double k; int counter1; double a; double b; double r; int counter2; printf("初期値=?\n"); scanf("%lf",&x); printf("結果=?\n"); scanf("%lf",&s); printf("期間=?\n"); scanf("%d",&counter1); k=((s-x)/(counter1*x));//*単利での利率の公式*// printf("単利での利率(%%)=%f\n",k*100); while(counter1==counter2){ b=x;//*bはxを上書きさせない為*// k=k-0.001; while(b<=s){ //*複利の計算*// a=b/100; r=a*k; b=b+r; counter1++; printf("複利での利率(誤差0.001)=%f\n",k);} }return 0;} whileの部分ををforで、 for(b=x;counter1==counter2;k-0.001){ for(counter1=1;b<=s;counter1++){ としても、、コンパイルはできるのですが、、ループ自体をしてくれません、、何故なのでしょうか??C言語以外でもいいですが、、複利の利率は公式とかはあるんでしょうか??

質問者が選んだベストアンサー

  • ベストアンサー
  • masa6272
  • ベストアンサー率66% (93/140)
回答No.4

一応、確認済みです。 コンパイル時に -lm オプションを付けてください。 #include <stdio.h> #include <math.h> int main() { double x,s,k; int t; printf("初期値=?\n"); scanf("%lf",&x); printf("結果=?\n"); scanf("%lf",&s); printf("期間=?\n"); scanf("%d",&t); k = exp(log(s/x)/t)-1; printf("複利での利率=%f\n",k); }

chanman_00
質問者

補足

-lmオプションとはなんでしょうか??

その他の回答 (5)

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.6

-l は、コンパイル時に特定のライブラリを使うことを意味します。 URLを参考にして下さい。

参考URL:
http://www.kiso.tsukuba.ac.jp/~makimura/text/node196.html
chanman_00
質問者

お礼

環境によってmath.hをインクルードするために必要なんですね!? なるほど今回math.hでいろいろ便利な関数が沢山ある事が分かったのでよかったです、為になりました、、ありがとうございました。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.5

> -lmオプションとはなんでしょうか?? No.4さんのコードでは、exp(), log()という数学関数を使っています。 ある種の開発環境では、数学関数を使おうとするときには コンパイル時に -lm オプションが必要です。 chanman_00さんの環境で -lm オプションの指定が必要かどうかは、 どういう開発環境をお使いかによります。

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.3

どうしてもループを使いたいのでしょうか? 利率 = exp(log(最終的な結果 - 初期値) / 期間) - 1 でそのまま出ますが・・・ log は対数関数です。

chanman_00
質問者

お礼

すごいです!。できました、ありがとうございましたm(__)m。 対数関数、、自体がまだちょっと理解はできないんですが、、これから勉強します!!。 ループができなかった(できる)原因ってあるんですかね? 使っている関数的限界なんですかね?? ありがとうございました。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

> counter1++;←ではなく、counter2++;でした counter2の初期値がゴミの状態でインクリメントするのは、まずいです。 どんな結果を起こすか、わかりません。

chanman_00
質問者

補足

すいません何分初心者なもので、、 計算に使う変数はそれぞれ宣言後初期化します。。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

counter2に何も値をセットしていない(つまり、中身がゴミ)状態で counter1と比較している点に大きな問題があります。 なお、複利の場合の計算式は、 元利合計=元金×(1+利率)^期間 です(^は、べき乗)。 単利の場合の計算式とは全く別です。

chanman_00
質問者

お礼

すいませんでした、、 whileのところ、、 while(counter1==counter2){ b=x; k=k-0.001; while(b<=s){ a=b/100; r=a*k; b=b+r; counter1++;←ではなく、counter2++;でした forのところ、、 for(b=x;counter1==counter2;k-0.001){ for(counter1=1;b<=s;counter1++){←ではなく for(counter2=1;b<=s;counter2++){でした、、 それでも同じように動きませんが、、 公式そうだったんですね!!ありがとうございます、、 公式をどのようにあてはめるのか、、まだちょっとわかりませんが、、試行錯誤してみます、、 

関連するQ&A