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

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

ただいまの
回答率

88.77%

コードを見ていただきたいです。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 786
$(document).ready(function(){  
  function score_indicate(){
    // このような記述をすることで、subject_pointsという変数の中に
    // [国語の点数,英語の点数,数学の点数,理科の点数,社会の点数]という配列を作成できる。
    let subject_points = [Number($('#national_language').val()),
                          Number($('#english').val()),
                          Number($('#mathematics').val()),
                          Number($('#science').val()),
                          Number($('#society').val())
                          ];

    // さらにこのような記述をすることで、「合計点:」となっている右の部分に合計点が出力される
    let sum = subject_points[0];
    sum = sum + subject_points[1];
    sum = sum + subject_points[2];
    sum = sum + subject_points[3];
    sum = sum + subject_points[4];
    $("#sum_indicate").text(sum);

    // ここに、上記を参考にして平均点を出力する処理を書き込む
    let num = subject_points.length;
    let average = (sum/num);
    $('#avarage_indicate').text(average);
  };
  function get_achievement(){
    // ここに、ランクの値の文字列(平均点が80点以上なら"A"、60点以上なら"B"、40点以上なら"C"、それ以下なら"D")を出力する処理を書き込む
    let sum =0;
    let num =subject_points.length;
    for(let i=0; i<num; i++) {
      sum += subject_points[i];
    }
    if (sum >= num*0.8*100) {
      // return "A";
      $('#evaluation').text("A");//このHTMLのidに表示させたいです。
    }
    else if (sum >= num*0.6*100) {
      return "B";
    }
    else if (sum >= num*0.4*100) {
      return "C";
    }
    else {
      return "D";
    }
  };

function get_achievement()から下がうまくかけません。

console.logで引数を渡してこのコードを成立させるにはどうしたらいいのか?
戻り値で$('#evaluation').text("A")に表示させたい場合はどのようにかけばいいのか?
私が的外れなやり方をしているのが原因だと思うので、質問を無視してコードを直して動くようにしていただいても結構です。
よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

ここでのポイントは「関数を情報の加工として使おう」ということです。

プログラミングの鉄則は

  • input
  • processing
  • output

です。
まずは各種関数を作りましょう。

最後のachievementは平均点がn点以上かの条件に従ってA〜Dの文字列を返す
平均点を求める為にavg関数を用意
平均は合計 / 数で求められるので合計を返す関数を用意

関数実行時にreturnを見つけるとそこで関数から逃げてしまうので、
else ifで延々つなげるよりは、ifにした方がタイプ数も減りますのでコードが若干読みやすくなります。

// 合計を返す関数
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";
}

こんなの一瞬で用意出来ますね。
ではメインの処理を作りましょう。

function score_indicate(){
  // 既存のコードでも全然悪くないけど
  // ちょっと洒落た作り方でsubject_pointsを作ってみる
  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が求めるものを平均点に変更して割り出します。

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));
}

もっと頑張ればまだまだ行数やコード量は減らせると思いますが、
可読性が犠牲になると思うのでこれが一つの完成系じゃないかなぁと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/11 20:42

    ありがとうございます。
    本当に助かりました。

    キャンセル

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

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る