2017-01-11 9 views
1

私がしたいことは、ユーザーが入力した各行の平均を取得することです。入力を表示することはできますが、各行の3つの数値の平均を計算する方法はわかりません。解決策は何でしょうか?私はまだC#に慣れていないので、まだ学習しています。ここで多次元配列の各行の平均を計算する方法

は私のコードです:

class Program 
    { 
     static void Main(string[] args) 
     { 
      int[,] number = new int[3, 5]; 
      for (int i = 0; i < 3; i++) 
      { 
       for (int x = 0; x < 3; x++) 
       { 
        Console.WriteLine("Please enter number"); 
        number[x, i] = int.Parse(Console.ReadLine()); 
       } 
      } 

      for (int i = 0; i < 3; i++) 
      { 
       for (int x = 0; x < 3; x++) 
       { 
        Console.Write(number[x, i] + " "); 
       } 
       Console.WriteLine(" "); 
       Console.ReadLine(); 
      } 
     } 
    } 

答えて

0

あなたはそれを入力として、2次元配列を受け入れます、私はあなたが以下のようなメソッドを作成するために持っていると思う。この

for(int i = 0; i < 3; i++) 
{ 
    int Avg = 0; 
    for(int x = 0; x < 3; x++) 
    { 
     Console.Write(number[x, i] + " "); 
     Avg += number[x, i]; 
    } 
    Avg = Avg/3; 
    Console.Write("Average is" + Avg); 
    Console.WriteLine(" "); 
    Console.ReadLine(); 
} 
+0

これは、私が欲しい、おかげで出力を生成します!整数の代わりに10進数を使用したい場合はどうすればよいですか? Doubleは使用する正しいデータ型ですか?そして、どうすればそれについて行くのですか? – Rengaw

+0

小数点はどういう意味ですか?数字の範囲は何ですか? – Gilad

+0

私は考えています:多次元配列を反復処理するときは、最初に行を反復してから各行の列を移動する必要があります。逆順でこれを実行します。 –

1

ような何かを、行うことができますその行を反復処理し、さらに各行のすべての要素の合計を見つけるためにその列を繰り返し実行します。次に、平均を得るために列の数で分割されます。あなたは多次元配列の値を読んでいるときに、列を読み取るために、行と内側のループの値を読み取るために、外側のループを使用します。あなたのための方法

public static void rowWiseAvg(int[,] inputArray) 
{ 
    int rows = inputArray.GetLength(0); 
    int cols = inputArray.GetLength(1); 

    for (int i = 0; i < rows; i++) 
    { 
     float rowAvg = 0; 
     for (int x = 0; x < cols; x++) 
     {     
      rowAvg += inputArray[i,x]; 
     } 
     rowAvg = rowAvg/cols; 
     Console.Write("Average of row {0} is :{1}", i,rowAvg);   
    } 
} 

に追加のノートを見てください。あなたが実際に列を読み取った後、列の各行の値を取得します。もう一つ、ここでは平均

0

を保存するために、二重float /を使用するには、(主に)LINQのソリューションです:

var array = new int[,] 
{ 
    { 1, 2, 3, 4 }, 
    { 5, 6, 7, 8 }, 
    { 9, 10, 11, 12 } 
}; 

int count = 0; 
var averages = array.Cast<int>() 
        .GroupBy(x => count++/array.GetLength(1)) 
        .Select(g => g.Average()) 
        .ToArray(); 

// [2.5, 6.5, 10.5] 
0

最も簡単な方法は、他の回答で説明したように、forループを使用することです。
また、LINQを使用して別の方法で作ることEnumerable.Rangeを使用することができます。

public static class MultidimensionalIntArrayExtensions 
{ 
    // Approach 1 (using Select and Average) 
    public static double[] RowAverages(this int[,] arr) 
    { 
     int rows = arr.GetLength(0); 
     int cols = arr.GetLength(1); 

     return Enumerable.Range(0, rows) 
      .Select(row => Enumerable 
       .Range(0, cols) 
       .Select(col => arr[row, col]) 
       .Average()) 
      .ToArray(); 
    } 

    // Approach 2 (using Aggregate) 
    public static double[] RowAverages(this int[,] arr) 
    { 
     int rows = arr.GetLength(0); 
     int cols = arr.GetLength(1); 

     return Enumerable.Range(0, rows) 
      .Select(row => Enumerable 
       .Range(0, cols) 
       .Aggregate(0.0, (avg, col) => avg + ((double)arr[row, col]/cols))) 
      .ToArray(); 
    } 
} 

// Usage: 
int[,] arr = 
{ 
    { 1, 2, 3 }, 
    { 2, 3, 4 }, 
    { 3, 4, 5 }, 
    { 6, 7, 8 }, 
    { 1, 1, 1 } 
}; 

double[] rowSums = arr.RowAverages(); // [2, 3, 4, 7, 1.3333] 

このコードでは、一部の開発者のための読めないと非OOP見えるかもしれません。他人のために良いといたずらに見えるかもしれません。あなたが第2のグループに所属している場合は、このコードを使用してください。

+0

質問は合計を求めていません。それは平均を求めている。 – Abion47

+0

@ Abion47ありがとう!私は私の答えを更新しました。 –

関連する問題