Результаты работы программы
Результаты работы программы
Количество объектов Vstring: 0
Количество объектов Vstring: 1
Количество объектов Vstring: 2
Значение объекта v: 12345
Количество объектов Vstring: 2
Количество объектов Vstring: 3
Количество объектов Vstring: 2
Количество объектов Vstring: 3
Количество объектов Vstring: 2
Количество объектов Vstring: 3
Шаблоны функций
Например, максимум двух значений типа Т можно вычислять с помощью функции:
template <class T> // Ключевое слово и параметр
const T& Max(const T& a, const T& b)
{
return a>b? a:b;
}
void main()
{
int i = 1, j = 2;
float r = 1.1, s = 1.2;
int k = Max(i, j);
float t = Max(r, s);
}
Пример. Параметризованная функция бинарного поиска в отсортированном массиве.
#include <iostream.h>
#include <conio.h>
template <class Type>
int binsearch(Type* x, int count, Type key)
{
int low, high, mid; // Левый, правый и средний элементы
low = 0; high = count - 1;
while (low <= high)
{
mid = (low+high)/2; // Вычисление середины массива
if(key < x[mid]) high = mid - 1; // Если нужный элемент
// находится слева от середины
else if(key > x[mid]) low = mid + 1; // Если справа
|
|
else return mid; // Нашли
}
return -1; // Не нашли
}
void main()
{
clrscr(); // Очистка экрана
int nums[] = {1, 2, 3, 5, 7, 11, 13, 17}; // Массив, в котором ищем
cout << "5 находится на " << binsearch(nums, 8, 5)
cout << " месте в массиве.";
getch(); // Ожидание нажатия клавиши
}
5 находится на 3 месте в массиве.
Пример. Приведём параметризованную подпрограмму (функцию) сортировки методом пузырьков и применим ее для упорядочения массива, состоящего из целых чисел, записанных в неупакованном BCD – формате. Ниже следует подпрограмма (функция) сортировки и программа тестирования.
#include <iostream.h>
#include <conio.h>
template <class Type>
void bubble (Type *x, int n) // Сортировка методом пузырьков
{
int i, j;
Type t;
for(i = 1; i < n; i++)
for(j = n-1; j >= i; --j)
{
if(x[j-1] > x[j])
{
t = x[j-1]; x[j-1] = x[j]; x[j] = t;
}
}
}
void main()
{
clrscr(); // Очистка экрана
int i;
int nums[] = {10, 12, 11, 3, 5, 12, 10}; // Исходный массив
cout << "Исходный массив: ";
for(i = 0; i < 7; i++) cout << nums[i] << " ";
cout << '\n';
bubble (nums, 7); // Сортировка
cout << "Отсортированный массив: ";
for(i = 0; i < 7; i++) cout << nums[i] << " ";
getch(); // Ожидание нажатия клавиши
}
Исходный массив: 10 12 11 3 5 12 10
Отсортированный массив: 3 5 10 10 11 12 12
пример программы для сортировки чисел, представленных в формате BCD. Для этого к параметризированной подпрограмме сортировки добавим определение класса чисел BCD и необходимые операции присваивания и сравнения. Получим следующий текст:
#include <iostream.h>
#include <string.h>
#include <conio.h>
template <class Type>
void bubble (Type *x, int n) // Сортировка методом пузырьков
{
int i, j;
Type t;
for(i = 1; i < n; i++)
for(j = n-1; j >= i; --j)
{
if(x[j-1] > x[j])
{
t = x[j-1]; x[j-1] = x[j]; x[j] = t;
}
}
}
|
|
// Класс BCD чисел
class Bcd
{
// Недоступные элементы класса
static int n; // Максимальный размер BCD чисел
char *a; // Массив под BCD число
public:
// Общедоступные элементы класса
// Перегрузка оператора =
void operator = (char *b);
// Перегрузка оператора >
int operator > (Bcd x);
void show(); // Вывод BCD числа на экран
};
// Перегрузка оператора =
void Bcd::operator = (char *b)
{
int i;
a = new char[n]; // Выделение памяти под BCD число
for(i = 0; i < n; i++)
a[i] = '0'; // Инициализация его нулями
i = strlen(b); // Определение длины присваиваемого числа
int k = i - 1; // Запоминаем её
// Копирование знака числа
if(b[0] == '+' || b[0] == '-')
{
i--;
a[n - 1] = b[0];
}
else a[n - 1] = '+';
// Копирование самого числа
for(int j = 0; j < i; j++) a[j] = b[k - j];
}
// Перегрузка оператора >
int Bcd::operator > (Bcd x)
{
int i = 0;
// Если первое число положительное,
// а второе - отрицательное, то первое больше
if(this->a[n-1] == '+' && x.a[n-1] == '-') return 1;
// Если первое число отрицательное,
// а второе - положительное, то первое меньше
if(this->a[n-1] == '-' && x.a[n-1] == '+') return 0;
// Сравнение по отдельным цифрам
for(i = 1; i < n; i++)
{
if(this->a[n - 1 - i] > x.a[n - 1 - i])
{
if(x.a[n - 1] == '+') return 1;
else return 0;
}
else if(this->a[n - 1 - i] < x.a[n - 1 - i])
{
if(x.a[n - 1] == '+') return 0;
else return 1;
}
}
return 0;
}
// Вывод BCD числа на экран
void Bcd::show()
{
// Создание вспомогательной строки
char *str;
str = new char[n+1]; // Выделение под неё памяти
str[0] = a[n-1]; // Копирование знака
str[n] = '\0'; // Постановка конечного нуля
// Копирование цифр
int i;
for(i=n-2; i>=0; i--) str[n-i-1] = a[i];
// Вывод строки на экран
cout << str;
delete str; // Освобождение памяти
}
Теперь вызываем параметризованную функцию для сортировки массива Bcd:
int Bcd::n = 15; // Максимальная длина BCD числа
void main()
{
clrscr(); // Очистка экрана
Bcd x[10]; // Создание массива bcd чисел
// Инициализация BCD чисел
x[0] = "1234"; x[1] = "924"; x[2] = "-92"; x[3] = "0";
x[4] = "-1"; x[5] = "10"; x[6] = "12"; x[7] = "1";
x[8] = "-2"; x[9] = "12345";
// Вывод неотсортированного массива
cout << "Неотсортированные BCD числа:\n";
for(int i = 0; i < 10; i++)
{
x[i].show();
cout << '\n';
}
bubble(x, 10); // Сортировка методом пузырьков
// Вывод отсортированного массива
cout << "Отсортированные BCD числа:\n";
for(i = 0; i < 10; i++)
{
x[i].show();
cout << '\n';
}
getch(); // Ожидание нажатия клавиши
}