![](/user_photo/2706_HbeT2.jpg)
- •1.1. Элементы языка программирования
- •Основные правила записи программы:
- •1.2. Алфавит языка
- •1.3. Лексемы
- •1.4. Концепция данных
- •2.2. Операции
- •2.2.1. Арифметические операции
- •2.2.2. Операции присваивания
- •2.2.3. Операции отношения
- •2.2.4. Логические операции
- •2.2.5. Поразрядные операции
- •2.2.6. Вычисление выражений
- •3. Структурное программирование
- •3.1. Общая характеристика операторов
- •3.2. Оператор-выражение
- •3.3. Условный оператор
- •3.4. Составной оператор
- •3.5. Операторы для программирования циклов
- •3.5.1. Оператор цикла for
- •3.5.2. Оператор цикла while
- •3.5.3. Оператор цикла do while
- •3.5.4. Оператор break
- •3.5.5. Оператор continue
- •3.6. Оператор goto
- •3.7. Пустой оператор
- •3.8. Оператор switch
- •3.9. Оператор return
- •4. Массивы
- •4.1. Объявление массива
- •4.2. Обращение к элементам массива
- •4.3. Типовые алгоритмы работы с массивами
- •4.4. Многомерные массивы
- •5. Строки
- •5.1. Объявление строки
- •5.2. Посимвольная обработка строк
- •5.3. Ввод строк
- •5.4. Библиотечные функции для работы с текстом
- •6. Указатели
- •6.1. Объявление указателей
- •6.2. Операции над указателями
- •6.3. Связь между указателями и массивами
- •6.4. Функция strtok для выделения лексем из текста
- •6.5. Динамические массивы
- •7. Структуры и объединения
- •7.1. Объявление структуры
- •Компонент структуры может быть любого типа, кроме типа объявляемой структуры.
- •7.2. Операции над структурами
- •7.3. Объявление объединения
- •8. Модульное программирование
- •8.1. Нисходящее проектирование и программирование
- •8.2. Определение и вызов функции
- •8.3. Место определения функции в программе
- •8.4. Обмен данными между функциями
- •8.4.1. Использование глобальных переменных
- •8.4.2. Использование аппарата формальных и фактических параметров
- •8.4.3. Передача массивов в функцию
- •8.5. Перегрузка функции
- •8.6. Шаблон функции
- •8.7. Рекурсивные функции
- •8.8. Функции с параметрами по умолчанию
- •8.9. Передача в функцию другой функции
- •9. Работа с файлами
- •9.1. Текстовые и двоичные файлы
- •9.2. Объявление файловых переменных
- •9.3. Чтение текстового файла
- •9.4. Создание текстового файла
- •9.5. Изменение данных в текстовом файле
- •9.6. Вывод в двоичный файл
- •9.7. Чтение данных из двоичного файла
- •9.8. Изменение данных двоичного файла
- •9.9. Организация файла с произвольным доступом
- •10. Данные с динамической структурой
- •10.1. Линейный список
- •10.1.1. Специальные типы линейных списков
- •10.1.2. Реализация линейного списка с помощью массива
- •10.1.3. Реализация линейного списка с помощью связанного однонаправленного списка
- •10.1.4. Реализация линейного списка с помощью связанного двунаправленного списка
- •10.2. Деревья
- •10.2.1. Основная терминология
- •10.2.2. Реализация двоичных деревьев поиска Для реализации дерева поиска используются массивы и связанные указателями элементы [3, 4].
- •10.2.3. Сбалансированные деревья
- •Основные достоинства в-дерева:
- •10.3. Графы
- •10.3.1. Определения
- •10.3.2. Реализация графа с помощью списков смежности
- •10.3.3. Реализация графа с помощью матрицы смежности
- •10.3.4. Поиск кратчайших путей. Алгоритм Дейкстры
- •10.3.5. Матрица достижимости. Алгоритм Уоршалла
6.5. Динамические массивы
В языке С++ используются обычные (статические) и динамические массивы. При объявлении статического массива указывается его размер, который не может быть изменен при работе программы. Например, для статического массива int a[100] выделяется 100 ячеек для хранения 100 целых чисел и увеличить или уменьшить выделенную под этот массив память нельзя.
Момент выделения памяти статическому массиву и время существования массива определяется местом объявления массива. Так если статический массив объявлен в функции main, то память под него выделяется перед началом выполнения функции, а сам массив существует все время работы функции main.
Динамическим массивом называется массив, память под который выделяется во время работы программы операцией new. Размер необходимой памяти под динамический массив можно задавать при выполнении программы. Можно управлять моментом выделения памяти под массив, располагая в нужном месте операцию new. Можно освободить память из-под динамического массива, когда потребность в массиве исчезнет, используя в нужном месте кода программы операцию delete. Размер динамического массива можно программно изменить.
Пример программы, использующей динамические массивы для последовательной обработки двух текстовых файлов. В файле a.txt записаны целые числа. Первое число файла – количество чисел в файле. В файле b.txt записаны вещественные числа. Первое число файла – целое число, задающее количество чисел в файле. Найти три наибольших числа в каждом файле. Файлы с числами находятся в одной с программой папке.
#include <conio.h>
#include <iostream.h>
#include <fstream.h> //библиотека для работы с файлами
void main()
{
ifstream fa; //файловая переменная, связанная с файлом a.txt
ifstream fb; //файловая переменная, связанная с файлом b.txt
int *a; //указатель на массив с числами файла a.txt
float *b; / указатель на массив с числами файла b.txt
int n; //количество чисел в файле
int i, j; //номер элемента в массиве и номер прохода массива
int xa; //переменная для перестановки при сортировке
float xb; //переменная для перестановки при сортировке
fa.open("a.txt"); //открытие файла для чтения
fa>>n; //чтение первого числа из файла
a=new int [n]; //выделение памяти для динамического массива
for (i=0; i<n ;i++) //чтение файла в динамический массив
fa>>a[i];
fa.close(); //закрытие файла
for (j=1; j<=3; j++) //поиск 3 самых больших чисел
for (i=0; i<n-j; i++)
if (a[i]>a[i+1])
{ xa=a[i]; a[i]=a[i+1]; a[i+1]=xa;}
for (i=n-1; i>=n-3; i--) //вывод 3 самых больших чисел
cout<<a[i]<<" ";
cout<<endl;
delete []a; //освобождение памяти
//Далее обработка другого файла
fb.open("b.txt"); //открытие файла для чтения
ba>>n; //чтение первого числа из файла
b=new float [n]; //выделение памяти для динамического массива
for (i=0; i<n; i++) //чтение файла в динамический массив
fb>>a[i];
fb.close(); //закрытие файла
for (j=1; j<=3; j++) //поиск 3 самых больших чисел
for (i=0; i<n-j; i++)
if (b[i]>b[i+1])
{ xb=b[i]; b[i]=b[i+1]; b[i+1]=xb;}
for (i=n-1; i>=n-3; i--) //вывод 3 самых больших чисел
cout<<b[i]<<" ";
getch();
}