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

Voprosy_k_ekzamenu_po_informatike

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

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

Композиция – это более сложная форма объединения. Она обладает свойствами, но имеет еще и такие, как: часть может принадлежать только одному целому и время жизни части то же, что и целого.

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

61

34. ПОНЯТИЕ ЧАСТИЧНОЙ И ПОЛНОЙ КОРРЕКТНОСТИ ПРОГРАММЫ, ПРАВИЛА ВЫВОДА ОБЩИЙ ВИД, ПРАВИЛА КОНСЕКВЕНЦИИ.

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

Для доказательства частичной правильности используется метод индуктивных утверждений, сущность которого состоит в следующем. Пусть утверждение связано с началом программы, - с конечной точкой программы и утверждение отражает некоторые закономерности значений переменных, по крайней мере, в одной из точек каждого замкнутого пути в программе (например, в циклах). Если при выполнении программа попадает

в -ю точку и справедливо утверждение , а затем она проходит от точки к точке , то будет справедливо утверждение .

Если выполнены все действия метода индуктивных утверждений для программы, то она частично правильна относительно утверждений , , .

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

Логика Хоара — формальная система с набором логических правил, предназначенных для доказательства корректности компьютерных программ.

Тройка Хоара. Основной характеристикой логики Хоара является тройка Хоара. Тройка описывает, как выполнение фрагмента кода изменяет состояние вычисления. Тройка Хоара имеет следующий вид: {P} C {Q} , где P и Q являются утверждениями, а C — командой. P называется предусловием, а Q — постусловием. Если предусловие выполняется, команда делает верным постусловие. Утверждения являются формулами логики предикатов.

В логике Хоара есть аксиомы и правила вывода для всех конструкций простого императивного языка программирования.

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

62

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

Правило консеквенции (упрощения)

63

35. ПРАВИЛА ВЫВОДА ДЛЯ ОПЕРАТОРОВ С/С++: ПУСТОГО, ПРИСВАИВАНИЯ, СОСТАВНОГО.

Правило вывода для пустого оператора. Правило для пустого оператора утверждает, что оператор skip (пустой оператор) не меняет состояния программы, поэтому утверждение, верное до skip, остаётся верным после его выполнения.

или Ясно, что для пустого оператора пред и постусловия совпадают.

Правило вывода оператора присваивания. Аксиома оператора присваивания утверждает, что после присваивания, значение любого предиката относительно правой части присваивания не меняется с заменой правой на левую часть:

или

Здесь означает выражение P в котором все вхождения свободной переменной x заменены выражением E.

Смысл аксиомы присваивания заключается в том, что истинность эквивалентна после выполнения присваивания. Таким

образом, если имело значение «истина» до присваивания, согласно аксиоме присваивания будет иметь значение «истина» после присваивания. И наоборот, если было равно «ложь» до оператора присваивания, должно быть равно «ложь» после.

Примеры корректных троек:

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

является неверным утверждением, если x и y ссылаются на одну и ту же переменную, так как никакое предусловие не может обеспечить, чтобы y было равно 3 после того, как x присвоено 2.

Применение правила вывода оператора присваивания.

64

Правило вывода составного оператора (композиции). Правило композиции Хоара применяется к последовательному выполнению программ S и T, где S выполняется до T, что записывается как S;T.

или

Применение правила вывода составного оператора.

65

36. ПРАВИЛА ВЫВОДА ДЛЯ ОПЕРАТОРОВ ВЕТВЛЕНИЯ.

66

37. ПРАВИЛА ВЫВОДА ДЛЯ ЦИКЛОВ С ПРЕДУСЛОВИЕМ И ПОСТУСЛОВИЕМ.

67

38. ПРИМЕР ДОКАЗАТЕЛЬСТВА ПРАВИЛЬНОСТИ ПРОГРАММЫ.

68

39. ЗАПУСК НА ВЫПОЛНЕНИЕ ПРОГРАММЫ С ПАРАМЕТРАМИ.

Если программу запускать через командную строку, то существует возможность передать какую-либо информацию этой программе, для этого и существуют параметры argc и argv[]. Параметр argc имеет тип данных int, и содержит количество параметров, передаваемых в функцию main. Причем argc всегда не меньше 1, даже когда мы не передаем никакой информации, так как первым параметром считается имя функции. Параметр argv[] это массив указателей на строки. Через командную строку можно передать только данные строкового типа. Указатели и строки — это две большие темы, под которые созданы отдельные разделы. Так вот именно через параметр argv[] и передается какая-либо информация. Пример:

#include <iostream> using namespace std;

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

if (argc > 1) // если передаем аргументы, то argc будет больше 1 cout << argv[1]<<endl; // вывод второй строки из массива

указателей на строки

else

cout << "Not arguments" << endl; system("pause");

return 0;

}

69

40. ФУНКЦИИ ДЛЯ РАБОТЫ С ФАЙЛАМИ ПОСЛЕДОВАТЕЛЬНОГО ДОСТУПА К ДАННЫМ.

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

get(ch). Извлекает один символ в переменную символьного типа ch. Пример:

in.get(ch);

getline(str). Извлекает символы в строковую переменную str до ограничителя ‘/n’. Пример:

in.getline(str);

getline(str, X). Извлекает X символов в строковую переменную str. Пример:

in.getline(str, 20);

getline(str, ch). Извлекает символы в строковую переменную str до ограничителя символьного типа ch. Пример:

in.getline(str, ‘$’);

put(ch). Записывает один символ ch в поток. Пример:

out.put(ch);

eof(). Проверяет не достигнут ли конец файла. Пример:

if (!in.eof());

peek(). Возвращает следующий символ потока, или значение EOF, если достигнут конец файла. Пример:

while (in.peek() != EOF);

read(). Считывает из вызывающего потока указанное количество байт и передает их в буфер. Пример:

in.read((char*) &i, sizeof(double));

write(). Записывает в соответствующий поток из буфера указанное количество байт. Пример:

out.write((char*) &i, sizeof(double));

70