Пролог для задач: Разработать программу, оперирующую группами некоторых объектов. Способы хранения (структуры данных) групп объектов, операции с объектами (как членами групп), типы объектов и дополнительные специфические операции над ними определяются в каждом варианте индивидуально. Группы и элементы (объекты) реализуются классами. Все данные в классах должны быть защищены (т.е.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");
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости