Скачать презентацию Программирование Часть 4 Структуры данных 4 Структурное Скачать презентацию Программирование Часть 4 Структуры данных 4 Структурное

4 Структуры данных.ppt

  • Количество слайдов: 175

Программирование Часть 4 Структуры данных Программирование Часть 4 Структуры данных

4. Структурное программирование 4. 5. Базовые структуры данных: структуры Программа = Структуры данных + 4. Структурное программирование 4. 5. Базовые структуры данных: структуры Программа = Структуры данных + Алгоритмы l l СТРУКТУРА ДАННЫХ – способ представления данных в программе для компьютера ПРОГРАММА - описание структур данных и алгоритма решения задачи на языке программирования, автоматически переводимое на язык машинных команд конкретной ЭВМ помощи транслятора (интерпретатора). Задача: Спроектировать структуру данных для представления в памяти компьютера информации о членах университетского коллектива.

4. Структурное программирование 4. 5. Базовые структуры данных: структуры l НАЧНЕМ С ДАННЫХ О 4. Структурное программирование 4. 5. Базовые структуры данных: структуры l НАЧНЕМ С ДАННЫХ О ЧЛЕНЕ УНИВЕРСИТЕТСКОГО КОЛЛЕКТИВА. ПОСТАВЛЕНА ЗАДАЧА ХРАНИТЬ И ОБРАБАТЫВАТЬ СЛЕДУЮЩУЮ ИНФОРМАЦИЮ О НЕМ: l Идентификационный номер (студенческого билета или удостоверения) Фамилия Имя Отчество Дата рождения Домашний адрес Дата зачисления (на работу или учебу) Должность Является ли членом профсоюза l l l l

4. Структурное программирование 4. 5. Базовые структуры данных: структуры l ВЫБЕРЕМ ТИПЫ ДАННЫХ И 4. Структурное программирование 4. 5. Базовые структуры данных: структуры l ВЫБЕРЕМ ТИПЫ ДАННЫХ И ИМЕНА ПЕРЕМЕННЫХ ДЛЯ ХРАНЕНИЯ ИНФОРМАЦИИ О КАЖДОМ ЧЕЛОВЕКЕ: l Идентификационный номер – int id Фамилия – char surname [80] Имя – char firstname [40] Отчество – char patronymic [60] Дата рождения – unsigned short birthyear, birthmonth, birthday Адрес – char address [80] Дата зачисления – unsigned short enteryear, entermonth, enterday Должность – char position [30] Является ли членом профсоюза – bool tradeunion l l l l

4. Структурное программирование 4. 5. Базовые структуры данных: структуры Структура – упорядоченное множество данных 4. Структурное программирование 4. 5. Базовые структуры данных: структуры Структура – упорядоченное множество данных различного типа, которые называются полями или членами структуры. l Доступ к полю структуры осуществляется по имени структуры и имени поля. l Поля структуры могут иметь любой тип (кроме void). l Структура может содержать только такие поля, длина которых известна компилятору в момент определения структуры. l Структурным типом данных или просто структурой называется тип, описывающий структуру. Синтаксис объявления структурного типа: struct Имя_структуры { Тип_ поля_1 Имя_поля 1; Тип_ поля_2 Имя_поля 2; … }; l

4. Структурное программирование 4. 5. Базовые структуры данных: структуры Примеры объявления структурных типов : 4. Структурное программирование 4. 5. Базовые структуры данных: структуры Примеры объявления структурных типов : struct Date { unsigned short year; unsigned short month; unsigned short day; }; struct Cmplx { double re; double im; }; struct Name { char surname [80]; char firstname [40]; char patronymic [60]; }; Обратите внимание: описание структуры заканчивается точкой с запятой

4. Структурное программирование 4. 5. Базовые структуры данных: структуры Размещение в памяти структурных типов 4. Структурное программирование 4. 5. Базовые структуры данных: структуры Размещение в памяти структурных типов : struct Date { unsigned short year; unsigned short month; unsigned short day; }; struct Cmplx { double re; double im; }; Внимание! Компилятор не гарантирует размещение элементов структуры в смежных ячейках памяти!

4. Структурное программирование 4. 5. Базовые структуры данных: структуры Объявление переменных структурного типа Имя_переменной; 4. Структурное программирование 4. 5. Базовые структуры данных: структуры Объявление переменных структурного типа Имя_переменной; Имя_типа Имя_переменной = {список значений}; Примеры объявления переменных структурных типов, Cmplx c 1, c 2, c 3; Date birth, enter, expel, graduate, death ; struct { double re; double im; } c 1, c 2, c 3; // Совмещение объявлений типа и переменных // в анонимной структуре

4. Структурное программирование 4. 5. Базовые структуры данных: структуры Примеры объявления переменных структурных типов 4. Структурное программирование 4. 5. Базовые структуры данных: структуры Примеры объявления переменных структурных типов с инициализацией Cmplx c 1 = {0, 0}; Date birth = {1991, 10, 7}, enter = {2009, 9 , 1}, graduate = {2014, 6, 30}; struct // Совмещение объявлений типа и переменных { double re; double im; } c 1={0, 0}, c 2={1, 0}, c 3={1, 0};

4. Структурное программирование 4. 5. Базовые структуры данных: структуры Доступ к элементам структуры: оператор. 4. Структурное программирование 4. 5. Базовые структуры данных: структуры Доступ к элементам структуры: оператор. (точка) Имя_переменной. Имя_поля birth. year = 2002; birth. month=12; c 1. re = 12. 5; c 1. im = -24; c 2. re = c 1. re*c 1. re + c 1. im*c 1. im; Присваивание переменных – структур одного типа : c 1=c 2; expel. year=enter. year;

4. Структурное программирование 4. 5. Базовые структуры данных: структуры Структуры могут: l объединять данные 4. Структурное программирование 4. 5. Базовые структуры данных: структуры Структуры могут: l объединять данные (поля) различных типов; l быть вложенными друг в друга struct Date { unsigned short year; unsigned short month; unsigned short day; }; struct Name { char surname [80]; char firstname [40]; char patronymic [60]; }; struct Member { int id; Name ownname; Date birth; char address [80]; Date enter; char position [30]; bool tradeunion; }; //"student", "teacher", "scientist" …

4. Структурное программирование 4. 5. Базовые структуры данных: структуры Рассмотрим работу с вложенными структурами 4. Структурное программирование 4. 5. Базовые структуры данных: структуры Рассмотрим работу с вложенными структурами struct Member { int id; Name ownname; Date birth; char address [80]; Date enter; char position [30]; bool tradeunion; }; Member stud 1 = {298678, “Сидорова”, “Анна”, “Ивановна”, 1991, 10, 7, “Минск, ул. Серова 23, кв. 1”, 2009, 9, 1, “student”, false}; Member prep 4 = {129639, {“Попкец”, “Павел”, “Петрович”}, {1980, 6, 1}, “Минск, ул. Казинца 75, кв. 12”, {2003, 3, 18}, “teacher”, true}; Member temp = stud 1; stud 1. cardno = 123456789; stud 1. ownname. surname = “Попкец”; stud 1. ownname. surname = prep 4. ownname. surname; prep 4=temp;

4. Структурное программирование 4. 5. Базовые структуры данных: структуры А как представить в памяти 4. Структурное программирование 4. 5. Базовые структуры данных: структуры А как представить в памяти информацию обо всех членах коллектива, например, факультета? Student stud 1, stud 2, stud 3, stud 4, stud 5, … stud 788, stud 789, stud 790;

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки l l l 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки l l l Массив – нумерованная последовательность данных одного типа, которые хранятся в непрерывной области памяти друг за другом. Члены последовательности данных называются элементами массива. Доступ к элементу массива производится путем указания имени массива и номера элемента. Нумерация элементов может выполняться одной или несколькими последовательностями целых чисел – индексными последовательностями. Если нумерация выполняется одной последовательностью говорят, что массив является одномерным, в противном случае – многомерным. Нумерация элементов массива всегда начинается с 0, а номер каждого следующего члена больше номера предыдущего на 1.

4. Структурное программирование 4. 5. Базовые структуры данных: структуры Размещение в памяти массивов: int 4. Структурное программирование 4. 5. Базовые структуры данных: структуры Размещение в памяти массивов: int b [10] 0 b 1 2 3 4 5 0, 0 x 0, 1 0, 2 0, 3 6 7 8 9 short x [2][4] 1, 0 1, 1 1, 2 1, 3 Внимание! Компилятор гарантирует размещение элементов массива в смежных ячейках памяти!

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Массив определяется: l 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Массив определяется: l именем (идентификатором); l количеством размерностей - числом номеров, необходимых для указания местонахождения элемента массива; l размером (диапазоном изменения индексов) по каждой размерности. Конфигурация массива фиксирована. l Все элементы массива принадлежат к одному и тому же типу данных. l Элементами массива могут быть как простые переменные любых типов, так и переменные составных типов (массивов, структур, строк и т. д. ). l В качестве индексов в С++ могут использоваться константы и переменные любых целых типов.

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Синтаксис описания одномерного 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Синтаксис описания одномерного массива Имя_типа_элемента Имя_массива [Размер]; Имя_типа_элемента Имя_массива [Размер] = {список значений}; Примеры описаний массивов float b[20] ; const int n=4; int a[n] = {5, 6, 7, 8}; 4 байта 5 6 7 8 a[1] a[2] a[3] a … a[0] …

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Примеры описаний массивов 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Примеры описаний массивов float x[20] = {0} ; Если список инициализации содержит меньше элементов, чем массив, оставшиеся элементы инициализируются значением 0. Если список содержит больше элементов, чем массив, компилятор генерирует сообщение об ошибке. double y [ ] = {5. 5, 6. 8, 8. 8, 9. 5, 10. 3} Если значения элементов перечисляются явно, размер массива можно не указывать (компилятор определит его по количеству элементов) 8 байтов 5. 5 6. 8 8. 8 9. 5 10. 3 y[1] y[2] y[3] y[4] y … y[0] …

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Операция индексирования Имя_массива 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Операция индексирования Имя_массива [Индекс]; Индекс – целочисленное выражение, значение которого изменяется между 0 и (Размер-1). Для переменной – индекса лучше выбирать тип целый со знаком, так контроль выхода значений индекса за допустимый диапазон не ведется. const int n=4; int a[n] = {5, 6, 7, 8}; int i = 3; a[1] = a[2]+a[i]-6; 5 9 7 8 a[1] a[2] a[3] a … a[0] …

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Задача. Написать программу, 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Задача. Написать программу, осуществляющую ввод, сложение, вычитание, скалярное умножение двух n-мерных векторов и вывод результатов. Структура данных для представления n-мерного вектора: одномерный массив размера n типа double. Расчетные формулы:

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Решение задачи: int 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Решение задачи: int main() { const int n=4; double a[n]={0}, b[n]={0}, res[n]={0}; cout << "Enter. . . " << endl; for (int i=1; i<=n; i++) { cout << endl << "a" << i << ": "; cin >> a[i-1]; cout << "b" << i << ": "; cin >> b[i-1]; } Если список инициализации содержит меньше значений, чем число элементов массива, оставшиеся элементы будут инициализированы 0

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Решение задачи: for 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Решение задачи: for (int i=1; i<=n; i++) res[i-1]=a[i-1]+b[i-1]; cout << endl << "a + b = ( "; for (int i=1; i<=n; i++) cout << res[i-1] << " "; cout << ")"; //Sum for (int i=1; i<=n; i++) res[i-1]=a[i-1]-b[i-1]; cout << endl << "a - b = ( "; for (int i=1; i<=n; i++) cout << res[i-1] << " "; cout << ")"; double r=0; for (int i=1; i<=n; i++) r+=a[i-1]*b[i-1]; cout << endl << "a * b = " << r; //Difference _getch(); return 0; }; //Product

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Задача (Решето Эратосфена). 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Задача (Решето Эратосфена). Найти простые числа, меньшие наперед заданного n. Идея алгоритма Эратосфена: из списка всех чисел от 2 до n последовательно вычеркивать числа, кратные уже известным простым числам. Основная структура данных программы: одномерный массив размера 2. . n типа boolean. Индексы массива соответствуют анализируемым числам. Элемент массива имеет значение true, если индекс этого элемента простое число.

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Алгоритм на псевдокоде 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Алгоритм на псевдокоде Данные. Максимальное анализируемое число n Массив, хранящий информацию, простым ли является значение индекса каждого элемента: bool erato [n] Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до n 3. 1. Если erato [ i ] == true , 3. 1. 1. Заменить на false значения элементов массива erato с индексами от i до n, кратными i 4. Вывести значения индексов элементов массива erato , принимающих значение true

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Оптимизируем и уточняем 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Оптимизируем и уточняем алгоритм на псевдокоде Данные. Максимальное анализируемое число n Массив, хранящий информацию, простым ли является значение индекса каждого элемента: bool erato [n] Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true , 3. 1. 1. Заменить на false значения элементов массива erato с индексами от i до n, равными i * j, где j изменяется от i до n 4. Вывести значения индексов элементов массива erato , принимающих значение true

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Уточняем алгоритм на 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Уточняем алгоритм на псевдокоде Данные. Максимальное анализируемое число n Массив, хранящий информацию, простым ли является значение индекса каждого элемента: bool erato [n+1] Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=2 j= erato[i] = true 1 1 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=2 j=2 erato[i] = true erato[4] = false 1 1 0 11 1 11 0 1 1 1 11 1 11 2 3 4 52 6 37 4 8 1 9 5 10 6 11 7 12 8 13 9 14 15 10 11 12 1613 17 14

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=2 j=3 erato[i] = true erato[6] = false 1 1 0 1 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=2 j=4 erato[i] = true erato[8] = false 1 1 1 0 1 1 1 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=2 j=5 erato[i] == true erato[10] = false 1 1 0 1 0 1 1 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=2 j=6 erato[i] == true erato[12] = false 1 1 0 1 0 1 0 1 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=2 j=7 erato[i] == true erato[14] = false 1 1 0 1 0 1 0 1 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=2 j=8 erato[i] == true erato[16] = false 1 1 0 1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=2 j=9 erato[i] == true i*j>n 1 1 0 1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=3 j=3 erato[i] == true erato[9] = false 1 1 0 1 0 0 0 1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=3 j=4 erato[i] == true erato[12] = false Повторное присваивание выгоднее проверки! 1 1 0 1 0 0 0 1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=3 j=5 erato[i] == true erato[15] = false 1 1 0 1 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=3 j=6 erato[i] == true i*j>n 1 1 0 1 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i=4 j= erato[i] == false 1 1 0 1 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Прокрутка алгоритма вручную Алгоритм. 1. Инициализировать константу n 2. Объявить массив erato и инициализировать его значениями true 3. Для всех i от 2 до целой части sqrt (n) 3. 1. Если erato [ i ] == true, для всех j от i до n выполнять 3. 1. 1. Если i*j > n выйти из цикла 3. 1. 2. erato [i*j] = false 4. Вывести значения индексов элементов массива erato , принимающих значение true i= j= 1 1 0 1 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Программа на С++ 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Программа на С++ int main() // sieve of Eratosthenes { const unsigned int n = 1000; const unsigned int size = n+1; bool erato [size]={0}; for (int i = 2; i <= n; i++) erato [i] = 1; for (int i = 2; i <= static_cast (sqrt(static_cast (n))); i++) { if (erato[i]) for (int j = i; j <= n; j++) { if (i*j > n)break; erato [i*j]=false; } } for(int i=2; i <= n; i++) if (erato[i]) cout << i << endl; _getch(); return 0; }

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Строки символов в 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Строки символов в С++ l В С++ есть несколько способов представления строк символов: l l l в виде одномерного массива символов (строки, завершающиеся нулевым байтом); в виде объекта класса string; другие способы в зависимости от реализации. Строки, завершающиеся нулевым байтом l Описываются как одномерный массив, каждый элемент которого имеет тип char. l Символы строки последовательно располагаются в элементах массива, начиная с нулевого. l В элемент массива, следующий за последним символом автоматически записывается элемент с ASCII кодом 0: ‘’

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Описание строк, завершающихся 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Описание строк, завершающихся нулевым байтом l Строка описывается как обычный массив символов char l Размер массива должен быть на 1 больше длины самой длинной строки, которую предполагается в этом массиве хранить char s[10] = “Hello”; H e l l 0 1 2 3 s Основные отличия строк от массивов: l l l 0 4 5 6 7 8 9 В процессе выполнения программы отслеживается текущая длина строки Строка в целом может быть проинициализирована значением строкового литерала (а не только поэлементно символьными значениями) При помещении идентификатора символьного массива в поток cout выводится не адрес массива, а его содержимое от 0 -го элемента до последнего перед завершающим символом

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Самые распространенные функции 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Самые распространенные функции из Имя Предназначение strcpy (s 1, s 2) Копирует строку s 2 в строку s 1 strcat (s 1, s 2) Приписывает строку s 2 в конец строки s 1 strlen (s 1) Вычисляет текущую длину строки s 1 strcmp (s 1, s 2) Возвращает 0, если строки совпадают, отрицательное значение, если s 1 < s 2 и положительное, если s 1 > s 2 strchr (s 1, ch) Возвращает указатель на позицию первого вхождения символа ch в строку s 1 strstr (s 1, s 2) Возвращает указатель на позицию первого вхождения строки s 2 в строку s 1

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Примеры char st 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Примеры char st [20] = “ Good Morning”; G o o d 0 1 2 Мусор M o 3 r n i n g 5 7 8 9 10 11 12 4 6 13 14 15 16 17 18 19 cout << st; // Good Morning strcpy(st, “Hello”); H e l l 0 2 3 4 1 o o r 5 6 7 n i n g 8 9 10 11 12 13 14 15 16 17 18 19 cout << st; // Hello strcpy(st, “”); e l l o o r 0 1 2 3 4 5 6 7

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Основные ограничения на 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Основные ограничения на действия со строками, завершающимися нулевым байтом l Строки, как и обычные массивы, нельзя присваивать другу, используя оператор присваивания (включая присвоение строкового литерала где-либо, кроме начальной инициализации). l К строкам, как к обычным массивам, нельзя применять операции сравнения l Для строк нет перегруженных операций (например, + для операции конкатенации) l Для выполнения операций копирования, конкатенации, сравнения строк и ряда других операций приходится использовать встроенные функции, описанные в заголовке

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки int main() // 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки int main() // Basic operations with strings { char st [20] = "**********"; // 19 '*‘ char st 1 [20]; for (int i=0; i <=19; i++) cout << st[i]; // ********** cout << endl<< st << " " << strlen (st) << endl; // ********** 19 strcpy(st, "Good Morning"); for (int i=0; i <=19; i++) cout << st[i]; // Good Morning ****** cout << endl<< st << " " << strlen (st) << endl; // Good Morning 12 strcpy(st, "Hello"); for (int i=0; i <=19; i++) cout << st[i]; // Hello orning ****** cout << endl<< st << " " << strlen (st) << endl; // Hello 5 cout << endl; strcpy(st 1, strchr(st, 'e')); cout << st 1 << endl; // ello bool i = strchr(st, 'e'); cout << i << endl; // 1 if (strchr(st, 'e')) cout << "char e found"; // char e found _getch(); return 0; }

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Ввод строк l 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Ввод строк l При вводе строки с клавиатуры (помещение в поток cin) следует контролировать длину вводимой строки (чтобы она не превышала длину массива, где будет храниться строка char str [MAX]; cin >> setw (MAX) >> str; // Ввод до MAX-1 символов l При помещении строки в поток cin пробелы и символы новой строки конвертируются в завершающий нулевой байт cin >> setw (MAX) >> str; // Введем строку “Good Morning” cout << str; // Получим Good l Чтобы ввести строку, содержащую пробелы, необходимо вызвать встроенную функцию getline для потока cin: cin. getline(st, MAX); или char SEP=‘$’; cin. getline (st, MAX, SEP); // Задаем свой разделитель строк

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки int main() // 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки int main() // Counting number of characters into string { const int MAX = 80; // Maximum array dimension char buffer[MAX]=""; // Input buffer int count = 0; // Character counter while (true) { cout << "Enter a string of less than 80 characters: n"; cin. getline(buffer, MAX); if (! strcmp(buffer, "")) break; for(count=0; buffer[count] != ''; count++); // The same: count=strlen(buffer) cout << endl << "The string "" << buffer << "" has " << count << " characters. " << endl; } return 0; }

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Двумерные массивы Одномерный 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Двумерные массивы Одномерный массив int a[6]; a[0] a[1] a[2] a[3] a[4] a[5]

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Двумерные массивы Построим 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Двумерные массивы Построим массив, состоящий из четырех таких массивов int a[6]; 0 a[0] a[1] a[2] a[3] a[4] a[5] 1 a[0] a[1] a[2] a[3] a[4] a[5] 2 a[0] a[1] a[2] a[3] a[4] a[5] 3 a[0] a[1] a[2] a[3] a[4] a[5]

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Двумерные массивы Построим 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Двумерные массивы Построим массив, состоящий из четырех таких массивов int a[6]; Перенумеруем элементы, используя два индекса и соответственно опишем этот массив: int a[4][6] 0 a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] a[0][5] 1 a[1][0] a[1][1] a[1][2] a[1][3] a[1][4] a[1][5] 2 a[2][0] a[2][1] a[2][2] a[2][3] a[2][4] a[2][5] 3 a[3][0] a[3][1] a[3][2] a[3][3] a[3][4] a[3][5]

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Двумерные массивы Построим 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Двумерные массивы Построим массив, состоящий из четырех таких массивов int a[6]; Перенумеруем элементы, используя два индекса и соответственно опишем этот массив: int a[4][6] В памяти двумерный массив вытянут по строкам 0 a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] a[0][5] 1 a[1][0] a[1][1] a[1][2] a[1][3] a[1][4] a[1][5] 2 a[2][0] a[2][1] a[2][2] a[2][3] a[2][4] a[2][5] 3 a[3][0] a[3][1] a[3][2] a[3][3] a[3][4] a[3][5]

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки int main() // 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки int main() // How to initialize two-dimensional arrays { const int m=4, n =6; // maximum array dimensions int a[m][n] = {{0, 1, 2, 3, 4, 5}, {10, 11, 12, 13, 14, 15}, {20, 21, 22, 23, 24, 25}, {30, 31, 32, 33, 34, 35}}; int b[m][n] = {0, 1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 15}; // third & fourth rows are set to zero int d[m][n] = {0}; // the whole array is set to zero int c[][n]={{0, 1, 2, 3, 4, 5}, // first dimension’s size will be calculated by compiler {10, 11, 12, 13, 14, 15}, {20, 21, 22, 23, 24, 25}, {30, 31, 32, 33, 34, 35}}; }

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Задача Представить целочисленную 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Задача Представить целочисленную квадратную матрицу 4 х4 в виде массива. Присвоить элементам на главной диагонали значение 1, выше главной диагонали - 2, ниже – 0. a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[3][0] a[3][1] a[3][2] a[3][3] a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] a[1][0] a[1][1] a[1][2] a[1][3] a[1][4] a[2][0] a[2][1] a[2][2] a[2][3] a[2][4] a[3][0] a[3][1] a[3][2] a[3][3] a[3][4] a[4][0] a[4][1] a[4][2] a[4][3] a[4][4]

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки int main() // 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки int main() // working with two-dimensional arrays { 1 const int n=4; a[0][0] int a[n][n] = {0}; 2 a[0][1] 2 a[0][2] 2 a[0][3] 0 a[1][0] 1 a[1][1] 2 a[1][2] 2 a[1][3] 0 a[2][0] 0 a[2][1] 1 a[2][2] 1 a[2][3] 0 a[3][0] 0 a[3][1] 0 a[3][2] 1 a[3][3] for (int i=0; i<=n-1; i++) for (int j=0; j<=n-1; j++) { if (i == j) a[i][j]=1; else if (i < j) a[i][j]=2; } for (int i=0; i<=n-1; i++) { cout << endl; for (int j=0; j<=n-1; j++) cout << a[i][j]; } _getch(); return 0; } 1 2 2 2 0 1 2 2 0 0 1 2 0 0 0 1

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Многомерные массивы Трехмерный 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Многомерные массивы Трехмерный массив float x[2][3][4]; x[0][0][0] x[0][0][1] x[0][0][[2] x[0][0][3] x[0][1][0] x[0][1][1] x[0][1][2] x[0][1][3] x[0][2][[0] x[0][2][1] x[0][2][2] x[0][2][3] x[1][0][0] x[1][0][1] x[1][0][[2] x[1][0][3] x[1][1][0] x[1][1][1] x[1][1][2] x[1][1][3] x[1][2][[0] x[1][2][1] x[1][2][2] x[1][2][3]

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки int main() // 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки int main() // sets elements of 3 -D array to sin (i+j*k) { const int l=1, m=2, n=3; float x[l+1][m+1][n+1] = {0}; for (int i=0; i<=l; i++) for (int j=0; j<=m; j++) for (int k=0; k<=n; k++) { x[i][j][k] = sin(static_cast (i+j*k)); cout << setw (10) << x [i][j][k]; if (k==n) cout << endl; if (k==n & j==m) cout << endl; } _getch(); return 0; }

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Массив структур struct 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Массив структур struct Member { int id; Name ownname; Date birth; char address [80]; Date enter; char position [30]; bool tradeunion; }; rfe[0] rfe[1] const int nmembers = 800 Member rfe [nmembers]; rfe[2] rfe[3] … rfe[799]

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки int main() //working 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки int main() //working with the array of members { struct Date {unsigned short year, month, day; }; struct Name { char surname [80]; char firstname [40]; char patronymic [60]; }; struct Member { int id; Name ownname; Date birth; char address [80]; Date enter; char position [30]; //"student", "teacher", "scientist" or smth. else bool tradeunion; };

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки const int nmembers 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки const int nmembers = 800; Member rfe [nmembers]; //init array rfe Date initdate = {1900, 1, 1}; for (int i = 0; i < nmembers; i++) { rfe[i]. id=0; strcpy(rfe[i]. ownname. surname, ""); strcpy(rfe[i]. ownname. firstname, ""); strcpy(rfe[i]. ownname. patronymic, ""); rfe[i]. birth=initdate; rfe[i]. enter=initdate; strcpy (rfe[i]. position, "student"); rfe[i]. tradeunion=false; }

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки //. . . 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки //. . . rfe[120]. id = 123456; strcpy(rfe[120]. ownname. surname, "Poupkin"); // let's admit all students to the trade union for (int i = 0; i < nmembers; i++) if (rfe[i]. position == "student") rfe[i]. tradeunion = true; //let's print surname for the student with card no 123456 for (int i = 0; i < nmembers; i++) if (rfe[i]. id == 123456) cout << i << " " << rfe[i]. id << " " << rfe[i]. ownname. surname; _getch(); return 0; }

4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Инструкция typedef Позволяет 4. Структурное программирование 4. 6. Базовые структуры данных: массивы и строки Инструкция typedef Позволяет назначить синоним некоторому типу данных. Синтаксис инструкции typedef Декларация_Типа Синоним; Например , typedef double My. Float; const int nmembers = 800; typedef Member Array_members [nstudents]; Array_members rfe; … Array_memebers humanoids;

4. Структурное программирование 4. 7. Сортировка массивов Сортировка - процесс перестановки заданного множества нумерованных 4. Структурное программирование 4. 7. Сортировка массивов Сортировка - процесс перестановки заданного множества нумерованных объектов в определенном порядке. Цель сортировки - облегчить последующий поиск элементов в отсортированном множестве. Две категории методов сортировки: - сортировка массивов - сортировка файлов a 1, a 2, … an ak 1, ak 2, … akn f(ak 1) f(ak 2) f(ak 3) … f(akn) struct item // typical element of array to be sorted { int key; … // specification of other members of the structure } const n=10; typedef item t_array [n];

4. Структурное программирование 4. 7. Сортировка массивов Принципы построения алгоритмов сортировки массивов: • сортировка 4. Структурное программирование 4. 7. Сортировка массивов Принципы построения алгоритмов сортировки массивов: • сортировка на месте • произвольный доступ к элементам Базовые алгоритмы сортировки массивов: сортировка вставкой (включениями) сортировка выбором (выделением) сортировка обменом (метод «пузырька» ) Базовые операции: - пересылки (присваивания) - сравнения

4. Структурное программирование 4. 7. Сортировка массивов Пусть все рассматриваемые программы начинаются так: int 4. Структурное программирование 4. 7. Сортировка массивов Пусть все рассматриваемые программы начинаются так: int main() // The beginning of all arrays’ sorting programs { struct item { unsigned int key; // add members you want }; const int n=9; // right boundary of the array to be sorted typedef item t_array [n+1]; t_array s; srand( static_cast (time(NULL))); for (int i=0; i<=n; i++) s[i]. key = rand()%33; for (int i=0; i<=n; i++) cout << setw (4) << s[i]. key; … }

4. Структурное программирование 4. 7. Сортировка массивов Алгоритм сортировки вставкой массива [0…n]: 1. Для 4. Структурное программирование 4. 7. Сортировка массивов Алгоритм сортировки вставкой массива [0…n]: 1. Для всех i от 1 до n выполнить: 1. 1. Взять очередной i-й неотсортированный элемент и сохранить его в рабочей переменной 1. 2. Найти позицию j в отсортированной (0…i-1) части массива, в которой присутствие взятого элемента не нарушит упорядоченности элементов 1. 3. Сдвиг элементов массива от i-1 до j-1 вправо, чтобы освободить найденную позицию вставки 1. 4. Вставка взятого элемента в найденную j-ю позицию.

4. Структурное программирование 4. 7. Сортировка массивов Сортировка вставкой : 1 -й проход 3 4. Структурное программирование 4. 7. Сортировка массивов Сортировка вставкой : 1 -й проход 3 work 12 3 7 1 8 0 0 1 2 3 4 5 j=0 i=1

4. Структурное программирование 4. 7. Сортировка массивов Сортировка вставкой : 1 -й проход 3 4. Структурное программирование 4. 7. Сортировка массивов Сортировка вставкой : 1 -й проход 3 work 12 12 7 1 8 0 0 1 2 3 4 5 j=0 i=1

4. Структурное программирование 4. 7. Сортировка массивов Сортировка вставкой : 1 -й проход 3 4. Структурное программирование 4. 7. Сортировка массивов Сортировка вставкой : 1 -й проход 3 work 3 12 7 1 8 0 0 1 2 3 4 5 j=0 i=1

4. Структурное программирование 4. 7. Сортировка массивов Сортировка вставкой : 2 -й проход 7 4. Структурное программирование 4. 7. Сортировка массивов Сортировка вставкой : 2 -й проход 7 work 3 12 7 1 8 0 0 1 2 3 4 5 j=1 i=2

4. Структурное программирование 4. 7. Сортировка массивов Сортировка вставкой : 2 -й проход 7 4. Структурное программирование 4. 7. Сортировка массивов Сортировка вставкой : 2 -й проход 7 work 3 12 12 1 8 0 0 1 2 3 4 5 j=1 i=2

4. Структурное программирование 4. 7. Сортировка массивов Сортировка вставкой : 2 -й проход 7 4. Структурное программирование 4. 7. Сортировка массивов Сортировка вставкой : 2 -й проход 7 work 3 7 12 1 8 0 0 1 2 3 4 5 j=1 i=2

4. Структурное программирование 4. 7. Сортировка массивов Сортировка вставкой : 3 -й проход 1 4. Структурное программирование 4. 7. Сортировка массивов Сортировка вставкой : 3 -й проход 1 work 3 7 12 1 8 0 0 1 2 3 4 5 j=0 i=3

4. Структурное программирование 4. 7. Сортировка массивов Сортировка вставкой : 3 -й проход 1 4. Структурное программирование 4. 7. Сортировка массивов Сортировка вставкой : 3 -й проход 1 work 3 3 7 12 8 0 0 1 2 3 4 5 j=0 i=3

4. Структурное программирование 4. 7. Сортировка массивов Сортировка вставкой : 3 -й проход 1 4. Структурное программирование 4. 7. Сортировка массивов Сортировка вставкой : 3 -й проход 1 work 1 3 7 12 8 0 0 1 2 3 4 5 j=0 i=3

4. Структурное программирование 4. 7. Сортировка массивов Простейшая программа сортировки вставкой: int main() { 4. Структурное программирование 4. 7. Сортировка массивов Простейшая программа сортировки вставкой: int main() { … item work; int i=0, j=0, k=0; for(i=1; i<=n; i++) { work=s[i]; // taking first non-sorted element for (j=i-1; work. key < s [j]. key; j++); // search insert position for (k=i-1; k>=j; k--) s[k+1]=s[k]; //shift s[j]=work; // insert } cout << endl; for (int i=0; i<=n; i++) cout << setw (4) << s[i]. key; _getch(); return 0; }

4. Структурное программирование 4. 7. Сортировка массивов Оптимизированная программа сортировки вставкой: int main() { 4. Структурное программирование 4. 7. Сортировка массивов Оптимизированная программа сортировки вставкой: int main() { … item work; int i=0, j=0; for(i=1; i<=n; i++) { work=s[i]; // taking first non-sorted element for (j = i-1; (work. key < s[j]. key) && (j >= 0) ; j--) s[j+1] = s[j]; s[j+1]=work; // insert } cout << endl; for (int i=0; i<=n; i++) cout << setw (4) << s[i]. key; _getch(); } //search & shift

4. Структурное программирование 4. 7. Сортировка массивов Алгоритм сортировки выбором массива [0…n] 1. Для 4. Структурное программирование 4. 7. Сортировка массивов Алгоритм сортировки выбором массива [0…n] 1. Для всех i от 0 до n выполнять: 1. 1. Найти в части массива от i-го до n-го элемента элемент с минимальным значением ключа и поменять его местами с i-м элементом.

4. Структурное программирование 4. 7. Сортировка массивов Сортировка выбором : 1 -й проход 0 4. Структурное программирование 4. 7. Сортировка массивов Сортировка выбором : 1 -й проход 0 min 12 3 7 1 8 0 0 1 2 3 4 5 i=0 j=5

4. Структурное программирование 4. 7. Сортировка массивов Сортировка выбором : 1 -й проход 0 4. Структурное программирование 4. 7. Сортировка массивов Сортировка выбором : 1 -й проход 0 min 0 3 7 1 8 12 0 1 2 3 4 5 i=0 j=5

4. Структурное программирование 4. 7. Сортировка массивов Сортировка выбором : 2 -й проход 1 4. Структурное программирование 4. 7. Сортировка массивов Сортировка выбором : 2 -й проход 1 min 0 3 7 1 8 12 0 1 2 3 4 5 i=1 j=3

4. Структурное программирование 4. 7. Сортировка массивов Сортировка выбором : 2 -й проход 1 4. Структурное программирование 4. 7. Сортировка массивов Сортировка выбором : 2 -й проход 1 min 0 1 7 3 8 12 0 1 2 3 4 5 i=1 j=3

4. Структурное программирование 4. 7. Сортировка массивов Программа сортировки выбором int main() { … 4. Структурное программирование 4. 7. Сортировка массивов Программа сортировки выбором int main() { … item min; int imin=0, i=0, j=0; for (i=0; i<=n-1; i++) { for (j = i+1, min = s[i], imin = i; j <= n; j++) // search min element if (s[j]. key < min. key) { min = s[j]; imin = j; } s[imin]=s[i]; s[i]=min; //change elements } … return 0; }

4. Структурное программирование 4. 7. Сортировка массивов Алгоритм сортировки обменом (метод «пузырька» ) 1. 4. Структурное программирование 4. 7. Сортировка массивов Алгоритм сортировки обменом (метод «пузырька» ) 1. Для всех k от n до 1 выполнять : 1. 1. Слева направо поочередно сравнивать два соседних элемента и если их взаиморасположение не соответствует заданному условию упорядоченности, то менять их местами.

4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 1 -й проход 12 3 4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 1 -й проход 12 3 7 1 8 4 0 1 2 3 4 5 i=0 i +1= 1 k=5

4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 1 -й проход 3 12 4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 1 -й проход 3 12 7 1 8 4 0 1 2 3 4 5 i=1 i +1= 2 k=5

4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 1 -й проход 3 7 4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 1 -й проход 3 7 12 1 8 4 0 1 2 3 4 5 i=2 i +1= 3 k=5

4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 1 -й проход 3 7 4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 1 -й проход 3 7 1 12 8 4 0 1 2 3 4 5 i=3 i +1= 4 k=5

4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 1 -й проход 3 7 4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 1 -й проход 3 7 1 8 12 4 0 1 2 3 4 5 i=4 k=5 i +1= 5

4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 2 -й проход 3 7 4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 2 -й проход 3 7 1 8 4 12 0 1 2 3 4 5 i=0 i +1= 1 k=4

4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 2 -й проход 3 7 4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 2 -й проход 3 7 1 8 4 12 0 1 2 3 4 5 i=1 i +1= 2 k=4

4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 2 -й проход 3 1 4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 2 -й проход 3 1 7 8 4 12 0 1 2 3 4 5 i=2 i +1= 3 k=4

4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 2 -й проход 3 1 4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 2 -й проход 3 1 7 8 4 12 0 1 2 3 4 5 i=3 k=4 i +1= 4

4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 3 -й проход 3 1 4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 3 -й проход 3 1 7 4 8 12 0 1 2 3 4 5 i=0 i +1= 1 k=3

4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 3 -й проход 1 3 4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 3 -й проход 1 3 7 4 8 12 0 1 2 3 4 5 i=1 i +1= 2 k=3

4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 3 -й проход 1 3 4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 3 -й проход 1 3 7 4 8 12 0 1 2 3 4 5 i=2 k=3 i +1= 3

4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 4 -й проход ? 1 4. Структурное программирование 4. 7. Сортировка массивов Сортировка обменом: 4 -й проход ? 1 3 4 7 8 12 0 1 2 3 4 5 i=0 i +1= 1 k=3

4. Структурное программирование 4. 7. Сортировка массивов Программа сортировки методом пузырька int main() { 4. Структурное программирование 4. 7. Сортировка массивов Программа сортировки методом пузырька int main() { … item work; for (int k=n; k>=1; k--) for (int i=0; i<=k-1; i++) if (s[i]. key > s[i+1]. key) { work=s[i]; s[i]=s[i+1]; s[i+1]=work; } … return 0; }

4. Структурное программирование 4. 7. Сортировка массивов Усовершенствованный метод пузырька int main() { … 4. Структурное программирование 4. 7. Сортировка массивов Усовершенствованный метод пузырька int main() { … item work; bool flag = true; for (int k=n; (k>=1) && flag; k--) { flag=false; for (int i=0; i<=k-1; i++) if ( s[i]. key > s[i+1]. key ) { work=s[i]; s[i]=s[i+1]; s[i+1]=work; flag=true; } } return 0 }

4. Структурное программирование 4. 7. Сортировка массивов Вычислительная сложность алгоритмов сортировки массивов 1. Сортировка 4. Структурное программирование 4. 7. Сортировка массивов Вычислительная сложность алгоритмов сортировки массивов 1. Сортировка вставкой for(i=1; i<=n; i++) { work=s[i]; // taking first non-sorted element for (j = i-1; (work. key < s[j]. key) && (j >= 0) ; j--) s[j+1] = s[j]; //search & shift s[j+1]=work; // insert } Число сравнений при i-м просеивании Ci = 1 i-1, в среднем Ci= i/2 Число присваиваний (пересылок) M i = (C i -1)+2 = = C i +1 Cmin= n = N-1 (где N – размер массива) M min= 2*n = 2*(N-1)

4. Структурное программирование 4. 7. Сортировка массивов Cmin= N-1 M min= 2*(N-1) N-1 Число 4. Структурное программирование 4. 7. Сортировка массивов Cmin= N-1 M min= 2*(N-1) N-1 Число сравнений при i-м просеивании Ci = 1 i-1, в среднем Ci= i/2 Число присваиваний (пересылок) M i = (C i -1)+2 = = C i +1 Cmin= n = N-1 (где N – размер массива) M min= 2*n = 2*(N-1) Cср= i/2 = (1/2+1/2(N-1))*(N-1)/2= ¼(N 2 -N) Mср= (i/2+2) = (5/2 + ½(N-1)+2)*(N-1) / 2 = ¼(N 2+7 N-16) Cmax= (i-1) = (0 + N-1)*(N - 1) / 2 = ½ (N 2 -N) i=1 N-1 Mmax= (i+1) = (2 + N-1)*(N - 1) / 2 = ½(N 2 -1) i=1

4. Структурное программирование 4. 7. Сортировка массивов 2. Сортировка выбором Число сравнений не зависит 4. Структурное программирование 4. 7. Сортировка массивов 2. Сортировка выбором Число сравнений не зависит от начального порядка ключей C = ½ (n 2 -n) M ср= n(ln n + ), =0, 577216… 3. Сортировка обменом (метод «пузырька» ) Число сравнений не зависит от начального порядка ключей C = ½ (n 2 -n) M ср= ¾ (n 2 -n)

4. Структурное программирование 4. 7. Сортировка массивов Алгоритм бинарного поиска в массиве размера n+1 4. Структурное программирование 4. 7. Сортировка массивов Алгоритм бинарного поиска в массиве размера n+1 1. Положить left=0, right=n; 2. Пока left < right выполнять 3. 1. Найти индекс среднего элемента в массиве mid = (left+right)/2 3. 2. Если для элемента массива с индексом mid значение ключа > искомого, положить right =mid-1, иначе если значение ключа < искомого, положить left = mid+1, иначе выйти из цикла (элемент с индексом mid найден); 3. Если значение ключа элемента с индексом mid совпадает с заданным, поиск успешен, иначе – искомого элемента в массиве нет.

4. Структурное программирование 4. 7. Сортировка массивов int main() // Binary search in array 4. Структурное программирование 4. 7. Сортировка массивов int main() // Binary search in array { struct item { unsigned int key; // add members you want }; const int n=9; // right boundary of the array typedef item t_array [n+1]; t_array s; unsigned int key_to_find=0; for (int i=0; i<=n; i++) s[i]. key = i+10; for (int i=0; i<=n; i++) cout << setw (4) << s[i]. key;

4. Структурное программирование 4. 7. Сортировка массивов cout << 4. Структурное программирование 4. 7. Сортировка массивов cout << "n. Enter your value of key: "; cin >> key_to_find; int left = 0, right = n, mid = 0; while (left <= right) { mid = (left+right)/2; if (s[mid]. key > key_to_find) right = mid-1; else if (s[mid]. key < key_to_find)left = mid+1; else break; } if (s[mid]. key == key_to_find) cout << "n. OK, element no " << mid; else cout << "n. There is no element with required value of key"; cout << endl; _getch(); } return 0;

4. Структурное программирование 4. 8. Указатели Что такое указатели l l Каждый байт в 4. Структурное программирование 4. 8. Указатели Что такое указатели l l Каждый байт в памяти ЭВМ имеет адрес по которому можно обратиться к определенному элементу данных Указатель – это переменная, которая сохраняет адрес другой переменной определенного типа. l l l Содержимое указателя содержит адрес, начиная с которого размещается переменная, на которую ссылается указатель. По описанию указателя компилятор получает информацию о том, какова длина области памяти, на которую ссылается указатель (которую занимает переменная, на которую он ссылается) и о том, как интерпретировать данные в этой области памяти. Таким образом, переменная-указатель обладает именем и имеет тип, определяющий на какого рода данные она может ссылаться.

4. Структурное программирование 4. 8. Указатели Объявление указателя: int k = 0; short j=0; 4. Структурное программирование 4. 8. Указатели Объявление указателя: int k = 0; short j=0; int *p_i = NULL; Базовый_тип *Имя_Указателя; 2 байта NULL 0013 FF 50 p_i 0013 FF 52 0 0013 FF 54 0013 FF 56 k 0 0013 FF 58 0013 FF 5 A j

4. Структурное программирование 4. 8. Указатели Операция взятия адреса: &Имя_Переменной p_i = &k 0013 4. Структурное программирование 4. 8. Указатели Операция взятия адреса: &Имя_Переменной p_i = &k 0013 FF 56 0013 FF 50 p_i 0013 FF 52 0 0013 FF 54 0013 FF 56 k 0 0013 FF 58 0013 FF 5 A j

4. Структурное программирование 4. 8. Указатели Операция взятия адреса нельзя p_i = &j; (p_i 4. Структурное программирование 4. 8. Указатели Операция взятия адреса нельзя p_i = &j; (p_i – указатель на int, a j объявлена как short) 0013 FF 56 0013 FF 50 p_i 0013 FF 52 0 0013 FF 54 0013 FF 56 k 0 0013 FF 58 0013 FF 5 A j

4. Структурное программирование 4. 8. Указатели *Имя_Указателя Операция разыменования: *p_i = 123; // k 4. Структурное программирование 4. 8. Указатели *Имя_Указателя Операция разыменования: *p_i = 123; // k = 123 0013 FF 56 0013 FF 50 p_i 0013 FF 52 123 0013 FF 54 0013 FF 56 k 0 0013 FF 58 0013 FF 5 A j

4. Структурное программирование 4. 8. Указатели Операция разыменования j = *p_i; // j = 4. Структурное программирование 4. 8. Указатели Операция разыменования j = *p_i; // j = k 0013 FF 56 0013 FF 50 p_i 0013 FF 52 123 0013 FF 54 0013 FF 56 k 123 0013 FF 58 0013 FF 5 A j

4. Структурное программирование 4. 8. Указатели Операция взятия адреса: как размещаются в памяти переменные 4. Структурное программирование 4. 8. Указатели Операция взятия адреса: как размещаются в памяти переменные и элементы массивов int main() { short c 1 = '1', c 2 = '2', c 3 = '3'; short c 4[3] = {1, 2, 3}; Debug Mode cout << &c 1 << endl; // 0013 FF 5 С cout << &c 2 << endl; // 0013 FF 50 cout << &c 3 << endl; // 0013 FF 44 cout << endl; cout << &c 4[1] << endl; // 0013 FF 36 cout << &c 4[2] << endl; // 0013 FF 38 cout << &c 4[3] << endl; // 0013 FF 40 return 0; } 12 байт между адресами переменных 2 байта между адресами элементов массива, строго упорядочены

4. Структурное программирование 4. 8. Указатели Операция взятия адреса: как размещаются в памяти переменные 4. Структурное программирование 4. 8. Указатели Операция взятия адреса: как размещаются в памяти переменные и элементы массивов int main() { short c 1 = '1', c 2 = '2', c 3 = '3'; short c 4[3] = {1, 2, 3}; Release Mode cout << &c 1 << endl; // 0013 FF 70 cout << &c 2 << endl; // 0013 FF 68 cout << &c 3 << endl; // 0013 FF 6 C cout << endl; cout << &c 4[1] << endl; // 0013 FF 76 cout << &c 4[2] << endl; // 0013 FF 78 cout << &c 4[3] << endl; // 0013 FF 7 A return 0; } 2 байта между адресами переменных, неупорядочены 2 байта между адресами элементов массива, строго упорядочены

4. Структурное программирование 4. 8. Указатели Особенности синтаксиса объявления указателей l Первый способ записи: 4. Структурное программирование 4. 8. Указатели Особенности синтаксиса объявления указателей l Первый способ записи: Базовый_тип *Имя_Указателя; Нет проблем с объявлением нескольких указателей: int *pa, *pb, *pc; l Второй способ записи: Базовый_тип* Имя_Указателя; Позволяет идентифицировать тип «указатель на базовый тип» как Базовый_тип*. Однако , эта форма записи вызывает проблемы при множественном объявлении перемненых: int* pa, ib, ic; Во избежание путаницы, если Вы придерживаетесь второго способа, никогда не декларируйте в одном инструкции более одной (указательной) переменной. l В качестве базового типа можно указать void: void *p; l Указатель на void не может быть разыменован

4. Структурное программирование 4. 8. Указатели Инициализация указателей Указатель можно инициализировать адресом переменной, которая 4. Структурное программирование 4. 8. Указатели Инициализация указателей Указатель можно инициализировать адресом переменной, которая уже определена: double dvar = 0. 0; double *pvar = &dvar; l Инициализация значением NULL гарантирует, что указатель не содержит адреса, который воспринимается как корректный, а значение можно проверить в инструкции if : int *pinteger = NULL; if (pinteger == NULL) cout << “pinteger is null”; l равнозначная альтернатива инициализировать указатель 0: int *pinteger = 0; if (!pinteger) cout << “pinteger is null”; l

4. Структурное программирование 4. 8. Указатели Присваивание указателей. Неявное приведение типов. int main() { 4. Структурное программирование 4. 8. Указатели Присваивание указателей. Неявное приведение типов. int main() { int x=0; int *pi_1=NULL, *pi_2=NULL; double *pd_1=NULL; void *pv_1=NULL; pi_1 = &x; pi_2 = pi_1; // pd_1=pi_1; prohibited !!! pv_1=pi_1; // pi_2=pv_1; prohibited !!! return 0 }

4. Структурное программирование 4. 8. Указатели Присваивание указателей. Явное приведение типов int main() { 4. Структурное программирование 4. 8. Указатели Присваивание указателей. Явное приведение типов int main() { int x=123; int *pi_1=NULL; float *pf_1=NULL; double *pd_1=NULL; Используйте reinterpret_cast только по большой нужде!!! pi_1 = &x; cout << pi_1 << " " << *pi_1 << endl; // 0013 FF 60 123 pf_1=reinterpret_cast (pi_1); cout << pf_1 << " " << *pf_1 << endl; // 0013 FF 60 1. 7236 e-043 pd_1=reinterpret_cast (pi_1); cout << pd_1 << " " << *pd_1 << endl; // 0013 FF 60 -9. 25596 e+061 return 0 }

4. Структурное программирование 4. 8. Указатели Явное приведение типов. Почти катастрофа. short c 1=1, 4. Структурное программирование 4. 8. Указатели Явное приведение типов. Почти катастрофа. short c 1=1, c 2=2, c 3=3; double *pf = reinterpret_cast (&c 1); *pf = 12345 e 99; 0013 FF 34 0013 FF 30 pf 0013 FF 32 1 0013 FF 34 c 1 3 0013 FF 36 0013 FF 38 c 3 2 0013 FF 3 A 0013 FF 3 C c 2 0013 FF 3 E

4. Структурное программирование 4. 8. Указатели Явное приведение типов. Почти катастрофа. short c 1=1, 4. Структурное программирование 4. 8. Указатели Явное приведение типов. Почти катастрофа. short c 1=1, c 2=2, c 3=3; double *pf = reinterpret_cast (&c 1); *pf = 12345 e 99; 0013 FF 34 0013 FF 30 pf 0013 FF 32 1. 2345 e 103 0013 FF 34 c 1 0013 FF 36 0013 FF 38 c 3 2 0013 FF 3 A 0013 FF 3 C c 2 0013 FF 3 E

4. Структурное программирование 4. 8. Указатели Явное приведение типов. Почти катастрофа. int main() { 4. Структурное программирование 4. 8. Указатели Явное приведение типов. Почти катастрофа. int main() { short c 1=1, c 2=2, c 3=3; double *pf = reinterpret_cast (&c 1); cout << &c 1 << endl; cout << &c 2 << endl; cout << &c 3 << endl; cout << c 1 << c 2 << c 3 << endl; *pf = 12345 e 99; cout << *pf << endl; cout << c 1 << c 2 << c 3 << endl; _getch(); return 0; } // 0013 FF 34 // 0013 FF 3 C // 0013 FF 38 // 1 2 3 // 1. 2345 e 103 // 30764 2 3090

4. Структурное программирование 4. 8. Указатели Адресная арифметика l l l К указателям можно 4. Структурное программирование 4. 8. Указатели Адресная арифметика l l l К указателям можно применять только две арифметические операции: сложения и вычитания. При добавлении к указателю целого числа N значение указателя увеличивается на N*L, где L – длина базового типа на котороый ссылается указатель. При вычитании N значение указателя уменьшается на N*L. (Говоря другими словами, мы смещаемся в памяти на N длин элементов базового типа. Указатели можно вычитать. Результатом вычитания является количество объектов базового типа, которые можно расположить между указателями. Нельзя производить вычитание разнотипных указателей. Нельзя складывать указатели Использовать арифметику указателей, как правило, имеет смысл только применительно к элементам массивов

4. Структурное программирование 4. 8. Указатели Адресная арифметика: пример с одномерным массивом 0013 FF 4. Структурное программирование 4. 8. Указатели Адресная арифметика: пример с одномерным массивом 0013 FF 60 p F 5 D F 5 E F 5 F 1 4 9 16 25 K[0] F 5 С 0 K[1] k[2] k[3] K[4] K[5] F 60 F 61 F 62 F 63 F 64 F 65 F 66 F 67 F 68 F 69 F 6 A F 6 B F 72 F 73 F 74 k Исходное состояние: 36 49 64 k[6] K[7] K[8] F 6 C F 6 D F 6 E F 6 F F 70 F 71 short k [10] = {0}; short *p = k; // pointer to the first element, the same like *p=&k[0] for (int i=0; i<=8; i++) k[i]= i*i; cout << &p << endl; // 0013 FF 5 C where the pointer p is placed cout << k << " " << &k << " " << p << endl; //0013 FF 60 cout << *k << " " <<*p << endl; // 0 0

4. Структурное программирование 4. 8. Указатели Адресная арифметика: пример с одномерным массивом 0013 FF 4. Структурное программирование 4. 8. Указатели Адресная арифметика: пример с одномерным массивом 0013 FF 64 p F 5 D F 5 E F 5 F 1 4 9 16 25 k[0] F 5 С 0 k[1] k[2] k[3] k[4] k[5] F 60 F 61 k Исходное состояние: F 62 F 63 F 64 F 65 F 66 F 67 F 68 F 69 F 6 A F 6 B F 72 F 73 F 74 k+3 36 49 64 K[6] K[7] K[8] F 6 C F 6 D F 6 E F 6 F F 70 p+=3; // k++; prohibited: can’t change address of array cout << k+3 <<" "<< p << endl; // 0013 FF 66 //0013 FF 66 cout << *(k+3) << " " << *p; // 9 9 F 71

4. Структурное программирование 4. 8. Указатели Адресная арифметика: пример с одномерным массивом 0013 FF 4. Структурное программирование 4. 8. Указатели Адресная арифметика: пример с одномерным массивом 0013 FF 64 p F 5 D F 5 E F 5 F 1 4 9 16 25 k[1] F 5 С 0 k[2] k[3] k[4] k[5] k[6] F 60 F 61 F 62 F 63 F 64 F 65 F 66 F 67 F 68 F 69 F 6 A F 6 B F 72 F 73 F 74 k Исходное состояние: 36 49 64 k[7] k[8] k[9] F 6 C F 6 D F 6 E F 6 F F 70 F 71 cout << &k[6] - &k[2]; // 4 // cout << &p - & k[1]; prohibited: different basic types of pointers

4. Структурное программирование 4. 8. Указатели Сравнение указателей l l l Указатели можно сравнивать 4. Структурное программирование 4. 8. Указатели Сравнение указателей l l l Указатели можно сравнивать между собой. Как правило, указатели сравнивают, когда они ссылаются на один и тот же объект, например, массив. Сравнивать указатели, если их базовый тип различается, нельзя. Если это необходимо, следует воспользоваться операцией приведения типа reinterpret_cast. (Либо присвоить их значения указателям на void, что выглядит достаточно гнусно).

4. Структурное программирование 4. 8. Указатели и одномерные массивы По сути, объявляя массив, мы 4. Структурное программирование 4. 8. Указатели и одномерные массивы По сути, объявляя массив, мы объявляем имя массива как указатель на его первый элемент. Так, пусть объявлен массив m и указатель ps: short m [8]; short *ps; l Идентификатор m будет восприниматься как указатель на первый элемент, значение которого нельзя изменить (константный указатель). l C именем массива можно работать как с указателем на первый элемент: ps = m; cout << m << ps; // 0013 FEDC l

4. Структурное программирование 4. 8. Указатели и массивы : информация к размышлению int main() 4. Структурное программирование 4. 8. Указатели и массивы : информация к размышлению int main() { typedef int t_array_int [4]; t_array_int a={1, 2, 3, 4}, b={10, 20, 30, 40}; int *pint, *pint 1=NULL; t_array_int *parint=NULL; // // cout << "a= " << a << endl; pint=a; cout << "pint=a " << pint << endl; parint=a; prohibited!!! pint=&a; prohibited!!! parint=&a; cout<< "parint=&a " << parint << endl; parint=&pint; prohibited!!! cout << "*pint " << *pint << endl; cout << "*parint " << *parint << endl; cout << "**parint " << **parint << endl; a=b; prohibited !!! pint 1=b; pint=pint 1; cout << "pint " << pint << endl; cout << "*pint+2 " << *(pint+2); // 0013 FF 54 pointer to the first element // 0013 FF 54 pointer to the whole array // 1 // 0013 FF 54 // 1 // 0013 FF 3 C // 30

4. Структурное программирование 4. 8. Указатели и одномерные массивы l l Применяя к идентификатору 4. Структурное программирование 4. 8. Указатели и одномерные массивы l l Применяя к идентификатору одномерного массива операцию [n], мы смещаемся на n элементов относительно начала и разыменовываем полученный указатель на n-й элемент массива. То же можно сделать явно, используя адресную арифметику short a [8] = {10, 11, 12, 13, 14, 15, 16, 17}; cout << a [3]; // 13 cout << *(a+3); // 13 10 11 12 13 14 15 16 17 0 1 2 3 4 5 6 7 a[3] a[0] a a+3

4. Структурное программирование 4. 8. Указатели и многомерные массивы В случае многомерного массива смещение 4. Структурное программирование 4. 8. Указатели и многомерные массивы В случае многомерного массива смещение можно рассчитать вручную, учитывая, что в С++ многомерные массивы вытягиваются в памяти «по строкам» (вначале изменяется крайний правый индекс, потом второй справа и т. д. ). const int m=3, n=4; int ai [m][n] = { {0, 1, 2, 3}, {10, 11, 12, 13} , {20, 21, 22, 23} }; int *pi=&ai[0][0]; int i=2, j=2; cout << ai [i][j] << endl; // 22 cout << *(pi+(j+i*n)) << endl; // 22 l 0 1 2 3 10 11 12 13 20 21 22 23 [0][0] [0][1] [0][2] [0][3] [1][0] [1][1] [1][2] [1][3] [2][0] [2][1] [2][2] [2][3] ai[0][0] ai[2][2] pi+(j+i*n) pi

4. Структурное программирование 4. 8. Указатели и многомерные массивы Идентификатор многомерного массива трактуется как 4. Структурное программирование 4. 8. Указатели и многомерные массивы Идентификатор многомерного массива трактуется как указатель на массив (для двумерного массива - указатель на первую строку). Исходя из этого, можно поступить и иначе: l const int m=3, n=4; int ai [m][n] = { {0, 1, 2, 3}, {10, 11, 12, 13} , {20, 21, 22, 23} }; int i=2, j=2; cout << ai [i][j] << endl; cout << * (*(ai+i)+j) // 22 0 1 2 3 10 11 12 13 [0][0] [0][1] [0][2] [0][3] [1][0] [1][1] [1][2] [1][3] ai [2][0] [2][1] [2][2] k+i * (ai+i) *(ai+i)+j [2][3]

4. Структурное программирование 4. 8. Указатели Массивы указателей l Никто не мешает нам описать 4. Структурное программирование 4. 8. Указатели Массивы указателей l Никто не мешает нам описать не просто указатель на int, но и массив указателей на int: int * pparint [10]; int a=0; int b=1; pparint [1]=&a; pparint [2]=&b; *pparint[1]= *pparint[2]; cout << pparint[1] << pparint[2]; cout << *pparint[1] << *pparint[2];

4. Структурное программирование 4. 8. Указатели и строки Имя массива элементов типа char трактуется, 4. Структурное программирование 4. 8. Указатели и строки Имя массива элементов типа char трактуется, как и для любых других массивов как указатель на его первый (номер 0) элемент. l Особенность: в контексте программы имя массива типа char автоматически разыменовывается, в результате чего мы получаем строку, начинающуюся с первого (номер 0) элемента и заканчивающуюся нулевым символом. l Интересно, что указатель на char тоже автоматически разыменовывается по тем же правилам. То есть, в результате выполнения char c=‘a’; char *pc=&c; cout << pc; // aивесьмусорвпамятидоближайшегонулевогоэлемента cout << *pc; // a cout << &pc ; // 0013 FF 0 C l

4. Структурное программирование 4. 8. Указатели и строки : информация к размышлению typedef char 4. Структурное программирование 4. 8. Указатели и строки : информация к размышлению typedef char t_array_char [4]; t_array_char c="abc"; char *pchar=NULL; t_array_char *parchar=NULL; cout << "c= " << c << endl; pchar=c; cout << "pchar=c " << pchar << endl; // // parchar=c; prohibited!!! pchar=&c; prohibited!!! parchar=&c; cout<< "parchar=&c " << parchar << endl; parint=&pint; prohibited!!! cout << "*pchar " << *pchar << endl; cout << "*parchar " << *parchar << endl; cout << "**parchar " << **parchar << endl; a=b; prohibited !!! cout << "*pchar+2 " << *(pchar+2); // abc // 0013 FF 0 C // abc // a // c

4. Структурное программирование 4. 8. Указатели Инициализация указателей на char l l Раньше мы 4. Структурное программирование 4. 8. Указатели Инициализация указателей на char l l Раньше мы инициализировали строкой массивы типа char. Указатель на символ !!! char* также можно инициализировать строковым литералом. В этом случае указатель будет содержать адрес, по которому в оперативной памяти, в т. н. «таблице строк» , размещен строковый литерал – неименованная константа char *pverb=“Hello”; l l l Изменение в программе значения такого указателя – весьма дурной тон. C формальной точки зрения в С++ строковый литерал имеет тип не char* , а const char*. Просто в языке С++ предусмотрено автоматическое преобразование типа const char* в тип char*. Хорошим стилем считается, если Вы пишете программу на С++ , строковый литерал считать константным и объявлять: const char *pverb = “Hello”;

4. Структурное программирование 4. 8. Указатели Инициализация указателей на char. Пример int main() // 4. Структурное программирование 4. 8. Указатели Инициализация указателей на char. Пример int main() // prints the string forward and backwards { const char *p="Hello"; cout << "*p= " <<*p << endl; cout << "p = " << p << endl; for (int t = strlen(p)-1 ; t >= 0; t--) cout << p[t]; cout << endl; _getch(); return 0; } // Hello // olle. H

4. Структурное программирование 4. 8. Указатели на структуры l Объявление указателя на структуру ничем 4. Структурное программирование 4. 8. Указатели на структуры l Объявление указателя на структуру ничем не отличается от обычного: struct cmplx { double re; double im; }; cmplx c 1, c 2; cmplx *pc; pc = &c 1;

4. Структурное программирование 4. 8. Указатели на структуры Для доступа к членам структуры по 4. Структурное программирование 4. 8. Указатели на структуры Для доступа к членам структуры по указателю на нее можно воспользоваться операцией разыменования: (*pc). re = 1; cout << c 1. re; // 1 l Однако, лучше использовать специальную операцию ссылки на член структуры (оператор «стрелка» ): pc->re = 2; cout << c 1. re; // 2 pc->im = pc->re; pc=&c 2; pc->re=c 1. re; pc->im=c 1. im; l l Итак, оператор «. » используется для непосредственного обращения к членам структуры, а оператор «->» для доступа к членам структуры через указатель на нее.

4. Структурное программирование 4. 8. Указатели Указатель на указатель short **ppshort=NULL; short *pshort=NULL; short 4. Структурное программирование 4. 8. Указатели Указатель на указатель short **ppshort=NULL; short *pshort=NULL; short a=3; pshort=&a; ppshort = &pshort; cout << ppshort << **ppshort // 0013 FF 4 C 0013 FF 52 3 NULL F 48 F 49 ppshort F 4 A NULL F 4 B F 4 C pshort F 4 D F 4 E 3 F 4 F F 50 F 51 F 52 a F 53 F 54 F 55

4. Структурное программирование 4. 8. Указатели Указатель на указатель short **ppshort=NULL; short *pshort=NULL; short 4. Структурное программирование 4. 8. Указатели Указатель на указатель short **ppshort=NULL; short *pshort=NULL; short a=3; pshort=&a; ppshort = &pshort; cout << ppshort << **ppshort // 0013 FF 4 C 0013 FF 52 3 NULL F 48 F 49 ppshort F 4 A 0013 FF 52 F 4 B F 4 C pshort F 4 D F 4 E 3 F 4 F F 50 F 51 F 52 a F 53 F 54 F 55

4. Структурное программирование 4. 8. Указатели Указатель на указатель short **ppshort=NULL; short *pshort=NULL; short 4. Структурное программирование 4. 8. Указатели Указатель на указатель short **ppshort=NULL; short *pshort=NULL; short a=3; pshort=&a; ppshort = &pshort; cout << ppshort << **ppshort // 0013 FF 4 C 0013 FF 52 3 0013 FF 4 C F 48 F 49 ppshort F 4 A 0013 FF 52 F 4 B F 4 C pshort F 4 D F 4 E 3 F 4 F F 50 F 51 F 52 a F 53 F 54 F 55

4. Структурное программирование 4. 8. Указатели Операция sizeof l Операция sizeof будучи применена к 4. Структурное программирование 4. 8. Указатели Операция sizeof l Операция sizeof будучи применена к какому-либо объекту возвращает целое число – количество байт, занимаемых ее операндом. int m=0; double k=0; char *pchar; short l [6][5]; cout << sizeof m; cout << sizeof k ; cout << sizeof pchar; cout << sizeof *pchar; cout << sizeof l ; cout << (sizeof l) / (sizeof l[0][0]) ; cout << (sizeof l) / (sizeof l[0]) ; // 4 // 8 // 4 // 1 // 60 bytes // 30 number of elements // 6 number of rows

4. Структурное программирование 4. 9. Ссылки l l Ссылка (reference) – псевдоним для другой 4. Структурное программирование 4. 9. Ссылки l l Ссылка (reference) – псевдоним для другой переменной. Ссылка имеет имя, которое может использоваться вместо имени переменной. Так как ссылка – это псевдоним, а не указатель, переменная, для которой она определяется, должна быть объявлена ранее. В отличие от указателя ссылка не может быть изменена, чтобы представлять другую переменную Объявление и инициализация: Базовый_тип &Имя_Ссылки = Имя_Переменной; int number = 0; int &rnumber = number; // ссылка int *pnumber = &number // указатель l Ссылку, можно использовать вместо имени исходной переменной: rnumber +=10; *pnumber +=10; // требуется разыменование l Ссылка подобна указателю, который уже разыменован и значение которого нельзя изменить.

4. Структурное программирование 4. 9. Ссылки чаще всего используют для передачи аргументов в функции, 4. Структурное программирование 4. 9. Ссылки чаще всего используют для передачи аргументов в функции, однако иногда их можно использовать в качестве синонимов для упрощения текста программы. Например, вместо //init array rfe Date initdate = {1900, 1, 1}; for (int i = 0; i < nmembers; i++) { rfe[i]. id=0; strcpy(rfe[i]. ownname. surname, ""); strcpy(rfe[i]. ownname. firstname, ""); strcpy(rfe[i]. ownname. patronymic, ""); rfe[i]. birth=initdate; rfe[i]. enter=initdate; strcpy (rfe[i]. position, "student"); rfe[i]. tradeunion=false; }

4. Структурное программирование 4. 9. Ссылки Можно записать //init array rfe Date initdate = 4. Структурное программирование 4. 9. Ссылки Можно записать //init array rfe Date initdate = {1900, 1, 1}; for (int i = 0; i < nmembers; i++) { Member &t = rfe[i]; t. id=0; strcpy(t. ownname. surname, ""); strcpy(t. ownname. firstname, ""); strcpy(t. ownname. patronymic, ""); t. birth=initdate; t. enter=initdate; strcpy (t. position, "student"); t. tradeunion=false; }

4. Структурное программирование 4. 10. Динамическое распределение памяти l l l Память для глобальных 4. Структурное программирование 4. 10. Динамическое распределение памяти l l l Память для глобальных переменных распределяется на этапе компиляции и выделяется при загрузке программы в память. Память для локальных переменных выделяется в области стека в момент начала выполнения функции. Мы не можем в процессе выполнения программы объявить новые локальные или глобальные переменные, хотя необходимость этого может выясниться только в процессе выполнения. Мы не можем работать со структурами данных, размер которых может изменяться в процессе выполнения программы (списки, стеки, очереди, деревья) Механизм динамического распределения памяти позволяет программе получать необходимую для хранения данных память в процессе своего выполнения. Для получения доступа к динамически выделяемым областям памяти и их типизации служат указатели.

4. Структурное программирование 4. 10. Динамическое распределение памяти l В языке С++ имеются два 4. Структурное программирование 4. 10. Динамическое распределение памяти l В языке С++ имеются два оператора динамического распределения памяти: new и delete. (В С используются функции malloc() и free()). l Выделение памяти: Имя_Указателя = new Тип; Имя_Указателя = new Тип (инициализирующее_значение); l Освобождение памяти: delete Имя_Указателя; l Разумеется, перед использованием оператора new следует описать используемый указатель.

4. Структурное программирование 4. 10. Динамическое распределение памяти float *pf=NULL; short *ps=NULL; pf = 4. Структурное программирование 4. 10. Динамическое распределение памяти float *pf=NULL; short *ps=NULL; pf = new float; *pf = 4. 5; cout << &pf << *pf; ps= new short (3); *pf = *ps; delete pf; NULL F 5 С ps F 5 D F 5 E Динамическое выделение памяти для переменных // 0013 FF 60 NULL F 5 F F 60 pf F 61 F 62 003 B 619 D 4. 5 … F 63 … 19 D 19 E 19 F 1 A 0 1 A 1 1 A 2

4. Структурное программирование 4. 10. Динамическое распределение памяти float *pf=NULL; short *ps=NULL; pf = 4. Структурное программирование 4. 10. Динамическое распределение памяти float *pf=NULL; short *ps=NULL; pf = new float; *pf = 4. 5; cout << &pf << *pf; ps= new short (3); *pf = *ps; delete pf; NULL F 5 С ps F 5 D F 5 E Динамическое выделение памяти для переменных // 0013 FF 60 003 B 619 D F 5 F F 60 pf F 61 F 62 003 B 619 D 4. 5 … F 63 … 19 D 19 E 19 F 1 A 0 1 A 1 1 A 2

4. Структурное программирование 4. 10. Динамическое распределение памяти float *pf=NULL; short *ps=NULL; pf = 4. Структурное программирование 4. 10. Динамическое распределение памяти float *pf=NULL; short *ps=NULL; pf = new float; *pf = 4. 5; cout << &pf << *pf; ps= new short (3); *pf = *ps; delete pf; NULL F 5 С ps F 5 D F 5 E Динамическое выделение памяти для переменных // 0013 FF 60 F 5 F F 60 pf F 61 F 62 F 63 4. 5 … 003 B 619 D 4. 5 … 19 D 19 E 19 F 1 A 0 1 A 1 1 A 2

4. Структурное программирование 4. 10. Динамическое распределение памяти float *pf=NULL; short *ps=NULL; pf = 4. Структурное программирование 4. 10. Динамическое распределение памяти float *pf=NULL; short *ps=NULL; pf = new float; *pf = 4. 5; cout << &pf << *pf; ps= new short (3); *pf = *ps; delete pf; 003 B 61 A 1 F 5 С ps F 5 D F 5 E Динамическое выделение памяти для переменных // 0013 FF 60 F 5 F F 60 pf F 61 F 62 F 63 4. 5 … 003 B 619 D 4. 5 … 19 D 19 E 19 F 3 1 A 0 1 A 1 1 A 2

4. Структурное программирование 4. 10. Динамическое распределение памяти float *pf=NULL; short *ps=NULL; pf = 4. Структурное программирование 4. 10. Динамическое распределение памяти float *pf=NULL; short *ps=NULL; pf = new float; *pf = 4. 5; cout << &pf << *pf; ps= new short (3); *pf = *ps; delete pf; 003 B 61 A 1 F 5 С ps F 5 D F 5 E Динамическое выделение памяти для переменных // 0013 FF 60 F 5 F F 60 pf F 61 F 62 F 63 4. 5 … 003 B 619 D 3. 0 … 19 D 19 E 19 F 3 1 A 0 1 A 1 1 A 2

4. Структурное программирование 4. 10. Динамическое распределение памяти float *pf=NULL; short *ps=NULL; pf = 4. Структурное программирование 4. 10. Динамическое распределение памяти float *pf=NULL; short *ps=NULL; pf = new float; *pf = 4. 5; cout << &pf << *pf; ps= new short (3); *pf = *ps; delete pf; 003 B 61 A 1 F 5 С ps F 5 D F 5 E Динамическое выделение памяти для переменных // 0013 FF 60 F 5 F F 60 pf F 61 F 62 F 63 4. 5 … 003 B 619 D 3. 0 … 19 D 19 E 19 F 1 A 0 1 A 1 1 A 2

4. Структурное программирование 4. 10. Динамическое распределение памяти float *pf=NULL; short *ps=NULL; pf = 4. Структурное программирование 4. 10. Динамическое распределение памяти float *pf=NULL; short *ps=NULL; pf = new float; *pf = 4. 5; cout << &pf << *pf; ps= new short (3); *pf = *ps; delete pf; 003 B 61 A 1 F 5 С ps F 5 D F 5 E Динамическое выделение памяти для переменных // 0013 FF 60 003 B 619 D F 5 F F 60 pf F 61 F 62 003 B 619 D 4. 5 … F 63 … 19 D 19 E 19 F 1 A 0 1 A 1 1 A 2

4. Структурное программирование 4. 10. Динамическое распределение памяти struct cmplx Динамическое выделение памяти { 4. Структурное программирование 4. 10. Динамическое распределение памяти struct cmplx Динамическое выделение памяти { для структур double re; double im; }; cmplx *pc = new cmplx; cout << &pc << endl; // 0013 FF 5 С cout << pc; // 003 B 6188 pc->re=1. 0; pc->im=0; cout <re; // 1 delete pc; 003 B 6188 F 5 С pc F 5 D F 5 E … F 5 F … 188 189 19 A 19 B 19 C 19 D 19 E 19 F

4. Структурное программирование 4. 10. Динамическое распределение памяти struct cmplx Динамическое выделение памяти { 4. Структурное программирование 4. 10. Динамическое распределение памяти struct cmplx Динамическое выделение памяти { для структур double re; double im; }; cmplx *pc = new cmplx; cout << &pc << endl; // 0013 FF 5 С cout << pc; // 003 B 6188 pc->re=1. 0; pc->im=0; cout <re; // 1 delete pc; 003 B 6188 F 5 С pc F 5 D F 5 E … F 5 F … 1. 0 188 189 19 A 0. 0 19 B 19 C 19 D 19 E 19 F

4. Структурное программирование 4. 10. Динамическое распределение памяти struct cmplx Динамическое выделение памяти { 4. Структурное программирование 4. 10. Динамическое распределение памяти struct cmplx Динамическое выделение памяти { для структур double re; double im; }; cmplx *pc = new cmplx; cout << &pc << endl; // 0013 FF 5 С cout << pc; // 003 B 6188 pc->re=1. 0; pc->im=0; cout <re; // 1 delete pc; 003 B 6188 F 5 С pc F 5 D F 5 E … F 5 F … 188 189 19 A 19 B 19 C 19 D 19 E 19 F

4. Структурное программирование 4. 10. Динамическое распределение памяти Динамическое выделение памяти для одномерных массивов 4. Структурное программирование 4. 10. Динамическое распределение памяти Динамическое выделение памяти для одномерных массивов int k=0; cin >> k; // 4 short *pa = new short [k]; cout << &pa << endl; // 0013 FF 5 С cout << pa; // 003 B 6188 for (int i=0; i<=3; i++) pa[i]=i*i; cout << *pa; // 0 cout << pa[2]; // 4 delete [ ] pa; 003 B 6188 Обратите внимание на особенности выделения памяти для массива: - указатель объявляется на базовый тип массива; - размер массива указывается в квадратных скобках после идентификатора типа в new - допустим неконстантный размер массива … pa[0] F 5 С pa F 5 D F 5 E F 5 F … 188 189 pa[1] 19 A 19 B pa[2] 19 C 19 D pa[3] 19 E 19 F

4. Структурное программирование 4. 10. Динамическое распределение памяти Динамическое выделение памяти для одномерных массивов 4. Структурное программирование 4. 10. Динамическое распределение памяти Динамическое выделение памяти для одномерных массивов int k=0; cin >> k; // 4 Обратите внимание: short *pa = new short [k]; cout << &pa << endl; // 0013 FF 5 С - для получения доступа к элементу массива разыменовывать указатель cout << pa; // 003 B 6188 не надо! Операция [ ] вычисляет for (int i=0; i<=3; i++) pa[i]=i*i; адрес элемента массива и cout << *pa; // 0 разыменовывает соответствующий cout << pa[2]; // 4 указатель delete [ ] pa; 003 B 6188 pa F 5 D F 5 E F 5 F … 0 1 4 9 pa[0] F 5 С … pa[1] pa[2] pa[3] 188 189 19 A 19 B 19 C 19 D 19 E 19 F

4. Структурное программирование 4. 10. Динамическое распределение памяти Динамическое выделение памяти для одномерных массивов 4. Структурное программирование 4. 10. Динамическое распределение памяти Динамическое выделение памяти для одномерных массивов int k=0; cin >> k; // 4 short *pa = new short [k]; cout << &pa << endl; // 0013 FF 5 С cout << pa; // 003 B 6188 for (int i=0; i<=3; i++) pa[i]=i*i; cout << *pa; // 0 cout << pa[2]; // 4 delete [ ] pa; 003 B 6188 F 5 С pa F 5 D F 5 E Обратите внимание на особенности освобождения памяти от массива: - квадратные скобки после delete, - размер массива не указывается! … F 5 F … 188 189 19 A 19 B 19 C 19 D 19 E 19 F

4. Структурное программирование 4. 10. Динамическое распределение памяти Ранее разработанная программа работы с nмерными 4. Структурное программирование 4. 10. Динамическое распределение памяти Ранее разработанная программа работы с nмерными векторами int main() { const int n=4; double a[n]={0}, b[n]={0}, res[n]={0}; cout << "Enter. . . " << endl; for (int i=1; i<=n; i++) { cout << endl << "a" << i << ": "; cin >> a[i-1]; cout << "b" << i << ": "; cin >> b[i-1]; }

4. Структурное программирование 4. 10. Динамическое распределение памяти Ранее разработанная программа работы с nмерными 4. Структурное программирование 4. 10. Динамическое распределение памяти Ранее разработанная программа работы с nмерными векторами for (int i=1; i<=n; i++) res[i-1]=a[i-1]+b[i-1]; cout << endl << "a + b = ( "; for (int i=1; i<=n; i++) cout << res[i-1] << " "; cout << ")"; //Sum for (int i=1; i<=n; i++) res[i-1]=a[i-1]-b[i-1]; cout << endl << "a - b = ( "; for (int i=1; i<=n; i++) cout << res[i-1] << " "; cout << ")"; double r=0; for (int i=1; i<=n; i++) r+=a[i-1]*b[i-1]; cout << endl << "a * b = " << r; //Difference _getch(); return 0; }; //Product

4. Структурное программирование 4. 10. Динамическое распределение памяти Новая версия программы работы с n-мерными 4. Структурное программирование 4. 10. Динамическое распределение памяти Новая версия программы работы с n-мерными векторами int main() { int n=0; cout << "Enter dimension n: "; cin >> n; double* a = new double[n]; double* b = new double[n]; double* res = new double[n]; cout << "Enter. . . " << endl; for (int i=1; i<=n; i++) { cout << endl << "a" << i << ": "; cin >> a[i-1]; cout << "b" << i << ": "; cin >> b[i-1]; }

4. Структурное программирование 4. 10. Динамическое распределение памяти Новая версия программы работы с n-мерными 4. Структурное программирование 4. 10. Динамическое распределение памяти Новая версия программы работы с n-мерными векторами for (int i=1; i<=n; i++) res[i-1]=a[i-1]+b[i-1]; cout << endl << "a + b = ( "; for (int i=1; i<=n; i++) cout << res[i-1] << " "; cout << ")"; //Sum for (int i=1; i<=n; i++) res[i-1]=a[i-1]-b[i-1]; cout << endl << "a - b = ( "; for (int i=1; i<=n; i++) cout << res[i-1] << " "; cout << ")"; double r=0; for (int i=1; i<=n; i++) r+=a[i-1]*b[i-1]; cout << endl << "a * b = " << r; //Difference _getch(); return 0; }; //Product

4. Структурное программирование 4. 10. Динамическое распределение памяти Ранее разработанная программа нахождения простых чисел 4. Структурное программирование 4. 10. Динамическое распределение памяти Ранее разработанная программа нахождения простых чисел int main() // sieve of Eratosthenes { const unsigned int n = 1000; const unsigned int size = n+1; bool erato [size]={0}; for (int i = 2; i <= n; i++) erato [i] = 1; for (int i = 2; i <= static_cast (sqrt(static_cast (n))); i++) { if (erato[i]) for (int j = i; j <= n; j++) { if (i*j > n)break; erato [i*j]=false; } } for(int i=2; i <= n; i++) if (erato[i]) cout << i << endl; return 0; }

4. Структурное программирование 4. 10. Динамическое распределение памяти Новая программа нахождения простых чисел int 4. Структурное программирование 4. 10. Динамическое распределение памяти Новая программа нахождения простых чисел int main() // sieve of Eratosthenes: dynamic store allocation { int n = 0; cout << "Enter max number: "; cin >> n; if (n <= 0)return -1; bool *perato = new bool [n+1]; for (int i = 2; i <= n; i++) perato [i] = 1; for (int i = 2; i <= static_cast (sqrt(static_cast (n))); i++) { if (perato[i]) for (int j = i; j <= n; j++) { if (i*j > n)break; perato [i*j]=false; } } for(int i=2; i <= n; i++) if (perato[i]) cout << i << endl; delete [ ] perato; return 0; }

4. Структурное программирование 4. 10. Динамическое распределение памяти Эмуляция двумерного массива размером [n] [m] 4. Структурное программирование 4. 10. Динамическое распределение памяти Эмуляция двумерного массива размером [n] [m] int **pr; int * int

4. Структурное программирование 4. 10. Динамическое распределение памяти Эмуляция двумерного массива размером [n] [m] 4. Структурное программирование 4. 10. Динамическое распределение памяти Эмуляция двумерного массива размером [n] [m] int **pr; pr = new int* [n] 0 1 2 int * int … n-1 int * int

4. Структурное программирование 4. 10. Динамическое распределение памяти Эмуляция двумерного массива размером [n] [m] 4. Структурное программирование 4. 10. Динамическое распределение памяти Эмуляция двумерного массива размером [n] [m] int **pr; pr = new int* [n] for (int i=0; i<=n-1; i++) pr[i] = new int [m]; 0 1 2 int * int int … int int * int … int 0 1 int … n-1 int * m-1 … int

4. Структурное программирование 4. 10. Динамическое распределение памяти Эмуляция двумерного массива размером [n] [m] 4. Структурное программирование 4. 10. Динамическое распределение памяти Эмуляция двумерного массива размером [n] [m] int **pr; pr = new int* [n] for (int i=0; i<=n-1; i++) pr[i] = new int [m]; pr 0 1 2 int * int int … int int * int … int 0 1 int … n-1 int * m-1 … int

4. Структурное программирование 4. 10. Динамическое распределение памяти Эмуляция двумерного массива размером [n] [m] 4. Структурное программирование 4. 10. Динамическое распределение памяти Эмуляция двумерного массива размером [n] [m] int **pr; pr = new int* [n] for (int i=0; i<=n-1; i++) pr[i] = new int [m]; pr * 0 1 2 int * int int … int int * int … int 0 1 int … n-1 int * m-1 … int

4. Структурное программирование 4. 10. Динамическое распределение памяти Эмуляция двумерного массива размером [n] [m] 4. Структурное программирование 4. 10. Динамическое распределение памяти Эмуляция двумерного массива размером [n] [m] int **pr; pr = new int* [n] for (int i=0; i<=n-1; i++) pr[i] = new int [m]; pr [2] 0 1 2 int * int int … int int * int … int 0 1 int … n-1 int * m-1 … int

4. Структурное программирование 4. 10. Динамическое распределение памяти Эмуляция двумерного массива размером [n] [m] 4. Структурное программирование 4. 10. Динамическое распределение памяти Эмуляция двумерного массива размером [n] [m] int **pr; pr = new int* [n] for (int i=0; i<=n-1; i++) pr[i] = new int [m]; pr [2][1] 0 1 2 int * int int … int int * int … int 0 1 int … n-1 int * m-1 … int

4. Структурное программирование 4. 10. Динамическое распределение памяти Эмуляция двумерного массива int main() // 4. Структурное программирование 4. 10. Динамическое распределение памяти Эмуляция двумерного массива int main() // Dynamic store allocation for 2 D array [n][m] { int m = 0, n=0; cout << "Enter matrix size (n, m): "; cin >> n, m; if ((n <= 1)||(m<=1))return -1; cout << "m= " << m << " n= " << n << endl; int* *pr = new int*[n]; // pointer to allocating array of pointers to rows for (int i=0; i<=n-1; i++) pr[i] = new int [m]; // allocating rows for (int i=0; i<=n-1; i++) for (int j=0; j<=m-1; j++) pr [i][j]=i*100+j; // init array for (int i=0; i<=n-1; i++) delete [] pr[i]; delete [ ]pr; _getch(); return 0; } // free memory of rows // free memory of array of pointers to rows