С++
Шаблони функцій.
Завдання 1
Написати шаблони функцій для роботи з одновимірним масивом:
a. введення елементів масиву,
b. виводу елементів масиву на екран,
c. пошуку першого входження елемента у масив(індексу входження, повертати -1, якщо не знайдено)
d. пошуку останнього входження елемента у масив,
e. перемішування елементів масиву випадковим чином(декілька разів поміняти місцями елементи з випадковими індексами)
f. заповнення масиву однаковим заданим значенням
g. впорядкування за зростанням
h. впорядкування за спаданням
Для пошуку першого входження елемента у масиві символів(char[]) написати звичайну функцію (яка перекриє шаблон) таким чином,
щоб ігнорувалася різниця між великими та малими латинськими літерами рядків
Протестувати роботу шаблонних функцій для масивів
цілого,
дробового,
символьного типу(char) та
рядкового(string) типу.
Завдання 2
Написати шаблони функцій для роботи з двовимірним масивом(або тривимірним):
a. введення двовимірного(або тривимірного) масиву
b. виведення масиву на екран
c. знаходження найбільшого елемента масиву
template
T maxInMatrix(T m[][COLS], int rows, int cols)
{
T m = arr[0][0];
…….
return m;
}
або
template
auto maxInMatrix(T m, int rows, int cols)
{
auto m = arr[0][0];
…….
return m;
}
d. перевірка чи заданий рядок матриці впорядкований за зростанням (шаблон функції повертає логічне значення), функція отримує додатково індекс рядка
якщо індекс не коректний повертати хибу
e. перевірка чи всі (кожен) рядки матриці впорядковані за зростанням (шаблон функції повертає логічне значення).
Перевірити роботу шаблонів функцій для матриць числового та рядкового(string) типів.
Answers & Comments
Ответ:
#include <iostream>
#include <algorithm>
#include <random>
// Шаблон функции для ввода элементов массива
template <typename T, size_t N>
void inputArray(T (&arr)[N])
{
for (size_t i = 0; i < N; ++i)
{
std::cout << "Введите элемент " << i << ": ";
std::cin >> arr[i];
}
}
// Шаблон функции для вывода элементов массива на экран
template <typename T, size_t N>
void displayArray(const T (&arr)[N])
{
for (size_t i = 0; i < N; ++i)
{
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
// Шаблон функции для поиска первого вхождения элемента в массив
template <typename T, size_t N>
int findFirst(const T (&arr)[N], const T &element)
{
for (size_t i = 0; i < N; ++i)
{
if (arr[i] == element)
{
return static_cast<int>(i);
}
}
return -1;
}
// Шаблон функции для поиска последнего вхождения элемента в массив
template <typename T, size_t N>
int findLast(const T (&arr)[N], const T &element)
{
for (int i = N - 1; i >= 0; --i)
{
if (arr[i] == element)
{
return i;
}
}
return -1;
}
// Шаблон функции для перемешивания элементов массива случайным образом
template <typename T, size_t N>
void shuffleArray(T (&arr)[N])
{
std::random_device rd;
std::mt19937 gen(rd());
std::shuffle(std::begin(arr), std::end(arr), gen);
}
// Шаблон функции для заполнения массива одинаковым заданным значением
template <typename T, size_t N>
void fillArray(T (&arr)[N], const T &value)
{
std::fill(std::begin(arr), std::end(arr), value);
}
// Шаблон функции для упорядочивания массива по возрастанию
template <typename T, size_t N>
void sortAscending(T (&arr)[N])
{
std::sort(std::begin(arr), std::end(arr));
}
// Шаблон функции для упорядочивания массива по убыванию
template <typename T, size_t N>
void sortDescending(T (&arr)[N])
{
std::sort(std::begin(arr), std::end(arr), std::greater<T>());
}
// Функция для поиска первого вхождения символа в массиве символов (игнорирует регистр)
int findFirst(const char arr[], char element)
{
for (int i = 0; arr[i] != '\0'; ++i)
{
if (tolower(arr[i]) == tolower(element))
{
return i;
}
}
return -1;
}
int main()
{
// Примеры использования шаблонных функций для одномерного массива
int intArray[5];
inputArray(intArray);
std::cout << "Массив intArray: ";
displayArray(intArray);
int searchInt = 3;
int index = findFirst(intArray, searchInt);
if (index != -1)
{
std::cout << "Первое вхождение " << searchInt << " в intArray: " << index << std::endl;
}
else
{
std::cout << "Элемент " << searchInt << " не найден в intArray." << std::endl;
}
double doubleArray[5];
inputArray(doubleArray);
std::cout << "Массив doubleArray: ";
displayArray(doubleArray);
double searchDouble = 2.5;
index = findFirst(doubleArray, searchDouble);
if (index != -1)
{
std::cout << "Первое вхождение " << searchDouble << " в doubleArray: " << index << std::endl;
}
else
{
std::cout << "Элемент " << searchDouble << " не найден в doubleArray." << std::endl;
}
char charArray[5];
inputArray(charArray);
std::cout << "Массив charArray: ";
displayArray(charArray);
char searchChar = 'A';
index = findFirst(charArray, searchChar);
if (index != -1)
{
std::cout << "Первое вхождение " << searchChar << " в charArray: " << index << std::endl;
}
else
{
std::cout << "Элемент " << searchChar << " не найден в charArray." << std::endl;
}
std::string stringArray[5];
inputArray(stringArray);
std::cout << "Массив stringArray: ";
displayArray(stringArray);
std::string searchString = "hello";
index = findFirst(stringArray, searchString);
if (index != -1)
{
std::cout << "Первое вхождение \"" << searchString << "\" в stringArray: " << index << std::endl;
}
else
{
std::cout << "Элемент \"" << searchString << "\" не найден в stringArray." << std::endl;
}
return 0;
}