- •Оглавление
- •Введение
- •1 Разработка и реализация алгоритмов на языке с#
- •1.1 Лабораторная работа №1. Циклические программы
- •Код имеет линейную сложность o(n), так как количество итераций циклаК пропорционально введенному числу n.
- •1.2 Лабораторная работа №2. Массивы
- •1.3 Лабораторная работа №3. Функции
- •1.4 Лабораторная работа №4. Обработка текста
- •1.5 Лабораторная работа №5. Структуры
- •1.6 Лабораторная работа №6. Коллекции
- •1.7 Лабораторная работа №7. Основы ооп
- •Заключение
1.7 Лабораторная работа №7. Основы ооп
Задание 7.1: Cоздать класс EngMer для работы с английскими мерами длины: фунтами и дюймами, при этом учтем, что 1 фунт = 12 дюймов. Длина объекта будет задаваться парой чисел (фунты и дюймы), нужно реализовать: сложение и вычитание длин, умножение и деление длин, сравнение длин.
Ниже представлен исходный код данной программы на языке программирования C#.
using System;
public abstract class LengthUnit
{
public abstract int TotalInches();
public abstract void Display();
}
public interface IComparableLength
{
bool IsGreaterThan(LengthUnit other);
bool IsLessThan(LengthUnit other);
bool IsEqualTo(LengthUnit other);
}
public class EngMer : LengthUnit
{
public int pounds;
public int inches;
// Конструктор
public EngMer(int pounds, int inches)
{
this.pounds = pounds + inches / 12;
this.inches = inches % 12;
Console.WriteLine("....Объект EngMer создан.....");
}
// Деструктор
~EngMer()
{
Console.WriteLine("....Объект EngMer уничтожен....");
}
public override int TotalInches()
{
return pounds * 12 + inches;
}
public override void Display()
{
Console.WriteLine($"{pounds} фунтов {inches} дюймов");
}
public bool IsGreaterThan(LengthUnit other)
{
return this.TotalInches() > other.TotalInches();
}
public bool IsLessThan(LengthUnit other)
{
return this.TotalInches() < other.TotalInches();
}
public bool IsEqualTo(LengthUnit other)
{
return this.TotalInches() == other.TotalInches();
}
public static EngMer operator +(EngMer a, EngMer b)
{
int totalInches = a.TotalInches() + b.TotalInches();
return new EngMer(totalInches / 12, totalInches % 12);
}
public static EngMer operator *(EngMer a, EngMer b)
{
int totalInches = a.TotalInches() * b.TotalInches();
return new EngMer(totalInches / 12, totalInches % 12);
}
public static EngMer operator /(EngMer a, EngMer b)
{
int totalInches = a.TotalInches() / b.TotalInches();
return new EngMer(totalInches / 12, totalInches % 12);
}
public static EngMer operator -(EngMer a, EngMer b)
{
int totalInches = a.TotalInches() - b.TotalInches();
return new EngMer(totalInches / 12, totalInches % 12);
}
}
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("Введите данные для первой длины:");
Console.Write("Фунты: ");
int pounds1 = int.Parse(Console.ReadLine());
Console.Write("Дюймы: ");
int inches1 = int.Parse(Console.ReadLine());
Console.WriteLine("Введите данные для второй длины:");
Console.Write("Фунты: ");
int pounds2 = int.Parse(Console.ReadLine());
Console.Write("Дюймы: ");
int inches2 = int.Parse(Console.ReadLine());
EngMer length1 = new EngMer(pounds1, inches1);
EngMer length2 = new EngMer(pounds2, inches2);
Console.WriteLine("\nПервая длина:");
length1.Display();
Console.WriteLine("Вторая длина:");
length2.Display();
EngMer sum = length1 + length2;
Console.WriteLine("\nСумма длин:");
sum.Display();
EngMer difference = length1 - length2;
Console.WriteLine("Разность длин:");
difference.Display();
EngMer umnoj = length1 * length2;
Console.WriteLine("Произведение длин:");
umnoj.Display();
EngMer del = length1 / length2;
Console.WriteLine("Частное длин:");
del.Display();
Console.WriteLine("\nСравнение длин:");
Console.WriteLine($"Первая длина больше второй: {length1.IsGreaterThan(length2)}");
Console.WriteLine($"Первая длина меньше второй: {length1.IsLessThan(length2)}");
Console.WriteLine($"Первая длина равна второй: {length1.IsEqualTo(length2)}");
}
catch (Exception exp)
{
Console.WriteLine("Упс, что-то пошло не так: " + exp.Message);
}
}
}
Результат работы программы представлен на рисунке 1.41.
Рисунок
1.41 — Результат работы
программы задания
7.1
Результат работы программы при неправильном значении представлено на рисунке 1.42.
Р
исунок
1.42 — Результат работы программы задания
7.1
Общая сложность кода — O(1), так как все операции выполняются за константное время и не зависят от объема входных данных.
Задание 7.2: номиналы российских рублей могут принимать значения 1, 2, 5, 10, 50, 100, 500, 1000, 5000. Копейки представить как 0,01 (1 копейка), 0,05 (5 копеек), 0,1 (10 копеек), 0,5 (50 копеек). Создать класс Money для работы с денежными суммами. Сумма должна быть представлена полями номиналами, значениями которых должны быть количества купюр данного достоинства. Реализовать сложение сумм, вычитание сумм, деление сумм, деление суммы на дробное число, умножение на дробное число и операцию сравнения. Дробная часть (копейки) при выводе на экран должна быть отделена от целой части запятой.
Ниже представлен исходный код данной программы на языке программирования C#.
static void Main() {
double input1 = 0;
double input2 = 0;
try {
Console.Write("Введите сумму №1: ");
input1 = double.Parse(Console.ReadLine());
Console.Write("Введите сумму №2: ");
input2 = double.Parse(Console.ReadLine());
} catch (Exception e) {
Console.WriteLine("Введите число!!!");
}
var a = new Money(input1);
var b = new Money(input2);
Console.WriteLine(a + b);
Console.WriteLine(a - b);
Console.WriteLine(a / b);
Console.WriteLine(a / 4.5);
Console.WriteLine(a * 4.5);
Console.WriteLine("Первая сумма больше второй?: " + (a > b));
}
abstract class Base {
protected double amount;
}
interface IBase {
string ToString();
}
class Money: Base, IBase {
public static Money operator + (Money a, Money b) {
return new Money(a.amount + b.amount);
}
public static Money operator - (Money a, Money b) {
return new Money(a.amount - b.amount);
}
public static Money operator / (Money a, double b) {
return new Money(a.amount / b);
}
public static Money operator / (Money a, Money b) {
return new Money(a.amount / b.amount);
}
public static Money operator * (Money a, double b) {
return new Money(a.amount * b);
}
public static bool operator > (Money a, Money b) {
if (a.amount > b.amount) return true;
return false;
}
public static bool operator < (Money a, Money b) {
if (a.amount < b.amount) return true;
return false;
}
public static bool operator >= (Money a, Money b) {
if (a.amount >= b.amount) return true;
return false;
}
public static bool operator <= (Money a, Money b) {
if (a.amount <= b.amount) return true;
return false;
}
public static bool operator == (Money a, Money b) {
if (a.amount == b.amount) return true;
return false;
}
public static bool operator != (Money a, Money b) {
if (a.amount != b.amount) return true;
return false;
}
public override string ToString() {
string res = "";
res += amount + "\n";
double temp = amount;
int[] integer = [1, 2, 5, 10, 50, 100, 500, 1000, 5000];
double[] cents = [0.01, 0.05, 0.10, 0.5];
for (int i = integer.Length - 1; i >= 0; i--) {
int counter = 0;
while (temp >= integer[i]) {
temp -= integer[i];
counter++;
}
if (counter == 0) continue;
if (i == 1) {
res += $ "Количество купюр номиналом {integer[i]} рубля: {counter}\n";
} else if (i == 0) {
res += $ "Количество купюр номиналом {integer[i]} рубль: {counter}\n";
} else {
res += $ "Количество купюр номиналом {integer[i]} рублей: {counter}\n";
}
}
temp += 0.00001;
for (int i = cents.Length - 1; i >= 0; i--) {
int counter = 0;
while (temp >= cents[i]) {
temp -= cents[i];
counter++;
}
if (counter == 0) continue;
if (i == 0) {
res += $ "Количество монет номиналом {cents[i]*100} копейка: {counter}\n";
} else {
res += $ "Количество монет номиналом {cents[i] * 100} копеек : {counter}\n";
}
}
return res;
}
public Money(double am) {
amount = am;
}
}
Результат работы программы задания 7.2 представлен на рисунке 1.43.
Рисунок
1.43 — Результат работы программы 7.2
Временная сложность алгоритма 7.2 O (n), где n – количество номиналов в сумме.
