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

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


Скачать 309.29 Kb.
Название1. Массивы и классы 4 Элементы массива как ссылки на объекты 4
Дата12.11.2018
Размер309.29 Kb.
Формат файлаpdf
Имя файлаpractice_5.pdf
ТипДокументы
#56244
страница2 из 4
1   2   3   4
3. Разработка внутренних методов Методы данной программы не содержат каких-либо сложных алгоритмов, поэтому здесь упоминаются только два незначительных вопроса (связанных с классом Bank): а Элемент accounts[0] содержит ссылку на объект Account. Метод этого объекта вызывается посредством стандартного синтаксиса accounts[0].GetBalance() б Для пользователя первый счет имеет индекс 1 (строка 208). Поэтому вводимые или выдаваемые пользователю индексы счетов следует корректировать соответствующим образом. Например, в методе Deposit (строки 71-82) пользователь вводит номер счета, на который нужно перевести средства. Он присваивается переменной accountNumber, но так как массив индексируется с нуля, в строках 79 и 81 из нее вычитается 1.
001
002
003
004
005
006
007
008
009
010
011
012
013 014 015 016 017 018
019
020 021 022 023
024
025 026 027
4. Листинг 5.2. Исходный код BankSimulation.cs.
Программа моделирования работы в банке
using System; // Программа реализует доступ и управление несколькими счетами

namespace ConsoleApplication_ BankSimulation
{
/******************************************************/
class Account // Account (счет) - это пользовательский класс Account - это объект
{ // Объект Account должен хранить (те. содержать) следе переменные экземпляра
private decimal balance; // 1) свой баланс (то есть баланс данного счета,
private decimal currentlnterestRate; // 2) свою текущую процентную ставку
private decimal totallnterestPaid; // 3) сумму начисленных процентов
public Account() // Это конст-р Account, те. м-д стем же им-ем, что и класс Account, в кот-м он нах-ся
{ // Назначение конст-ра - инициализация переменных экземляра класса Account balance = 0; currentlnterestRate = 0; totallnterestPaid = 0;
}
// # 3.1.1
public void SetInterestRate(decimal newInterestRate) // М-д (мутатор) - уст-вить проц-ную ставку
{ currentlnterestRate = newInterestRate;
}
public decimal GetlnterestRate() // Метод (аксессор) - получить процентную ставку # 4.1.2

{ // # 7.1.1
return currentlnterestRate;
}
028 // # 4.1.3
029: public void Updatelnterest() // Метод (мутатор) : 1) определение суммы начисленных процентов
030: { // 2) определение баланса с учетом суммы начисленных процентов
031: totallnterestPaid += balance * currentlnterestRate;
032: balance += balance * currentlnterestRate;
10

033: }
034: // # 6.1.1
035: public decimal GetTotalInterestPaid() // М-д (аксессор) - получить значение суммы начис-х про-тов
036: {
037: return totallnterestPaid;
038:}
039: // # 1.1.1
040: public void Deposit(decimal amount) // М-д (мутатор) - определение баланса (положить вклад)
041: {
042: balance += amount;
043: }
044: // # 2.1.1
045: public void Withdraw(decimal amount) // М-д (мутатор) - определение баланса (снять со счета)
046: {
047: balance -= amount;
048: }
049:
050: public decimal GetBalance() // # 4.1.1 - М-д (аксессор) - получение значения баланса
051: { // # 1.1.2 ; # 2.1.2 ; // # 5.1.1
052: return balance;
053: }
054: }
055: конец класса Account//////////////////////////////////////////////////
056: class Bank // кл-с Bank сод-жит колл-цию сч-ов. Все м-ды кл-са пред-ны для изменения или чтения
057: { // информации одного счета или всей коллекции счетов и, след-но, зависят от мет-ов класса Account
058: private Account [ ] accounts; // кл-су Банк треб-ся только одна перем-я экз-ра - мас-в счетов accounts
059:
060: public Bank() // Констр-р Bank - созд-т новые объекты Account, которыми класс Bank будет управлять
061: {
062: Поздравляем Вы создали новый банк
063: Пожалуйста, введите количество счетов в банке ");
064: accounts = new Account[Convert.ToInt32(Console.ReadLine())];
065: for (int i = 0; i < accounts.Length; i++)
066: { // присв-е ссылок на объекты Account элементам массива accounts, строки 012...017
067: accounts[i] = new Account();
068: }
069: }
070:
071: public void Deposit() // Положить средства на указанный счет # 1.1
072: {
073: int accountNumber; // индекс мас-ва accounts. Для польз-ля первый инд-с = 1, для прог-мы - нулю.
074: decimal amount;
075: Положить средства. Пожалуйста, введите номер счета ");
076: accountNumber = Convert.ToInt32(Console.ReadLine());
077: Введите объем вклада ");
078: amount = Convert.ToDecimal(Console.ReadLine()); // amount - объем вклада
079: accounts[accountNumber - 1].Deposit(amount); // 040 - 043; мас-в accounts инд-ся с нуля, поэтому
080: Новый баланс счета {0}: {1 :C}", // из инд-а выч-ся 1 [accountNumber - 1].
081: accountNumber, accounts[accountNumber - 1].GetBalance()); // 050 - 053
11

082:
083:
084:
085:
086:
087:
088:
089:
090:
091:
092:
093:
094:
095:
096:
097:
098:
099:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
public void Withdraw() // Снять средства с указанного счета # 2.1
int accountNumber;
decimal amount;
Сопэо1е^г^е("Снять средства. Пожалуйста, введите номер счета "); accountNumber = Convert.ToInt32(Console.ReadLine());
Сопэо1е^г^е("Введите объем снимаемых средств "); amount = Convert.ToDecimal(Console.ReadLine()); // amount - объем снимаемых средств со счета accounts[accountNumber - 1].Withdraw(amount); // 045 - 048 Новый баланс счета {0}: {1 :C}", accountNumber, accounts[accountNumber - 1].GetBalance()); // 050 - 053
f
public void SetInterestRate() // Установить процентную ставку указанного счета # 3.1

{
int accountNumber;
decimal newInterestRate; Установите процентную ставку. Пожалуйста, введите номер счета "); accountNumber = Convert.ToInt32(Console.ReadLine()); Введите процентную ставку "); newInterestRate = Convert.ToDecimal(Console.ReadLine()); accounts[accountNumber - 1].SetInterestRate(newInterestRate); // 019 - 022
}
public void PrintAllInterestRates() // Вывести процентную ставку по каждому счету # 7.1
{ Процентная ставка для всех счетов ");
for (int i = 0; i < accounts.Length; i++)
{ Счета {0,-3}: {1,-10}",
(i+1), accounts[ i ].GetInterestRate()); // 024 - 027
}
}
public void PrintAllBalances() // Вывести балансы всех счетов # 5.1
{ Баланс счета для всех счетов ");
for (int i = 0; i < accounts.Length; i++)
{ Счета {0,-3}: {1:C}",
(i+1), accounts[ i ].GetBalance()); // 050 - 053
}
}
public void PrintTotalInterestPaidAllAccounts() // Выв-ти сумму проц-в, начисл-х по кажд. сч-у # 6.1 Общая процентная ставка, оплаченная за каждый индивидуальный счет
12

132: for (int i = 0; i < accounts. Length; i++)
133: {
134: Счета {0,-3}: {1 :C}",
135: (i+1), accounts[ i ].GetTotalInterestPaid()); // 035 - 038
136: }
137: }
138:
139: public void UpdateInterestAllAccounts() // Добавить проценты по всем счетам # 4.1

140: {
141: for (int i = 0; i < accounts. Length; i++)
142: {
143: Console. Процентная ставка, добавленная к счету номер {0,-3}: {1:C}",
144: (i+1), accounts[i].GetBalance() * accounts[i].GetInterestRate());
145: accounts[ i ].UpdateInterest(); // 050 - 053; 024 - 027; 029 - 033
146: }
147: }
148: }
149: конец класса Bank//////////////////////////////////////////////////
150: class BankSimulation // класс Моделирование Банка
151: {
152: private static Bank bigBucksBank; // кл-су BankSimulation треб-ся одна пер-я экз-ра - объект Bank
153:
154: public static void Main()
155: {
156: string command;
157:
158: bigBucksBank = new Bank(); // Создание нового объекта Bank, строки 060...069
159: do
160: {
161: PrintMenu();
162: command = Console.ReadLine().ToUpper();
163: switch(command)
164: {
165: case "D":
166: bigBucksBank. Deposit(); // 071 - 082 , # 1
167: break;
168: case "W":
169: bigBucksBank. Withdraw(); // 084 - 095, # 2
170: break;
171: case "S":
172: bigBucksBank. SetInterestRate(); // 097 - 106 , # 3
173: break;
174: case "U":
175: bigBucksBank.UpdateInterestAllAccounts(); // 139 - 147 , # 4
176: break;
177: case "P":
178: bigBucksBank. PrintAllBalances(); // 119 - 127, # 5
179: break;
180: case "T":
13

181: bigBucksBank.PrintTotalInterestPaidAllAccounts(); // 129 - 137 , # 6
182: break;
183: case "I":
184: big BucksBank. PrintAllInterestRates(); // 108 - 116 , # 7
185: break;
186: case "E":
187: Console.WriteLine("Bye Bye!");
188: break;
189: default:
190: Неправильный выбор
191: break;
192: }
193: } while (command != "E");
194: Console.ReadLine();
195: конец метода Main/////////////////////////////////////////////////////
196:
197: private static void PrintMenu()
198: {
199: Что Вы желаете сделать" +
200: "D)eposit - положить средства на указанный счет" +
201: "W)ithdraw - снять средства с указанного счета" +
202: "S)et interest rate - установить процентную ставку указанного счета" +
203: "U)pdate all accounts for interest - добавить проценты ко всем счетам" +
204: "P)print all balances - вывести балансы всех счетов" +
205: "T)otal interest paid printed for all accounts - выв-ти сумму проц-тов, нач-х по каж-му счету" +
206: "I)nterest rates printed for all accounts - вывести процентную ставку по каждому счету" +
207: "E)nd session - завершить моделирование" +
208: "Note: First account has account number one - первый счет имеет индекс один
209: }
210: конец класса BankSimulation//////////////////////////////////////////////////
211: }
4.1. Результаты работы программы Поздравляем Вы создали новый банк Пожалуйста, введите количество счетов в банке 2 Что Вы желаете сделать
D)eposit - положить средства на указанный счет
W)ithdraw - снять средства с указанного счета
S)et interest rate - установить процентную ставку указанного счета
U)pdate all accounts for interest - добавить проценты ко всем счетам
P)print all balances - вывести балансы всех счетов
T)otal interest paid printed for all accounts - вывести сумму процентов, начисленных по каждому счету
I)nterest rates printed for all accounts - вывести процентную ставку по каждому счету
E)nd session - завершить моделирование
Note: First account has account number one - первый счет имеет индекс один
d Положить средства. Пожалуйста, введите номер счета 1 Введите объем вклада 100000 Новый баланс счета 1: 100 р.
14
а Положить средства. Пожалуйста, введите номер счета 2 Введите объем вклада 200000 Новый баланс счета 2: 200 р. Б Установите процентную ставку. Пожалуйста, введите номер счета 1 Введите процентную ставку 0,1 Б Установите процентную ставку. Пожалуйста, введите номер счета 2 Введите процентную ставку 0,2 и Процентная ставка, добавленная к счету номер 1 : 10 р. Процентная ставка, добавленная к счету номер 2 : 40 р. Р Баланс счета для всех счетов Счета 1 : 110 р. Счета 2 : 240 р.
1 Общая процентная ставка, оплаченная за каждый индивидуальный счет Счета 1 : 10 р. Счета 2 : 40 р. Процентная ставка для всех счетов Счета 1 : 0,1 Счета 2 : 0,2
w Снять средства. Пожалуйста, введите номер счета 1 Введите объем снимаемых средств 1000 Новый баланс счета 1: 109 р.
w Снять средства. Пожалуйста, введите номер счета 2 Введите объем снимаемых средств 2000 Новый баланс счета 2: 238 р.
5. Двумерный массив Вернемся к программе моделирования лифта (см. Пособие к Практическому занятию №3, стр. 12, сл.). Запрос нужного этажа определяется следующим образом "человек" запрашивает доставку его на конкретный "этаж" путем "нажатия" на "кнопку" в "лифте. Предположим, нужно
15
отследить количество вызовов в час в течение семи дней. Обычный человек мог бы просто записать всю статистику (см. табл. 5.1). В этом случаев таблицу уже занесены данные по двум первым часам первого дня 89 и 65 запросов, соответственно. Для идентификации данных по каждому часу необходимо задать два индекса — день и час Поэтому таблица оказывается двумерной. В данном случае (day: 1, hour: 0) равняется 89. Таблица 5.1. Статистика собранная вручную (количество вызовов в час. Час 0 Час 1 Час 2 Час 3 Час 23 День 1
89
65 День 2 День 7 Примечание Час 0 является часом между полуночью 00:00 и первым часом ночи 01:00.
5.1. Объявление и определение двумерного массива Как эффективно реализовать эквивалент системы отслеживания вызовов лифта в программе С Прежде всего требуется структура для хранения данных, показанных в табл. 5.1. Если воспользоваться двумерным массивом, можно назначить один индекс для строки и один — для столбца и выражать день 4, час 7 как [ 3,7 ]. (Следует отметить, что дню 4 соответствует значение индекса равное 3, а часу 7 — индекс 7, поскольку первый час обозначен 0, как показано в таблице 5.1.) ПРИМЕЧАНИЕ В многомерном массиве (как ив одномерном) индексация тоже начинается с нуля. Следовательно, первым элементом в двумерном массиве является элемент [0,0]. Объявление и определение двумерного массива requests
типа ushort
показано на рис. 5.1. При создании нового массива с помощью ключевого слова new внутри пары квадратных скобок требуется одна запятая, указывающая на два измерения, а два разделенных запятой числа и 24) определяют длины измерений массива. Объявление переменной двумерного массива Создание нового объекта двумерного массива ushort [ , ] requests = new ushort [7,24]; Одна запятая указывает на два измерения
L Длина массива по второму измерению Длина массива по первому измерению Предыдущий оператор можно разбить на две строки ushort[ , ] requests; requests = new ushort [7,24]; Рис. Объявление и определение двумерного массива запросов лифта Объявление переменной массива, создание нового объекта и присваивание переменной ссылки на объект (первая строка на рис. 5.1) можно (как ив случае одномерного массива) разбить на два оператора. Результат показан в нижней части рис. 5.1.
16

5.2. Доступ к элементам двумерного массива После объявления переменной массива и присваивания ей ссылки на двумерный объект можно обращаться к его отдельным элементам. За исключением того, что для обращения к элементам двумерного массива требуется дополнительный индекс, они используются аналогично элементам одномерного массива. Следовательно, любой из них можно использовать также, как и отдельную переменную базового типа. Например requests[0,0] = (ushort) 89; Здесь применяется приведение к типу (ushort), поскольку он является базовым типом
requests. Оно необходимо, так как литерал 89
принадлежит к типу int,
который не может быть неявно преобразован в ushort. Элементы массива используются ив вычислениях. В следующей строке общее число запросов за первые три часа четвертого дня присваивается переменной subTotal:
subTotal = (ushort) (requests[3,0] + requests[3,1] + requests[3,2]); Как будет видно из листинга 5.5, два вложенных цикла хорошо подходят для прохождения по элементам двумерного массива. Далее рассматривается логика, которой они сле-
По одномерному массиву можно проходить с помощью одного цикла for,
как показано в листинге 5.3. Листинг 5.3. Один цикл for для прохождения по одномерному массиву. int [ ] myArray = new int [24];
for (int j = 0; j < 24, j++)
{ Переменная массива requests представляет часы не одного дня, а семи Таким образом, повторяя показанный на рис. 5.4 процесс семь раз, можно обратиться к значениям часов всех семи дней. Такую функциональность можно создать, включив предыдущий цикл for в другой цикл
for, который повторяется семь раз. Фрагмент исходного кода приведен в листинге 5.4. Листинг 5.4. Два вложенных цикла for для обработки двумерного массива. ushort [ , ] requests = new ushort [7,24]; дуют.
... туАггау[ j ] ...
}
for (int i = 0; i < 7; i++)
{ часы суток дни недели
for (int j = 0; j < 24 ; j++)
{ этот блок повторяется семь раз
... requests[i, j] ...
17

} Массив requests в листинге 5.5 используется для хранения количества вызовов лифта в течение каждого часа за семидневный срок. Для простоты программа генерирует количество вызовов в час с помощью класса System.Random
(см. строки 12, 22
и 24). Сутра и до 6 вечера количество вызовов составляет от 20 до 99 (см. строку 24), в другое время суток — от 1 до 10 (см. строку 22). Количество вызовов хранится в массиве requests (см. строку 11) и выводится в таблице с ю строками имя столбцами как показано в примере вывода после листинга 5.3. Массив применяется для вычисления общего числа вызовов задень и среднего числа вызовов за час, которые также отображаются в выводе.
1   2   3   4


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