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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

4回答

1333閲覧

5人のテストの得点から平均値と最大値の算出

homel15k

総合スコア19

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/02/08 03:02

こんにちは。Js初心者のものです。

5人のテストの得点から平均値と最大値の算出するプログラムを作っています。
表示は「○○さんの平均値は○○点」のように人の名前と点数を表示させたいです。
まず、人の名前を配列に入れてnum=parseInt(tokuten);で点数を数値に変換しています。
下のプログラムだと

平均値はNaN点です
最高得点はundefined点でundefinedさんです

となってしまいます。

JavaScript

1<script> 2var people=new Array(5); 3people[0]="山田" 4people[1]="高橋" 5people[2]="田中" 6people[3]="鈴木" 7people[4]="吉田" 8 9sum=0; 10for(i=0;i<5;++i){ 11 tokuten=prompt(people[i]+"さんの点数"); 12 num=parseInt(tokuten); 13 max=num[0]; 14 sum=num[i]+sum; 15 if( max < num[i] ){ 16 max = num[i]; 17 } 18} 19// 平均 20console.log("平均値は"+sum/5+"点です"); 21// 最大値 22console.log("最高得点は"+max+"点で"+people[i]+"さんです"); 23 24</script>

よろしくお願いします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

tokutenを受けたnumをなぜか配列と勘違いされているようです
普通に変数で処理すればよいでしょう

javascript

1<script> 2var people=new Array(5); 3people[0]="山田" 4people[1]="高橋" 5people[2]="田中" 6people[3]="鈴木" 7people[4]="吉田" 8 9sum=0; 10max=0; 11for(i=0;i<5;i++){ 12 tokuten=prompt(people[i]+"さんの点数"); 13 num=parseInt(tokuten); 14 sum+=num; 15 if( max < num ){ 16 max = num; 17 } 18} 19alert("最大="+max+",平均="+sum/5); 20</script>

投稿2018/02/08 03:12

yambejp

総合スコア114829

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

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

homel15k

2018/02/08 03:44

回答ありがとうございます。numを変数にして、if文にmaxPersonName=people[i];を追加したらできました。
guest

0

JavaScript

1var people=new Array(5); 2people[0]="山田" 3people[1]="高橋" 4people[2]="田中" 5people[3]="鈴木" 6people[4]="吉田"

得点はどこ!?!?!?
下記のようにオブジェクトの配列を作ってください。

JavaScript

1var students = [ 2 {name: "山田", points: 80}, 3 {name: "高橋", points: 75}, 4 {name: "田中", points: 85}, 5 {name: "鈴木", points: 100}, 6 {name: "吉田", points: 65} 7];

お小言を言っておくと、peopleは単数形なので1人の人を指します。
複数形にしてください、得点という単語からより正しくはstudentsでは?

maxは名前を使うので人そのものを入れた方が良いでしょう。
5というリテラルな数値は使っては駄目です。array.lengthを利用してください。

"平均値は"+sum/5+"点です"に関しては/の結合が優先度が高いので動作しそうですが、
数値計算の場合は変な動きをすることがあります。
ここは明示的に括弧で括って"平均値は"+(sum/5)+"点です"と記載した方が分かりやすいです。

下記を反映してリファクタリングかけるとこうなりました。

JavaScript

1var students = [ 2 {name: "山田", points: 80}, 3 {name: "高橋", points: 75}, 4 {name: "田中", points: 85}, 5 {name: "鈴木", points: 100}, 6 {name: "吉田", points: 65} 7]; 8var sum = 0; 9var max = {name: "", points: 0}; 10for (var i = 0; i < students.length; i++) { 11 var student = students[i]; 12 sum += student.points; 13 if (max.points < student.points) { 14 max = student; 15 } 16} 17// 平均 18console.log("平均値は" + (sum / students.length) + "点です"); 19// 最大値 20console.log("最高得点は" + max.points + "点で" + max.name + "さんです");

【おまけ】 Lodashによるスタイリッシュな解決法

Lodashというライブラリはこういったオブジェクトの配列を計算するのが超得意です。
平均得点も最高得点もたったの1行です。
この為にオブジェクトの配列にしろと言ったといっても過言ではありません。

下記のコードをhttps://codepen.io/travist/full/jrBjBz/に貼り付けて結果を確認してみてください

JavaScript

1var students = [ 2 {name: "山田", points: 80}, 3 {name: "高橋", points: 75}, 4 {name: "田中", points: 85}, 5 {name: "鈴木", points: 100}, 6 {name: "吉田", points: 65} 7]; 8var avg = _.meanBy(students, function(it){ return it.points }); 9var max = _.maxBy(students, function(it){ return it.points }); 10 11result = {avg: avg, max: max};

JSON

1{ 2 "avg": 81, 3 "max": { 4 "name": "鈴木", 5 "points": 100 6 } 7}

投稿2018/02/08 03:30

編集2018/02/08 03:50
miyabi-sun

総合スコア21158

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

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

homel15k

2018/02/08 03:46

詳しい回答ありがとうございます!参考になりました。
guest

0

いくつか問題があります。

num=parseInt(tokuten);

max=num[0];
sum=num[i]+sum;

変数numは配列ではありませんので添字でアクセスできません。

console.log("最高得点は"+max+"点で"+people[i]+"さんです");

変数iはforループの中でしか使えません。[変数のスコープ]について学習してください。

javascript

1<script> 2var people=new Array(5); 3people[0]="山田" 4people[1]="高橋" 5people[2]="田中" 6people[3]="鈴木" 7people[4]="吉田" 8 9sum=0; // 合計得点 10max=0; // 最高得点 11maxPersonName="名無し" // 最高点を取った人の名前 12tokutenArray = []; // 得点を保存する配列 13for(i=0;i<people.length;++i){ 14 tokuten=prompt(people[i]+"さんの点数"); 15 num=parseInt(tokuten); 16 tokutenArray.push(num); // このプログラムでは使ってないですが、結果を保存したいときはこのように配列にデータを追加します 17 sum = sum + num; 18 if( num > max ) 19 { 20 max = num; 21 maxPersonName = people[i]; 22 } 23} 24// 平均 25alert("平均値は"+sum/5+"点です"); 26// 最大値 27alert("最高得点は"+max+"点で"+maxPersonName+"さんです"); 28</script>

投稿2018/02/08 03:25

mtdsnsk

総合スコア789

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

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

homel15k

2018/02/08 03:45

回答ありがとうございます。変数のスコープをもう一度復讐したいと思います。
guest

0

js

1var sum=0; 2var nums=[]; 3for(i=0;i<5;++i){ 4 tokuten=prompt(people[i]+"さんの点数"); 5 nums[i]=parseInt(tokuten); 6 sum+=nums[i]; 7} 8var max=Math.max.apply({},nums); 9var max_people=people[people.indexOf(max)];

投稿2018/02/08 03:25

KazuhiroHatano

総合スコア7804

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問