Advertisement
Guest User

Шаблоны

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