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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

2147閲覧

配列の値を各メソッドに読み込ませるには

meroy25

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2017/02/04 09:19

###前提・実現したいこと
たびたびの質問で失礼します。
前回質問し、一部解決したプログラムです。
30人分の国語と英語の試験結果をもとに、各教科の平均点・最低点・最高点を計算し、さらに2つの教科の点数の相関係数、ユークリッド距離を求めるものです。
各メソッドの中に計算式を入れるのですが、そのために点数の合計の値を使う必要があります。
その値をpublic ExamResult(int[] p)の部分から求めています。
###発生している問題・エラーメッセージ
これから各メソッドに計算式を入力するところですが、ExamResultTestクラスに書き込んだ配列の値をそれぞれのメソッドに読み込ませる良い方法が思いつきません。
また、public ExamResult(int[] p)の部分から計算した点数の合計の値も読み込めません。
配列の値、点数の合計を各メソッドに反映させ、計算式を作るにはどうすればよいでしょうか?
皆さんの助言をいただけると幸いです。

・値を返さないコードパスがあります。(Avg,Min,Max,Stdv,Corr,Dist下部)

###該当のソースコード

C#

1 2using System; 3using System.Linq; 4 5 public class ExamResult 6 { 7 8 int[] point; 9 10 public ExamResult(int[] p) 11 { 12 point = new int[p.Length]; 13 14 for (int i = 0; i < p.Length; i++) 15 { 16 point[i] = p[i]; 17 } 18 19 } 20 21 public double Avg() 22 { 23 24 } 25 26 27 public int Min(params int[] point) 28 { 29 30 } 31 public int Max(params int[] point) 32 { 33 34 35 } 36 public double Stdv() 37 { 38 39 40 } 41 public double Corr(ExamResult x) 42 { 43 44 } 45 46 public double Dist(ExamResult x) 47 { 48 49 } 50 51 52 } 53 54 55 56 class ExamResultTest 57 { 58 public static void Main() 59 { 60 ExamResult English = new ExamResult(new int[] { 80, 35, 45, 36, 78, 89, 67, 58, 37, 58, 53, 59, 50, 47, 58, 37, 19, 97, 86, 90, 10, 79, 37, 87, 45, 67, 68, 69, 65, 100 }); 61 ExamResult Japanese = new ExamResult(new int[] { 32, 55, 38, 25, 78, 80, 70, 48, 50, 42, 78, 63, 51, 40, 41, 67, 35, 86, 89, 75, 53, 45, 60, 30, 67, 43, 86, 73, 65, 90 }); 62 Console.WriteLine("英語の平均点は{0},最低点は{1},最高点は{2}",English.Avg(),English.Min(),English.Max()); 63 Console.WriteLine("英語の標準偏差は{0}", English.Stdv()); 64 Console.WriteLine("国語の平均点は{0},最低点は{1},最高点は{2}",Japanese.Avg(), Japanese.Min(), Japanese.Max()); 65 Console.WriteLine("国語の標準偏差は{0}", Japanese.Stdv()); 66 Console.WriteLine("英語と国語の相関係数は{0}",English.Corr(Japanese)); 67 Console.WriteLine("英語と国語のユークリッド距離は{0}", English.Dist(Japanese)); 68 69 70 } 71 }

###試したこと
Avg(平均値)のメソッドをpublic ExamResult(int[] p)の中に含め、p.Length(点数の配列の合計)を反映しようとしたのですが、コンテキストにp.Lengthはない、とエラーが出てしまいました。

###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio2015です。

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

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

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

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

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

guest

回答2

0

ベストアンサー

どこの部分でつまっているのかよくわかりませんが、
やりたいことはわかったので、とりあえず一部書いてみました。

C#

1public class ExamResult 2{ 3 //配列なので気持ち的に名前を複数形にしたい 4 int[] points; 5 6 //合計点 7 //(クラス外から参照する必要がなければprivateなフィールドでも良い) 8 public int Sum { get; private set; } 9 10 public ExamResult(int[] p) 11 { 12 //※↓は配列をコピーしているだけなので 13 // 意図的な理由がなければそのまま代入しても良い 14 //point = new int[p.Length]; 15 // 16 //for (int i = 0; i < p.Length; i++) 17 //{ 18 // point[i] = p[i]; 19 //} 20 points = p; 21 22 //合計点を計算しておく 23 foreach (var point in points) 24 { 25 Sum += point; 26 } 27 } 28 29 public double Avg() 30 { 31 if (points.Length == 0) 32 { 33 return 0; 34 } 35 36 //doubleにキャストしないと小数点以下が落ちてしまう 37 return Sum / (double)points.Length; 38 } 39 40 public int Min() 41 { 42 return points.Min(); 43 } 44 45} 46

気になった点

  • 「p.Length(点数の配列の合計)」と書かれていますが、(ご理解されてるとは思いますが)Lengthは配列の要素数(この場合は人数)であって、合計値ではないです。

  • MinとMaxの引数に (params int[] point) と書かれているのは何を意図したものでしょう?

点数はコンストラクタ( public ExamResult(int[] p) )で受け取って保持しているのでもらう必要がありませんし、
この params というのは「可変長引数」を表すものなので、意図して使う分には良いんですが、何か勘違いされているかなと思いました。

投稿2017/02/05 03:18

oika

総合スコア425

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

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

meroy25

2017/02/06 06:53

参考にさせていただきましたが、私の希望通りのプログラムになりました。 ありがとうございます!
guest

0

コンストラクタでpointに入れているので、これを各メソッドで使用すればいいのではないですか?

C#

1 public double Avg() 2 { 3 return point.Average(); 4 }

こんな感じでいいんですかね?

投稿2017/02/04 10:07

YAmaGNZ

総合スコア10258

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

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

meroy25

2017/02/06 06:53

この方法は思いつきませんでした。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問