質問編集履歴

1 補足説明

meroy25

meroy25 score 13

2017/02/06 16:58  投稿

2つの配列の相関係数、ユークリッド距離の計算
###前提・実現したいこと
何度も質問してしまって申し訳ありません。
前回質問したプログラムのソースコードを、ご回答をもとに改良しました。
30人分の国語と英語の試験結果をもとに、各教科の平均点・最低点・最高点を計算し、さらに2つの教科の点数の相関係数、ユークリッド距離を求めるプログラムです。
各メソッドに計算式を当てはめることはできました。
###発生している問題・エラーメッセージ
foreach文を使って、
Corrメソッド(相関係数)では相関係数を導くために必要な値を
Distメソッド(ユークリッド距離)では偏差平方和を求めたいと思っています。
そのためには、入力した2つの配列(要素数30)を読み込まなければなりません。
しかし、それぞれ`foreach`の下部に以下のようなエラーが出てしまいます。
正常に計算させるためにはどのような文にすればよいでしょうか。
ご助言いただけると幸いです。
```
型'int' を 'int[]'に変換できません。
```
###該当のソースコード
```C#
public class ExamResult
   {
       int[] points;
       public int Sum { get; private set; }
       public ExamResult(int[] p)
       {
           points = new int[p.Length];
           for (int i = 0; i < p.Length; i++)
           {
               points[i] = p[i];
           }
           points = p;
           foreach (var point in points)
           {
               Sum += point;
           }
       }
       public double Avg()
       {
           if (points.Length==0)
           {
               return 0;
           }
           return Sum / (double)points.Length;
       }
       public int Min()
       {
           return points.Min();
       }
       public int Max()
       {
           return points.Max();
       }
       public double Stdv()
       {
           double sum2 = 0;
           double mean = Sum/points.Length;
           foreach (int i in points)
           {
               sum2 += Math.Pow(i-mean, 2);
           }
           double variance = sum2/points.Length;
           return Math.Sqrt(variance);
       }
       public double Corr(ExamResult x)
       {
           if (points.Length <= 2) throw new ArgumentException("points.Length <= 2");
           int sumx, sumy, sumxx, sumxy, sumyy;
           sumx = sumy = sumxx = sumxy = sumyy = 0;
           foreach (int[] d in points)
           {
               sumx += d[0];
               sumy += d[1];
               sumxx += d[0] * d[0];
               sumxy += d[0] * d[1];
               sumyy += d[1] * d[1];
           }
           var r = Math.Sqrt((points.Length * sumxx - sumx * sumx) * (points.Length * sumyy - sumy * sumy));
           return (points.Length * sumxy - sumx * sumy) / (r != 0 ? r : 1);
           return (points.Length * sumxy - sumx * sumy) / (r != 0 ? r : 1);//相関係数
       }
       public double Dist(ExamResult x)
       {
           int sumx, sumy;
           sumx = sumy = 0;
           foreach(int[] d in points)
           {
               sumx += d[0];
               sumy += d[1];
           }
           double devsq =Math.Pow(sumx-sumy,2);
           return Math.Sqrt(devsq);
           double devsq =Math.Pow(sumx-sumy,2);//偏差平方和
           return Math.Sqrt(devsq);//ユークリッド距離
       }
   
   }
     
   class ExamResultTest
   {
    public static void Main()
   {
       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 });
       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 });
       Console.WriteLine("英語の平均点は{0},最低点は{1},最高点は{2}",English.Avg(),English.Min(),English.Max());
       Console.WriteLine("英語の標準偏差は{0}", English.Stdv());
       Console.WriteLine("国語の平均点は{0},最低点は{1},最高点は{2}",Japanese.Avg(), Japanese.Min(), Japanese.Max());
       Console.WriteLine("国語の標準偏差は{0}", Japanese.Stdv());
       Console.WriteLine("英語と国語の相関係数は{0}",English.Corr(Japanese));
       Console.WriteLine("英語と国語のユークリッド距離は{0}", English.Dist(Japanese));
    }
   }
```
###試したこと
CorrメソッドとDistメソッドの`int[]`部分を`int`に変更してみましたが、そうするとforeachの中の文が成立しませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio2015です。
Visual Studio2015です。
  • C#

    13443 questions

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

  • Visual Studio

    3649 questions

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

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