発展課題 10..1
年r %の複利でy 円を借り,n 年後に一括返済する場合の返 済額を計算するプログラムを作成せよ.ただし,r %の複利でn 年 借りた場合の利率を計算する部分を関数として作成すること.下記ヒント参照.
% ./interest
利率(r): 7.5
金額(y): 1000000
期間(n): 2
返済金額は 1155625 円です
%
ヒント: 返済額は円である.r%の複利でn年 間の利率を計算する関数 float interest(float r, int n) を作る.そしてmain()からinterest()を呼び出し,返された値に yを掛けて返済額を求める.
という問題で、コンパイルして実行してみるとなぜか返済金額がマイナスになり、正しい答えがでません。どう直せばよいでしょうか?
私が書いたソースコード↓
#include<stdio.h>
# define BUFFER_SIZE (256)
int get_int(void)
{
char buf[BUFFER_SIZE];
fgets(buf, BUFFER_SIZE, stdin);
return atoi(buf);
}
double atof(char [/url]);
double
get_float(void)
{
char buf[BUFFER_SIZE];
double number;
fgets(buf, BUFFER_SIZE, stdin);
return number = (double )atof(buf);
}
float interest(float r, int n){
int i;
float risi;
for(i=0 ; i<n ; i++){
risi = risi * (1 + r/100);
}
return risi;
}
int main (void){
int money,period;
float a,result;
printf("利率(r): ");
a = get_int();
printf("金額(y): ");
money = get_int();
printf("期間(n): ");
period = get_int();
x = interest( a , period );
result = money * x;
printf("返済金額は %d 円です。",result);
return 0;
}
複雑な計算の関数化
Re:複雑な計算の関数化
エラー出てますけど…関数の型が一致してないようで…
double atof(char [/url]);
return atoi(buf);
これは一体…どっちか間違ってませんか?
========
さっきから探しているけど見つからない…
atofは宣言しかないのですが…
atoiとはなんでしょうか?
atofの間違いもしくは逆でしょうか?

double atof(char [/url]);
return atoi(buf);
これは一体…どっちか間違ってませんか?
========
さっきから探しているけど見つからない…
atofは宣言しかないのですが…
atoiとはなんでしょうか?
atofの間違いもしくは逆でしょうか?

Re:複雑な計算の関数化
printf関数などを様々な箇所において、どこで計算がおかしくなっているかを調べてみましょう。
blueさんは「問題の解き方」よりも「デバッグのやりかた」を教わった方が良いと思いますよ。
それだけのソースを書けるのですから、printfトラップを仕掛けるのは全然難しくないでしょうしね。
※例
blueさんは「問題の解き方」よりも「デバッグのやりかた」を教わった方が良いと思いますよ。
それだけのソースを書けるのですから、printfトラップを仕掛けるのは全然難しくないでしょうしね。
※例
int get_int(void) { char buf[BUFFER_SIZE]; int ret = 0; fgets(buf, BUFFER_SIZE, stdin); ret = atoi(buf); printf("get_int = %d\n", ret); return atoi(buf); }
Re:複雑な計算の関数化
ざらっと見ただけですが、とりあず interest() 関数内で変数 risi が初期化されていません。
未初期化の変数の読み出しを行った結果は未定義です。
それと、変数xが宣言されてないようです。
ついでに、a = get_int(); は利率を取得しているようですが、get_int() 関数は整数値の入力を取得する関数ですね。 これでは不都合ではありませんか。
さらに言うと、複利計算について根本的な勘違いをしている気がします。
未初期化の変数の読み出しを行った結果は未定義です。
それと、変数xが宣言されてないようです。
ついでに、a = get_int(); は利率を取得しているようですが、get_int() 関数は整数値の入力を取得する関数ですね。 これでは不都合ではありませんか。
さらに言うと、複利計算について根本的な勘違いをしている気がします。
Re:複雑な計算の関数化
なんとかうまくいきました。みなさんありがとうございます。ところで、へろりさんに質問なんですが「複利計算について根本的な勘違いをしている気がします」とありましたが、具体的におしえてくれませんか?
Re:複雑な計算の関数化
>「複利計算について根本的な勘違いをしている気がします」とありましたが、具体的におしえてくれませんか?
途中まで書いてて気が付きました。 勘違いしていたのは私の方だったようです。 失礼いたしました。
途中まで書いてて気が付きました。 勘違いしていたのは私の方だったようです。 失礼いたしました。
Re:複雑な計算の関数化
パコネコさん
さっきから探しているけど見つからない…
atofは宣言しかないのですが…
atoiとはなんでしょうか?
atofの間違いもしくは逆でしょうか?
atoi,atofの実体は標準ライブラリにあるので宣言だけで使えます
atoiはintを返す関数なので宣言自体も必要ないです(Cの場合)
でも宣言はあった方がいいですね
普通は
#include <stdlib.h>
でatoiやatofを宣言します
さっきから探しているけど見つからない…
atofは宣言しかないのですが…
atoiとはなんでしょうか?
atofの間違いもしくは逆でしょうか?
atoi,atofの実体は標準ライブラリにあるので宣言だけで使えます
atoiはintを返す関数なので宣言自体も必要ないです(Cの場合)
でも宣言はあった方がいいですね
普通は
#include <stdlib.h>
でatoiやatofを宣言します
Re:複雑な計算の関数化
>>blueさん
うまくいった結果のソースをアップしておいた方が良いと思いますよ。
今後、似たような質問があった場合に参考にする人が出てくるかもしれませんので。
うまくいった結果のソースをアップしておいた方が良いと思いますよ。
今後、似たような質問があった場合に参考にする人が出てくるかもしれませんので。
Reうまくいったソース
#include<stdio.h>
# define BUFFER_SIZE (256)
int get_int(void)
{
char buf[BUFFER_SIZE];
fgets(buf, BUFFER_SIZE, stdin);
return atoi(buf);
}
double atof(char [/url]);
double
get_float(void)
{
char buf[BUFFER_SIZE];
double number;
fgets(buf, BUFFER_SIZE, stdin);
return number = (double )atof(buf);
}
float interest(float r, int n){
int i;
float risi;
risi = 1;
for(i=0 ; i<n ; i++){
risi = risi * (1 + r/100);
}
return risi;
}
int main (void){
int money,result,period;
float a,x;
printf("利率(r): ");
a = get_float();
printf("金額(y): ");
money = get_int();
printf("期間(n): ");
period = get_int();
x = interest( a , period );
result = money * x;
printf("返済金額は %d 円です。",result);
return 0;
}
# define BUFFER_SIZE (256)
int get_int(void)
{
char buf[BUFFER_SIZE];
fgets(buf, BUFFER_SIZE, stdin);
return atoi(buf);
}
double atof(char [/url]);
double
get_float(void)
{
char buf[BUFFER_SIZE];
double number;
fgets(buf, BUFFER_SIZE, stdin);
return number = (double )atof(buf);
}
float interest(float r, int n){
int i;
float risi;
risi = 1;
for(i=0 ; i<n ; i++){
risi = risi * (1 + r/100);
}
return risi;
}
int main (void){
int money,result,period;
float a,x;
printf("利率(r): ");
a = get_float();
printf("金額(y): ");
money = get_int();
printf("期間(n): ");
period = get_int();
x = interest( a , period );
result = money * x;
printf("返済金額は %d 円です。",result);
return 0;
}