Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2024, 06:40   #1
leksi223
Новичок
Джуниор
 
Регистрация: 14.05.2024
Сообщений: 6
По умолчанию Помогите пожалуйста исправить код!

По условиям не понимаю, работает ли программа как надо или нет помогите пожалуйста. Написать программу тестирования структуры данных, указанной в
вариативной части задания. Программа тестирования должна
включать в себя следующие инструкции:
- добавление элементов в структуру с фиксацией результата (добавление
произошло или нет). Если структура данных – дек, добавление элементов
должно осуществляться с обоих открытых концов;
- извлечение элемента из структуры с фиксацией результата (извлекли или
нет). Если структура данных – дек, извлечение элементов должно
осуществляться с обоих открытых концов;
- проверка пустоты структуры;
- проверка заполненности структуры. Структура данных – дек с ограниченным входом.
Напишите программу для моделирования работы конвейера по упаковке
кофе в банки. Банки, заполненные не менее номинального объема,
закупориваются и отправляются на склад, отбракованные снимаются с
конвейера, и кофе возвращается в развесочный автомат.
Пояснения к заданию. Начальный объем кофе в развесочном автомате и
номинальный объем банки задаются пользователем. В цикле, пока не
закончится кофе, производится наполнение банок с некоторой погрешностью
и отправка их на ленту конвейера (в дек). Как только банка поставлена, она
проверяется контролирующим автоматом и при недостаточном наполнении
снимается с конвейера (извлекается из дека с того же конца). Когда первая
наполненная банка доезжает до закупоривающего автомата (дек полон), она
снимается с ленты конвейера (извлекается с другого конца дека). Когда кофе в
развесочном автомате закончится, лента конвейера продолжает движение, пока
все банки не будут отправлены на склад (пока дек не опустеет). Каждое
действие (столько-то кофе насыпано; недосып – банка извлечена, кофе
возвращено в автомат; банка такого-то объема отправлена на склад; кофе в
развесочном автомате закончилось; все банки отправлены на склад) должно
сопровождаться выводом соответствующего сообщения на экран.
Код:
 #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];
}
leksi223 вне форума Ответить с цитированием
Старый 16.05.2024, 01:34   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,317
По умолчанию

Поменял бы в цикле насыпания кое-что:
Код:
    while (initialCoffeeVolume >= nominalCanVolume) { // чтобы не было зацикливания, если остатка кофе не хватает на одну банку
        int fillError = rand() % 5;
        int actualVolume = nominalCanVolume - fillError;
        initialCoffeeVolume -= actualVolume;
        
        if (Full(&deque)) {
            printf("Конвейер полон, банка с объемом %d отправлена на склад.\n", OutLeft(&deque));
        }
        
        InRight(actualVolume, &deque);
        printf("Банка с объемом %d отправлена на конвейер.\n", actualVolume);

        // по условию банку нужно именно поставить, а потом снять в случае недосыпа
        if (ReadRight(&deque) < nominalCanVolume) {
            actualVolume = OutRight(&deque);
            printf("Недосып - банка с объемом %d извлечена, кофе возвращено в автомат.\n", actualVolume);
            initialCoffeeVolume += actualVolume;
        }
    }
В вашем коде, если дек полон, то только что насыпанная банка терялась.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите, пожалуйста исправить ошибку wovancool PHP 3 23.12.2015 22:57
Помогите, пожалуйста, исправить ошибки. Questionier Помощь студентам 3 08.03.2015 11:34
Пожалуйста помогите исправить программу!!! J@GU@R Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 12.12.2009 22:59
Помогите исправить, пожалуйста abcdefg Паскаль, Turbo Pascal, PascalABC.NET 5 29.10.2009 21:51