По условиям не понимаю, работает ли программа как надо или нет помогите пожалуйста. Написать программу тестирования структуры данных, указанной в
вариативной части задания. Программа тестирования должна
включать в себя следующие инструкции:
- добавление элементов в структуру с фиксацией результата (добавление
произошло или нет). Если структура данных – дек, добавление элементов
должно осуществляться с обоих открытых концов;
- извлечение элемента из структуры с фиксацией результата (извлекли или
нет). Если структура данных – дек, извлечение элементов должно
осуществляться с обоих открытых концов;
- проверка пустоты структуры;
- проверка заполненности структуры. Структура данных – дек с ограниченным входом.
Напишите программу для моделирования работы конвейера по упаковке
кофе в банки. Банки, заполненные не менее номинального объема,
закупориваются и отправляются на склад, отбракованные снимаются с
конвейера, и кофе возвращается в развесочный автомат.
Пояснения к заданию. Начальный объем кофе в развесочном автомате и
номинальный объем банки задаются пользователем. В цикле, пока не
закончится кофе, производится наполнение банок с некоторой погрешностью
и отправка их на ленту конвейера (в дек). Как только банка поставлена, она
проверяется контролирующим автоматом и при недостаточном наполнении
снимается с конвейера (извлекается из дека с того же конца). Когда первая
наполненная банка доезжает до закупоривающего автомата (дек полон), она
снимается с ленты конвейера (извлекается с другого конца дека). Когда кофе в
развесочном автомате закончится, лента конвейера продолжает движение, пока
все банки не будут отправлены на склад (пока дек не опустеет). Каждое
действие (столько-то кофе насыпано; недосып – банка извлечена, кофе
возвращено в автомат; банка такого-то объема отправлена на склад; кофе в
развесочном автомате закончилось; все банки отправлены на склад) должно
сопровождаться выводом соответствующего сообщения на экран.
Код:
#include <stdio.h> // Подключение стандартной библиотеки ввода/вывода
#include <stdlib.h> // Подключение стандартной библиотеки для работы с памятью, числами и другими функциями
#include <locale.h> // Подключение стандартной библиотеки для работы с локалью
#define MAXLENGTH 10 // Определение максимальной длины дека
typedef int DataType; // Определение типа данных
typedef struct Deque { // Определение структуры дека
int left, right; // Левая и правая границы дека
DataType data[MAXLENGTH]; // Массив данных дека
} Deque;
void MakeNull(Deque *pDeque); // Объявление функции для инициализации дека
int Empty(Deque *pDeque); // Объявление функции для проверки пустоты дека
int Full(Deque *pDeque); // Объявление функции для проверки полноты дека
DataType ReadLeft(Deque *pDeque); // Объявление функции для чтения элемента слева
DataType ReadRight(Deque *pDeque); // Объявление функции для чтения элемента справа
int InRight(DataType x, Deque *pDeque); // Объявление функции для добавления элемента справа
int InLeft(DataType x, Deque *pDeque); // Объявление функции для добавления элемента слева
DataType OutLeft(Deque *pDeque); // Объявление функции для удаления элемента слева
DataType OutRight(Deque *pDeque); // Объявление функции для удаления элемента справа
void waitForEnter() {
printf("Press Enter to continue...");
while (getchar() != '\n');
getchar(); //Функция waitForEnter предлагает пользователю нажать Enter, чтобы продолжить, обеспечивая независимый от платформы способ приостановки выполнения программы.
}
int main() {
setlocale(LC_ALL, "Rus"); // Установка локали для отображения сообщений на русском языке
Deque deque; // Создание экземпляра структуры дека
int initialCoffeeVolume, nominalCanVolume; // Объявление переменных для начального объема кофе и номинального объема банки
printf("Введите начальный объем кофе в развесочном автомате: "); // Вывод на экран запроса начального объема кофе
scanf("%d", &initialCoffeeVolume); // Считывание начального объема кофе
printf("Введите номинальный объем банки: "); // Вывод на экран запроса номинального объема банки
scanf("%d", &nominalCanVolume); // Считывание номинального объема банки
MakeNull(&deque); // Инициализация дека
while (initialCoffeeVolume > 0) { // Цикл, выполняющийся, пока есть кофе для упаковки
int fillError = rand() % 5; // Погрешность наполнения
int actualVolume = nominalCanVolume - fillError; // Расчет фактического объема банки
initialCoffeeVolume -= actualVolume; // Вычитание фактического объема банки из общего объема кофе
if (actualVolume >= nominalCanVolume) { // Проверка, достаточно ли кофе для заполнения банки
if (!Full(&deque)) { // Проверка, не полон ли дек
InRight(actualVolume, &deque); // Добавление элемента справа
printf("Банка с объемом %d отправлена на конвейер.\n", actualVolume); // Вывод на экран информации о отправке банки на конвейер
} else {
printf("Конвейер полон, банка с объемом %d отправлена на склад.\n", OutLeft(&deque)); // Вывод на экран информации о полном конвейере и отправке банки на склад
}
} else {
printf("Недосып - банка с объемом %d извлечена, кофе возвращено в автомат.\n", actualVolume); //сообщение о том, что банка с определенным объемом была извлечена, а кофе возвращено в автомат
initialCoffeeVolume += actualVolume; //значение объема кофе прибавляется к изначальному объему.
}
}
printf("Кофе в развесочном автомате закончилось.\n"); //сообщение о том, что кофе в развесочном автомате закончилось.
while (!Empty(&deque)) {
printf("Банка с объемом %d отправлена на склад.\n", OutLeft(&deque));
}
printf("Все банки отправлены на склад.\n"); //сообщение о том, что все банки были отправлены на склад.
waitForEnter(); //ожидание ввода пользователя перед завершением программы.
return 0;
}
// Функции для работы с деком...
void MakeNull(Deque *pDeque)
{
pDeque->left = 0;
pDeque->right = MAXLENGTH - 1;
}
int Empty(Deque *pDeque) //Данная функция Empty проверяет, является ли дек пустым. Возвращает 1, если дек пуст, и 0 в противном случае.
{
return (pDeque->right + 1) % MAXLENGTH == pDeque->left;
}
int Full(Deque *pDeque) //функция Full проверяет, является ли дек полным. Возвращает 1, если дек полон, и 0 в противном случае.
{
return (pDeque->right + 2) % MAXLENGTH == pDeque->left;
}
int ReadLeft(Deque *pDeque) //Данная функция ReadLeft возвращает значение элемента в левой позиции дека.
{
return pDeque->data[pDeque->left];
}
int ReadRight(Deque *pDeque) //Данная функция ReadRight возвращает значение элемента в правой позиции дека.
{
return pDeque->data[pDeque->right];
}
int InRight(DataType x, Deque *pDeque)
{
if (Full(pDeque)) return 0;
pDeque->right = (pDeque->right + 1) % MAXLENGTH;
pDeque->data[pDeque->right] = x;
return 1;
}
DataType OutLeft(Deque *pDeque) //функция OutLeft удаляет элемент из левой позиции дека и возвращает его значение.
{
int temp = pDeque->left;
pDeque->left = (pDeque->left + 1) % MAXLENGTH;
return pDeque->data[temp];
}
DataType OutRight(Deque *pDeque)
{
int temp = pDeque->right;
pDeque->right = pDeque->right ? pDeque->right - 1 : MAXLENGTH - 1;
return pDeque->data[temp];
}