Как переделать программу?

393
15 января 2018, 09:08

Пролог для задач: Разработать программу, оперирующую группами некоторых объектов. Способы хранения (структуры данных) групп объектов, операции с объектами (как членами групп), типы объектов и дополнительные специфические операции над ними определяются в каждом варианте индивидуально. Группы и элементы (объекты) реализуются классами. Все данные в классах должны быть защищены (т.е.protected или private). Обработка исключительных ситуаций обязательна (но необязательно стандартным механизмом обработки исключений C++ - try,catch,throw). Структуры данных (стеки,очереди, списки) реализуются только посредством списков. Сами экземпляры классов (объекты) в структурах данных не хранятся, хранятся только указатели.

Задача 1: Организовать очередь, используя в качестве буфера одномерный массив. Предусмотреть функции помещения/извлечения элемента и вывода всех элементов на печать. Буфер для хранения элементов должен быть циклическим, т.е. при достижении конца буфера, продолжить заполнение с его обратной стороны. Сделать также проверку на переполнение буфера.

Код:

#include "stdafx.h"
#include <iostream>
#include <cstdlib>
class Queue
{
public:
    Queue(int size) // конструктор
    {
        head = tail = length = 0;
        // создаём буфер заданного размера
        bufferSize = size;
        arr = new int[bufferSize];
        // заполняем буфер нулями*
        for (int i = 0; i < bufferSize; ++i)
            arr[i] = 0;
    }
    ~Queue() // деструктор
    {
        delete[] arr;
    }
    void put(int value) // помещаем элемент в очередь
    {
        // проверяем, полна ли очередь
        if (length == bufferSize)
        {
            std::cout << "Queue is full!\n";
            return;
        }
        // "зацикливаем" буфер
        if (tail == bufferSize)
            tail = 0;
        // помещаем значение в очередь
        arr[tail] = value;
        ++tail;
        ++length;
    }
    void get() // извлекаем элемент из очереди
    {
        // проверяем, пуста ли очередь
        if (length == 0)
        {
            std::cout << "Queue is empty!\n";
            return;
        }
        // "зацикливаем" буфер
        if (head == bufferSize)
            head = 0;
        // печатаем элемент
        std::cout << "Element = " << arr[head] << "\n";
        arr[head] = 0; // обнуляем элемент буфера*
        ++head;
        --length;
    }
    void printQueue() const // печатаем очередь
    {
        int i;
        std::cout << "Queue is: ";
        // проверяем, пуста ли очередь
        if (length == 0)
            std::cout << "empty";
        // если элементы в буфере идут по порядку
        else if (tail > head)
        {
            for (i = head; i < tail; ++i)
                std::cout << arr[i] << ' ';
        }
        // если буфер уже "зациклен"
        else
        {
            // выводим часть от головы
            for (i = head; i < bufferSize; ++i)
                std::cout << arr[i] << ' ';
            // выводим часть до хвоста
            for (i = 0; i < tail; ++i)
                std::cout << arr[i] << ' ';
        }
        std::cout << '\n';
        // доп. информация
        std::cout << "Length is: " << length << '\n';
        std::cout << "Head is: " << head << '\n';
        std::cout << "Tail is: " << tail << '\n';
    }
    void printBuffer() const // печать всего буфера*
    {
        std::cout << "Array is: ";
        for (int i = 0; i < bufferSize; ++i)
            std::cout << arr[i] << ' ';
        std::cout << '\n';
    }
private:
    int * arr;  // массив-буфер
    int bufferSize; // размер буфера
    int length; // длина очереди
    int tail;   // конец очереди
    int head;   // начало очереди
};

int main()
{
    // создаём очередь, макс.длина = 5
    Queue myQueue(5);
    // Выводим первоначальную очередь
    myQueue.printBuffer();
    myQueue.printQueue();
    std::cout << "|--------------------------|\n";
    // помещаем в очередь 6 элементов (1 не влезет)
    for (int i = 1; i <= 6; ++i)
    {
        myQueue.put(i * 2);
        myQueue.printBuffer();
        myQueue.printQueue();
        std::cout << "|--------------------------|\n";
    }
    // извлекаем из очереди 3 элемента
    for (int i = 1; i <= 3; ++i)
    {
        myQueue.get();
        myQueue.printBuffer();
        myQueue.printQueue();
        std::cout << "|--------------------------|\n";
    }
    // помещаем в очередь 3 элемента
    for (int i = 1; i <= 3; ++i)
    {
        myQueue.put(i * 3);
        myQueue.printBuffer();
        myQueue.printQueue();
        std::cout << "|--------------------------|\n";
    }
    // извлекаем из очереди 6 элементов (1 лишний)
    for (int i = 1; i <= 6; ++i)
    {
        myQueue.get();
        myQueue.printBuffer();
        myQueue.printQueue();
        std::cout << "|--------------------------|\n";
    }
    system("pause");
    return 0;
}

Задача 2: (C-строками: char*) Организовать очередь с операциями (изменение/вывод, нахождение подстроки). Предусмотреть возможность динамического изменения размера буфера, отводимого для хранения строки;

Задачу 1 я сделал, и её надо переделать в задачу 2. А как это сделать я не представляю себе. Не понимаю, что и как изменить, чтобы ничего не сломать.

UPD: немного разобрался)

#include "stdafx.h"
#include <iostream>
using namespace std;
const int N=4; //размер очереди
struct Queue
{
int data[N]; //массив данных
int last; //указатель на начало
};
void Creation(Queue *Q) //создание очереди
{ Q->last=0; }
bool Full(Queue *Q) //проверка очереди на пустоту
{
if (Q->last==0) return true;
else return false;
}
void Add(Queue *Q) //добавление элемента
{
if (Q->last==N)
{ cout<<"\nОчередь заполнена\n\n"; return; }
int value;
cout<<"\nЗначение > "; cin>>value;
Q->data[Q->last++]=value;
cout<<endl<<"Элемент добавлен в очередь\n\n";
}
void Delete(Queue *Q) //удаление элемента
{
for (int i=0; i<Q->last && i<N; i++) //смещение элементов
Q->data[i]=Q->data[i+1]; Q->last--;
}
int Top(Queue *Q) //вывод начального элемента
{ return Q->data[0]; }
int Size(Queue *Q) //размер очереди
{ return Q->last; }
void main() //главная функция
{
setlocale(LC_ALL,"Rus");
Queue Q;
Creation(&Q);
char number;
do
{
cout<<"1. Добавить элемент"<<endl;
cout<<"2. Удалить элемент"<<endl;
cout<<"3. Вывести верхний элемент"<<endl;
cout<<"4. Узнать размер очереди"<<endl;
cout<<"0. Выйти\n\n";
cout<<"Номер команды > "; cin>>number;
switch (number)
{
case '1': Add(&Q);
break;
//-----------------------------------------------
case '2':
if (Full(&Q)) cout<<endl<<"Очередь пуста\n\n";
else
{
Delete(&Q);
cout<<endl<<"Элемент удален из очереди\n\n";
} break;
//-----------------------------------------------
case '3':
if (Full(&Q)) cout<<endl<<"Очередь пуста\n\n";
else cout<<"\nНачальный элемент: "<<Top(&Q)<<"\n\n";
break;
//-----------------------------------------------
case '4':
if (Full(&Q)) cout<<endl<<"Очередь пуста\n\n";
else cout<<"\nРазмер очереди: "<<Size(&Q)<<"\n\n";
break;
//-----------------------------------------------
case '0': break;
default: cout<<endl<<"Команда не определена\n\n";
break;
}
} while(number!='0');
system("pause");
}
READ ALSO
Вызвано исключение в c++

Вызвано исключение в c++

Этот код вызывает ошибку:

343
Что делают функции begin() и end()

Что делают функции begin() и end()

Нигде не могу найти описание функций begin() и end(), для чего они нужны? Если можно напишите пример пожалуйста :)

376
Для чего нужен static_cast, как он работает и где его применяют?

Для чего нужен static_cast, как он работает и где его применяют?

У static_cast очень много различных примененийЕго идея состоит в следующем: это ограниченный по мощи C-style cast

391