
- •Информатика основы
- •Предисловие
- •Введение
- •Программы
- •1.1. Элементы языка
- •Список основных ключевых слов
- •Типы числовых данных
- •Разделители
- •Основные бинарные операции
- •Математические функции
- •1.2. Структура программы
- •1.3. Выполнение программы
- •Контрольные вопросы
- •2.1. Загрузка и настройка системы программирования
- •2.2. Создание и работа с проектом
- •Условные графические обозначения основных блоков схем алгоритмов
- •Словесно-формульный алгоритм
- •Листинг 2.1. Lin_prog.Cpp
- •Результат выполнения программы
- •3.2. Логический тип данных и базовые логические операции
- •Операции сравнения
- •Логические операции
- •При решении задач с множеством логических условий программа существенно упрощается, если эти условия удается объединить с помощью операций и, или, не в более крупные выражения.
- •Словесно-формульный алгоритм
- •Результат выполнения программы
- •Результат выполнения программы
- •Упражнения
- •Варианты заданий
- •Области определения функции z (X,y)
- •Контрольные вопросы
- •4. Организация циклов
- •4.1. Организация программ с циклами
- •For (инициализация; условие; модификация) операторы
- •4.2. Инкремент, декремент и составные операции
- •Составные операции присваивания
- •Результат выполнения программы
- •Результат выполнения программы
- •Упражнения
- •Варианты заданий
- •Контрольные вопросы
- •5.Составление программ с массивами
- •5.1. Организация программ с массивами
- •Тип имя_массива [n];
- •Имя_массива [индекс]
- •Тип имя_массива [размер_1] [размер_2]
- •5.2. Манипуляторы и форматирование ввода-вывода
- •Манипуляторы
- •Результат выполнения программы
- •Результат выполнения программы
- •Контрольные вопросы
- •Дайте определение массива.
- •6. Составление программ с использованием функций
- •6.1. Описание, объявление и вызов функций
- •Механизм возврата из функции реализуется оператором
- •Тип имя_функции (тип размерность, тип имя_массива[ ]) ,
- •6.2. Глобальные и локальные переменные
- •Результат выполнения программы
- •6.3. Перегруженные функции
- •Результат выполнения программы
- •Упражнения
- •Варианты заданий
- •Контрольные вопросы
- •7. Программирование с использованием указателей
- •7.1. Общие сведения об указателях
- •7.2. Динамические массивы
- •Результат выполнения программы
- •Результат выполнения программы
- •7.3. Указатели и функции
- •Результат выполнения программы
- •Упражнения
- •Варианты заданий
- •Контрольные вопросы
- •8. Программирование с использованием структур
- •8.1. Определение структур
- •8.2. Организация программ с использованием структур
- •Имя_структуры . Имя_элемента_структуры
- •Список товаров
- •Результат выполнения программы
- •Упражнения
- •Варианты заданий
- •Контрольные вопросы
- •Библиографический список
- •Основные бинарные операции
- •Операции сравнения
- •Составные операции присваивания
- •Логические операции
- •Типы числовых данных
- •Константы, используемые в математических выражениях
- •Математические функции
- •Типовые сообщения об ошибках
- •Оглавление
7.2. Динамические массивы
Динамическим называется массив, размерность которого становится известной в процессе выполнения программы. Такие массивы делают последнюю более общей.
Формирование динамических массивов осуществляется с помощью указателей и средств распределения памяти. Память выделяется в специальной области оперативной памяти – heap, которую часто называют свободной памятью.
Для выделения памяти в С++ используется операция new, а для для ее освобождения – операцияdelete.
Ниже приводится общепринятый способ динамического распределения памяти под одномерный массив.
int n, *mas; //объявление указателя
. . . . . . .
cin>>n; //ввод размерности массива
mas=new int[n]; //выделение памяти
. . . . . . . . . .
delete [] mas; //освобождение памяти
mas=NULL; //обнуление указателя
В данном примере переменная mas является указателем на массив изnэлементов (и его именем одновременно). Ему присваивается адрес выделенной области памяти в соответствии с заданным типом объекта. Иногда объявление указателя и операциюnew совмещают.
int *mas = new int[n];
Если объем любого свободного участка памяти недостаточен для размещения массива, операция newвозвращает нулевой указатель (адрес 0), индицируя тем самым безуспешную попытку выделения памяти. Поэтому результат операцииnewобычно проверяют следующим образом:
float *mas = new float[n];
if (mas == NULL)
{ cout<<"Свободной памяти нет"<<endl;
exit (1); //аварийное завершение программы
}
Пример. Формирование и сортировка массивас n элементами (лист. 7.1).
Листинг 7.1. ukaz_1.сpp
#include <iostream.h>
#include <stdlib.h> //Для функции exit
void main()
{ int n;
double a,*mas; //mas - указатель на динамический массив
//Ввод размерности массива
cout<<"Введите размерность массива:\n";
cout<<"n=",cin>>n;
mas=new double[n]; //Выделение памяти под массив
if(mas==NULL)
{
cout<<"Свободной памяти нет"<<endl;
exit(1);
}
//Ввод массива
cout<<"Введите элементы массива:\n";
for(int i=0;i<n;i++)
{
cout<<"mas["<<i<<"]=";cin>>mas[i];
}
cout<<"\n Исходный массив чисел:\n"<<"mas["<<n<<"]={";
for(int i=0;i<n;i++)
cout<<mas[i]<<" ";
cout<<"}"<<endl;
//Сортировка массива методом "пузырька"
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
if (mas[j]<mas[i])
{a=mas[i];
mas[i]=mas[j];
mas[j]=a;
}
//Вывод отсортированного массива
cout<<"\nОтсортированный массив чисел:\n"<<"mas["<<n<<"]={";
for(int i=0;i<n;i++)
cout<<mas[i]<<" ";
cout<<"}";
delete [] mas; //Освобождение памяти
mas=NULL; //Инициализация указателя
}
Результат выполнения программы
Исходный
массив чисел:
mas[6]={3.6 -1 4 3.4 -0.5 0 }
Отсортированный массив чисел:
mas[6]={-1 -0.5 0 3.4 3.6 4 }
!! Проанализируйте программу. Создав новый файл проекта с именем ukaz_1.ide, наберите в нем текст данной программы, откомпилируйте ее и произведите запуск программы на выполнение.
При работе с матрицами различной размерности возникает необходимость создания двумерных динамических массивов. В этом случае сначала с помощью операцииnewвыделяется память подnуказателей, гдеn– число строк матрицы. После этого каждому указателю присваивается с помощьюnewадрес выделенной области памяти с размеромm,гдеm– число столбцов матрицы (рис. 7.3).
Рис. 7.3. Размещение динамического двумерного массива в памяти
Такой динамический массив по расположению элементов в памяти существенно отличается от статического двумерного массива, для которого память выделяется последовательно для всех строк. Для первого память выделяется последовательно только для каждой строки матрицы, а строки могут располагаться в разных местах памяти.
Пример. Формирование двумерного целочисленного массива размерностьюnxmс вводом элементов матрицы с клавиатуры и последующим вычислением нормы матрицы по формуле
.
Программа для решения данной задачи приведенавлистинге 7.2.
Листинг 7.2. ukaz_2.сpp
#include <iostream.h>
#include <stdlib.h> //Для функции exit
#include <iomanip.h> //Для функции setw
void main()
{
int n,m,**mas; //mas - указатель на указатель
//Ввод размерностей массива
cout<<"Введите размерность матрицы:\n";
cout<<"число строк n=",cin>>n;
cout<<"число столбцов m=",cin>>m;
mas=new int*[n]; //Выделение памяти под n указателей
if(mas==NULL) //Проверка выделения памяти
{
cout<<"Свободной памяти нет"<<endl;
exit(1);
}
for(int i=0;i<n;i++)
{ mas[i]=new int[m]; //Выделение памяти для i строки
if(mas[i]==NULL) //Проверка выделения памяти
{
cout<<"Свободной памяти нет"<<endl;
exit(1);
}
}
//Ввод массива
cout<<"Введите элементы массива:\n";
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cout<<"mas["<<i<<"]"<<"["<<j<<"]=";
cin>>mas[i][j];
}
//Вывод исходной целочисленной матрицы
cout<<"\nИсходный массив чисел:"
<<"\nmas["<<n<<"]"<<"["<<m<<"]=\n";
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{ cout<<setw(6)<<mas[i][j];
if(j==m-1)cout<<endl;
}
cout<<endl;
//Вычисление нормы матрицы
int max=0;
for(int i=0;i<n;i++)
{ int s=0;
for(int j=0;j<m;j++)
s+=abs(mas[i][j]);
if (s>max) max=s;
}
cout<<"Норма матрицы="<<max;
for(int i=0;i<n;i++) //Освобождение памяти, отведенную
delete mas[i]; // под матрицу
delete [] mas; //Освобождение памяти под указатели
}