
- •15. Определение новых функций. Способы размещения программы.
- •16.Передача параметров в функции.
- •17.Полиморфизм и перегрузка функции.
- •19. Потоки ввода/вывода.Описание.
- •28. Связные списки
- •29. Понятие рекурсии, принцип выполнения, примеры
- •30. Сравнения, рекурсивного и циклического выполнения функции
- •34.Перегрузка оператора
28. Связные списки
Связный список состоит из узлов. В каждом узле хранятся некоторые данные и указатель на следующий узел списка . В программе, работающей со списком, обычно есть еще один отдельный указатель, ссылающийся на первый узел списка ("pointer" ). В указатель последнего узла принято записывать значение "NULL". Размер связных списков, в отличие от массивов, можно изменять динамически (во время выполнения программы можно добавлять/удалять отдельные узлы в любом месте списка). Оператор "struct" позволяет создать новый тип данных, в отличие от оператора "typedef", который, по существу, предназначен для присвоения нового имени уже существующему типу данных. Структура – это набор разнотипных переменных (в противоположность массиву, состоящему из элементов одного типа). Для доступа к полям (внутренним переменным) структуры "my_node" надо пользоваться оператором "."
29. Понятие рекурсии, принцип выполнения, примеры
Если в определении функции содержится вызов ее самой, то такая функция называется рекурсивной Для выполнения вызова функции в памяти компьютера выделяется некоторое количество памяти (необходимое для запоминания адреса возврата, для создания копий параметров по значению и для передачи параметров-указателей). Для организации вызовов функций и создания автоматических переменных в программах на Си++ отводится специальная область памяти – стек. Память, необходимая для очередного вызова функции, выделяется в верхней части стека (в старших адресах). При завершении функции размер стека уменьшается на соответствующую величину. Характерная особенность стека – соответствие принципу "последним прибыл – первым обслужен".
30. Сравнения, рекурсивного и циклического выполнения функции
Любую рекурсивную функцию можно реализовать итеративно, т.е. с помощью циклов "for", "while" или "do...while". какое определение функции выбрать (рекурсивное или итерационное) – вопрос пристрастий программиста. Исходный текст рекурсивных функций иногда легче для понимания, но итерационные функции практически всегда работают быстрее. Конечно, вопрос о том, какая реализация конкретной функции более понятна, довольно спорный. Обычно в итерационную функцию приходится включать больше локальных переменных, например, в первом примере был добавлен массив "chars[MAX_ARRAY_LENGTH]", а во втором примере – целочисленная переменная "product". Другими словами, в итеративных функциях память тратится на локальные переменные, а рекурсивных функциях – на организацию вызовов.
31. Назначение, описания инициализация составных типов данных
Структура – это составной тип данных, который получается путем объединения компонент, принадлежащих к другим типам данных (возможно, тоже составным). Структура предназначена для объединения нескольких переменных в один тип данных. Сначала тип структуры надо описать, а затем можно создавать переменные этого нового типа. Описание типа структуры "T" имеет следующий синтаксис: struct T { T1 var1; T2 var2; }; точка после фигурной-обязательно. Для выбора компонент внутри "s1" или "s2" применяется операция "."
32. Способы доступа к компонентам структуры данных
для доступа к компонентам структуры через указатель применяется операция "->"
void print_person( Person* p ) { cout << p->name << '\n';} void print_person( Person* p ) { cout << (*p).name << '\n';}Обратите внимание на скобки в записи "(*p).", которые необходимы, поскольку приоритет операции "." выше, чем у "*":
33. Описание и использование массивов структур данных
У массива и структуры есть общее свойство: оба этих типа данных являются типами с произвольным доступом. Но структура более универсальна, поскольку не требуется, чтобы типы всех ее компонент были одинаковы. С другой стороны, в некоторых случаях массив предоставляет бóльшие возможности, т.к. индексы его элементов могут вычисляться, а имена компонент структуры – это фиксированные идентификаторы, задаваемые в описании типа. Массивы и структуры могут комбинироваться различными способами. Например, i-я компонента массива "a", который является компонентой структуры "r", обозначается как r.a[i] Напротив, компонента с именем "s", входящая в i-ю компоненту-структуру массива структур "a" обозначается как a[i].s