C#. Передача массивов в методы. Примеры передачи массивов базовых типов. Передача массивов структур, классов, перечислений в методы. Передача двумерных массивов в методы. Возврат массива из метода




Передача массивов в методы по значению. Примеры передачи массивов базовых типов. Передача массивов структур, классов, перечислений в методы. Передача двумерных массивов в методы. Возврат массива из метода


В данной теме демонстрируется передача по значению массивов разных типов и размерностей.


Содержание


Поиск на других ресурсах:

1. Как передать массив в метод? Какая общая форма передачи одномерного массива в метод?

Общая форма передачи одномерного массива в метод имеет следующий вид:

access return_type MethodName(type[] parameterName)
{
  // ...
}

где

  • access – модификатор доступа (public, protected, private);
  • return_type – тип, возвращаемый методом;
  • MethodName – название метода;
  • type – тип массива, который передается в метод;
  • parameterName – название массива, который есть формальным параметром метода MethodName.

 

2. Пример передачи массива целых (ulong) чисел в метод

В примере продемонстрирован метод ReverseArray, который реверсирует массив чисел типа ulong. Метод получает параметром массив items типа ulong.

// метод, который получает массив items и реверсирует его
public void ReverseArray(ulong[] items)
{
  ulong t;

  // реверсирование массива
  for (int i = 0; i < items.Length / 2; i++)
  {
    t = items[i];
    items[i] = items[items.Length - i - 1];
    items[items.Length - i - 1] = t;
  }

  return;
}

Использование метода в другом программном коде может быть следующим:

ulong[] Array = { 2, 3, 1, 2, 8, 5, 6, 100 };
ReverseArray(Array); // Array = { 100, 6, 5, 8, 2, 1, 3, 2 }

 

3. Пример передачи в метод массива чисел типа double

Реализован метод, который получает массив чисел типа double в качестве параметра. Метод возвращает сумму элементов массива.

static public double SumDoubleArray(double[] items)
{
  double sum = 0;
  for (int i = 0; i < items.Length; i++)
    sum += items[i];
  return sum;
}

Использование метода в другом программном коде может быть следующим:

double[] Array = { 3.3, 2.2, 1.1, 7.7, 8.8 };
double sum;
sum = SumDoubleArray(Array); // sum = 23.1

 

4. Пример передачи одномерного массива структур в метод

Задана структура Country, описывающая информацию о стране

// структура, которая содержит информацию о стране
struct Country
{
  public string Name; // название страны
  public ulong Population; // население
  public string Capital; // название столицы
  public double Area; // площадь, в квадратных километрах
}

Реализация метода MaxPopulation(), определяющего страну, с наибольшим населением. Метод получает массив структур Country.

// метод, получающий массив структур типа Country
// метод возвращает структуру, которая содержит информацию о стране с наибольшим населением
public Country MaxPopulation(Country[] countries)
{
  int i;
  int numMax;
  double maxPopulation;

  if (countries.Length == 0)
  {
    Console.WriteLine("Не задан перечень стран");
    return new Country();
  }

  maxPopulation = countries[0].Population;
  numMax = 0;

  //
  for (i = 1; i < countries.Length; i++)
    if (countries[i].Population > maxPopulation)
    {
      maxPopulation = countries[i].Population;
      numMax = i;
    }

  return countries[numMax];
}

Демонстрация вызова метода MaxPopulation() из другого программного кода

Country[] countries = new Country[3]; // выделить память для трех структур типа Country
Country cn;

countries[0].Name = "Ghana";
countries[0].Capital = "Accra";
countries[0].Area = 238537.0;
countries[0].Population = 25199609;

countries[1].Name = "Republic of South Africa";
countries[1].Capital = "Pretoria";
countries[1].Population = 54956900;
countries[1].Area = 1219912.0;

countries[2].Name = "Madagascar";
countries[2].Capital = "Antananarivo";
countries[2].Population = 23812681;
countries[2].Area = 587041.0;

// вызов метода MaxPopulation(), передача массива структур в метод
cn = MaxPopulation(countries); // cn.Name = "Republic of South Africa"

 

5. Пример передачи одномерного массива классов в метод

Задан класс Cylinder, реализующий цилиндр

// класс, который реализует цилиндр
class Cylinder
{
  double r;
  double h;

  // конструкторы
  public Cylinder()
  {
    r = 1; h = 1;
  }

  public Cylinder(double _r, double _h)
  {
    r = _r;
    h = _h;
  }

  // методы доступа
  public void Set(double _r, double _h)
  {
    r = _r;
    h = _h;
  }

  public void Get(out double _r, out double _h)
  {
    _r = r;
    _h = h;
  }

  // метод, который определяет объем цилиндра
  public double Volume()
  {
    return 3.1415 * r * r * h;
  }
}

Реализация метода GetMaxVolumeCylinder, получающего массив Cylinders. Метод возвращает порядковый номер элемента массива (цилиндра), который имеет наибольший объем

// метод, который получает массив классов типа Cylinder и определяет номер цилиндра с наибольшим объемом
static int GetMaxVolumeCylinder(Cylinder[] cylinders)
{
  double maxV = cylinders[0].Volume();
  int maxN = 0;

  for (int i=1; i<cylinders.Length; i++)
    if (maxV < cylinders[i].Volume())
    {
      maxV = cylinders[i].Volume();
      maxN = i;
    }
  return maxN;
}

Использование метода GetMaxVolumeCylinder() в другом методе

Cylinder[] cl; // ссылка на массив классов типа Cylinder
cl = new Cylinder[3]; // выделение памяти для 3 ссылок на тип Cylinder

// выделить память для каждого элемента массива типа Cylinder
for (int i = 0; i < cl.Length; i++)
  cl[i] = new Cylinder();

//
cl[0].Set(2, 3.5);
cl[1].Set(1.5, 2.8);
cl[2].Set(3, 4.4);

int num = GetMaxVolumeCylinder(cl); // num = 2

 

6. Пример передачи одномерного массива перечислений в метод

Дана структура DayWeek, определяющая день недели

// дни недели
enum DayWeek
{
  Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun
}

Ниже реализован метод GetDayOff(), который получает массив типа DayWeek в качестве параметра. Метод определяет количество выходных дней (суббота, воскресенье) в массиве DayWeek.

// метод, определяющий количество выходных в массиве mn
static int GetDayOff(DayWeek[] mn)
{
  int nDayOff = 0;

  for (int i=0; i<mn.Length; i++)
  {
    if (mn[i] == DayWeek.Sat) nDayOff++;
    if (mn[i] == DayWeek.Sun) nDayOff++;
  }

  return nDayOff;
}

Демонстрация использования метода GetDayOff() из другого программного кода может быть следующей:

// массив типа DayWeek
DayWeek[] dw = new DayWeek[5];

// заполнение массива dw значениями
dw[0] = DayWeek.Sun; // выходной
dw[1] = DayWeek.Fri;
dw[2] = DayWeek.Mon;
dw[3] = DayWeek.Sat; // выходной
dw[4] = DayWeek.Tue;

int nDayOff;
nDayOff = GetDayOff(dw); // nDayOff = 2

 

7. Пример передачи двумерного массива целых (int) чисел в метод

В примере демонстрируется передача двумерного массива методу Sum(). В качестве параметров метод Sum() получает:

  • двумерный массив целых чисел с именем mn;
  • количество строк m в массиве;
  • количество столбцов n в массиве.

Метод находит сумму элементов двумерного массива.

// метод получает двумерный массив целых чисел
// параметры m, n - количество строк и столбцов в массиве
int Sum(int[,] mn, int m, int n)
{
  int sum = 0;

  for (int i = 0; i < m; i++)
    for (int j = 0; j < n; j++)
      sum += mn[i,j];

  return sum;
}

Чтобы корректно обращаться к элементам массива, в метод нужно передать количество строк m и столбцов n. Использование метода Sum() в другом программном коде

// объявление массива arr
int[,] arr = new int[3, 4];

// заполнение массива произвольными значениями
for (int i = 0; i < 3; i++)
  for (int j = 0; j < 4; j++)
    arr[i, j] = i + j;

// вызов метода Sum, которому передается массив arr
int s = Sum(arr, 3, 4); // sum = 30

 

8. Пример передачи двумерного массива классов в метод

Пусть задан класс, который реализует цвет и прозрачность пиксела на экране. Объявление класса имеет следующий вид

// класс, который реализует цвет и прозрачность пиксела на экране
class ColorPixel
{
  int color;
  int transp; // прозрачность в %

  // конструкторы класса
  public ColorPixel()
  {
    color = transp = 0;
  }

  public ColorPixel(int _color, int _transp)
  {
    color = _color;
    transp = _transp;
  }

  // методы доступа
  public int GetColor() { return color; }
  public int GetTransp() { return transp; }
  public void Set(int _color, int _transp)
  {
    color = _color;
    transp = _transp;
  }
}

Демонстрируется объявление метода SetArrayColor(), устанавливающего цвет и прозрачность в двумерном массиве классов типа ColorPixel.

// установить в массиве cp новые значения цвета и прозрачности
static void SetArrayColor(int m, int n, ColorPixel[,] cp, int _color, int _transp)
{
  for (int i = 0; i < m; i++)
    for (int j = 0; j < n; j++)
      cp[i, j].Set(_color, _transp);
  return;
}

Использование метода в другом программном коде может быть следующим

// создать новый массив классов ColorPixel
int m = 3, n = 5;
ColorPixel[,] CP = new ColorPixel[m, n]; // выделить память для массива ссылок

// выделить память для каждого элемента массива
for (int i = 0; i < m; i++)
  for (int j = 0; j < n; j++)
    CP[i, j] = new ColorPixel();

// установить конкретное значение цвета 5 и прозрачности 50% во все ячейки массива
SetArrayColor(m, n, CP, 5, 50);

 

9. Пример возврата одномерного массива целых чисел (int) из метода

Демонстрируется метод, который возвращает массив целых чисел (int[]). Метод заполняет элементы массива значениями, которые есть квадратами позиций (индексов) массива. Метод получает входным параметром размер массива n.

// метод, который генерирует одномерный массив целых чисел
// элементы массива есть квадратами позиций массива
static public int[] GetArray(int n)
{
  int[] temp = new int[n]; // выделить память для массива

  // заполнить массив значениями
  for (int i = 0; i < n; i++)
    temp[i] = i * i;

  return temp;
}

Вызов метода из другого программного кода может быть следующим

int[] A; // объявить ссылку на массив A
A = GetArray(5); // A = { 0, 1, 4, 9, 16 }

 

10. Пример возврата двумерного массива типа double из метода

Демонстрируется возврат двумерного массива из метода. Метод GetDoubleArray() получает входным параметром размер массива m*n. Метод возвращает массив.

// метод, который генерирует двумерный массив целых чисел
// размер массива m * n
public double[,] GetDoubleArray(int m, int n)
{
  // создать новый массив и выделить память для него
  double[,] temp = new double[m, n];

  // заполнение массива значениями
  for (int i = 0; i < m; i++)
    for (int j = 0; j < n; j++)
      temp[i, j] = j + i;

  return temp;
}

Использование метода GetDoubleArray() в другом программном коде

double[,] D;
D = GetDoubleArray(5, 6);
double x;
x = D[1, 3]; // x = 4.0
x = D[2, 5]; // x = 7.0
x = D[0, 0]; // x = 0.0

 

11. Пример возврата двумерного массива классов из метода

Пусть задан класс, который реализует символ типа char. В классе есть внутренняя переменная, конструктор и методы, которые определяют принадлежность символа к некоторой категории символов.

// класс, который демонстрирует символ
class Char
{
  char symbol; // внутренняя переменная

  // конструктор класса
  public Char(char _symbol) { symbol = _symbol; }

  // методы доступа
  public void Set(char _symbol) { symbol = _symbol; }
  public char Get() { return symbol; }

  // дополнительные методы
  // определяет, есть ли символ типа Char цифрой
  public bool IsNumber()
  {
    if ((symbol >= '0') && (symbol <= '9'))
      return true;
    return false;
  }

  // определяет, есть ли символ типа Char буквой латинского алфавита
  public bool IsLetter()
  {
    if ((symbol >= 'a') && (symbol <= 'z')) return true;
    if ((symbol >= 'A') && (symbol <= 'Z')) return true;
    return false;
  }

  // определяет, есть ли символ типа Char пробелом
  public bool IsSpace()
  {
    return symbol == ' ';
  }
}

Реализация метода GetArrayChar(), который генерирует (возвращает) двумерный массив объектов типа Char

// метод, который возвращает двумерный массив классов Char
// метод генерирует произвольные символы
// m, n - размерность массива
Char[,] GetArrayChar(int m, int n)
{
  Char[,] tempArray = new Char[m, n]; // выделить память для массива ссылок типа Char
  int value;

  // сформировать массив termpArray
  for (int i=0; i<m; i++)
    for (int j=0; j<n; j++)
    {
      value = i + j; // значение, которое будет заноситься в массив
      if (value > 255) value -= 255;

      // выделить память для элемента массива + инициализировать значением value
      tempArray[i, j] = new Char((char)value);
    }

    return tempArray;
}

Демонстрация вызова метода GetArrayChar() из другого программного кода

// создать новый массив классов Char
int m = 3, n = 5;
Char[,] Array; // объявить объект типа двумерный массив Char

// вызвать метод, который будет формировать массив Array
Array = GetArrayChar(8, 9);

 

12. Пример передачи двумерного ступенчатого массива в метод

В примере демонстрируется передача в метод и возврат из метода двумерного ступенчатого массива целочисленных величин.



Метод CopyIntArray() получает входными параметрами количество строк m в ступенчатом массиве A и сам ступенчатый массив A. Метод возвращает ступенчатый массив B, который есть копией массива A. Ступенчатый массив B размещается в другой области памяти

// метод, копирует входной ступенчатый массив в другой ступенчатый массив
// m - количество строк в ступенчатом массиве
// результат помещается в другой массив, который размещается в другой области памяти
int[][] CopyIntArray(int m, int[][] A)
{
  // объявить другой массив
  int[][] B = new int[m][]; // выделить память для ссылок на строки массива

  for (int i = 0; i < m; i++)
  {
    // выделить память для строки с номером i
    B[i] = new int[A[i].Length]; // Array[i].Length - количество элементов в строке i

    for (int j = 0; j < A[i].Length; j++)
      B[i][j] = A[i][j];
  }

  return B;
}

Демонстрация использования метода CopyIntArray() для копирования массивов следующая

// создать новый ступенчатый массив
int m = 4; // количество строк в массиве
int[][] A = new int[4][]; // исходный массив
int[][] B; // результирующий массив

// 1. Сформировать массив A
// выделить память для массива A
A[0] = new int[5]; // в строке 0 есть 5 элементов
A[1] = new int[3];
A[2] = new int[4];
A[3] = new int[2];

// записать в массив A произвольные значения
for (int i = 0; i < m; i++)
  for (int j = 0; j < A[i].Length; j++)
    A[i][j] = i + j;

// 2. Вызвать метод, который копирует массив A в массив B
B = CopyIntArray(m, A); // B <= A

// 3. Вывести на экран массив B
for (int i = 0; i < m; i++)
{
  Console.Write("B[{0}] = ", i);
  for (int j = 0; j < B[i].Length; j++)
    Console.Write("{0} ", B[i][j]);
  Console.WriteLine(" ");
}

В результате выполнения вышеприведенного кода, на экран будет выведен следующий результат

B[0] = 0 1 2 3 4
B[1] = 1 2 3
B[2] = 2 3 4 5
B[3] = 3 4
Press any key to continue . . .

 


Связанные темы