
- •1) Системы счисления. Перевод чисел из одной системы счисления в другую
- •4) Арифметические выражения. Приемы, используемые для минимизации вычислений: вынесение общих множителей за скобки, использование дополнительных переменных
- •5) Ввод чисел с клавиатуры и вывод чисел в окно программы, формат ввода и вывода.
- •6) Средства разработки программ разветвляющейся структуры. Условные и безусловные операторы перехода.
- •8) Рекурсия. Использование рекурсии для вычисления числа Фибоначчи.
- •9) Уточнение корней уравнений: метод простых итераций, метод половинного деления, метод касательных.
- •10)Организация программ со структурой вложенных циклов. Транспонирование матриц
- •11)Массивы. Сохранение результатов вычислений в массиве.
- •12)Метод сортировки массива вставками.
- •13) Метод прямого обмена (метод пузырька) и его модификация.
- •14) Метод прямого выбора и его модификации: сортировка методом поиска минимального/максимального элемента, сортировка методом поиска индекса
- •15) Указатели
- •16) Матрицы. Обработка матриц. Многомерные статические массивы.
- •17) Массивы указателей. Динамические массивы. Операции new, new [], delete, delete [], malloc, free.
- •18) Программирование с использованием подпрограмм. Объявление функций. Глобальные переменные. Передача параметров. Передача массивов в качестве параметров.
- •19) Рекурсивные функции.
- •20) Перегружаемые функции, параметры со значениями по умолчанию, функции с переменным числом параметров.
- •21) Указатели на функции, передача указателей на функции в качестве параметров.
- •22) Классы. Конструктор и деструктор. Квалификаторы прав доступа. Указатель this.
- •23) Перегрузка стандартных операций. Наследование классов.
- •24) Открытое наследование, полиморфизм классов. Виртуальные функции и абстрактные классы.
- •25) Шаблоны функций и классов.
- •26)Наследование классов. Множественное наследование. Виртуальные классы.
- •Приложение. Полный код программы по транспонированию матрицы.
14) Метод прямого выбора и его модификации: сортировка методом поиска минимального/максимального элемента, сортировка методом поиска индекса
Все описываемые далее методы следует рассматривать как частные варианты метода, известного под названием метод прямого выбора или сортировка посредством выбора. Общим для этих методов является нахождение (выбор) максимальных или минимальных элементов массива и размещение их в последовательных ячейках массива.
Сортировка методом поиска минимального элемента.
Суть этого метода (имея в виду выбранные ограничения для рассматриваемого нами числового примера) состоит в следующем. На первом шаге отыскивается и сохраняется в переменной, например, xmin минимальное число среди всех чисел массива и его индекс, сохраняемый в другой переменной, например, imin, а затем проводится обмен местами в массиве найденного минимального числа с нулевым элементом массива: x[imin]=x[0]; x[0]=xmin;.
В общем случае, на любом шаге i, i=0,1, 2, 3, …, n-2, отыскивается xmin - минимальное число среди ячеек массива с индексами от i до n-1 и его индекс imin, а затем проводится обмен местами в массиве найденного минимального числа с i-тым элементом массива: x[imin]=x[i]; x[i]=xmin;
Таким образом, внешний цикл должен выполняться n-1 раз, а число выполнений внутреннего цикла будет уменьшаться от n-1 до 1.
Сортировка методом поиска максимального элемента.
Этот метод отличается от предыдущего только тем, что отыскиваются максимальные элементы. При одинаковой организации циклов при реализации этих методов они дадут прямо противоположные результаты: если один приведёт к возрастанию чисел в массиве, то другой – убыванию, и наоборот.
Сортировка методом поиска индекса минимального элемента.
Этот метод отличается от метода поиска минимального элемента и его индекса тем, что внутренний цикл используется для поиска только индекса элемента, поэтому перестановки чисел в массиве на каждом шаге i, i=0,1, 2, …,n-2 придется выполнять с привлечением дополнительной переменной, например, r: r:=x[i]; x[i]:=x[imin]; x[imin]:=r;.
Сортировка методом поиска индекса максимального элемента.
Этот метод отличается от предыдущего только тем, что отыскиваются индекс максимального элемента. При одинаковой организации циклов при реализации этих методов они дадут прямо противоположные результаты: если один приведёт к возрастанию чисел в массиве, то другой – убыванию, и наоборот.
Исходный код функции:
void SelectionSort(int *input_data, int length) {
for (int i = 0; i < length - 1; i++) {
/* устанавливаем начальное значение минимального индекса */
int min_i = i;
/* находим индекс минимального элемента */
for (int j = i + 1; j < length; j++) {
if (input_data[j] < input_data[min_i]) {
min_i = j;
}
}
/* меняем значения местами */
int temp = input_data[i];
input_data[i] = input_data[min_i];
input_data[min_i] = temp;
}
}
15) Указатели
Указатель – переменная, значением которой является адрес ячейки памяти. То есть указатель ссылается на блок данных из области памяти, причём на самое его начало. Указатель может ссылаться на переменную или функцию. Для этого нужно знать адрес переменной или функции. Так вот, чтобы узнать адрес конкретной переменной в С++ существует унарная операция взятия адреса &. Такая операция извлекает адрес объявленных переменных, для того, чтобы его присвоить указателю.
Указатели используются для передачи по ссылке данных, что намного ускоряет процесс обработки этих данных (в том случае, если объём данных большой), так как их не надо копировать, как при передаче по значению, то есть, используя имя переменной. В основном указатели используются для организации динамического распределения памяти, например при объявлении массива, не надо будет его ограничивать в размере. Ведь программист заранее не может знать, какого размера нужен массив тому или иному пользователю, в таком случае используется динамическое выделение памяти под массив. Любой указатель необходимо объявить перед использованием, как и любую переменную.
Принцип объявления указателей такой же, как и принцип объявления переменных. Отличие заключается только в том, что перед именем ставится символ звёздочки *. Визуально указатели отличаются от переменных только одним символом. При объявлении указателей компилятор выделяет несколько байт памяти, в зависимости от типа данных отводимых для хранения некоторой информации в памяти. Чтобы получить значение, записанное в некоторой области, на которое ссылается указатель нужно воспользоваться операцией разыменования указателя *. Необходимо поставить звёздочку перед именем и получим доступ к значению указателя.
Указатели могут ссылаться на другие указатели. При этом в ячейках памяти, на которые будут ссылаться первые указатели, будут содержаться не значения, а адреса вторых указателей. Число символов * при объявлении указателя показывает порядок указателя. Чтобы получить доступ к значению, на которое ссылается указатель его необходимо разыменовывать соответствующее количество раз.