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

Voprosy_k_ekzamenu_po_informatike

.pdf
Скачиваний:
41
Добавлен:
09.06.2015
Размер:
2.24 Mб
Скачать

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

11

3. ПОНЯТИЕ АЛГОРИТМА, СИСТЕМЫ ТЕКСТОВЫХ ЗАМЕН.

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

Теория алгоритмов. Изучение теории алгоритмов сфокусировано на поиске ответов на фундаментальные вопросы о том, что можно вычислить и какое количество ресурсов необходимо для этих вычислений. Для ответа на первый вопрос в теории вычислимости рассматриваются вычислительные задачи, решаемые на различных теоретических моделях вычислений. Второй вопрос посвящён теории вычислительной сложности; в этой теории анализируются затраты времени и памяти различных алгоритмов при решении множества вычислительных задач.

Свойства алгоритма: массовость, результативность, детерминированность, дискретность, правильность.

Массовость – возможность использования алгоритма для классов объектов данных, допустимых в качестве исходных, может создаваться для одного понятия.

Результативность – возможность получения результата без ограничений на время, количество действий и т.д.

Детерминированность – это есть четкое понятие последовательности шагов. Каждый шаг алгоритма должен быть строго определен и не может допускать различных толкований.

Дискретность – свойство алгоритма, которое характеризует его структуру.

Понятность – наличие некоторого алгоритма, описывающего процесс выполнения других алгоритмов на наличие некоторого исполнителя (человека, машины).

Классификация алгоритмов. Алгоритмы бывают последовательными и параллельными, разветвляющимися и циклическими, рекурсивными.

Алгоритм называется терминистическим, если он для всех последовательностей шагов обработки информации заканчивается после конечного числа шагов.

12

Алгоритм называется детерминистическим, если нет никакой свободы в выборе очередного шага обработки.

Алгоритм называется детерминированным, если результат его определен однозначно.

Система текстовых замен. Пусть алгоритм на входе и выходе использует слова из множества V* над некоторым набором символов V. Любую информацию можно представить в виде слов. Простейшими шагами обработки слов являются замена определенных подслов-образцов, другими словами: такой подход приводит к записи алгоритмов в форме СТЗ. СТЗ – это конечное множество замен R над множеством символов V є V*.

Нормальные алгоритмы Маркова. Нормальные алгоритмы Маркова – один из стандартных способов формального определения понятия алгоритма. Пусть V – множество символов. Пара (v, w) є V * X V* называется заменой над V. Часто замену записывают в виде v → w. Конечное множество замен R будем называть системой текстовых замен (СТЗ) над V. Элементы этой системы называют правилами текстовых замен – ПТЗ. СТЗ служат для представления алгоритмов. Отдельные шаги этих алгоритмов — это применение правил замен.

Применение правила замен. Замена s → t называется применением правила v → w, если имеются слова a, v, w, z є V * такие, что справедливо: s = a

° v ° z, t = a ° w ° z.

Пусть есть правило замены Н → РАБ. s = БАНАН. То есть a = БА, v = H, w = РАБ, z = AH. Результатом применения правила станет замена:

БА·Н·АН → БА·РАБ·АН.

Однако, если a = БАНА, v = H, w = РАБ, z = e, то результат замены будет следующий:

БАНА·Н·e → БАНА·РАБ·e или БАНАН → БАНАРАБ.

Слово s V* называется терминальным (или терминалом) в R, если не существует слова t V* такого, что справедливо следующее: замена s → t является применением какого-либо правила из R. Таким образом, к терминальному слову s нельзя больше применить никакого правила замены.

13

4. СПОСОБЫ ОПИСАНИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ: БНФ-НОТАЦИИ, СИНТАКСИЧЕСКИЕ ДИАГРАММЫ.

БНФ (Форма Бэкуса — Наура) – формальная система описания синтаксиса, в которой одни синтаксические категории последовательно определяются через другие категории. Используется для описания синтаксиса языков программирования, данных, протоколов и т. д.

БНФ-конструкция определяет конечное число символов. Кроме того, она определяет правила замены символа на какую-то последовательность букв (терминалов) и символов. Процесс получения цепочки букв можно определить поэтапно: изначально имеется один символ (символы обычно заключаются в угловые скобки, а их название не несет никакой информации). Затем этот символ заменяется на некоторую последовательность букв и символов, согласно одному из правил. Затем процесс повторяется (на каждом шаге один из символов заменяется на последовательность, согласно правилу). В конце концов, получается цепочка, состоящая из букв и не содержащая символов. Это означает, что полученная цепочка может быть выведена из начального символа.

БНФ-конструкция состоит из нескольких предложений вида: <определяемый символ> ::= <посл.1> | <посл.2> | . . . | <посл.n>,

описывающих правила. Такое правило означает, что символ <определяемый символ> может заменяться на одну из последовательностей <посл.i>. Знак определения обычно выглядит как ::= или →, но возможны и другие варианты.

Вот пример БНФ-конструкции, описывающей правильные скобочные последовательности:

<правпосл>::=<пусто> | (<правпосл>) | <правпосл><правпосл>

Это простая конструкция, состоящая всего из одного правила, утверждающего, что символ <правпосл> может замениться либо на пустое место, либо на этот же символ <правпосл>, заключённый в скобки, либо на два символа <правпосл> идущих подряд.

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

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

14

исходном тексте программ. В прямоугольных рамках приведены элементы, требующие дальнейшего определения, возможно, с помощью других синтаксических диаграмм. Набор таких диаграмм служит формальным описанием синтаксиса языка программирования.

Пример синтаксической диаграммы, построенной для оператора if..else

языка C++:

15

5. КЛАССИФИКАЦИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ, ЭЛЕМЕНТЫ ЯЗЫКА ПРОГРАММИРОВАНИЯ С/С++: АЛФАВИТ, СЛОВА, КОНСТАНТЫ.

Классификации языков программирования. По наиболее распространенной классификации все языки программирования, в соответствии с тем, в каких терминах необходимо описать задачу, делят на языки низкого и высокого уровня. Если язык близок к естественному языку программирования, то он называется языком высокого уровня, если ближе к машинным командам,

– языком низкого уровня.

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

Машинно–ориентированные языки – это языки, наборы операторов и изобразительные средства которых существенно зависят от особенностей ЭВМ (электронные вычислительные машины) (внутреннего языка, структуры памяти и т.д.).

Машинно–независимые языки – языки, ориентированные не на систему команд той или иной ЭВМ, а на систему операндов, характерных для записи определенного класса алгоритмов. Однако программы, написанные на языках высокого уровня, занимают больше памяти и медленнее выполняются, чем программы на машинных языках. Примерами таких языков программирования являются: Фортран, Бейсик, C и т.п.

Категории языков программирования. Машинно-независимые языки программирования делятся на следующие категории: процедурные, логические и функциональные.

Функциональное программирование объединяет разные подходы к определению процессов вычисления на основе достаточно строгих абстрактных понятий и методов символьной обработки данных. Примерами функциональных языков программирования являются: Haskell, F#.

Логическое программирование — подход к программированию,

основанный на автоматическом доказательстве теорем, а также раздел дискретной математики, изучающий принципы логического вывода

16

информации на основе заданных фактов и правил вывода. Примером логического языка программирования является Prolog.

Процедурное программирование — программирование на императивном языке, при котором последовательно выполняемые операторы можно собрать в подпрограммы, то есть более крупные целостные единицы кода, с помощью механизмов самого языка. Примерами процедурных языков программирования являются: C, Pascal, Фортран и т.п.

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

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

Первый символ идентификатора должен быть алфавитным символом или символом подчеркивания. Поскольку в идентификаторах C++ учитывается регистр, идентификаторы fileName и FileName различаются.

Идентификаторы, начинающиеся с двух символов подчеркивания или с одного символа подчеркивания, за которым следует прописная буква, зарезервированы для реализаций C++ во всех областях видимости. В области видимости файла не следует использовать идентификаторы, начинающиеся с одного символа подчеркивания, за которым следует строчная буква. Это связано с возможными конфликтами с уже существующими или будущими зарезервированными идентификаторами.

Слова в С++ могут обозначать определенную функцию, оператор, тип данных. Также словами обозначают идентификаторы переменных, констант и пользовательских функций.

Константа – это величина, которая при выполнении программы остается неизменной. В С++ константы разделяются на именованные и неименованные.

Именованная константа задается произвольным идентификатором, указанным программистом. Она может быть, как глобальной, так и локальной и задаваться через const или #define. После объявления константы в программе можно использовать ее имя, вместо самой константы.

Неименованные константы не нужно инициализировать, в отличии от именованных. Такими константами являются числа, символы, а также слова true и false.

17

6. ПЕРЕМЕННЫЕ, ОБЛАСТЬ ДЕЙСТВИЯ, ВРЕМЯ ЖИЗНИ, КЛАСС ПАМЯТИ.

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

Область видимости объекта (переменной или функции) определяет, в каких участках программы допустимо использование имени этого объекта. В С++ она разделяется на три типа: локальная область видимости, область видимости пространства имен и область видимости класса.

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

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

Каждое определение класса представляет собой отдельную область видимости класса.

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

Класс памяти переменной в С/С++ определяет область видимости переменной, а также ее время жизни. Класс переменной присваивается перед ее объявлением.

Например, переменная static имеет такую же область действия, как локальные, но не исчезает, когда функция закончит работу.

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

18

char d = 's'; bool k = true;
double c = 14.2;

extern – переменная будет определяться дальше по тексту программы или в другом файле, для создания переменных, доступных во всех модулях, в которых есть ее определение.

register – аналогично auto, если есть возможность, место для нее выделяется в регистрах процессора) определяет время жизни и область видимости. Если класс памяти не указан явным образом, то будет определен по умолчанию компьютером. Время жизни может быть постоянным/временным.

Примеры объявления переменных.

int a; // объявление переменной a целого типа.

float b; // объявление переменной b типа данных с плавающей запятой. // инициализация переменной типа double.

// инициализация переменной типа char. // инициализация логической переменной k.

19

7. ОПЕРАЦИИ В С/С++, ВЫРАЖЕНИЯ, ПОРЯДОК ВЫЧИСЛЕНИЯ ВЫРАЖЕНИЙ.

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

Типы выражений. Выражения C++ делятся на несколько категорий:

1) Основные выражения. Это исходные компоненты, из которых состоят все остальные выражения. Первичные выражения - это элементы, из которых строятся более сложные выражения. Это константы, имена и имена, уточняемые с помощью оператора разрешения области действия. Примеры:

100

// константа

'c'

// константа

::func

// область видимости

(i + 1)

// скобочное выражение

2) Постфиксные выражения. Эти основные выражения, за которыми следует оператор (например, индекс массива или постфиксный оператор инкремента). Любое основное выражение считается постфиксным. Примеры:

mas[23];

 

// обращение к 23-ому элементу массива

function_num(2, ‘a’, 24,012);

// вызов функции с параметрами

ini1.struct_variable = 2;

// обращение к открытому члену структуры

i++;

 

// постфиксный инкремент

3) Выражения с унарными операторами. Унарные операторы действуют

только на один операнд в выражении. Любое постфиксное выражение

считается унарным. Примеры:

 

++i;

// префиксный инкремент

sizeof(variable);

// размер переменной

delete mas[];

// освобождение памяти, занимаемой массивом

4) Выражения с бинарными операторами. Бинарные операторы

действуют на два операнда в выражении.

a + b;

// сложение

 

a > b;

// сравнение

a == 2 || b ==3;

// равенство и логическое ИЛИ

a += b;

// присваивание со сложением

5) Выражения с условными операторами. Условным является троичный оператор — единственный такой оператор в языке C++. Он принимает три операнда. Пример:

(i > j) ? i : j // условный оператор

20