Кашина_СП_ЛБ5_3
.docxМинистерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования
«Владимирский государственный университет
имени Александра Григорьевича и Николая Григорьевича Столетовых» (ВлГУ)
Колледж инновационных технологий и предпринимательства
КАФЕДРА ФИЗИКИ И ПРИКЛАДНОЙ МАТЕМАТИКИ
Лабораторная работа № 5_3
по дисциплине «Системное программирование»
на тему: «Шаблоны функций в С++
Выполнил
студент группы ИПсп-123
Кашина Д. А.
Принял
Красильщикова В. В.
Владимир, 2026
Цель: расширить навыки работы с функциями и получить опыт создания шаблонов функций на С++.
Задание 1:
Код программы:
#include <iostream>
#include <string>
using namespace std;
// Шаблон функции для сортировки двумерного массива (пузырьковая сортировка)
template <typename T, size_t ROWS, size_t COLS>
void sort2DArray(T(&arr)[ROWS][COLS]) {
// Общее количество элементов
size_t totalElements = ROWS * COLS;
// Преобразуем двумерный массив в одномерный для сортировки
T* flat = &arr[0][0];
// Пузырьковая сортировка
for (size_t i = 0; i < totalElements - 1; i++) {
for (size_t j = 0; j < totalElements - i - 1; j++) {
// Если текущий элемент больше следующего - меняем местами
if (flat[j] > flat[j + 1]) {
// Обмен значений без использования swap
T temp = flat[j];
flat[j] = flat[j + 1];
flat[j + 1] = temp;
}
}
}
}
// Шаблон функции для вывода двумерного массива
template <typename T, size_t ROWS, size_t COLS>
void print2DArray(const T(&arr)[ROWS][COLS]) {
for (size_t i = 0; i < ROWS; i++) {
for (size_t j = 0; j < COLS; j++) {
cout << arr[i][j] << "\t";
}
cout << endl;
}
cout << "------------------------" << endl;
}
int main() {
setlocale(LC_ALL, "Russian");
cout << "=== СОРТИРОВКА ДВУМЕРНЫХ МАССИВОВ ===\n";
cout << "=== Кашина Д. ИПсп-123 ===\n\n";
// 1. Целочисленный массив (int)
int intArr[3][4] = {
{15, 2, 18, 1},
{9, 23, 7, 14},
{6, 10, 2, 5}
};
cout << "Исходный целочисленный массив (int):" << endl;
print2DArray(intArr);
sort2DArray(intArr);
cout << "Отсортированный целочисленный массив (int):" << endl;
print2DArray(intArr);
// 2. Вещественный массив (float)
float floatArr[3][4] = {
{5.5, 2.2, 8.8, 1.1},
{9.9, 3.3, 7.7, 4.4},
{6.6, 0.0, 2.2, 5.5}
};
cout << "Исходный вещественный массив (float):" << endl;
print2DArray(floatArr);
sort2DArray(floatArr);
cout << "Отсортированный вещественный массив (float):" << endl;
print2DArray(floatArr);
// 3. Символьный массив (char)
char charArr[3][4] = {
{'d', 'b', 'h', 'a'},
{'i', 'c', 'g', 'e'},
{'f', 'z', 'b', 'j'}
};
cout << "Исходный символьный массив (char):" << endl;
print2DArray(charArr);
sort2DArray(charArr);
cout << "Отсортированный символьный массив (char):" << endl;
print2DArray(charArr);
// 4. Дополнительный пример с double
double doubleArr[2][3] = {
{3.14, 2.71, 1.41},
{2.23, 1.73, 2.5}
};
cout << "Исходный вещественный массив (double):" << endl;
print2DArray(doubleArr);
sort2DArray(doubleArr);
cout << "Отсортированный вещественный массив (double):" << endl;
print2DArray(doubleArr);
return 0;
}
Результат работы программы:
Блок-схема:
Задание 2:
Код программы:
#include <iostream>
#include <string>
using namespace std;
// Шаблон для одномерного массива
template <typename T>
double average(const T* arr, size_t size) {
if (size == 0) return 0.0;
double sum = 0.0;
for (size_t i = 0; i < size; i++) {
sum += static_cast<double>(arr[i]);
}
return sum / size;
}
// Шаблон для двумерного массива
template <typename T, size_t ROWS, size_t COLS>
double average(const T(&arr)[ROWS][COLS]) {
double sum = 0.0;
size_t count = 0;
for (size_t i = 0; i < ROWS; i++) {
for (size_t j = 0; j < COLS; j++) {
sum += static_cast<double>(arr[i][j]);
count++;
}
}
return sum / count;
}
// Шаблон для трёхмерного массива
template <typename T, size_t DIM1, size_t DIM2, size_t DIM3>
double average(const T(&arr)[DIM1][DIM2][DIM3]) {
double sum = 0.0;
size_t count = 0;
for (size_t i = 0; i < DIM1; i++) {
for (size_t j = 0; j < DIM2; j++) {
for (size_t k = 0; k < DIM3; k++) {
sum += static_cast<double>(arr[i][j][k]);
count++;
}
}
}
return sum / count;
}
// Функции для вывода массивов (для наглядности)
template <typename T>
void printArray(const T* arr, size_t size) {
cout << "[";
for (size_t i = 0; i < size; i++) {
cout << arr[i];
if (i < size - 1) cout << ", ";
}
cout << "]";
}
template <typename T, size_t ROWS, size_t COLS>
void printArray(const T(&arr)[ROWS][COLS]) {
for (size_t i = 0; i < ROWS; i++) {
cout << " ";
for (size_t j = 0; j < COLS; j++) {
cout << arr[i][j] << " ";
}
cout << endl;
}
}
template <typename T, size_t DIM1, size_t DIM2, size_t DIM3>
void printArray(const T(&arr)[DIM1][DIM2][DIM3]) {
for (size_t i = 0; i < DIM1; i++) {
cout << "Слой " << i + 1 << ":\n";
for (size_t j = 0; j < DIM2; j++) {
cout << " ";
for (size_t k = 0; k < DIM3; k++) {
cout << arr[i][j][k] << " ";
}
cout << endl;
}
cout << endl;
}
}
int main() {
setlocale(LC_ALL, "Russian");
cout << "=== ВЫЧИСЛЕНИЕ СРЕДНЕГО АРИФМЕТИЧЕСКОГО ===\n";
cout << "=== Кашина Д. ИПсп-123 ===\n\n";
// 1. ОДНОМЕРНЫЕ МАССИВЫ
cout << "1. ОДНОМЕРНЫЕ МАССИВЫ:\n";
// int
int int1D[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
cout << "int массив: ";
printArray(int1D, 8);
cout << "\nСреднее арифметическое: " << average(int1D, 8) << "\n\n";
// float
float float1D[] = { 1.5, 2.5, 3.5, 4.5, 5.5 };
cout << "float массив: ";
printArray(float1D, 5);
cout << "\nСреднее арифметическое: " << average(float1D, 5) << "\n\n";
// 2. ДВУМЕРНЫЕ МАССИВЫ
cout << "2. ДВУМЕРНЫЕ МАССИВЫ:\n";
// int 2D
int int2D[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
cout << "int двумерный массив:\n";
printArray(int2D);
cout << "Среднее арифметическое: " << average(int2D) << "\n\n";
// float 2D
float float2D[2][3] = {
{1.1, 2.2, 3.3},
{4.4, 5.5, 6.6}
};
cout << "float двумерный массив:\n";
printArray(float2D);
cout << "Среднее арифметическое: " << average(float2D) << "\n\n";
// 3. ТРЁХМЕРНЫЕ МАССИВЫ
cout << "3. ТРЁХМЕРНЫЕ МАССИВЫ:\n";
// int 3D
int int3D[2][3][2] = {
{
{1, 2},
{3, 4},
{5, 6}
},
{
{7, 8},
{9, 10},
{11, 12}
}
};
cout << "int трёхмерный массив:\n";
printArray(int3D);
cout << "Среднее арифметическое: " << average(int3D) << "\n\n";
// float 3D
float float3D[2][2][3] = {
{
{1.1, 1.2, 1.3},
{1.4, 1.5, 1.6}
},
{
{2.1, 2.2, 2.3},
{2.4, 2.5, 2.6}
}
};
cout << "float трёхмерный массив:\n";
printArray(float3D);
cout << "Среднее арифметическое: " << average(float3D) << "\n";
return 0;
}
Результат работы программы:
Блок-схема:
Вывод: в ходе лабораторной работы были расширены навыки работы с функциями и получен опыт создания шаблонов на С++.
