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

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

ただいまの
回答率

90.53%

  • C

    4386questions

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

c言語でのプログラミング問題です。模範解答お願いしたいです。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 313

kiyomasa

score 4

前提・実現したいこと

c言語での問題なんですけど、どなたか分かる方模範解答お願いします。

満タンで50リットルのガソリンが入り、燃費はリッター8キロの車があり、
現在車にはXリットルのガゾリンが残っています。あなたは、次のいずれかの
方法で、ガソリンを満タンにしようと考えています。
・方法1
すぐ隣にあるガソリンスタンドA(リッター153円)で満タンにする。
・方法2
自宅からYキロ離れた場所にある激安ガソリンスタンドB(リッターZ円)まで出かけ、
満タンにして戻ってきて、帰り道に消費した分をガソリンスタンドAで補充して満タン
にする(たとえ1リットル未満でも)。
X,Y,Zを入力すると、どちらの方法がどれだけ得かを教えてくれるプログラムを書け。

よろしくお願いします。

#include <stdio.h>
int main(void) {
  int x,y,z,pt1,pt2,a,b;

  printf("ガソリンの残量: x = ");
  scanf("%d", &x);
  printf("自宅からガソリンスタンドまでの距離: y = ");
  scanf("%d", &y);
  printf("ガソリンスタンドのリッター: z = ");
  scanf("%d", &z);

  pt1 = (50 - x) * 153;
  printf("方法1: %d円\n", pt1);
  pt2 = ( (50 - x) + y / 8 ) * z + ( (y / 8) * 153 );
  printf("方法2: %d円\n", pt2);

  if (pt1 > pt2){
    a = pt1 - pt2;
    printf("方法2が%d円得です。\n", a);
  }
  else {
    b = pt2 - pt1;
    printf("方法1が%d円得です。\n", b);
  }
}


とてもきたないプログラムだとは思いますが、
このようにして試して見ました。修正点、改良点ありましたらよろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • tanat

    2019/04/13 04:32

    質問ポリシーに沿って質問してください

    質問する前に、わからないことを調べましょう
    わからないことがあれば、まずは調べてその結果を試してみましょう。それでもわからなければ「自分で試したこと」として記載した上で質問しましょう。

    キャンセル

  • Y.H.

    2019/04/13 06:27 編集

    どのような結果を想定されていて、試した結果どうなって、何が問題なのでしょうか?
    具体的に記載ください
    [質問するときのヒント]( https://teratail.com/help/question-tips )
    質問するときはこちらを参照したうえで質問されるとよいでしょう

    ※丸投げというより問題が含まれてないですかね。。。

    キャンセル

  • raccy

    2019/04/13 08:42

    問題文に不備が多すぎて答えられません。
    * X,Y,Zは整数なのか、少数もありなのか?
    * ガソリンの端数計算はどうしているのか?0.1リットルでも1リットルの金額なのか、切り捨てなのか、そのまま0.1リットル翔だと15.3円になるが、16円なのか15円なのか。四捨五入?0.1以上切り上げ?全部切り捨て?
    * リッター価格は税込みなのか?この問題は2019年10月1日以降はどうなるのか?
    * ガソリンスタンドの計量器はどれぐらい正確に判断できるのか?例えば2.8723リットルの場合は計量器の限界で2.87となる、または、2.88となる、と言った所。
    * Xが50より大きい場合はどうなるのか?
    * Yが400より大きい場合はどうなるのか?
    * Xが1リットル、Yが16キロの場合、Aで1リットル給油してから、Bに向かうのはありか?

    キャンセル

  • 退会済みユーザー

    2019/04/13 14:01

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 3

checkベストアンサー

+3

計算 double で行う、金額の端数は切り捨てる、 ガソリンが隣のスタンドにいくだけの量がないケースを考慮する、
テストをしやすくする,
という観点で書いてみました。
z.c

#include <stdio.h>

int calc(double x, double y, int z) {
  int pt1 = (50 - x) * 153;
  // 隣のスタンドに行くだけのガソリンが無いなら、方法1が得になると判断する
  if (x * 8 < y) {
    return -pt1;
  }
  int pt2 = ((50 - x) + y / 8 ) * z + ( (y / 8) * 153 );
  return pt1 - pt2;
}

void show_result(double d) {
  if (d < 0) {
    printf("方法1が%d円得です。\n", (int)-d);
  } else if (d > 0) {
    printf("方法2が%d円得です。\n", (int)d);
  } else {
    printf("どちらも同じです。\n");
  }
}

int main(void) {
  int x, y, z;

  while(1) {
    printf("ガソリンの残量: x = ");
    scanf("%d", &x);
    printf("自宅からガソリンスタンドまでの距離: y = ");
    scanf("%d", &y);
    printf("ガソリンスタンドのリッター: z = ");
    scanf("%d", &z);
    if ((x <= 0 || x > 50) || (y < 0) || (z <= 0)) {
      break;
    }
    show_result(calc(x, y, z));
  }

  // 次のようにしてテストコードを書ける
  // y = 3.0;
  // for (int x = 0; x <= 50; x+=5) {
  //  for (int z = 90 ; z < 153; z+= 10) {
  //    printf("x=%d, z=%d: %f\n", x, z, calc(x, y, z));
  //  }
  // }
}

想定範囲外の値が入力されたときの処理を cals 関数中で行う、 calc を呼ぶ前に弾くかといった事 (エラー処理)も検討をする必要があります。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/13 18:38

    低評価の理由を教えてほしいです。

    キャンセル

+2

そのコード、「X*8 < Y だとスタンドBに辿り着けないから[方法1]一択」が抜けてるね。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

int では1リットル未満は表現できないのではないでしょうか.

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • C

    4386questions

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