Распределение памяти. Динамическое выделение памяти
Лабораторная работа 24. Распределение памяти. Динамическое выделение памяти
Цель работы: изучить способы выделения памяти, динамического выделения памяти, связи указателей и динамического распределения памяти, научиться решать задачи с использованием динамического выделения памяти в языке C++.
При выполнении лабораторной работы для каждого задания требуется написать программу на языке С++, которая получает на входе данные в соответствии с указанном в задании типом и осуществляет их обработку, используя для хранения оговоренных в условии последовательностей ресурсы динамической памяти. Ввод данных осуществляется с клавиатуры с учетом содержащихся в постановке задачи признака конца входной последовательности данных и требований к ним. Ограничениями на входные данные является максимальный размер строковых данных, допустимый диапазон числовых типов в языке С++ и максимально допустимый размер динамической памяти.
Теоретические сведения.
Ознакомьтесь с материалом лекции 24.
Задания к лабораторной работе.
Выполните приведенные ниже задания.
- Составьте программу нахождения действительных корней квадратного уравнения, расположив его коэффициенты в динамической памяти.
- Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Ввести и напечатать на разных строках четные и нечетные числа данной последовательности. Реализуйте данную программу двумя способами: 1) с помощью операций new и delete ; 2) с помощью библиотечных функций malloc (calloc) и free.
- Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Вывести на печать числа по закономерности, пока образуется пустая строка.
an an-1 ... a3 a2 a1 an-1 an-2 ... a2 ..................
- Дана последовательность символов латинского алфавита, количество которых заранее не определено. Считать концом последовательности символ пробела. Вывести на печать гласные буквы из данной последовательности.
Указания к выполнению работы.
Каждое задание необходимо решить в соответствии с изученными методами работы с динамической памятью и алгоритмами обработки данных в языке С++. В задачах 2, 3 и 4 количество входных данных заранее не определено, однако, при реализации следует считать, что их размер не превышает максимально допустимого объема динамической памяти. Вывод результатов обработки данных следует осуществить на экран. Программу для решения каждого задания необходимо разработать методом процедурной абстракции, оформив комментарии к коду.
Следует реализовать каждое задание в соответствии с приведенными этапами:
- изучить словесную постановку задачи, выделив при этом все виды данных;
- сформулировать математическую постановку задачи;
- выбрать метод решения задачи, если это необходимо;
- разработать графическую схему алгоритма;
- записать разработанный алгоритм на языке С++;
- разработать контрольный тест к программе;
- отладить программу;
- представить отчет по работе.
Требования к отчету.
Отчет по лабораторной работе должен соответствовать следующей структуре.
- Титульный лист.
- Словесная постановка задачи. В этом подразделе проводится полное описание задачи. Описывается суть задачи, анализ входящих в нее физических величин, область их допустимых значений, единицы их измерения, возможные ограничения, анализ условий при которых задача имеет решение (не имеет решения), анализ ожидаемых результатов.
- Математическая модель. В этом подразделе вводятся математические описания физических величин и математическое описание их взаимодействий. Цель подраздела – представить решаемую задачу в математической формулировке.
- Алгоритм решения задачи. В подразделе описывается разработка структуры алгоритма, обосновывается абстракция данных, задача разбивается на подзадачи. Схема алгоритма выполняется по ЕСПД (ГОСТ 19.003-80 и ГОСТ 19.002-80).
- Листинг программы. Подраздел должен содержать текст программы на языке программирования С++, реализованный в среде MS Visual Studio 2010.
- Контрольный тест. Подраздел содержит наборы исходных данных и полученные в ходе выполнения программы результаты.
- Выводы по лабораторной работе.
- Ответы на контрольные вопросы.
Контрольные вопросы
- Для чего используется динамическая память в программировании?
- Какая область памяти выделяется под размещение динамических данных?
- Как долго хранятся данные в динамической памяти?
- Какие возможны варианты доступа к динамической памяти?
- Что возвращает операция выделения динамической памяти в случае успешного выполнения?
- Что возвращает операция выделения динамической памяти, если участок требуемого размера не может быть выделен?
- Почему тип функций выделения динамической памяти определен как *void?
- Почему при завершении работы с динамической памятью ее необходимо освободить? Какие могут быть последствия для работы программы, если не освобождать динамическую память?
- Существуют ли ограничения на данные при применении к ним операции или функции освобождения динамической памяти?