Перейти к основному содержанию
EDU-MMCS
Вы используете гостевой доступ (Вход)

Программирование на C++

  1. В начало
  2. Курсы
  3. Осенний семестр
  4. Математика, механика
  5. Программирование на C++
  6. Модуль 2. Массивы и структурные типы данных. Лабор...
  7. Лабораторная работа №6. std::array, std::span и ук...

Лабораторная работа №6. std::array, std::span и указатели на функции

Открыто с: вторник, 13 октября 2026, 00:00
Требуемые условия завершения

Цель занятия: закрепить контейнер фиксированного размера и научиться передавать функцию или предикат как параметр алгоритма.

Необходимые темы и конструкции C++:

  • std::array: инициализация, size, fill, front, back, итераторы
  • указатели на функции и псевдонимы через using
  • callback-функции, предикаты и массивы указателей на функции
  • std::span только как обзорное невладеющее представление диапазона

Структура проекта

Разместите решение в следующих файлах:

  • main.cpp
  • callbacks.h
  • callbacks.cpp

Общие требования

  • Соблюдайте указанные сигнатуры функций: ввод и вывод организуйте в main.
  • Проверьте каждую функцию не менее чем на трёх наборах данных, включая граничный случай.
  • Не используйте средства, которые не перечислены в разделе необходимых тем, если условие прямо их не разрешает.
Обратите внимание. std::span в лекции вводится обзорно. В этой работе ни одно задание не требует его применения; используйте std::array и привычную пару «указатель + размер».

Основные задания

  1. Обработка std::array

    Для массива из восьми вещественных измерений вычислить сумму, среднее и число элементов, превышающих среднее. Реализуйте вычисления обычными циклами по std::array.

    Требуемая сигнатура:

    double sum(const std::array<double, 8>& values);
    double mean(const std::array<double, 8>& values); int count_above(const std::array<double, 8>& values, double level);
    Входные данные / вызов Результат
    [2, 4, 4, 6, 8, 8, 8, 8]
    mean=6; count_above=4
  2. Преобразование массива функцией

    Применить переданную функцию к каждому элементу массива. Проверьте алгоритм с функциями возведения в квадрат, изменения знака и увеличения на единицу.

    Требуемая сигнатура:

    using Transform = int(*)(int);
    void transform(int* data, size_t size, Transform operation);

    Требования:

    • Перед вызовом проверьте, что указатель на функцию не равен nullptr.
    Входные данные / вызов Результат
    [1, -2, 3], square
    [1, 4, 9]
  3. Отбор по предикату

    Скопировать в результирующий массив элементы исходного массива, для которых предикат возвращает true. Функция возвращает число записанных элементов.

    Требуемая сигнатура:

    using Predicate = bool(*)(int);
    int copy_if(const int* source, size_t size, int* result, Predicate predicate);

    Требования:

    • Сохраните исходный порядок элементов.
    • Проверьте функции is_even, is_positive и is_two_digit.
    Входные данные / вызов Результат
    [-12, 5, 18, 0, 7], is_two_digit
    [-12, 18]; size=2
  4. Отбор по предикату

    Дан массив вещественных чисел размера size. Также дана функция-предикат, принимающая вещественный параметр и возвращающая логическое значение. Преобразовать массив, сместив элементы, удовлетворяющие предикату к началу массива. Функция возвращает количество "хороших" элементов, удовлетворяющих предикату. Для определения типа предиката определяем указатель на функцию

    using double_predicate = bool(*)(double);
    Сигнатура функции следующая:
    size_t filter_double(double* array, size_t size, double_predicate pred);
    Проверить работы для функции, возвращающей истину для функции, возвращающей истину для положительных чисел, а также для функции, возвращающей истину для чисел, по модулю меньших переменной LIMIT. Переменную LIMIT определяем в заголовочном файле следующим образом
    extern double LIMIT;
    затем определяем саму функцию
    bool limited(double x);
    а в main.cpp сперва перед функцией main определяем LIMIT
    double LIMIT;
    и в самой функции main() присваиваем ей значение
    LIMIT = 1; //(например)
  5. Обработка двух массивов

    Даны два массива целых чисел одинакового размера. Также дана функция f, принимающая два целых параметра и возвращающая целое значение. Построить новый массив по правилу

    c[i] = f(a[i], b[i]);
    Определяем указатель на функцию
    using zip_int = int(*)(int, int);
    Сигнатура функции следующая:
    template<size_t N>
    array<int, N> zip_arrays(const array<int, N>& a, const array<int, N>& b, zip_int f);
    Проверить работы для функций, возвращающих сумму и максимум двух целых чисел.

Домашнее задание

  1. Нормализация измерений

    Преобразовать непостоянный массив вещественных чисел так, чтобы его минимальный элемент стал 0, а максимальный — 1:

    \[ y_i=\frac{x_i-x_{min}}{x_{max}-x_{min}}. \]

    Требуемая сигнатура:

    void normalize(std::array<double, 10>& values);

    Требования:

    • Если все элементы равны, заполните массив нулями.
  2. Табличный калькулятор

    Создать массив указателей на четыре функции: сложение, вычитание, умножение и деление. По номеру операции вызвать соответствующую функцию.

    Требуемая сигнатура:

    using BinaryOperation = double(*)(double, double);
    double calculate(double left, double right, int operation, const std::array<BinaryOperation, 4>& operations);

    Требования:

    • Номер операции должен находиться в диапазоне 0–3.
    • Деление на ноль обработайте до вызова функции деления.
  3. Обработка строк матрицы по условию

    Для каждой строки статической матрицы, удовлетворяющей предикату, вычислить значение переданного агрегатора. Предикат проверяет строку целиком, агрегатор получает указатель на её первый элемент и длину.

    Требуемая сигнатура:

    using RowPredicate = bool(*)(const int*, int);
    using RowAggregate = long long(*)(const int*, int);
    constexpr int COLS = 4;
    void process_rows(const int matrix[][COLS], int rows, RowPredicate predicate, RowAggregate aggregate);

    Требования:

    • Проверьте предикат «все элементы положительны» и агрегатор суммы.
◄ Лабораторная работа №5. Статические массивы и основы работы с указателями
Лабораторная работа №7. Сортировки, оценка сложности и измерение времени ►

Блоки

Пропустить Навигация

Навигация

  • В начало

    • Страницы сайта

      • Мои курсы

      • Теги

    • Мои курсы

    • Курсы

      • Осенний семестр

        • Прикладная математика и информатика

        • Фундаментальная информатика и ИТ

        • Математика, механика

          • Программирование на C++

            • Самое главное

            • Лекции

            • Коллоквиумы

            • Модуль 1. Введение в C++. Лабораторные работы

            • Модуль 1. Контрольные работы

            • Модуль 2. Массивы и структурные типы данных. Лабор...

              • ЗаданиеЛабораторная работа №3. Структуры, перечисления, п...

              • ЗаданиеЛабораторная работа №4. Представление данных, бито...

              • ЗаданиеЛабораторная работа №5. Статические массивы и осно...

              • ЗаданиеЛабораторная работа №6. std::array, std::span и ук...

              • ЗаданиеЛабораторная работа №7. Сортировки, оценка сложнос...

            • Модуль 2. Контрольные работы

            • Модуль 3. Файлы и динамические структуры данных. Л...

            • Модуль 3. Контрольные работы

          • Введение в проект - Проект 1

          • ТМ_26

          • ЭМТДТ

          • ООП 2019

          • Программирование*

        • Педагогическое образование

        • Магистратура

          • Разработка мобильных приложений и компьютерных игр

        • Аспирантура

        • Вечернее отделение

        • Другое

        • Этика ИИ

        • ОНС-Н_1

        • Прогр-ММ-2

        • Прогр-ММ-1

        • АБиМ-ИИБ26

        • МСиТВ_АБМ_2026

        • Python Eng

        • Экзамен ИКТ

        • ТестИИ

        • Информатика-Осень-ПМИ-2

        • Информатика-осень-ПМИ-1

      • Весенний семестр

        • Прикладная математика и информатика

        • Фундаментальная информатика и ИТ

        • Математика, механика

        • Педагогическое образование

        • Магистратура

          • Разработка мобильных приложений и компьютерных игр

        • Аспирантура

        • Вечернее отделение

        • Другое

      • Воскресная компьютерная школа

        • Пользователь компьютера плюс

        • Пользователь прикладных программ

        • Программирование I ступень

        • Программирование II ступень

        • Программирование III ступень

        • Архив

      • Воскресная математическая школа

        • Открытое тестирование РНОМЦ и мехмата ЮФУ

          • Открытое тестирование РНОМЦ и мехмата ЮФУ - 2026

          • Открытое тестирование РНОМЦ и мехмата ЮФУ - 2025

        • Олимпиадная математическая школа

        • Повышение квалификации

        • Доступная математика

        • Лаборатория математического онлайн-образования мех...

        • Осенняя универсиада

        • Научно-практическая конференция

        • ВМШ

          • ВМШ -2025

          • ВМШ - 2026

        • Летняя олимпиадная математическая школа РНОМЦ и ме...

      • Государственная итоговая аттестация

      • Дополнительное образование

      • Олимпиады

      • Видеолекции

      • Разное

      • Архив курсов

      • Заочная школа мехмата ЮФУ

Дополнительные блоки

Вы используете гостевой доступ (Вход)
Программирование на C++
Сводка хранения данных
Скачать мобильное приложение
Яндекс.Метрика