Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string.h>
- // Программа содержит шаблонную функцию copy, которая предназначена для копирования
- // и сортировки полученной копии
- // Шаблонная функция сравнения переменных
- template <typename T>
- int cmpval(T a, T b) {
- return a < b;
- }
- // Функция переводит латинские символы в нижний регистр
- // Возвращает беззнаковый char для удобства сравнения (не будет минусов)
- unsigned char casefold(char c) {
- // Находим расстояние между эквивалентными символами разных регистров
- int distance = 'a' - 'A';
- // Если символ находится в диапазоне верхнего регистра - прибавляем к нему это расстояние
- if (c >= 'A' && c <= 'Z')
- return c + distance;
- else
- return c;
- }
- // Специализация шаблонной функции сравнения для строк
- // Возвращает 1 если строка а находится раньше по алфавиту
- // Если b находится раньше или строки равны - возвращает b
- template <>
- int cmpval<char*>(char* a, char* b) {
- // Находим длины двух строк
- int len1 = strlen(a);
- int len2 = strlen(b);
- int minLen;
- // Находим минимальную длину из двух
- if (len1 < len2)
- minLen = len1;
- else
- minLen = len2;
- // Проходимся циклом по двум строкам, от 0 до минимальной длины
- for (int i = 0; i < minLen; ++i) {
- // Если символ строки а находится раньше в таблице ASCII
- // возвращаем 1
- if (a[i] < b[i])
- return 1;
- // Если позже - 0
- else if (a[i] > b[i])
- return 0;
- // Если символы равны - цикл продолжается
- }
- // Если выполнение доходит до этой точки - части строк до минимальной длины (или строки целиком)
- // полностью эквивалентны и возвращаемое значение не играет роли и может быть любым
- return 0;
- }
- // Шаблонная подпрограмма сортировки
- // В качестве функции сравнения двух переменных использует шаблонную функцию cmpval
- template <typename T>
- void ShellSort(T* A, int N) {
- int i, j, k;
- T t;
- for(k = N / 2; k > 0; k /= 2) {
- for(i = k; i < N; i++) {
- t = A[i];
- for(j = i; j >= k; j -= k) {
- if(cmpval(t, A[j - k]))
- A[j] = A[j - k];
- else
- break;
- }
- A[j] = t;
- }
- }
- }
- // Шаблонная функция копирования переменной
- // В общем случае возвращает то же самое значение
- template <typename T>
- T copy_val(T in) {
- return in;
- }
- // Специализация функции копирования для строк
- // Возвращает копию строки в динамической памяти
- template <>
- char* copy_val(char* in) {
- int size = strlen(in);
- char* ret = new char[size + 1];
- strncpy(ret, in, size);
- return ret;
- }
- // Шаблонная подпрограмма копирования массива
- // Принимает массив-копию, массив-источник и размер массивов
- template <typename T>
- void copy(T* out, T* in, int size) {
- // Проходимся циклом по двум массивам и вызываем функцию copy_val для копирования
- for (int i = 0; i < size; ++i)
- out[i] = copy_val(in[i]);
- // Сортируем скопированный массив сортировкой Шелла
- ShellSort(out, size);
- }
- // Шаблонный метод вывода массива на экран
- template <typename T>
- void print(T* array, int size) {
- for (int i = 0; i < size; ++i)
- std::cout << array[i] << " ";
- std::cout << std::endl; // добавляем перевод строки после вывода всех значение
- }
- int main() {
- // Объявляем и инициализируем массивы
- float array1[4] = { 2.3f, 4.5f, 3.f, 6.f };
- long array2[6] = { 400, 200, 100, 150, 240, 30 };
- char* array3[4] = { "bbac", "xxxzxx", "abcde", "ooorrr" };
- // Объявляем массивы копий
- float copy1[4];
- long copy2[6];
- char* copy3[4];
- // Вызываем подпрограмму копирования массива
- copy(copy1, array1, 4);
- copy(copy2, array2, 6);
- copy(copy3, array3, 4);
- // Выводим на экран скопированные и отсортированные значения
- print(copy1, 4);
- print(copy2, 6);
- print(copy3, 4);
- // Так как копии строк лежат в динамической памяти - память надо освободить
- for (int i = 0; i < 4; ++i)
- delete [] copy3[i];
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement