«Индексаторы. Свойства» по дисциплине «программирование». Отчет по лабораторной работе 9 Индексаторы. Свойства
Скачать 35.27 Kb.
|
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «ТУЛЬСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ» Институт прикладной математики и компьютерных наук Кафедра вычислительной техники Отчет по лабораторной работе № 9 «Индексаторы. Свойства»по дисциплине «программирование» Выполнил студент группы 220271: Кадильников Алексей Владимирович Проверил: к. т. н., доц. Савин Николай Ильич Тула 2018 ТЕОРЕТИЧЕСКАЯ СПРАВКАЦелиНа языке C# ознакомиться со свойствами и индексаторами, а также освоить их применение при создании защищенного массива и массива типа range.1.2 Информация1.2.1 ИндекстаторыИндексирование массива осуществляется с помощью оператора []. Для создаваемых классов можно определить оператор [], но с этой целью вместо операторного метода создается индексатор, который позволяет индексировать объект, подобно массиву. Индексаторы применяются, главным об разом, в качестве средства, поддерживающего создание специализированных массивов, на которые накладывается одно или несколько ограничений. Тем не менее индексаторы могут служить практически любым целям, для которых выгодным оказывается такой же синтаксис, как и у масси вов. Индексаторы могут быть одно- или многомерными.Ниже приведена общая форма одномерного индексатора:тип_элемента this[int индекс] {// Аксессор для получения данных.get {// Возврат значения, которое определяет индекс.}// Аксессор для установки данных.set {// Установка значения, которое определяет индекс.}}где тип_элемента обозначает конкретный тип элемента индексатора. Следовательно, у каждого элемента, доступного с помощью индексатора, должен быть определенный тип_элемента. Этот тип соответствует типу элемента массива. Параметр индекс по лучает конкретный индекс элемента, к которому осуществляется доступ.В теле индексатора определены два аксессора (т.е. средства доступа к данным): get и set. Аксессор подобен методу, за исключением того, что в нем не объявляется тип возвращаемого значения или параметры. Аксессоры вызываются автома-тически при использовании индексатора, и оба получают индекс в качестве параметра. Так, если индексатор указывается в левой части оператора присваивания, то вызывается аксессор set и устанавливается элемент, на который указывает параметр индекс. В противном случае вызывается аксессор get и возвращается значение, соответствующее параметру индекс. Кроме того, аксессор set получает неявный параметр value, содержащий значение, присваиваемое по указанному индексу.1.2.2 СвойстваСвойства очень похожи на индексаторы. В частности, свойство состоит из имени и аксессоров get и set. Аксессоры служат для получения и установки значения переменной. Главное преимущество свойства заключается в том, что его имя может быть использовано в выражениях и операторах присваивания аналогично имени обычной переменной, но в действительности при обращении к свойству по имени автоматически вызываются его аксессоры get и set. Аналогичным образом используются аксессоры get и set индексатора. Ниже приведена общая форма свойства:тип имя {get {// код аксессора для чтения из поля}set {// код аксессора для записи в поле}где тип обозначает конкретный тип свойства, например int, а имя — присваиваемое свойству имя. Как только свойство будет определено, любое обращение к свойству по имени приведет к автоматическому вызову соответствующего аксессора. Кроме того, аксессор set принимает неявный параметр value, который содержит значение, присваиваемое свойству.ЗАДАНИЯ2.1 Задание 1.2.1.1 Техническое заданиеФормулировкаНа языке C# написать защищенный массив, при выходе за границы которого будут выведены соответствующие сообщения об ошибках.Форматы входных данныхВходными данными является массив типа int, записанный в программе и состоящий из пяти ячеек с индексами 0 .. 4.Форматы выходных данныхВыходными данными является:- массив, где целые числа типа int записаны в строку;- уведомления об ошибках, записанные в столбец и отображающие индексы, которые вышли за пределы массива.2.1.2 Постановка задачиОписание переменных:fs – массив типа int, который надо сделать защищенным от выхода за границы;x – переменная, посредством которой числа из fs выводятся на консоль;ErrFlag – переменная типа bool, обозначающая результат последней операции (если выход за пределы массива произошел, то true, в ином случае false);index – обозначает индекс массива, тип intLength – длина массива, тип intПусть дан массив fs длиной Length. Задать индексатор, принимающий параметр index и имеющий аксессоры get и set для выявления и вывода ошибок, когда index >= Length. Вывести на консоль массив, который отображает элементы, индексы которых вышли за границы массива, как нули, а также вывести уведомления об ошибках вида “fs[i] вне границ”, где i – текущий индекс, вышедший за границы массива.2.1.3 АлгоритмВ классе создается индексатор с аксессорами get и set, которые в зависимости от текущего индекса массива оперируют переменной ErrFlag, задавая ей значения либо false (если не вышли за пределы индекса), либо true (если вышли за пределы).В Main для получения результатов используются следующие циклы for:Для вывода скрытого сбояЦикл для заполнения массива и вывода его на консоль. Начинается с первого индекса (i = 0). Для i <= (fs.Length) * 2 выполняется заполнения массива числами, равными величине индекса, умноженными на 10. Для этого при каждой попытке присвоить fs[i] вызывается аксессор set. Данный аксессор проверяет, заходит ли лемент по данном индексу за границы массива. Если нет, то элементу массива присваивается значение, передаваемое из параметра value. В противном случае устанавливается логическое значение true переменной ErrFlag.Далее необходимо вывести на консоль введенный элемент. В аксессоре get проверяется условие: если индекс не превышает границу массива, то возращается элемент по данному индексу, после чего данное значение fs[i] выводится на консоль. Если же условие не выполняется, то в fs[i] возращается нулевое значение и выводистя на консоль. После каждой итерации счетчик i увеличивается на единицу, и соответсвенно увеличивается на единицу index.2. Для вывода сообщений о сбоях.2.1. Цикл только для вывода сообщений о сбоях. Начинается с первого индекса (i = 0). Для i <= (fs.Length) * 2 происходит заполнение массива аналогично пункту 1.1. Далее условие проверки выхода за границы: если верно, то выводится сообщение об ошибке. После каждой итерации счетчик i увеличивается на единицу.2.2. Цикл для вывода и массива, и сбоев. Начинается с первого индекса (i = 0). Для i <= (fs.Length) * 2 переменной x присваивается значение fs[i], для чего вызывается аксессор get (см. пункт 1.1). После чего условие: если выход за пределы не произошел, то записывается х. Если же произошел, то выводится сообщение об ошибке.2.1.4 Программная реализация (см. приложение 1)Объявлен класс FailSoftArray. В классе:Объявлены переменные:int[] a; // ссылка на базовый массивpublic int Length; // открытая переменная длины массиваpublic bool ErrFlag; // обозначает результат последней операцииЗаписан конструктор для построения массива заданного размера:public FailSoftArray(int size){a = new int[size];Length = size;}Задан индексатор.Индексатор начинается со следующей строки:public int this[int index] {В этой строке кода объявляется индексатор, оперирующий элементами типа int. Ему передается индекс в качестве параметра index. Кроме того, индексатор объявляется открытым (public), что дает возможность использовать этот индексатор в коде за пределами его класса. Рассмотрим следующий код аксессора get:get {if (ok(index)) {ErrFlag = false;return a[index];}else {ErrFlag = true;return 0;}}Аксессор get предотвращает ошибки нарушения границ массива, проверяя в первую очередь, находится ли индекс в установленных границах. Эта проверка границ вы полняется в методе ok(), который возвращает логическое значение true, если индекс правильный, а иначе — логическое значение false:private bool ok(int index){if (index >= 0 & index < Length) return true;return false;}Вернемся к аксессору get. Так, если указанный индекс на ходится в установленных границах, то по этому индексу возвращается соответствующий элемент. А если индекс оказывается вне установленных границ, то никаких операций не выполняется, но в то же время не возникает никаких ошибок переполнения. В данном варианте класса FailSoftArray переменная ErrFlag содержит результат каждой операции.Ее содержимое может быть проверено после каждой операции на предмет удачногоили неудачного выполнения последней.А теперь рассмотрим следующий код аксессора set, предотвращающего ошибки нарушения границ массива:set {if (ok(index)) {a[index] = value;ErrFlag = false;}else ErrFlag = true;}Если параметр index метода ok() находится в установленных пределах, то соответствующему элементу массива присваивается значение, передаваемое из параметра value. В противном случае устанавливается логическое значение true переменной ErrFlag.2.1.5 Экспериментальная частьРезультат выполнения программы и исходный код предоставлены в приложении 1.2.2 Задание 2.2.2.1 Техническое заданиеФормулировкаФорматы входных данныхФорматы выходных данных2.2.2 Постановка задачи2.2.5 Программная реализация (см. приложение 2)2.2.6 Экспериментальная частьРезультат выполнения программы и исходный код предоставлены в приложении 2.ЗАКЛЮЧЕНИЕПРИЛОЖЕНИЯПРИЛОЖЕНИЕ 1(см. п. 2.1.4 “Программная реализация”)Защищенный массивusing System; namespace Защищенный_массив { class FailSoftArray { int[] a; public int Length; public bool ErrFlag; public FailSoftArray(int size) { a = new int[size]; Length = size; } public int this[int index] { get { if (ok(index)) { ErrFlag = false; return a[index]; } else { ErrFlag = true; return 0; } } set { if (ok(index)) { a[index] = value; ErrFlag = false; } else ErrFlag = true; } } private bool ok(int index) { if (index >= 0 & index < Length) return true; return false; } } class FSDemo { static void Main() { FailSoftArray fs = new FailSoftArray(5); int x; Console.WriteLine("Скрытый сбой."); for (int i = 0; i < (fs.Length * 2); i++) { fs[i] = i * 10; Console.Write(fs[i] + " "); } Console.WriteLine(); Console.WriteLine("\nСбой с уведомлением об ошибках."); for (int i = 0; i < (fs.Length * 2); i++) { fs[i] = i * 10; if (fs.ErrFlag) Console.WriteLine("fs[" + i + "] вне границ"); } for (int i = 0; i < (fs.Length * 2); i++) { x = fs[i]; if (!fs.ErrFlag) Console.Write(fs[i] + " "); else Console.WriteLine("fs[" + i + "] вне границ"); } Console.ReadLine(); } } }Результат выполнения программыСкрытый сбой. 0 10 20 30 40 0 0 0 0 0 Сбой с уведомлением об ошибках. fs[5] вне границ fs[6] вне границ fs[7] вне границ fs[8] вне границ fs[9] вне границ 0 10 20 30 40 fs[5] вне границ fs[6] вне границ fs[7] вне границ fs[8] вне границ fs[9] вне границ ПРИЛОЖЕНИЕ 2(см. п. 2.2.5 “Программная реализация”)Массив типа rangeРезультат выполнения программы |