Если а, b, с - стороны треугольника
то вычислить площадь S; выдать (S);
иначе выдать (а, b, с,' - не являются сторонами треугольника')
Конец.
А теперь рассмотрим более подробно пункты алгоритма. Вычисление полупериметра Р. Этот шаг сводится к выполнению оператора Р:= (а + b + c)/2. Нахождение наибольшей из сторон а, b, с. Операторы:
d:=a;
если d < b, то d:=b;
если d < с, то d:=c.
Вычисление площади S:
S:=SQRT(P*(P - a)*(P - b)*(Р - с)).
Таким образом, разработка алгоритма состоит из последовательности шагов. Причем каждый из них является шагом в направлении уточнения алгоритма. Построение алгоритма закончено, если, читая его, каждое действие вы можете заменить оператором языка программирования. В нашем примере для этого оказалось достаточным сделать два шага. Теперь алгоритм выглядит так:
Начало
Задать(а,b,с);
(*вычислить полупериметр Р*)
Р:=(а+b+с)/2;
{*найти наибольшую из сторон а, b, с*}
d: =а;
если d если d<с, то d:=с;
если (*а, b, с - стороны треугольника*) P>d
то {(*вычислить площадь S*)
S:=SQRT(P*(P-а)*(Р-b)*(Р-с)); {выдать(S)}
иначе выдать (а, b ,с,' - не являются сторонами треугольника')
Конец.
Названия более крупных шагов внесены в конечный вид алгоритма на уровне комментариев для большей наглядности. Имея перед собой подобное описание алгоритма вместе с описанием данных, можно без труда выполнить следующий этап.
Программирование. На предыдущих этапах был детально разработан алгоритм решения задачи и описаны используемые в нем переменные. Теперь написание программы сводится к переводу этого алгоритма на язык программирования. Но если предыдущие этапы были выполнены некачественно, то алгоритм приходится дорабатывать уже на ходу. Это приводит к появлению дополнительных ошибок. Одним из вопросов, с которым сталкиваются при программировании, является вопрос о выборе языка программирования. Для написания нашей программы мы выберем язык Паскаль. Теперь основная сложность заключается в том, чтобы учесть все правила и ограничения выбранного языка. При создании программы, которая могла бы надежно работать, подавляющая часть времени уходит не на её написание, а на поиск ошибок и внесение исправлений. Поэтому уже при составлении программы нужно позаботиться о том, чтобы она была наглядной, легко читалась, и по выдаваемой ею информации можно было бы без труда обнаруживать ошибки. Вы уже познакомились с некоторыми приемами, используемыми при написании программ. Постарайтесь придерживаться еще и таких правил. В каждой строчке программы размещайте по одному оператору, за исключением случаев, когда операторы небольшие и по смыслу тесно связаны друг с другом. Каждый следующий составной оператор размещайте со сдвигом на несколько позиций вправо. Метки лучше всего располагать в самых левых позициях, чтобы они "не загораживались" другими операторами. Соответствующие друг другу begin и end располагайте в одних и тех же колонках. Понять смысл программы помогут и комментарии. С их помощью можно указать назначение программы, смысл используемых переменных, пояснить наиболее трудные для понимания участки. Следуя перечисленным правилам, напишем программу решения рассматриваемой задачи:
Program PLОСНАD;
{вычисление площади треугольника по трем сторонам)
var А,В,С:real; {стороны}
D:real; {большая из сторон}
Р:real; {полупериметр}
S:real; {площадь}
Begin
writeln('Задайте стороны A,В,С:')
Read(А,В,С);
{вычислить полупериметр}
Р:=(А + В + С)/2;
{найти наибольшую длину
D:=A;
if D<B then D:=B;
if D<C then D:=C;
if {a,b,с - стороны треугольника} P>D then begin {вычислить площадь}
S:=SQRT(P*(P-A)*(P-B)*(P-C));
writeln{'ПЛОЩАДЬ:',S)
end else writeln(A,B,С, '- не являются сторонами треугольника')
end.
Итак, программа готова. Вы занесли ее текст в машину. Но придется приложить еще много усилий, прежде чем вы убедитесь в ее правильной работе.
Тестирование программы. Для начала попытайтесь проверить свою программу, как говорят, "вручную". Внимательно читая ее текст, испытайте себя в роли исполнителя этого алгоритма на конкретных числовых данных. Возможно, что таким образом будут обнаружены некоторые ошибки. Текст исходной программы программист направляет транслятору, который переводит ее на язык низкого уровня - язык компьютера. Транслятор не человек, он понимает лишь то, что написано, а не то, что мы хотели бы написать. Необходимо, чтобы правильными были все запятые, тире, пробелы, а также команды и программа в целом. Первым делом транслятор проверяет синтаксические ошибки. Если они есть, то программа отвергается с сообщением о том, что в таком-то месте программы найдена ошибка такого-то типа.
Первая цель программиста - добиться безошибочной трансляции. Но вот синтаксические ошибки устранены. Можно ли сказать, что, выполнив программу с заданными исходными данными, мы получим правильные результаты? Конечно, нет. Ведь в ней, помимо синтаксических ошибок, могут быть логические. Их-то транслятор не замечает. Чтобы выявить такие ошибки, программа проходит этап испытаний или тестирования.
Тестирование - это процесс исполнения программы с целью обнаружения ошибок. Для проведения этого этапа заранее, обычно еще до написания программы, подготавливается специальная система примеров, просчитанных вручную или каким-либо другим способом, с тем, чтобы сравнить их с результатами работы программы. Такие примеры называются тестами. Желательно, чтобы тесты были простыми и позволяли легко проверить получаемые результаты, а также разнообразными, чтобы программа вынуждена была пройти по всем ветвям алгоритма. Протестируем нашу программу.
1. На вход подаем числа 3, 4, 5, являющиеся, как известно, сторонами треугольника с площадью 6. Что дает счет по программе? То же самое! При тестировании нужно проверять не только правильные, но и неверные и граничные ситуации. При этом следует уделять им внимания не меньше, чем работе с правильными данными. А поэтому рассмотрим и такие тесты.
2. Если (А, В, С) = (1, 1, 2), треугольник вырождается в отрезок.
3. Если (А, В, С) = (0,0,0) - это точка.
4. (А, В, С) = (1, 1, 3). Треугольник с такими сторонами построить нельзя.
5. А что, если на вход подать отрицательное число: 2, 1, -3?
6. Пусть все числа будут отрицательными: - 4, - 4, - 4.
Для тестов 2-6 в качестве результата должно быть получено сообщение: "А, В, С не являются сторонами треугольника". Далее проверим, все ли ветви алгоритма будут пройдены хотя бы по одному разу при выполнении этих тестов. Оказывается, да. Но если бы этого не случилось, пришлось бы добавлять новые примеры. Для каждого теста нужно выписывать не только входные данные, но и результаты, которые им соответствуют. Иначе, получив правдоподобные, но неверные результаты, вы можете не заметить ошибку. Ошибка обнаружится позже, и тогда для ее исправления потребуется больше усилий. Помните, чем раньше обнаружится ошибка, тем легче ее устранить. А потому тщательно изучайте итоги каждого тестового выполнения программы.
Отладка программы. Но вот вы получили результаты работы некоторого теста, и они оказались совсем не такими, какие вы ожидали. Что делать? Теперь начинается работа по выяснению того, какая ошибка или ошибки дали такой эффект, а также устранению этих ошибок. Эта работа называется отладкой. Проведение отладки роднит работу программиста с деятельностью врача, который по некоторым симптомам (выдаваемым сообщениям и результатам) пытается установить болезнь (в данном случае - ошибки в программе). Постановка диагноза, в том числе и в программировании, как известно, требует большого искусства. Однако и здесь можно рекомендовать некоторые приемы для облегчения этой работы. Прежде всего, внимательно просмотрите текст. Возможно, ошибки связаны с синтаксисом программы. Например, если при вычислении полупериметра вместо знака " / " был поставлен знак "*", ошибка такого рода, не замеченная транслятором, будет обнаружена лишь в результате просмотра. Чтобы выявить логические ошибки, попытайтесь выполнить программу или подозреваемую ее часть в отладчике, просматривая необходимые промежуточные результаты. Попробуйте объяснить каждый оператор своей программы, просматривая ее с конца. Итак, вы каким-то образом нашли и исправили ошибку. Теперь все тесты нужно повторить заново, чтобы убедиться, не повлекло ли за собой это исправление других ошибок. Поэтому не спешите выбрасывать тесты, чтобы вам не пришлось изобретать их заново. В процессе тестирования выявляются ошибки, допущенные на более ранних этапах, например при разработке алгоритма и постановке задачи. А поэтому большой объем работы приходится повторять, снова и снова возвращаясь к более ранним этапам. Таким образом, описываемая последовательность действий при решении задачи не является очень уж строгой. Только простейшие программы проходят все шаги без каких-либо повторений.
Документирование. Если после проверки программы у вас не возникает сомнений по поводу правильности выдаваемых ею результатов, ее можно использовать в дальнейшем для проведения необходимых расчетов. Но, не имея описания программы, в ней будет трудно разобраться уже через некоторое время. Описание в еще большей степени потребуется тому, кто захочет воспользоваться вашей программой или усовершенствовать ее. А потому разработка программы заканчивается ее описанием, или документированием. В состав описания входит:
Во-первых, инструкция по использованию программы. Опишите, что делает программа, каким образом задавать исходные данные и какие действия выполнить, чтобы, ничего не зная о ее структуре, пользователь мог бы применить программу для своих расчетов.
Во-вторых, в документацию следует включить краткое описание того, что было сделано на каждом этапе, начиная от постановки задачи и заканчивая набором тестов. Это более подробное описание потребуется тому, кто захочет усовершенствовать вашу программу. Подготовка документации не составит большого труда, если о ней позаботиться заранее еще в период разработки программы. В частности, полезно описание логической структуры программы включать в ее текст в качестве комментариев. Следует также прокомментировать смысл каждой используемой переменной, а иногда и отдельных их значений. В хорошо документированных программах комментарии могут составлять до 3/4 всего текста.
Вопросы для самоконтроля
5. Моделирование как метод познания.
6. Формы представления моделей.
7. Формализация.
8. Системный подход в моделировании.
9. Типы информационных моделей.
10. Основные этапы разработки и исследования моделей на компьютере.
11. Исследование физических моделей.
12. Исследование математических моделей.
13. Биологические модели развития популяций.
14. Геоинформационные модели.
15. Оптимизационное моделирование в экономике.
16. Экспертные системы распознавания химических веществ.
17. Модели логических устройств.
18. Информационные модели управления объектами.