電車の運賃検索がうまく動作しないのはなぜでしょうか。
Q&A
Closed
解決したいこと
ここに解決したい内容を記載してください。
例)
電車の運賃プログラムを作成しております。
直書きだとうまく運賃データを表示できたのに、外部にするとエラーになりました。
具体的には、山陽本線の駅間に与えられた引数(sanyo_nomaltraffic)を幹線の運賃に(maintraffic)に渡し切れていないものだと思われます。
発生している問題・エラー
ないのになぜかエラー。
例)
NameError (uninitialized constant World)
または、問題・エラーが起きている画像をここにドラッグアンドドロップ
該当するソースコード
javascript
例)
def greet
puts Hello World
end
チャットgptを使って、関数化するなどいろいろ手を尽くしました。もう手詰まりです。
以下は大本のプログラムです。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
</head>
<body>
<div>
出発駅:
<select name="from" id="stations1">
<option>駅を選択してください。</option>
<option value="西明石">西明石</option>
<option value="加古川">加古川</option>
<option value="姫路">姫路</option>
<optgroup label="播但線"></optgroup>
<option value="京口">京口</option>
<option value="野里">野里</option>
<option value="A">A</option>
<option value="B">B</option>
<option value="C">C</option>
<option value="D">D</option>
</select>
</div>
<div>
到着駅:
<select name="to" id="stations2">
<option>駅を選択してください。</option>
<option value="西明石">西明石</option>
<option value="加古川">加古川</option>
<option value="姫路">姫路</option>
<optgroup label="播但線"></optgroup>
<option value="京口">京口</option>
<option value="野里">野里</option>
<option value="A">A</option>
<option value="B">B</option>
<option value="C">C</option>
<option value="D">D</option>
</select>
</div>
</div>
距離:<span name="distance"></span>km<br />
普通運賃:<span name="adult"></span>円<br />
小児運賃:<span name="child"></span>円<br />
<script src="js♪20240326♪Tue/faresystem♪20240326♪Tue.js"></script>
<script src="js♪20240326♪Tue/jrwest♪maintraffic101♪20240327♪Wed.js"></script>
<script src="js♪20240326♪Tue/jrwest♪localtraffic101♪20240327♪Wed.js"></script>
<script src="js♪20240326♪Tue/sanyo♪nomal101♪20240327♪Wed.js"></script>
<script src="js♪20240326♪Tue/bantan101♪20240327♪Wed.js"></script>
</body>
</html>
乗車区間:
<span id="span1"></span>
~
<span id="span2"></span>
間
<script>
document.getElementById("stations1").addEventListener("change", function() {
// value値を取得
const str1 = this.value;
document.getElementById("span1").textContent = str1;
});
document.getElementById("stations2").addEventListener("change", function() {
// value値を取得
const str1 = this.value;
document.getElementById("span2").textContent = str1;
});
</script>
上手くいったのは、
function calc() {
var f = document.querySelector('[name=from]').value;
var t = document.querySelector('[name=to]').value;
// 駅間に一致するものを探す
var eki_info = null;
for (var i = 0; i < list.length; i++) {
var eki1 = list[i].name[0];
var eki2 = list[i].name[1];
if ((eki1 == f && eki2 == t) || (eki1 == t && eki2 == f)) {
eki_info = list[i];
break;
}
}
// 運賃情報を取得
var far_info = null;
if (eki_info) {
far_info = customCalc(eki_info.section[0]);
}
// 情報を設定
if (eki_info && far_info) {
document.querySelector('span[name=distance]').innerHTML = eki_info.distance;
// document.querySelector('span[name=section]').innerHTML = far_info.section + '区間';
document.querySelector('span[name=adult]').innerHTML = far_info.adult;
document.querySelector('span[name=child]').innerHTML = far_info.child;
}
}
document.addEventListener('DOMContentLoaded', function () {
document.querySelector('select[name=from]').addEventListener('change', calc);
document.querySelector('select[name=to]').addEventListener('change', calc);
});
function customCalc(section) {
var customFarInfo = null;
// 新しい条件に基づいて運賃情報を探す
if (section.includes("sanyo_nomal")) {
section = section.replace("sanyo_nomal", "jrwest_maintraffic");
}
else if (section.includes("bantan")) {
section = section.replace("bantan", "jrwest_localtraffic");
}
// 該当する運賃情報を取得
for (var i = 0; i < fares.length; i++) {
if (fares[i].section.includes(section)) {
customFarInfo = fares[i];
break;
}
}
return customFarInfo;
}
これが、播但線を含む地方交通線の運賃表で、
function createFaresArray() {
return [
{ section: "jrwest_localtraffic_1", adult: 150, child:80,
commute_company_1: 4620, commute_company_3: 13170, commute_company_6: 22160,
commute_university_1: 2760, commute_university_3: 7830, commute_university_6: 14860,
commute_highschool_1: 1380, commute_highschool_3: 3920, commute_highschool_6: 7430 ];
}
// 関数を呼び出して fares 配列を取得する例:
var fares = createFaresArray();
これが、播但線の駅間に対し、数値を与え、上記の地方交通線の運賃表へ院数を渡すプログラムです。
var list = (list ?? []).concat([
{ name: ["姫路", "京口"], distance: 1.7, section: ["bantan_2"] },
]);
// 既存のリストを渡して、新しいアイテムを追加したリストを取得する例:
var list = []; // 既存のリスト
list = addToItemList(list);
これで、以下の3ファイルで播但線の運賃を参照することはできております。
ところが、山陽本線にあたる、本線の運賃表のプログラムが、
function createFaresArray() {
return [
{ section: "jrwest_maintraffic_1", adult: 150, child:80,
commute_company_1: 4620, commute_company_3: 13170, commute_company_6: 22160,
commute_university_1: 2760, commute_university_3: 7830, commute_university_6: 14860,
commute_highschool_1: 1380, commute_highschool_3: 3920, commute_highschool_6: 7430];
}
// 関数を呼び出して fares 配列を取得する例:
var fares = createFaresArray();
上手く動作しないのです。
以下は、山陽本線の駅間に与えられた数値から、幹線の運賃表へ院数を渡すプログラムです。
var list = (list ?? []).concat([
{ name: ["西明石", "姫路"], distance: 32, section: ["sanyo_nomal_32"] },
{ name: ["加古川", "姫路"], distance: 15.7, section: ["sanyo_nomal_16"]);
// 既存のリストを渡して、新しいアイテムを追加したリストを取得する例:
var list = []; // 既存のリスト
list = addToItemList(list);