Главная страница
Навигация по странице:

  • ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «ТУЛЬСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»

  • «Индексаторы. Свойства» по дисциплине «программирование». Отчет по лабораторной работе 9 Индексаторы. Свойства


    Скачать 35.27 Kb.
    НазваниеОтчет по лабораторной работе 9 Индексаторы. Свойства
    Анкор«Индексаторы. Свойства» по дисциплине «программирование
    Дата04.11.2019
    Размер35.27 Kb.
    Формат файлаdocx
    Имя файлаProgr_9.docx
    ТипОтчет
    #93402

    МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

    ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

    «ТУЛЬСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»

    Институт прикладной математики и компьютерных наук

    Кафедра вычислительной техники

    Отчет по лабораторной работе № 9

    «Индексаторы. Свойства»


    по дисциплине «программирование»

    Выполнил студент группы 220271:

    Кадильников Алексей Владимирович

    Проверил: к. т. н., доц.

    Савин Николай Ильич

    Тула 2018
    1. ТЕОРЕТИЧЕСКАЯ СПРАВКА

      1. Цели

    На языке 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, который содержит значение, при­сваиваемое свойству.


    1. ЗАДАНИЯ

    2.1 Задание 1.

    2.1.1 Техническое задание

    • Формулировка

    На языке C# написать защищенный массив, при выходе за границы которого будут выведены соответствующие сообщения об ошибках.

    • Форматы входных данных

    Входными данными является массив типа int, записанный в программе и состоящий из пяти ячеек с индексами 0 .. 4.

    • Форматы выходных данных

    Выходными данными является:

    - массив, где целые числа типа int записаны в строку;

    - уведомления об ошибках, записанные в столбец и отображающие индексы, которые вышли за пределы массива.

    2.1.2 Постановка задачи

    Описание переменных:

    fs – массив типа int, который надо сделать защищенным от выхода за границы;

    x – переменная, посредством которой числа из fs выводятся на консоль;

    ErrFlag – переменная типа bool, обозначающая результат последней операции (если выход за пределы массива произошел, то true, в ином случае false);

    index – обозначает индекс массива, тип int

    Length – длина массива, тип int

    Пусть дан массив fs длиной Length. Задать индексатор, принимающий параметр index и имеющий аксессоры get и set для выявления и вывода ошибок, когда index >= Length. Вывести на консоль массив, который отображает элементы, индексы которых вышли за границы массива, как нули, а также вывести уведомления об ошибках вида “fs[i] вне границ”, где i – текущий индекс, вышедший за границы массива.

    2.1.3 Алгоритм

    В классе создается индексатор с аксессорами get и set, которые в зависимости от текущего индекса массива оперируют переменной ErrFlag, задавая ей значения либо false (если не вышли за пределы индекса), либо true (если вышли за пределы).

    В Main для получения результатов используются следующие циклы for:

    1. Для вывода скрытого сбоя

      1. Цикл для заполнения массива и вывода его на консоль. Начинается с первого индекса (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. В классе:

    1. Объявлены переменные:

    int[] a; // ссылка на базовый массив

    public int Length; // открытая переменная длины массива

    public bool ErrFlag; // обозначает результат последней операции

    1. Записан конструктор для построения массива заданного размера:

    public FailSoftArray(int size)

    {

    a = new int[size];

    Length = size;

    }

    1. Задан индексатор.

    Индексатор начинается со следующей строки:

    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




    Результат выполнения программы



    написать администратору сайта