0-3.pptx
- Количество слайдов: 56
Основы программирования Синтаксис С++ Лекция 3
Синтаксис С++ Набор символов языка C++ включает в себя почти все возможные символы ASCII. В С++ различается регистр. Например: «int absolute. Value; » и «int Absolute. Value; » – разные идентификаторы. Лишние пробелы при записи программы (за редким исключением) игнорируются, используются обычно программистом для улучшения читаемости кода. Например: « int z=5*5*5; » и «int z = 5* 5 * 5 ; » значат одно и то же. Строки, начинающиеся с // игнорируются при компиляции, часть строки, находящаяся после // игнорируется. Текст, находящийся между /* и */, включая сами ограничители, игнорируется. Например: main() { printf(“Hello world!”); // здесь может быть ваша реклама! }
С++: ключевые слова Эти слова нельзя использовать в качестве идентификаторов Управление потоком и прочее break case continue default do else false for goto if return sizeof switch true typedef while Типы и свойства типов auto char class const double enum extern float int long register short signed static struct union unsigned void volatile
Система типов С++ Для числовых данных Целые значения int С плавающей точкой double В зависимости от нужд программиста имеется система модификаторов, применяемых вместе с данными типами: signed / unsigned и long / short. Первые определяют интерпретацию знакового бита числа (unsigned int способен хранить значения в диапазоне от 0 до 4294967296, а int от -2147483648 до 2147483647). Модификатор signed / unsigned не меняет размера выделяемой памяти. Модификатор short / long управляет диапазоном возможных значений и изменяет размер выделяемой памяти. Для short double принято ключевое слово float, short то же самое, что short int. Замечание: long int то же самое, что просто long, для long double нет отдельного ключевого слова. Для строковых типов char (на самом деле всегда можно представить себе обычное целое в диапазоне от 0 до 255, помните, типы – это лишь договор об интерпретации байтов памяти. Для типов char возможно применение модификатора signed / unsigned). Да и нет – логические операции bool (допустимо true или false, но на самом деле выделен 1 байт памяти = искусственный тип! Запомните, при вычислении логических выражений целочисленный 0 приравнивается к false, ложь; а любое отличное от 0 значение к true, правде!)
Система типов С++ Типы могут использоваться в сочетании с модификаторами: const long int x = 10000000; unsigned short int y = 100; const char* message = “This is a text”; и даже const int* const p = &x; short m = 3; // тоже, что и short int m = 3; float p = 1. 2;
Операторы С++ Список операторов С++: http: //ru. wikipedia. org/wiki/%D 0%9 E%D 0%BF%D 0%B 5%D 1 %80%D 0%B 0%D 1%82%D 0%BE%D 1%80%D 1%8 B_%D 0% B 2_C_%D 0%B 8_C%2 B%2 B#. D 0. 9 F. D 1. 80. D 0. B 8. D 0. BE. D 1. 80. D 0. B 8. D 1. 82. D 0. B 5. D 1. 82. D 1. 8 B_. D 0. BE. D 0. BF. D 0. B 5. D 1. 80. D 0. B 0. D 1. 82. D 0. BE. D 1. 80. D 0. BE. D 0. B 2 Арифметические: * умножение / деление - вычитание или замена знака + сложение *=, /=, -=, += они же, но с присваиванием. Например: int a=5, b=10; a+=10; // теперь а=15 b=-a+a; // b=0 a*=(-b+a); Также С++ имеет два «стильных» оператора, инкремент и декремент. Например: a++ тоже самое, что a=a+1 или a+=1 a-- тоже самое, что a=a-1 или a-=1 Логические: && и || или ! не == равенство != неравенство > больше < меньше >= больше либо равно <= меньше либо равно Например: bool a=true, b=false, c=true; a=!a; // теперь a ложь b=a&&a; // b правда (a&&b)||c; a&&b&&c&&(a||b); a||(!b&&a||!a); //постарайтесь определить значения последних 3 выражений. На практике придется довольно часто составлять такие условия.
Операторы С++ Управления памятью: new – выделяет блок delete – удаляет блок & - взять адрес * - использовать значение по адресу (“dereferencing” указателя) Например: int a=10; int* b = &a; // тут * - не оператор, //а часть типа (int*) – «указатель на целое» *b=100; // теперь a =100, b указатель на a; b+=1; // теперь a=100; b указатель на 32 //бита, следующие за а. Вызовы: [ ] взятие индекса массива ( ) вызов функции -> выбор по указателю. выбор по ссылке (самые используемые операторы объектно-ориентированного программирования)
Основы программирования Классы памяти, массивы, указатели. Лекция 3
Массивы Набор однотипных объектов а 0 а 1 а 2 а 3 а 4 H e l l o char a[] = “Hello world!”; w? индекс 6. a[11] = ‘? ’ a[6] а 5 а 6 а 7 а 8 а 9 а 10 а 11 w o r l d !
Массивы int b[] = {7, 8, 800, 1000, 1, 2, 3, 0, 100, 200, 300}; а 0 а 4 а 8 а 12 а 16 а 20 а 24 а 28 а 32 а 36 а 40 а 44 7 8 80 800 1000 1 2 3 0 100 200 300 b[3] то же, что «int x=800; » , но без идентификатора! почему мы можем обратиться к b[3]? (почему мы не обязаны сказать b[‘a 12’])? или b[3*sizeof(int)]?
Указатели а 0 а 4 а 8 а 12 а 16 а 20 а 24 а 28 а 32 а 36 а 40 а 44 7 8 80 800 1000 1 2 3 0 100 200 300 Указатель b a 80 a 0 Обычная переменная: 1) имеет идентификатор 2) имеет адрес в памяти 3) содержит адрес памяти 4) всегда 32 (64) бита!
Система типов С++ дает возможность создать пользовательские типы данных. Ключевое слово class. Общая таблица типов С++ Тип Указатель на тип Ссылочный тип int* int& double* double& char* char& bool* bool& void* void& . . my_type* my_type& Другими словами, для каждого типа предусмотрен свой ссылочный тип (который мы обсудим позже) и свой тип-указатель.
Указатели int b[] = {7, 8, 800, 1000, 1, 2, 3, 0, 100, 200, 300}; а 0 а 4 а 8 а 12 а 16 а 20 а 24 а 28 а 32 а 36 а 40 а 44 7 8 80 800 1000 1 2 3 0 100 200 300 Указатель b a 80 a 0 printf(“%i ”, ? ? ); *b b 7 2242345 *b+1 8 *(b+1) 8 *b+2 9 *(b+2) 80
Указатели int b[] = {7, 8, 800, 1000, 1, 2, 3, 0, 100, 200, 300}; а 0 а 4 а 8 а 12 а 16 а 20 а 24 а 28 а 32 а 36 а 40 а 44 7 8 80 800 1000 1 2 3 0 100 200 300 Указатель b a 80 Конструкция b[i] полностью аналогична *(b+i) a 0 * у имени типа – заявляет об объявлении типа указателя! * в выражении – оператор умножения * перед идентификатором(именем) переменной-указателя заявляет о работе со значением, на которое указывает адрес памяти, содержащийся в указателе
Зачем вообще указатель? Не все переменные хотят иметь уникальное имя! int my_big_array_of_integers[10000]; my_big_array_of_integers[100] = 6975059; my_big_array_of_integers[1] = 8674445; *my_big_array_of_integers = 10; *(my_big_array_of_integers+5) = 20;
Синтаксис С++ Функция – блок кода, выполняющий определенную операцию также основная форма контроля потоком управления объявление функции тип ИМЯ (тип аргумент 1, тип аргумент 2 … тип аргумент N ) тип данных, возвращаемый функцией каждый аргумент задается как тип данных и локальное имя, представляющее этот аргумент внутри кода функции int Slozhenie_2_chisel(int a, int b) { return a+b; } int z; z = Slozhenie_2_chisel(10, 100); теперь z имеет значение 110 z равно 0 (неявно)
Функция С++ По сути функция – самостоятельная программа! int main() { } printf(. . . ) { . . . } void swap(int a, int b) { ХОЧУ МЕНЯТЬ МЕСТАМИ ЗНАЧЕНИЯ 2 ПЕРЕМЕННЫХ }
Функция С++ По сути функция – самостоятельная программа! void swap(int a, int b) {. . . } Область видимости Участок программы, где действительна связь между адресом памяти и идентификатором (именем) переменной Проектируя функцию swap, вы НЕ должны больше заботиться о том, используется ли уже где-то идентификатор a или b.
Режим передачи значений По сути функция – самостоятельная программа! int main() { int b = 100; int z = 200; int y = 300; swap(z, y); } void swap(int a, int b) {. . . } Память программы b z y a 1 a 2 a 3 a 4 100 200 300 a 5 a 6 a 7 a 8 a 9
Режим передачи значений По сути функция – самостоятельная программа! int main() { int b = 100; int z = 200; int y = 300; swap(z, y); } void swap(int a, int b) {. . . } Память программы b z y a a 1 a 2 a 3 a 4 a 5 100 300 200 300 видимость main b 200 a 6 видимость swap a 7 a 8 a 9
Управление потоком В С++ операторы можно группировать в смысловые блоки. Блоки ограничены фигурными скобками: { }. Операторы внутри блока выполняются последовательно, блоки выполняются как единые модули. Функция – базовая единица управления. Фактически, это именованный блок операторов. Блок из 3 операторов (2 вызова функции, 1 инкремент) { printf(“Hi, let us print the value of i: %i”, i); printf(“And then increment i”); i++; } Далее в программе блок каждый раз повторяется. Это выглядит ужасно! int i = 10; { printf(“Hi, let us print the value of i: %i”, i); printf(“And then increment i”); i++; } printf(“And do it once more!”); { printf(“Hi, let us print the value of i: %i”, i); printf(“And then increment i”); i++; } Сделаем из него функцию void Print. And. Increment_i( ) { printf(“Hi, let us print the value of i: %i”, i); printf(“And then increment i”); i++; } Если мы определили функцию, программа станет красивой! int i = 10; Print. And. Increment_i( ); printf(“And do it once more!”); Print. And. Increment_i( ); // and again and so on…
Управление потоком Блок или один оператор можно выполнять много раз циклы Выполняет блок, пока проверка условия дает true. Примечание! Изменение переменной происходит в цикле for по выполнения последнего оператора блока for(начальные значения; проверка условия; изменение переменной) { } while(проверка условия) { } Например: //создадим массив из 100 целых, заполним //его единицами int my_array[100]; for(int k=0; k < 100; k++) my_array[k]=1; printf(“Done!”); // заметим отсутствие { }, когда 1 оператор // printf выполняется 1 раз!!! // то же, но с while int my_array[100]; int j=0; while(j< 100) { my_array[k]=1; j++; // не забывайте увеличивать j, иначе //вечный цикл } printf(“Done!”);
Управление потоком Условное исполнение блока if(условие выполняется) { } Блок (или 1 оператор) выполняется, если условие true, в противном случае блок пропускается if(условие выполняется) { } else { } Блок (или 1 оператор) выполняется, если условие true, в противном случае выполняется блок после else. if(условие выполняется) { } else if(другое условие) { } else { } Блок (или 1 оператор) выполняется, если условие true, в противном случае проверяется другое условие, если true, выполняется блок после else if, если нет, то блок после else. Конструкция if… else может содержать любое количество блоков с else if, проверяющих разные логические выражения последовательно. Выполняется либо один или несколько блоков if / else if, либо блок else (если все условия блоков if не верны).
Заголовочные файлы Директивы препроцессора #include указывает компилятору, что перед выполнением компиляции следует заменить ее на текст файла, указанного этой директивной Стандартные библиотеки С++ содержат ряд важнейших функций и структур данных: управление вводом и выводом; файловые операции; контейнеры; алгоритмы и прочее. #include
Функция fprintf() Первый аргумент – указатель на поток Идея: «ПОТОК» - некая последовательность (большой одномерный массив) «УКАЗАТЕЛЬ» -на текущее положение в потоке. 1. Создать поток из файла (функция fopen()), чтобы читать или записывать данные в файл. Передать указатель на поток (его возвращает функция fopen()) функции fscanf для чтения, или fprintf() для записи данных. В случае вывода на экран (экран-то один) поток экрана уже считается открытым, поэтому printf() и scanf() не имеют этого аргумента. 2. После работы функции fprintf() / fscanf() / printf() / scanf() указатель на поток смещается на количество байт, записанное функцией. Второй аргумент – строка форматированного ввода. Данные, только что записанные fprintf() Новое положение указателя в потоке Она формируется из указанной вами строки, в которой все символы %x (где x – спецификатор формата) заменяются на значения аргументов функции с 3 по n. Таким образом, сама функция (f)printf(. . . ) имеет 2+k = n аргументов, если в строке указаны k символов %. %i – интерпретировать аргумент как int %s – интерпретировать аргумент как char* (строка) %f – интерпретировать аргумент как float и т. д.
Официальный пример /* fscanf example */ #include
Алгоритмы: анализ.
Сортировка Алгоритмы Скорость работы Стабильность Вставкой (insertion sort) n / n^2 + Выбором (selection sort) n^2 / n^2 - Объединением (merge sort) nlog(n) / nlog(n) + Быстрая (quick sort) nlog(n) / n^2 -* Шелла (Shell sort) n / n(log(n))^2 - Пузырьковая (Bubble sort) n / n^2 +
from Wikipedia. com
Сортировка 2 4 1 5 8 7 3 6 Сколько сравнений нужно выполнить? 2 1 2 4 1 5 8 7 3 6 +4 +1 1 2 4 5 8 7 3 6 +6 +1 1 2 4 5 8 7 3 6 1 2 3 4 5 8 7 6 1 2 3 4 5 6 8 7 1 2 3 4 5 6 7 8 +5 2 2 4 1 5 8 7 3 6 1 2 4 1 5 8 7 3 6 +1 ∑= 28 сравнений +4 +3 +2 +1
Сортировка 2 4 1 5 8 7 3 6 Сравнивать меньше? Легко! 2 4 1 5 8 7 3 6 2 4 1 5 8 7 3 6 7 8 3 6 +4 2 4 1 5 +3 +3 1 2 4 5 3 6 7 8 +7* 1 2 3 4 5 6 7 8 ∑= 17 сравнений
Сортировка Задача: отсортировать 10 000 целых чисел. Сортировка выбором Сортировка слиянием? N сравнений Какова «высота» дерева? На j-том шаге какое количество подзадач существует и какова их сложность? Высота 50 000 Подзадач размером 132 877
Reduction and Indirection (Сведение и посредничество) 1. Indirection. Обращение к переменной через ее идентификатор. На самом деле есть адрес байта и значение по этому адресу. C++ компилятор max_value=9; Память ID address Address Value max_value a 1232144 9 2. Indirection. Трансляция виртуального адреса в физический. виртуальная память устройство управления памятью физическая память ID V address V ADDR P address Value max_value a 1232144 0 x 435 fd 532 9
Reduction and Indirection 1 -d search problem Одномерный поиск Дан массив элементов (пар ключ-значение, оно же индекс-число). Задача: получив значение, проверить, есть ли в массиве ключ с таким значением. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 5 4 23 7 8 9 1 0 13 17 19 31 26 22 27 15 25 33 34 3
1 -d search problem Дан массив элементов (пар ключ-значение, оно же индекс-число). Задача: получив значение, проверить, есть ли в массиве ключ с таким значением. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 5 4 23 7 8 9 1 0 13 17 19 31 26 22 27 15 25 33 34 3 сортировка 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 0 1 3 4 5 7 8 9 13 15 17 19 22 23 25 26 27 31 33 34
1 -d search problem Дан массив элементов (пар ключ-значение, оно же индекс-число). Задача: получив значение, проверить, есть ли в массиве ключ с таким значением. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 0 1 3 4 5 7 8 9 13 15 17 19 22 23 25 26 27 31 33 34 6
1 -d search problem Дан массив элементов (пар ключ-значение, оно же индекс-число). Задача: получив значение, проверить, есть ли в массиве ключ с таким значением. 0 1 2 3 4 5 6 7 8 0 1 3 4 5 7 8 9 13 15 17 19 22 23 25 26 27 31 33 34 6 9 10 11 12 13 14 15 16 17 18 19
1 -d search problem Дан массив элементов (пар ключ-значение, оно же индекс-число). Задача: получив значение, проверить, есть ли в массиве ключ с таким значением. 0 1 2 3 4 5 6 7 8 0 1 3 4 5 7 8 9 13 15 17 19 22 23 25 26 27 31 33 34 6 9 10 11 12 13 14 15 16 17 18 19
1 -d search problem Дан массив элементов (пар ключ-значение, оно же индекс-число). Задача: получив значение, проверить, есть ли в массиве ключ с таким значением. 0 1 2 3 4 5 6 7 8 0 1 3 4 5 7 8 9 13 15 17 19 22 23 25 26 27 31 33 34 6 9 10 11 12 13 14 15 16 17 18 19
1 -d search problem Дан массив элементов (пар ключ-значение, оно же индекс-число). Задача: получив значение, проверить, есть ли в массиве ключ с таким значением. 0 1 2 3 4 5 6 7 8 0 1 3 4 5 7 8 9 13 15 17 19 22 23 25 26 27 31 33 34 6 9 10 11 12 13 14 15 16 17 18 19
1 -d search problem Дан массив элементов (пар ключ-значение, оно же индекс-число). Задача: получив значение, проверить, есть ли в массиве ключ с таким значением. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 0 1 3 4 5 7 8 9 13 15 17 19 22 23 25 26 27 31 33 34 25
1 -d search problem Дан массив элементов (пар ключ-значение, оно же индекс-число). Задача: получив значение, проверить, есть ли в массиве ключ с таким значением. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 0 1 3 4 5 7 8 9 13 15 17 19 22 23 25 26 27 31 33 34 25
1 -d search problem Дан массив элементов (пар ключ-значение, оно же индекс-число). Задача: получив значение, проверить, есть ли в массиве ключ с таким значением. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 0 1 3 4 5 7 8 9 13 15 17 19 22 23 25 26 27 31 33 34 25
1 -d search problem Дан массив элементов (пар ключ-значение, оно же индекс-число). Задача: получив значение, проверить, есть ли в массиве ключ с таким значением. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 0 1 3 4 5 7 8 9 13 15 17 19 22 23 25 26 27 31 33 34 25
1 -d search problem Дан массив элементов (пар ключ-значение, оно же индекс-число). Задача: получив значение, проверить, есть ли в массиве ключ с таким значением. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 0 1 3 4 5 7 8 9 13 15 17 19 22 23 25 26 27 31 33 34 25 Пусть есть 2 миллиона ключей. Тогда 1 d Search займет 21 сравнение. 2 млн. ключей, 2 млн. запросов: 4* 10 ^ 12 – наивный алгоритм (4 000 000) 84 * 10 ^ 6 – 1 d search (84 000)
Random shuffle Дан упорядоченный массив элементов, нужно случайно перемешать их. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 0 1 3 4 5 7 8 9 13 15 17 19 22 23 25 26 27 31 33 34
Random shuffle Дан упорядоченный массив элементов, нужно случайно перемешать их. 0 1 2 3 4 5 6 7 8 0 1 3 4 5 7 8 9 13 15 17 19 22 23 25 26 27 31 33 34 4 3 19 11 7 13 17 1 0 9 10 11 12 13 14 15 16 17 18 19 10 12 15 8 16 2 5 18 9 6 14
Random shuffle Дан упорядоченный массив элементов, нужно случайно перемешать их. 0 1 2 3 4 5 6 7 8 0 1 3 4 5 7 8 9 13 15 17 19 22 23 25 26 27 31 33 34 4 3 19 11 7 13 17 1 0 9 10 11 12 13 14 15 16 17 18 19 10 12 15 8 16 2 5 18 9 6 14 sort 0 1 3 4 5 13 9 25 1 0 26 33 5 22 31 15 4 0 2 4 5 8 1 2 3 6 6 7 7 8 9 9 10 11 12 13 14 15 16 17 18 19 17 7 34 19 23 8 27 3 10 11 12 13 14 15 16 17 18 19
Вставочная сортировка
Выборочная сортировка
Пузырьковая сортировка
Сравнения пызурьковая вставкой выбором
Сравнения пызурьковая вставкой выбором
Сортировка слиянием
Быстрая сортировка
Функции и библиотеки: Open. GL (Open Graphics Library)[2] is a cross-language, multi -platform application programming interface (API) for rendering 2 D and 3 D computer graphics. The API is typically used to interact with a Graphics processing unit (GPU), to achieve hardware-accelerated rendering. Open. GL was developed by Silicon Graphics Inc. (SGI) from 1991 and released in January 1992[3] and is widely used in CAD, virtual reality, scientific visualization, information visualization, flight simulation, and video games. Open. GL is managed by the non-profit technology consortium Khronos Group. Wikipedia


