Следующий код вычисляет сумму каждой строки 'int[,] a'. Я хочу изменить его, чтобы он вычислял сумму по столбцу; 1+1+1, 2+2+2, 3+3+3, 4+4+4 вместо каждой строки. Эти значения будут помещены внутрь 'int[] output'
static void Main(string[] args)
{
int[,] a = {{ 1, 2, 3, 4},
{ 1, 2, 3, 4},
{ 1, 2, 3, 4} };
int[] b = SumColumn(a);
}
public static int[] SumColumn(int[,] a)
{
int[] output = new int[a.GetLength(1)];
int sum = 0;
for (int i = 0; i < a.GetLength(0); i++)
{
for (int j = 0; j < a.GetLength(1); j++)
{
sum += a[i, j];
}
output[i] = sum;
sum = 0;
}
return output;
}
Итак, я попытался добавить счетчик и использовать логическое значение во вложенном цикле (и другие методы), однако у меня это не сработало.
Обычно рекомендуется перемещать .GetLength
за пределы цикла, так как это сравнительно медленная операция. В данном случае это не имеет значения, но может быть, если вы начнете использовать гораздо большие массивы.
Просто поменяйте местами циклы i
и j
, чтобы сначала выполнить итерацию по столбцам, а затем выполнить итерацию для j-го элемента каждой строки в столбце:
public static int[] SumColumn(int[,] a)
{
int[] output = new int[a.GetLength(1)];
int sum = 0;
for (int j = 0; j < a.GetLength(1); j++)
{
for (int i = 0; i < a.GetLength(0); i++)
{
sum += a[i, j];
}
output[j] = sum;
sum = 0;
}
return output;
}
Эта функция инициализирует массив output
длиной, равной количеству столбцов во входном массиве. Затем он объявляет целочисленную переменную sum
для накопления результата для столбца.
Затем мы используем два вложенных цикла for для перебора строк и столбцов, но используем j
и GetLength(1)
во внешнем цикле для итерации по каждому столбцу, а i
и GetLength(1)
во внутреннем цикле для итерации для каждого j
-го элемента для всех строк. Каждая итерация внутреннего цикла добавляет значение текущей ячейки к sum
.
После суммирования значений во всех строках мы добавляем sum
к текущему индексу output
и сбрасываем его для использования в следующем столбце.
Код практически идентичен в обоих случаях. Только петли переворачиваются
static void Main(string[] args)
{
int[,] a = {{ 1, 2, 3, 4},
{ 1, 2, 3, 4},
{ 1, 2, 3, 4} };
int[] rowSums = RowSums(a);
int[] colSums = ColumnSums(a);
Console.WriteLine($"Row Sums: {string.Join(",", rowSums)}");
Console.WriteLine($"Col Sums: {string.Join(",", colSums)}");
}
public static int[] ColumnSums(int[,] matrix)
{
int rowCount = matrix.GetLength(0);
int colCount = matrix.GetLength(1);
int[] result = new int[colCount];
for (int j = 0; j < colCount; j++)
{
int sum = 0;
for (int i = 0; i < rowCount; i++)
{
sum += matrix[i, j];
}
result[j] = sum;
}
return result;
}
public static int[] RowSums(int[,] matrix)
{
int rowCount = matrix.GetLength(0);
int colCount = matrix.GetLength(1);
int[] result = new int[rowCount];
for (int i = 0; i < rowCount; i++)
{
int sum = 0;
for (int j = 0; j < colCount; j++)
{
sum += matrix[i, j];
}
result[i] = sum;
}
return result;
}
PS. В вашем коде нет необходимости устанавливать sum=0;
в конце внешнего цикла, так как он будет установлен на ноль в начале следующего цикла.
Результат должен быть
Row Sums: 10,10,10
Col Sums: 3,6,9,12
Что-то вроде этого:
public static int[] SumColumn(int[,] array) {
// Do not forget to validate public method arguments
if (array is null)
return null;
// result is an array (an item for each column)
// Note, that result will be filled by 0, so we don't have to use sum variable
int[] result = new int[array.GetLength(1)];
// For each column col
for (int col = 0; col < result.Length; ++col)
for (int row = 0; row < array.GetLength(0); ++row) // ... we sum rows
result[col] += array[row][col];
return result;
}
Вы уже получили ответ, но вам определенно стоит попробовать самостоятельно отладить этот код и увидеть, что вы перепутали итерации по измерениям. Важно знать, как что-то отлаживать.