Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

билеты

.doc
Скачиваний:
11
Добавлен:
27.05.2013
Размер:
154.11 Кб
Скачать

1. Принципы повышения надежности программного обеспечения.1 – применение блочно-модульной структуры при построении программ; 2 – корректное использование типов данных; 3 – корректное выделение памяти для динамических объектов в ОЗУ; 4 – проверка границ массива и присвоение значений указателям; 5 – Использование явной инициализации переменных массивов и указателей; 6 – минимизация использования глобальных переменных с целью устранения неоднозначности при работе с функциями; 7 – корректная расстановка скобок, кавычек и апострофов в программе; 8 – внимательное отслеживание логики работы программы; 9 – исключение деления на ноль, работы с бесконечно малыми и б.б. целыми и вещественными числами; 10 – исключение зацикливания программы; 11 – внимательное чтение сообщений компилятора об ошибках и предупреждениях; 12 – итерационная коррекция ошибок в программе; 13 – выполнения явного закрытия файлов, потоков ввода – вывода, закрытие портов ввода – вывода, а также удаление динамических объектов; 14 – компилятор не догма, а руководство к действию.

2. Переменные перечислимого типа – или перечисление – называется переменная, которая может принимать значение из некоторого списка значений. Объявление перечисления начинается с ключевого слова enum и имеет два формата представления: 1 - enum [ имя тега перечисления ] { список } описатель, … в первом формате имена и их значения перечисления задаются в списке перечислений, не обязательно имя тега – идентификатор. Описатель именует переменную перечисления. Объявление перечисления задает тип переменной перечисления и определяет список именованных констант, который называется списком перечисления. Значением каждого имени списка является некоторое целое число. Именованные константы, входящие в список имеют тип целая. Переменные перечислимого типа могут использоваться как операнды в арифметических операциях, а также в индексных выражениях. Использование элементов перечисления должно подчиняться след. правилам: 1 – переменная может содержать неповторяющиеся значения; 2 – идентификаторы в списке перечисления должны быть отличны от всех других иден-ов, входящих в ту же область видимости, включая имена обычных переменных и иден-ры из других списков перечисления; 3 – имена типов перечисления должны быть отличны от других имен типов перечисления, структур, объединений, находящихся в одной и той же области видимости; 4 – значение может следовать за последним элементом списка перечисления. 2. enum имя тега перечисления описатель. В этом формате используется имя тега перечисления для ссылки на тип перечисления, определяемый в другом месте. Поскольку тег перечисления объявлен в другом месте список перечисления не представлен в объявлении.

3. Структуры - это составной объект, в который входит элементы любых типов, за исключением функций. Может быть неоднородной. Тип структуры определяется записью вида: strukt имя { список определений }. Имя структуры идентифицирует данную последовательность элементов и может быть использовано в дальнейших рамках программы для определения новых переменных. Элементы структуры представляют собой переменные, которые имеют различный тип и наименование. Элементы структуры могут использоваться только в составе структуры. Переменная структуры заключает в себя тип и состав элементов структуры. Структура может быть объявлена и сама по себе без объявления переменных. Способ работы со структурой вытекает из ее аналогии с массивом. Также как нельзя выполнить операцию над всем массивом, а только над его элементом, структура требует выделения ее отдельного элемента. Для этой цели используется операция точка. Структура играет важную роль среди других способов представления данных. Элементы структуры связаны между собой не только физически, но и логически, поскольку представляют собой характеристики и свойства одной

сущности или предмета, состояние которого отображается в программе. Исходя из этого можно заключить, что структурная переменная в программе соответствует понятию объекта.

4. Указатели на структуру. Операция -> понимается как выделение элемента в структурированной переменной, адресуемой указателем. В данном случае операндами являются указатель на структуру и элемент структуры. Операция поиска элемента указателя на структуру имеет полный аналог в виде сочетания операций “*” и “.”.

5. Структура как формальный параметр. В классическом языке Си формальными параметрами могут выступать базовые типы данных и указатели. Передача параметров в функцию по назначению связано с их копированием. Данную операцию должен уметь выполнять и компилятор. Поскольку массивы, как и структуры нельзя копировать целиком, а только поэлементно, то в формальных параметрах могут быть только указатели на них.

6. Структура как результат функции. Указатель на структуру может быть также результатом функции. В этом случае в операторе return должен быть указатель(адрес) некоторой структурированной переменной, которая будет доступна по завершении работы функции. С технической точки зрения данная операция не вызывает проблем, но возникает вопрос откуда берется эта переменная. Источники: переменная не может быть локальной в рамках функции, поскольку она уничтожиться сразу по окончании работы функции; функция может возвратить указатель на любую доступную начальную переменную; функция может возвратить указатель на переменную, которая в свою очередь получена функцией через указатель на переменную или массив; функция может возвратить указатель на динамическую переменную, создаваемую в процессе работы функции.

7. Рекурсивное описание структур. Структура как элемент типа данных может в списке своих данных содержать указатель на саму себя. Такое описание используется припрограммной реализации списочных структур. В качестве списочной структуры могут выступать: однонаправленный список, двунаправленный список, кольцевой однонаправленный, кольцевой двунаправленный, древовидная структура. Имя структуры узел действительно является рекурсивным, поскольку в своем собственном описании он сам и используется. В описании структуры используется формализованный указатель. Структуры не могут быть прямо рекурсивными, т.е. структура не может содержать в себе элемент структуры, но при этом любая структура может иметь в своем составе элемент, являющийся указателем на свой тип.

8. Объединения. Понятие объединения подобно структуре. Однако в каждый момент времени может использоваться только один из элементов объединения.( union). Главной особенностью объединения является то, что для каждого из объявленных элементов объединения выделяется одна и та же область памяти, т.е. элементы объединения делят между собой эту область, перекрываясь. Хотя доступ к этой области памяти возможен с использованием любого из элементов списка. Элемент для этой цели должен выбираться так, чтобы полученный результат не был бессмысленным. Доступ к элементам объединения осуществляется также как и у структуры. Объединение применяется для след. целей: инициализация используемого объекта памяти, т.е. если в каждый отдельный момент времени только один из многих объектов является активным; для интерпретации основного объекта одного типа, как если бы этому объекту был присвоен другой тип. Память, которая соответствует переменной типа объединения определяется величиной необходимой для размещения элемента об-ния наибольшей длины. Все элементы об-ния хранятся в одной и той же области памяти, начиная с одного адреса. (прерывания DOS и BIOS)

9. Битовые поля. Элементом структуры может быть битовое поле, облегчающее доступ к отдельным битам памяти, вне структур битовые поля объявить нельзя. Нельзя организовать массивы битовых полей и нельзя применить к полям битов операцию адреса. В общем случае тип структуры с битовым полем задается в следующем виде: struct имя {unsigned идентификатор1: длина поля1 …} переменная 1, … В общем случае битовое поле задается следующим образом: ключевое слово, имя поля, список: идентификатор и количество бит, описание переменных. Длина поля задается целым выражением или константой. Эта константа определяет число битов, отведенное соответствующему полю. Поле нулевой длины означает выравнивание на границу следующего слова. Структуры битовых полей могут содержать и знаковые компоненты. Ссылки на битовые поля выполняются также как и на компоненты традиционных структур. Само битовое поле рассматривается как целое число, при чем число должно быть таким, которое может быть записано в отведенные битовые разряды.

10. Определение типов данных. Все переменные в Си должны быть объявлены в программе до их использования. Тип объявляемой переменной зависит от того, какое ключевое слово используется в качестве спецификатора типа. При этом необходимо понимать, является ли описатель идентификатором или же комбинацией иден-ра с модификатором. В качестве мод-ра могут выступать: *-работа с указателем, []- работа с массивом, () – работа с функцией. Кроме возможных объявлений переменных базовых типов есть возможность объявлять в программе собственные типы. Существует два способа: 1 – заключается в объявлении имени тега при описании структуры, объединения или перечисления, а затем использование этого имени при объявлении переменных или функций в качестве ссылки на это имя. 2 – заключается в объявлении ключевого слова typedef. При объявлении с этим ключевым словом иден-р, стоящий на месте описываемого объекта является именем вводимого в рассмотрение типа данных и далее в программе этот тип может использоваться для объявления переменных и функций. Имя с ключевым словом typedef для типов указателя на структуры, объединения может быть объявлен прежде, чем эти типы будут определены в программе. Имена типов могут использоваться в четырех случаях: 1 – в списке формальных параметров, 2 – в объявлении функций, 3 – в операциях приведения типов, 4 – операция sizeof.

11. Динамические переменные и их свойства. Можно выделить три варианта возможных изменений размерности переменных в программе: 1 – статический вариант, когда размерность устанавливается при трансляции, 2 – размерность данных становится известной в некоторый момент работы программы ( затем установленная размерность не изменяется в процессе работы программы), 3 – размер данных меняется в течении всего времени работы программы. Два последних варианта могут быть реализованы при наличии механизма создания и уничтожения переменных работающей программы. Такие переменные называются динамическими. А область памяти, в которой они создаются динамической памятью. В динамической памяти возможно выделение непрерывных участков памяти. Эти участки служат для хранения большого объема неделимой информации. Ср-ва работы с динамической памятью могут быть реализованы двумя способами: 1 – при помощи операторов(pascal), 2 – при помощи внешних библиотечных функций(Си++). Св-ва динамических переменных: 1 – динамические переменные создаются и уничтожаются работающей программой посредством операторов или ф-ций; 2 – кол-во и размерность динам переменных может меняться в процессе работы программы и зависит от кол-ва вызовов соответствующих ф-ций и передаваемых при вызове параметров; 3 – динамическая переменная не имеет имени, а доступ к ней осуществляется при помощи указателя; 4 – при выполнении ф-ции создания

динамической переменной в heape выделяется свободная память и возвращается указатель на адрес выделенной памяти; 5 – ф-ции уничтожения динамической переменной передается указатель на уничтожаемую переменную.

12. Динамические массивы. Поскольку любой указатель в языке Си++ по определению адресует массив элементов указываемого типа, то функция malloc может использоваться не только для создания отдельных переменных, но и их массивов. Тот же самый указатель, который запоминал адрес некоторой динамической переменной будет использоваться для работы с массивом. Размерность массива задается параметром функции malloc во время работы программы и следовательно может выступать в качестве переменной. Массивы, создаваемые в динамической памяти, называют динамическими массивами. Язык С++ позволяет использовать одинаковый синтаксис при работе с обычными и динамическими массивами. Во многих языках, где используется интерпретатор (basic, java), подобный механизм скрыт от программиста в самом интерпретаторе, поэтому массивы там по своей природе могут быть переменной размерности и определятся в ходе выполнения программы.

13. Работа с динамической памятью. Ф-ции, работающие с динамической памятью используются для создания динамических переменных и динамических массивов производных типов. Исходя из этого данные функции не вникают в содержание создаваемых стр-р данных, а единственно важным для них является размер стр-р данных, выраженный в байтах. Адрес выделенной области памяти возвращается в виде не типизированного указателя (void *), который представляет собой абстрактный адрес памяти без определения адресуемого типа данных. Р-м объявление основных функций для работы с динамической памятью: 1 – void * malloc( int size) – данная функция осуществляет выделение области памяти размером size байтов и возвращает не типизированный указатель на эту область памяти. 2 – void free(void *p) – данная ф-ция позволяет высвобождать область памяти, выделенную по адресу р. 3 – void *realloc(void p, int size) – данная ф-ция позволяет изменить размер выделенной области памяти до размера size, а при изменении адреса переписать старое содержимое выделенного блока памяти.

14. Операции new и delete. В языке С++ для работы с динамической памятью используются операции выделения памяти new и освобождения памяти delete. Операция new создает объект типа, к которому он применен. Операция delete уничтожает объект, созданный new. Операнд операции delete должен быть указателем, возвращ. операцией new. В операцию delete может быть передан пустой указатель. Другая форма: delete[выр] выр – позволяет удалять динамические переменные. Используется для работы с классами.

15. Массивы указателей и работа с ними. Массивы указателей как и все остальные структуры данных, содержащие указатели допускают различные способы формирования, которые отличаются как способом создания самих элементов, так и способом установления связи между этими элементами. 1 – указуемые элементы могут быть как статическими, так и динамическими. 2 – указатели или связи между элементами могут быть инициализированы, т.е. их значение устанавливается при трансляции программы, так и назначены в процессе выполнения программы. 4 варианта формирования: 1 – формирование структуры при трансляции, В этом варианте переменные определяются статически, а указатель инициализируется при трансляции; 2 – переменные определяются статически, указатели устанавливаются программно, данный вариант наиболее часто используется в том случае, когда указуемые переменные представлены в виде массива; 3 – указуемые переменные создаются динамически, массив указателей

статически; 4 – все переменные в том числе и массив указателей создаются динамически, результатом работы является указатель на создаваемый массив указателей( адрес массива указателей). Разница между обычным массивом и массивом указателей заключается в том, что в массиве элементы упорядочены физически, их расположение определяется последовательностью адресов памяти. В массиве указателей последовательность элементов задается последовательностью размещения указателей в массиве. Таким образом, при работе с обыкновенным массивом мы взаимодействуем с элементами, а при работ с массивом указателей с их адресами.

16. Многоуровневые указатели. Рассмотрим конструкцию: double *p. В соответствии с принципом контекстного определения р – необходимо интерпретировать как переменную, при косвенном обращении к которой получается указатель на переменную типа double, т.е. как указатель на указатель или адрес указателя. Применительно к двойному указателю можно выделить четыре варианта стр-ры данных, а именно: 1 – указатель на одиночный указатель на переменную типа double; 2 – указатель на одиночный указатель на массив переменных типа double; 3 – указатель на массив, содержащий указатели на одиночные переменные типа double; 4 – указатель на массив, содержащий указатели на массивы переменных типа double.

17. Списки как динамические структуры данных. Список представляет собой линейную последовательность переменных, каждая из которых связана указателями со своими соседями. Списки бывают: 1 – односвязный список – это такой список, в котором каждый элемент имеет указатель на следующий элемент списка. 2 – односвязный циклический – это такой список, в котором последний элемент указывает на начало списка. 3 – двусвязный список – это вид списка, в котором каждый элемент имеет указатель на предыдущий и последующий элементы. 4 – двусвязный циклический список – это список, в котором первый и последний элемент ссылаются друг на друга.

18. Способы формирования списков. Хотя списки представляют собой динамические структуры данных, способы их формирования могут быть различными вплоть до статических. 1 – элементы – это обычные переменные, связи инициализируются транслятором, вся структура данных записана в программном коде. 2 – Элементы списка создаются в обычном массиве, поэтому их число ограничено. Связи между элементами списка устанавливаются динамически, т.е. в процессе работы программы. Такой вариант используется, когда заданное количество элементов образуют несколько динамических структур. Примером такого подхода является управление задачами в операционной системе, которые в процессе работы организуются в несколько различных очередей(списков). 3 – Элементы списка являются динамическими переменными, а связи

между этими переменными устанавливаются программно в ходе отработки программного кода.

19. Односвязные списки. Простейшим элементом, представляющим динамические структуры, являются односвязные списки – такие списки, в которых каждый элемент списка имеет указатель на следующий элемент. Такие списки называют однонаправленными. Просмотр его без дополнительных ухищрений возможен только от первого элемента к последнему.

20. Очереди и стеки. Наиболее простыми являются операции включения в начало и конец элементов односвязного списка. Сюда же можно отнести операции исключения первого и последнего элементов списка. Таким образом можно легко промоделировать стек и очередь посредством односвязного списка. При этом запись в стек моделируется записью в начало списка. Извлечение из стека моделируется включением в конец списка. Запись в

очередь моделируется включением в конец списка. Извлечение из очереди моделируется удалением элемента, расположенного в начале списка.

21. Двусвязные списки. Двусвязный список – это такой список, в котором каждый элемент имеет два указателя. Указатель на предыдущий элемент и последующий. Основным отличием двусвязного списка от односвязного является то, что просмотр элементов в списке можно осуществлять в двух направлениях. Основное применение двусвязных списков: создание упорядоченной последовательности элементов при частых операциях включения и исключения.

22. Циклические списки. Основной сложностью при работе со списками является необходимость проверки множества вариантов при выполнении операций над элементами списка: 1 – список пустой; 2 – элемент единственный; 3 – элемент в начале списка; 4 – элемент в конце списка; 5 – элемент в середине списка. Особенная сложность заметна при работе с двусвязным списком. Для решения проблемы конечных элементов списка бывает целесообразным сделать данный список циклическим. Иными словами вместо указателей NULL, которые характеризуют начальный и конечный элементы списка сообразно записывать: 1 – указатель на последний элемент в качестве указателя на предыдущий в первом элементе списка; 2 – указатель на первый элемент в качестве указателя на последующий в последнем элементе списка. При выполнении операций над циклическим списком необходимо следить за его заголовком. Так, например, операция включения в начало списка будет отличаться только перемещением заголовка на новый элемент.

23. Рекурсивные структуры данных. Существуют структуры данных, допускающие рекурсивное определение. Элемент структуры данных содержит один или несколько указателей на самого себя. Рекурсивная функция, обрабатывающая структуру данных получает в качестве параметра указатель на некоторый элемент. Если этот элемент содержит корректный, неравный NULL, указатель на другие элементы и если алгоритм требует их просмотра, то данная функция называется рекурсивной, с параметром указателем на новый элемент.

24. Деревья и бинарные деревья. Определение дерево имеет исключительно рекурсивную природу. Элемент этой структуры данных называется вершиной. Дерево представляет собой либо отдельную вершину, либо вершину, имеющую ограниченное число указателей на другую вершину. Нижележащие деревья для текущей вершины называются поддеревьями, а их вершины - потомками. По отношению к потомкам текущая вершина называется предком. Из определения элементов дерева следует только тот факт, что оно имеет ограниченное число указателей на подобные элементы. Как и во всех динамических структурах данных характер связей между элементами определяется функциями, которые их устанавливают. Само дерево обычно задается в программе указателем на его главную вершину. Очень часто обход дерева используется для получения информации, которая затем возвращается через результат рекурсивной функции. Двоичным или бинарным деревом называется дерево, каждая вершина которого имеет не более двух потомков. Кроме того, на данные, хранимые в вершинах дерева, вводится следующее правило упорядочивания: значение вершины левого поддерева всегда меньше , а значение вершин правого поддерева больше, чем в самой вершине дерева.

25. Графы как структуры данных. Граф представляет собой структуру с произвольным характером связей между элементами данной структуры. С точки зрения программирования наличие в элементе А указателя на элемент Б соответствует наличию в графе дуги, направленной от А к Б. Процедуры работы с графом могут предусматривать его рекурсивный обход, при этом из алгоритма обхода следует исключать уже пройденные вершины графа для того, чтобы исключить зацикливание программы.

26. Перегрузка функций. В языке Си++ возможно переопределение нескольких функций с одинаковыми именами и разными параметрами Переопределяемую функцию необходимо объявить с ключевым словом overload. Функции-элементы структуры также могут быть переопределены. При этом их явного объявления не требуется.

27. Параметры функции по умолчанию. При определении формальных параметров функции могут быть указаны их значения, принимаемые при вызове по умолчанию при отсутствии этого параметра в списке фактических.

28. Понятие объектно-ориентированного программирования. Объектно-ориентированное программирование – это совокупность таких терминов как класс, объект, наследование, инкапсуляция и полиморфизм. Кроме того в понятие ООП входят технологии и приемы их использования, а язык С++ выступает в качестве инструмента этой технологии. Центральным звеном в ООП являются такие понятия, как класс и объект. ООП заключается не столько в использовании классов и объектов в программе, сколько в замене принципа программирования от функции к функции принципом программирования от класса к классу. Исходя из этого наибольшей абстракцией обладает понятие класс. Экземпляр класса или объект является производным понятием от класса и соответственно обладает меньшей абстрактностью. ООП: инкапсуляция, наследование, полиморфизм. Инкапсуляция подразумевает слияние данных класса(свойств) с правилами(методами), которые обеспечивают жизнеспособность класса и производного от класса объекта. Наследование обеспечивает порождение иерархии классов, таким образом, что свойства и методы предыдущего класса наследуются последующим классом. При этом можно говорить, что наследование происходит от родителя к потомку. Такой тип наследования называется линейным. Полиморфизм – это технология при работе с объектом, когда существует возможность использования одного и того же метода для реализации в различных объектах. При этом метод, используемый в качестве полиморфного, объявляется виртуальным.

29.Указатель this. Каждый объект сопровождается указателем на самого себя, который носит имя this. Данный указатель представляет собой неявный аргумент во всех ссылках на элемент внутри объекта. Указатель this можно использовать в явной форме. Каждый объект может определить свой собственный адрес при помощи этого указателя. При явном использовании указателя this каждая функция-элемент(метод) имеет доступ к указателю this на объект для которого вызван этот элемент.

30. Синтаксис определения классов и объектов. Объект – это структурная переменная, содержащая всю информацию о некотором физическом предмете или реализуемом в программе понятии. Класс – описание множества таких объектов и выполняемых над ними действий. В простейшем случае класс определяется в С++ как структура данных, работа с элементами которой возможна только через функции-элементы. В отличие от структуры класс имеет личную часть, элементы которой доступны только в методах класса и общую, элементы которой ограничения доступа не имеют. Таким образом, объектом называется переменная, тип которой является класс. Личная часть класса необязательно должна следовать в начале определения класса. Как правило закрытая часть класса определяет данные объекта, а функции-элементы(методы), описанные в общей части ,образуют интерфейс объекта к внешнему миру. Элемент данных в общей части класса открыт для внешнего пользования как любой элемент структуры. Функция-элемент(метод) личной части класса может быть вызвана только функциями-элементами самого класса и закрыта для внешнего использования. Таким образом в первом приближении класс отличается от структуры четко определенным интерфейсом доступа к его элементам. Объекты класса обладают всеми свойствами переменных в т.ч. такими, как область действия и время жизни.

31. Конструктор и деструктор. Процесс создания и уничтожения объектов класса обычно сопровождается некоторыми действиями такими, как инициализация данных, резервирование памяти, резервирование ресурсов операционной системы, которые производятся функциями-переменными класса(методами) специализированного вида. Методы неявно вызываемые при создании и уничтожении объектов класса называются соответственно конструкторами и деструкторами. Они определяются как элементы-функции(методы) с именами, совпадающими с именем класса. Конструкторов для данного класса может быть сколь угодно много, если они отличаются формальными параметрами. Деструктор класса всегда один. С процессом создания объектов связано понятие их инициализации. Инициализировать объекты обычным способом нельзя, их инициализация осуществляется либо в явном присваивании(копированием другого объекта), либо неявным вызовом конструктора. Если конструктор имеет формальные параметры, то в определенной переменной после ее имени должны присутствовать в скобках значения ее фактических параметров. Момент вызова конструктора и деструктора определяется временем создания и уничтожения объектов.

32. Дружественность. Когда некоторые функции или другие классы требуют разрешения доступа к личной части объекта класса, то в определении класса к объектам которого разрешается такой доступ, должно быть объявление функции или другого класса, как дружественного. Это согласуется с тем принципом, что сам класс определяет право доступа к объектам со стороны. Объявление дружественной функции представляет собой прототип функции, объявляет переопределение операции или имя класса, которому разрешен доступ с ключевым словом.