Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pascal.doc
Скачиваний:
32
Добавлен:
12.03.2016
Размер:
3.29 Mб
Скачать

Пошаговый режим

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

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

Идея пошагового режима вот в чем. Компьютер слишком быстро выполняет программу и человек не успевает проследить «за ходом его мыслей». Хорошо бы мы сами задавали темп выполнения программы. Тогда ошибку обнаружить было бы значительно легче.

Рассмотрим задачу из 1.1: В компьютер вводятся два произвольных положительных числа - длины сторон двух кубиков. Компьютер должен подсчитать объем одного кубика - большего по размеру . Обозначаем a1- сторону одного кубика,a2- сторону другого,V- объем кубика. Приведем второй вариант программы:

VARa1,a2,V : Real;

BEGIN

ReadLn (a1,a2);

if a1>a2

then V:=a1*a1*a1

else V:=a2*a2*a2;

WriteLn (V : 15:5)

END.

Запускайте программу, но не обычным образом, а клавишей F7, которая является более быстрым способом вызова менюRunTrace into. (Кстати, обратите внимание, что справа от многих опций меню обозначены «горячие» клавиши, которыми эти опции можно быстро вызывать.) Паскаль откомпилирует вашу программу и сделает паузу перед началом выполнения программы, подсветив горизонтальной полосой строкуBEGIN.

Еще раз F7. Ничего не происходит, только полоса подсветки прыгает на следующую строку. В ней находится первый исполняемый оператор вашей программы –ReadLn (a1,a2).

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

F7. Паскаль выполняет ReadLn (a1,a2), в результате чего у вас, как и при обычном выполнении программы, во весь экран распахивается черное окно пользователя. Оператор требует ввода двух чисел. Введите, например, 5 и 4, не забыв нажать на клавишу ввода. Окно пользователя пропадет, снова возникнет окно редактора и вы увидите, что серая полоса подсветки перескочила на строкуif a1>a2.

F7. Паскаль выполняетif a1>a2, в результате чего полоса прыгает наthen V:=a1*a1*a1, так как 5>4.

F7. Полоса перепрыгивает черезelse V:=a2*a2*a2и попадает наWriteLn (V : 15:5).

F7. Паскаль выполняет WriteLn (V : 15:5), в результате чего печатается результат, а полоса перескакивает на строкуEND.

F7. Полоса пропадает. Программа выполнена. Посмотрим на результат при помощиAlt-F5.

Теперь еще раз выполните ту же программу в пошаговом режиме. Но когда ReadLn (a1,a2) потребует двух чисел, введите 2 и 3. Теперь уже послеif a1>a2 полоса прыгает не наthen V:=a1*a1*a1,а наelse V:=a2*a2*a2.

В любой момент пошагового выполнения программы вы можете вместо F7 выбратьRunRun (клавишиCtrl-F9) и программа продолжит выполняться в обычном режиме. Чтобы прервать пошаговый режим, выберитеRunProgram reset (клавишиCtrl-F2).

Работа с окнами пользователя и отладчика

Предположим, у вас не получается задание из 2.1- определить без компьютера, что будет печатать следующая программа:

LABEL m1,met5; VAR n,k : Integer; BEGIN n:=10;

k:=0;

WriteLn('Считаем зайцев' );

met5: Write(n);

n:=n+k;

goto m1;

n:=n+1;

m1: Write(' зайцев ');

ReadLn;

k:=k+1;

goto met5;

WriteLn('Посчитали зайцев')

END.

Ответ: Эта программа должна печатать:

Считаем зайцев 10 зайцев

10 зайцев

11 зайцев

13 зайцев

16 зайцев

20 зайцев

………

С ответом у вас не сходится. Значит, вы чего-то не понимаете. Чего? Чтобы определить это, вы вводите программу в компьютер. Он печатает все, как в ответе. Почему? Вероятно, вы не понимаете, как изменяются в процессе выполнения программы значения переменных n иk. Хорошо бы можно было подсмотреть за их значениями в оперативной памяти. Хорошо бы также напечатанные результаты не пропадали с экрана, а были бы всегда перед глазами.

Проделайте следующее. (При дальнейшем объяснении я буду предполагать, что вы умеете обращаться с несколькими окнами на экране. Кто не умеет, читайте следующий параграф.)

Сузьте окно вашей программы так, чтобы оно освободило примерно половину ширины экрана. Далее - DebugOutput. Перед вами появляется черное окно пользователя, в котором вы привыкли наблюдать результаты, но в уменьшенном виде. Измените его размер и отбуксируйте на свободное место экрана.

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

Вот как будет выглядеть ваш экран после всех манипуляций (и уже после нескольких выполнений цикла в пошаговом режиме, о чем дальше):

Вы сами должны сказать Паскалю, за какими переменными хотите следить. Очевидно, в вашем случае это n иk. Ваши действия:DebugAdd watch,запишите имяn в открывшемся диалоговом окне и – щелчок по кнопкеOK. В окне отладчика появится сообщениеn:7илиn:0 или какое-нибудь другое число или сообщение. Не обращайте на это внимания. Повторите всю процедуру сk.

Теперь можно запускать программу на выполнение в пошаговом режиме. Для этого нажмите на F7. Паскаль откомпилирует вашу программу, возможно, изменит значения в окне отладчика и сделает паузу перед началом выполнения программы, подсветив горизонтальной полосой строкуBEGIN.

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

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

F7. Паскаль выполняет n:=10, в результате чего в окне отладчика значениеn меняется на 10, а серая полоса прыгает на строкуk:=0.

F7. Паскаль выполняет k:=0, в результате чего в окне отладчика значениеk становится равным 0, а полоса прыгает на строкуWriteLn('Считаем зайцев' ).

F7. Паскаль выполняет WriteLn('Считаем зайцев' ), в результате чего в окне пользователя появляется напечатанный текстСчитаем зайцев, а полоса прыгает на строкуmet5: Write(n).

F7. Паскаль выполняет Write(n). В окне пользователя в новой строке появляется число 10, так как в оперативной памятиnравно 10 (об этом нам говорит окно отладчика). а полоса прыгает на строкуn:=n+k.

F7. Паскаль выполняет n:=n+k, в результате чего в окне отладчика значениеn остается равным 10, так как в оперативной памятиkравно 0. Полоса прыгает на строкуgoto m1.

F7. Паскаль выполняет goto m1. Полоса перепрыгивает на строкуm1: Write(' зайцев ').

F7. Паскаль выполняет Write(' зайцев ' ), в результате чего в окне пользователя справа от числа 10 появляется текстзайцев, а полоса прыгает на строкуReadLn.

F7. Паскаль выполняет ReadLn, в результате чего окно пользователя распахивается на весь экран иReadLnждет, когда вы нажмете на клавишу ввода. Вы нажимаете – и полоса прыгает на строкуk:=k+1.

F7. Паскаль выполняет k:=k+1, в результате чего в окне отладчика значениеk меняется на 11. Полоса прыгает на строкуgoto met5.

F7. Паскаль выполняет goto met5. Полоса перепрыгивает вверх, на строкуmet5: Write(n).

И так далее.

Если ваша программа рисует что-то в графическом режиме, то, к сожалению, при описанном способе работы картинки видны не будут.

Если в вашей программе есть подпрограммы, то серая полоса проникнет и внутрь подпрограмм и будет скакать там, как ни в чем не бывало. Таким образом, вы сможете анализировать и работу подпрограмм. Если же вы не хотите утомлять себя прыжками внутри подпрограмм, нажимайте не F7, аF8. Тогда Паскаль будет выполнять подпрограмму мгновенно в автоматическом режиме и серая полоса будет путешествовать только внутри основной программы. Вы можете свободно чередовать нажатияF7иF8. КлавишаF7будет направлять вас «вглубь» подпрограмм, аF8- «наружу».

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]