Файл: История и развитие методологии объектно-ориентированного программирования. Сферы применения (Развитие методологии объектно-ориентированного программирования).pdf
Добавлен: 28.03.2023
Просмотров: 465
Скачиваний: 3
СОДЕРЖАНИЕ
1. Развитие методологии объектно-ориентированного программирования
1.2 Структурное программирование
1.3 Объектно-ориентированное программирование
2. Реализация объектно-ориентированного программирования
2.1 Объектно-ориентированное программирование в языке C++
2.2 Объектно-ориентированное программирование в языке Objective-C
3.1 Обзор и анализ предметной области
3.2 Проектирование классов программы
3.4 Проектирование интерфейса и алгоритмов программы
{
return string.Format("{0}, вам одобрен вклад с ежегодной капитализацией " +
"на {1} лет с суммой {2} рублей и процентной ставкой {3}.\n", Name, Years, Sum, Rate);
}
public override double GetOverall()
{
double r = Rate / 100;
return Math.Round(Sum * Math.Pow(1 + r, Years), 2);
}
}
}
Листинг А3. Исходный код модуля DepositMonth.cs
using System;
namespace DepositProject
{
/// <summary>
/// Класс вклада с ежемесячной капитализацией, наследник базового абстрактного класса Deposit
/// </summary>
class DepositMonth : Deposit
{
public static new readonly int MIN_SUM = 200000;
public static new readonly int MIN_YEARS = 2;
public new double Rate { get; } = 4.5;
public DepositMonth() : base() { rate = 4.5; }
public DepositMonth(string t, int d, double s) : base(t, d, s) { }
public DepositMonth(DepositMonth dep) : base(dep) { }
~DepositMonth()
{
Console.Write("{0}, вклад с ежемесячной капитализацией удален!", Name);
}
public override string ToString()
{
return string.Format("{0}, вам одобрен вклад с ежемесячной капитализацией " +
"на {1} месяцев с суммой {2} рублей и процентной ставкой {3}.\n", Name, Years * 12, Sum, Rate);
}
public override double GetOverall()
{
double r = Rate / 100;
double monthRate = r / 12;
double months = Years * 12;
return Math.Round(Sum * Math.Pow(1 + monthRate, months), 2);
}
}
}
Листинг А4. Исходный код модуля DepositDay.cs
using System;
namespace DepositProject
{
/// <summary>
/// Класс вклада с ежедневной капитализацией, наследник базового абстрактного класса Deposit
/// </summary>
class DepositDay : Deposit
{
public static new readonly int MIN_SUM = 500000;
public static new readonly int MIN_YEARS = 3;
public new double Rate { get; } = 4.2;
public DepositDay() : base() { rate = 4.2; }
public DepositDay(string t, int d, double s) : base(t, d, s) {}
public DepositDay(DepositDay dep) : base(dep) {}
~DepositDay()
{
Console.Write("{0}, вклад с ежедневной капитализацией удален!", Name);
}
public override string ToString()
{
return string.Format("{0}, вам одобрен вклад с ежедневной капитализацией " +
"на {1} дней с суммой {2} рублей и процентной ставкой {3}.\n", Name, Years * 365, Sum, Rate);
}
public override double GetOverall()
{
double r = Rate / 100;
double dayRate = r / 365;
int days = Years * 365;
return Math.Round(Sum * Math.Pow(1 + dayRate, days), 2);
}
}
}
Листинг А5. Исходный код модуля Form1.cs
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace DepositProject
{
public partial class Form1 : Form
{
/// <summary>
/// Выбранный вклад
/// </summary>
Deposit mydep;
/// <summary>
/// Осуществляет настройку выбранного вклада по номеру в списке
/// </summary>
/// <param name="type">индекс в списке вкладов</param>
void OnSettings(int type)
{
// если выбран какой-то вклад
if (type < 3)
{
// сделать неактивной кнопку подбора вкладов, активной - кнопку выбора
findDepButton.Enabled = false;
calcButton.Enabled = true;
// установить настройки минимальной суммы и срока в зависимости от типа вклада
if (type == 0)
{
mydep = new DepositYear();
sumNUD.Minimum = DepositYear.MIN_SUM;
yearsNUD.Minimum = DepositYear.MIN_YEARS;
}
else if (type == 1)
{
mydep = new DepositMonth();
sumNUD.Minimum = DepositMonth.MIN_SUM;
yearsNUD.Minimum = DepositMonth.MIN_YEARS;
}
else
{
mydep = new DepositDay();
sumNUD.Minimum = DepositDay.MIN_SUM;
yearsNUD.Minimum = DepositDay.MIN_YEARS;
}
// установить размер ставки в зависимости от выбранного вклада
rateTB.Text = mydep.Rate.ToString();
// отобразить в регуляторах суммы и срока вклада минимальные значения
sumNUD.Value = sumNUD.Minimum;
yearsNUD.Value = yearsNUD.Minimum;
}
// иначе (необходим подбор вклада по заданным параметрам)
else
{
// сделать активной кнопку подбора вкладов, неактивной - кнопку выбора
findDepButton.Enabled = true;
calcButton.Enabled = false;
// создать три вклада со стандартными настройками
DepositYear d1 = new DepositYear();
DepositMonth d2 = new DepositMonth();
DepositDay d3 = new DepositDay();
// создать новый список из созданных вкладов
List<Deposit> ld = new List<Deposit>() { d1, d2, d3 };
// отсортировать по возрастанию выплат
ld.Sort();
// выбрать вклад с минимальной капитализацией
// отобразить в регуляторах суммы и срока соответствующие этому вкладу значения
sumNUD.Value = sumNUD.Minimum = new decimal(ld[0].Sum);
yearsNUD.Value = yearsNUD.Minimum = new decimal(ld[0].Years);
// не выводить ставку
rateTB.Text = "";
}
}
/// <summary>
/// Конструктор класса формы
/// </summary>
public Form1()
{
InitializeComponent();
depositCB.SelectedIndex = 0; // выбрать вклад с ежегодной капитализацией (первый в списке)
OnSettings(depositCB.SelectedIndex); // настроить поля формы
}
/// <summary>
/// Возникает при нажатии кнопки "Рассчитать"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void calcButton_Click(object sender, EventArgs e)
{
// если ФИО не было введено, сообщить об ошибке и выйти
if (string.IsNullOrWhiteSpace(nameTB.Text))
{
MessageBox.Show("Введите ФИО!", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
// дописать пустую строку в текстовое поле с выводом информации
resultTB.Text += Environment.NewLine;
// присвоить полям класса введенные значения
mydep.Name = nameTB.Text;
mydep.Sum = (double)sumNUD.Value;
mydep.Years = (int)yearsNUD.Value;
// вывести результат - информацию о вкладе и выплате в конце срока
resultTB.Text += mydep.ToString() + Environment.NewLine +
"Выплата по вкладу в конце указанного срока составит " +
mydep.GetOverall() + " рублей." + Environment.NewLine;
// очистить текстовое поле с ФИО
nameTB.Clear();
}
/// <summary>
/// Возникает при изменении типа вклада в выпадающем списке
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void depositCB_SelectedIndexChanged(object sender, EventArgs e)
{
OnSettings(depositCB.SelectedIndex);