質問するログイン新規登録

Q&A

解決済

1回答

2281閲覧

コマンドライン引数から偏差値を求めたい

CarpeDiemnosiru

総合スコア4

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2020/07/09 10:50

編集2020/07/09 13:40

0

1

前提・実現したいこと

コマンドライン引数から成績を処理するコードをつくっているのですが、結果が模範解答とあいません。
平均値はあっているのですが、標準偏差がどうしてもあいません。
解決方法を教えてください。お願いします。
ちなみにコマンドライン引数は以下の通りです。
「Anne 100 Glbert 99 Diana 60 Emily 89 Bryce 79 Jane 74 Kilmeny 42 Marigold 64」

該当のソースコード

java

1package hello; 2 3public class Seiseki2 { 4 5 public static void main(String[] args) { 6 7 int i = 0; 8 double sum = 0; 9 double average = 0; 10 double sd = 0; 11     double ssum = 0; 12 13 String names[] = new String[args.length/2]; 14 double score[][] = new double[2][args.length/2]; 15 16 for(i = 0; i < args.length; i += 2 ) { 17 names[i/2] = args[i]; 18 score[0][i/2] = Double.parseDouble(args[i + 1]); 19 sum += score[0][i/2]; 20 21 }for(i = 0; i < args.length/2; i ++ ) { 22 average = sum / (args.length/2); 23 ssum += sqr(score[0][i] - average); 24 sd = Math.sqrt(ssum / (args.length/2)); 25 double hensachi = 50 + ((score[0][i] - average)/sd )* 10; 26 score[1][i] = hensachi; 27 28 } System.out.println("Average = " + average); 29 System.out.println("Standard Deviation = " + sd); 30 for(i = 0; i < args.length/2; i ++) { 31 32 double scoreX = score[0][i]; 33 String s = new java.text.DecimalFormat("0.#").format(scoreX ); 34 double scoreY = score[1][i]; 35 String ss = new java.text.DecimalFormat("0.#").format(scoreY); 36 37 System.out.print(" " + names[i] + " "); 38 System.out.print(s + " "); 39 System.out.println(ss); 40 41 } 42 43 } 44 45 private static double sqr(double d) { 46 return d * d; 47 } 48 49 50} 51 52 53 54

結果は以下の通りになります。
Average = 75.875
Standard Deviation = 4.198446513295126
Anne 100 78.3
Glbert 99 78.3
Diana 60 21.7
Emily 89 78.3
Bryce 79 78.3
Jane 74 21.7
Kilmeny 42 21.7
Marigold 64 21.7

補足情報

最終的な形は以下の通りにしたいと思っています。

Average = 75.9
Standard Deviation = 18.85
Anne 100 62.8
Glbert 99 62.3
Diana 60 41.6
Emily 89 57.0
Bryce 79 51.7
Jane 74 49.0
Kilmeny 42 32.0
Marigold 64 43.7
###追記

Java

1package hello; 2 3public class Seiseki2 { 4 5 public static void main(String[] args) { 6 7 int i = 0; 8 double sum = 0; 9 double average = 0; 10 double sd = 0; 11 double ssum = 0; 12 13 String names[] = new String[args.length/2]; 14 double score[][] = new double[2][args.length/2]; 15 16 for(i = 0; i < args.length; i += 2 ) { 17 names[i/2] = args[i]; 18 score[0][i/2] = Double.parseDouble(args[i + 1]); 19 sum += score[0][i/2]; 20 21 }for(i = 0; i < args.length/2; i ++ ) { 22 average = sum / (args.length/2); 23 ssum += sqr(score[0][i] - average); 24 25 }for(i = 0; i < args.length/2; i ++ ) { 26 sd = Math.sqrt(ssum / (args.length/2)); 27 }for(i = 0; i < args.length/2; i ++ ) { 28 double hensachi = 50 + ((score[0][i] - average)/sd )* 10; 29 score[1][i] = hensachi; 30 31 } System.out.println("Average = " + average); 32 System.out.println("Standard Deviation = " + sd); 33 for(i = 0; i < args.length/2; i ++) { 34 35 double scoreX = score[0][i]; 36 String s = new java.text.DecimalFormat("0.#").format(scoreX ); 37 double scoreY = score[1][i]; 38 String ss = new java.text.DecimalFormat("0.#").format(scoreY); 39 40 System.out.print(" " + names[i] + " "); 41 System.out.print(s + " "); 42 System.out.println(ss); 43 44 } 45 46 } 47 48 private static double sqr(double d) { 49 return d * d; 50 } 51 52} 53

解決しました。ありがとうございます。
結果は以下の通りになりました。
Average = 75.875
Standard Deviation = 18.850978091335207
Anne 100 62.8
Glbert 99 62.3
Diana 60 41.6
Emily 89 57
Bryce 79 51.7
Jane 74 49
Kilmeny 42 32
Marigold 64 43.7

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

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

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

cateye

2020/07/09 11:52 編集

前の質問でも言ったと思いますが、インデントをちゃんと付けましょう。(IDEを使っているならフォーマットしましょう) また、“合計を求める、平均を出す、分散を求める、標準偏差を求める”は、別の処理と考えて『分散を求める』時はそれのみに集中してコードを書きましょう。・・・“平均値はあっている”のなら、分散と標準偏差の算出に問題が有るのでしょう?・・・前の質問は『削除依頼』をして下さい。
guest

回答1

0

ベストアンサー

標準偏差が違うということは、sd が想定の値になっていないということで
sdの算出をしてるところを確認します。

java

1for(i = 0; i < args.length/2; i ++ ) { 2 average = sum / (args.length/2); 3 double ssum = 0; 4 ssum += sqr(score[0][i] - average); 5 sd = Math.sqrt(ssum / (args.length/2)); 6 double hensachi = 50 + ((score[0][i] - average)/sd )* 10; 7 score[1][i] = hensachi; 8}

sdは、ssumとargs.length/2 で算出してますが、args.length/2は、固定になるので
ssumが違うのだろうと想像ができます。

で、結論いうと

java

1for(i = 0; i < args.length/2; i ++ ) { 2// average = sum / (args.length/2); 3 double ssum = 0; 4// ssum += sqr(score[0][i] - average); 5// sd = Math.sqrt(ssum / (args.length/2)); 6// double hensachi = 50 + ((score[0][i] - average)/sd )* 10; 7// score[1][i] = hensachi; 8}

ssumがループを回るたびに0になっているので、合計になっていません。

投稿2020/07/09 11:13

momon-ga

総合スコア4828

CarpeDiemnosiru

2020/07/09 11:29

何度もありがとうございます。double ssum = 0;をforループの外に出しました。ですが、結果が変わりません。正直辛いです。
退会済みユーザー

退会済みユーザー

2020/07/09 11:39

そもそも放棄された前スレで 標準入力から読み込む方式のプログラムを書いてあげたのに追加で別に立て直すとか答えだけが欲しい模様
cateye

2020/07/09 12:03 編集

誤記のため削除・m(_"_)m
Daregada

2020/07/09 11:56

いや、訂正された現在のソースコードで動かすと、「Standard Deviation = 18.850978091335207」と求める値になってるよ。
momon-ga

2020/07/09 11:59 編集

答えが欲しいなら、asahina1979さんのソースをコピッて変数名の定義と最初のループ変えるだけで解決するので、自前でがんばるのかなぁと思っていたのですが。 この回答も、調べ方(おかしいところの推測)を書いているので、自力でいけるのでは? と思っています。
cateye

2020/07/09 12:04 編集

ありゃ・・・失礼しました。 って、     double ssum = 0;の前に全角の空白が・・・ で、結果↓ run: Average = 75.875 Standard Deviation = 18.850978091335207 Anne 100 78.3 Glbert 99 69.6 Diana 60 37.9 Emily 89 59.5 Bryce 79 52.2 Jane 74 48.7 Kilmeny 42 31.6 Marigold 64 43.7 BUILD SUCCESSFUL (total time: 0 seconds)
Daregada

2020/07/09 12:03

ああ、全角空白は無意識で削除していた。 それより、「args.length / 2」を長期に渡って引っ張るのがいやだな。早めに「total」とかそんな感じの変数に代入してしまいたい。
momon-ga

2020/07/09 12:07

cateyeさん> お、動いてそうですね。あとは四捨五入かなぁ(わからんけど) Daregada さん> わかる。でも、いろいろ指摘すると混乱しそうなので、そっとしておきましょう。 Seiseki1のソースでは n という変数にいれてたのですが。なぜか退化した。
cateye

2020/07/09 12:19

各個人の偏差値が合ってないようですが?・・・
CarpeDiemnosiru

2020/07/09 12:37

動きました。本当に申し訳ありません。自分は初心者のくせに自己流だし、答えだけ欲しがるクズです。 次に質問を出すときはプログラミングについての学習をもう一度最初から勉強しなおしてから、出したいと思います。反応してくださった方々のお手を煩わせてしまったこと、お詫び申し上げます。
Daregada

2020/07/09 12:47

> 各個人の偏差値が合ってないようですが?・・・ なにしろ、ssumとsdとhensachiを一度のループで求めようとしているので。
Daregada

2020/07/09 12:53

なので、終わりに近づくほど正解に近い値が出ている。
cateye

2020/07/09 13:37 編集

”あれもこれも、一緒に考えないように”って言ってんだけどなぁw
退会済みユーザー

退会済みユーザー

2020/07/09 15:08

配列の作り方以外まんま答え書いたのにこの質問ができた不思議 @cateye
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問