ВАРИАНТ №21
Задание:
Используя производные классы, определить класс параметризованного списка одного из следующих типов. Применить его для построения списка объектов указанного типа данных.
Определим следующие классы списков:
S5. Очередь.
Определим следующие типы данных:
T1. Число по модулю n.
Текст программы:
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
#include <alloc.h>
#include <math.h>
#include <stdio.h>
#define N 3 //число, из остатков от деления на которое будут состоять все числа класса
template <class DataT> class ModN;
template <class DataT> class ModN //класс числа по модулю N с указателем на следующий
//элемент (т.к. список – очередь)
{
public:
DataT info;
ModN<DataT> *next; //указатель на следующий элемент класса
ModN() //конструктор
{info=0; next=NULL;}
ModN(DataT c) //конструктор
{info=(DataT)abs(c)%N; next=NULL;}
// Перегрузка оператора <=
int operator<=(ModN g)
{
if (info<= g.info) return 1; else return 0;
}
// Перегрузка оператора <
int operator<(ModN g)
{
if (info < g.info) return 1; else return 0;
}
// Перегрузка оператора ==
int operator==(ModN g)
{
if (info == g.info) return 1; else return 0;
}
};
template <class DataT>
class queue: public ModN<DataT> //производный класс очередь
{
ModN<DataT> *start; //указатель на начало
public:
queue(){start=NULL;} //конструктор
~queue(); //деструктор
void append(DataT c); //добавление в конец очереди
DataT take_out(void) //удаление с начала очереди
{
ModN<DataT> *old_item;
old_item=start; //сохраняем предыдущую структуру элементов
DataT old_info = 0 ;
if ( start ) //если очередь не пуста
{
old_info = old_item -> info; //запоминаем элемент
start = ( start ) -> next; //переходим к следующему элементу
free (old_item ); //освобождаем текущий элемент
}
return ( old_info ); //возвращаем последний элемент
}
void show(); //функция, для показа всех элементов очереди
int isempty() //функция проверки очереди на пустоту
{
if(start) return 0; //если есть элементы (указатель на начало не указывает на
//NULL, то возвращаем 0 – очередь не пуста
else return 1; //в противном случае возвращаем 1
}
DataT peek(){return start->info;} // чтение первого элемента очереди
};
template <class DataT> queue<DataT>::~queue() //деструктор (удаление всех элементов)
{
ModN<DataT> *p, *p1;
p=start;
while(p)
{
p1=p->next; delete p; p=p1;
}
}
// добавление в конец очереди
template <class DataT> void queue<DataT>::append(DataT c)
{
ModN<DataT> *p,*cur;
p= new ModN<DataT>; //создаем новый элемент класса чисел по модулю N типа DataT
if(!p){cout<<"Память не может быть выделена!!\n";exit(1);}
p->info=abs(c)%N; //заполняем его поля переданным значением
p->next=NULL; //устанавливаем указатель
if(start==NULL) //если очередь была пуста
{
start=p; //поменять указатель на созданный и заполненный элемент класса
} else //если очередь не пуста
{
cur=start; //сохраняем указатель на текущий элемент
while (cur->next) //перемещаемся до последнего элемента
{
cur=cur->next;
}
cur->next=p; // делаем вновь созданный элемент самым последним
}
}
template <class DataT>
void queue<DataT>::show() //показ всей очереди
{
ModN<DataT> *temp;
temp= start;
while(temp) //до тех пор, пока не будут пройдены все элементы
{
cout<< temp->info<< "\n"; //выводить поле со значениями
temp = temp ->next;
}
cout<< endl;
}
void main (void)
{
int num,n,err;
char st[20];
queue<int> qu;
ModN<int> mod;
// Интерфейс работы
do
{
clrscr();
printf("Элементы данной очереди (mod N, N=%d): \n",N);
if(qu.isempty()) printf("Queue is empty\n");
qu.show(); //отображение содержимого очереди
cout << "\n\nВыберите действие\n\
<1> Добавить элемент в конец очереди\n\
<2> Извлечь элемент из начала очереди\n\
<3> Прочитать первый элемент очереди\n\
<4> Закончить\n\n";
num = getch();
switch (num)
{
case '1':
cout << "Введите значение элемента \n";
scanf("%s",st); //если пользователь ввел не цифры, а просто символы
n=atoi(st); //преобразовываем строку символов в целое число
qu.append(n); //добавляем в конец очереди
break;
case '2':
if(!qu.isempty()) {
printf( "Извлечен первый элемент из очереди: %d \n", qu.take_out()); getch();}
else cout<<"Очередь пуста\n"; getch();
break;
case '3':
if(!qu.isempty()) {
printf("Прочитан первый элемент из очереди: %d\n", qu.peek()); getch();}
else cout<<"Очередь пуста\n"; getch();
break;
}
} while (num != '4');
getch();
}
Результат работы программы:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.