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

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

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

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

Q&A

解決済

3回答

830閲覧

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

miso_soup

総合スコア19

C

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

0グッド

0クリップ

投稿2019/04/12 19:11

編集2019/04/12 21:21

前提・実現したいこと

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

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

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

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

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

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

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

tanat

2019/04/12 19:32

質問ポリシーに沿って質問してください 質問する前に、わからないことを調べましょう わからないことがあれば、まずは調べてその結果を試してみましょう。それでもわからなければ「自分で試したこと」として記載した上で質問しましょう。
Y.H.

2019/04/12 22:39 編集

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

2019/04/12 23: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に向かうのはありか?
guest

回答3

0

ベストアンサー

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

c

1#include <stdio.h> 2 3int calc(double x, double y, int z) { 4 int pt1 = (50 - x) * 153; 5 // 隣のスタンドに行くだけのガソリンが無いなら、方法1が得になると判断する 6 if (x * 8 < y) { 7 return -pt1; 8 } 9 int pt2 = ((50 - x) + y / 8 ) * z + ( (y / 8) * 153 ); 10 return pt1 - pt2; 11} 12 13void show_result(double d) { 14 if (d < 0) { 15 printf("方法1が%d円得です。\n", (int)-d); 16 } else if (d > 0) { 17 printf("方法2が%d円得です。\n", (int)d); 18 } else { 19 printf("どちらも同じです。\n"); 20 } 21} 22 23int main(void) { 24 int x, y, z; 25 26 while(1) { 27 printf("ガソリンの残量: x = "); 28 scanf("%d", &x); 29 printf("自宅からガソリンスタンドまでの距離: y = "); 30 scanf("%d", &y); 31 printf("ガソリンスタンドのリッター: z = "); 32 scanf("%d", &z); 33 if ((x <= 0 || x > 50) || (y < 0) || (z <= 0)) { 34 break; 35 } 36 show_result(calc(x, y, z)); 37 } 38 39 // 次のようにしてテストコードを書ける 40 // y = 3.0; 41 // for (int x = 0; x <= 50; x+=5) { 42 // for (int z = 90 ; z < 153; z+= 10) { 43 // printf("x=%d, z=%d: %f\n", x, z, calc(x, y, z)); 44 // } 45 // } 46} 47

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

投稿2019/04/13 04:46

編集2019/04/13 21:58
katoy

総合スコア22324

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

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

katoy

2019/04/13 09:38

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

0

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

投稿2019/04/13 00:27

編集2019/04/13 00:28
episteme

総合スコア16614

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

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

0

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

投稿2019/04/13 03:25

jimbe

総合スコア12632

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問