Labolatornaya_rabota_6_po_OP
.pdfМинистерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования
«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)
Факультет безопасности (ФБ)
Кафедра безопасности информационных систем (БИС)
ОСНОВЫ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАННИЯ Отчет по лабораторной работе №6
по дисциплине «Основы программирования»
Студент гр. 731-2
__________ А.С.Батаев
__________
Принял Инженер КИБЭВС
__________ __________ Д.Р. Уразаев
__________
Томск 2022
2
Оглавление
1 |
Введение................................................................................................................. |
3 |
2 |
Ход работы............................................................................................................. |
4 |
3 |
Заключение .......................................................................................................... |
12 |
4 |
Список используемой литературы .................................................................... |
13 |
3
1 Введение
Цель работы: Овладеть навыками работы с классами, использования механизмов инкапсуляции, наследования и полиморфизма.
Задание: составить консольное приложение для решения нижеприведенных задач согласно варианту, согласованному с преподавателем, вводя данные в ходе выполнения программы. Для выполнения предварительно ознакомьтесь с соответствующими разделами данного пособия.
Задание для каждого варианта звучит следующим образом: «В программе продемонстрировать функциональность разработанных классов». Все данные для заполнения полей необходимо вводить с клавиатуры. Обязательно использование абстрактных классов, интерфейсов, конструкторов и деструкторов.
4
2 Ход работы
2.1 Теоретические сведения
Класс является основой для создания объектов. Если структура объединяет разнородные по типам переменные, то в классе определяются данные и код, который работает с этими данными. Объекты являются экземплярами класса. Методы и переменные, составляющие класс, называются членами класса. При определении класса объявляются данные, которые он содержит, и код, работающий с этими данными. Данные содержатся в переменных экземпляра, которые определены классом, а код содержится в методах. В С# определены несколько специфических разновидностей членов класса. Это — переменные экземпляра, статические переменные, константы,
методы, конструкторы, деструкторы, индексаторы, события, операторы и свойства. Непосредственно инициализация переменных в объекте (переменных экземпляра) происходит в конструкторе. В классе могут быть определены несколько конструкторов.
2.2 Первое задание
Поставленная задача для варианта 3, выглядит так:
Создать класс EngMoney для работы с устаревшей денежной системой Великобритании. В ней использовались фунты, шиллинги и пенсы. При этом: 1
фунт = 20 шиллингов, 1 шиллинг =12 пенсов. Денежные суммы будут задаваться в фунтах, шиллингах и пенсах и результат выдаваться также в этих величинах. Должны быть реализованы: сложение и вычитание, умножение и деление, сравнение сумм. Создается код, выполняющий данный алгоритм действий. Он представлен ниже.
namespace laba6._1
{
class Program
{
static void Main(string[] args)
5
{
int a1, a2, a3, b1, b2, b3;
Console.WriteLine("Введите 1-ю сумму в порядке: Фунты, Шиллинги, Пенс"); a1 = int.Parse(Console.ReadLine());
a2 = int.Parse(Console.ReadLine());
a3 = int.Parse(Console.ReadLine());
Console.WriteLine("\nВведите 2-ю сумму в порядке: Фунты, Шиллинги, Пенс"); b1 = int.Parse(Console.ReadLine());
b2 = int.Parse(Console.ReadLine());
b3 = int.Parse(Console.ReadLine()); EngMoney a = new EngMoney(a1, a2, a3); EngMoney b = new EngMoney(b1, b2, b3);
Console.WriteLine($"Введенные данные:\n{a}\n{b}"); Console.WriteLine($"\nРезультаты:\nСложение: {a.Sum(b)}\nВычитание:{
a.Vch(b)}");
Console.WriteLine($"Умножение: {a.Umn(b)}\nДеление:{a.Del(b)}"); Console.WriteLine($"Сравнение: Сумма №{a.Srav(b)}\b\b\b больше");
}
}
class EngMoney
{
private int f; private int s; private int p; public int F
{
get { return f; } set { f = value; }
}
public int S
{
get { return s; } set { s = value; }
}
public int P
{
get { return p; } set { p = value; }
}
public EngMoney(int ff, int ss, int pp)
{
f = ff; s = ss; p = pp;
}
public EngMoney Sum(EngMoney secondsum)
{
int result_f = f + secondsum.F; int result_s = s + secondsum.S; int result_p = p + secondsum.P; while (result_p >= 12)
{
result_p -= 12; result_s++;
}
while (result_s >= 20)
{
result_s -= 20; result_f++;
}
return new EngMoney(result_f, result_s, result_p);
}
public EngMoney Vch(EngMoney secondsum)
{
int result_f = f - secondsum.F; int result_s = s - secondsum.S;
6
int result_p = p - secondsum.P; while (result_p < 0)
{
result_p += 12; result_s--;
}
while (result_s < 0)
{
result_s += 20; result_f--;
}
return new EngMoney(result_f, result_s, result_p);
}
public EngMoney Umn(EngMoney secondsum)
{
int psum1 = f * 240 + s * 12 + p;
int psum2 = secondsum.F * 240 + secondsum.S * 12 + secondsum.P; int result_p = psum1 * psum2;
int result_s = 0; int result_f = 0;
{
while (result_p >= 12)
{
result_p -= 12; result_s++;
}
while (result_s >= 20)
{
result_s -= 20; result_f++;
}
}
return new EngMoney(result_f, result_s, result_p);
}
public EngMoney Del(EngMoney secondsum)
{
int psum1 = s * 12 + f * 240 + p;
int psum2 = secondsum.F * 240 + secondsum.S * 12 + secondsum.P; int result_p = psum1 / psum2;
int result_s = 0; int result_f = 0; while (result_p >= 12)
{
result_p -= 12; result_s++;
}
while (result_s >= 20)
{
result_s -= 20; result_f++;
}
return new EngMoney(result_f, result_s, result_p);
}
public EngMoney Srav(EngMoney secondsum)
{
int result_com = 0;
int psum1 = f * 240 + s * 12 + p;
int psum2 = secondsum.F * 240 + secondsum.S * 12 + secondsum.P; if (psum1
> psum2)
result_com = 1;
else
result_com = 2;
return new EngMoney(result_com, 0, 0);
}
public override string ToString()
{
7
return $"{f} {s} {p}";
}
}
}
Проверка корректности написания при запуске и вводе переменных представлена на рисунке 2.1-2.2.
Рисунок 2.1 – Проверка корректности кода
8
Рисунок 2.2 – Проверка корректности кода
2.3 Вторая задача
Поставленная задача, Создать класс Fraction для работы с дробными числами. Число должно быть представлено двумя полями: целая часть – длинное целое со знаком, дробная часть – беззнаковое короткое целое.
Реализовать арифметические операции сложения, вычитания, умножения и операции сравнения
Создается код, выполняющий данный алгоритм действий. Он изображен ниже.
namespace laba6._2
{
class Program
{
static void Main(string[] args)
9
{
int a1, a2, b11, b22; string b1, b2;
Console.WriteLine("Введите первое число в порядке: целая часть, дробная
часть");
a1 = int.Parse(Console.ReadLine());
b1 = Console.ReadLine();
Console.WriteLine("Введите второе число в порядке: целая часть, дробная
часть");
a2 = int.Parse(Console.ReadLine());
b2 = Console.ReadLine();
for (int i = b1.Length; i < b2.Length; i++) b1 += '0'; for (int i = b2.Length; i < b1.Length; i++) b2 += '0'; b11 = int.Parse(b1);
b22 = int.Parse(b2);
Fraction Aa = new Fraction(a1, b11); Fraction Bb = new Fraction(a2, b22);
Console.WriteLine($"\nРезультаты:\nСложение: { Aa.Sum(Bb)}\nВычитание: { Aa.Vch(Bb)}");
Console.WriteLine($"Умножение: {Aa.Umn(Bb)}\b "); Console.WriteLine($"Сравнение: Число № {Aa.Srav(Bb)}\b больше");
}
}
class Fraction
{
private double a; private int b; public double A
{
get { return a; } set { a = value; }
}
public int B
{
get { return b; } set { b = value; }
}
public Fraction(double a, int b)
{
this.a = a; this.b = b;
}
public Fraction Sum(Fraction second)
{
double result_a = a + second.A; int result_b = b + second.B;
if (result_b > 10)
{
result_b -= 10; result_a++;
}
return new Fraction(result_a, result_b);
}
public Fraction Vch(Fraction second)
{
double result_a = a - second.A; int result_b = b - second.B;
if (result_b < 0)
{
result_b = result_b * (-1);
}
return new Fraction(result_a, result_b);
}
public Fraction Umn(Fraction second)
{
10
double m1 = int.Parse(Convert.ToString(a) + Convert.ToString(b)) / Math.Pow(10, Convert.ToString(b).Length);
double m2 = int.Parse(Convert.ToString(second.A) + Convert.ToString(second.B)) / Math.Pow(10,
Convert.ToString(second.B).Length); double result_a = m1 * m2;
return new Fraction(result_a, 0);
}
public Fraction Srav(Fraction second)
{
double result_srav; if (a > second.A) result_srav = 1;
else
if (a < second.A) result_srav = 2; else
if (b > second.b) result_srav = 1;
else
result_srav = 2;
return new Fraction(result_srav, 0);
}
public override string ToString()
{
return $"{a} {b}";
}
}
}
Проверка корректности написания при запуске представлена на рисунке 2.3-
2.4.
Рисунок 2.3 – Результат работы кода