Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции С++.docx
Скачиваний:
8
Добавлен:
22.09.2019
Размер:
6.95 Mб
Скачать

Баланс в дереве (иллюстрация)

1

3

5

7

9

3

1 5

7

9

сбалансированное несбалансированное

21.04.2012

cppNewb.ru 67

Узел дерева (послойно)

struct STNode

{

STNode* m_pNext;

STNode* m_pChild; T m_data;

};

21.04.2012

cppNewb.ru 68

Вставка поддерева (послойно)

21.04.2012

cppNewb.ru 69

Вставка поддерева

(список детей)

21.04.2012

cppNewb.ru 70

Объектно-ориентированное

программирование

с использованием C++

Полевой Дмитрий Валерьевич к.т.н., доцент КиК

e-mail: oop.misis@gmail.com

Машинное слово

  • платформозависимая хар-ка

  • имеет неоднозначную интерпретацию

(исторически)

  • байт – единица адресации

  • слово – несколько байт (обычно 2n)

28.04.2012

cppNewb.ru 2

Длинна машинного слова

  • процессор

    • разрядность данных

    • максимальное значение беззнакового целого типа

  • память

    • разрядность адресуемых данных

(шина данных)

    • объем адресуемой напрямую памяти

28.04.2012

cppNewb.ru 3

Порядок байтов

  • определяет порядок записи байтов для многобайтовых чисел

28.04.2012

cppNewb.ru 4

big-endian

  • от старшего к младшему

  • является стандартным для протоколов

TCP/IP (сетевой, network order)

пример:

0x00000b0f

0x00 0x00 0x0b 0x0f

28.04.2012

cppNewb.ru 5

little-endian

  • от младшего к старшему

  • является стандартным для x86

пример:

0x00000b0f

0x0f 0x0b 0x00 0x00

28.04.2012

cppNewb.ru 6

Когда порядок байтов важен

  • передача данных через файлы

  • передача данных через сеть

  • низкоуровневые алгоритмы манипуляции данными (уровня байт и бит)

28.04.2012

cppNewb.ru 7

Целые числа

  • для знаковых за знак отвечает разряд старшего байта

28.04.2012

cppNewb.ru 8

Вещественные числа

  • физическое представление может зависеть от порядка байт

  • на x86 используются форматы

IEEE 754

    • знак числа в старших байтах

    • порядок числа в старших байтах

28.04.2012

cppNewb.ru 9

Плюсы и минусы

+ little-endian

как uint32_t (4 байта) – 0x00000022

как uint16_t (2 байта) – 0x0022

как uint8_t (1 байт) – 0x22

- little-endian

отладочное/печатное значение не совпадает с размещением в памяти

28.04.2012

cppNewb.ru 10

Битовые операторы

  • применяются к целым числам

  • унарные

    • NOT (НЕ)

  • бинарные

    • AND (И)

    • OR (ИЛИ)

    • XOR (ИСКЛЮЧАЮЩЕЕ ИЛИ )

    • сдвиг

28.04.2012

cppNewb.ru 11

Биты как элементы множества

  • NOT – дополнение

  • AND – пересечение

  • OR – объединение

  • XOR – симметрическая разность

28.04.2012

cppNewb.ru 12

Битовое НЕ (~)

  • инверсия битов

пример:

unsigned int v(15 + 11 * 256);

printf(“%x

”,

v);

printf(“%x

”,

~v);

v = ~v;

printf(“%x\n”, v);

> b0f fffff4f0 f4f0

28.04.2012

cppNewb.ru 13

Битовое И (&)

  • совпадение ненулевых битов

пример:

unsigned int v1(15 + 11 * 256); unsigned int v2(9 + 11 * 256);

printf(“%x & %x = %x\n”, v1, v2, v1 & v2);

> 00000b0f & 00000d0b = 0000090b

28.04.2012

cppNewb.ru 14

Битовое ИЛИ (|)

  • ненулевые биты

пример:

unsigned int v1(15 + 11 * 256); unsigned int v2(9 + 11 * 256);

printf(“%x | %x = %x\n”, v1, v2, v1 | v2);

> 00000b0f | 00000d0b = 00000f0f

28.04.2012

cppNewb.ru 15

Битовое ИСКЛЮЧАЮЩЕЕ ИЛИ

(^)

  • несовпадение ненулевых битов

пример:

unsigned int v1(15 + 11 * 256); unsigned int v2(9 + 11 * 256);

printf(“%x ^ %x = %x\n”, v1, v2, v1 ^ v2);

> 00000b0f ^ 00000d0b = 00000604

28.04.2012

cppNewb.ru 16

Битовый сдвиг

  • смещение бит в указанном направлении на указанное число позиций

  • “вылезающие” за пределы числа биты теряются

  • “дырки” заполняются

28.04.2012

cppNewb.ru 17

Битовый сдвиг влево (<<)

  • правые биты заполняются нулями

пример:

signed int si(0xFFFFFFFF); unsigned int ui(0xFFFFFFFF); printf(“%08x %08x”, si << 4, ui << 2)

> fffffff0 fffffff8

28.04.2012

cppNewb.ru 18

Битовый сдвиг вправо (>>)

  • левые биты заполняются

    • нулями для беззнаковых

    • битом знака для знаковых

(зависит от реализациии)

пример:

signed int si(0xFFFFFFFF); unsigned int ui(0xFFFFFFFF);

printf(“%08x %08x”, si >> 4, ui >> 4)

> ffffffff 0fffffff

28.04.2012

cppNewb.ru 19

Присваивающие версии

операторов

  • lhs

&=

rhs

  • lhs

|=

rhs

  • lhs

^=

rhs

  • val

<<=

shift

  • val

>>=

shift

28.04.2012

cppNewb.ru 20

Работа с масками

  • AND

    • сброс битов по маске

  • OR

    • установка битов по маске

  • XOR

    • для инвертирования битов по маске

28.04.2012

cppNewb.ru 21

Создание масок

  • константы (литералы, макросы)

  • сдвиги и др. операторы

пример:

const unsigned int m1(1 << 4);

unsigned int m2(0xFF0B1000);

28.04.2012

cppNewb.ru 22

Логические операторы

  • операнды – логические значения

(сравнение с нулем)

  • результат – true или false

  • унарные

    • NOT (НЕ)

  • бинарные

    • AND (И)

    • OR (ИЛИ)

28.04.2012

cppNewb.ru 23

Логическое НЕ (!)

  • инверсия значения

пример:

if (!canMove)

{

//...

}

if (0 != canMove)

//...

28.04.2012

cppNewb.ru 24

Логическое И (&&)

false

&&

false

==

false

false

&&

true

==

false

true

&&

false

==

false

true

&&

true

==

true

  • оптимизация вычислений

пример:

res = res && isGood();

28.04.2012

cppNewb.ru 25

Логическое ИЛИ (||)

false

||

false

==

false

false

||

true

==

true

true

||

false

==

true

true

||

true

==

true

  • оптимизация вычислений

пример:

res = res || needCheck();

28.04.2012

cppNewb.ru 26

Параметры командной строки

  • передаются операционной системой при запуске приложения

  • для отладки могут устанавливаться в среде разработки

  • включают имя самого приложения

int main(int argc, char* argv[])

28.04.2012

cppNewb.ru 27

Пример использования параметров командной строки

int main(int argc, char* argv[])

{

if (3 < argc)

{

string pathIn(argv[1]); string pathOut(argv[2]);

...

}

...

28.04.2012

cppNewb.ru 28

Как отлаживать использование параметров командной строки

  • в настройках проекта

Command ${TargetPath} Command Arguments параметры

Working Directory ${TargetDir} или ${ProjectDir}

28.04.2012

cppNewb.ru 29

Генерация псеводслучайных чисел (rand, srand)

int rand();

  • генерация псевдослучайного числа в диапазоне от 0 до RAND_MAX.

void srand(unsigned int seed);

  • инициализация генератора псевдослучайных чисел

28.04.2012

cppNewb.ru 30

Генерация псеводслучайных чисел в диапазоне

  • от 0 до n - 1

rand() % n

  • от n1 до n2 - 1

n1 + (rand() % (n2 – n1))

28.04.2012

cppNewb.ru 31

Инициализация генератора псевдослучайных чисел

  • определяет начальное значение (seed)

для последовательности

  • используется для улучшения качества псевдослучайной последовательности

  • в качестве начального значения используется некоторое “случайное” значение

28.04.2012

cppNewb.ru 32

Текущее время (time)

time_t time(time_t* timer);

  • текущее время

  • число секунд с 00:00, 1 января 1970 UTC

  • аргумент м.б. 0

пример:

srand(static_cast<unsigned int>(time(0)));

28.04.2012

cppNewb.ru 33

Рекурсия

  • вызов функции из неё же самой, непосредственно (простая рекурсия) или через другие функции

(сложная или косвенная рекурсия)

  • в С++ «использует» стек вызова

  • может заменятся циклом

    • возможно с использованием стека

28.04.2012

cppNewb.ru 34

Рекурсия (плюсы и минусы)

  • естественный способ (вычислений)

  • простота организации и наблюдения

  • зацикливания и переполнения стека

    • сложность соблюдения допустимой

«глубины»

    • сложность косвенной рекурсии

  • использовать не рекомендуется

28.04.2012

cppNewb.ru 35

Пример использования рекурсии

/**

рекурсивное вычисление факториала

*/

int factorial(const int n)

{

return n ? (n * factorial(n - 1)) : 1;

}

28.04.2012

cppNewb.ru 36

Указатель на функцию

ТипВозврата (*имя)(список_аргументов)

пример:

bool (*pCmp)(const int, const int)(0); pCmp = compareByIdx;

pCmp(i1, i2); // или (*pCmp)(i1, i2)

28.04.2012

cppNewb.ru 37

Функция обратного вызова

(call back function)

  • передача исполняемого кода в качестве одного из параметров другого кода

  • позволяет

    • исполнять в функции код, который задаётся в аргументах при её вызове

    • определять конкретный алгоритм на этапе выполнения (а не компиляции) программы

28.04.2012

cppNewb.ru 38

Функция обратного вызова

(назначение)

  • подзадача, которая используется для обработки данных внутри некоторой функции

  • “телефонная связь”, используемая для того, чтобы “связываться” с тем, кто вызвал процедуру, при наступлении какого-то события

28.04.2012

cppNewb.ru 39

Сортировка (qsort)

void qsort(void* base, size_t num, size_t size,

int (*cmp)(const void*, const void*));

  • сортировка num блоков памяти размера

size в массиве base

  • для сравнения используется функция

cmp

28.04.2012

cppNewb.ru 40

Пример (qsort)

// pData – массив структур SBook

// num – число элементов в массиве

int (*pCmp)(const void*, const void*)(cmpByYear);

qsort(pData, num, sizeof(*pData), pCmp);

28.04.2012

cppNewb.ru 41

Пример (qsort)

int cmpByYear(const void* pL, const void* pR)

{

assert((0 != pL) && (0 != pR));

SBook& lhs(*reinterpret_cast<SBook*>(pL)); SBook& rhs(*reinterpret_cast<SBook*>(pR)); return (rhs.m_year - lhs.m_year);

}

28.04.2012

cppNewb.ru 42

Проблемы call-back функций

  • нет контроля типов

  • накладные на вызовы функций

  • глобальные данные

28.04.2012

cppNewb.ru 43

Стандартные алгоритмы

  • шаблонные функции,

параметризуются через

    • итераторы

    • функторы

  • если тип итераторов контейнера не соответствует типу итераторов алгоритма, поищите метод контейнера

28.04.2012

cppNewb.ru 44

std::find (пример алгоритма)

template<class InputIt, class T> InputIt find(InputIt first,

InputIt last, const T& value)

{

for(;first != last; ++first) if (*first == value)

break; return first;

}

28.04.2012

cppNewb.ru 45

std::sort (варианты функции)

  • для контейнеров с произвольным доступом

template<class RandAccIt> void sort(RandAccIt first,

RandAccIt last)

template<class RandAccIt, class Compare>

void sort(RandAccIt first,

RandAccIt last, Compare comp)

28.04.2012

cppNewb.ru 46

std::sort (варианты функции)

  • для списка

void list::sort()

template <class Compare>

void list::sort(Compare comp)

28.04.2012

cppNewb.ru 47

Функтор

(функциональный объект)

  • экземпляр любого класса,

перегружающего operator()

  • используется для параметризации алгоритмов

  • может встраиваться компилятором в тело алгоритма (в отличии от обычной функции)

28.04.2012

cppNewb.ru 48

Функтор

(функциональный объект)

  • может содержать данные

  • может копироваться в процессе работы алгоритма

    • для некоторых алгоритмов не должен иметь изменяемого состояния

28.04.2012

cppNewb.ru 49

Свойства функторов

(traits)

  • информация о типах аргументов и результата

  • используются в шаблонном коде

28.04.2012

cppNewb.ru 50

std::unary_function

template <class Arg, class Res> struct unary_function

{

typedef Arg argument_type; typedef Res result_type;

};

28.04.2012

cppNewb.ru 51

std::binary_function

template <class Arg1, class Arg2, class Res>

struct binary_function

{

typedef

Arg1

first_argument_type;

typedef

Arg2

second_argument_type;

typedef Res result_type;

};

28.04.2012

cppNewb.ru 52