ページ 11

複雑な計算の関数化

Posted: 2010年9月08日(水) 15:39
by blue
発展課題 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:複雑な計算の関数化

Posted: 2010年9月08日(水) 15:48
by 急所
宿題は人にやらせるものではない
自分で解くものだ

Re:複雑な計算の関数化

Posted: 2010年9月08日(水) 15:54
by パコネコ
エラー出てますけど…関数の型が一致してないようで…
double atof(char [/url]);
return atoi(buf);

これは一体…どっちか間違ってませんか?

========
さっきから探しているけど見つからない…
atofは宣言しかないのですが…
atoiとはなんでしょうか?
atofの間違いもしくは逆でしょうか?
画像

Re:複雑な計算の関数化

Posted: 2010年9月08日(水) 16:00
by バグ
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:複雑な計算の関数化

Posted: 2010年9月08日(水) 16:04
by へろりくしょん
ざらっと見ただけですが、とりあず interest() 関数内で変数 risi が初期化されていません。
未初期化の変数の読み出しを行った結果は未定義です。

それと、変数xが宣言されてないようです。
ついでに、a = get_int();  は利率を取得しているようですが、get_int() 関数は整数値の入力を取得する関数ですね。 これでは不都合ではありませんか。


さらに言うと、複利計算について根本的な勘違いをしている気がします。

Re:複雑な計算の関数化

Posted: 2010年9月08日(水) 23:07
by blue
なんとかうまくいきました。みなさんありがとうございます。ところで、へろりさんに質問なんですが「複利計算について根本的な勘違いをしている気がします」とありましたが、具体的におしえてくれませんか?

Re:複雑な計算の関数化

Posted: 2010年9月09日(木) 07:43
by naohiro19
string.hのインクルードがありません。

-- 追記
誤解してました。お詫び申し上げます 画像

Re:複雑な計算の関数化

Posted: 2010年9月09日(木) 07:57
by へろりくしょん
>「複利計算について根本的な勘違いをしている気がします」とありましたが、具体的におしえてくれませんか?

途中まで書いてて気が付きました。 勘違いしていたのは私の方だったようです。 失礼いたしました。

Re:複雑な計算の関数化

Posted: 2010年9月09日(木) 09:49
by toyo
パコネコさん
さっきから探しているけど見つからない…
atofは宣言しかないのですが…
atoiとはなんでしょうか?
atofの間違いもしくは逆でしょうか?

atoi,atofの実体は標準ライブラリにあるので宣言だけで使えます
atoiはintを返す関数なので宣言自体も必要ないです(Cの場合)
でも宣言はあった方がいいですね
普通は
#include <stdlib.h>
でatoiやatofを宣言します

Re:複雑な計算の関数化

Posted: 2010年9月09日(木) 11:50
by バグ
>>blueさん
うまくいった結果のソースをアップしておいた方が良いと思いますよ。
今後、似たような質問があった場合に参考にする人が出てくるかもしれませんので。

Reうまくいったソース

Posted: 2010年9月09日(木) 22:12
by blue
#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;
}