Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LR1.docx
Скачиваний:
13
Добавлен:
01.09.2021
Размер:
38.1 Кб
Скачать

Листинг класса MeatProducts

Класс MeatProducts является наследником класса Product и содержит в себе свойство, связанное только с мясной продукцией поэтому использование наследования в данном случае уместно, также класс имеет свою реализацию абстрактного метода родительского класса и конструктор для инициализации свойств.

public class MeatProducts : Product

{

public bool Butchered { get; set; }

public override bool CheckDiscount()

{

TimeSpan now = DateTime.Now.TimeOfDay;

TimeSpan from = new TimeSpan(9, 14, 0);

TimeSpan to = new TimeSpan(21, 0, 0);

if (now > from && now < to && PricePerUnit > 250 && DiscountPercentage != 0)

{

Console.WriteLine(String.Format("С {0}:00 до {1}:00 скидка на {2} - {3}%", from.Hours, to.Hours, Name, DiscountPercentage));

return true;

}

else

{

return false;

}

}

public MeatProducts(string name, string measureUnit, decimal pricePerUnit, float needQuantity,

bool butchered, float discountPercentage = 0) : base(name, measureUnit, pricePerUnit, needQuantity, discountPercentage)

{

this.Butchered = butchered;

}

}

Листинг класса VegetablesAndFruits

Класс VegetablesAndFruits является наследником класса Product и содержит в себе свойство, связанное только с овощами и фруктами поэтому использование наследования в данном случае уместно, также класс имеет свою реализацию абстрактного метода родительского класса и конструктор для инициализации свойств.

public class VegetablesAndFruits : Product

{

public bool IsWeighted { get; set; }

public int WeightCode { get; set; }

public override bool CheckDiscount()

{

if (DateTime.Now.Month == 6 && DiscountPercentage != 0)

{

Console.WriteLine(String.Format("В этом месяце скидка на {0} - {1}%", Name, DiscountPercentage));

return true;

}

else

{

return false;

}

}

public VegetablesAndFruits(string name, string measureUnit, decimal pricePerUnit, float needQuantity,

int weightCode, float discountPercentage = 0) : base(name, measureUnit, pricePerUnit, needQuantity, discountPercentage)

{

this.WeightCode = weightCode;

this.IsWeighted = false;

}

}

Листинг класса Customer

Класс Customer содержит в себе: свойства для хранения информации о покупателе; перегруженный метод добавления товара в список покупок, который в зависимости от типа переданного объекта будет либо записывать в список дополнительную информацию о товаре либо нет; методы для взвешивания товара, добавления товара в корзину и выкладывания товара из корзины; метод для подсчета стоимости всех товаров в корзине; метод для оплаты покупки любым из трех способов, который предусматривает случай, когда у покупателя в корзине есть не взвешенные товары и случай, когда у покупателя не хватает средств для оплаты покупки; конструктор для инициализации свойств.

public class Customer

{

public string Name { get; set; }

private decimal moneyBalance;

public decimal MoneyBalance

{

get

{

return moneyBalance;

}

set

{

if (value > 0)

moneyBalance = value;

}

}

private decimal bonusBalance;

public decimal BonusBalance

{

get

{

return bonusBalance;

}

set

{

if (value > 0)

bonusBalance = value;

}

}

//Перегруженный метод добавления товара в список покупок

public void AddToList(List<string> list, Product product)

{

string str = String.Format("{0} {1} {2}.", product.Name, product.NeedQuantity, product.MeasureUnit);

list.Add(str);

}

public void AddToList(List<string> list, MilkProducts product)

{

string str = String.Format("{0} {1} {2} (жирность: {3}%).", product.Name, product.NeedQuantity,

product.MeasureUnit, product.FatPercentage);

list.Add(str);

}

public void AddToList(List<string> list, MeatProducts product)

{

string str;

if (product.Butchered)

{

str = String.Format("{0} {1} {2} (разделанное).", product.Name, product.NeedQuantity, product.MeasureUnit);

} else

{

str = String.Format("{0} {1} {2} (неразделанное).", product.Name, product.NeedQuantity, product.MeasureUnit);

}

list.Add(str);

}

//Взвешивание продукта

public void WeighProduct(VegetablesAndFruits product)

{

product.IsWeighted = true;

Console.WriteLine(String.Format("\nВзвешен товар {0} с кодом {1}. Вес: {2} кг",

product.Name, product.WeightCode, product.NeedQuantity));

}

//Добавление в корзину

public void AddToCart(List<Product> cart, Product product)

{

cart.Add(product);

Console.WriteLine("Товар " + product.Name + " добавлен в корзину.");

}

//Выкладывание из корзины

public void PutOutOfCart(List<Product> cart)

{

Console.WriteLine("\nНе хватает средств на оплату продуктов. Вы можете выложить некоторые товары.");

int productNum;

while (true)

{

Console.WriteLine("Введите номер товара, который хотите выложить.");

for (int i = 0; i < cart.Count; i++)

{

Console.WriteLine(i + " - " + cart[i].Name);

}

string input = Console.ReadLine();

bool check = int.TryParse(input, out productNum);

if (productNum < 0 || productNum > cart.Count - 1 || !check)

{

Console.WriteLine("\nТакого товара нет в списке!");

}

else

{

break;

}

}

Console.WriteLine("Товар " + cart[productNum].Name + " выложен из корзины.");

cart.RemoveAt(productNum);

}

//Вычисление стоимости всех товаров

public decimal CalcSumOfProducts(List<Product> cart, Customer customer)

{

decimal sum = 0;

Console.WriteLine();

for (int i = 0; i < cart.Count; i++)

{

if (cart[i].GetType().Name == "VegetablesAndFruits")

{

VegetablesAndFruits product = (VegetablesAndFruits)cart[i];

if (!product.IsWeighted)

{

Console.WriteLine("Товар " + cart[i].Name + " невзвешен. Взвесьте товар.");

customer.WeighProduct(product);

}

}

decimal cost;

decimal discountedCost;

cost = cart[i].PricePerUnit * Convert.ToDecimal(cart[i].NeedQuantity);

if (cart[i].CheckDiscount())

{

discountedCost = cart[i].PricePerUnit * Convert.ToDecimal(cart[i].NeedQuantity * (1 - cart[i].DiscountPercentage / 100));

Console.WriteLine(String.Format("Товар для оплаты: {0}; количество: {1} {2}; стоимость: {3} р (без скидки: {4} р).",

cart[i].Name, cart[i].NeedQuantity, cart[i].MeasureUnit, discountedCost, cost));

}

else

{

Console.WriteLine(String.Format("Товар для оплаты: {0}; количество: {1} {2}; стоимость: {3} р",

cart[i].Name, cart[i].NeedQuantity, cart[i].MeasureUnit, cost));

}

sum += cost;

}

Console.WriteLine("\nОбщая сумма покупок: " + sum + " р");

Console.WriteLine("Наличные: " + customer.MoneyBalance + " р");

Console.WriteLine("Бонусы: " + customer.BonusBalance + " р");

return sum;

}

//Оплата покупки

public void Pay(List<Product> cart, Customer customer)

{

decimal sum = CalcSumOfProducts(cart, customer);

//Если покупателю не хватает денег на оплату

if (customer.MoneyBalance + customer.BonusBalance < sum)

{

//Выкладывание товаров из корзины пока не будет хватать средств на оплату

while (true)

{

if (customer.MoneyBalance + customer.BonusBalance >= sum)

{

break;

}

customer.PutOutOfCart(cart);

sum = CalcSumOfProducts(cart, customer);

}

if (cart.Count == 0)

{

Console.WriteLine("\nТоваров не осталось в корзине. \n" + customer.Name + " вышел из магазина.");

//Выход из консоли с кодом 0

Environment.Exit(0);

}

}

while (true)

{

Console.WriteLine("Введите способ оплаты. 0 - наличными, 1 - бонусами, 2 - бонусами и наличными.");

string input = Console.ReadLine();

bool check = int.TryParse(input, out int paymentMethod);

//Проверка на введенное значение

if (paymentMethod < 0 || paymentMethod > 2 || !check)

{

Console.WriteLine("\nСпособ олаты введен не корректно!");

}

//Только наличными

else if (paymentMethod == 0 && customer.MoneyBalance >= sum)

{

customer.MoneyBalance -= sum;

Console.WriteLine("\nПокупки успешно оплачены. Метод оплаты: наличными.");

//Выход из цикла while

return;

}

//Только бонусами

else if (paymentMethod == 1 && customer.BonusBalance >= sum)

{

customer.BonusBalance -= sum;

Console.WriteLine("\nПокупки успешно оплачены. Метод оплаты: бонусами.");

//Выход из цикла while

return;

}

//Бонусами и наличными

else if (paymentMethod == 2 && customer.MoneyBalance + customer.BonusBalance >= sum)

{

while (true)

{

Console.WriteLine("Введите количество бонусов для списывания.");

string bonusInput = Console.ReadLine();

bool bonusCheck = decimal.TryParse(bonusInput, out decimal bonus);

//Проверка на корректность введененного количества бонусов

if (bonus < 0 || bonus > customer.BonusBalance || !bonusCheck

|| bonus < sum - customer.MoneyBalance)

{

Console.WriteLine("\nВведено не корректное число бонусов.");

}

else

{

sum -= bonus;

customer.BonusBalance -= bonus;

customer.MoneyBalance -= sum;

Console.WriteLine("\nПокупки успешно оплачены. Метод оплаты: бонусами и наличными.");

//Выход из цикла while

return;

}

}

}

//Не хватает средств для оплаты "только наличными" или "только бонусами"

else

{

Console.WriteLine("\nНедостаточно средств, выберите другой способ оплаты.");

}

}

}

public Customer(string name, decimal moneyBalnce, decimal bonusBalance)

{

this.Name = name;

this.MoneyBalance = moneyBalnce;

this.BonusBalance = bonusBalance;

}

}

Вывод

В ходе работы была написана программа, которая демонстрирует покупку товаров в магазине. При написании программы были использованы такие базовые принципы ООП как наследование, полиморфизм, абстракция и инкапсуляция.

Соседние файлы в предмете Технология программирования