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

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

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

Лабораторная работа №9. Динамическая память, массивы и матрицы

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

Цель занятия: научиться вручную выделять и освобождать память, изменять размер динамического массива и строить двумерные динамические массивы.

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

  • операторы new, delete, new[], delete[]
  • утечки, висячие указатели, двойное освобождение и выход за границы
  • динамические одномерные массивы и изменение их размера
  • динамические матрицы типа int**
  • передача динамических массивов и матриц в функции

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

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

  • main.cpp
  • dynamic_arrays.h
  • dynamic_arrays.cpp

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

  • Соблюдайте указанные сигнатуры функций: ввод и вывод организуйте в main.
  • Проверьте каждую функцию не менее чем на трёх наборах данных, включая граничный случай.
  • Не используйте средства, которые не перечислены в разделе необходимых тем, если условие прямо их не разрешает.
Обратите внимание. Умные указатели в лекции упоминаются только как направление дальнейшего изучения. В этой работе требуется осознанно отработать ручные пары new/delete и new[]/delete[].

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

  1. Жизненный цикл динамического массива

    Реализовать создание массива заданного размера, заполнение арифметической прогрессией, вычисление суммы и освобождение памяти при помощи оператора delete[].

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

    int* create_progression(int size, int first, int difference);
    long long sum(const int* data, int size);

    Требования:

    • Для неположительного размера функция создания возвращает nullptr.
    • После освобождения указатель должен стать равным nullptr.
    Входные данные / вызов Результат
    create_progression(5, 2, 3)
    [2,5,8,11,14]
  2. Изменение размера

    Изменить размер существующего динамического массива, сохранив общую часть старого и нового диапазонов. Новые элементы при увеличении заполнить заданным значением.

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

    void resize(int*& data, int size, int new_size, int fill_value = 0);

    Требования:

    • При успешной операции обновите указатель и размер и освободите старый блок.
    • При new_size == 0 освободите массив.
    Входные данные / вызов Результат
    [4,7,9], new_size=5, fill=-1
    [4,7,9,-1,-1]
  3. Дан массив целых чисел. Написать функцию
    int only_evens(int* array, size_t size)
    которая оставляет в массиве только чётные элементы и возвращает их количество. При этом оставшиеся элементы должны быть смещены к началу 
  4. Дан массив целых чисел A, создать массив, в котором после каждого элемента, последняя цифра которого равна трём, вставлено число 0.

  5. Динамическая матрица

    Двумерные прямоугольные массивы («матрицы») удобно моделировать с помощью массивов указателей:

    int ** mat = new int *[rows]; // будущая матрица из rows строк

    Каждый элемент mat[i] данного массива — это указатель, его следует инициализировать в цикле, присвоив ему результат new int [cols], где cols — желаемое количество столбцов матрицы.

    Обращение к (i, j)-му элементу матрицы выглядит так: mat[i][j]. Для обхода матрицы, также, как в случае обычного массива, можно использовать указатели.

    Освобождать память из под матрицы необходимо в обратном порядке: сначала в цикле освобождается память для каждой строки: delete [] mat[i]. А затем освобождается память самого массива указателей mat: delete [] mat. Эту процедуру следует оформить в виде функции с одним аргументом — rows (количество строк) — см. задачу 3 ниже.

    1. Определите функцию создания матрицы заданных размеров, все элементы которой равны заданному числу:

      int ** createMatrix(int rows, int cols, int value = 0);

      Значение по умолчанию 0 для параметра value должно быть указано только в заголовочном файле; в cpp-файле заголовок содержит три параметра в обычном виде. Значение по умолчанию говорит о том, что функцию можно вызвать с двумя аргументами, тогда значением параметра value будет число 0.

    2. Определите функцию заполнения матрицы заданных размеров случайными числами с заданными пределами для значений элементов:

      void fillRandomMatrix(int ** mat, int rows, int cols, int minValue = -10, int maxValue = 10);
    3. Создайте функцию печати матрицы:

      void printMatrix(int ** mat, int rows, int cols);
    4. Создайте функцию освобождения памяти, занятой матрицей:

      purgeMatrix(int ** mat, int rows);
    Убедитесь, что в основной программе вы не забыли освободить память от использовавшихся матриц.

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

  1. Транспонирование

    Создать новую динамическую матрицу, равную транспонированной исходной. Исходную матрицу не изменять.

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

    int** transpose(int** matrix, int rows, int columns);

    Требования:

    • Размер результата — columns × rows.
    • Вызывающий код отвечает за освобождение обеих матриц.
    Входные данные / вызов Результат
    [[1,2,3],[4,5,6]]
    [[1,4],[2,5],[3,6]]
  2. Удаление строки и столбца

    Создать новую матрицу без указанной строки и указанного столбца, затем освободить старую матрицу и заменить её указатель.

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

    void erase_row_column(int**& matrix, int& rows, int& columns, int row, int column);

    Требования:

    • Сначала проверьте индексы.
    • Не допускайте утечки при замене матрицы.
  3. Верхнетреугольная ступенчатая матрица

    Создать ступенчатый массив для хранения верхнего треугольника квадратной матрицы: строка i содержит элементы столбцов от i до n-1. Реализовать вычисление суммы и освобождение.

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

    int** create_upper_triangle(int size);
    long long sum_upper_triangle(int** matrix, int size);
    void destroy_upper_triangle(int**& matrix, int size);

    Требования:

    • Общее число хранимых элементов равно \(n(n+1)/2\).
◄ Лабораторная работа №8. Ошибки, исключения и std::expected

Блоки

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

Навигация

  • В начало

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

      • Мои курсы

      • Теги

    • Мои курсы

    • Курсы

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

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

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

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

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

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

            • Лекции

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

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

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

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

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

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

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

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

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

              • ЗаданиеЛабораторная работа №8. Ошибки, исключения и std::...

              • ЗаданиеЛабораторная работа №9. Динамическая память, масси...

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

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

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

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

          • ТМ_26

          • ЭМТДТ

          • ООП 2019

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

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

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

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

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

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

        • Другое

        • Этика ИИ

        • ОНС-Н_1

        • Прогр-ММ-2

        • Прогр-ММ-1

        • АБиМ-ИИБ26

        • МСиТВ_АБМ_2026

        • Python Eng

        • Экзамен ИКТ

        • ТестИИ

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

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

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

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

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

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

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

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

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

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

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

        • Другое

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

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

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

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

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

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

        • Архив

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

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

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

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

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

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

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

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

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

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

        • ВМШ

          • ВМШ -2025

          • ВМШ - 2026

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

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

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

      • Олимпиады

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

      • Разное

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

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

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

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