МИНИСТЕРСТВО
НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ
ФЕДЕРАЦИИ
Федеральное
государственное автономное образовательное
учреждение
высшего
образования
«Национальный
исследовательский Томский политехнический
университет»
Инженерная
школа информационных технологий и
робототехники
Отделение
автоматизации и робототехники
Направление:
15.03.04 – Автоматизация технологических
процессов и производств
Отчёт
по лабораторной работе № 3
по
дисциплине «Основы программирования
и алгоритмизации»
«Структуры
в C++»
вариант
№ 10
Выполнил:
Студент
группы 8Т41 Кирильцева К. М.
Проверил:
Ассистент
________________ Кургинов Я. О.
Томск
2025
Цель
работы:
Изучить
и освоить основы работы с структурами
в языке
программирования
C++, научиться объявлять и инициализировать
структуры,
а также научиться решать практические
задачи, связанные с
использованием
структур.
Задание:
KFC.
So good
Реализовать
электронную очередь заказов с учетом
готовности позиций.
Требования:
Заказ
содержит несколько позиций (например,
"бургер", "картофель").
Кухня
периодически пополняет запас готовых
позиций.
Реализовать:
1.
Добавление заказа в очередь.
2.
Проверку готовности позиций.
3.
Сборку и выдачи заказа, если все готово.
4.
Пропуск заказа, если что-то не готово.
5.
Вывод текущего состояния очереди и
кухни.
Блок
схемы:
Блок
схема основного кода представлена на
рисунке 1.
Рисунок
1- Блок схема основного кода.
Блок
схема функции addOrder(Order& order, std::string
itemName, int quantity) представлена на рисунке
2.
Рисунок
2 - Блок схема функции.
Блок
схема функции addReadyItem(Kitchen& kitchen,
std::string itemName, int quantity) представлена на
рисунке 3.
Рисунок
3 - Блок схема функции.
Блок
схема
функции
checkOrderStatus(const Order& order, const Kitchen& kitchen)
представлена
на
рисунке
4.
Рисунок
4 - Блок схема функции.
Блок
схема
функции
completeOrder(Order& order, const Kitchen& kitchen)
представлена
на
рисунке
5.
Рисунок
5 - Блок схема функции.
Результат
заказа показан на рисунке 6:
Рисунок
6 – Пример заказа.
Вывод:
В
ходе лабораторной работы:
Изучены
и реализованы структуры с вложенными
данными.
Получены
навыки работы с std::queue, std::map.
Разработана
модель электронной очереди, приближенная
к реальному применению в fast-food.
Отлажена
логика взаимодействия заказов и текущих
ресурсов (готовых позиций на кухне).
Приложение
A.
(Обязательный)
Листинги
программ
Листинг
1 – Код всех функций, использующихся в
задании
#include
"Header.h"
-
//
Добавление позиции в заказ
void
addOrder(Order& order, std::string itemName, int quantity) {
if
(order.itemCount < 5) {
order.items[order.itemCount].name
= itemName;
order.items[order.itemCount].quantity
= quantity;
order.items[order.itemCount].isReady
= false;
order.itemCount++;
}
else
{
std::cout
<< "Ошибка: Максимальное количество
позиций в заказе - 5" << std::endl;
}
}
-
//
Добавление готовой позиции на кухню
void
addReadyItem(Kitchen& kitchen, std::string itemName, int
quantity) {
if
(kitchen.readyItemCount < 5) {
kitchen.readyItems[kitchen.readyItemCount].name
= itemName;
kitchen.readyItems[kitchen.readyItemCount].quantity
= quantity;
kitchen.readyItems[kitchen.readyItemCount].isReady
= true;
kitchen.readyItemCount++;
}
else
{
std::cout
<< "Ошибка: Максимальное количество
готовых позиций - 5" << std::endl;
}
}
|
Продолжение
Листинга 1
//
Проверка статуса заказа
bool
checkOrderStatus(const Order& order, const Kitchen&
kitchen) {
for
(int i = 0; i < order.itemCount; i++) {
bool
found = false;
for
(int j = 0; j < kitchen.readyItemCount; j++) {
if
(order.items[i].name == kitchen.readyItems[j].name &&
kitchen.readyItems[j].quantity
>= order.items[i].quantity) {
found
= true;
break;
}
}
if
(!found) {
return
false;
}
}
return
true;
}
-
//
Завершение заказа
void
completeOrder(Order& order, const Kitchen& kitchen) {
if
(checkOrderStatus(order, kitchen)) {
order.isComplete
= true;
std::cout
<< "Заказ №" << order.orderId <<
" готов к выдаче!" << std::endl;
}
else
{
std::cout
<< "Заказ №" << order.orderId <<
" не может быть завершен: не все
позиции готовы" << std::endl;
}
}
|
Продолжение
Листинга 1
//
Вывод состояния очереди
void
printQueue(Order* queue, int queueSize) {
std::cout
<< "\nТекущая очередь заказов:"
<< std::endl;
for
(int i = 0; i < queueSize; i++) {
if
(queue[i].itemCount > 0) {
std::cout
<< "Заказ №" << queue[i].orderId <<
":" << std::endl;
for
(int j = 0; j < queue[i].itemCount; j++) {
std::cout
<< " - " << queue[i].items[j].name <<
" x" << queue[i].items[j].quantity;
if
(queue[i].items[j].isReady) {
std::cout
<< " (готово)";
}
std::cout
<< std::endl;
}
if
(queue[i].isComplete) {
std::cout
<< " Статус: Завершен" <<
std::endl;
}
else
{
std::cout
<< " Статус: В ожидании" <<
std::endl;
}
}
}
}
-
//
Вывод состояния кухни
void
printKitchenStatus(const Kitchen& kitchen) {
std::cout
<< "\nСостояние кухни:" <<
std::endl;
for
(int i = 0; i < kitchen.readyItemCount; i++) {
std::cout
<< "- " << kitchen.readyItems[i].name <<
" x" << kitchen.readyItems[i].quantity << "
(готово)" << std::endl;
}
}
|
Листинг
2 – Код основного файла, для выбора типа
сортировки
#include
"Header.h"
-
int
main() {
setlocale(LC_ALL,
"Russian");
//
Создаем массив для хранения заказов
(максимум 10 заказов)
Order
orders[10];
int
currentOrderCount = 0;
-
Kitchen
kitchen;
-
while
(true) {
std::cout
<< "\nМеню:"
<< std::endl;
std::cout
<< "1. Добавить заказ" <<
std::endl;
std::cout
<< "2. Добавить готовую позицию"
<< std::endl;
std::cout
<< "3. Проверить статус заказов"
<< std::endl;
std::cout
<< "4. Завершить заказ" <<
std::endl;
std::cout
<< "5. Показать состояние системы"
<< std::endl;
std::cout
<< "6. Выход"
<< std::endl;
int
choice;
std::cout
<< "Выберите действие: ";
std::cin
>> choice;
switch
(choice) {
case
1: {
if
(currentOrderCount < 10) {
orders[currentOrderCount].orderId
= currentOrderCount + 1;
orders[currentOrderCount].itemCount
= 0;
orders[currentOrderCount].isComplete
= false;
orders[currentOrderCount].orderTime
= time(0);
-
std::cout
<< "Добавление
заказа
№" << orders[currentOrderCount].orderId <<
std::endl;
std::string
itemName;
int
quantity;
-
while
(true) {
std::cout
<< "Введите название позиции
(или 'end' для завершения): ";
std::cin
>> itemName;
if
(itemName == "end") break;
std::cout
<< "Введите количество: ";
std::cin
>> quantity;
-
addOrder(orders[currentOrderCount],
itemName, quantity);
}
currentOrderCount++;
}
|
Продолжение
Листинга 2
else
{
std::cout
<< "Ошибка: Максимальное количество
заказов - 10" << std::endl;
}
break;
}
-
case
2: {
std::string
itemName;
int
quantity;
std::cout
<< "Введите название готовой
позиции: ";
std::cin
>> itemName;
std::cout
<< "Введите количество: ";
std::cin
>> quantity;
addReadyItem(kitchen,
itemName, quantity);
break;
}
-
case
3: {
for
(int i = 0; i < currentOrderCount; i++) {
if
(!orders[i].isComplete) {
bool
status = checkOrderStatus(orders[i], kitchen);
if
(status) {
std::cout
<< "Заказ №" << orders[i].orderId <<
" готов к сборке" << std::endl;
}
else
{
std::cout
<< "Заказ №" << orders[i].orderId <<
" ожидает готовности позиций"
<< std::endl;
}
}
}
break;
}
-
case
4: {
int
orderId;
std::cout
<< "Введите номер заказа для
завершения: ";
std::cin
>> orderId;
-
if
(orderId > 0 && orderId <= currentOrderCount) {
completeOrder(orders[orderId
- 1], kitchen);
}
else
{
std::cout
<< "Ошибка: Неверный номер заказа"
<< std::endl;
}
break;
}
|
Продолжение
Листинга 2
case
5: {
printQueue(orders,
currentOrderCount);
printKitchenStatus(kitchen);
break;
}
-
case
6: {
return
0;
}
-
default:
{
std::cout
<< "Ошибка: Неверный выбор" <<
std::endl;
}
}
}
-
return
0;
}
|