質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

5回答

4609閲覧

Cプログラム 消費税率の変更

marry0129

総合スコア51

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2015/12/04 06:17

編集2015/12/04 13:54

消費税率を変更した際の2商品の合計金額の変動について
プログラムを作る課題をしています。

例えば5%から8%に消費税が変わり、2商品の前税込み合計金額(この時は5%)が105円だったとき、

20+80 → 21+86=107
2+99 → 2+106=108
13+88 → 14+95=109

という風に価格が変わります。この時の最高金額を表示させたいです。
ただし、p円のm%での税込み価格はp*(100+m)/100の小数点を切り捨てた値を用いています。

<入力例>
5 8 105
8 5 105
0 0 0
<出力例>
109
103

自分で何処が間違っているかを確認している時に
//abの前税込み合計金額が〜 コメントの行で aとbの値を表示させてみると、aとbの合計が前税込み合計金額と等しくなります。aとbそれぞれの前税込み金額の合計がnになるようにしたいです。
何処を直せばよいのか、教えてください。


殆どの計算はできるようになりましたが

23 89 550

を計算した時などに0になってしまいます。
他の計算と何処が違うのかもよくわからないのですが、
まだ不味いところがあるのでしょうか?

C

1#include<stdio.h> 2 3int tax(int i, int j){ //税込にする関数 4 return i*((100+j)/100); 5} 6 7int main(){ 8 9 int taxa,taxb,n,a,b,ans; 10 11 while(1){ 12 scanf("%d %d %d",&taxa,&taxb,&n); 13 if(taxa==0 && taxb==0 && n==0){ //0 0 0で終了 14 break; 15 } 16 ans=0; 17 for(a=1;a<n;a++){ 18 for(b=1;b<(n/2);b++){ 19 if(tax(a,taxa)+tax(b,taxa)==n){ 20 //abの前税込み合計金額がnと一緒の時 21 int komi=tax(a,taxb)+tax(b,taxb); 22 if(komi>ans){ 23 ans=komi; 24 } 25 } 26 } 27 } 28 29 printf("%d\n",ans); 30 } 31 32 return 0; 33}

少し改善しました。

C

1#include<stdio.h> 2#include<stdlib.h> 3 4double tax(int i, int j){ //税込みにする関数 5 return (double)(i*(100.0+j)/100.0); 6} 7 8int main(){ 9 10 int n,a,b,ans; 11 int taxa,taxb; 12 13 while(1){ 14 scanf("%d %d %d",&taxa,&taxb,&n); 15 if(taxa==0 && taxb==0 && n==0){ 16 break; 17 } 18 ans=0; 19 for(a=1;a<=(n/2);a++){ 20 for(b=n;b>=(n/2);b--){ 21 if((int)tax(a,taxa)+(int)tax(b,taxa)==n){ 22 //aとbの前税込み金額がnと等しくなればいい 23 int komi=(int)tax(a,taxb)+(int)tax(b,taxb); 24 if(komi>ans){ 25 ans=komi; 26 } 27 } 28 } 29 } 30 31 printf("%d\n",ans); 32 } 33 34 return 0; 35} 36

最終的にできた成功コード

C

1#include<stdio.h> 2#include<stdlib.h> 3 4int tax(int i, int j){ //税込みにする関数 5 return i*(100.0+j)/100.0; 6} 7 8int main(){ 9 10 int n,a,b,ans; 11 int taxa,taxb; 12 13 while(1){ 14 scanf("%d %d %d",&taxa,&taxb,&n); 15 if(taxa==0 && taxb==0 && n==0){ 16 break; 17 } 18 ans=0; 19 for(a=1;a<n;a++){ 20 for(b=1;b<n;b++){ 21 int akomi=tax(a,taxa)+tax(b,taxa); 22 if(akomi==n){ 23 //aとbの前税込み金額がnと等しくなればいい 24 int bkomi=tax(a,taxb)+tax(b,taxb); 25 if(bkomi>ans){ 26 ans=bkomi; 27 } 28 }else if(akomi>n){ 29 break; 30 } 31 } 32 } 33 34 printf("%d\n",ans); 35 } 36 37 return 0; 38}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hsk

2015/12/04 06:22

こんにちは。 コード部分について ```c (コード) ``` と、```でくくっていただけますとコードが見やすくなって回答しやすくなります。
guest

回答5

0

ベストアンサー

コピーして、scanfの所だけ変えてみたのですが、

http://codepad.org/hE1h8iMl

正しく動いているように見えますよ。

ans=846

でいいんですよね?

どうにも開発環境の問題な気がします。

開発環境を教えていただけますか?

また、ほかにも2点質問があるので、そちらもよろしく。

1.各if分の中に入っているかどうかをデバッガか何かで追えないでしょうか?
デバッガの無い開発環境なら、暫定的に以下のように書き換えてみるといいと思います。

C

1 if(条件AA){ 2 printf("条件AA"); 3 // 処理本体 4}

2. nの値を100,200,300,400,500,600と変えてみて、どの値がOKかNGかを調べてみてください。

投稿2015/12/04 11:47

編集2015/12/04 11:48
LaLaLand

総合スコア107

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marry0129

2015/12/04 13:52

自分のパソコンではmacのterminalを使っており、 課題はAOJに提出しています。 先ほど少しコードを直しました。 0と表示される問題は、abの組み合わせをprintf表示をすると、検索範囲がおかしいことが原因と分かりました! そして、すべてのデータで正しい答えが出せました! ありがとうございます。
guest

0

まだ解決していないとのことですが、tax関数は期待通りに動作するようになりましたでしょうか?

ほかにも状況が変わっているところがあれば、書いていただけるとわかると思います。

投稿2015/12/04 10:40

LaLaLand

総合スコア107

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marry0129

2015/12/04 11:17

修正したとおもっていたら、できていませんでした。 再度修正しなおしましたので、よろしくお願いします!
guest

0

C

1int tax(int i, int j){ //税込にする関数 2 return i*((100+j)/100); 3}

が期待通りに動作していません。
これだと、
100*((100+8)/100) = 100 * (108/100) = 100*1=100
となってしまいます。
108/100のところが整数で計算されるため、1に丸められるのです。

対応するには double にキャストするのがいいと思います。

手元にCがないので間違っているかもしれませんが、具体的には以下の通り。

C

1int tax(int i, double j){ //税込にする関数 2 return i*((100.0+j)/100.0); 3}

とりあえず、tax関数だけを動かして、期待通りの結果が得られるかどうかを確認してください。

最初に書かれた関数のままですと、100円の消費税率8%でも、税込み100円になるはずです。

これが正しく動くように修正してください。

投稿2015/12/04 07:09

編集2015/12/04 07:23
LaLaLand

総合スコア107

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marry0129

2015/12/04 07:53

ありがとうございます。 tax関数を変更してみました。
guest

0

税抜き合計金額が前税抜き合計金額と等しくなってしまいます。

税抜き合計金額ならば、元の価格の単なる合計ですので消費税は無関係ですね。なので、税率が変わっても同じ値でよいのでは?

それから、コードを書く時は、記入欄上部のB I A ◯ □ " </></>を押すと出てくる'''と'''の間に書くとスムーズですよ。


【追記】
修正Good!!です。

間違い箇所はT-T-T-T-T-T-T-Tさんの指摘通りと思います。
修正は2つ案があります。

C

1 return i*((100.0+j)/100);

T-T-T-T-T-T-T-Tさんの対策と考え方は同じです。
100.0はdouble型になりますので、以降(100.0+j)もdouble型、((100.0+j)/100)もdouble型、更に i*((100.0+j)/100)もdouble型で計算され、最後にint型へ暗黙のキャストされることで切り捨てにて返却されます。

C

1 return (i*(100+j))/100;

貧弱な「マイコン」を使う時に良く使う手法です。整数演算だけで済みます。
欠点はオーバーフローしないよう値に注意が必要なことです。
あまりに面倒なのでPC用なら使わない方がよいと思いますが。

金額の場合はあり得ないと思いますが、もしも、iとして負の値を与えるような時は要注意です。負の数の四捨五入や切り捨ては、幾つかの方法がある(0に近い方に丸める、0から遠い方に丸めるなどなど)のでハマることが有ります。
そのような要らぬことに気を使わないでよいように、負の数があり得ないケースではint型ではなくunsigned型を使うと好ましいですよ。

投稿2015/12/04 07:03

編集2015/12/04 07:35
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marry0129

2015/12/04 10:17

わかりやすく説明ありがとうございます!()を計算の順序だけで使っていたので 注意点が理解できて、とてもありがたいです! まだ解決していないので、よければ引き続き、お願いします。
Chironian

2015/12/04 13:55

何も修正せずにMSVC2015とMinGW 4.9.2でやってみました。 どちらとも、5 8 105は109が出力され、23 89 550は846が出力されました。 これで良いのでは?
guest

0

読みにくいので、適切に改行なりなんなりを入れてください。
例えば下みたいに。

というか、

if(tax(a,taxa)+tax(b,taxa)==n)

って言ってるんですから、komiはnですよ。この場合。
nが「前税抜き合計金額」、komiが「税抜き合計金額」なら等しくなって当たり前です。

それと、「税抜き合計金額」「前税抜き合計金額」の定義を書いてください。

C

1include<stdio.h> 2 3int tax(int i, int j) { 4 // 税込にする関数 5 return i*((100+j)/100); 6} 7 8int main() { 9 int taxa,taxb,n,a,b,ans; 10 11 while(1) { 12 scanf("%d %d %d",&taxa,&taxb,&n); 13 if(taxa==0 && taxb==0 && n==0) { 14 //0 0 0で終了 15 break; 16 } 17 18 ans=0; 19 20 for(a=1;a<n;a++) { 21 for(b=1;b<(n/2);b++) { 22 if(tax(a,taxa)+tax(b,taxa)==n) { 23 //abの前税込み合計金額がnと一緒の時 24 int komi=tax(a,taxb)+tax(b,taxb); 25 if(komi>ans) { 26 ans=komi; 27 } 28 } 29 } 30 } 31 32 printf("%d\n",ans); 33 } 34 35 return 0; 36} 37

投稿2015/12/04 06:50

LaLaLand

総合スコア107

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問