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

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

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

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

Q&A

解決済

3回答

523閲覧

タクシメーター風の計算プログラムで料金が正しく表示されない

ceg34ry

総合スコア5

C

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

0グッド

1クリップ

投稿2023/09/24 06:54

実現したいこと

タクシーメーター風の計算をするプログラムを練習で作っています。
・タクシーの初乗り料金が680円、1.3キロまでは初乗り料金だけ支払えばよい。
・1.3キロを超えると350メートルごとに200円加算される。
これをC言語で実装したいです。

発生している問題・エラーメッセージ

880円までの料金は計算されます。 それを超える料金だと画面にも何も表示されません。 22行目がうまくいっていない気がします。

該当のソースコード

C言語

1#include<stdio.h> 2 3int main(void) { 4 double kilo = 0.0;//距離km 5 double meter = 0.0;//距離m 6 int fare = 680;//運賃を初乗りで初期化 7 8 //マイナスの入力距離を防ぐ 9 do { 10 printf("距離をキロメートルで入力:"); 11 scanf_s("%lf", &kilo); 12 } while (0.0 >= kilo); 13 14 //キロメートルをメートルに変換 15 meter = kilo * 1000; 16 17 if (meter >= 1300) { 18 if (meter >= 1300 && meter <= 1650) { 19 //初乗りからワンメーターUPのみ 20 printf("運賃は%dです",fare + 200); 21 }if(meter >= 1651) {//運賃計算 22 fare = 680 + meter / 350 * 200;/*実行されない?*/ 23 } 24 } 25 else {//初乗り料金以内 26 printf("運賃は%dです", fare); 27 } 28 29 return 0; 30}

実行結果

距離をキロメートルで入力:1.0
運賃は680です

距離をキロメートルで入力:1.5
運賃は880です

距離をキロメートルで入力:2.0
(何も表示されません)

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

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

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

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

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

tatsu99

2023/09/24 07:53

22行 fare = 680 + meter / 350 * 200;/*実行されない?*/ で料金を算出していますが、それを印字していません。 22行の次に printf("運賃は%dです", fare); を追加すれば良いかと。
hoshi-takanori

2023/09/24 07:57 編集

計算はしてるけど、その結果を表示してないような…。 あと、1.6505 とか入れたら…。 それから、「1.3キロを超えると」なので 1.3 ちょうどの時は 680 円では?
jimbe

2023/09/24 09:48 編集

比較に = を含めないといけないような制限があるんですかね。 >マイナスの入力距離を防ぐ なら 0.0 は入力できないといけないのでは。 必ず "運賃はxxです" を表示するのでしたら return 0 の直前に printf("運賃は%dです", fare) を入れておいて、そこに向けて条件に従って fare を更新する形にしたほうが良いのではないでしょうか。 仕様にはワンメータUP の時に何か特別なことをすることは無いのに、なぜ if でワンメータUPだけ特別に計算しているのでしょう。 >1.3キロを超えると350メートルごとに200円加算 の仕様に >fare = 680 + meter / 350 * 200 の式であってますか?
tmp

2023/09/25 08:39 編集

算数の問題でなくとも「超える」や「未満」は、それに対応するさせる必要があると思います。 hoshi-takanoriさんがおっしゃている通り、 距離は、整数ではないので、1650m超え~1651m未満がif分がどこにもありません。 また、1300m丁度も超えてはいないので、680円です。 fare = 680 + meter / 350 * 200;の計算もmeterは、整数ではないので、200円単位であがらない。 また、初乗り距離分も200円加算の計算に入ってます。対象は初乗り距離を超えた距離です。 あと、質問者の該当のソースコードを見ていると(料金計算やif分の+1しての比較などから) 距離を整数で演算したいように見えますが、特に問題文にはそういったことは、書いてありませんが、 そういう条件であれば、記載してください。
guest

回答3

0

ベストアンサー

プログラムは上から下に流れますが、必ずしも作り方・考え方も上から下でなければならないわけではありません。
例えば、初乗りだけ表示する所から始めても良いのです。

c

1#include <stdio.h> 2 3int main(void) { 4 int fare = 680;//運賃計算 5 printf("運賃は%d円です", fare); 6 return 0; 7}

これを、区間によって200円ずつ加算されるような式に変えてみます。

c

1#include <stdio.h> 2 3int main(void) { 4 int section = 0;//区間番号(0~1300→0, 1301~1650→1, 1651~2000→2,…) 5 6 int fare = 680 + section * 200;//運賃計算 7 printf("運賃は%d円です", fare); 8 return 0; 9}

変数 section を追加して、初乗り区間なら 0, それ以降は 350m 毎に 1, 2,…と変化するものと仮定した式にしました。
この section が仮定通りになる文を考えれば、仕様に沿った金額が表示されるはずです。

c

1#include <stdio.h> 2 3int main(void) { 4 int meter = 2000;//距離[m] 5 6 int section = 0;//区間番号(0~1300→0, 1301~1650→1, 1651~2000→2,…) 7 if(meter > 1300) { 8 section = (meter - 1301) / 350 + 1; 9 } 10 11 int fare = 680 + section * 200;//運賃計算 12 printf("運賃は%d円です", fare); 13 return 0; 14}

2000m の料金は 1080 円であっているでしょうか。
後は、入力部分を追加するだけです。

c

1#include <stdio.h> 2 3int main(void) { 4 double kilo = 0.0;//距離[km] 5 do { 6 printf("距離をキロメートルで入力:"); 7 scanf_s("%lf", &kilo); 8 } while(0.0 > kilo);//マイナスの入力距離を防ぐ 9 10 //キロメートルをメートルに変換 11 int meter = (int)(kilo * 1000);//距離[m] 12 13 int section = 0;//区間番号(0~1300→0, 1301~1650→1, 1651~2000→2,…) 14 if(meter > 1300) { 15 section = (meter - 1301) / 350 + 1; 16 } 17 18 int fare = 680 + section * 200;//運賃計算 19 printf("運賃は%d円です", fare); 20 return 0; 21}

投稿2023/09/24 11:24

jimbe

総合スコア13318

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

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

ceg34ry

2023/09/28 12:08

考え方を順番に提示しての回答ありがとうございました。
guest

0

meter = kilo * 1000;

で、kiloが2.0のときは、meterはいくらになるのかを考えよう。
で、そのときにそれ以降のif文で、どういう動作になるか追いかけてみよう。

(何も表示されません)

って言ってるけど、なにも表示してないんだからそれが正しい動作ですよ

投稿2023/09/24 09:11

y_waiwai

総合スコア88163

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

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

0

「距離に対して料金が階段状に設定されており,境目までならそれ未満と同じ料金で超えた時に料金が上がる」という条件での記述例を示します。なお,この「切り上げ」を行う部分は関数 ceil() を使いました。

C

1#include <stdio.h> 2#include <math.h> 3 4int main(void) { 5 double kilo = 0.0; 6 double meter, excess; 7 int fare = 680; 8 9 do { 10 printf("距離をキロメートルで入力: "); 11 scanf_s("%lf", &kilo); 12 // scanf("%lf", &kilo); 13 } while (0.0 >= kilo); 14 15 meter = kilo * 1000; 16 17 excess = meter > 1300 ? meter - 1300 : 0; 18 fare += ceil(excess / 350) * 200 + 0.5; 19 20 printf("運賃は %d円です\n", fare); 21 22 return 0; 23}

投稿2023/09/24 15:14

little_street

総合スコア435

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

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

ceg34ry

2023/09/28 12:05

math.hのceil()を使った方法を教えてくださりありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.32%

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

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

質問する

関連した質問