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 - розмірність масиву
static 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 . . .

 


Зв’язані теми