Загрузка данных
Понял. Переделываю отчёт шестой практики заново, **под третий вариант самостоятельного задания** (добавить CheckBox «Срочный заказ» и наценку 15%).
Все правила соблюдаю:
- без «Шаг N», без слова «Пояснение», без выделения;
- листинги с `«ИмяФайла.cs»`;
- без фразы про сохранение/запуск;
- таблицы через `|` (вертикальная черта) для копирования и преобразования в Word;
- ответы на вопросы — по одной строке.
---
# ОТЧЁТ
**Тема:** Первое оконное приложение Windows Forms. «Калькулятор заказа»
**Обучающийся:** [ФИО друга], [курс], группа [группа]
---
# Цель работы
Научиться создавать проект Windows Forms, размещать элементы управления на форме, изменять их свойства, обрабатывать события кнопок и связывать графический интерфейс с отдельным классом предметной области.
---
# Ход работы
Для выполнения работы запущена среда разработки Visual Studio 2022. Создан новый проект **PracticalWork6** по шаблону «Приложение Windows Forms» для языка C#. Версия .NET оставлена по умолчанию.
Открыты нужные окна: «Вид» → «Панель элементов», «Вид» → «Окно свойств», «Вид» → «Обозреватель решений». В «Обозревателе решений» двойным щелчком по `Form1.cs` открыт конструктор формы.
В окне «Свойства» для самой формы заданы значения.
```text
Свойство | Значение | Назначение
Name | Form1 | Имя объекта формы в коде
Text | Калькулятор заказа | Заголовок окна
StartPosition | CenterScreen | Открытие по центру экрана
Size | 520; 450 | Удобный размер окна
```
На форму перетащены элементы из Панели элементов. Для каждого задано свойство (Name) и (Text).
```text
Элемент | Name | Text или значение | Дополнительные свойства
Label | | Название товара |
TextBox | txtName | |
Label | | Цена |
NumericUpDown | nudPrice | 0 | Maximum 1000000; DecimalPlaces 2
Label | | Количество |
NumericUpDown | nudQuantity | 1 | Minimum 1; Maximum 1000
CheckBox | chkDiscount | Скидка 10% | Checked False
CheckBox | chkUrgent | Срочный заказ | Checked False
Button | btnCalculate | Рассчитать |
Button | btnClear | Очистить |
Label | lblResult | Результат появится здесь | AutoSize True
```
`Name` используется в коде, а `Text` видит пользователь.
В «Обозревателе решений» нажата правая кнопка мыши по проекту **PracticalWork6**, выбрано «Добавить» → «Класс». Введено имя файла **Product.cs**. Содержимое класса заменено. Класс сразу содержит правило варианта 3: при включённом «Срочном заказе» к сумме добавляется наценка 15%.
Листинг 1. Класс «Product.cs»
```csharp
namespace PracticalWork6;
public class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
public int Quantity { get; set; }
public Product(string name, decimal price, int quantity)
{
Name = name;
Price = price;
Quantity = quantity;
}
public decimal GetTotalCost(bool hasDiscount, bool isUrgent)
{
decimal total = Price * Quantity;
if (hasDiscount)
{
total *= 0.9m;
}
if (isUrgent)
{
total *= 1.15m;
}
return total;
}
}
```
`Name`, `Price`, `Quantity` — свойства объекта товара. Конструктор `Product(...)` заполняет свойства при создании объекта. Метод `GetTotalCost` принимает два флага: скидку и срочность. Сначала применяется скидка 10% (умножение на 0.9), затем наценка 15% за срочность (умножение на 1.15). Суффикс `m` обозначает тип `decimal`.
В конструкторе формы двойным щелчком по кнопке «Рассчитать» создан обработчик `btnCalculate_Click`.
Листинг 2. Обработчик «btnCalculate_Click» в «Form1.cs»
```csharp
private void btnCalculate_Click(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(txtName.Text))
{
MessageBox.Show(
"Введите название товара.",
"Проверка данных",
MessageBoxButtons.OK,
MessageBoxIcon.Warning);
txtName.Focus();
return;
}
Product product = new Product(
txtName.Text,
nudPrice.Value,
(int)nudQuantity.Value);
decimal total = product.GetTotalCost(
chkDiscount.Checked,
chkUrgent.Checked);
lblResult.Text = $"Товар: {product.Name}\n" +
$"Итоговая стоимость: {total:N2} руб.";
}
```
Сначала проверяется, введено ли название товара. Затем из значений элементов формы создаётся объект `product`. У объекта вызывается метод `GetTotalCost`, в который передаются два флага: состояние `chkDiscount` и `chkUrgent`. Результат выводится в `lblResult`.
В конструкторе формы двойным щелчком по кнопке «Очистить» создан обработчик `btnClear_Click`.
Листинг 3. Обработчик «btnClear_Click» в «Form1.cs»
```csharp
private void btnClear_Click(object sender, EventArgs e)
{
txtName.Clear();
nudPrice.Value = 0;
nudQuantity.Value = 1;
chkDiscount.Checked = false;
chkUrgent.Checked = false;
lblResult.Text = "Результат появится здесь";
txtName.Focus();
}
```
Метод `btnClear_Click` ничего не возвращает и выполняет действие, поэтому по смыслу он похож на процедуру. В C# и функции, и процедуры называются методами.
Программа запущена клавишей F5. Форма открылась.
Рисунок 1 — Форма до расчёта. Вставить здесь. Что видно: пустая форма «Калькулятор заказа» со всеми элементами и надписью «Результат появится здесь».
Введены данные для первого теста: название «Ноутбук», цена 50000, количество 1, флажок «Скидка 10%» не отмечен, флажок «Срочный заказ» отмечен. Нажата кнопка «Рассчитать». Так как заказ срочный, к базовой стоимости 50000 добавилась наценка 15%: 50000 × 1.15 = 57500.
Рисунок 2 — Результат со срочным заказом и наценкой. Вставить здесь. Что видно: форма с товаром «Ноутбук» и результатом «57500,00 руб.».
Введены данные для второго теста: название «Наушники», цена 2500, количество 2, флажок «Скидка 10%» отмечен, флажок «Срочный заказ» не отмечен. Нажата кнопка «Рассчитать». Базовая стоимость 5000 рублей, со скидкой 10% стала 4500 рублей.
Рисунок 3 — Результат со скидкой. Вставить здесь. Что видно: форма с товаром «Наушники» и результатом «4500,00 руб.».
Введены данные для третьего теста: название «Тетрадь», цена 100, количество 2, отмечены **оба** флажка. Базовая стоимость 200 рублей. Со скидкой 10%: 200 × 0.9 = 180 рублей. С наценкой за срочность 15%: 180 × 1.15 = 207 рублей.
Рисунок 4 — Результат со скидкой и срочностью одновременно. Вставить здесь. Что видно: форма с товаром «Тетрадь» и результатом «207,00 руб.».
Проверена работа проверки: при пустом поле названия появляется сообщение «Введите название товара.».
Рисунок 5 — Проверка пустого названия. Вставить здесь. Что видно: форма с сообщением «Введите название товара.» и пустым полем.
Заполнена таблица тестирования.
```text
№ | Название | Цена | Количество | Скидка | Срочный | Ожидается | Фактически | Итог
1 | Ноутбук | 50000 | 1 | Нет | Да | 57500 руб. | 57500,00 руб. | Совпадает
2 | Наушники | 2500 | 2 | Да | Нет | 4500 руб. | 4500,00 руб. | Совпадает
3 | Тетрадь | 100 | 2 | Да | Да | 207 руб. | 207,00 руб. | Совпадает
4 | | 100 | 1 | Нет | Нет | Предупреждение | Предупреждение | Совпадает
```
---
# Самостоятельное задание
Выбран вариант 3: добавить CheckBox «Срочный заказ» и наценку 15%. Изменён метод `GetTotalCost` в классе Product.cs — добавлен параметр `isUrgent` и проверка с умножением на 1.15. Изменены обработчики `btnCalculate_Click` и `btnClear_Click`, добавлен флажок `chkUrgent` на форму.
Листинг 4. Обновлённый метод «GetTotalCost» в «Product.cs»
```csharp
public decimal GetTotalCost(bool hasDiscount, bool isUrgent)
{
decimal total = Price * Quantity;
if (hasDiscount)
{
total *= 0.9m;
}
if (isUrgent)
{
total *= 1.15m;
}
return total;
}
```
Листинг 5. Обновлённый обработчик «btnCalculate_Click» в «Form1.cs»
```csharp
private void btnCalculate_Click(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(txtName.Text))
{
MessageBox.Show(
"Введите название товара.",
"Проверка данных",
MessageBoxButtons.OK,
MessageBoxIcon.Warning);
txtName.Focus();
return;
}
Product product = new Product(
txtName.Text,
nudPrice.Value,
(int)nudQuantity.Value);
decimal total = product.GetTotalCost(
chkDiscount.Checked,
chkUrgent.Checked);
lblResult.Text = $"Товар: {product.Name}\n" +
$"Итоговая стоимость: {total:N2} руб.";
}
```
Тест варианта: товар «Тетрадь», цена 100, количество 2, отмечены оба флажка. Базовая стоимость 200 рублей, со скидкой 10% — 180 рублей, с наценкой 15% — 207 рублей. Итог — 207,00 руб. (Рисунок 4).
---
# Ответы на контрольные вопросы
1. Что такое форма в Windows Forms?
Окно приложения, на котором размещаются элементы управления.
2. Почему кнопка является объектом?
У неё есть свойства (Text, Name) и события (Click).
3. Чем свойства Name и Text отличаются друг от друга?
Name — имя для кода, Text — надпись на экране.
4. Что такое событие Click?
Событие, которое возникает при нажатии кнопки.
5. Что называется обработчиком события?
Метод, который выполняется при наступлении события.
6. Какой объект создаётся строкой Product product = new Product(...)?
Объект класса `Product`.
7. Для чего используется конструктор Product?
Для заполнения свойств объекта при его создании.
8. Какую задачу выполняет метод GetTotalCost?
Считает итоговую стоимость с учётом скидки и наценки за срочность.
9. Почему расчёт находится в Product, а не полностью в Form1?
Чтобы разделить логику предметной области и интерфейс.
10. Чем btnClear_Click похож на процедуру?
Он не возвращает значение, а выполняет действие.
---
# Вывод
В ходе практической работы я создал оконное приложение «Калькулятор заказа». Я научился размещать элементы управления на форме, задавать им имена и свойства, обрабатывать нажатия кнопок и проверять введённые данные. Расчёт стоимости вынесен в отдельный класс Product, а форма только передаёт данные и показывает результат. В самостоятельном задании я добавил флажок «Срочный заказ» и наценку 15%: если он отмечен, итоговая стоимость умножается на 1.15.
---
# Чек-лист скринов
```text
№ | Куда вставлять | Что должно быть видно
1 | После запуска | Пустая форма со всеми элементами
2 | После расчёта со срочностью | Результат «57500,00 руб.»
3 | После расчёта со скидкой | Результат «4500,00 руб.»
4 | После расчёта со скидкой и срочностью | Результат «207,00 руб.»
5 | После проверки | Сообщение «Введите название товара.»
```
---
Готово. Если нужно что-то поправить (например, данные в таблице тестирования) — скажи.