Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 28.09.2015
Сообщений: 41
.NET 4.x

Объясните подробней пример из книги Шилдта

14.02.2017, 15:01. Показов 2223. Ответов 9

Студворк — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
class RangeArray {
// Закрытые данные.
int[] а; // ссылка на базовый массив
int lowerBound; // наименьший индекс
int upperBound; // наибольший индекс
// Автоматически реализуемое и доступное только для чтения свойство Length.
public int Length { get; private set; }
// Автоматически реализуемое и доступное только для чтения свойство Error.
public bool Error { get; private set; }
// Построить массив по заданному размеру.
public RangeArray(int low, int high) {
high++;
if(high <= low) {
Console.WriteLine("Неверные индексы");
high = 1; // создать для надежности минимально допустимый массив
low = 0;
}
а = new int[high - low];
Length = high - low;
lowerBound = low;
upperBound = --high;
// Это индексатор для класса RangeArray.
public int this[int index] {
// Это аксессор get.
get {
if(ok(index)) {
Error = false;
return a[index - lowerBound];
} else {
Error = true;
return 0;
}
}
// Это аксессор set.
set {
if(ok(index)) {
a[index - lowerBound] = value;
Error = false;
}
else Error = true;
}
}
// Возвратить логическое значение true, если
// индекс находится в установленных границах.
private bool ok(int index) {
if(index >= lowerBound & index <= upperBound) return true;
return false;
}
}
// Продемонстрировать применение массива с произвольно
// задаваемыми пределами индексирования.
class RangeArrayDemo {
static void Main() {
RangeArray ra = new RangeArray(-5, 5);
RangeArray ra2 = new RangeArray(1, 10);
RangeArray ra3 = new RangeArray(-20, -12);
// Использовать объект ra в качестве массива.
Console.WriteLine("Длина массива ra: " +.Length);
for(int i = -5; i <= 5; i++)
ra[i] = i;
Console.Write("Содержимое массива ra: ");
for(int i = -5; i <= 5; i++)
Console.Write(ra[i] + " ");
Console.WriteLine("\n");
// Использовать объект ra2 в качестве массива.
Console.WriteLine("Длина массива ra2: " + ra2.Length);
for(int i = 1; i <= 10; i++)
ra2[i] = i;
Console.Write("Содержимое массива ra2: ");
for(int i = 1; i <= 10; i++)
Console.Write(ra2[i] + " ");
Console.WriteLine("\n");
// Использовать объект raЗ в качестве массива.
Console.WriteLine("Длина массива ra3: " + ra3.Length);
for(int i = -20; i <= -12; i++)
ra3[i] = i;
Console.Write("Содержимое массива ra3: ");
for(int i = -20; i <= -12; i++)
Console.Write(ra3[i] + " ");
Console.WriteLine("\n");
}
Не до конца понятна вот эта строка
return a[index - lowerBound];
В книге она объясняется вот так "В этом выражении индекс, передаваемый в качестве параметра index, преобразуется
в индекс с отсчетом от нуля, пригодный для индексирования массива а."
Но не совсем понятно как это происходит, как он преобразуется, и почему с отсчетом от нуля? Я так понимаю что от передаваемого индекса постоянно отнимается нижняя граница массива, или как?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.02.2017, 15:01
Ответы с готовыми решениями:

Пример из книги Шилдта. Интерфейсные свойства
Добрый вечер всем программистам. Почему при выполнении этого кода в режиме отладки выводятся совсем другие значения. using System; ...

Пример из справочника Шилдта
У кого есть Герберт Шилдт? На странице 411, в методе static string reverse (string a) зачем нужна переменная j в цикле for?

Программа из книги Шилдта, небольшая загвоздка)
Привет форумчане!) В книге Шилдта при объяснении методов с параметрами есть пример, в котором находится наименьший множитель двух чисел....

9
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
14.02.2017, 17:41
Лучший ответ Сообщение было отмечено Progerpro как решение

Решение

массив индексируется всегда с 0, тут же рассмотрен вариант, при котором, ПОЛЬЗОВАТЕЛЬ этого класса, может создать экземпляр класса( и работать с ним как с массивом) с индексацией с любого, даже отрицательного числа...
C#
1
return a[index - lowerBound];
тут, действительно происходит преобразование, а необходимо оно, потому как массивы индексируются с 0, т.е. как видно из дальнейшего кода, идет обращение к эл-там экземпляра класса с отрицательными индексами(что привело бы к ошибке, если не преобразовывать), а преобразование, дествительно вычитание нижней границы(в этом примере, создавая экземпляр этого класса с индексацией от -5 до 5, в дальнейшем идет обращение к эл-ту с индексом -5, но в работе с массивами такой индекс недопустим, и вычитая из -5, нижнюю границу получаем -5-(-5) =0) что пригодно для индексации в массивах
1
309 / 309 / 215
Регистрация: 24.09.2013
Сообщений: 771
14.02.2017, 17:53
Внутри класса RangeArray определен обычный массив с обычной индексацией (от 0 до n - 1, здесь n - размер массива).
Этот класс предоставляет возможность задавать свой диапазон индексов (от lowerDound до upperBound).
Но для внутреннего массива выделяется память в размере n, поэтому к нему есть доступ только по индексам от 0 до n.
Поэтому от индекса, переданного пользователем отнимается lowerBound.

P.S. Если не ошибаюсь после этого примера Шилдт подробно объясняет, что натворил)
0
0 / 0 / 0
Регистрация: 28.09.2015
Сообщений: 41
14.02.2017, 22:19  [ТС]
Спасибо, теперь я понял.

Добавлено через 9 минут
А если в индекс пойдет положительное число, например 2, то будет 2 -(-5)=7, так?
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
14.02.2017, 22:23
именно
0
0 / 0 / 0
Регистрация: 28.09.2015
Сообщений: 41
14.02.2017, 22:27  [ТС]
А почему тогда при обращении к массиву через индекс например ra[-3] не выскакивает ошибка.
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
14.02.2017, 22:29
тут нет обращения к массиву напрямую, тут создается класс содержащий массив, и занимается этот класс, "преобразованием" индексов в формат, с которым работает массив(индексация с 0)
0
0 / 0 / 0
Регистрация: 28.09.2015
Сообщений: 41
14.02.2017, 22:33  [ТС]
А какой в этом смысл, не проще было бы просто напрямую обращаться к массиву без преобразования? И зачем тогда вообще начинать индексацию с -5, а не с нуля, если все равно в индексаторе происходит обращение к массиву с нулевого элемента?
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
15.02.2017, 12:55
если мне не изменяет склероз, то этот пример из раздела про индексаторы, вот вокруг индексаторов вся свистопляска, практического применения тут нет
0
0 / 0 / 0
Регистрация: 28.09.2015
Сообщений: 41
15.02.2017, 13:19  [ТС]
Ну ладно, спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.02.2017, 13:19
Помогаю со студенческими работами здесь

Какую книгу по C# читать после книги Шилдта
Какую книгу по C# читать после книги Шилдта C#. Полное руководство?

Одномерные индексаторы. По примеру из книги Шилдта - разобрать код
Не могу понять смысл приведённого в книге примера. Это программа, в которой создается класс FailSoftArray, реализующий массив для выявления...

Пример из учебника Шилдта - пояснить результат выполнения программы
Растолкуйте, пожалуйста, следующий пример ... public void Push(char ch) { if(tos==stck.Length) { Console.WriteLine (&quot; - Стек...

Объясните работу рекурсивной функции из книги Г. Шилдта
Здравствуйте.Вопрос такой ,самостоятельно изучаю с++ по книге Герберта Шилда,дошел до темы рекурсия ,в книге есть такой пример: #include...

Указатели на структуры. Программа-пример из книги Шилдта
Здравствуйте. Прошу проверить, правильно ли я поняла значение каждой строчки, т.к. в книге построчного объяснения не дается. Еще хотелось...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru