6 лабораторная работа ОП
.pdfМинистерство науки и высшего образования Российской Федерации Федерального государственное бюджетное образовательное учреждение высшего образования
«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)
Кафедра безопасности информационных систем (БИС)
ОСНОВЫ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
Отчет по лабораторной работе по дисциплине «Основы программирования»
Выполнил: Студентка гр. 711-2
_______ Толстолес Е. П. 26.02.2022
Принял:
Инженер КИБЭВС
_______ Д.Р. Уразаев
26.02.2022
Томск 2022
|
2 |
|
|
Содержание |
|
1 |
Введение ......................................................................................................... |
3 |
2 |
Ход работы ..................................................................................................... |
5 |
2.1 |
Листинг исходного кода программ................................................................. |
5 |
2.2 |
Процесс выполнения программы и ввод данных.......................................... |
12 |
3 Заключение ...................................................................................................... |
14 |
|
Список использованной литературы .................................................................. |
15 |
3
1 Введение
Цель работы: Овладеть навыками работы с классами, использования механизмов инкапсуляции, наследования и полиморфизма.
Задание: составить консольное приложение для решения нижеприведенных задач согласно варианту, согласованному с преподавателем, вводя данные в ходе выполнения программы. Для выполнения предварительно ознакомьтесь с соответствующими разделами данного пособия.
Примечание: для выполнения заданий необходимо разбиться на группы по 2-3 человека. Задание для каждого варианта звучит следующим образом: «В
программе продемонстрировать функциональность разработанных классов». Все данные для заполнения полей необходимо вводить с клавиатуры. Обязательно использование абстрактных классов, интерфейсов, конструкторов и деструкторов.
Задание 1: Создать класс EngMoney для работы с устаревшей денежной системой Великобритании. В ней использовались фунты, шиллинги и пенсы. При этом: 1 фунт = 20 шиллингов, 1 шиллинг =12 пенсов. Денежные суммы будут задаваться в фунтах, шиллингах и пенсах и результат выдаваться также в этих величинах. Должны быть реализованы: сложение и вычитание, умножение и деление, сравнение сумм.
Задание 2: Создать класс Fraction для работы с дробными числами. Число должно быть представлено двумя полями: целая часть – длинное целое со знаком, дробная часть – беззнаковое короткое целое. Реализовать арифметические операции сложения, вычитания, умножения и операции сравнения.
Теоретические сведения по теме лабораторной работы:
«ООП» значит «Объектно-Ориентированное Программирование». Это такой подход к написанию программ, который основывается на объектах, а не на функциях и процедурах. Эта модель ставит в центр внимания объекты, а не действия, данные, а не логику. Объект — реализация класса. Все реализации
4
одного класса похожи друг на друга, но могут иметь разные параметры и значения. Объекты могут задействовать методы, специфичные для них.
ООП сильно упрощает процесс организации и создания структуры программы. Отдельные объекты, которые можно менять без воздействия на остальные части программы, упрощают также и внесение в программу изменений. Так как с течением времени программы становятся всё более крупными, а их поддержка всё более тяжёлой, эти два аспекта ООП становятся всё более актуальными.
Что за концепции ООП?
Сейчас коротко о принципах, которые мы позже рассмотрим в подробностях:
Абстракция данных: подробности внутренней логики скрыты от конечного пользователя. Пользователю не нужно знать, как работают те или иные классы и методы, чтоб их использовать. Подходящим примером из реальной жизни будет велосипед — когда мы ездим на нём или меняем деталь,
нам не нужно знать, как педаль приводит его в движение или как закреплена цепь.
Наследование: самый популярный принцип ООП. Наследование делает возможным повторное использование кода — если какой-то класс уже имеет какую-то логику и функции, нам не нужно переписывать всё это заново для создания нового класса, мы можем просто включить старый класс в новый, целиком.
Инкапсуляция: включение в класс объектов другого класса, вопросы доступа к ним, их видимости.
Полиморфизм: «поли» значит «много», а «морфизм» — «изменение» или
«вариативность», таким образом, «полиморфизм» — это свойство одних и тех же объектов, и методов принимать разные формы.
Обмен сообщениями: способность одних объектов вызывать методы других объектов, передавая им управление.
5
2Ход работы
2.1Листинг исходного кода программ
Согласно условию задания, листинг исходного кода программы задания 1
будет иметь вид: using System;
namespace _1000_7
{
class Program
{
static void Main(string[] args)
{
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)}");
6
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++;
7
}
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; 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++;
8
}
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)
9
result_com = 1; else result_com = 2;
return new EngMoney(result_com, 0, 0);
}
public override string ToString()
{
return $"{f} {s} {p}";
}
}
}
Согласно условию задания, листинг исходного кода программы задания 2 будет иметь вид:
using System;
using System.Collections.Generic; using System.Linq;
using System.Text; using System.Threading; namespace _1000_7
{
class Program
{
static void Main(string[] args)
{
int a1, a2, b11, b22; string b1, b2;
Console.WriteLine("Введите первое число в порядке: целая часть,
дробная часть");
a1 = int.Parse(Console.ReadLine());
b1 = Console.ReadLine();
Console.WriteLine("Введите второе число в порядке: целая часть, дробная часть");
10
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;
}