
- •1.2Типы данных
- •1.2.1Объявление переменной
- •1.2.2Категории типов данных
- •1.2.3Целый тип данных
- •1.2.4Данные с плавающей точкой (вещественные типы)
- •1.3Знаки операций
- •1.3.3Простое присваивание
- •1.3.4Составное присваивание
- •1.3.5Приоритеты операций и порядок вычислений
- •1.4Структура и компоненты программы на языке си
- •1.5Организация ввода-вывода в стиле си
- •1.6.1 Манипуляторы и форматирование ввода-вывода
- •1.7Математические функции
- •2Алгоритм. Элементы структурного программирования
- •2.1Понятие алгоритма
- •2.2Основные требования к алгоритмам
- •2.3Элементы структурного программирования
- •3Программирование алгоритмов линейной структуры
- •4Алгоритмы и программы ветвящейся структуры. Условный оператор if. Переключатель switch
- •4.1Алгоритмы и программы ветвящейся структуры
- •4.1.1Условный оператор if
- •If (выражение) оператор1;
- •4.1.2Логические операции
- •4.2Примеры составления алгоритмов и программ с использованием условного оператора If
- •4.3Переключатель switch
- •5Алгоритмы и программы циклической структуры
- •5.1 Понятие цикла. Разновидности циклов
- •5.3Оператор while
- •5.4Оператор do while
- •5.5Оператор continue
- •6Регулярные типы данных. Массивы
- •6.1 Понятие регулярного типа
- •6.2Алгоритмы сортировки массивов
- •6.3 Постановка задачи сортировки и методы её решения
- •6.4Алгоритм прямого упорядочения (Алгоритм сортировки выбором элемента)
- •6.5Алгоритм попарного сравнения соседних элементов («пузырьковая» сортировка)
- •6.6Алгоритм сортировки выбором элемента
- •6.7Методы доступа к элементам массивов, использование указателей
- •6.8Организация многомерных массивов. Указатели на многомерные массивы
- •7.1Описание и определение функции
- •7.2Вызов функции
- •7.3Передача параметров в функцию
- •7.4Описание прототипа функции
- •7.5Функция с переменным количеством параметров
- •7.6Понятие сигнатуры функции
- •7.7Подставляемые (встраиваемые) функции
- •7.8Передача параметров в главную функцию
- •7.9Рекурсивные вызовы функции
- •7.10Примеры составления функций
- •8Указатели
- •8.1Понятие указателя
- •8.2Инициализация указателей
- •8.3Операции с указателями
- •8.4Ссылки
- •9Структуры (struct)
- •10Динамические структуры данных
- •3.1 Односвязные списки
- •Д обавление в начало списка.
- •2 ) Добавление в середину списка.
- •У даление первого элемента списка.
- •3 )Удаление элемента из середины списка.
- •Int Data; //поле данных
- •If (!q) //...И он первый в списке
- •3.2 Стек
- •3.3 Очередь
- •11Динамические массивы
- •12Функции и массивы
- •13Указатели на функции
- •14.1Файловый ввод/вывод с помощью потоков
- •14.2 Дополнительные функции файлового ввода/вывода
- •14.3Режимы файлов
- •14.4 Двоичные файлы
- •14.5Произвольный доступ к файлам
- •Список использованных источников
11Динамические массивы
Во многих случаях заранее не известно, какое количество данных требуется обрабатывать программе, либо размер обрабатываемых данных часто меняется в процессе ее работы. Объявление статических массивов в этом случае приводит к тому, что значительная часть памяти тратится впустую.
Для решения данной проблемы и применяются динамические массивы, для работы с которыми используются указатели.
Операция new тип_массива выделяет в динамической памяти участок для размещения массива соответствующего типа, но не позволяет его инициализировать. В результате выполнения операция new возвратит указатель, значением которого служит адрес первого элемента, размер массива должен быть полностью определен.
long ( *lp ) [2][4] ;
lp = new long [3][2][4];
Операция delete [ ] lp; освободит целиком всю память, выделенную для определенного выше массива, если lp адресует его начало.
Следующая программа формирует, заполняет данными, печатает и уничтожает массив, представляющий прямоугольную диагональную матрицу (единичную), порядок которой (размеры массива) вводятся пользователем с клавиатуры:
# include < iostream.h >
void main ( )
{ int n ;
cout << "\n Введите порядок матрицы :" ; cin >> n ;
float **matr ; //указатель для массива указателей
matr = new float *[n] ; //массив указателей float*
if (matr == NULL) { cout << "Не создан динамический массив" ;
return ; // завершение программы }
for ( int i = 0; i < n; i ++ )
{ matr [i] = new float [n] ; // строка- массив значений типа float
if (matr [i] == NULL )
{ cout << "Не создан динамический массив ";
return ; // завершение программы }
for ( int j = 0; j < n; j ++ ) if ( i != j ) matr [i] [j] = 0
else matr [i] [j] = 1 ;
}
for ( i = 0; i < n; i ++ )
{ cout << "\n строка " << (i+1) << " : " ;
for ( int j = 0; j < n; j ++ ) cout << "\t" << matr [i] [j] ;
}
for ( i = 0; i < n; i ++ ) delete matr [i] ;
delete [ ]matr ;
}
Результат:
Введите размер матрицы: 5
Строка 1 : 10000
Строка 2 : 01000
Строка 3 : 00100
Строка 4 : 00010
Строка 5 : 00001
0 1 2 ... n-1
|
* |
|
1 |
0 |
0 |
... |
0 |
1 |
* |
|
0 |
1 |
0 |
... |
0 |
2 |
* |
|
0 |
0 |
1 |
... |
0 |
. . . . . . . . . . . . . . . . . . . . . . . . . .
n-1 |
* |
|
0 |
0 |
0 |
... |
1 |
э
лементы
типа float
Рисунок 2 – Одномерный массив указателей
На рисунке 2 изображена схема взаимосвязи (n+1) -одномерных массивов, из n элементов каждый. Эти (n+1) массивов совместно имитируют квадратную матрицу с изменяемыми размерами, формируемую в программе.