回答編集履歴

2 おまけ追加

miyabi-sun

miyabi-sun score 17999

2019/04/11 20:39  投稿

ここでのポイントは「関数を情報の加工として使おう」ということです。
プログラミングの鉄則は
- input
- processing
- output
です。
まずは各種関数を作りましょう。
最後のachievementは平均点がn点以上かの条件に従ってA〜Dの文字列を返す
平均点を求める為に`avg`関数を用意
平均は`合計 / 数`で求められるので合計を返す関数を用意
関数実行時にreturnを見つけるとそこで関数から逃げてしまうので、
`else if`で延々つなげるよりは、ifにした方がタイプ数も減りますのでコードが若干読みやすくなります。
```JavaScript
// 合計を返す関数
function sum (points) {
 let sum = 0;
 for (let i = 0; i < points.length; i++) {
   sum += points[i];
 }
 return sum;
}
// 平均点を返す関数
function avg (points) {
 return sum(points) / points.length;
}
// 結果を返す関数
function achievement (points) {
 var a = avg(points);
 // 確実に1行で終わるケースならこれでいい
 if (a >= 80) return "A";
 if (a >= 60) return "B";
 if (a >= 40) return "C";
 return "D";
}
```
こんなの一瞬で用意出来ますね。
ではメインの処理を作りましょう。
```JavaScript
function score_indicate(){
 // 既存のコードでも全然悪くないけど
 // ちょっと洒落た作り方でsubject_pointsを作ってみる
 let subject_points = ['national_language', 'english', 'mathematics', 'science', 'society'].map(function(id){
   return parseInt($('#'+id).val();
 const subject_points = ['national_language', 'english', 'mathematics', 'science', 'society'].map(function(id){
   return parseInt($('#'+id).val());
 });
 // 結果を出力
 $("#sum_indicate").text(sum(subject_points));
 $('#avarage_indicate').text(avg(subject_points));
 $('#evaluation').text(achievement(subject_points));
};
```
まぁ、ピラミッドのように何度もsum関数を叩いているので実行速度は多少落ちますが、
5個の数値を合計する程度のことしかやっていないので、誤差みたいなものでしょう。
一気に計算しようと頑張ると辛くなります。
一気に計算しようと頑張ると辛くなります。
---
蛇足のおまけ
letを使っているということはIE11対応しなくて良いんでしょうか?
ならばES2015の書き方が出来ますね。
もし私がガチで作るならこんな感じになるでしょう。
数値の配列から合計を求めるのは1行のイディオムで可能ですので、
achievementが求めるものを平均点に変更して割り出します。
```JavaScript
function achievement (avg) {
 if (avg >= 80) return "A";
 if (avg >= 60) return "B";
 if (avg >= 40) return "C";
 return "D";
}
function score_indicate(){
 const points = ['national_language', 'english', 'mathematics', 'science', 'society'].map(id => parseInt($('#'+id).val()));
 const sum = points.reduce((a, b) => a + b, 0);
 const avg = sum / points.length;
 $("#sum_indicate").text(sum);
 $('#avarage_indicate').text(avg);
 $('#evaluation').text(achievement(avg));
}
```
もっと頑張ればまだまだ行数やコード量は減らせると思いますが、
可読性が犠牲になると思うのでこれが一つの完成系じゃないかなぁと思います。
1 if文の中身を修正

miyabi-sun

miyabi-sun score 17999

2019/04/11 20:30  投稿

ここでのポイントは「関数を情報の加工として使おう」ということです。
プログラミングの鉄則は
- input
- processing
- output
です。
まずは各種関数を作りましょう。
最後のachievementは平均点がn点以上かの条件に従ってA〜Dの文字列を返す
平均点を求める為に`avg`関数を用意
平均は`合計 / 数`で求められるので合計を返す関数を用意
関数実行時にreturnを見つけるとそこで関数から逃げてしまうので、
`else if`で延々つなげるよりは、ifにした方がタイプ数も減りますのでコードが若干読みやすくなります。
```JavaScript
// 合計を返す関数
function sum (points) {
 let sum = 0;
 for (let i = 0; i < points.length; i++) {
   sum += points[i];
 }
 return sum;
}
// 平均点を返す関数
function avg (points) {
 return sum(points) / points.length;
}
// 結果を返す関数
function achievement (points) {
 var a = avg(points);
 if (a >= 80) {
   return "A";
 }
 if (a >= 60) {
   return "B";
 }
 if (a >= 40) {
   return "C";
 }
 // 確実に1行で終わるケースならこれでいい
 if (a >= 80) return "A";
 if (a >= 60) return "B";
 if (a >= 40) return "C";
 return "D";
}
```
こんなの一瞬で用意出来ますね。
ではメインの処理を作りましょう。
```JavaScript
function score_indicate(){
 // 既存のコードでも全然悪くないけど
 // ちょっと洒落た作り方でsubject_pointsを作ってみる
 let subject_points = ['national_language', 'english', 'mathematics', 'science', 'society'].map(function(id){
   return parseInt($('#'+id).val();
 });
 // 結果を出力
 $("#sum_indicate").text(sum(subject_points));
 $('#avarage_indicate').text(avg(subject_points));
 $('#evaluation').text(achievement(subject_points));
};
```
まぁ、ピラミッドのように何度もsum関数を叩いているので実行速度は多少落ちますが、
5個の数値を合計する程度のことしかやっていないので、誤差みたいなものでしょう。
一気に計算しようと頑張ると辛くなります。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る