- •Понятие алгоритма
- •Выражения. Арифметические, логические. Логические отношения.
- •Операторы инкремента и декремента.
- •Типы управляющих структур
- •Структура следования. Понятие составного оператора
- •Структура выбора (if/else, switch), условная тернарная операция
- •Структура повторения
- •Структурированные типы данных. Понятие массива, его атрибуты.
- •Последовательный поиск заданного элемента в массиве
- •Обращение к элементам многомерного массива
- •Обращение к элементам динамического массива
-
Последовательный поиск заданного элемента в массиве
-
Заключается в поочередном сравнивании элементов массива с заданным элементом, при нахождении подходящего элемента поиск прекращается.
Бинарный поиск
-
Если массив a упорядочен, то можно использовать более эффективный алгоритм поиска, например бинарный (метод деления пополам), обозначим через l левую границу поиска, через r-правую, через Sr индекс центрального элемента. Сравним k(заданный эл-т) с центральным элементом массива, если совпдают, то поиск завершён, если k>Sr, то берем диапазон поиска от Sr+1 до r, если k<Sr, то от l до Sr-1. Процесс повторяется до тех пор, пока не найдётся нужный элемент или диапазон не будет исчерпан
Сортировка одномерных массивов
-
Сортировка-размещение данных в порядке убывания или возрастания.
-
Метод выбора:
Алгоритм состоит в следующем. Среди элементов массива выбирается
наименьший и меняется местами с первым. Далее рассматриваются
элементы, начиная со второго, и наименьший из них меняется местами со
вторым элементом. Так продолжается N-1 раз. При последнем проходе
цикла при необходимости меняются местами предпоследний и последний
элементы массива.
-
Метод пузырька
Метод «пузырька» (или метод простого обмена) заключается в
сравнении пары соседних элементов и замене их местами, если первый
оказался больше второго. После этого сравнивается следующая пара и т.д.
При выполнении этой последовательности действий элементы с большими
значениями будут продвигаться (“всплывать” как пузырьки) в конец массива.
-
Метод простых вставок
Пусть существующие m из N элементов массива уже упорядочены, т.е.
mas*0+ ≤ mas*1+ ≤ … ≤ mas[m-1],
а элементы mas[m], mas[m+1+, …, mas[N-1+ не известны. Метод сортировки
вставкой применяется в тех случаях, когда массив надо заполнить так, чтобы
после вставки каждого нового элемента сохранилась его упорядоченность.
Для этого осуществляется поиск подходящего для вставки места в уже
заполненной части массива. Место для нового элемента освобождается
путем сдвига больших элементов к концу массива.
-
Описания методов взято из методички, на лекции она оттуда же давала описание
Многомерные массивы. Атрибуты, объявление, инициализация.
Двумерный массив соответствует математическому понятию прямоугольной матрицы.
-
В С++ двумерные массивы распологаются по строкам в памяти
-
Обьявление: тип идентификатор[размер1] [размер2]
-
Инициализация осуществляется по строкам, например int a[3][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
1,2,3,4,5 -1 строка
6,7,8,9,10 -2 строка
11,12,13,14,15 -3 строка
-
Обращение к элементам многомерного массива
-
Обращение: имя массива[индекс строки эл-та][индекс столбца эл-та]
Ввод-вывод элементов двумерного массива
-
Ввод элементов двумерного массива осуществляется с помощью вложенного цикла, где параметр внешнего цикла определяет индекс строки(столбца), а параметр внутреннего цикла определяет индекс столбца(строки)
Примеры обработки двумерных массивов
-
Вычисление суммы определённых элементов в матрице
Указатели и операции с адресами
-
Указатели-переменные, содержащие адреса других переменных. int *y
-
Т.к указатель-адрес переменной, то через него можно обращаться к этому объекту. &-унарная операция y=&x, операцию & можно применить только к переменным и элементам массива
-
* воспринимает свой операнд как адрес некоторого объекта и использует этот адрес для выборки содержимого z=*y , z-значение переменной, записанной по адресу y.
-
Указатели могут встречаться в выражениях, также их можно использовать как операнды в арифметических операциях, если y-указатель, то у—уменьшает его значение.
-
у-- -предыдущее значение, у++ -последующее, *y+m на m значений вперед, где m-целое число
-
Транслятор масштабирует приращение адреса в соответствии с типом в объявлении
Связь между указателями и массивами
-
Любое действие с массивами можно выполнять через указатели
int a[10];
int *y;
y=&a[0];
y+1-адрес последующего элемента
у-1-адрес предыдущего
y=&a[0] == y=a
-
*(a+i)-обращение к элементу массива
-
Указатель-это переменная, имя массива-константа, поэтому а=у, а++, z=&a использовать нельзя
-
Сравнивать указатели на разные массивы нельзя
-
Указатели на элементы одного массива можно вычитать, поолучится число элементов между объектами.
-
Можно осуществлять ввод-вывод с помощью указателей.
-
В С++ допускаются массивы-указатели char *b[5]; занимает на 1 байт больше памяти, внутри строки должно стоять “\” перед кавычками.
-
Имя двумерного массива является указателем на первую строку **a==a[0][0]
-
Обращение к элементу двумерного массива *(*(a+i)+j)==a[i][j]
Динамические массивы, оператор new
-
Динамический массив-массив, число элементов которого неизвестно изначально.
-
Память под динамические массивы выделяется с помощью оператора new(либо функции malloc)
int n=10;
int *a=new int[n];
-
double *b=(double*) malloc (n*sizof(double));
-
Под динамический массив выделяется столько памяти, сколько нужно для хранения величины типа int, величина n может быть переменной
-
Область действия динамического массива зависит от места описания указателя через который производится работа с массивами
-
Локальная переменная при выходе из блока теряется
-
Если переменная-указатель, то при выходе из блока, динамическая память перестаёт быть доступна, однако она не помечается, как свободная и не может быть использована в дальнейшем, это называется утечкой памяти и является распространённой ошибкой.
-
Ф-я malloc унаследована из библиотеки С, желательно использовать new
-
Динамические двумерные массивы: при выделении памяти сразу под весь массив, кол-во строк –самую левую размерность. можно задавать с помощью переменной, а кол-во столбцов с помощью константного выражения. После слова new записывается тип массива, затем его размерности в квадратных скобках
int n;
const int m=5;
cin>>n;
int (*a)[m]=mew int [n][m];
int **b=(int**) new int [n][m];
-
Для того, чтобы понять почему динамические массивы объявляются именно так, нужно разобраться в индексации: поскольку для доступа к элементу массива применяются 2 операции разадресации, переменная в которой хранится адрес начала массива должна быть указателем к указателю.
-
Более универсальный способ:
int nrow,ncol;
cout<<”Введите n, m”<<endl;
cin>>nrow>>ncol;
int **a=new int *[nrow]; //1
for (int i=0; i<nrow; i++) //2
a[i]=new int [ncol]; //3
В 1 объявляется переменная типа указатель на указатель на int и выделяется память под массив указателей на строки массива
В 2 организуется цикл для выделения памяти под каждую строку массива
В 3 каждому элементу массива указателя на строки присваивается адрес начала участка памяти, выделенной под строку двумерного массива
-
Схема динамической области памяти, выделяемой под массивы:
-


int **a
int *a [nrow];
