Главная страница

1. Массивы и классы 4 Элементы массива как ссылки на объекты 4


Скачать 309.29 Kb.
Название1. Массивы и классы 4 Элементы массива как ссылки на объекты 4
Дата12.11.2018
Размер309.29 Kb.
Формат файлаpdf
Имя файлаpractice_5.pdf
ТипДокументы
#56244
страница3 из 4
1   2   3   4
5.3. Листинг 5.5. Исходный код ElevatorRequestTracker.cs
01: using System;
02:
03: namespace ConsAppl_ElevatorRequestTracker
04: {
06:
07: class ElevatorRequestTracker
08: {
09; public static void Main()
10: {
11: ushort[ , ] requests = new ushort[7,24]; // В массиве requests хранятся количества вызовов
12: Random randomizer = new Random(); // лифта в течение каждого часа за семидневный срок
13: int sum;
14:
15: // Случайно генерировать количество вызовов
16: // для каждого часа каждого дня недели
17
18
19 20 21 22 23 24 25
26
27 28 29 30 31
32
33
for (int i=0; i<7; i++)
{
for (int j=0; j<24; j++)
{
if(( j < 8 ) || ( j >18 )) // вызовы лифта вечером и ночью requests[i , j] = (ushort)randomizer.Next(1,10);
else
requests[i , j] = (ushort)randomizer.Next(20,99); // вызовы лифта днем
}
}
// Вывести таблицу вызовов
Console.WriteLine(
и
\n\nКол-во вызовов лифта в течение каждого часа за 7-дневный срок:\п");
Console. WriteLine(" ЧасыУТ);
Console.Write(" ");
for (int i=0; i<24; i++)
{
34: Console.Write("{0,2} ", i);
18
}

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
Console.WriteLine('Y^H^');
for (int i=0; i<7; i++)
{
Console.Write("\n{0} ", (i+1));
for (int j=0; j<24; j++)
{
Console.Write("{0,2} ", requests[i , j]);
}
}
// Вычислить и вывести общее число вызовов лифта вдень. WгiteLine("\n\nОбщее число вызовов лифта вдень п)
for (int i=0; i<7; i++)
{
sum = 0;
for (int j=0; j<24; j++) // Суммируются строки вызовов лифта задень Общее число вызовов лифта вдень дни {0}: {1}", (i+1), sum);
}
// Вычислить и вывести среднее число вызовов в час
Console.Wгite("\nСреднее число вызовов в час Час ь :
");
for (int i=0; i<24; i++)
{
Console.Write("{0,2} ",i);
}
Оonsole.Wгite("\nВызовы:");
for (int j=0; j<24; j++)
{
sum = 0;
for (int i=0; i<7; i++) // Суммируются столбцы вызовов за каждый час sum += requests[i , j]; // Среднее число вызовов в час
Console.Write("{0,2} ", (sum / 7));
}
Console. ReadLine();
}
}
}
5.4. Результаты работы программы
} Количество вызовов лифта в течение каждого часа за 7-дневный срок Часы

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Дни
1 8 6 1 3 9 4 3 9 94 33 55 25 32 49 38 32 25 28 37 1 7 2 3 9
2 9 4 4 4 6 5 4 6 46 80 98 28 75 92 57 82 89 84 65 5 3 9 2 9
3 9 8 7 1 9 7 1 6 44 34 48 62 20 86 51 55 81 88 77 4 4 2 5 2 19

4 6 4 2 9 6 8 7 1 40 60 59 80 81 50 71 66 73 49 83 5 6 9 8 1
5 4 2 7 4 2 7 5 7 48 65 49 59 64 34 22 61 58 47 42 5 4 6 7 4
6 2 2 7 1 3 9 6 7 71 32 57 56 26 46 85 61 97 76 52 2 1 2 1 5
7 4 3 1 2 6 3 7 8 55 44 30 22 21 60 55 53 97 72 87 4 7 6 4 2 Общее число вызовов лифта вдень дни 1: 513 дни 2: 866 дни 3: 711 дни 4: 784 дни 5: 613 дни 6: 707 дни 7: 653 Среднее число вызовов в час Часы 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Вызовы 6 4 4 3 5 6 4 6 56 49 56 47 45 59 54 58 74 63 63 3 4 5 4 4
// Примечание Поскольку количество вызовов лифта генерируется случайным образом, оно будет разным при каждом тестовом запуске программы. В строке 11 объявляется переменная двумерного массива requests, а в строке 12 — переменная содержащая ссылку на объект типа Random (или System.Random). Переменная подготовлена для генерирования случайных чисел. Строки 17—26 содержат два вложенных цикла for. Во внешнем цикле индекс i изменяется от 0 до 6 с шагом 1 (см. строку
17), во внутреннем — j от 0 до 23 (см. строку 19) с шагом 1. Такая циклическая конструкция позволяет просматривать двумерный массив, обращаясь к каждому элементу как requests[i, j]. Именно это и выполняется в строках 22 и 24, где requests[i, j] присваивается случайное число. При этом используется оператор if (вначале строки 21). Если j выходит за пределы диапазона между 8 и 18 (if ((j < 8) || (j > 18)), элементу массива requests присваивается случайное число от 1 до 10 (строка 22). Если j входит в указанный диапазон, элементу присваивается случайное число от 20 до 99 (строка 24). Напомним, что метод Next объекта randomizer имеет два аргумента нижний и верхний пределы для случайных чисел. В строках 28—45 выводится таблица количества вызовов, содержащихся в массиве re-
quests. В строках 28-35 печатаются заголовки столбцов, соответствующих часам а в 37-45 вновь применяются вложенные циклы for — для вывода содержимого массива requests. В строках 49—55 вычисляется общее количество вызовов в течение дня sum устанавливается равной нулю (строка 51), складываются все вызовы за 24 часа (строки 52 и 53) и полученный результат выводится на консоль (строка 54). В строках 58-70 вычисляется и выводится на экран среднее число вызовов в час за семь дней Вместо расчета суммы данных по строке таблицы (строки 49-55) нужно просуммировать данные по столбцу и разделить результат на семь (строка 69). При этом внутренний цикл for в строках 49—55 становится внешним, а внешний — внутренним, как показано в строках 64—70.
5.5. Свободные (зубчатые) массивы Массивы двух (или более) измерений не должны быть обязательно прямоугольными, потому как строки массива необязательно должны иметь одинаковую длину. Массивы, в которых различные строки имеют разное число столбцов, называются свободными, или "зубчатыми. Чтобы проиллюстрировать свободный массив, обратимся к прямоугольному массиву requests из листинга, который использовался для сбора вызовов лифта за каждый час в течение семи дней Строка с объявлением такого двумерного массива выглядит следующим образом ushort [ , ] requests = new ushort [7, 24]; Предположим теперь, что требуется собрать вызовы лифта не за все 24 часа каждый день, а, скажем, за 18 часов в четвертый и пятый дни и за 12 часов — в шестой и седьмой дни Для такого случая можно создать специальный массив. Такой свободный массив requests объявляется следующим образом ushort [ ] [ ] requests; requests = new ushort [7][ ]; requests[0] = new ushort[24];
requests[1] = new ushort[24]; массивы длиной 24 присваиваются первым м элементам requests[2] = new ushort[24];
requests[3] = new ushort[18]; массивы длиной 18 присваиваются 4-му и 5-му элементам requests[4] = new ushort[18];
requests[5] = new ushort[12]; массивы длиной 12 присваиваются 6-му и 7-му элементам requests[6] = new ushort[12] Первая строка ushort [ ] [ ] requests; должна содержать две пары квадратных скобок (указывающих на специфическое свойство массива, а в следующей строке requests = new ushort [7][ ]; переменной requests присваивается ссылка на объект массива с такими характеристиками он содержит 7 элементов (его длина равна 7), каждый из которых является массивом ushort и может иметь любую длину. Теперь каждому из этих семи элементов можно присвоить одномерный массив любой длины. Это производится в последующих семи строках кода. К примеру, в строке requests[4] = new ushort [18]; одномерный массив длиной 18 присваивается пятому элементу массива requests. Строки двумерного массива имеют разную длину, поэтому программисты называют его свободным или "зубчатым. Это понятие распространяется на массивы любой размерности. Если одно из измерений содержит одномерные массивы разной длины, такой массив также называется свободным. Иногда массивы такого типа называют "рваными.
5.6. Листинг 5.6. Исходный код JaggedElevatorRequests.cs
01: using System; // Количество вызовов лифта генерируется случайным
02: // образом и присваивается элементам массива requests
03: namespace ConsAppl_JaggedElevatorReguests
04: {
05: class JaggedElevatorRequest // "Зубчатый" запрос Лифта
06: {
07: public static void Main() // Зубчатые массивы - различные строки имеют различное число столбцов
08: {
21

09: Random randomizer = new Random();
10: ushort [ ] [ ] requests; // В массиве requests хранятся количества вызовов
11: requests = new ushort[7] [ ];
12: requests[0] = new ushort[24];
13: requests[1] = new ushort[24];
14: requests[2] = new ushort[24];
15: requests[3] = new ushort[18];
16: requests[4] = new ushort[18];
17: requests[5] = new ushort[12];
18: requests[6] = new ushort[12];
19:
20: // Присваивание случайно сгенерированного количества вызовов
21: // каждому элементу массива requests
22: for (int i=0; i i++)
23: {
24: for (int j=0; j
25: {
26: if (( j < 8) || ( j >18 )) // вызовы лифта вечером и ночью
27: requests[ i ][ j ] = (ushort)randomizer.Next(1,10);
28: else
29: requests[ i ][ j ] = (ushort)randomizer.Next(20,99); // вызовы лифта днем
30: }
31: }
32: // Вывод таблицы вызовов за каждый час ежедневно
33: Console.WriteLine(" ЧасыУТ);
34: Console.Write(" ");
35: for (int i=0; i<24; i++)
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
{
Console.Write("{0,2} ", i);
}
C o n s o l e ^ ^ ^ C ' V ^ M " ) ;
for (int i=0; i i++)

{
Console.Write("\n{0} ", (i+1));
for (int j=0; j i ].Length; j++)
{
Console.Write("{0,2} ", requests[ i ] [ j ]);
}
}
Console.ReadLine();
5.7. Результаты работы программы Часы < 18 Часы <= 18 Часы > 18
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Дни
1 2 3 2 1 3 5 5 3 50 20 71 55 32 90 29 54 53 81 68 4 2 9 5 6
}
}
}
22

2 1 8 8 7 3 2 3 6 26 32 73 45 50 75 53 62 47 25 44 2 7 1 4 7
3 9 9 6 2 8 7 6 2 78 60 93 50 68 82 91 34 75 23 48 1 2 8 1 7
4 4 1 1 2 6 3 9 1 56 31 84 47 65 32 83 52 64 56
5 6 8 7 1 9 5 2 2 60 70 72 51 58 30 93 92 83 76
6 6 5 6 5 6 8 9 5 97 63 67 62
7 3 9 4 7 2 2 9 3 32 62 94 59
6. Анатомия класса Класс является для объекта тем же, чем строительный чертеж для дома. Класс — это абстракция (реальная или концептуальная) объекта, принадлежащего какой-либо предметной области. Один шаблон класса можно использовать для создания нескольких объектов (экземпляров класса которые обладают свойствами, определенными в классе. Ранее было показано, как при решении разных вычислительных задач объекты различных классов взаимодействуют друг с другом, внося свои уникальные свойства в общую программу. Конструкция класса позволяет объединять данные (называемые состоянием объекта) с функциями (представляющими его поведение) для создания объектов, составляющих структуру разрабатываемого ПО. До этого момента классы, используемые в примерах, состояли из переменных и методов экземпляра, как показано на рис. 1.5 (см. Материалы к Практич. занятию №1, стр. Элементы класса являются языковыми конструкциями, составляющими тело класса. К примеру, переменные и методы экземпляра представляют собой два фундаментальных элемента класса. Однако классы настолько разнообразны, что С содержит и несколько других элементов, придающих классу гибкость и расширяющих его возможности по взаимодействию с другими классами программы. Далее рассмотрим именно их, а также важные аспекты создания методов, которые ранее не обсуждались.
class <Идентификатор_класса>
{
<Переменные_экземпляра>
< Методы >
} Рис. 5.2. Класс с переменными экземпляра и методами.
6.1. Анатомия класса обзор Сделаем обзор всех возможных элементов класса. В синтаксическом блоке 5.1 расширен синтаксис, показанный на рис. 1.5 (см. Материалы к
Практич. занятию №1, стр, и описаны элементы, которые можно включать в определение класса. В первых строках отображен уже знакомый синтаксис ключевое слово class, имя (идентификатор класса и фигурные скобки формирующие тело класса. Элементы класса можно разделить натри широкие категории 1)
данные-члены, 2) функции-члены и 3)
вложенные типы. Далее приведено их краткое описание. Данные-члены состоят из переменных-членов, констант и событий.
1) Переменные-члены (называемые также полями) используются для представления данных. Такая переменная может принадлежать 1)
или конкретному экземпляру (объекту) класса — в этом случае она называется переменной экземпляра 2) или самому классу — тогда она называется статической (объявленной static) переменной (или переменной класса. Напомним, что статический метод принадлежит классу, а не объекту (и вызывается для класса. Тоже самое справедливо и для статической переменной.
2) Переменная-член может быть объявлена только для чтения (с ключевым словом readonly). Такие переменные тесно связаны с константами-членами, но существует важное различие —
23
значения последних устанавливаются в программе в процессе компиляции и существуют на протяжении ее исполнения. А значения readonly переменных-членов присваиваются им при создании объекта, и поэтому существуют, пока существует объект.
3) События объявляются подобно переменным-членам, но используются по-другому. При щелчке на кнопке (к примеру, ОК) в графическом пользовательском интерфейсе (GUI) соответствующий объект в программе генерирует (или возбуждает) событие (скажем OKButtonClick), по которому определенная часть программы реагирует на действие пользователя. О приложении такого типа говорят, что оно управляется событиями, поскольку его следующее действие зависит от генерируемого события. Здесь уже неприменимо понятие программы, исполняющейся в той последовательности, в которой написаны ее операторы. Такая асинхронная способность используется в GUI (и других важных типах приложений, поскольку пользователь в любой момент может щелкнуть кнопкой мыши или нажать клавишу на клавиатуре. Синтаксический блок 5.1. Обзор элементов класса
Определение_класса::=
class <Идентификатор_класса>
{
<Члены_класса>
} где
1. <Члены_класса>
1.1. ::= <Данные-члены>
1.2. ::= <Функции-члены>
1.3. ::= <Вложенные_типы>
1.1. <Данные-члены>
1.1. 1. ::=<Переменные-члены>
1.1. 2. Константы
1.1. 3. События
1.2. <Функции-члены>
1.2.1. : := Методы
1.2.2. : := Конструкторы
1.2.3. : := <Деструктор>
1.2.4. : := Свойства
1.2.5. : := <Индексаторы>
1.2.6. : := Операции
1.3. <Вложенные_типы>
1.3.1. ::= <Вложенные_классы>
1.3.2. ::= <Вложенные_структуры>
1.3.3. ::= <Вложенные_перечисления> Примечания

1. В приведенном здесь определении класса основное место занимают его внутренние особенности, поэтому в нем опущены синтаксические элементы, связанные с модификацией доступа, наследованием и интерфейсами.
2. Порядок элементов класса может быть любым внутри него, он не меняет семантики.
3. <Функция-член> может быть либо <Функция_экземпляра>, либо <Статическая_функция>
24
называемая также <Функция_класса>). Функция экземпляра всегда исполняется по отношению к конкретному объекту, поэтому последний необходим для ее вызова.
Функции-члены могут быть методами, конструкторами, деструкторами, свойствами, индек- саторами и операциями
1. Метод — знакомая конструкция, которая, тем не менее, обладает многими еще неизученными свойствами, как, например, ссылочные и выходные параметры, массивы параметров, перегрузка метода и ключевое слово this. Их изучению посвящена большая часть этой главы.
2. Конструкторы были рассмотрены ранее.
3. Деструктор (называемый также завершающим методом) — новое понятие. Итак, объекты создаются и размещаются в определенной области памяти, где хранятся значения их переменных экземпляра и другие данные. Когда объект становится ненужным программе, занимаемую им память следует освободить для других объектов (иначе программа быстро начнет испытывать дефицит памяти. Деструктор, подобно своему собрату-конструктору, может содержать набор операторов, которые вызываются средой исполнения (их нельзя вызвать непосредственно из программы, когда происходит переполнение памяти.
4. Доступ к свойствам осуществляется также, как к переменным-членам. Различие состоит в том, что свойство содержит операторы, которые исполняются подобно операторам метода, когда происходит обращение к нему. Они часто используются вместо аксессоров и мутаторов (которые обычно имеют имена, наподобие GetDistance
и SetDistance) для доступа к закрытым переменным, поддерживая, таким образом, принцип инкапсуляции.
5. Индексаторы используются с классами, представляющими массивы. Также, как свойства обеспечивают удобный доступ к отдельным переменным-членам, индексаторы выполняют эту функцию для массивов, размещенных внутри классов.
1   2   3   4


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