- •Методические указания к лабораторным работам по дисциплине «программирование»
- •Введение
- •Содержание отчетов
- •Варианты индивидуальных заданий
- •Подготовка к лабораторным работам
- •Лабораторная работа № 1. Алгоритмизация линейных вычислительных процессов.
- •Лабораторная работа № 2. Алгоритмизация разветвляющихся вычислительных процессов.
- •Лабораторная работа № 3. Алгоритмизация циклических вычислительных процессов.
- •Лабораторная работа № 4. Программирование вложенных циклов и матричных задач
- •Лабораторная работа № 5. Алгоритмизация задач обработки символьной информации
- •Лабораторная работа № 6. Процедуры и функции
- •Лабораторная работа № 7. Файлы и структуры
- •Лабораторная работа № 8. Алгоритмизация задач обработки динамических массивов
- •Лабораторная работа № 9. Алгоритмы и программы сортировки
- •Приложение 1
- •Приложение 2
- •Библиографический список
- •Оглавление
- •Часть 1
- •600000, Владимир, ул. Горького, 87.
Лабораторная работа № 8. Алгоритмизация задач обработки динамических массивов
1. Цель работы
Изучение средств языка программирования для управления динамической памятью. Изучение принципов алгоритмизации и разработки программ, связанных с обработкой динамических массивов. Изучение принципов построения и параметризации шаблонов функций.
2. Порядок выполнения работы
Изучить классификацию видов памяти, их использование. Изучить принципы управления динамической памятью: выделение, обращение, освобождение. Изучить принципы организации и обработки динамических массивов.
Изучить построение и параметризацию шаблонов функций.
Изучить работу операторов new и delete, операции над указателями. Изучить синтаксис описания шаблона функции (template…).
Изучить пример выполнения задания. Обратите внимание на описание шаблонов функций и их параметризацию в точках вызова фактическими типами. Обратите внимание на тип формального параметра в шаблоне функции creat (модуль func.h).
Разработать алгоритм решения индивидуального задания, удовлетворяющий требованиям из пунктов 2.6, используя метод пошаговой детализации.
Требования к алгоритму. Алгоритм должен соответствовать требованиям структурного подхода. Необходимо организовать интерфейс ввода – вывода всех требуемых данных, организовать проверку входных данных на допустимые значения. Считать максимальное количество элементов массива неизвестным, организовать массив в динамической памяти. Предусмотреть решение задачи для разных типов элементов массива (int, float, пользовательский тип и т.п.). Алгоритм решения задачи разбить на функциональные блоки – функций. Определить функции, отличающиеся только типами формальных параметров, разработать шаблоны для этих функций с последующей параметризацией фактическими типами.
Разработать программу на языке С++ для алгоритма п. 2.5, используя модульный подход (см. п. 2.8 лаб. раб. № 6).
Выполнить отладку и компиляцию программы, получить исполняемый файл.
Выполнить тестирование программы несколькими наборами входных данных.
Составить диаграмму модулей, дерево вызова функций и спецификации функций (в отчет по лабораторной работе).
3. Пример выполнения задания
Даны действительные числа a, b, c, d,…n. Если a ≤ b ≤ c ≤ d…≤ n, то каждое число заменить наибольшим из них; если a > b > c > d >…> n, то оставить без изменений; в противном случае все числа заменяются их квадратами.
3.1 Текст программы на С++ (часть).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
//модуль func.h (представлена только часть шаблонов) // шаблоны функций для работы с динамическим массивом #pragma once //создание массива в динамической памяти template <typename T> void CreateMas(int n, T * &mas) { mas = new T[n]; }//------------------------------------------------------------------------------------------------- //инициализация динамического массива псевдослучайными числами template <typename T> void GenMas(int n, T * mas) { for(int i = 0; i < n; i++) *(mas+i) = ((T)rand()/RAND_MAX+rand()%50-rand()%30); }//------------------------------------------------------------------------------------------------- //определение является ли массив упорядоченным по убыванию template <class T> bool IsToSmall(int n, T * mas) { bool flag = true; for(int i = 0; i < n-1; i++) if (mas[i] <= mas[i+1]) ; else { flag = false; break; } return flag; }//------------------------------------------------------------------------------------------------- //присвоение всем элементам массива значения последнего элемента массива template <class T> void ResSmall(int n, T * mas) { for(int i = 0; i < n-1; i++) *(mas+i) = *(mas+n-1); }//------------------------------------------------------------------------------------------------- //удаление массива из динамической памяти template <typename T> void DelMas(T *mas) { delete [] mas; }//=========================================================== //модуль lab8.cpp (часть) #include "stdafx.h" #include "func.h" int main() { setlocale(LC_ALL, "RUS"); int n; cout << "Введите кол-во элементов в массиве: "; cin >> n; cout << "Вещественные числа:" << endl; float * fmas; //параметризируем вещественными числами //… CreateMas(n, fmas); GenMas(n, fmas); OutMas(n, fmas); if (IsToSmall(n, fmas)) ResSmall(n, fmas); OutMas(n, fmas); DelMas(fmas); //… cout << "Целые числа:" << endl; int * imas; //параметризируем целыми числами CreateMas(n, imas); //… system("pause"); return 0; } |
4. Контрольные вопросы
1. Какие виды памяти Вы знаете? Каково их назначение?
2. Что такое динамическая память? В чем заключается ее особенность? Правила работы с динамической памятью.
3. Как работают операторы new и delete?
4. Что такое шаблон функции? Для чего он используется?
5. На каком механизме базируется реализация шаблонов функций?
6. Что такое параметризация шаблона? Чем он параметризируется?
7. В чем заключается параметризация шаблона?