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

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

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

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

1488閲覧

料金試算について

ajgd261

総合スコア12

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2016/11/05 08:13

編集2016/11/10 23:46

###前提・実現したいこと

例えば人力車の料金の計算だとします。
そして今回、距離毎に料金を出せるプログラムを実現したいと考えています。
一応考えたこととしては、
1.距離は1000mまでなら900円。
2.その後は500m毎にプラス300円。
ということです。
つまり、1000mなら、900円で、1001mなら1200円、また、1600mなら1500円となるようにしたいです。1mでも過ぎたら300円加算します。
一応htmlは下記のように作りました。

html

1<p> 2 距離:<input id="1" type="text" size="3"></input>m 3 <button id="2">計算</button><br> 4 料金:<span id="3"></span>円です 5 </p> 6

重要なのはjavascriptだと思いますが、下記のように作りました。

javascript

1var kyori = document.getElementById('1'); 2var keisan = document.getElementById('2'); 3var ryoukin = document.getElementById('3'); 4 5keisan.addEventListener('click', function () { 6 var dis = parseFloat(kyori.value); 7 var ryoukin1= 900; 8 var ryoukin2 = 300; 9 if(dis > 0 && dis <=1000){ 10 ryoukin.innerHTML = Math.ceil(ryoukin1); 11 } 12 13 if(dis>1000){ 14 ryoukin.innerHTML = Math.ceil(ryoukin1+ryoukin2); 15 } 16 17 });

このような形だと、1000m以上の値段が全部1300円になってしまいます。
今回は、500m加算される毎に違った料金を出してみたいのですが、わかりませんでした。
わかる方がいらっしゃいましたら、ご教示お願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

こんにちは。

元のコードをなるべく生かすようにして、以下になりました。
(計算ボタンのクリックリスナ部分だけを記載します。)

javascript

1keisan.addEventListener('click', function () { 2 var dis = parseFloat(kyori.value); 3 4 // dis がNaNもしくは0以下なら料金を0として終了 5 if ( isNaN(dis) || dis <= 0 ) { 6 ryoukin.innerHTML = '0'; 7 return; 8 } 9 10 var ryoukin1= 900; 11 var ryoukin2 = 300; 12 13 // 1000mを超えた距離を算出 14 var ex_dis = (dis > 1000 ? dis - 1000 : 0); 15 16 // 超えた距離を500mで割り、商以上の最小の整数を取得 17 var ex_counts = Math.ceil(ex_dis / 500); 18 19 // 超過分の料金を計算 20 var ex_charge = ryoukin2 * ex_counts; 21 22 // 基本料金と超過料金を合計してHTMLに反映 23 ryoukin.innerHTML = String(ryoukin1 + ex_charge); 24 });

参考になれば幸いです。


以下、追記です。

最後に、これもできればですが、自分が書いたプログラムをどのように直せばできるのかが知りたいです。

と書いてありました。これは言い換えると、
(1) どうしたら、与えられた問題を解くアルゴリズムを作り出せるのか?
(2) どうしたら、(1)をコードとして過不足なく書けるのか?
が知りたい。

ということだと思いました。それで、貴殿の質問にある、dis>1000の場合のコード:

if(dis>1000){
ryoukin.innerHTML = Math.ceil(ryoukin1+ryoukin2);
}

を見ると、(少なくともこの問題に関して、)上記の(1)が出来てないと推察しています。

この問題の場合は、まず、紙に手計算をしてみることです。
距離が、1000mの場合はいくらか? 1001m場合はいくらか? 2000mの場合は? ・・・
と手で計算をします。
その後、手計算の手順から
「 距離が任意の X メートルの場合も、こうすれば算出できるだろう
という推測やイメージを、式なり図なりで書きます。

それで、「これでいけそう」となったら上記の(2)の段階に入ればよいということになります。

投稿2016/11/05 08:58

編集2016/11/05 09:44
jun68ykt

総合スコア9058

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

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

ajgd261

2016/11/05 09:30

私のミスなら良いのですが、これで試してみたら、0メートルの時が900円と表示されてしまいました。 0メートルの時は0円と表示することは可能でしょうか?
jun68ykt

2016/11/05 09:39

あ、ほんとですね。私の見落としです。 var dis = parseFloat(kyori.value); のあとで、 if ( isNaN(dis) || dis <= 0 ) { ryoukin.innerHTML = '0'; return; } とすればよいかと思います。
jun68ykt

2016/11/05 09:45

回答のコードにも、dis がNaNもしくは0以下になる場合のif ブロックを追加しました。
ajgd261

2016/11/05 10:13

ありがとうございました。 他の回答者の方も本当にありがとうございました。
guest

0

多分こういうこと

function calc(m) { var ret = 900; if (m <= 1000) { return ret; } var _m = m - 1000; var _n1 = parseInt(_m / 500); var _n2 = (_m % 500) == 0; return ret + (300 * (_n1+ (_n2?0:1)) ) ; }

sample

投稿2016/11/05 08:30

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

guest

0

まずプログラムの前に条件を整理してみた。
距離からまず1000を引いてみる。(基本料金部分)
残りを500で割って、その商の部分(整数部)に300を掛ける。
その値に900を足すとご希望の料金に。

投稿2016/11/05 08:22

MasahikoHirata

総合スコア3747

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問