Отладка и выполнение программы После того, как программа набрана и поставлена заключительная точка после слова end, ее необходимо оттранслировать, устранить ошибки, как синтаксические, так и семантические, и выполнить, то есть получить конечный результат.
После набора программы ее рекомендуется записать на диск. Более того, если текст программы достаточно объемен, лучше всего делать и промежуточные записи воизбежание потери информации при сбоях компьютера или пропадании напряжения питания.
Если программа набирается заново, то есть активное окно имеет имя NONAME00.PAS, то при нажатии клавиши F2 выполнится команда File/ Save as... При этом появится диалоговое окно со списком файлов - программ из текущего раздела. В области Save file as набирается имя файла, с которым он будет сохранен на диске. Если не ставить точку и расширение, то имя автоматически будет дополнено расширением .PAS. После записи на диск имя в текущем окне редактора сменится на заданное. После дальнейшего набора программы или ее корректировки при нажатии клавиши F2 будет выполняться команда File/ Save, и никаких дополнительных запросов происходить не будет.
При переходе к новой программе окно с текстом старой программы закрывают (<Alt+F3> или Window/ Close, хотя это и не обязательно) и открывают новое активное окно (File/ New). При необходимости чтения другой, ранее набранной программы, выполняется команда File/ Open... (F3), в появляющемся диалоговом окне в области Files перемещением маркера выбирается нужный файл и нажимается клавиша Enter, эквивалентная кнопке диалогового окна Open.
После ввода всей программы ее можно либо откомпилировать с целью устранения синтаксических ошибок (<Alt+F9>), либо сразу отдать команду на выполнение (<Ctrl+F9>). В последнем случае все равно выполнится предварительная компиляция, и если присутствуют синтаксические ошибки, программа выполняться не будет.
Все ошибки программ делятся на два больших класса: ошибки компиляции и ошибки выполнения. О первом типе ошибок сообщает компилятор до запуска программы на выполнение с указанием типа ошибки и предполагаемого ее места. К сожалению, ошибка может быть и не там, где стоит курсор; его положение это фактически то место, где компилятор "осознает" ошибку. Например, если имеется лишний BEGIN в программе, то компилятор не поймет этого до тех пор, пока пары BEGIN... END не будут сбалансированы. На начальном этапе программирования большинство синтаксических ошибок происходит из-за невнимательности набора программы. Даже в первой строке часто делаются ошибки:
Programm Summa;
...
Error 36: BEGIN expected.
Служебное слово Program пишется с одним m. В данном примере пояснение причины ошибки не имеет особого смысла, ожидается оператор BEGIN, — и такое случается довольно часто. Более осмысленное толкование происходит в следующем случае:
Program Summa 1;
...
Error 85: ";" expected.
Перед единицей ожидается точка с запятой. Смысл ошибки заключается в том, что имя программы, как и обычные идентификаторы, не должно включать пробелы, поэтому за разделителем, — пробелом, должна идти следующая конструкция языка, отделяемая от заголовка точкой с запятой.
Довольно часто курсор устанавливается в строке, следующей за ошибочной:
Error 85: ";" expected.
...
C:=2.3
A:=B*C;
Точка с запятой должна стоять перед А, то есть в конце предыдущей строки.
В любом случае при непонимании ошибки следует обратиться к синтаксису отмеченной конструкции языка Турбо Паскаль, либо к предыдущей.
Ошибки выполнения появляются после компиляции и запуска программы на выполнение, и на экране пользователя выдается сообщение вида
Run-time error < nnn > at < xxxx:yyyy >
где nnn номер ошибки выполнения, xxxx:yyyy адрес ошибки выполнения.
Ошибки выполнения искать труднее, чем синтаксические. Это и ошибки на уровне DOS, и ошибки ввода - вывода, и критические ошибки, и фатальные ошибки. Но, хотя ошибок данного класса довольно много, в данном курсе лабораторных работ чаще всего появляются только две фатальные ошибки:
200 Division by zerro (Деление на нуль)
205 Floating point overflow (Переполнение при операции с плавающей точкой)
Вообще говоря, комментарии к этим ошибкам не требуют дополнительных пояснений, хотя они могут случаться не только при недопустимых делениях и вышедших из под контроля циклах операций умножения, но и при недопустимых аргументах математических функций: отрицательных значениях для логарифмов и квадратных корней, и других.
Все же наибольшую трудность вызывают ситуации, когда никаких сообщений не появляется, а компьютер просто "зависает", или выдает результат, но неверный. При этом пользователь склонен ругать компьютер, хотя практически всегда виноват он сам. Эти ошибки возникают либо при неверно составленном алгоритме, а соответственно, и программе, либо при выходе за границы неконтролируемых величин. Пример последней ситуации приведен в примечании к лабораторной работе 4.
Для обнаружения выходов за допустимые границы и переполнений можно использовать две директивы транслятора. По умолчанию они выключены, так как замедляют работу программы и увеличивают ее размер, а используются только при отладке.
Проверка границ.{$R+}, эквивалент меню Options/ Compiler, опция Runtime errors/ Range checking.
Данная директива приводит в действие генерацию кода проверки границ. Все выражения с индексированными строками и массивы проверяются на предмет нахождения их внутри указанных границ, а все операторы присваивания значений скалярным величинам и переменным поддиапазонов также проверяются на нахождение в заданных границах. Если обнаруживается нарушение диапазона, программа завершает свою работу, выводя сообщение об ошибке выполнения при проверке границ:
201 Range check error
Проверка переполнения при математических операциях. {Q+}, эквивалент меню Options/ Compiler, опция Runtime errors/ Overflow checking.
Проверяется результат операций над целочисленными данными. Программа завершает работу аналогично:
215 Arithmetic overflow error
ИИО Турбо Паскаля имеет два экрана. На основном экране набираются, просматриваются и редактируются программы, отдаются команды ИИО, устанавливаются параметры работы и так далее. Но при запуске программы появляется другой экран экран пользователя. Сюда помещаются результаты работы по программе, и он виден до тех пор, пока программа не перестанет выполняться. Так как в данном курсе лабораторных работ программы весьма просты, то они выполняются практически мгновенно, и снова появляется основной экран ИИО. Для просмотра экрана пользователя нажимается комбинация клавиш <Alt+F5>.Для возврата к основному экрану можно нажать любую клавишу. Если в процессе запуска программы возникнет необходимость прервать ее работу, например в случае "зацикливания" программы, используют комбинацию клавиш <Ctrl+Break>.
На экране пользователя мы увидим либо сообщение об ошибке выполнения, либо результат (если пропущен оператор вывода, естественно, результата не будет). Результат может быть и неверным как из-за неправильно составленного алгоритма, так и из-за ошибок в программе, которые формально, с точки зрения транслятора, ошибками не являются. Например, при вычислении суммы по следующему фрагменту программы
S:=0;
For I:=1 to 10 do ;
S:=S+1/I ;
Writeln (S:8:5);
результат вычислений будет равен 0.10000. Здесь после служебного слова DO стоит пустой оператор, поэтому именно он, то есть "ничто" будет выполняться десять раз. Затем к нулю прибавится одна десятая. Формально программа составлена правильно, и такую конструкцию иногда используют в качестве задержки по времени, но фактически десять раз должен выполняться оператор из третьей строки.
Конкретные рекомендации в таких случаях являются индивидуальными для каждой программы, существуют только общие методы тестирования. Рассмотрим два самых простейших.
Первый метод самый универсальный и может использоваться с любыми языками программирования, трансляторами и ассемблерами. Заключается он в выводе промежуточных результатов. Внутрь цикла, или в "подозрительные" места программы временно вставляются операторы вывода изменяемых переменных. Например, программа (приведен фрагмент)
For i:=1 to 15 do
Begin
S:=S+1/i;
i:=i+1
end;
просто "зацикливается" (если не используются директивы контроля). Но если перед i:=i+1 поставить оператор
Writeln (S:8:5,i:8);
то после запуска программы появятся два столбика бегущих чисел. Если приостановить вывод информации на экран монитора клавишей Pause, то сразу будет видно, что i изменяется не с шагом 1, а 2. То есть параметр цикла изменяется и в операторе For, и в операторе присваивания.
Второй метод привлекает средства отладки ИИО. Предварительно установив программный счетчик на начало программы (<Ctrl+F2>), открывается окно наблюдаемых переменных (<Ctrl+F7>): в Watch-окне набирается имя первой контролируемой переменной, нажимается Enter. После этого появляется окно с именем Watches и значением этой переменной. Добавление переменных в окно выполняется необходимое количество раз. Для пооператорного выполнения программы предназначена "горячая" клавиша F7. После каждого нажатия клавиши F7 выполняется один оператор. Если он производит изменение значения переменной, то это сразу отразится в окне наблюдения.
Таким образом, анализируя изменение значений переменных при пооператорном выполнении программы, легко найти ошибку в алгоритме, и соответственно в программе.
По завершении работы с ИИО, из нее можно выйти по комбинации клавиш <Alt+X>.
ЛАБОРАТОРНАЯ работа № 1
Программирование формул
Целью работы является освоение программирования алгоритмов с линейной структурой, когда решение задачи является результатом выполнения цепи вычислений, в которой очередные вычислительные действия используют в качестве исходных данных результаты вычислений на предыдущих этапах. Действия по вычислениям промежуточных и окончательных результатов описываются операторами присваивания.
Необходимо следить, чтобы порядок расположения операторов присваивания в программе от ее начала к концу соответствовал логической последовательности действий при решении поставленной задачи. При выборе имен переменных и составлении арифметических выражений необходимо правильно устанавливать тип используемых величин (целые, вещественные и так далее). При использовании в формулах греческого алфавита можно использовать их латинские названия или буквы, сходные по начертанию. Например, символ можно заменить на Alfa или A, на Omega или W.
К сожалению, в языке Паскаль имеется ограниченное количество математических функций, поэтому, при отсутствии стандартной функции ее выражают через другие, используя функциональные соотношения. Ниже приводятся основные математические функции, отсутствующие в языке Паскаль:
Варианты заданий
Номер варианта
| Вычислить выражение
| При заданных значениях
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Номер варианта
| Вычислить выражение
| При заданных значениях
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Номер варианта
| Вычислить выражение
| При заданных значениях
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ЛабораторнаЯ работа № 2
Ветвящиеся алгоритмы
Логические выражения используются не только для решения задач булевой алгебры, но и для ветвления программы в логических и циклических операторах. Причем последний вариант использования логических выражений применяется наиболее часто.
Логические выражения состоят из логических констант, переменных и отношений, соединенных логическими операциями. В простейших случаях в операторах используют отношения: два выражения, соединенных знаком отношения (<, >, >=, <=, =, <>), например I>20. Но иногда возникают условия, требующие использования более сложных логических выражений.
Пример. На плоскости задана фигура (рис.2.1.): усеченный круг. Вводится точка с координатами X,Y. Определить, принадлежит введенная точка фигуре или нет. В результате выводится: "Введенная точка принадлежит фигуре" или "Введенная точка фигуре не принадлежит".
Рис.2.1.
Для определения вхождения точки в круг можно использовать формулу окружности .
Соответственно изменив знак = на < получим условие вхождения точки в круг c координатами центра (3,3) и радиусом 3:
Кроме этого область, занятая треугольником, так же не входит в закрашенную область, то есть полуплоскость над прямой Y= -X+7 фигуре не принадлежит. Условия нахождения точки внутри круга и под прямой должны выполняться одновременно. Для этого необходимо использовать логическую операцию AND.
Таким образом логическое выражение
примет истинное значение, если точка входит в закрашенную область, иначе ложное. Тогда в логическом операторе по прямой ветви Then выводится "Введенная точка принадлежит фигуре", а по ветви Else "Введенная точка фигуре не принадлежит".
Но можно и поменять ветви местами, тогда при вхождении точки в фигуру логическое выражение должно принимать ложное значение. Тривиальный вариант: поставить перед предыдущим выражением знак отрицания NOT. Но более наглядным решением будет составление выражения с условием невхождения точки в фигуру. Здесь должно выполняться хотя бы одно из условий: точка не входит в круг или точка лежит над прямой, соответственно, логическое выражение примет вид:
При выполнении лабораторной работы составить два варианта программы (без использования операции NOT) для фигуры, соответствующей варианту задания.
Варианты заданий.
1. 2.
3. 4.
5. 6.
7. 8.
9. 10.
11. 12.
13. 14.
15. 16.
17. 18.
19. 20.
21. 22.
23. 24.
25. 26.
27. 28.
29. 30.
ЛабораторнаЯ работа № 3
|