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

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

ただいまの
回答率

90.47%

  • C

    4657questions

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

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

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,579

marry0129

score -33

消費税率を変更した際の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になってしまいます。 他の計算と何処が違うのかもよくわからないのですが、 まだ不味いところがあるのでしょうか?

#include<stdio.h>

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

int main(){

    int taxa,taxb,n,a,b,ans;

    while(1){
        scanf("%d %d %d",&taxa,&taxb,&n);
     if(taxa==0 && taxb==0 && n==0){      //0 0 0で終了
            break;
        }
        ans=0;
        for(a=1;a<n;a++){
            for(b=1;b<(n/2);b++){
                if(tax(a,taxa)+tax(b,taxa)==n){  
                           //abの前税込み合計金額がnと一緒の時
                    int komi=tax(a,taxb)+tax(b,taxb);
                    if(komi>ans){
                        ans=komi;
                    }
                }
            }
        }

        printf("%d\n",ans);
    }

    return 0;
}

少し改善しました。

#include<stdio.h>
#include<stdlib.h>

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

int main(){

    int n,a,b,ans;
    int taxa,taxb;

    while(1){
        scanf("%d %d %d",&taxa,&taxb,&n);
        if(taxa==0 && taxb==0 && n==0){
            break;
        }
        ans=0;
        for(a=1;a<=(n/2);a++){
            for(b=n;b>=(n/2);b--){
                if((int)tax(a,taxa)+(int)tax(b,taxa)==n){
                                                //aとbの前税込み金額がnと等しくなればいい
                    int komi=(int)tax(a,taxb)+(int)tax(b,taxb);
                    if(komi>ans){
                        ans=komi;
                    }
                }
            }
        }

        printf("%d\n",ans);
    }

    return 0;
}

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

#include<stdio.h>
#include<stdlib.h>

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

int main(){

    int n,a,b,ans;
    int taxa,taxb;

    while(1){
        scanf("%d %d %d",&taxa,&taxb,&n);
        if(taxa==0 && taxb==0 && n==0){
            break;
        }
        ans=0;
        for(a=1;a<n;a++){
            for(b=1;b<n;b++){
                int akomi=tax(a,taxa)+tax(b,taxa);
                if(akomi==n){
                                                //aとbの前税込み金額がnと等しくなればいい
                    int bkomi=tax(a,taxb)+tax(b,taxb);
                    if(bkomi>ans){
                        ans=bkomi;
                    }
                }else if(akomi>n){
                    break;
                }
            }
        }

        printf("%d\n",ans);
    }

    return 0;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hsk

    2015/12/04 15:22

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

    キャンセル

回答 5

checkベストアンサー

+1

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

http://codepad.org/hE1h8iMl

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

ans=846

でいいんですよね?

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

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/04 22:52

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

    キャンセル

+1

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

というか、

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

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

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

include<stdio.h>

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

int main() {
    int taxa,taxb,n,a,b,ans;

    while(1) {
        scanf("%d %d %d",&taxa,&taxb,&n);
        if(taxa==0 && taxb==0 && n==0) {
            //0 0 0で終了
            break;
        }

        ans=0;

        for(a=1;a<n;a++) {
            for(b=1;b<(n/2);b++) {
                if(tax(a,taxa)+tax(b,taxa)==n) {
                    //abの前税込み合計金額がnと一緒の時
                    int komi=tax(a,taxb)+tax(b,taxb);
                    if(komi>ans) {
                        ans=komi;
                    }
                }
            }
        }

        printf("%d\n",ans);
    }

    return 0;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

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

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


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

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

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型へ暗黙のキャストされることで切り捨てにて返却されます。

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/04 19:17

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

    キャンセル

  • 2015/12/04 22:55

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

    キャンセル

+1

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

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

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

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/04 16:53

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/04 20:17

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

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C

    4657questions

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