Спецификация программы

Состав спецификации

  1. Постановка задачи.
  2. Таблица данных.
  3. Входная форма.
  4. Выходная форма.
  5. Аномалии.
  6. Тестовые примеры.
  7. Метод.
  8. Алгоритм.
  9. Программа.

1. Постановка задачи

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

2. Таблица данных

Класс Имя Смысл Тип Структура Диапазон Формат
             

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

Классы данных:

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

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

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

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

Структура переменной:

Диапазон задаёт минимальное и максимальное возможные значения переменной. Диапазон обычно задаётся для входных данных, впрочем, он не всегда необходим. Например, если мы вводим количество элементов массива и сам массив, то количество элементов массива не должно быть меньше 1 и не должно быть больше максимально допустимого количества элементов. Элементы массива могут принимать любое значение (хотя типы данных накладывают ограничения на допустимые значения).

Формат описывает представление данных, например, может быть задано минимальное и/или максимальное количество символов в представлении числа или строки, количество знаков после запятой для вещественного числа и т.п. Формат обычно задаётся для выходных данных.

3. Входная форма

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

Этот пункт спецификации кажется несущественным, но на самом деле это не так. При вводе из файла данные можно расположить различным образом. При этом нет возможности ввести какие-то пояснения, т.к. программа не будет распознавать текст типа «количество строк матрицы» или «количество столбцов матрицы». Если располагать данные в произвольном порядке и писать подобные пояснения (даже в фиксированной форме), это приведёт к увеличению размера файла с данными и, главное, к увеличению времени обработки этого файла. А объёмы данных могут быть значительными. Наверняка, все любят играть в компьютерные игры. Представьте, какой объём данных должен сохраняться в какой-нибудь RPG – положение героя, состояние игры, имеющиеся у героя предметы, его отношения с соратниками и т.д.

4. Выходная форма

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

5. Аномалии

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

6. Тестовые примеры

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

7. Метод

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

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

8. Алгоритм

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

Свойства алгоритма

Рассмотрим свойства алгоритма на примере алгоритма перехода улицы:

  1. посмотреть налево;
  2. если машин нет, то дойти до середины улицы и остановиться, иначе подождать и вернуться к шагу 1;
  3. посмотреть направо;
  4. если машин нет, то перейти улицу, иначе подождать и вернуться к шагу 3.

Данный алгоритм обладает следующими свойствами:

Данный алгоритм не обладает следующими свойствами:

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

9. Программа

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