Xom9ik

Lab_6/16 var (IIl semester)

Oct 21st, 2017
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.03 KB | None | 0 0
  1. //Lab_6.cpp
  2. #include "stdafx.h"
  3. #include <iostream>
  4. #include <locale>
  5. #include <string>
  6. using namespace std;
  7. class TRow
  8. {
  9. protected:
  10.     int FId;
  11.     string FName;
  12.     string FSurname;
  13. public:
  14.     TRow(); // Конструктор по умолчанию
  15.     TRow(int Id, string Name, string Surname);
  16.     virtual ~TRow(); // виртуальный деструктор
  17.     virtual void Print() = 0; // виртуальный метод вывода сведений о Строке      
  18.     virtual void Input() = 0;// виртуальный метод ввода сведений о Строке
  19.     int GetID() { return FId; }
  20.     string GetName() { return FName; }
  21.     string GetSurname() { return FSurname; }
  22.     void SetID(int ID) { FId = ID; }
  23.     void SetName(string name) { FName = name; }
  24.     void SetSurname(string surname) { FSurname = surname; }
  25. };
  26. class TText :public TRow
  27. {
  28. private:
  29.     string FMiddleName;
  30. public:
  31.     TText(int Id, string Name, string Surname, string middle); // Конструктор с парамметрами
  32.     TText(); // Конструктор по умолчанию
  33.     TText(TText &A); // Конструктор копирования
  34.     ~TText();// Деструктор по умолчанию
  35.     TText& operator =(const TText &A); // Перегруженная операция =
  36.     string GetMiddleName() { return FMiddleName; }
  37.     void SetMiddleName(string middle) { FMiddleName = middle; }
  38.     void Input(); // перегруженный виртуальный метод
  39.     void Print(); // перегруженный виртуальный метод
  40. };
  41. class TInt :public TRow
  42. {
  43. private:
  44.     int FYear;
  45. public:
  46.     TInt();// Конструктор по умолчанию
  47.     TInt(int Id, string Name, string Surname, int Year);// Конструктор инициализатор
  48.     TInt(TInt &A);// Конструктор копирования
  49.     ~TInt();// Деструктор
  50.     TInt& operator =(const TInt &A);// Перегруженная операция =
  51.     int GetYear() { return FYear; }
  52.     void SetYear(int Year) { FYear = Year; }
  53.     void Input();// перегруженный виртуальный метод
  54.     void Print();// перегруженный виртуальный метод
  55. };
  56. TRow::TRow()
  57. {// Конструктор по умолчанию базового класса Строка
  58.     FId = 0;
  59.     FName = "";
  60.     FSurname = "";
  61.     //cout << "**** Конструктор по умолчанию базового класса Строка" << endl;
  62. }
  63. TRow::TRow(int Id, string Name, string Surname)
  64. {// Конструктор инициализатор базового класса Строка
  65.     FId = Id;
  66.     FName = Name;
  67.     FSurname = Surname;
  68.     //cout << "**** Конструктор инициализатор базового класса Строка" << endl;
  69. }
  70. TRow::~TRow()
  71. {//Деструктор базового класса Строка
  72.     //cout << "**** Деструктор базового класса Строка" << endl;
  73. }
  74. TText::TText(int Id, string Name, string Surname, string middle) :TRow(Id, Name, Surname)
  75. {// Конструктор инициализатор класса Текст
  76.     FMiddleName = middle;
  77.     //cout << "**** Конструктор инициализатор класса Текст" << endl;
  78. }
  79. TText::TText()
  80. {//Конструктор по умолчанию класса Текст
  81.     FId = 0;
  82.     FName = "";
  83.     FSurname = "";
  84.     FMiddleName = "";
  85.     //cout << "**** Конструктор по умолчанию класса Текст" << endl;
  86. }
  87. TInt::TInt(int Id, string Name, string Surname, int Year) :TRow(Id, Name, Surname)
  88. {//Конструктор инициализатор класса Число
  89.     FYear = Year;
  90.     //cout << "**** Конструктор инициализатор класса Число" << endl;
  91. }
  92. TInt::TInt()
  93. {//Конструктор по умолчанию класса Число
  94.     FId = 0;
  95.     FName = "";
  96.     FSurname = "";
  97.     FYear = 0;
  98.     //cout << "**** Конструктор по умолчанию класса Число" << endl;
  99. }
  100. TText::TText(TText &A)
  101. {//Конструктор копирования класса Текст
  102.     FId = A.FId;
  103.     FName = A.FName;
  104.     FSurname = A.FSurname;
  105.     FMiddleName = A.FMiddleName;
  106.     //cout << "**** Конструктор копирования класса Текст" << endl;
  107. }
  108. TInt& TInt::operator =(const TInt &A)
  109. {//Перегруженная операция = класса Число
  110.     FId = A.FId;
  111.     FName = A.FName;
  112.     FSurname = A.FSurname;
  113.     FYear = A.FYear;
  114.     //cout << "**** Перегруженная операция = класса Число" << endl;
  115.     return *this;
  116. }
  117. TText& TText::operator =(const TText &A)
  118. {//Перегруженная операция = класса Текст
  119.     FId = A.FId;
  120.     FName = A.FName;
  121.     FSurname = A.FSurname;
  122.     FMiddleName = A.FMiddleName;
  123.     //cout << "**** Перегруженная операция = класса Текст" << endl;
  124.     return *this;
  125. }
  126. TInt::TInt(TInt &A)
  127. {//Конструктор копирования класса Число
  128.     FId = A.FId;
  129.     FName = A.FName;
  130.     FSurname = A.FSurname;
  131.     FYear = A.FYear;
  132.     //cout << "****Конструктор копирования класса Число" << endl;
  133. }
  134. void TText::Input()
  135. {//Ввод текстовой строки:
  136.     cout << "Ввод текстовой строки:" << endl;
  137.     cout << "Введите ID текстовой строки: ";
  138.     cin >> FId;
  139.     cout << "Введите Имя: ";
  140.     cin >> FName;
  141.     cout << "Введите Фамилию: ";
  142.     cin >> FSurname;
  143.     cout << "Введите Отчество: ";
  144.     cin >> FMiddleName;
  145.     //cout << "**** Перегруженный виртуальный метод Input класса Текст" << endl;
  146. }
  147. void TInt::Input()
  148. {//Ввод числовой строки:
  149.     cout << "Ввод числовой строки:" << endl;
  150.     cout << "Введите ID числовой строки: ";
  151.     cin >> FId;
  152.     cout << "Введите Имя: ";
  153.     cin >> FName;
  154.     cout << "Введите Фамилию: ";
  155.     cin >> FSurname;
  156.     cout << "Введите Год Рождения: ";
  157.     cin >> FYear;
  158.     //cout << "**** Перегруженный виртуальный метод Input класса Число" << endl;
  159. }
  160. void TText::Print()
  161. {// Перегруженный виртуальный метод класса Текст
  162.     cout << "\t" << FId << "\t" << FName << "\t" << FSurname << "\t" << FMiddleName << endl;
  163.     //cout << "**** Перегруженный виртуальный метод Print класса Текст" << endl;
  164. }
  165. void TInt::Print()
  166. {// Перегруженный виртуальный метод Print класса Число
  167.     cout << "\t" << FId << "\t" << FName << "\t" << FSurname << "\t" << FYear << endl;
  168.     //cout << "**** Перегруженный виртуальный метод Print класса Число" << endl;
  169. }
  170. TText::~TText()
  171. {//Перегруженный виртуальный Деструктор класса Текст
  172.     //cout << "**** Перегруженный виртуальный Деструктор класса Текст" << endl;
  173. }
  174. TInt::~TInt()
  175. {//Перегруженный виртуальный Деструктор класса Число
  176.     //cout << "**** Перегруженный виртуальный Деструктор класса Число" << endl;
  177. }
  178. //-----------------------------------------------
  179. class TTable
  180. {
  181. private:
  182.     int FCountTexts; // Количество текстовых строк  
  183.     int FCountInts; //Количество числовых строк
  184.     TText *FTexts; // Массив текстовых строк
  185.     TInt *FInts;// Массив числовых строк
  186. public:
  187.     TTable();// Конструктор по умолчанию
  188.     ~TTable();// Деструктор
  189.     void Print();
  190.     void AddText(TText &A);// Добавление текстовой строки
  191.     void AddInt(TInt &A);//Добавление числовой строки
  192.     TText* GetText(int c) { return &FTexts[c]; }
  193.     TInt* GetInt(int c) { return &FInts[c]; }
  194.     int GetCountTexts() { return FCountTexts; }
  195.     int GetCountInts() { return FCountInts; }
  196. };
  197. TTable::TTable()
  198. {//Конструктор по умолчанию класса Таблица
  199.     FCountTexts = 0;
  200.     FCountInts = 0;
  201.     FTexts = NULL;
  202.     FInts = NULL;
  203.     //cout << "**** Конструктор по умолчанию класса Таблица" << endl;
  204. }
  205. void TTable::AddText(TText &A)
  206. {//Метод добавления Текста класса Строка
  207.     int i;
  208.     TText t;
  209.     TText *tmp = new TText[FCountTexts + 1];
  210.     for (i = 0; i<FCountTexts; i++)
  211.         tmp[i] = FTexts[i];
  212.     tmp[FCountTexts] = A;
  213.     delete[] FTexts;
  214.     FTexts = tmp;
  215.     FCountTexts++;
  216.     //cout << "**** Метод добавления текстовой строки класса Строка" << endl;
  217. }
  218. void TTable::AddInt(TInt &A)
  219. {//Метод добавления Числа класса Строка
  220.     int i;
  221.     TInt *tmp = new TInt[FCountInts + 1];
  222.     for (i = 0; i<FCountInts; i++)
  223.         tmp[i] = FInts[i];
  224.     tmp[FCountInts] = A;
  225.     delete[] FInts;
  226.     FInts = tmp;
  227.     FCountInts++;
  228.     //cout << "**** Метод добавления числовой строки класса Строка" << endl;
  229. }
  230. TTable::~TTable()
  231. {// Деструктор класса Таблица
  232.     if (FTexts != NULL)
  233.         delete[] FTexts;
  234.     if (FInts != NULL)
  235.         delete[] FInts;
  236.     //cout << "**** Деструктор класса Таблица" << endl;
  237. }
  238. void TTable::Print()
  239. {// Метод вывод строки класса Таблица
  240.     int i;
  241.     cout << "Текстовые поля:" << endl;
  242.     for (i = 0; i<FCountTexts; i++)
  243.         FTexts[i].Print();
  244.     cout << "Числовые поля:" << endl;
  245.     for (i = 0; i<FCountInts; i++)
  246.         FInts[i].Print();
  247.     //cout << "**** Метод вывод строки класса Таблица" << endl;
  248. }
  249. //-----------------------------------------------------
  250. class TProcessor
  251. {// Класс обработчик
  252. private:
  253.     TTable* t; // Таблица
  254. public:
  255.     TProcessor();// Конструктор по умолчанию
  256.     ~TProcessor();//Деструктор
  257.     void Sort(int sortColumn); // Вывод строк в порядке убывания
  258.     void AddText(TText &A) { t->AddText(A); } // Добавить текстовую строку
  259.     void AddInt(TInt &A) { t->AddInt(A); }// Добавить числовой строки
  260.     void Print() { t->Print(); }// Вывод таблицы
  261. };
  262. TProcessor::TProcessor()
  263. {// Конструктор по умолчанию класса Обработчик
  264.     t = new TTable();
  265.     //cout << "**** Конструктор по умолчанию класса Обработчик" << endl;
  266. }
  267. TProcessor::~TProcessor()
  268. {// Деструктор класса Обработчик
  269.     delete t;
  270.     //cout << "**** Деструктор класса Обработчик" << endl;
  271. };
  272. void TProcessor::Sort(int sortColumn)
  273. {//Вывод текстовыех полей отсортированных в порядке возрастания
  274.     cout << "Отсортированные по убыванию текстовые поля:" << endl;
  275.     cout << "\t" << "ID" << "\t" << "Name" << "\t" << "Surname" << "\t" << "Middle" << endl;
  276.     for (int i = 0; i < t->GetCountTexts(); i++)
  277.     {
  278.         for (int j = i + 1; j < t->GetCountTexts(); j++)
  279.         {
  280.             string istr = "";
  281.             string jstr = "";
  282.             if (sortColumn == 1)
  283.             {
  284.                 istr = t->GetText(i)->GetID();
  285.                 jstr = t->GetText(j)->GetID();
  286.             }
  287.             else if (sortColumn == 2)
  288.             {
  289.                 istr = t->GetText(i)->GetName();
  290.                 jstr = t->GetText(j)->GetName();
  291.             }
  292.             else if (sortColumn == 3)
  293.             {
  294.                 istr = t->GetText(i)->GetSurname();
  295.                 jstr = t->GetText(j)->GetSurname();
  296.             }
  297.             else if (sortColumn == 4)
  298.             {
  299.                 istr = t->GetText(i)->GetMiddleName();
  300.                 jstr = t->GetText(j)->GetMiddleName();
  301.             }
  302.             if (strcmp((istr.c_str()), (jstr.c_str())) > 0)
  303.             {
  304.                 int itemp = t->GetText(i)->GetID(); //temp=i
  305.                 t->GetText(i)->SetID(t->GetText(j)->GetID()); //i=j
  306.                 t->GetText(j)->SetID(itemp); //i=j
  307.  
  308.                 string stemp = t->GetText(i)->GetName(); //temp=i
  309.                 t->GetText(i)->SetName(t->GetText(j)->GetName()); //i=j
  310.                 t->GetText(j)->SetName(stemp); //i=j
  311.  
  312.                 stemp = t->GetText(i)->GetSurname(); //temp=i
  313.                 t->GetText(i)->SetSurname(t->GetText(j)->GetSurname()); //i=j
  314.                 t->GetText(j)->SetSurname(stemp); //i=j
  315.  
  316.                 stemp = t->GetText(i)->GetMiddleName(); //temp=i
  317.                 t->GetText(i)->SetMiddleName(t->GetText(j)->GetMiddleName()); //i=j
  318.                 t->GetText(j)->SetMiddleName(stemp); //i=j             
  319.             }
  320.         }
  321.     }
  322.     for (int i = 0; i < t->GetCountTexts(); i++)
  323.         t->GetText(i)->Print();
  324.     //---------------------------
  325.     cout << "Отсортированные по возрастанию числовые поля:" << endl;
  326.     cout << "\t" << "ID" << "\t" << "Name" << "\t" << "Surname" << "\t" << "Year" << endl;
  327.     for (int i = 0; i < t->GetCountInts(); i++)
  328.     {
  329.         for (int j = i + 1; j < t->GetCountInts(); j++)
  330.         {
  331.             string istr = "";
  332.             string jstr = "";
  333.             if (sortColumn == 1)
  334.             {
  335.                 istr = t->GetInt(i)->GetID();
  336.                 jstr = t->GetInt(j)->GetID();
  337.             }
  338.             else if (sortColumn == 2)
  339.             {
  340.                 istr = t->GetInt(i)->GetName();
  341.                 jstr = t->GetInt(j)->GetName();
  342.             }
  343.             else if (sortColumn == 3)
  344.             {
  345.                 istr = t->GetInt(i)->GetSurname();
  346.                 jstr = t->GetInt(j)->GetSurname();
  347.             }
  348.             else if (sortColumn == 4)
  349.             {
  350.                 istr = t->GetInt(i)->GetYear();
  351.                 jstr = t->GetInt(j)->GetYear();
  352.             }
  353.             if (strcmp((istr.c_str()), (jstr.c_str())) > 0)
  354.             {
  355.                 int itemp = t->GetInt(i)->GetID(); //temp=i
  356.                 t->GetInt(i)->SetID(t->GetInt(j)->GetID()); //i=j
  357.                 t->GetInt(j)->SetID(itemp); //i=j
  358.  
  359.                 string stemp = t->GetInt(i)->GetName(); //temp=i
  360.                 t->GetInt(i)->SetName(t->GetInt(j)->GetName()); //i=j
  361.                 t->GetInt(j)->SetName(stemp); //i=j
  362.  
  363.                 stemp = t->GetInt(i)->GetSurname(); //temp=i
  364.                 t->GetInt(i)->SetSurname(t->GetInt(j)->GetSurname()); //i=j
  365.                 t->GetInt(j)->SetSurname(stemp); //i=j
  366.  
  367.                 itemp = t->GetInt(i)->GetYear(); //temp=i
  368.                 t->GetInt(i)->SetYear(t->GetInt(j)->GetYear()); //i=j
  369.                 t->GetInt(j)->SetYear(itemp); //i=j            
  370.             }
  371.         }
  372.     }
  373.     for (int i = 0; i < t->GetCountInts(); i++)
  374.         t->GetInt(i)->Print();
  375. }
  376. int main()
  377. {
  378.     setlocale(LC_ALL, "Rus");
  379.     int CountTexts, CountInts;
  380.     int i;
  381.     cout << "Введите количество текстовых строк: ";
  382.     cin >> CountTexts;
  383.     cout << "Введите количество числовых строк: ";
  384.     cin >> CountInts;
  385.     TText *A = new TText[CountTexts];
  386.     for (i = 0; i<CountTexts; i++)
  387.         A[i].Input();
  388.     TInt *B = new TInt[CountInts];
  389.     for (i = 0; i<CountInts; i++)
  390.         B[i].Input();
  391.     // Работа с классом Обработчик
  392.     cout << "\n Работа с классом Обработчик" << endl;
  393.     TProcessor *p = new TProcessor;
  394.     for (i = 0; i<CountTexts; i++)
  395.         p->AddText(A[i]);
  396.     for (i = 0; i<CountInts; i++)
  397.         p->AddInt(B[i]);
  398.     cout << " Вся таблица: \n";
  399.     p->Print();
  400.     int sortColumn;
  401.     cout << "Сортировка по столбцам" << endl;
  402.     cout << "1-ID" << endl;
  403.     cout << "2-Name" << endl;
  404.     cout << "3-Surname" << endl;
  405.     cout << "4-Middle(Text) || Year(Int)" << endl;
  406.     cout << "Enter(1-4): ";
  407.     cin >> sortColumn;
  408.     if (sortColumn > 0 && sortColumn < 5)
  409.         p->Sort(sortColumn);
  410.     else
  411.         cout << "Неверный выбор" << endl;
  412.     delete[] A;
  413.     delete[] B;
  414.     delete p;
  415.     system("pause");
  416.     // Работа с массивом указателей на тип базового класса
  417.     cout << "\n Работа с массивом указателей на тип базового класса\n" << endl;
  418.     TRow **array_table;
  419.     array_table = new TRow*[CountTexts + CountInts];
  420.     for (i = 0; i<CountTexts; i++)
  421.         array_table[i] = new TText;
  422.     for (i = CountTexts; i<CountTexts + CountInts; i++)
  423.         array_table[i] = new TInt;
  424.     cout << "\n Ввод строк:\n" << endl;
  425.     for (i = 0; i<CountTexts + CountInts; i++)
  426.         array_table[i]->Input();
  427.     cout << "\n Таблица:\n" << endl;
  428.     for (i = 0; i<CountTexts + CountInts; i++)
  429.         array_table[i]->Print();
  430.     for (i = 0; i<CountTexts + CountInts; i++)
  431.         delete array_table[i];
  432.     delete[] array_table;
  433.     system("pause");
  434.     return 0;
  435. }
Advertisement
Add Comment
Please, Sign In to add comment