Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSBasicCourse2ndedPodbelsky / CSBasicCourse2ndedPodbelsky.rtf
Скачиваний:
27
Добавлен:
22.03.2016
Размер:
11.9 Mб
Скачать

Int[] days; // часы по дням недели

public Work_hours( ) // конструктор

{

days = new int[7];

}

public int this[int d] // индексатор

{

get { return (d < 0 || d > 6) ? -1 : days[d]; }

set

{

if (d < 0 || d > 6 || value < 0 || value > 14)

Console.WriteLine("Ошибка: день={0}, часы={1}!",d,value);

else days[d] = value;

}

}

}

class Program

{

static void Main()

{

Work_hours week = new Work_hours();

week[0] = 7; // понедельник

week[2] = 17; //недопустимые данные

week[3] = 7; // четверг

week[6] = 7; // воскресенье

Console.WriteLine("Рабочая неделя: ");

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

Console.Write("day[{0}] = {1} ", i, week[i]);

Console.WriteLine( );

Console.WriteLine("day[{0}] = {1}\t", 8, week[8]);

}

}

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

Ошибка: день=2, часы=17!

Рабочая неделя:

day[0] = 7 day[1] = 0 day[2] = 0

day[4] = 0 day[5] = 0 day[6] = 7

day[8] = -1

day[3] = 7

Параметр

индексатора

"параметры:

параметр

индексатора"

и

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

иметь целочисленный тип. В следующем примере рассмотрим класс Dictionary,

объект которого может служить простейшим словарем. В класс Dictionary

включим в качестве полей два массива строк – массив исходных слов, например, на

английском языке, и массив переводных эквивалентов. Массив исходных слов

будем заполнять в конструкторе при создании словаря-объекта. Элементам массива

переводных

эквивалентов

будем

присваивать

значения

с

использованием

индексатора. Параметр индексатора будет иметь тип string. Задавая в квадратных

скобках слово в виде строки, получим доступ к элементу с его переводным

эквивалентом. Определение класса может быть таким (программа 12_05.cs):

class Dictionary { // словарь

string [ ] words; // слова

string [ ] trans; // переводы

public Dictionary(params string[ ] str) // конструктор

{

words = new string[str.Length];

trans = new string[str.Length];

int ind=0;

foreach (string s in str)

words[ind++] = s; // заполнили массив слов

}

Int search(string str) { // поиск слова

for (int i = 0; i < words.Length; i++)

if (words[i] == str) return i;

return -1;

}

public string this[string w] {

set { int ind = search(w);

if (ind == -1)

Console.WriteLine("Слова Нет!");

else trans[ind] = value;

}

get { int ind = search(w);

if (ind == -1) return "Слова Нет!";

else return trans[ind]; }

}

}

В классе Dictionary две ссылки words и trans на массив слов и на массив и

х

переводных эквивалентов. Собственно массивы как объекты создаются в

конструкторе. У конструктора параметр с модификатором params, позволяющий

использовать переменное число аргументов. Реальное количество аргументов

определяется как str.Length. Это значение определяет размеры массивов,

адресуемых

ссылками

words

и

trans.

Строки-аргументы

конструктора

присваиваются элементам массива words[ ] в цикле foreach. Массив переводов

trans[ ] остаётся незаполненным.

В классе определен вспомогательный закрытый метод search(), для поиска в

словаре (в массиве words[ ] исходных слов) слова, заданного с помощью аргумента.

Метод вернет индекс слова, либо -1, если слово отсутствует. Метод search()

используется в индексаторе. В аксессоре set определяется индекс ind того элемента

массива trans[ ], которому нужно присвоить новое значение переводного

эквивалента. Если поиск неудачен – выводится сообщение, иначе элементу

trans[ind],

присваивается

значение

переводного

эквивалента.

Аксессор

get

возвращает значение trans[ind] либо строку с сообщением, что слова нет в словаре.

Для иллюстрации возможностей класса dictionary и его индексатора приведем

следующий фрагмент кода:

static void Main( )

{

Dictionary number = new Dictionary("zero", "one", "two");

number["zero"] = "нуль";

number["one"] = "один";

number["two"] = "2";

Console.WriteLine("number[\"one\"]: " + number["one"]);

Console.WriteLine("number[\"three\"]: " + number["three"]);

Console.WriteLine("number[\"two\"]: " + number["two"]);

}

В методе Main( ) создан один объект класса Dictionary. В объекте-словаре всего

три слова, у которых вначале нет переводных эквивалентов. Для задания переводов

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

значением выражения number["three"] будет строка "Слова Нет!".

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

:

number["one"]: один

number["three"]: Слова Нет!

number["two"]: 2

Соседние файлы в папке CSBasicCourse2ndedPodbelsky