Лаба 6-7
.docxЛабораторная 6. Болтушкин + Туранов. Вариант 2.
Задание 1. Создать класс vector3D, задаваемый тройкой координат. Обязательно должны быть реализованы: сложение и вычитание векторов, скалярное произведение векторов, умножение на скаляр, сравнение векторов, вычисление длины вектора, сравнение длины векторов.
using System;
namespace Vector3D
{
public interface IVector
{
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)
{
}
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)
{
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() ? "больше" : "меньше или равен");
}
}
}
Задание 2. Реализовать класс Bankomat, моделирующий работу банкомата. В классе должны содержаться поля для хранения идентификационного номера банкомата, информации о текущей сумме денег, оставшейся в банкомате, минимальной и максимальной суммах, которые позволяется снять клиенту в один день. Сумма денег представляется полями номиналами 10–1000 (см. задание 6.13). Реализовать метод загрузки купюр в банкомат и метод снятия определенной суммы денег. Метод снятия денег должен проверять на корректность снимаемую сумму (не должна быть меньше минимально допустимой и больше максимально допустимой). Должен быть метод для отображения оставшейся в банкомате суммы.
using System;
// Абстрактный класс для банкомата
abstract class BankomatBase
{
protected int balance;
protected int[] denominations;
public BankomatBase(int balance, int[] denominations)
{
this.balance = balance;
this.denominations = denominations;
}
public abstract void Load(int[] amounts);
public abstract void Withdraw(int sum);
public abstract void ShowBalance();
}
// Интерфейс для управления банкоматом
interface IBankomatControl
{
void LoadMoney();
void WithdrawMoney();
void CheckBalance();
}
// Класс, реализующий банкомат
class Bankomat : BankomatBase, IBankomatControl
{
private int minSum;
private int maxSum;
public Bankomat(int balance, int minSum, int maxSum, int[] denominations)
: base(balance, denominations)
{
this.minSum = minSum;
this.maxSum = maxSum;
}
public override void Load(int[] amounts)
{
for (int i = 0; i < amounts.Length; i++)
{
balance += amounts[i] * denominations[i];
}
}
public override 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 override void ShowBalance()
{
Console.WriteLine("Остаток в банкомате: {0}", balance);
}
public void LoadMoney()
{
int[] amounts = new int[denominations.Length];
for (int i = 0; i < denominations.Length; i++)
{
Console.Write("Количество купюр номиналом {0}: ", denominations[i]);
string input = Console.ReadLine();
amounts[i] = int.Parse(input);
}
Load(amounts);
Console.WriteLine("Купюры успешно загружены.");
}
public void WithdrawMoney()
{
Console.Write("Введите сумму: ");
string input = Console.ReadLine();
int sum = int.Parse(input);
Withdraw(sum);
}
public void CheckBalance()
{
ShowBalance();
}
}
class Program
{
static void Main(string[] args)
{
int[] denominations = { 10, 50, 100, 500, 1000 };
Bankomat bankomat = new Bankomat(0, 100, 10000, denominations);
while (true)
{
Console.WriteLine("1 - загрузить купюры\n2 - снять деньги\n3 - проверить остаток\n4 - выход");
Console.Write("Выберите действие: ");
string input = Console.ReadLine();
if (input == "1")
{
bankomat.LoadMoney();
}
else if (input == "2")
{
bankomat.WithdrawMoney();
}
else if (input == "3")
{
bankomat.CheckBalance();
}
else if (input == "4")
{
break;
}
else
{
Console.WriteLine("Неверная команда. Попробуйте еще раз.");
}
}
}
}
Лабораторная 7. Болтушкин + Туранов. Вариант 2.
Задание. Описать классы «Шахматная фигура», «Легкая фигура», «Тяжелая фигура», «Пешка», «Король», «Слон», «Ладья». Выстроить правильную иерархию наследования этих классов, определить какие из классов должны быть абстрактными, какие методы абстрактными или виртуальными. Описать конструкторы и деструкторы разработанных классов. Создать по одному объекту каждого класса, для которого это возможно, поместить их в один массив. Для каждого из элементов массива вызвать метод SecondName (второе русскоязычное название), если он реализован для класса и вывести на экран все свойства.
using System;
interface IChessPiece
{
void Move();
}
abstract class ChessPiece : IChessPiece
{
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;
}
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} перемещается по горизонтали или вертикали");
}
}
class Program
{
static void Main(string[] args)
{
IChessPiece[] pieces = new IChessPiece[]
{
new Pawn("Белый"),
new King("Белый"),
new Bishop("Черный"),
new Rook("Черный")
};
foreach (IChessPiece piece in pieces)
{
piece.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($"Название: {((ChessPiece)piece).Name}, Цвет: {((ChessPiece)piece).Color}\n");
}
}
}