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

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


Скачать 309.29 Kb.
Название1. Массивы и классы 4 Элементы массива как ссылки на объекты 4
Дата12.11.2018
Размер309.29 Kb.
Формат файлаpdf
Имя файлаpractice_5.pdf
ТипДокументы
#56244
страница1 из 4
  1   2   3   4
Содержание
1. Массивы и классы 4
1.1. Элементы массива как ссылки на объекты 4
1.2. Листинг 5.1. Исходный код ElevatorArray.cs - для эффективного управления коллекцией лифтов 5 используется массив объектов
1.3. Массивы как переменные экземпляра в классах 7
1.4. Программа моделирования работы банка 8
1.5. Спецификации программы 8
2. Разработка программы моделирования работы банка 8
2.1. Разделение каждой подсистемы на объекты (модули) 8
2.2. Идентификация переменных экземпляров классов 8
2.3. Идентификация методов в каждом модуле 9
2.3.1. Класс Account 9
2.3.2. Класс Bank 9
2.3.3. Класс BankSimulation 9
3. Разработка внутренних методов 10
4. Листинг 5.2. Исходный код BankSimulation.cs. Программа моделирования работы в банке .... 10
4.1. Результаты работы программы BankSimulation.cs 14
5. Двумерный массив 15
5.1. Объявление и определение двумерного массива 16
5.2. Доступ к элементам двумерного массива 17
5.3. Листинг 5.5. Исходный код ElevatorRequestTracker.cs - отслеживания вызовов лифта в течение каждого часа за семидневный срок
5.4. Результаты работы программы ElevatorRequestTracker.cs 19
5.5. Свободные (зубчатыми) массивы 20
5.6. Листинг 5.6. Исходный код JaggedElevatorRequests.cs - сбор количества вызовов лифта каждый день за различное число часов
5.7. Результаты работы программы - JaggedElevatorRequests.cs 22
6. Анатомия класса 23
6.1. Анатомия класса обзор 23
6.2. Переменные-члены 25
6.2.1. Переменные экземпляра 25
6.2.2. Переменные static 26
6.3. Листинг 5.7. Исходный код DynamicBankSimulation.cs. - открытие и закрытие банковских счетов в течение времени исполнения программы
6.4. Результаты работы программы - DynamicBankSimulation.cs 30 Контрольные вопросы 33 Упражнения по программированию 34 Список литературы 35 Приложение. С & .NET по шагам http://www.firststeps.ru/dotnet/dotnet1 .html 36
3

1. Массивы и классы Базовый тип массива может быть не только простым типом (см. Материалы к Практ. занятию, стр. 45), а также может быть любым, включая класс. В следующем разделе приведены примеры, как работать с сохраненными в элементах массива ссылками на объекты (с использованием важного свойства массивов в С играть роль переменных экземпляра в классах.
1.1. Элементы массива как ссылки на объекты В программе, приведенной на листинге 5.1, для эффективного управления коллекцией лифтов используется массив объектов (строка 37). Программа демонстрирует синтаксис и приемы работы с массивом, содержащим ссылки на объекты. Напомним пример моделирования лифта- (см. Материалы к Практ. занятию №3, стр. 12, сл.). В нем определенно только один объект
Elevator, подобный тем, что создаются в строках 5—31
листинга 5.1. Здесь же метод Main() строки 35—59),
в отличие от предыдущей программы, управляет 10 лифтами. Чтобы сконцентрировать внимание только на важных вопросах, связанных с массивами объектов, в программе опущены некоторые аспекты, включенные в пример рассмотренный на
Практ. занятии №3. Здесь нет, например, объектов Person, — вместо этого лифты управляются непосредственно из метода Main(), где доступ к объектам Elevator осуществляется из массива. В строках 5—31 определен скелет" класса Elevator. Он следит за своим текущим положением (переменная currentFloorNumber, объявленная в строке 7) и общим числом пройденных этажей (floorsTraveled в строке 8). Конструктор, определенный в строках 10-14, инициализирует обе переменные экземпляра значением нуль (Напомним, что конструктор автоматически вызывается в процессе создания нового объекта и представляет собой удобный механизм для инициализации) Объект Elevator может перемещаться на новый этаж (MoveToFloor в строках 16-20), возвращать общее число пройденных этажей (GetFloorsTraveled в строках 22-25) и свое текущее положение (строки 27-30). Теперь можно создать большую группу объектов Elevator и управлять ей. Для этого применяется массив базового типа Elevator. Программа обрабатывает 10 объектов этого типа (в методе Main()). Для объявления массива достаточно использовать стандартный синтаксис, где вместо имени одного из простых типов применяется Elevator. Таким образом, оператор
Elevator [ ] elevators в строке 37 определяет переменную elevators как массив базового типа Elevator. Пока она ссылается на null, поэтому далее следует создать массив объектов Elevator длиной 10 и присвоить ей ссылку на него. Обычно для этого применяется ключевое слово new. После выполнения строки 37
Elevator [ ] elevators = new Elevator[10]; переменная elevators ссылается на объект массива с десятью элементами. Но поскольку ни одному из них еще не присвоена ссылка на конкретный объект Elevator, они равны null. Для каждого элемента массива elevators нужно создать объект Elevator и присвоить элементу ссылку на него (строки 38—41). Это производится в цикле for, где индекс i пробегает значения от 0 дои каждому элементу elevators присваивается ссылка на объект Elevator строка 38):
elevators[ i ] = new Elevator();
4
После этого каждый элемент массива ссылается на объект Elevator.
for (int i=0; i i++)
{ elevators[ i ] = new Elevator();
} Теперь 10 элементов массива elevators можно использовать в программе. Для идентификации конкретного объекта Elevator необходимо указать индекс в квадратных скобках после имени массива. Например, первый объект elevators[0] Для вызова метода объекта применяется операция уточнения, за которой следует имя метода (строка 45):
elevators[0].MoveToFloor(10); Здесь вызывается метод MoveToFloor первого объекта Elevator из массива elevators с аргументом 10 (й этаж. В строках 45—48 первый и пятый лифты "перемещаются" несколько раз. Можно было бы предусмотреть более сложный алгоритм перемещений, включающий все 10 лифтов. В строках 50-57 вызываются методы GetFloorsTraveled и GetCurrentFloorNumber каждого объекта Elevator, возвращающие статистику объекта. Пример вывода подтверждает, что в системе перемещаются только первый и пятый лифты.
1.2. Листинг 5.1. Исходный код ElevatorArray.cs.
01: using System; // Пространство имен
02
03
04
05
06
07 08 09
10
11 12 13 14 15 16 17 18 19 20 21 22
/******************************************************/
namespace ConsoleApplication_Mic10_13_c382_ElevArr
{
class Elevator // Elevator - это пользовательский класс Elevator - это объект
{
private int currentFloorNumber; // текущее положение лифта (номер этажа)
private int floorsTraveled; // количество пройденных этажей
public Elevator() // конструктор инициализирует обе перем-е экз-ра значением нуль
{ // констр-р автомат-ки выз-ся при созд-нии объекта и удобен для инициализации currentFloorNumber = 0; floorsTraveled = 0;
} // далее вызывается метод Main (строка 33)
// toFloorNumber - номер этажа назначения.
public void MoveToFloor(int toFloorNumber) // В методе рассчитываются
{ // 1) общее число пройденных этажей, floorsTraveled += Math.Abs(currentFloorNumber - toFloorNumber); currentFloorNumber = toFloorNumber; // 2) и текущее положение лифта
}
public int GetFloorsTraveled() // возврат общего числа пройденных этажей
23 {
24: return floorsTraveled;
25: }
26:
5

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
public int GetCurrentFloorNumber() // возврат текущего положения лифта (номера этажа)
{
return currentFloorNumber;
}
}
/******************************************************/
class ElevatorArray
{
public static void Main()
{ // для эффек-го управ-ния коллекцией лифтов исполь-ся массив 10 объектов
Elevator [ ] elevators = new Elevator[10];
for (int i=0; i i++)
{ elevators[ i ] = new Elevator(); // Создание массива объектов Elevator[10]
} // Перем-я elevators ссыл-ся на объект массива с ю элем-ми
// й [0] и й [4] лифты "перемещаются" несколько раз е1еуа1ог8[0].МоуеТоР1оог(10);//выз-ся м-д MoveToFloor о об-та Elevator из мас-ва elevators с арг-м 10 elevators[4].MoveToFloor(20); // и т.д. -'- го -'- 20 elevators[0].MoveToFloor(5); // и т.д. -'- го -'- 5 elevators[4].MoveToFloor(7); // и т.д. -'- го -'- 7
// факт. арг-нт 10, 20, 5 или 7 (этаж назн-я) присваивается форм. арг-ту toFloorNumber
C o n s o l e . ' ^ ^ • ^ ( " Общее число перемещений и текущее положение лифта:\п");
Console. WriteLine(" Число перемещений Текущее положение //
for (int i=0; i{ // возврат статистики объекта
C o n s o ^ ' m e L ^ e O ^ ^ {0,2}: {1,4} {2,4}",
(i + 1), elevators[ i ].GetFloorsTraveled(), // возврат статистики объекта elevators[ i ].GetCurrentFloorNumber()); // -'-
}
Console.ReadLine();
}
}
} Результаты работы программы Общее число перемещений и текущее положение лифта Число перемещений Текущее положение
Elevator 1:
15
5
Elevator 2: 0 0
Elevator 3:
0 0
Elevator 4:
0 0
Elevator 5: 33
7
Elevator 6:
0 0
Elevator 7:
0 0
Elevator 8: 0 0
Elevator 9:
0 0
Elevator 10: 0 0
6

1.3. Массивы как переменные экземпляра в классах Классы, рассмотренные на всех практических занятиях, имеют следующий стандартный вид (см. Материалы к Прак. занятию №1, рис. 1.5):
class AnyClass
{ Переменные экземпляра
< Методы > Другое
} Переменные экземпляра используемые в примерах, состояли, в основном, из простых типов (см. Материалы к Прак. Занятию №4, стр. 45). Но они могут быть и объектами, к примеру, класса System.Array.
Это иллюстрируется в следующем примере. Рассмотрим моделирующую программу, где определен класс Building. Предположим, требуется, чтобы он "содержал" объекты Elevator и Floor (как реальное здание содержит этажи и лифты. Для этого в определении класса Building необходимо объявить две переменных экземпляра типа System.Array elevators и floors:
class Building
{
private Elevator [ ] elevators;
private Floor [ ] floors; Другие переменные экземлляра>
< Методы > Другое
} Теперь им можно присвоить объекты массива с определенным числом лифтов и этажей (с помощью одного из методов класса Building). Например, объект Building
здания, имеющего 10 лифтов и 30 этажей, содержит следующие операторы инициализации elevators и floors:
elevators = new Elevator[10];
floors = new Floor[30]; Рассмотрим другой пример, связанный с банками и балансами счетов. Массив accountBalances использовался здесь для демонстрации различных свойств массива. Коллекция балансов счетов (представленная массивом простого типа decimal) как переменная экземпляра в классе Bank хорошо иллюстрирует синтаксис и семантику массивов в простом контексте. Однако, учитывая сложность ПО для реального банка, необходимо воспользоваться более объектно-ориентированным подходом. Как это сделать Банк можно рассматривать непросто как список счетов, а как хранилище их коллекции Для этого нужно создать
1) класс Account:
class Account
{ Переменная экземпляра Методы
}
7
и 2) класс Bank с коллекцией объектов Account:
class Bank
{
private Account [ ] accounts; Другие переменные экземпляра Методы
} В следующем примере показана программа моделирования банка, где массив счетов используется как переменная экземпляра класса Bank.
1.4. Программам одели ров ан и я работы банка Полный исходный код программы (обсуждается ниже) приведен на листинге 5.2.
1.5. Спецификации программы Программа моделирует работу банка, содержащего несколько счетов. Доступ и управление ими осуществляется посредством простого пользовательского интерфейса в окне консоли. С помощью простых команд пользователь должен иметь возможность -
1. Указать исходное число счетов в банке ; строки 158 ^ 060 - 069
2. Положить средства на указанный счет ; # 1 строки 200, 165, 166
3. Снять средства с указанного счета ;
# 2 строки 201, 168, 169
4. Установить процентную ставку указанного счета
# 3 , строки 202, 171,
5. Добавить проценты ко всем счетам ;
# 4 строки 203, 174, 175
6. Вывести балансы всех счетов ;
# 5 строки 204, 177, 178
7. Вывести сумму процентов, начисленных по каждому счету ; # 6 , строки 205, 180
8. Вывести процентную ставку по каждому счету
J # 7 , строки 206, 183
9. Завершить моделирование ; строки 207, 186, 187
2. Разработка программы моделирования работы банка
2.1. Разделение каждой подсистемы на объекты (модули Два очевидных класса программы — Account (строки 6-54)
и Bank (строки 56-148),
атак- же третий класс BankSimulation (строки 150-210).
Этот класс содержит метод Main(),
который объединяет различные части программы и обрабатывает пользовательский ввод.
2.2. Идентификация переменных экземпляров классов Согласно спецификациям программы, объект Account должен хранить следующую информацию свой баланс
b) свою текущую процентную ставку
c) сумму начисленных процентов Следовательно, класс Account должен содержать переменные экземпляра (строки 8-10):
a) private decimal balance;
b) private decimal currentlnterestRate;
c) private decimal totallnterestPaid;
8
Класс Bank содержит коллекцию счетов. Вся необходимая ему информация содержится в объектах этой коллекции Следовательно, классу Bank требуется единственная переменная экземпляра — массив счетов Ее объявление выглядит следующим образом (строка 58):
private Account [ ] accounts; Классу BankSintulation также требуется только одна переменная экземпляра — объект
Bank (объявленный в строке 152).
2.3. Идентификация методов в каждом модуле
2.3.1. Класс Account.| Все переменные экземпляра должны быть инициализированы вовремя создания объекта, которому они принадлежат. Для этого предназначен конструктор в строках (Конструктором является метод стем же именем, что и класс, в котором он находится) Он выполняется на этапе создания нового объекта Account. В данном примере конструктор инициализирует все переменные экземпляра нулевыми значениями. Все переменные экземпляра Account объявлены как private, чтобы предотвратить доступ к ним извне объекта. Как следствие, для их чтения и установки значения необходимо определить специальные методы, называемые "аксессор" и "мутатор", соответственно. Для переменной определены два метода мутатор SetlnterestRate (строки 19—22) и ак-
сессор GetlnterestRate (строки 24—27). Значение переменной balance изменяется с помощью
мутаторов Deposit (строки 40—43) и Withdraw (строки 45—48), а возвращается — аксессором
GetBalance (строки 50-53). Для переменной totallnterestPaid мутатором является Updatelnter-
est (строки 29-33), а аксессором — GetTotallnterestPaid (строки 35-38).
2.3.2. Класс Bank|. При создании нового объекта Bank нужно создать и объекты Account, которыми он будет управлять, и присвоить ссылки на них элементам массива accounts. Эту задачу можно было бы выполнить стандартным методом, вызвав его после создания объекта Bank. Но, поскольку эта процедура должна производиться для любого нового объекта Bank, ее может выполнить конструктор класса (строки 60-69). При создании нового объекта Bank (строка 158), у пользователя автоматически запрашивается количество счетов в этом банке. Следует обратить внимание, что заданное число счетов не может быть изменено вовремя исполнения программы. После этого объекты счетов в массиве accounts готовы к доступу. Все методы класса Bank предназначены для изменения или чтения информации одного счета или всей коллекции счетов и, следовательно, зависят от методов класса Account. Перечисленные ниже методы работают похоже все они позволяют пользователю ввести номер нужного счета и выполнить операции над ним.
a) Deposit (строки 71-82)
b) Withdraw (строки 84-95)
c) SetlnterestRate (строки 97-106) Следующие четыре метода проходят по всей коллекции счетов либо для обновления конкретной переменной экземпляра в каждом объекте Account, либо для вывода информации
a) PrintAlllnterestRates (строки 108-116)
b) PrintAllBalances (строки 119-127)
c) PrintTotallnterestPaidAllAccounts (строки 129-137)
d) UpdatelnterestAllAccounts (строки 139-147)
2.3.3. Класс BankSimulation. Этот класс является контейнером для объекта Bank и методов и PrintMenu. Последний содержит цикли оператор switch, обрабатывающие команды пользователя. Следует отметить, что метод Main() в такой схеме достаточно прост.
9
Все основные задачи переданы другим методам, находящимся либо внутри класса BankSimula-
^ оме то д PrintMenu), либо внутри других объектов (Bank и Account).
  1   2   3   4


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