プロが教えるわが家の防犯対策術!

計算を始める値、最終的な結果、計算回数(期間)、の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言語以外でもいいですが、、複利の利率は公式とかはあるんでしょうか??

A 回答 (6件)

counter2に何も値をセットしていない(つまり、中身がゴミ)状態で


counter1と比較している点に大きな問題があります。

なお、複利の場合の計算式は、
元利合計=元金×(1+利率)^期間
です(^は、べき乗)。
単利の場合の計算式とは全く別です。
    • good
    • 0
この回答へのお礼

すいませんでした、、
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++){でした、、

それでも同じように動きませんが、、

公式そうだったんですね!!ありがとうございます、、
公式をどのようにあてはめるのか、、まだちょっとわかりませんが、、試行錯誤してみます、、 

お礼日時:2008/03/29 11:09

> counter1++;←ではなく、counter2++;でした



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

この回答への補足

すいません何分初心者なもので、、

計算に使う変数はそれぞれ宣言後初期化します。。

補足日時:2008/03/30 09:53
    • good
    • 0

どうしてもループを使いたいのでしょうか?



利率 = exp(log(最終的な結果 - 初期値) / 期間) - 1 でそのまま出ますが・・・

log は対数関数です。
    • good
    • 0
この回答へのお礼

すごいです!。できました、ありがとうございましたm(__)m。

対数関数、、自体がまだちょっと理解はできないんですが、、これから勉強します!!。

ループができなかった(できる)原因ってあるんですかね?
使っている関数的限界なんですかね??

ありがとうございました。

お礼日時:2008/03/30 09:45

一応、確認済みです。


コンパイル時に -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);
}

この回答への補足

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

補足日時:2008/03/30 09:46
    • good
    • 0

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



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

chanman_00さんの環境で -lm オプションの指定が必要かどうかは、
どういう開発環境をお使いかによります。
    • good
    • 0

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


URLを参考にして下さい。

参考URL:http://www.kiso.tsukuba.ac.jp/~makimura/text/nod …
    • good
    • 0
この回答へのお礼

環境によってmath.hをインクルードするために必要なんですね!?

なるほど今回math.hでいろいろ便利な関数が沢山ある事が分かったのでよかったです、為になりました、、ありがとうございました。

お礼日時:2008/03/31 15:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!