- •Глава 2 36
- •1 Задание 1 62
- •Лабораторная работа №1
- •Краткие теоретические сведения
- •1.1Создание консольного приложения
- •1.2Отладка программы
- •1.2.1Установка точек останова (Add breakpoint)
- •2.2Идентификаторы
- •2.3Ключевые слова
- •2.4Знаки операций
- •2.5Константы
- •2.6Комментарии
- •2.7.1Понятие типа данных
- •2.7.2Основные типы данных
- •2.7.3Целый тип (int).
- •2.7.4Символьный тип (char).
- •2.7.5Логический тип (bool).
- •2.7.6Вещественный тип (float, double и long double).
- •2.8Переменные
- •2.9Функции и объекты ввода/вывода
- •2.9.1Основные функции ввода/вывода в стиле с:
- •2.10Операции
- •2.10.2Операция определения размера sizeof
- •2.10.4Деление (/) и остаток от деления (%).
- •2.10.8Логические операции (&& и ||).
- •2.10.10 Условная операция (?:).
- •2.11Выражения
- •2.11.1Преобразование типов в выражении.
- •Задание к лабораторной работе №1
- •Контрольные вопросы к лабораторной работе №1
- •1.1Оператор «выражение»
- •1.2Операторы ветвления
- •1.2.1Условный оператор if... Else
- •1.2.2Об условиях в операторе if
- •1.2.3Оператор выбора switch
- •1.3Операторы передачи управления
- •1.3.1Оператор goto
- •1.3.2Оператор break
- •2 Тестирование программ
- •Домашнее Задание
- •Задание к лабораторной работе №2
- •1Задание 1
- •2Задание 2
- •Содержание отчета
- •2Операторы цикла
- •2.1Цикл с предусловием (while)
- •2.2Цикл с постусловием (do … while)
- •2.3Цикл с параметром for
- •3Дополнительные операторы передачи управления
- •3.1Оператор break
- •3.2Оператор continue
- •4Вложенные циклы
- •Домашнее Задание
- •Задание к лабораторной работе №3
- •1Задание 1
- •2Задание 2
- •Содержание отчета
- •Контрольные вопросы к лабораторной работе №3
- •4Программа пузырьковой сортировки
- •Домашнее Задание
- •Задание к лабораторной работе №4
- •Содержание отчета
- •Контрольные вопросы к лабораторной работе №4
- •0 Строка
- •1 Строка
- •5 Строка
- •2Ввод и вывод многомерных массивов
- •Домашнее Задание
- •Задание к лабораторной работе №5
- •4Ссылки
- •5Динамическое распределение памяти
- •5.1Использование стандартных функций malloc и free
- •5.2Использование операторов new и delete
- •Домашнее Задание
- •Задание к лабораторной работе № 6
- •Содержание отчета
- •Контрольные вопросы к лабораторной работе №6
- •Лабораторная работа №7 отладка программы краткие теоретические сведения
- •6Отладочные пункты меню
- •7Элементы отладки
- •7.1Контрольные точки
- •7.1.1Контрольные точки в исходном коде
- •7.1.2Адресные контрольные точки
- •7.1.3Контрольные точки данных
- •7.2Команда Run to Cursor
- •7.3Команда Pause
- •8Наблюдение за переменными
- •8.1Быстрый просмотр данных
- •9Инспектор отладки
- •9.1Инспекция локальных переменных
- •10Другие инструменты отладки
- •10.1Диалог Evaluate/Modify
- •10.2Окно cpu
- •10.3Стек вызовов
- •10.4Команда Go to Address
- •10.5Команда Program Reset
- •Задание на лабораторную работу №7
- •Контрольные вопросы к лабораторной работе №7
- •Приложение I
- •Приложение II Блоки схем алгоритмов согласно гост 19.002 – 80 и 19.003 – 80
- •Приложение III Оформление алгоритма программы в виде блок-схемы
- •Приложение IV Базовая программа для выполнения лабораторных работ
- •Приложение V
- •Приложение VI
- •Список используемых источников
5.2Использование операторов new и delete
Операторы new и delete могут быть использованы везде, где используются функции malloc и free. Однако этот способ имеет несколько преимуществ:
не нужно включать в программу файл malloc.h;
не нужно выполнять приведение типов – это сделает оператор new;
самое главное, эти операторы не просто выделяют и освобождают память. Когда оператор new используется для размещения объекта в памяти, он автоматически вызывает конструктор объекта, если таковой существует. Аналогично, при освобождении памяти с помощью оператора delete вызывается деструктор объекта (также при его наличии).
Выделение памяти с помощью оператора new имеет следующий синтаксис:
указатель = new тип;
указатель = new тип [число элементов];
Вторая строка описывает синтаксис оператора при выделении памяти для массивов.
Так же как функция malloc, оператор new возвращает значение NULL, если объем требуемой памяти больше, чем объем свободной. Рекомендуется проверить факт выделения памяти прежде, чем продолжать выполнение программы.
Освобождение памяти с помощью оператора delete производится только в том случае, если она была выделена с использованием оператора new и имеет следующий синтаксис:
delete указатель;
delete [число элементов] указатель;
Использование квадратных скобок для освобождения памяти, выделенной под массив, обязательно. Как и при инициализации, его длину можно опустить, но скобки опускать нельзя, иначе освободится память, занимаемая только первым элементом. Указатель на константу удалить нельзя.
Рассмотрим программу, ввода/вывода одномерного массива:
int n;
float *massiv; //объявление указателя
cout<<RUS("Введите размер массива\n");cin>>n;//ввод размера массива
massiv=new float[n];//динамическое выделение памяти
if(!massiv) //проверка факта выделения памяти
{cout<<RUS("\nНедостаточно памяти");
cout<<RUS("\nНажмите любую клавишу для завершения программы ...\n");
getch();
return 0;}
cout<<RUS("Введите massiv[")<<n<<"]"<<"\n";
for(int i=0;i<n;i++)
cin>>*(massiv+i);
//вывод массива
cout<<"\nmassiv\n";
for(int i=0;i<n;i++)
cout<<" "<<*(massiv+i);
delete [] massiv; //освобождение памяти
В этой программе указатель используется для выделения динамической памяти и доступа к элементам массива.
Способ выделения памяти под двумерный массив, когда обе его размерности задаются на этапе выполнения программы, приведен ниже:
int nstr,nstb;
cout<<RUS(" Количество строк = ");cin>>nstr; //ввод кол. строк
cout <<RUS(" Количество столбцов = ");cin>>nstb; //ввод кол. столбцов
//динамическое выделение памяти
int **a=new int *[nstr];//оператор 1
for(int i=0;i<nstr;i++) //оператор 2
a[i]=new int[nstb]; //оператор 3
if(!a) //проверка факта выделения памяти
{cout<<RUS("\nНедостаточно памяти");
cout<<RUS("\nНажмите любую клавишу для завершения программы ...\n");
getch();
return 0;}
//ввод массива
cout<<RUS("\nВведите массив[")<<nstr<<"]["<<nstb<<"]\n";
for(int i=0;i<nstr;i++)
for(int j=0;j<nstb;j++) cin>>a[i][j]; //оператор 3
//вывод массива
cout<<RUS("Массив a\n");
for(int i=0;i<nstr;i++)
{
for(int j=0;j<nstb;j++)
{cout.width(5);cout<<a[i][j];}
cout<<"\n";
}
delete [] a; //освобождение памяти
Рис. 1.2. Выделение памяти под двумерный массив
В операторе 1 объявляется переменная типа «указатель на указатель на int» и выделяется память под массив указателей на строки массива (количество строк – nstr). В операторе 2 организуется цикл для выделения памяти под каждую строку массива. В операторе 3 каждому элементу массива указателей на строки присваивается адрес начала участка памяти, выделенного под строку двумерного массива. Каждая строка состоит из nstb элементов типа int (рис. 1.2).
Освобождение памяти из-под массива с любым количеством измерений выполняется с помощью операции:
delete [] указатель.