Методы. Передача параметров по ссылке 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Методы. Передача параметров по ссылке



 

Для того чтобы решить эту проблему необходимо использовать ключевые слова ref и out, позволяющие осуществить передачу обычного типа по ссылке. В C# указание модификатора ref приводит к созданию вызова по ссылке вместо вызова по значению. Данный модификатор указывается при объявлении метода и при его вызове. Важным моментом при использовании ref является то, что значение переменной передаваемой в качестве параметра должно быть присвоено заранее до вызова метода, иначе при попытке компиляции возникнет ошибка компиляции.

 

Практический пример. Класс Array (одномерный массив)

 

Класс описывает одномерный динамический массив вещественных чисел ar длиной n. Содержит конструктор без параметров, с параметром n, копирующий конструктор, деструктор, методы инициализации, обработки и вывода массива.

 

Метод класса CountNegative() подсчитывает и возвращает количество отрицательных элементов в массиве. Метод класса InitArray все элементы массива инициализирует случайными числами диапазоне от -20 до 30. Метод класса EditArray() выполняет обработку массива: первые CountNegative() элементов массива удваивает, а остальным меняет знак.

 

using System;

namespace UnivariateArray

{

class Array

{

   public Array()

   {

       n = 30;

       ar = new int[n];

       Console.WriteLine("Конструктор без параметров выполнен.");

   }

 

   public Array(int n)

   {

       this.n = n;

       ar = new int[n];

       for (int i = 0; i < n; i++)

           ar[i] = 0;

       Console.WriteLine("Конструктор с параметром выполнен.");

   }

 

      public Array(Array arn)

   {

       this.n = arn.n;

       this.ar = new int[n];

       for (int i = 0; i < n; i++)

           ar[i] = arn.ar[i];

       Console.WriteLine("Копирующий конструктор выполнен.");

   }

 

   ~Array()

   {

       Console.WriteLine("Деструктор выполнен.");

   }

 

   public void InitArray(int a, int b)

   {

       Random rnd = new Random();

       for (int i = 0; i < n; i++)

           ar[i] = rnd.Next(a, b);

       Console.WriteLine("Инициализация массива выполнена.");

   }

 

   public void PrintArray()

   {

       Console.WriteLine();

       for (int i = 0; i < n; i++)

           Console.Write("{0,8}", ar[i]);

      Console.WriteLine();

   }

 

   public int CountNegative()

   {

       int neg = 0;

       foreach (int i in ar)

       {

           if (i < 0)

               ++neg;

       }

       return neg;

   }

 

   public void AddingArray(ref int Sum)

   {

       Sum = 0;

       foreach (int i in ar)

       {

           if (i < 0)

               Sum+=i;

       }

   }

       

   public void EditArray()

   {

       for (int i = 0; i < n; i++)

       {

           int neg = this.CountNegative();

           if (i<neg)

               ar[i]*=2;

           else

               ar[i]*=-1;

       }

   }

 

   private int n;

   private int[] ar;

 

}

// Конец определения класса Array

 

class Program

{

   static void Main(string[] args)

   {

       Array ar0 = new Array();

       Console.WriteLine("Массив с нулевыми элементами:");

        ar0.PrintArray();

           

       Console.Write("Введите длину массива: ");

       int n = Convert.ToInt16(Console.ReadLine());

       Array ar1 = new Array(n);

           

       ar1.InitArray(-20, 30);

       Console.WriteLine("Исходный массив ar1:");

       ar1.PrintArray();

       // Копирование массива ar1 в массив arN

       Array arN = new Array(ar1);

       // Определение суммы элементов массива arN

       int Sum = 0;

       arN.AddingArray(ref Sum);

       Console.WriteLine("В массиве arN:");

       arN.PrintArray();

       Console.WriteLine("Отрицательных элементов: {0}.", arN.CountNegative());

       Console.WriteLine("Сумма элементов: {0}.", Sum);

       arN.EditArray();

       Console.WriteLine("Массив arN после обработки:");

       arN.PrintArray();

       Console.ReadKey();

   }

}

}

 

Результаты:

 

Конструктор без параметров выполнен.

Массив с нулевыми элементами:

 

  0  0  0  0  0  0  0  0  0  0

  0  0  0  0  0  0  0  0  0  0

  0  0  0  0  0  0  0  0  0  0

 

Введите длину массива: 25

Конструктор с параметром выполнен.

Инициализация массива выполнена.

Копирующий конструктор выполнен.

Исходный массив ar1:

 

-4  2 -16 -15 -11 16 17 -16 -17 17

20 -14 27 -1 -2 14   23 -5 -4  1

23  4  7 -17 -17

 

В массиве arN:

-4  2 -16 -15 -11 16 17 -16 -17 17

20 -14 27 -1 -2 14 23 -5 -4  1

23  4  7 -17 -17

Отрицательных элементов: 13.

Сумма элементов: -139.

Массив arN после обработки:

-8  4 -32 -30 -22 32 34 -32 -34 34

40 -28 54  1  2 -14 -23  5  4 -1

-23 -4 -7 17 17

 

Задание

 

1. Изучить понятие классов, объектов и области их эффективного использования; возможности языка программирования С# для работы с классами.

2. На основе индивидуального задания к лабораторной работе №4 (табл. 6) разработать одноименный класс, описывающий динамический одномерный массив и операции с ним.

3. Класс должен содержать такие закрытые члены:

- длина массива;

- ссылка на массив;

а также следующие открытые методы:

- конструктор без параметров, содержащий инициализатор массива нулевыми элементами;

- конструктор с параметрами, инициализирующий массив длины, вводимой с клавиатуры, случайных чисел в заданном диапазоне;

- копирующий конструктор, создающий копию объекта с исходным массивом;

- деструктор, уничтожающий массив;

- метод модификации элемента массива, заданного его индексом;

- метод, реализующий заданную обработку массива;

- метод вывода элементов массива на консоль.

Конструкторы и деструктор должны выводить сообщение о своем срабатывании.

4. Составить программу на языке программирования С#, в которой предусмотреть:

- создание массива ar0 заданной длины с нулевыми элементами;

- создание массива ar1 с длиной, вводимой с клавиатуры;

- инициализацию массива ar1 случайными числами в заданном диапазоне;

- копирование массива ar1 в новый массив arN;

- модификацию произвольных элементов массива ar1;

- выполнение обработки массива arN;

- вывод массивов на всех стадиях вычислений;

- конструкторы и деструктор должны выводить сообщения о своем выполнении.

5. Составить блок-схему для каждого метода класса.

 

Содержание отчета

 

1. Титульный лист.

2. Цель работы, индивидуальное задание (таблица).

3. Листинг программы.

4. Блок-схемы методов класса.

5. Результаты тестирования всех методов.

6. Описание различий в работе конструкторов.

7. Выводы.

 

Контрольные вопросы

 

  1. Что такое класс?
  2. Синтаксис объявления класса.
  3. Члены класса и порядок их размещения в теле класса.
  4. Что такое метод? Какие бывают методы?
  5. Модификаторы прав доступа.
  6. Особенности применения статических членов класса.
  7. Аргументы метода класса. Что такое передача параметра по значению?
  8. Что такое передача параметра по ссылке? Отличия от передачи по назначению
  9. Что такое объект? Где расположен объект при выполнении программы?
  10. Способы создания объектов.
  11. Что такое конструктор?
  12. Назначение и виды конструкторов.
  13. Что такое инициализатор? Пример.
  14. Что такое копирующий конструктор? Его отличия от конструктора с параметрами.
  15. Назначение ключевого слова this.
  16. Что такое деструктор?
  17. Что такое сборщик мусора?
  18. Что такое «Алгоритм пометки и сжатия»?
  19. Как и когда вызывается деструктор?
  20. В каком порядке происходит уничтожение объектов?

 

Лабораторная работа №9

 

Тема: Базовый механизм наследования. Работа с матрицами.

 

Цель: изучение концепции наследования в ООП и его применение для организации работы с матрицами, освоить технологию перегрузки операторов

 

Теоретические положения

 



Поделиться:


Последнее изменение этой страницы: 2021-09-26; просмотров: 70; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.147.89.85 (0.017 с.)