Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string.h>
- // Программа содержит шаблонную функцию copy, которая предназначена для копирования
- // и сортировки полученной копии
- // Функция переводит строку с латинскими символами в нижний регистр
- // Возвращает копию строки, в которой все символы находятся в нижнем регистре
- char* toLower(const char* c) {
- int size = strlen(c);
- char* lower = new char[size + 1];
- strcpy(lower, c);
- int i;
- for (i = 0; i < size; ++i) {
- if (c[i] >= 'A' && c[i] <= 'Z')
- lower[i] = c[i] + ('a' - 'A'); // меняем регистр
- else
- lower[i] = c[i]; // оставляем как есть
- }
- lower[i] = '\0'; // добавляем нуль-терминатор
- return lower;
- }
- // Шаблонная подпрограмма сортировки
- // В качестве функции сравнения двух переменных использует шаблонную функцию 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(t < A[j - k])
- A[j] = A[j - k];
- else
- break;
- }
- A[j] = t;
- }
- }
- }
- // Шаблонная подпрограмма сортировки
- // В качестве функции сравнения двух переменных использует шаблонную функцию cmpval
- template <>
- void ShellSort<char*>(char** A, int N) {
- // Создаем копию массива строк, где все символы находятся в нижнем регистре
- // При сортировке будем ориентироваться на него, чтобы не пришлось применять
- // регистронезависимое сравнение каждый раз
- // Изменять исходный массив мы не можем - теряется принцип неизменности входных данных
- char** tmp = new char*[N];
- for (int i = 0; i < N; ++i)
- tmp[i] = toLower(A[i]);
- // сортировка Шелла
- int i, j, k;
- char* t;
- char* tmpT;
- for(k = N / 2; k > 0; k /= 2) {
- for(i = k; i < N; i++) {
- t = A[i];
- tmpT = tmp[i];
- for(j = i; j >= k; j -= k) {
- // вызываем библиотечную strcmp
- if(strcmp(tmpT, tmp[j - k]) < 0) {
- A[j] = A[j - k];
- tmp[j] = tmp[j - k];
- }
- else
- break;
- }
- A[j] = t;
- tmp[j] = tmpT;
- }
- }
- // удаляем копию массива
- for (int i = 0; i < N; ++i)
- delete [] tmp[i];
- delete [] tmp;
- }
- // Шаблонная подпрограмма копирования массива
- // Принимает массив-копию, массив-источник и размер массивов
- template <typename T>
- void copy(T* out, T* in, int size) {
- // Проходимся циклом по двум массивам и вызываем функцию copy_val для копирования
- for (int i = 0; i < size; ++i)
- out[i] = in[i];
- // Сортируем скопированный массив сортировкой Шелла
- ShellSort(out, size);
- }
- // Специализация шаблонной подпрограммы копирования массива для строк
- template <>
- void copy<char*>(char** out, char** in, int size) {
- // Проходимся циклом по двум массивам и вызываем функцию copy_val для копирования
- for (int i = 0; i < size; ++i) {
- out[i] = new char[strlen(in[i]) + 1];
- strcpy(out[i], 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