Лабораторная работа по C++ шаблоны

Цель работы

Изучить механизм параметризованных классов и функций предназначенных для реализации обобщенного программирования.

 Лабораторное задание

Для базового класса реализовать параметризованную функцию сравнения двух объектов класса на больше, меньше или равно.
Для базового класса реализовать один (или более) параметризованный класс, реализующий структуру данных в соответствии с лабораторным заданием. Параметризованный класс должен поддерживать набор базовых операций, применяемый к указанной структуре данных.
Все структуры — динамические.
Программа должна выполнить следующее:
– заполнить структуру данных;
– вывести структуру данных на экран;
– удалить все элементы из структуры данных.
Структура данных - стек. Минимальный набор операций: вталкивание элемента, выталкивание элемента.


Листинг

Файл Detal.h


#include <string>
#include <iostream>
#include <iomanip>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <set>
#include <locale>

using namespace std;

class Detal
{
public:
    Detal(void);
      Detal(wchar_t* nazv, wchar_t* nazn, wchar_t* mater, wchar_t* proizv);
      ~Detal(void);

      void Input(void);
      void Output(void);
      bool operator <(const Detal& _Right) const;
      bool operator >(const Detal& _Right) const;
      bool operator ==(const Detal& _Right) const;
      void operator =(const Detal& _Right);
      void Add();

private:
    wstring m_szNazvanie;
      wstring m_szNaznachenie;
      wstring m_szMaterial;
      wstring m_szProizvodstvo;
};

template <class TYPE>
class Stack
{
public:
      TYPE* head;
      int sz;

      Stack()
      {
            head=0;
            sz=0;
      }
      ~Stack()
      {
      }
      void push(TYPE creating)
      {
            TYPE* newhead = new TYPE[sz+1];
            int i =0;
            TYPE* i_head=head;
            TYPE* i_newhead=newhead;
            for (i=0;i<sz;i++)
            {
                  *(i_newhead)=*(i_head);
                  i_newhead++;
                  i_head++;
            }
            if (head)
            {
                  delete[] head;
            }
            head=newhead;
            *i_newhead=creating;
            sz++;
      }
      TYPE* pop()
      {
            if (sz==0)
            {
                  return NULL;
            }
            TYPE* newhead = new TYPE[sz-1];
            TYPE* i_head=head;
            TYPE* i_newhead=newhead;
            for (int i=0;i<sz-1;i++)
            {
                  *(i_newhead)=*(i_head);
                  i_newhead++;
                  i_head++;
            }
           
            TYPE* pret = new TYPE;
            *(pret)=*(i_head);
            if (head)
            {
                  delete[] head;
            }
            head=newhead;
            sz--;
            return pret;
      }
      void clear()
      {
            while (sz)
            {
                  pop();
            }
      }
};

void textmenu(int &choice);
void add(Stack <Detal> &mylist);
void prt(Stack <Detal> &mylist);
template <typename TYPE>
void compare (TYPE _left, TYPE _right)
{
      if (_left >_right)
      {
            wcout <<L"Первый объект больше"<<endl;
      }
      else if (_left<_right)
      {
            wcout <<L"Второй объект больше"<<endl;
      }
      else if (_left==_right)
      {
            wcout <<L"Объекты равны"<<endl;
      }

}

Файл Main.cpp


#include "Detal.h"

void main(void)
{
      setlocale (LC_CTYPE, ".866");
     
      Detal a;
      Detal b;
     
      wcout << L"1)Реализация параметризованной функции сравнения двух объектов класса \"Detal\" "<< endl<<endl;
     
      wcout << L"Заполните данные первого объекта. "<< endl;
      a.Input();

      wcout << L"Заполните данные второго объекта. "<< endl;
      b.Input();

      compare <Detal>(a,b);
     
      system("pause");

      ///////////////////////////////////////////////////////////////////////////////////////////////////////////////

      wcout << L"2)Реализация параметризованного класса" << endl<<endl;
     
      Stack <Detal> mystack;
     
      int choice=0;
      while(1)
      {
            textmenu(choice);
            switch(choice)
            {
            case 1:
                  wcout << L"..... Добавление объекта в стек ....."<<endl;
                  add(mystack);
                  break;
            case 2:
                  wcout << L"..... Вывод содержимого на экран в виде таблицы ....."<<endl;
                  prt(mystack);
                  break;
            case 3:
                  wcout << L"..... Удаление обьекта из стека ....."<<endl;
                  a=*(mystack.pop());
                  wcout << L"Удалённый из стека объект:"<<endl;
                  a.Output();
                  break;
            case 4:
                  wcout <<L"..... Очистка стека .....\n"<<endl;
                  mystack.clear();
                  break;
            }    
      }          

}

Файл Detal.cpp


#include "Detal.h"

void prt(Stack <Detal> &mystack)
{

      wcout << L"\n+==================+==================+====================+===================+\n";
      wcout <<   L"|     Название     |     Материал     |     Назначение     |    Производство   |\n";
      wcout <<   L"+==================+==================+====================+===================+\n";
     
      Detal* printing = mystack.head;

      for (int i=0;i<mystack.sz;i++)
      {
            printing->Output();
            printing++;
      }
}
void add(Stack <Detal> &mylist)
{
      Detal tmp;
      tmp.Input();
      mylist.push(tmp);
}
void textmenu(int &choice)
{
      wcout << L"\n ********** Выберите пункт меню *********** \n";
      wcout <<   L"| 1-Добавить объект в стек                 |\n";
      wcout <<   L"| 2-Вывод содержимого стека в виде таблицы |\n";
      wcout <<   L"| 3-Удалить элемент из стека               |\n";
      wcout <<   L"| 4-Очистить стек                          |\n";
      wcout <<   L" ****************************************** \n";
      cin >> choice;
      fflush(stdin);
      system("CLS");
}
Detal::Detal(void)
{
            m_szNazvanie+= L"Nazv";
            m_szNaznachenie+= L"Nazn";
            m_szMaterial+= L"Mat";
            m_szProizvodstvo+= L"Proizv";
}

Detal::Detal(wchar_t* nazv,wchar_t* nazn, wchar_t* mater, wchar_t* proizv)
{
      m_szNazvanie+=*nazv;
      m_szNaznachenie+=*nazn;
      m_szMaterial+=*mater;
      m_szProizvodstvo+=*proizv;
}

Detal::~Detal(void)
{
}

void Detal::Input(void)
 {   
      wcout << L"Ввод данных:\n";
      wchar_t buf[20];

      wcout << L"    Название детали: ";
      _getws(buf);
      m_szNazvanie=buf;
     
      wcout << L"    Назначение детали: ";
      _getws(buf);
      m_szNaznachenie=buf;
     
      wcout << L"    Материал детали: ";
      _getws(buf);
      m_szMaterial=buf;
     
      wcout << L"    Производство детали: ";
      _getws(buf);
      m_szProizvodstvo=buf;
 }

void Detal::Output(void)
{

      wprintfL"|     %-8ws     |     %-8ws     |     %-11ws    |    %-12ws   |\n", m_szNazvanie.c_str(), m_szMaterial.c_str(), m_szNaznachenie.c_str(), m_szProizvodstvo.c_str());
      wprintfL"+------------------+------------------+--------------------+-------------------+\n");
}
bool Detal::operator <(const Detal& _Right) const
{
      return (this->m_szNazvanie < _Right.m_szNazvanie);
}
bool Detal::operator >(const Detal& _Right) const
{
      return (this->m_szNazvanie > _Right.m_szNazvanie);
}
bool Detal::operator ==(const Detal& _Right) const
{
      return (this->m_szNazvanie == _Right.m_szNazvanie);
}
void Detal::operator=(const Detal& _Right)
{
      this->m_szMaterial=_Right.m_szMaterial;
      this->m_szNaznachenie=_Right.m_szNaznachenie;
      this->m_szNazvanie=_Right.m_szNazvanie;
      this->m_szProizvodstvo=_Right.m_szProizvodstvo;
}

Пояснительный текст к программе

Переменная i – счетчик цикла, Detal – класс, Stack – параметризованный класс, функция compare() – параметризованная функция сравнения двух объектов класса Detal.
Переменные m_szNazvanie, m_szNaznachenie, m_szMaterial, m_szProizvodstvo, содержат данные о детали.

Результаты работы программы




Комментариев нет:

Отправить комментарий