複雑な計算の関数化

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
blue

複雑な計算の関数化

#1

投稿記事 by blue » 15年前

発展課題 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:複雑な計算の関数化

#2

投稿記事 by 急所 » 15年前

宿題は人にやらせるものではない
自分で解くものだ

パコネコ

Re:複雑な計算の関数化

#3

投稿記事 by パコネコ » 15年前

エラー出てますけど…関数の型が一致してないようで…
double atof(char [/url]);
return atoi(buf);

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

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

バグ

Re:複雑な計算の関数化

#4

投稿記事 by バグ » 15年前

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:複雑な計算の関数化

#5

投稿記事 by へろりくしょん » 15年前

ざらっと見ただけですが、とりあず interest() 関数内で変数 risi が初期化されていません。
未初期化の変数の読み出しを行った結果は未定義です。

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


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

blue

Re:複雑な計算の関数化

#6

投稿記事 by blue » 15年前

なんとかうまくいきました。みなさんありがとうございます。ところで、へろりさんに質問なんですが「複利計算について根本的な勘違いをしている気がします」とありましたが、具体的におしえてくれませんか?

naohiro19

Re:複雑な計算の関数化

#7

投稿記事 by naohiro19 » 15年前

string.hのインクルードがありません。

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

へろりくしょん

Re:複雑な計算の関数化

#8

投稿記事 by へろりくしょん » 15年前

>「複利計算について根本的な勘違いをしている気がします」とありましたが、具体的におしえてくれませんか?

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

toyo

Re:複雑な計算の関数化

#9

投稿記事 by toyo » 15年前

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

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

バグ

Re:複雑な計算の関数化

#10

投稿記事 by バグ » 15年前

>>blueさん
うまくいった結果のソースをアップしておいた方が良いと思いますよ。
今後、似たような質問があった場合に参考にする人が出てくるかもしれませんので。

blue

Reうまくいったソース

#11

投稿記事 by blue » 15年前

#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;
}

閉鎖

“C言語何でも質問掲示板” へ戻る