Xom9ik

Lab_8/8 var (IIl semester)

Nov 26th, 2017
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.61 KB | None | 0 0
  1. //Lab_8_8var
  2. #include "stdafx.h"
  3. #include <iostream>
  4. #include <ctime>
  5.  
  6. using namespace std;
  7. //8. Задан массив из k чисел. Преобразовать массив следующим образом:
  8. //все положительные элементы массива перенести в начало, а все остальные – в конец,
  9. //сохранив исходное взаимное расположение как среди отрицательных, так и среди положительных элементов.
  10. template <typename T> class Element {
  11. public:
  12.     T elem;
  13.     Element() {}
  14.     Element(T e)
  15.     {
  16.         elem = e;
  17.     }
  18.     template <typename T> T operator *(T &e)
  19.     {
  20.         return elem * e.elem;
  21.     }
  22.     template <typename T> T operator +=(T &e)
  23.     {
  24.         return elem += e.elem;
  25.     }
  26.     operator T()
  27.     {
  28.         return elem;
  29.     }
  30.     Element(const Element &base)
  31.     {
  32.         elem = base.elem;
  33.     }
  34. };
  35. //явное инстанцирование шаблона функции
  36. template int* TransformationDefaultType(int*, int);
  37. int* TransformationDefaultType(int* arrayA, int size)
  38. {
  39.     int *positive = new int[size];
  40.     int *negative = new int[size];
  41.     int countP = 0, countN = 0;
  42.     for (int i = 0; i < size; i++)
  43.         if (arrayA[i] > 0)
  44.         {
  45.             positive[countP] = arrayA[i];
  46.             countP++;
  47.         }
  48.         else
  49.         {
  50.             negative[countN] = arrayA[i];
  51.             countN++;
  52.         }
  53.     for (int i = 0; i < countP; i++)
  54.         arrayA[i] = positive[i];
  55.     for (int i = countP; i < size; i++)
  56.         arrayA[i] = negative[i - countP];
  57.     for (int i = 0; i < size; i++)
  58.     {
  59.         cout << arrayA[i] << " ";
  60.     }
  61.     cout << "\nint";
  62.     return arrayA;
  63. }
  64. template double* TransformationDefaultType(double*, int);
  65. double* TransformationDefaultType(double* arrayA, int size)
  66. {
  67.     double *positive = new double[size];
  68.     double *negative = new double[size];
  69.     int countP = 0, countN = 0;
  70.     for (int i = 0; i < size; i++)
  71.         if (arrayA[i] > 0)
  72.         {
  73.             positive[countP] = arrayA[i];
  74.             countP++;
  75.         }
  76.         else
  77.         {
  78.             negative[countN] = arrayA[i];
  79.             countN++;
  80.         }
  81.     for (int i = 0; i < countP; i++)
  82.         arrayA[i] = positive[i];
  83.     for (int i = countP; i < size; i++)
  84.         arrayA[i] = negative[i - countP];
  85.     for (int i = 0; i < size; i++)
  86.     {
  87.         cout << arrayA[i] << " ";
  88.     }
  89.     cout << "\ndouble";
  90.     return arrayA;
  91. }
  92. template float* TransformationDefaultType(float*, int);
  93. float* TransformationDefaultType(float* arrayA, int size)
  94. {
  95.     float *positive = new float[size];
  96.     float *negative = new float[size];
  97.     int countP = 0, countN = 0;
  98.     for (int i = 0; i < size; i++)
  99.         if (arrayA[i] > 0)
  100.         {
  101.             positive[countP] = arrayA[i];
  102.             countP++;
  103.         }
  104.         else
  105.         {
  106.             negative[countN] = arrayA[i];
  107.             countN++;
  108.         }
  109.     for (int i = 0; i < countP; i++)
  110.         arrayA[i] = positive[i];
  111.     for (int i = countP; i < size; i++)
  112.         arrayA[i] = negative[i - countP];
  113.     for (int i = 0; i < size; i++)
  114.     {
  115.         cout << arrayA[i] << " ";
  116.     }
  117.     cout << "\nfloat";
  118.     return arrayA;
  119. }
  120. template <typename T> T* TransformationDefaultType(T* arrayA, int size); //шаблон функции для стандартных типов данных (int, float, double)
  121. template <typename T> T* TransformationDefaultType(T* arrayA, int size)
  122. {
  123.     T *positive = new T[size];
  124.     T *negative = new T[size];
  125.     int countP = 0, countN = 0;
  126.     for (int i = 0; i < size; i++)
  127.         if (arrayA[i] > 0)
  128.         {
  129.             positive[countP] = arrayA[i];
  130.             countP++;
  131.         }
  132.         else
  133.         {
  134.             negative[countN] = arrayA[i];
  135.             countN++;
  136.         }
  137.     for (int i = 0; i < countP; i++)
  138.         arrayA[i] = positive[i];
  139.     for (int i = countP; i < size; i++)
  140.         arrayA[i] = negative[i - countP];
  141.     for (int i = 0; i < size; i++)
  142.     {
  143.         cout << arrayA[i] << " ";
  144.     }
  145.     return arrayA;
  146. }
  147.  
  148.  
  149.  
  150. template <class T> T* TransformationAbstractType(T arrayA[], int size); //шаблон функции для абстрактного типа данных
  151. template <class T> T* TransformationAbstractType(T arrayA[], int size)
  152. {
  153.     T *positive = new T[size];
  154.     T *negative = new T[size];
  155.     int countP = 0, countN = 0;
  156.     for (int i = 0; i < size; i++)
  157.         if (arrayA[i] > 0)
  158.         {
  159.             positive[countP] = arrayA[i];
  160.             countP++;
  161.         }
  162.         else
  163.         {
  164.             negative[countN] = arrayA[i];
  165.             countN++;
  166.         }
  167.     for (int i = 0; i < countP; i++)
  168.         arrayA[i] = positive[i];
  169.     for (int i = countP; i < size; i++)
  170.         arrayA[i] = negative[i - countP];
  171.     for (int i = 0; i < size; i++)
  172.     {
  173.         cout << arrayA[i] << " ";
  174.     }
  175.     return arrayA;
  176. }
  177.  
  178. int main()
  179. {
  180.     int size = 0;
  181.     srand(time(NULL));
  182.     cout << "Enter size arrays: ";
  183.     cin >> size;
  184.     cout << "template <typename T>" << endl;
  185.     float *arrayA = new float[size];
  186.     cout << "Array A: " << endl;
  187.     for (int i = 0; i < size; i++)
  188.     {
  189.         arrayA[i] = (rand() % (20 - -10 + 1) + -10)/2.13;
  190.         cout << arrayA[i] << " ";
  191.     }
  192.     cout << "\nTransformationDefaultType A:" << endl;
  193.     TransformationDefaultType(arrayA, size);
  194.     for (int i = 0; i < size; i++)
  195.     {
  196.         cout << arrayA[i] << " ";
  197.     }
  198.     cout << "\ntemplate <class T>" << endl;
  199.     Element<double> *AbstractArrayA = new Element<double>[size];
  200.     cout << "\nArray A(AbstractType) double: " << endl;
  201.     for (int i = 0; i < size; i++)
  202.     {
  203.         AbstractArrayA[i].elem = (rand() % (20 - -10 + 1) + -10) / 2.13;
  204.         cout << AbstractArrayA[i].elem << " ";
  205.     }
  206.     cout << "\nTransformationAbstractType A:" << endl;
  207.     TransformationAbstractType(AbstractArrayA, size);
  208.     Element<int> *AbstractArrayAInt = new Element<int>[size];
  209.     cout << "\nArray A(AbstractType) int: " << endl;
  210.     for (int i = 0; i < size; i++)
  211.     {
  212.         AbstractArrayAInt[i].elem = (rand() % (20 - -10 + 1) + -10);
  213.         cout << AbstractArrayAInt[i].elem << " ";
  214.     }
  215.     cout << "\nTransformationAbstractType A:" << endl;
  216.     TransformationAbstractType(AbstractArrayAInt, size);
  217.     system("pause");
  218. }
Advertisement
Add Comment
Please, Sign In to add comment