2017-01-11 211 views
1

我想要做的是獲得用戶輸入的每行的平均值。我能夠顯示輸入,但不知道如何計算每行中三個數字的平均值。什麼是解決方案?我是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

你可以做這樣的事情

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

這產生我想要的輸出,謝謝!如果我想使用十進制數而不是整數,該怎麼辦? 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);   
    } 
} 

爲您附加的註釋:當您爲多維數組讀取值,使用外循環來讀取行和內環值讀取列。在你的情況下,你實際上是先讀取列,然後獲取列中每一行的值。還有一個,使用float /雙存儲的平均

0

這裏的(大部分)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一些開發;對其他人來說可能看起來很好並且很簡潔。如果您屬於第二組,請使用此代碼。

+0

問題不是要求總和。這是要求平均值。 – Abion47

+0

@ Abion47謝謝!我已經更新了我的答案。 –