Болтушкин Л.С., 712-2, отчет
.pdf{
double Length();
IVector Add(IVector vector); IVector Subtract(IVector vector); IVector Multiply(double scalar); double DotProduct(IVector vector); bool Equals(IVector vector);
void Print();
}
public abstract class Vector : IVector
{
protected double[] components;
public Vector(double x, double y, double z)
{
components = new[] { x, y, z };
}
public double Length()
{
return Math.Sqrt(components[0] * components[0] + components[1] * components[1] + components[2] * components[2]);
}
public IVector Add(IVector vector)
{
var v = (Vector)vector;
return new Vector3D(components[0] + v.components[0], components[1] + v.components[1], components[2] + v.components[2]);
}
public IVector Subtract(IVector vector)
{
var v = (Vector)vector;
return new Vector3D(components[0] - v.components[0], components[1] - v.components[1], components[2] - v.components[2]);
}
public IVector Multiply(double scalar)
{
return new Vector3D(components[0] * scalar, components[1] * scalar, components[2] * scalar);
}
public double DotProduct(IVector vector)
{
var v = (Vector)vector;
return components[0] * v.components[0] + components[1] * v.components[1] + components[2] * v.components[2];
}
public bool Equals(IVector vector)
{
var v = (Vector)vector;
return components[0] == v.components[0] && components[1] == v.components[1] && components[2] == v.components[2];
}
public abstract void Print();
}
public class Vector3D : Vector
{
public Vector3D(double x, double y, double z) : base(x, y, z)
31
{
}
public override void Print()
{
Console.WriteLine("({0}, {1}, {2})", components[0], components[1], components[2]);
}
public static Vector3D operator +(Vector3D a, Vector3D b)
{
return a.Add(b) as Vector3D;
}
public static Vector3D operator -(Vector3D a, Vector3D b)
{
return a.Subtract(b) as Vector3D;
}
public static Vector3D operator *(Vector3D a, double scalar)
{
return a.Multiply(scalar) as Vector3D;
}
public static Vector3D operator *(double scalar, Vector3D a)
{
return a.Multiply(scalar) as Vector3D;
}
public static double operator ^(Vector3D a, Vector3D b)
{
return a.DotProduct(b);
}
public static bool operator ==(Vector3D a, Vector3D b)
{
return a.Equals(b);
}
public static bool operator !=(Vector3D a, Vector3D b)
{
return !a.Equals(b);
}
public override int GetHashCode()
{
return components[0].GetHashCode() ^ components[1].GetHashCode() ^ components[2].GetHashCode();
}
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
var v = (Vector3D)obj; return Equals(v);
}
}
class Program
{
static void Main(string[] args)
32
{
Console.Write("Введите координаты первого вектора (через запятую): "); var a = Console.ReadLine().Split(',');
var vectorA = new Vector3D(double.Parse(a[0]), double.Parse(a[1]), double.Parse(a[2]));
Console.Write("Введите координаты второго вектора (через запятую): "); var b = Console.ReadLine().Split(',');
var vectorB = new Vector3D(double.Parse(b[0]), double.Parse(b[1]), double.Parse(b[2]));
Console.WriteLine("Длина первого вектора: {0}", vectorA.Length()); Console.WriteLine("Длина второго вектора: {0}", vectorB.Length());
Console.WriteLine("Сумма векторов: "); (vectorA + vectorB).Print();
Console.WriteLine("Разность векторов: "); (vectorA - vectorB).Print();
Console.Write("Введите скалярное произведение: "); var scalar = double.Parse(Console.ReadLine());
Console.WriteLine("Умножение первого вектора на скаляр {0}: ", scalar); (vectorA * scalar).Print();
Console.WriteLine("Умножение второго вектора на скаляр {0}: ", scalar); (vectorB * scalar).Print();
Console.WriteLine("Скалярное произведение: {0}", (vectorA ^ vectorB));
Console.WriteLine("Сравнение длины векторов:"); Console.WriteLine("Первый вектор {0} второго вектору", vectorA.Length() >
vectorB.Length() ? "больше" : "меньше или равен");
}
}
}
Результат работы программы представлен ниже на рисунке 6.2.
Рисунок 6.2 – Результат работы программы задания 6.1
Задание 6.2. Реализовать класс Bankomat, моделирующий работу
33
банкомата. В классе должны содержаться поля для хранения идентификационного номера банкомата, информации о текущей сумме денег,
оставшейся в банкомате, минимальной и максимальной суммах, которые позволяется снять клиенту в один день. Сумма денег представляется полями номиналами 10–1000 (см. задание 6.13). Реализовать метод загрузки купюр в банкомат и метод снятия определенной суммы денег. Метод снятия денег должен проверять на корректность снимаемую сумму (не должна быть меньше минимально допустимой и больше максимально допустимой). Должен быть метод для отображения оставшейся в банкомате суммы.
Блок-схема алгоритма представлена на рисунке 6.3.
Рисунок 6.3 – Блок схема задания 6.2
Листинг кода задания 6.2:
using System;
class Bankomat
{
private int id; private int balance; private int minSum; private int maxSum;
private int[] denominations;
public Bankomat(int id, int balance, int minSum, int maxSum, int[] denominations)
{
this.id = id; this.balance = balance; this.minSum = minSum; this.maxSum = maxSum;
this.denominations = denominations;
}
public void Load(int[] amounts)
{
for (int i = 0; i < amounts.Length; i++)
34
{
balance += amounts[i] * denominations[i];
}
}
public void Withdraw(int sum)
{
if (sum < minSum || sum > maxSum)
{
Console.WriteLine("Неверная сумма. Попробуйте еще раз."); return;
}
int[] counts = new int[denominations.Length]; int total = 0;
for (int i = denominations.Length - 1; i >= 0; i--)
{
int count = Math.Min(sum / denominations[i], balance / denominations[i]); sum -= count * denominations[i];
balance -= count * denominations[i]; counts[i] = count;
total += count * denominations[i];
if (sum == 0)
{
Console.WriteLine("Выдано:");
for (int j = 0; j < counts.Length; j++)
{
if (counts[j] > 0)
{
Console.WriteLine("{0} - {1} шт.", denominations[j],
counts[j]);
}
}
Console.WriteLine("Остаток в банкомате: {0}", balance); return;
}
}
Console.WriteLine("В банкомате недостаточно средств.");
}
public void ShowBalance()
{
Console.WriteLine("Остаток в банкомате: {0}", balance);
}
}
class Program
{
static void Main(string[] args)
{
int[] denominations = { 10, 50, 100, 500, 1000 };
Bankomat bankomat = new Bankomat(1, 0, 100, 10000, denominations);
while (true)
{
Console.WriteLine("1 - загрузить купюры\n2 - снять деньги\n3 - проверить остаток\n4 - выход");
Console.Write("Выберите действие: "); string input = Console.ReadLine();
if (input == "1")
{
35
int[] amounts = new int[denominations.Length]; for (int i = 0; i < denominations.Length; i++)
{
Console.Write("Количество купюр номиналом {0}: ",
denominations[i]);
input = Console.ReadLine(); amounts[i] = int.Parse(input);
}
bankomat.Load(amounts); Console.WriteLine("Купюры успешно загружены.");
}
else if (input == "2")
{
Console.Write("Введите сумму: "); input = Console.ReadLine();
int sum = int.Parse(input); bankomat.Withdraw(sum);
}
else if (input == "3")
{
bankomat.ShowBalance();
}
else if (input == "4")
{
break;
}
else
{
Console.WriteLine("Неверная команда. Попробуйте еще раз.");
}
}
}
}
Результат работы программы представлен ниже на рисунке 6.4.
Рисунок 6.4 – Результат работы программы задания 6.2
36
Лабораторная работа №7
Вариант 2
Задание 7. Описать классы «Шахматная фигура», «Легкая фигура», «Тяжелая фигура», «Пешка», «Король», «Слон», «Ладья». Выстроить правильную иерархию наследования этих классов, определить какие из классов должны быть абстрактными, какие методы абстрактными или виртуальными.
Описать конструкторы и деструкторы разработанных классов. Создать по одному объекту каждого класса, для которого это возможно, поместить их в один массив. Для каждого из элементов массива вызвать метод SecondName (второе русскоязычное название), если он реализован для класса и вывести на экран все свойства.
Блок-схема алгоритма представлена на рисунке 7.1.
Рисунок 7.1 – Блок схема задания 7
Листинг кода задания 7:
using System;
abstract class ChessPiece
{
public string Name { get; protected set; } public string Color { get; protected set; } public bool IsCaptured { get; set; }
public ChessPiece(string name, string color)
{
Name = name; Color = color;
IsCaptured = false;
}
37
public abstract void Move();
}
abstract class LightPiece : ChessPiece
{
public bool IsMoved { get; protected set; }
public LightPiece(string name, string color) : base(name, color)
{
IsMoved = false;
}
}
abstract class HeavyPiece : ChessPiece
{
public bool IsMoved { get; protected set; }
public HeavyPiece(string name, string color) : base(name, color)
{
IsMoved = false;
}
}
class Pawn : LightPiece
{
public Pawn(string color) : base("Пешка", color) { }
public override void Move()
{
Console.WriteLine($"{Name} перемещается только на один шаг вперед, в самом начале может на два шага вперед");
}
}
class King : HeavyPiece
{
public King(string color) : base("Король", color) { }
public override void Move()
{
Console.WriteLine($"{Name} перемещается на один шаг в любом направлении");
}
}
class Bishop : LightPiece
{
public Bishop(string color) : base("Слон", color) { }
public override void Move()
{
Console.WriteLine($"{Name} перемещается по диагонали");
}
}
class Rook : HeavyPiece
{
public Rook(string color) : base("Ладья", color) { }
public override void Move()
{
Console.WriteLine($"{Name} перемещается по горизонтали или вертикали");
}
}
38
class Program
{
static void Main(string[] args)
{
ChessPiece[] pieces = new ChessPiece[]
{
new Pawn("Белый"), new King("Белый"), new Bishop("Черный"), new Rook("Черный")
};
foreach (ChessPiece piece in pieces)
{
if (piece is LightPiece lightPiece)
{
lightPiece.Move();
}
else if (piece is HeavyPiece heavyPiece)
{
heavyPiece.Move();
}
if (piece is Pawn)
{
Console.WriteLine($"Эта фигура - пешка!");
}
else if (piece is King)
{
Console.WriteLine($"Эта фигура - король!");
}
else if (piece is Bishop)
{
Console.WriteLine($"Эта фигура - слон");
}
else if (piece is Rook)
{
Console.WriteLine($"Эта фигура - ладья");
}
Console.WriteLine($"Название: {piece.Name}, Цвет: {piece.Color}\n");
}
}
}
Результат работы программы представлен ниже на рисунке 7.2.
Рисунок 7.2 – Результат работы программы задания
39
Заключение
В ходе работы были разработаны алгоритмы для решения заданных задач и созданы программные реализации для них на языке C#.
40
