-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsample9_BMI.html
134 lines (123 loc) · 5.41 KB
/
sample9_BMI.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<!DOCTYPE html>
<html lang="ja">
<!--
Copyright (C) 2020 浦 公統
Released under the MIT license.
see https://opensource.org/licenses/MIT/
-->
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<title>BMI計算</title>
<style>
table, th, td
{
border: solid 2px;
}
</style>
<script src="./lib/anyCalculatorFramework.js"></script>
<script src="./lib/formatDecimal.js"></script>
<script src="./lib/MathWrapper.js"></script>
<script>
/**
* 初期化
*/
function init()
{
// このHTMLは1個の画面に2つの計算機アプリを表示します。
// 1つ目の計算機アプリの設定
// 入力項目
// 項目名, 入力項目ID, 単位 (省略時は空), 初期値 (省略時は空), 省略可否フラグ (省略時は false)
// 入力項目IDは1個の計算機アプリ内で同じものを重複して使うことはできません
var inputs = [
new itemInput( '身長', 'height', 'cm', null, false ),
new itemInput( '体重', 'weight', 'kg', null, false )
];
// 出力項目
// 項目名, 出力項目ID, 単位 (省略時は空), 小数点以下桁数 (数値ではなく、文字列を出力する場合は -1) (省略時は 3)
// 出力項目IDは1個の計算機アプリ内で同じものを重複して使うことはできません
var outputs = [
new itemOutput( 'BMI', 'BMI', null, 1 ),
new itemOutput( '理想体重', 'bestWeight', 'kg', 1 ),
new itemOutput( '傾向', 'observation', null, -1 )
];
// 計算機アプリのインスタンス生成
// 計算機アプリのID, 入力項目, 出力項目, 計算ボタンのキャプション, 計算コールバック関数, 入力エラーコールバック関数, テキストサイズ (省略時は4)
new anyCalculator( 'BMI', inputs, outputs, 'BMI計算', calcBMI, onError, 5 );
// 2つ目の計算機アプリの設定
// 入力項目
// 項目名, 入力項目ID, 単位 (省略時は空), 初期値 (省略時は空), 省略可否フラグ (省略時は false)
// 入力項目IDは1個の計算機アプリ内で同じものを重複して使うことはできません
inputs = [
new itemInput( '身長', 'height', 'cm', null, false ),
new itemInput( '目標BMI', 'targetBMI', null, 23, false )
];
// 出力項目
// 項目名, 出力項目ID, 単位 (省略時は空), 小数点以下桁数 (数値ではなく、文字列を出力する場合は -1) (省略時は 3)
// 出力項目IDは1個の計算機アプリ内で同じものを重複して使うことはできません
outputs = [
new itemOutput( '目標体重', 'targetWeight', 'kg', 1 )
];
// 計算機アプリのインスタンス生成
// 計算機アプリのID, 入力項目, 出力項目, 計算ボタンのキャプション, 計算コールバック関数, 入力エラーコールバック関数, テキストサイズ (省略時は4)
new anyCalculator( 'targetWeight', inputs, outputs, '目標体重計算', calcTargetWeight, onError, 5 );
}
/**
* 計算コールバック関数 1
* BMI・理想体重を計算
* @note inputs[ '項目名' ] に入力数値が入る (数値が入力されてない項目には NaN が入る)
* outputs[ '項目名' ] に計算結果を入れて関数を終了すること
*/
function calcBMI( inputs, outputs )
{
var threshold = [ 18.5, 22, 23, 25, 30, 35, 40 ]; // 体重の閾値
var observations = [ 'やせ過ぎ', 'やせ気味', '標準的', '理想的', '肥満気味', '肥満(2度)', '肥満(3度)', '肥満(4度)' ];
// 傾向判定
outputs[ 'BMI' ] = inputs[ 'weight' ] / ( inputs[ 'height' ] * inputs[ 'height' ] / 10000.0 );
outputs[ 'bestWeight' ] = 23.0 * ( inputs[ 'height' ] * inputs[ 'height' ] / 10000.0 );
for ( var i = 0; i < threshold.length; i++ )
{
if ( outputs[ 'BMI' ] < threshold[i] )
{
outputs[ 'observation' ] = observations[i];
return;
}
}
outputs[ 'observation' ] = observations[i];
}
/**
* 計算コールバック関数 2
* 目標体重を計算
* @note inputs[ '項目名' ] に入力数値が入る (数値が入力されてない項目には NaN が入る)
* outputs[ '項目名' ] に計算結果を入れて関数を終了すること
*/
function calcTargetWeight( inputs, outputs )
{
outputs[ 'targetWeight' ] = inputs[ 'targetBMI' ] * ( inputs[ 'height' ] * inputs[ 'height' ] / 10000.0 );
}
/**
* 入力エラーコールバック関数
* @param item 入力エラー項目の itemInput オブジェクト
* item.title 項目名
* item.id ID
* item.unit 単位
* item.initValue 初期値
* item.element input 要素
*/
function onError( item )
{
alert( item.title + 'に数値を入力してください' );
item.element.focus();
}
</script>
</head>
<body onload="init();">
<!-- 計算機アプリはこれらの table に表示されます --->
<!-- id を複数使えば、1個のHTML上にいくらでも計算機アプリを配置できます -->
<!-- この table の id と、1つ目の new anyCalculator() の第1引数に、1つ目の計算機アプリのIDを指定します -->
<table id="BMI"></table>
<br>
<!-- この table の id と、2つ目の new anyCalculator() の第1引数に、2つ目の計算機アプリのIDを指定します -->
<table id="targetWeight"></table>
</body>
</html>