Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Кашина_СП_ЛБ5_3

.docx
Скачиваний:
0
Добавлен:
22.09.2026
Размер:
534 Кб
Скачать

Министерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования

«Владимирский государственный университет

имени Александра Григорьевича и Николая Григорьевича Столетовых» (ВлГУ)

Колледж инновационных технологий и предпринимательства

КАФЕДРА ФИЗИКИ И ПРИКЛАДНОЙ МАТЕМАТИКИ

Лабораторная работа № 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;

}

Результат работы программы:

Блок-схема:

Вывод: в ходе лабораторной работы были расширены навыки работы с функциями и получен опыт создания шаблонов на С++.

Соседние файлы в предмете Системное программирование