- ベストアンサー
C++借金の返済額の計算
私は借入金の返済額を計算するプログラムを作ろうとしていますが、手が動きません。 作りたいプログラムを具体的にいいますと キーボード入力: 借入金額(元金)、支払い開始年月、年利、支払い回数 表示: 毎月の「元金返済額、利息返済額、残債高」を支払う回数分表示。支払う総額を表示。 月返済額は一定です。 使いたい計算式は以下の通りです。 月利=年利÷12 月返済額=借入金額*月利*(1+月利)^(支払い回数) ÷{(1+月利)^(支払い回数)-1} n回目の支払い時の残積高= (((1+月利)^n)*(借入金額-(月返済額÷月利)) +(月返済額÷月利) n回目の元金返済額=(n-1)回目の支払い後の残積高 -n回目の支払い後の残積高 n回目の利息返済額=月返済額-n回目の元金返済額 どなたか、このプログラムについて教えていただけませんか?;; scanfで読み取った支払い回数の階乗を含んだ式を関数宣言するなんて難しくてわからないんです。利息が増えていくしくみも難しいです>< 投稿初めてなので何かいたらない点があるかもしれませんが、よろしくお願いしますm(_ _)m
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
いまいちどのレベルで解らないのかがわからないのですが・・・ 組み方が解らなければ、最初に説明されている事象をそのままコードに置き換えるだけです。 月利=年利÷12を置き換えます。 まぁ、変数もいるでしょうから、 float nenri = 0.01 //10% float geturi = 0; として、(今回は直接値を入れてます) geturi = nenri / 12; になります。これはOKでしょうか? では次です。 月返済額=借入金額*月利*(1+月利)^(支払い回数)÷{(1+月利)^(支払い回数)-1} 階乗の動きはわかりますよね? 3^1=3 3^2=9 (3*3) 3^3=27 (3*3*3) この動きを関数にするだけです。 1例としては以下のような感じです。 float jyou( float data , int cnt ){ float result=data; for(int i=2;i<=cnt;i++){ result=result * data; } return result; } data に元の数字、cntに階乗の数字を与えます。 3の6乗であれば kotae = jyou(3,6)です。 float result=data;は階乗が1の時の為に元数字と同じものを入れておきます。 次のループから階乗分、元数字を掛け合わせていくだけです。 関数も出来たところで、元に戻りますが月返済額は float tukihensai = 0; float kariire = 300000; //30万借りた int kaisu = 24; //24回払い tukihensai = kariire * geturi * jyou((1 + geturi),kaisu) / (jyou((1 + geturi) , kaisu) -1); になります。 ま、後は同じ要領で順番に組んでいけばOKです。 これでも無理、もしくはわからなければ、 ソースでも乗せましょうかね。
その他の回答 (1)
- notnot
- ベストアンサー率47% (4900/10358)
こういった問題だと、専用関数があるのでExcelでやるほうがずっと楽で、仕様変更もしやすいです。 この仕様のプログラムを全部書いてくれという質問ではないですよね? >scanfで読み取った支払い回数の scanfは使い方が難しく特にキーボードからの入力には初心者は使ってはいけない関数です。数字のキーボード入力は、fgetsで文字列入力して、atoi、 atof 関数によりその文字列を整数値、実数値に変換します。 >支払い回数の階乗を含んだ式を べき乗 a^b は、pow(a,b) です。 >利息が増えていくしくみも難しいです 元金が減っていけば、利息はだんだん減っていきますよね?返済額が利息より少なければ不足分だけ元金が増えていきますけど(借金が雪だるま式に増える)。
お礼
素早いご解答どうもありがとうございました。 初めての質問ということもあり、私の理解度や状況等の説明が不十分でとても解答しづらかっただろうと思います。そんな中、私の意図を汲み取ろうとしてくださり、うれしく、そして申し訳なく思っています。 ありがとうございましたm(_ _)m
補足
へんなところにお礼書いたり、お礼書くところに、補足的なことを書いたりと、粗相ばかりでごめんなさい。なんとか自己解決できました。お二方のおかげです。ありがとうございました。
お礼
ご指導ありがとうございます。 私が、おばかすぎて見放されてしまったようですね・・・TT 階乗の計算はnotnotさんがいうように、pow(x,y)で実現しました。だけど、プロトタイプ宣言のしかたがわからなくて、プログラムの完成にはいたっていません。
補足
詳しい解答ありがとうございます。 misty7666さんのアドバイスを参考にプログラムを書いてみました。 #include<stdio.h> #include<math.h> #difine float jyou(float data,int cnt) float result=data; for(int i=2;i<=cnt;i++){ result=result*data; } return result; main(){ float kariire; float tukiri; float nenri; float kaisu; float tukihensai; float zanseki; float motokinhensai; float risokuhensai; printf("Input kariirekin\n"); scanf("%lf",&kariire); printf("Input tukiri\n"); scanf("%lf",&tukiri); printf("Input nenri\n"); scanf("%lf",&nenri); printf("Input siharaikaisuu\n",&kaisu); scanf("%d",&kaisu); tukiri=nenri/12; float jyou(float data,int cnt){ tukihensai=kariire*nenri*jyou((1+nenri),tukiri)/(jyou((1+geturi),kaisu)/(jyou((1+geturi),kaisu)-1); zanseki=(jyou((1+tukiri),kaisu))*(kariire-(tukihensai/tukiri))+(tukihensai/tukiri); motokinhensai=(jyou((1+tukiri),kaisu-1))*(kariire-(tukihensai/tukiri))+(tukihensai/tukiri)-zanseki; risokuhensai=tukihensai-motokinhensai;risokuhensai=tukihensai-motokinhensai; printf("tuki hensaigaku = %d\n",tukihensaigaku); printf("motokinhensaigaku %d risokuhensaigaku %d zansekidaka %d\n",motokinhensai,risokuhensai,zanseki); } } こんな風になりました。 コンパイルしたところ、コンパイルエラーになってしまいました。 階乗の計算と関数が噛み合っていないのでしょうか・・・。 最終的にはの実行結果の目標は 2004/06 gankin=19900 risoku=200 zanseki=80000 2004/07 gankin=19990 risoku=180 zanseki=60000 ・・・ 2005/12 gankin=20000 risoku= 30 zanseki= 0 Tsuki Hensaigaku =20000 Risoku Goukei =1000 というようにしようと思っているんです。(書いてある数字は適当です。) 私の実力不足でここまではできないかもしれませんけどTT 貴重なお時間を割かせてしまい申し訳ないです。 大感謝しています。