プロが教える店舗&オフィスのセキュリティ対策術

1年単利金利 0.2% の A銀行と、1年複利金利 0.19% の B銀行に、それぞれ 100万円を預けた時の各年の預金高を、B銀行の預金高が多くなるまで、一覧表にせよ。
ここで,単利とは元金が変わらず,複利は利息分が元金に上乗せされるものである.

というレポート課題が出たのですが、うまく結果がでないので教えてください。
以下が私の書いたプログラムです。
#include<stdio.h>

int main(void)
{
int i = 100;
int j = 100;
int n = 0;
float a = 100*0.0002;
float b = j*0.00019;
do {
i= i + a;
j= j + b;
n++;
printf("i j = %d, %d?n",i, j);
} while (j > i);

printf("%d年でBがAを上回る?n",n);

return 0;

}

実行するとループせずに終わってしまいます。
どこが間違っているのかご教授よろしくお願いします。

A 回答 (4件)

論理構成を建てずに、闇雲にプログラムしてもダメです。


【前提】
(1)利率は単利は年利0.2%、複利は01.19%とする。
(2)利金は1円単位で、端数切り捨てとする。
【処理】
(1)単利側をI、複利側をJとし、初期値100万円から開始
(2)単利側の計算 I += 1000000 * 0.002
(3)複利側の計算 J += J * 0.0019
(4)JがIより大きくなるまで(2)と(3)を繰り返す
(5)繰り返した回数(年)を表示する

【間違えている点】
(1)金額が100円である。
(2)複利側で利金が初期元本の利金を繰り入れている。
(3)whileは条件を満たす間、ループする。
  本件では最初はJ=Iなので、条件を満たさない。
  何故なら、100に0.002を掛けても0.2で、切り捨てにより
  0になるので、I+=aとしてもIの値は変化しない。Jも同じ。

C言語ではUntil条件のループ制御文はありません。
日本語で、「~になるまで繰り返す」という表現は表せません。
これは「~になったら繰返しを止める」ということなので、
代わりに、「~でない間、繰り返す」と考えるのが正しい。

以上を修正すると、以下の通り。
(1)初期値
    long i = 1000000; 念のためlong型を使う。
    long j = 1000000;
(2)利渡り
    j += j * 0.0019;
(3)繰り返し条件
    while ( j <= i );
    • good
    • 0
この回答へのお礼

論理構成の手順からプログラムのミスまでとてもわかりやすく教えていただき、ありがとうございます。
これからは、まずしっかりと論理構成をした上でプログラムを書くように練習します。
どうもありがとうございました。

お礼日時:2010/05/14 13:28

#1です。


利息だから1円単位でいいのか・・・・整数型でよかったのね。
まあキャストすれば動くでしょ。
a+= (int)(a_org*a_rate);
b+= (int)(b*b_rate);
    • good
    • 0

いろいろと間違っているし, 表示を見れば理由はわかると思うんだけど....


とりあえず, 1万円単位でいいの? 普通は, 少なくとも 1円単位で考えるものじゃない?
    • good
    • 0

まず


i= i + a;
j= j + b;
の結果がint型なので小数点が消えてなくなる。
Bは利息の掛け算がループに入っていないので単利になってる。


double a_org = 1000000;
double b_org = 1000000;
double a_rate = 0.002;
double b_rate = 0.0019;
int n=0;
double a=a_org;
double b=b_org;
do {
printf("[%d];i, j = %lf, %lf\n", n, a, b)
a+= a_org*a_rate;
b+= b*b_rate;
n++;
} while (a > b);
printf("[%d];a, b = %lf, %lf\n", n, a, b);
printf("%d年でBがAを上回る\n",n);
    • good
    • 0

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