Advertisement
Guest User

Template6

a guest
Mar 25th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.63 KB | None | 0 0
  1. #include <iostream>
  2. #include <string.h>
  3. // Программа содержит шаблонную функцию copy, которая предназначена для копирования
  4. // и сортировки полученной копии
  5.  
  6. // Шаблонная функция сравнения переменных
  7. template <typename T>
  8. int cmpval(T a, T b) {
  9.     return a < b;
  10. }
  11.  
  12. // Функция переводит латинские символы в нижний регистр
  13. // Возвращает беззнаковый char для удобства сравнения (не будет минусов)
  14. unsigned char casefold(char c) {
  15.     // Находим расстояние между эквивалентными символами разных регистров
  16.     int distance = 'a' - 'A';
  17.  
  18.     // Если символ находится в диапазоне верхнего регистра - прибавляем к нему это расстояние
  19.     if (c >= 'A' && c <= 'Z')
  20.         return c + distance;
  21.     else
  22.         return c;
  23. }
  24.  
  25. // Специализация шаблонной функции сравнения для строк
  26. // Возвращает 1 если строка а находится раньше по алфавиту
  27. // Если b находится раньше или строки равны - возвращает b
  28. template <>
  29. int cmpval<char*>(char* a, char* b) {
  30.     // Находим длины двух строк
  31.     int len1 = strlen(a);
  32.     int len2 = strlen(b);
  33.     int minLen;
  34.    
  35.     // Находим минимальную длину из двух
  36.     if (len1 < len2)
  37.         minLen = len1;
  38.     else
  39.         minLen = len2;
  40.  
  41.     // Проходимся циклом по двум строкам, от 0 до минимальной длины
  42.     for (int i = 0; i < minLen; ++i) {
  43.         // Если символ строки а находится раньше в таблице ASCII
  44.         // возвращаем 1
  45.         if (a[i] < b[i])
  46.             return 1;
  47.         // Если позже - 0
  48.         else if (a[i] > b[i])
  49.             return 0;
  50.         // Если символы равны - цикл продолжается
  51.     }
  52.  
  53.     // Если выполнение доходит до этой точки - части строк до минимальной длины (или строки целиком)
  54.     // полностью эквивалентны и возвращаемое значение не играет роли и может быть любым
  55.     return 0;
  56. }
  57.  
  58. // Шаблонная подпрограмма сортировки
  59. // В качестве функции сравнения двух переменных использует шаблонную функцию cmpval
  60. template <typename T>
  61. void ShellSort(T* A, int N) {
  62.     int i, j, k;
  63.     T t;
  64.     for(k = N / 2; k > 0; k /= 2) {
  65.         for(i = k; i < N; i++) {
  66.             t = A[i];
  67.             for(j = i; j >= k; j -= k) {
  68.                 if(cmpval(t, A[j - k]))
  69.                     A[j] = A[j - k];
  70.                 else
  71.                     break;
  72.             }
  73.             A[j] = t;
  74.         }
  75.     }
  76. }
  77.  
  78. // Шаблонная функция копирования переменной
  79. // В общем случае возвращает то же самое значение
  80. template <typename T>
  81. T copy_val(T in) {
  82.     return in;
  83. }
  84.  
  85. // Специализация функции копирования для строк
  86. // Возвращает копию строки в динамической памяти
  87. template <>
  88. char* copy_val(char* in) {
  89.     int size = strlen(in);
  90.     char* ret = new char[size + 1];
  91.     strncpy(ret, in, size);
  92.     return ret;
  93. }
  94.  
  95.  
  96.  
  97. // Шаблонная подпрограмма копирования массива
  98. // Принимает массив-копию, массив-источник и размер массивов
  99. template <typename T>
  100. void copy(T* out, T* in, int size) {
  101.     // Проходимся циклом по двум массивам и вызываем функцию copy_val для копирования
  102.     for (int i = 0; i < size; ++i)
  103.         out[i] = copy_val(in[i]);
  104.    
  105.     // Сортируем скопированный массив сортировкой Шелла
  106.     ShellSort(out, size);
  107. }
  108.  
  109. // Шаблонный метод вывода массива на экран
  110. template <typename T>
  111. void print(T* array, int size) {
  112.     for (int i = 0; i < size; ++i)
  113.         std::cout << array[i] << " ";
  114.     std::cout << std::endl; // добавляем перевод строки после вывода всех значение
  115. }
  116.  
  117. int main() {
  118.     // Объявляем и инициализируем массивы
  119.     float array1[4] = { 2.3f, 4.5f, 3.f, 6.f };
  120.     long  array2[6] = { 400, 200, 100, 150, 240, 30 };
  121.     char* array3[4] = { "bbac", "xxxzxx", "abcde", "ooorrr" };
  122.    
  123.     // Объявляем массивы копий
  124.     float copy1[4];
  125.     long  copy2[6];
  126.     char* copy3[4];
  127.    
  128.     // Вызываем подпрограмму копирования массива
  129.     copy(copy1, array1, 4);
  130.     copy(copy2, array2, 6);
  131.     copy(copy3, array3, 4);
  132.  
  133.     // Выводим на экран скопированные и отсортированные значения
  134.     print(copy1, 4);
  135.     print(copy2, 6);
  136.     print(copy3, 4);
  137.  
  138.     // Так как копии строк лежат в динамической памяти - память надо освободить
  139.     for (int i = 0; i < 4; ++i)
  140.         delete [] copy3[i];
  141.    
  142.     return 0;
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement