#pascal — помогите найти ошибку в программе в Pascal


#pascal — помогите найти ошибку в программе в Pascal

Форумчане,помогите.Прграмма находит только процент вполнения плана первым предприятием,а у остальных пишет 0.Не могу найти ошибку.Зарание спасибо

Решить задачу,связанную с оценкой экономической деятельности группы предприятий на основе известных данных
-название предприятий
-плановый объем розничного товарооборота
-фактический объем розничного товарооборота
Требуется определить:
1)процент вполнения плана каждым предприятием
2)сумму фактического товарооборота предприятий, выполнивших план
3)наименьший фактический товарооборот
4)упорядочить предприятия по возрастанию процента выполнения плана товарооборота

Прогр.:
program otchet;
uses crt;
var
n:array [1..100] of string;
p,f,v,k,c:array [1..100] of real;
i,im,j,m:integer;
km,s,y1,sum,min:real;
y2:string;
begin
clrscr;
write(‘Vvedite kolichestvo predpriyatiy= ‘);
readln(m);
for i:=1 to m do
begin
write(‘Vvedite nazvanie predpriyatiya ‘,i,’ =’ );
readln(n[i]);
write(‘vvedite planoviy obiom roznichnogo tovarooborota= ‘);
readln(v[i]);
write(‘Vvedite fakticheskiy obiom roznichnogo tovarooborota= ‘);
readln(f[i]);
end;
s:=0;
km:=-999;
for i:=1 to m do
begin
k[i]:=f[i]/v[i]*100;
if k[i] km then
begin
km:=k[i];
im:=i;
end;
end;
writeln;
writeln(‘predpr plan fact proc’);
for i:=1 to m do
writeln(n[i],’ ‘,v[i]:10:2,f[i]:10:2,k[i]:10:2);
writeln(‘naib proc =’,km:10:2,’ u predpr ‘,n[im]);
sum:=0;
for i:=1 to m do
begin
If f[i]>=v[i] then
sum:=sum+f[i];
end;
readln;
Write(‘ summa obioma tovarooborota predpriatii vipolnivshih plan = ‘,sum:8:2);
readln;
min:=32000;
for i:=1 to m do
begin
If min>f[i] then
min:=f[i];
end;
readln;
Write(‘ naim obioma tovarooborota = ‘,min:8:2);
readln;

writeln;
for j:=1 to m-1 do
for i:=1 to m-j do
if k[i] > k[i+1] then
begin
y1:=v[i];
v[i]:=v[j];
v[j]:=y1;
y1:=f[i];
f[i]:=f[j];
f[j]:=y1;
y1:=k[i];
k[i]:=k[j];
k[j]:=y1;
y2:=n[i];
n[i]:=n[j];
n[j]:=y2;
end;
writeln;
writeln(‘sort po proc ‘);
for i:=1 to m do
writeln(n[i],’ ‘,k[i]:6:2);
writeln;
end.

#pascal — помогите найти ошибку в программе в Pascal

Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда — alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Форум программистов > Delphi > Паскаль, Turbo Pascal, PascalABC.NET
[Pascal ABC.NET] Найдите ошибку. Почему программа при любых значениях выводит в ответ 0?
Регистрация
Поиск по форуму
Расширенный поиск
К странице.

Здесь нужно купить рекламу за 25 тыс руб в месяц! ) пишите сюда — alarforum@yandex.ru

________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

11.06.2020, 16:00 #1

это что за ужас, летящий на крыльях ночи?!
к чему здесь таймер?
почему смесь бульдога (консольной программы с вводом через readLn) и носорога (оконный интерфейс, контрол в виде кнопки) ?

если Вы хотите сделать калькулятор, то это совсем не так должно быть.

Как найти ошибку в коде? [закрыт]

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

Закрыт по причине того, что не по теме участниками Alex, user194374, pavel, Denis Bubnov, Denis 7 дек ’16 в 10:36 .

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

  • «Вопрос вызван проблемой, которая больше не воспроизводится, или опечаткой. Хотя похожие вопросы могут быть уместны на этом сайте, решение для этого вопроса вряд ли поможет будущим посетителям. Обычно можно избежать подобных вопросов написанием и исследованием минимальной программы для воспроизведения проблемы до публикации вопроса.» – Alex, Дух сообщества, pavel, Denis Bubnov, Denis

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

Помагите найти ошибку в программе на языке pascal

Вот текст программы. Помогите пожалуйста, заранее спасибо!

11.06.2020, 17:36 #2
Цитата (alfir @ 2.12.2010, 17:47 )
Она не правильно находит предел

А телепаты (чтоб знать, какой предел должна найти твоя программа) здесь больше не обитают. Еще точнее — у тебя нет ошибки в программе на языке Паскаль, иначе бы она просто не откомпилировалась. Если компилируется, но работает не так, как ты ожидаешь (не употребляй выражения «неправильно», договорились?) — значит, у тебя ошибка в алгоритме. Нужна помощь — объясняй тот алгоритм, который был запрограммирован. Словами. Русскими.

Помогите найти ошибку в программе Pascal .

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

Program bal;
type str=record
fam:string;
B1, B2, B3, B4, B5: 2..5;
sb:real;
end;
var fam:str;
tbl:array[1..5] of str;
i:integer;
begin
for i:=1 to 5 do
read(tbl[I]fam, tbl[i]B1, tbl[i]B2, tbl[i]B3, tbl[i]B4, tbl[i]B5);
for i:=1 to 5 do
begin
tbl[i]sb:=(tbl[i]B1+tbl[i]B2+tbl[i]B3+tbl[i]B4+tbl[i]B5)/5
writeln(tbl[i].fam, , tbl[i].sb);
end;
end.

#pascal — помогите найти ошибку в программе в Pascal

1. Заголовок темы должен быть информативным. В противном случае тема удаляется .
2. Все тексты программ должны помещаться в теги [code=pas] . [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. «FAQ«, если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение — только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы — на PM!
6. Одна тема — один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме.
8. Спрашивайте и отвечайте четко и по существу.

Группа: Пользователи
Сообщений: 5
Пол: Мужской
Реальное имя: Евгений


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

Пишу в программе Pascal ABC..В конце программы я уверен написано совсем не то,что нужно,там я совсем запутался. Подскажите пожалуйста!

Сообщение отредактировано: SpeedFire — 17.09.2011 13:22

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Разработчик
Free Pascal: Разработчик

Какая разница где? Процедура Window всегда принимает 4 параметра, а не 2 (разница — только в смысле параметров, скажем, в Турбо Паскале подразумеваются координаты X и Y левого верхнего и правого нижнего окна, а в PascalABC — координаты (X, Y) верхнего левого угла и ширина/высота).

Ну, а вообще — не самая хорошая идея писать программы для PascalABC, использующие модуль CRT. Тот компилятор, который был написан не для .NET, уже давно не поддерживается, последние версии компилятора написаны именно под .NET, и программу, написанную с использованием CRT просто не удастся отладить, потому что запустить ее в режиме отладки PascalABC не даст. Так что тут надо подумать, продолжать пользоваться PABC и мучаться со старым модулем (даже если программа успешно откомпилируется — я совсем не уверен, что она будет адекватно себя вести), или брать какой-то другой компилятор.

P.S. Не надо в самом начале делать

, это приведет к тому, что и цвет фона и цвет выводимых символов будут черными (и A и B автоматически инициализируются нулем, а это именно черный цвет), и ты элементарно ничего не увидишь. Либо установи какие-то конкретные цвета, либо не меняй ничего вообще.

Сообщение отредактировано: IUnknown — 17.09.2011 13:32

Группа: Пользователи
Сообщений: 5
Пол: Мужской
Реальное имя: Евгений

#pascal — помогите найти ошибку в программе в Pascal

200?’200px’:»+(this.scrollHeight+5)+’px’);»> const Pi = 3.1415;

var
r: real; // радиус круга
S: real; // площадь круга
begin
write(‘Введите радиус круга: ‘);
readln(r);
S := Pi*r*r;
writeln(‘Площадь круга равна ‘,S);
writeln(‘Нажми Enter’);
readln;
end.

Фразу «Программа завершена, нажмите любую клавишу . . .» и ожидание делает среда разработки для тебя.

Отладка программ пользователя в Tubro Pascal

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

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

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

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

Особенно важно то, что Turbo Pascal имеет мощный и гибкий отладчик исходного уровня, который позволяет пользователю выполнять программу построчно, просматривать выражения и модифицировать переменные по мере необходимости. Отладчик встроен в интегрированную среду разработки (IDE) Turbo Pascal; пользователь может редактировать, компилировать и отлаживать программу даже не выходя из Turbo Pascal. Для больших или сложных программ, которые требуют использования всего диапазона средств отладки от машинного языка до вычисления выражений Паскаля, Turbo Pascal полностью поддерживает автономный отладчик фирмы Borland, Turbo Debugger.

Существует три основных типа программных ошибок: ошибки времени компиляции, ошибки времени выполнения и логические ошибки.

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

Turbo Pascal не закончит процесс компиляции программы пользователя (генерацию машинного кода), пока все синтаксические ошибки не будут удалены. Если Turbo Pascal обнаружит синтаксическую ошибку во время компиляции программы, он останавливает компиляцию, входит в исходный текст, указывает местоположение ошибки позиционированием курсора и выводит сообщение об ошибке в окно Edit. Как только пользователь исправит ошибку, он сможет начать процесс компиляции снова.

Если используется версия командной строки (TPC.EXE), Turbo Pascal будет выводить ошибочный оператор, номер строки и сообщение об ошибке. Затем пользователь может войти в любой используемый им редактор, найти заданную строку, исправить ошибку и перекомпилировать программу. Для дополнительной информации о сообщениях об ошибках см. Приложение А в Руководстве программиста.

Ошибки времени выполнения.

Другой тип ошибок — ошибки времени выполнения программы или семантические ошибки. Они встречаются, когда пользователь компилирует синтаксически корректную программу, которая пытается сделать что-нибудь запрещенное во время ее выполнения, например, открывает несуществующий файл для ввода или производит деление на 0. В этом случае Turbo Pascal выводит на экран следующее сообщение об ошибке: Runtime error ## at seg:ofs (Ошибка выполнения # в сегменте: смещение) и останавливает выполнение программы пользователя.

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

Если пользователь выполняет программу в среде MS-DOS, он будет возвращаться в MS-DOS. Пользователь может загрузить модуль TURBO.EXE и использовать опции Search/Find error для локализации позиции ошибки в исходной программе (убедитесь, что опция Destination установлена в Disk). Для обнаружения ошибки пользователь может также использовать и опцию /F для компилятора командной строки (TPC.EXE).

(Более полное объяснение опций командной строки TPC.EXE приведено в главе 9 «Компилятор командной строки».)

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

Интегрированный отладчик Turbo Pascal.

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


Интегрированный отладчик Turbo Pascal имеет все описанные выше возможности и даже более того. Он представляет собой встроенную часть интегрированной усовершенствованной среды Turbo Pascal (IDE): для использования предлагаются две основные функции меню (Run, Debug), а также некоторые клавиши для команд отладчика. Для дополнительной информации об IDE горячих клавишах см. главу 7 «Справочник по IDE» или справочную информацию о Turbo Pascal.

Что может делать отладчик.

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

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

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

Обзор возможностей отладчика:

Run/Trace Into Вы можете выполнить одну строку вашей программы, затем прерваться и посмотреть на результаты. При вызове процедуры или функции внутри вашей программы, Вы можете задать режим выполнения вызова как одного шага или режим трассировки этой процедуры или функции строка за строкой.

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

Переход на курсор. F4

Run/Go to Сursor Вы можете передвинуть курсор на определенную строку в Вашей программе, а затем указать отладчику выполнить программу до достижения этой строки. Это позволяет обходить циклы или другие утомительные участки программы, это также позволяет перебираться в то место программы, откуда Вы хотите начать отладку.

С помощью команды Debug/Breakpoints Вы можете пометить строки в Вашей программе как точки прерывания. Когда в процессе выполнения Вашей программы достигается точка прерывания, выполнение программы приостанавливается и отображается исходный текст и курсор останавливается на строке с точкой прерывания. Затем Вы можете проверить значения переменных, начать трассировку или выполнить программу до другой точки прерывания. Вы можете подключить условие к точке прерывания. Вы можете также прерваться в любой точке Вашей программы, нажав клавишу Ctrl-Break. Произойдет остановка на следующей строке исходной программы, как если бы в этой строке была установлена точка прерывания.

Debug/Watches Пользователь имеет возможность задавать для просмотра в окне Watch некоторые объекты (переменные, структуры данных, выражения). Просматриваемые данные меняются, отражая текущие изменения в программе при пошаговом выполнении.

Debug/Evaluate/Modify Пользователь может вызвать окно Evaluate, что проверить значения переменных, структуру данных и выражения в интерактивном режиме. Используя окно Evaluate, Вы можете изменить значение любой переменной, включая строки, указатели, элементы массива и поля записей. Это обеспечивает простой механизм для проверки, как Ваш код реагирует на определенную установку значений или условий.

Пользователь может быстро находить объявления процедур или функций, даже если программа разбита на несколько модулей (Search/Find Рrocedure). Во время трассировки Вы можете быстро вернуться обратно из вызовов процедур или функций и проверить параметры каждого вызова (Window/Call Stack).

Подготовка к использованию отладчика.

До начала отладки Вы должны понимать, что основным элементом выполнения в отладчике является строка, а не оператор. Более точно наименьшим элементом выполнения является строка. Если на одной строке находится несколько операторов, они будут выполняться вместе при нажатии F7. С другой стороны, если один оператор размещен на нескольких строках, то при нажатии F7 будет выполняться весь оператор. Все команды выполнения основываются на строках, включая пошаговую отладку и точки прерывания; строка, на которой находится выполнение, всегда отмечена курсором выполнения.

Прежде, чем начать отладку программы, Вы должны задать для компилятора Turbo Pascal инструкцию по генерации таблицы символов и таблицы номеров строк этой программы. Таблица символов представляет собой небольшую базу данных со всеми используемыми идентификаторами — константами, типами, переменными, процедурами и информацией о номерах строк. Директивы компилятора $D+ и $L+ делают это по умолчанию; они соответствуют элементам меню Options/Compiler/Debug Information и Options/Compiler/Local Symbols. Так же по умолчанию установлена опция Options/Debugger/Integrated, которая генерирует отладочную информацию в выполнимом файле.

Директива <$D+>генерирует таблицу номеров строк, которая устанавливает соответствие между объектным кодом и исходным модулем. Директива <$L+>генерирует локальную отладочную информацию, а именно, строит список идентификаторов, локальных для каждой процедуры или функции, для того, чтобы отладчик мог хранить информацию о них в процессе отладки. Когда Вы используете директивы компилятора, разделяйте их запятыми и без пробелов, и ставя $ только перед первой директивой; например <$D+,L+>.

Примечание: Вы можете отключить эти переключатели для сохранения памяти или дискового пространства во время компиляции.

Когда Вы выполняете пошаговую отладку, Turbo Pascal будет иногда переключаться на экран пользователя, выполнять Ваш код, а затем возвращаться в интегрированную среду, ожидая следующей команды. Вы можете управлять переключением экрана с помощью установок Options/Debugger/Display Swapping, которые могут принимать 3 значения:


    Smart: Это режим по умолчанию. Среда IDE переключается на экран пользователя, когда программа обращается к видеопамяти или при вызове программы.

Always: Переключение на экран пользователя происходит на каждом шаге.

  • None: Переключение экранов не происходит. Интегрированная среда остается видимой все время. Если в программе предусматривается вывод на экран или требуется ввод информации, текст будет писаться на экране среды. Вы можете восстановить окна интегрированной среды, выбирая Ё/Refresh Display.
  • Начало сеанса отладки.

    Наиболее быстрый способ начать отладку состоит в загрузке программы и выборе команды Run/Trace Into (F7). Программа будет компилироваться. Когда компиляция завершится, редактор отобразит на дисплей тело основной программы с индикацией строки выполнения на первом операторе begin. Пользователь может начать трассировку программы с этого места (нажать клавиши F7 или F8) или использовать другие методы которые приведены ниже.

    Если пользователю необходимо начать отладку с определенного места программы, он может выполнить программу до этого места, а затем остановиться. Для этого, загрузите нужный раздел исходного модуля в редактор и передвиньте курсор на строку, где Вы желаете остановиться. Затем можно поступить двумя способами:


      — Выбрать команду Run/Goto Cursor (или нажать клавишу F4), которая будет выполнять программу пользователя до достижения строки, помеченной курсором, а затем останавить работу программы.


  • — Задать на указанной строке точку прерывания (выбрать команду Debug/Toggle Breakpoint или нажать на Ctrl-F8), затем выполнить программу (выполнить команду Run/Run или нажать Ctrl-F9); остановка будет происходить каждый раз при достижении заданной строки. Вы можете задать несколько точек прерывания, в этом случае программа будет делать остановку всякий раз при достижении какой-либо из этих точек.
  • Рестарт сеанса отладки.

    Если в процессе отладки программы возникает необходимость начать все сначала, то нужно выполнить команду Program Reset из меню Run. Система отладки повторно инициализируется, и команда следующего шага вернет вас к первой строке главной программы. При этом производится закрытие всех файлов, которые были открыты программой, очистка стека всех вложенных программ, которые вызывались программой, и освобождение всего использованного пространства кучи. Переменные программы, однако, не будут повторно инициализированы или подвержены модификации какого-нибудь другого вида. (Turbo Pascal никогда не инициализирует переменные автоматически). Однако, начальные значения типированных констант программы будут восстановлены.

    Turbo Pascal также предлагает рестарт, если Вы производите какие-либо изменения в программе во время отладки. Например, если Вы изменяете часть программы, а затем выбираете любую команду выполнения (нажимаете клавиши F7, F8, F4, Ctrl-F9 и т.д.), Вы получите сообщение : Source modified, rebuild? (Y/N) (исходный модуль модифицирован, нужно повторить сборку? да/нет ). Если Вы отвечаете Y, Turbo Pascal будет перекомпилировать программу и возобновит отладку программы с начала. Если Вы ответите N, Turbo Pascal предполагает, что Вы уверены в своих действиях, и продолжает сеанс отладки дальше. (Любые изменения в программе, которые Вы произвели, не будут влиять на ее выполнение до тех пор, пока Вы не перекомпилируете программу). Если Вы добавили или удалили строки программы, курсор выполнения не реагирует на эти изменения, и может оказаться, что будет выделяться ошибочная строка.

    Окончание сеанса отладки.

    В процессе отладки программы Turbo Pascal хранит трассу того, что Вы делаете и где находитесь в данный момент. Так как пользователь может в процессе отладки загружать и даже редактировать различные файлы, Turbo Pascal не интерпретирует загрузку другого файла в редактор, как конец сеанса отладки. Поэтому, если вы желаете выполнить или отладить другую программу, нужно выполнить команду Run/Program Reset (клавиша Ctrl -F2).

    Трассировка Вашей программы.

    Простейшая техника отладки — это пошаговая отладка, которая трассирует внутри процедур и функций. Загрузите программу RANGE.PAS в Turbo Pascal.

    полную генерацию отладочной информации>

    List:array [1..10] of integer;

    for Indx:=1 to 10 do List[Indx]:=Indx;

    while (Indx 0 then

    for Indx:=1 to 10 do writeln(List[Indx]);

    Начните отладку, нажав клавишу F7. Это пошаговая команда. Turbo Pascal произведет компиляцию автоматически, а затем подготовится к пошаговой обработке этой программы. Заметим, что курсор выполнения расположен на операторе begin (строка 7). Помните, что курсор выполнения помечает следующую строку программы, которая должна быть выполнена.

    Нажмите клавишу F7 несколько раз. Курсор выполнения переместится на оператор List[Indx]:=Indx и остановится. Это значит, что строка выполняется в цикле.

    Выберите команду Debug/Watches/Add Watch (Ctrl-F7) для просмотра в окне Add Watch. Вы можете просматривать значения переменных, структур данных или выражений в окне Watch.

    То, что появится в окне Add Watch зависит от того, где располагается курсор, когда Вы нажимаете на клавишу Ctrl-F7. Если курсор расположен на первой букве любой алфавитно-цифровой строки, внутри строки или сразу за ней, строка будет копироваться в окно Add Watch и подсвечиваться. Так, если курсор был спозиционирован на слове Indx, то Indx появится в окне. Если в окне необходимо что-либо изменить, начните набор на клавиатуре и первоначальное выражение и подсветка исчезнут.

    Как только появится окно Add Watch, независимо от его содержимого, можно добавить в него текст, если нажать клавишу Ў (которая копирует дополнительный текст из редактора). Поместите List в окно, используя Ў, и нажмите Enter. Тогда в окне Watch в нижней части экрана появится строка:

    Cнова нажмите клавишу Ctrl-F7, наберите слово Indx и нажмите Enter. Indx будет первым в списке в окне Watch:

    Нажмите клавишу F7 снова и Вы увидите, что значения Indx и List в окне Watch изменятся, отражая работу Вашей программы.

    Как только Вы войдете в цикл while, Вы снова увидите, что значения Indx и List изменяются шаг за шагом. Заметим, что эти изменения в окне Window отражают действия каждой строки цикла после нажатия клавиши F7.

    Продолжайте нажимать на клавишу F7, пока не достигнете начала цикла while, c Indx равным 10. Во время прохождения через цикл, Вы можете наблюдать как изменяются значения в окне Watch. Когда выполняется оператор

    List [ Indx ] := — List [ Indx ];

    значение Indx изменится на -11. Если Вы продолжаете нажимать на F7, то обнаружится, что вы вошли в бесконечный цикл.

    Таким образом, если Вы наберете такую программу, она будет компилироваться и выполняться. Получается бесконечный цикл, так как цикл while выполняется 11 раз, а не 10, и последнее значение переменной Indx равно 11. Так как массив List содержит только 10 элементов, значение List(11) будет указывать на некоторую позицию памяти вне массива List. Из-за способа распределения переменных уже окажется, что значение List(11) займет в памяти тоже место, что и переменная Indx. Это значит, что при Indx=11, запись:

    List [Indx] := — List [Indx]

    Так как значение переменной Indx равно 11, этот оператор изменит ее значение на -11. В результате в программе начнется повторное выполнение цикла. Этот цикл теперь изменяет дополнительные байты в месте, соответствующем List[-11..0]. И т.к. значение Indx никогда не будет заканчивать цикл со значением большим или равным 11, то цикл никогда не закончится.

    Важно отметить то, что используя лишь две клавиши (F7 и Ctrl — F7), через несколько минут, Вы быстро и легко прослеживаете промежуточные значения переменных и находите ошибку.

    Пошаговое выполнение программы.

    Различие между командами Trace Into (F7) и Step Over (F8) в том, что при использовании F7 осуществляется трассировка внутри процедур и функций, в то время как использование F8 приведет к обходу вызовов подпрограмм. Эти команды имеют особое значение при выполнении оператора begin основной программы, если программа использует модули, имеющие раздел инициализации. В этом случае, использование F7 приведет к трассировке раздела инициализации каждого модуля, что позволяет увидеть, что инициализируется в каждом модуле. При использовании F8 эти разделы не будут трассироваться, и курсор выполнения переходит на следующую строку после begin.


    Рассмотрим следующий (неполный) пример программы:

    NumList=array[1..NLMax] of integer;

    procedure Sort ( var L:NumList; Cnt:Integer);

    (sort the list) (сортировка списка)

    end; (of proc sort) (процедуры Sort)

    for I:=1 to Count do

    for I:=1 to Count do

    Предположим, что Вы отлаживаете процедуру Sort. Вы хотите осуществить трассировку процедуры Sort, включая проверку значения внутри List до вызова Sort. Однако, выполнять 100 раз инициализацию внутри List очень утомительно. Есть ли способ выполнять цикл, не останавливаясь на каждой выполняемой строке.

    Да, фактически, существует несколько способов. Во-первых, Вы могли бы выделить этот цикл в отдельную процедуру и нажать клавишу F8 для того, чтобы обойти ее трассировку, но это слишком нерационально. Во-вторых, Вы могли бы установить внутри программы точку прерывания. Мы объясним, что это за точки прерывания, и как они используются немного позже. В конце концов, Вы могли бы использовать команду Run/Go to Cursor (F4). Переместите курсор на строку с вызовом Sort, а затем нажмите на клавишу (F4). Ваша программа будет выполняться до достижения строки, помеченной курсором. Курсор выполнения переместится на эту строку; затем Вы можете начать трассировку с этого места, нажимая на клавишу F7, для того, чтобы можно было сделать трассировку внутри Sort.

    Команда Run/Goto Cursor (F4) действует на вложенных уровнях вызовов подпрограмм, даже если их исходный код находится в другом файле. Например, Вы могли бы разместить курсор где-либо внутри процедуры Sort и нажать на клавишу F4; программа выполнялась бы до этой строки. По существу, Sort могла бы быть выделена в отдельный модуль, отладчик бы уже знал, когда нужно остановиться и что отобразить.

    Существуют три случая, когда команда Go to Cursor (F4) не будет выполнять программу до отмеченной курсором строки.

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

    Второй случай, когда курсор расположен вне процедурного блока, например, на операторе объявления переменной или операторе program. Отладчик будет выводить сообщение «no code generated for this line» (для этой строки код не генерируется).

    Третий случай, когда Вы располагаете курсор на строке, которая никогда не выполняется. Например, строка располагается выше курсора выполнения (предполагается, что вы находитесь не в цикле) или строка является частью else — условного оператора, когда выражение if имеет значение true. В этом случае отладчик будет действовать так, как если бы выполнялась команда Run/Run (Ctrl-F9); программа будет выполняться до конца или до точки прерывания.

    Предположим, что Вы трассируете процедуру Sort,затем хотите завершить работу программы и посмотреть выходные результаты. Каким способом сделать это? Сначала нужно переместить курсор к последнему оператору end основной части программы, а затем выполнить команду Run/Go to Cursor (F4). Или проще, нужно выполнить команду Run/Run (Ctrl-F9). Она позволяет отладчику продолжить нормальное выполнение программы пользователя. Программа будет выполняться до конца, или до тех пор, пока Вы не достигнете точки прерывания или не будет нажат Ctrl-Break.

    Использование точек прерывания.

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

    Примечание: Вы можете иметь до 16 активных точек прерывания.

    Заметим, что точки прерывания существуют только во время сеанса отладки; они не сохраняются в файле .EXE, если программа компилируется на диск. Чтобы задать точку прерывания, используйте обычные команды редактирования для перемещения курсора на каждую строку программы, где Вы хотите сделать паузу. Каждый раз выполняйте команду Debug/Toggle Breakpoint (Ctrl-F8). Когда строка отмечается как точка прерывания, она высвечивается. Это не должна быть пустая строка, комментарии, директивы компиляции; объявления констант, типов, меток, переменных; заголовком программы, модуля, процедуры или функции. Как только Вы задали точки прерывания, выполняйте программу с помощью команды Run/Run (клавиша Ctrl-F9). Сначала программа будет выполняться нормально. Когда встретится точка прерывания, программа остановится. Соответствующий исходный файл (основная программа, модуль или включенный файл) загружается в окно Edit, которое визуализируется на экране и курсор выполнения помещается на строку с точкой прерывания.

    Заметим, что точка прерывания не высвечивается, когда на ней находится курсор выполнения. Если какие-либо переменные или выражения были добавлены в окно Watch, то они также выводятся на дисплей со своими текущими значениями.

    Затем, пользователь может использовать любой режим отладки.


      Вы можете осуществлять пошаговое выполнение программы, используя команду Run / Trace Into, Step Over или Go to Cursor (F7, F8 или F4). Вы можете проверить или изменить значения переменных.

    Вы можете добавить или удалить выражения из окна Watch.

    Можно назначить или удалить точки прерывания.

    Можно просмотреть выходные результаты программы, используя команду Windows/User Screen (Alt-F5).

    Вы можете перезапустить программу сначала ( Run/Program Reset и, затем, команду пошагового выполнения).

  • Можно продолжить выполнение до следующей точки прерывания (или до конца программы), выполнив команду Run/Run (Ctrl-F9).

  • Для удаления точки прерывания из строки переместите курсор на данную строку и, выполнив команду Debug/Toggle Breakpoint (или нажмите Ctrl-F8) еще раз. Эта команда включает или отключает точку прерывания в строке; если она используется для строки с точкой прерывания, то строка становится нормальной.

    Давайте вернемся к примеру, который был рассмотрен ранее.

    for I := 1 to Count do

    List [I] := Random (1000);

    for I := 1 to Count do

    Write ( List [I] : 8 );

    Как уже говорилось, идея была в том, чтобы обойти первоначальный цикл и начать трассировку с вызова процедуры Sort. Новый вариант. Передвиньте курсор на строку с вызовом процедуры и выполните команду Debug/Toggle Breakpoint ( Ctrl-F8), которая отметит строку, как точку прерывания. Теперь выполните программу до этой точки, используя команду Run/Run (Ctrl-F9 ). Когда программа достигнет этой строки, она остановится и позволит Вам начать отладку.

    Кроме назначения точек прерывания, пользователь может сделать немедленную остановку во время выполнения программы, используя клавишу Ctrl-Break. Это означает, что можно прервать работу программы в любое время. Когда Вы нажимаете на клавишу Ctrl-Break, выполнение программы прекращается. Вы возвращаетесь в редактор, курсор выполнения расположен на следующей строке программы, и программа готова к дальнейшему пошаговому выполнению.

    Фактически, отладчик автоматически подключает DOS, BIOS и другие сервисные функции. Он знает, является ли текущий выполняющийся код программой DOS, программой BIOS или программой пользователя. Когда Вы нажимаете на клавишу Ctrl-Break, отладчик ждет, пока программа выполняется сама. Затем он делает пошаговое выполнение инструкций машинного уровня, пока следующая инструкция не будет в начале строки исходного кода на Паскале. С этого момента отладчик прекращает работу, перемещает курсор выполнения на эту строку и предлагает Вам нажать на клавишу ESC.

    Примечание: Если пользователь нажимает на клавишу Ctrl-Break второй раз еще до того, как отладчик находит и отображает следующую строку исходного кода для выполнения, то отладчик завершает работу и не пытается найти строку исходного кода. В этом случае, процедуры выхода не выполняются, что означает, что файлы, видеорежим и распределение памяти DOS могут быть не полностью очищены.

    Выполнение программы предоставляет много информации, но не в том объеме, как хотелось бы. Может возникнуть необходимость просмотреть за тем, как изменяются значения переменных во время выполнения программы. Рассмотрим процедуру Sort из предыдущей программы:

    procedure Sort ( var L : NumList; C : word );

    for Top := 1 to C-1 do

    for k := Top+1 to C do

    Примечание: Измените NLMax в теле программы на 10 так, чтобы Вы могли работать с меньшим массивом.

    В этой процедуре есть ошибки, будем просматривать ее (используя команду Run/Trace Into или клавишу F7) и наблюдать за значениями переменных L, Top, Min и k.

    Отладчик дает возможность пользователю задать объекты для просмотра во время выполнения Вашей программы. Как Вы и предполагаете, объектами просмотра являются переменные, структуры данных и выражения, расположенные в окне Watch, где отображаются их текущие значения, обновляемые по мере выполнения каждой строки программы. Давайте вернемся к предыдущему примеру. Установить объекты наблюдения просто.

    Передвигайте курсор к каждому идентификатору и выполняйте команду Debug/Watch/Add Watch (Ctrl -F7) для добавления каждого выражения в окно Watch.

    Результат может выглядеть так:

    Предполагается, что Вы только что вошли в процедуру Sort, курсор выполнения расположен на начальном операторе begin. (Если Вы еще не вошли в процедуру Sort, то для каждого выражения в окне Watch будет появляться сообщение «unknown identifier» (неизвестный идентификатор), пока Вы не войдете в процедуру). Заметим, что переменные K, Min и Top имеют произвольные значения, т.к. они еще не были инициализированы. Значения переменной L, предположительно, тоже должно быть произвольным; они не будут таковыми при выполнении всей программы; все они должны быть неотрицательными и лежать в интервале от 0 до 999.

    Если нажать на клавишу F7 четыре раза, то мы продвинемся к строке if L[k]Top then, назад к вершине внешнего цикла, и снова вниз к строке if L[k]

    Теперь Вы можете заметить две вещи. Первое, последнее значение переменной L(34), которое является также и наименьшим значением, скопировалось в первое значение L, и значение, которое уже было там раньше (163), исчезло. Второе, переменные Min и Top имели одинаковые значения во время трассировки процедуры. Фактически, Вы можете заметить, что переменная Min получает значение переменной Top, но она никогда не изменяется где-либо еще. Однако, ниже цикла располагается проверка:

    Или эта проверка ошибочна, или существует какое-то несоответствие между этими двумя частями процедуры. Оказывается, ошибочна пятая строка программы. Она должна выглядеть так:

    Min := k, вместо L[Min] := L[k].

    Исправьте строку, переместите курсор к первоначальному оператору begin в процедуре Sort и выполните команду Run/Go to Cursor (F4). Так как Вы изменили программу, на экране появится окно с вопросом Source modified, rebild? (Y/N) (исходный модуль модифицирован, нужна ли сборка? Да/Нет). Ответьте Y. Программа будет перекомпилироваться, начнется ее выполнение, затем произойдет остановка на начальном операторе begin процедуры Sort. Теперь программа работает верно. Значение первого элемента теперь не меняется на наименьшее из значений элементов массива L, происходит обмен-перемещение значения первого элемента массива на место, где до этого располагался элемент с наименьшим значением. Затем процесс повторяется со второй позицией, третьей и т.д., пока список элементов не будет отсортирован полностью.

    Порядок работы в Паскале

    (1)Запустите Паскаль

    (2)Введите программу

    (3)Сохраните программу на жестком диске

    (4)Выполните программу


    Если результаты вас удовлетворяют, перейдите к пункту 6

    (5)Исправьте ошибки в программе

    Вернитесь к пункту 3

    (6)Отдыхайте

    Рассмотрим подробно и по порядку пункты этого алгоритма.

    (1) Запуск Паскаля

    Итак, вы в отчаянном положении. Вы хотите запустить Паскаль, но не знаете, как это сделать, и некому вам объяснить. Я сейчас попробую вам помочь, но шансы на успех – 50 на 50.

    Прежде всего прочитайте приложение П2 и параграфы (2) и (3) из этой главы, так как они помогут вам путешествовать по каталогам (обратите, кстати, внимание на двойную точку (..)). Напомню, что вы должны знать имя каталога Паскаля на вашем компьютере и дорожку к нему. Если не знаете, то могу вам подсказать, что скорее всего имя каталога – TP или TP70 или PASCAL или что-то очень близкое (если у вас Borland Pascal, то, возможно, BP). А находится этот каталог скорее всего в корне одного из логических дисков. Если его нет в корне, то он – внутри какого-нибудь каталога, скажем, PROGRAMS. Только не ищите его в каталоге WINDOWS, это опасно, да и не бывает его там. Вы должны также знать имя запускающего файла в каталоге Паскаля. Это turbo.exe (если у вас Borland Pascal, то bp.exe). Он может находиться не в самом каталоге Паскаля, а в его подкаталоге BIN.

    А теперь вперед:

    Включите компьютер, если он еще не включен. Некоторое время по черному экрану бегут белые слова – это компьютер рапортует вам о том, как он сам себя проверяет, загружает операционную систему (ОС) и, возможно, другие программы. Затем на экране устанавливается и замирает картинка. Ее вид зависит от ОС и других загруженных программ. В подавляющем большинстве случаев возможны три варианта:

    А) Независимо от ОС, у вас автоматически загружается операционная оболочка Norton Commander. Это было бы легче всего.

    Б) Ваша ОС – Windows 95.

    В) Ваша ОС – Windows 3.1 или 3.11.

    Рассмотрим все эти три варианта.

    А) Загружен Norton Commander. Его вы узнаете по синему экрану, разделенному по вертикали пополам на две “панели”. На каждой панели – список файлов и подкаталогов какого-нибудь каталога какого-нибудь логического диска вашего компьютера. Имена каталогов приведены заглавными буквами, а имена файлов с расширениями – строчными. Обе панели совершенно равноправны. Это просто два независимых “окна”, глядящие внутрь ваших дисков. Наверху каждой панели написана дорожка к каталогу, внутренность которого вы лицезреете на панели.

    Для начала щелкните по клавише F2. Возможно, в открывшемся меню вы сразу найдете Паскаль. Если нет, то при помощи клавиши Esc уберите меню с экрана.

    При помощи клавиш , ® ,­ , ¯ , Tab, Enter попробуйте добраться до каталога Паскаля на манер того, как я вам советую в параграфе (3) добраться до вашего каталога. Только вместо полос прокрутки пользуйтесь мышкой или клавишами ­ , ¯, , ® , а вместо двойного щелчка мышкой можете пользоваться клавишей Enter. Если вы хотите посмотреть содержимое другого логического диска, то, удерживая нажатой клавишу Alt, щелкните по клавише F1 или F2 и из появившегося меню выберите нужный диск.

    Вот вы нашли Паскаль. Зайдите внутрь каталога Паскаля. Здесь вам нужно найти запускающий файл. Запустите Паскаль, щелкнув по этому файлу клавишей Enter. Дело сделано.

    Б) Загружена ОС Windows 95. Попробуйте найти на экране значок с надписью Turbo Pascal или близкой, и если нашли, щелкните по ней мышкой дважды. Если двойной щелчок не получается, щелкните один раз, а затем нажмите клавишу Enter. Дело сделано.

    Если значок не нашли, найдите в левом нижнем углу экрана «кнопку» Пуск или «подковырните» ее оттуда мышкой. Щелкните по ней мышкой. Щелкните в выпавшем меню слово Программы, а там – Проводник. Откроется окно, в котором вы попробуйте добраться до каталога Паскаля на манер того, как я вам советую в параграфе (3) добраться до вашего каталога. Но рычаги управления здесь другие. В левой половине окна Проводника вы увидите дерево, похожее на то, что я описывал в П2. Пользуясь полосами прокрутки, найдите на нем значок нужного вам логического диска и если слева от него стоит значок “+”, щелкните по плюсу. Из логического диска “выскочат” ветки-каталоги. Щелкните по значку нужного каталога. В правой половине окна Проводника вы увидите список файлов и подкаталогов этого каталога. Каталоги изображены значками в виде желтых папочек, файлы – любыми другими. Найдите запускающий файл в виде белого прямоугольника с нужным именем и щелкните его дважды.

    Может так случиться, что Паскаль заартачится, не захочет запускаться, начнет предупреждать и жаловаться на что-то. Мой совет – попробуйте запустить Norton Commander. Для этого повторите все описанные действия, но не для запуска Паскаля, а для запуска Нортона. Его запускающий файл – nc.exe, находится он в каталоге, имя которому, скорее всего, NC или NC50 или Norton или близкий. Затем перейдите к пункту А).

    В) Загружена ОС Windows 3.1 или 3.11. Перед вами – окно с надписью “Диспетчер программ”. Если окна нет, значит – значок с такой надписью. Щелкните по нему дважды, чтобы он превратился в окно. Если двойной щелчок не получается, щелкните один раз, а затем щелчок по слову «Развернуть». Окно раскрылось.

    Щелкните по слову “Файл”. В выскочившем из него меню – по слову “Выполнить”. В узеньком окошке с названием “Командная строка” мигает курсор. Наберите на клавиатуре дорожку до Паскаля (например, c:\tp\turbo.exe) и щелкните по клавише ввода. Если дорожка верна, то дело сделано. Если нет, то Windows сообщит вам, что файл она не нашла. Щелкните по сообщению “ОК” на экране и попробуйте найти Паскаль, щелкнув на экране по кнопке “Пролистать”. Выберите мышкой “устройство” (нужный диск). Затем попробуйте найти “каталог”, щелкая дважды по значкам кажущихся вам подходящими каталогов. Начните с самого верхнего значка. Если двойной щелчок не получается, щелкайте один раз, а затем щелчок по слову «ОК». При этом в левом окне внимательно просматривайте имена файлов, входящих в выбранный вами каталог. В окне “Каталоги” значки каталогов-родителей расположены чуть левее, а каталогов-“детей и внуков” – правее. Пользуйтесь прокруткой. Заметив в левом окне запускающий файл Паскаля, щелкайте по нему – и ОК. И еще раз ОК. Дело сделано.

    (2) Начало работы. Ввод программы. Выход из Паскаля

    Итак, вы запустили Паскаль и первое, что вы увидели, это пустой синий экран. В верхнем левом углу мигает черточка – курсор. Значит, Паскаль приглашает вас вводить текст программы. Это пустое синее пространство, со всех сторон взятое как бы в рамочки, называется окном редактора.

    Иногда Паскаль настроен так, что при запуске вместо окна редактора показывает бессмысленное серое пространство — рабочий стол. Курсора нигде не видно, программу вводить некуда. Не огорчайтесь — дело легко поправить. Поправить или мышкой или с клавиатуры.

    Мышкой быстрее — щелкните по слову Fileв главном меню наверху экрана, а затем в выпавшем из него другом меню — по слову New.

    Если с клавиатуры, то нажмите клавишу F10, затем клавишами или ® подсветите слово File и нажмите клавишу ввода. Затем клавишами ­ или ¯ подсветите слово New и снова нажмите клавишу ввода.

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

    (В дальнейшем для краткости я не буду писать, как выбирать пункты меню. Я просто напишу File ® New).

    Выход из ПаскаляFile ® Exit.

    (3) Сохранение программына диске. Загрузка программыс диска


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

    Для этого в меню File есть опция Save. Как только вы ее выберете, перед вами появится диалоговое окно – Паскаль предлагает вам выбрать каталог, в который вы хотите записать программу, и имя, которое вы хотите дать файлу вашей программы (Если вы не очень хорошо знаете, что такое файл и каталог, то сейчас самое время прочесть приложение).

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

    Путешествуя подобным образом по каталогам, вы в конце концов дойдете до нужного. Дважды щелкните по нему и вы окажетесь внутри него. После этого щелкните внутри поля для имени файла. Там замигает курсор. Сотрите все, что там написано, и введите туда придуманное вами имя файла. После этого нажмите клавишу ввода или щелкните на экране по кнопке OK. Ваша программа записана на диск. В качестве подтверждения заголовок вашего листа изменился с NONAME00.PAS на имя вашего файла с расширением PAS.

    Теперь программу можно запускать на выполнение.

    После выполнения программу обычно исправляют и дополняют и перед следующим выполнением опять сохраняют: File ® Save. Но в этот раз диалоговое окно не появляется. Паскаль, ни о чем вас не спрашивая, стирает с диска всю вашу старую программу и на ее место записывает с тем же именем ту, что вы видите на экране (и то, что вы видите, прокрутив окно, конечно). Так поступают все современные программные продукты.

    Если старый вариант программы вам по каким-то соображениям дорог и вы не хотите его стирать, вам нужно выполнить File ® Save as… На экране возникает то же самое диалоговое окно, предлагающее вам то же самое имя файла в том же самом каталоге. Измените имя или каталог и щелкните по кнопке OK. Ваша программа с экрана будет записана в другое место диска, а старый файл будет нетронут.

    Загрузка программы с диска. Предположим, вы вчера сохранили свою программу, а сегодня хотите продолжить с ней работу. Вы включаете компьютер, запускаете Паскаль, перед вами пустое окно редактора. Ваши действия: File ® Open. На экране появляется диалоговое окно, очень похожее на то, что появляется при сохранении программы:

    И действия ваши очень похожи: вы должны отыскать в окне файл вашей сохраненной вчера программы, для чего вам придется попутешествовать по каталогам. Найдя файл, щелкните по нему дважды или один раз по нему, один раз по Open. Ваша программа появляется на экране.

    (4) Выполнение программы

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

    Выберите пункт главного меню Run. В выскочившем подменю щелкните по опции Run. Все остальное делает компьютер. Начинает он с того, что за долю секунды компилирует вашу программу. После этого, не прерываясь ни на мгновение, он начинает выполнять откомпилированную программу. При этом окно редактора уходит с экрана и на нем возникает черное окно пользователя, на котором Паскаль и будет печатать и рисовать все, что прикажет программа. Если программа короткая и не содержит остановок и пауз, то Паскаль мгновенно печатает и рисует все, что приказано, и возвращает на экран окно редактора. Поскольку все произошло мгновенно, то создается впечатление, что ничего и не произошло – на экране было окно редактора, потом что-то мелькнуло, — и снова на экране окно редактора, а результатов никаких и не видно.

    Чтобы увидеть результаты, можно пойти двумя путями:

    · После того, как программа уже выполнилась, выбрать опцию User Screen. В Турбо-Паскале 7.0 она находится в пункте меню Debug. Если вам не хочется искать ее в меню, нажмите Alt-F5. На экране возникнет окно пользователя с результатами. Этот способ плох при работе в графическом режиме: изображение или искажено, или вообще не просматривается.

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

    Прокрутка окна пользователя. Если ваша программа печатает много результатов, то все они могут и не поместиться на экране. В этом случае Паскаль начинает прокручивать окно пользователя, и самые верхние результаты исчезают из окна (их уж не вернуть!). Поскольку прокрутка обычно идет быстро, то вы просто не успеваете рассмотреть бегущие по экрану и убегающие наверх результаты. Спокойно посмотреть на них вы сможете только при остановке программы (по ReadLn или по окончанию работы). Чтобы результаты не успели убежать нерассмотренными наверх, используйте не один, а несколько ReadLn, расставив их в нужных местах программы.

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

    Для прерывания работы программы (в том числе и зациклившейся) существует комбинация клавиш Ctrl-Break. На экран возвращается окно редактора. Строка программы, на которой она была прервана, выделяется полосой белого цвета. Если вы снова запустите программу, она продолжит работу с прерванного места. Чтобы начать сначала, уберите полосу с экрана клавишами Ctrl-F2.

    (5) Исправление ошибок. Отладка программы.

    Сообщения об ошибках. Ошибки в программах делятся на те, которые Паскаль замечает, и на те, что не замечает и в принципе заметить не может. К первым относятся все синтаксические погрешности, например, BIGIN вместо BEGIN. Их Паскаль замечает еще на стадии компиляции. На стадии выполнения он замечает такие ошибки, как Sqrt(-25), то есть квадратный корень из ‑25. Но вот, если вы, желая возвести число a в куб, вместо a*a*a пишете a*a, то этого не заметит ни один язык в мире.

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

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

    Вот наиболее типичные для начинающих сообщения об ошибках того и другого рода:

    2020-11-06, 17:23 #1
    Сообщение Перевод Вероятная причина ошибки
    Unexpected end of file Неожиданный конец файла Вы забыли поставить точку после последнего END. Или не совпадает количество begin и количество end
    “;” expected Ждал точку с запятой Вы забыли поставить точку с запятой после предыдущего оператора
    “,” expected Ждал запятую Вы указали слишком мало параметров в обращении к подпрограмме
    “)” expected Ждал скобку “)” Вы указали слишком много параметров в обращении к подпрограмме
    Unknown identifier Неизвестное имя Вы забыли описать это имя в разделе описаний Неправильно записали стандартное имя, например, ReedLn вместо ReadLn
    Type mismatch Несовпадение типов В вашей программе встречаются примерно такие «сладкие парочки»: VAR c:String; … c:=1+2 или VAR h:Integer; … h:=9/7
    Duplicate identifier Дубль имени Одно и то же имя описано два раза. Например, VAR a, c, a :String;
    Syntax error Синтаксическая ошибка Паскаль затрудняется назвать причину ошибки. Часто причина в том, что вы забыли взять строковую константу в кавычки
    BEGIN expected Ждал BEGIN Возможно, не совпадает количество begin и количество end
    END expected Ждал END Возможно, не совпадает количество begin и количество end
    String constant exeeds line Строковая константа превышает допустимую длину Вы забыли закрыть кавычки в строковой константе
    Line too long Строчка слишком длинна Слишком длинная строчка в программе (не путать со строковой константой, которую нужно брать в кавычки). Не рекомендую залезать программным текстом за правый край экрана
    Disk full Диск заполнен На вашем диске не осталось места. Надо что-то стереть
    Lower bound greater than upper bound Нижняя граница диапазона больше верхней Например, вы вместо array[2..5] написали array[5..2].
    Invalid floating point operation Неправильная операция с вещественным результатом Sqrt(-25) или a/0 или что-нибудь в этом роде
    Ordinal expression expected Ждал выражение порядкового типа Например, вы вместо for i:=1 to 8 написали for i:=1 to 8.5
    Error in expression Ошибка в выражении Например, вы вместо k:=а*8 написали k:=а**8
    Range check error Ошибка проверки диапазона Переменная в процессе выполнения программы вышла за пределы допустимого диапазона, как например, в 12.9
    Constant out of range Константа не в диапазоне Величина константы в программе превосходит допустимый диапазон
    Invalid numeric format Неправильный числовой формат Если, например, вы по оператору ReadLn(k) в программе VAR k:Integer; …. ReadLn(k) … пытаетесь ввести число 25.3

    Более подробное описание некоторых ошибок вы найдете в 4.3.

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

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

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

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

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

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

    VAR a1,a2,V : Real;


    BEGIN

    if a1>a2

    then V:=a1*a1*a1

    else V:=a2*a2*a2;

    END.

    Запускайте программу, но не обычным образом, а клавишей F7, которая является более быстрым способом вызова меню Run®Trace 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выбрать Run®Run(клавиши Ctrl-F9) и программа продолжит выполняться в обычном режиме. Чтобы прервать пошаговый режим, выберите Run®Program reset(клавиши Ctrl-F2).

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

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

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

    goto m1;

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

    goto met5;

    END.

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

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

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

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

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

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

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

    Вы сами должны сказать Паскалю, за какими переменными хотите следить. Очевидно, в вашем случае это n и k. Ваши действия: Debug®Add 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 — «наружу».

    Отладка больших программ

    Точки прерывания — Breakpoints. Будем считать “большими” программы, превышающие пару размеров экрана. Для них изложенный только что пошаговый режим может быть очень утомительным, так как слишком часто приходится жать F7. Вы можете заставить Паскаль при выполнении программы задерживаться не на каждой строке, а только на некоторых — тех, что вам нужно.

    Поставьте курсор на одну из этих строк и нажмите Ctrl-F8. Строка станет красной. Это знак того, что при выполнении программа на ней остановится. Будем называть эту строку точкой прерыванияили контрольной точкой.

    Поставьте курсор на другую строку и снова нажмите Ctrl-F8. Эта строка тоже станет точкой прерывания.

    Так проделайте со всеми нужными вам строками. Затем можете обычным образом вывести на экран окна пользователя и отладчика.

    А теперь обычным образом (Run®Run или Ctrl-F9) запускайте программу. Программа будет выполняться до тех пор, пока не наткнется на какую-нибудь точку прерывания. На ней она встанет и продолжит работу с того места, где остановилась, только при новом нажатии Ctrl-F9. И так далее.

    Убирается точка прерывания точно так же, как ставится — Ctrl-F8.

    “Иди до курсора” — Goto cursor. Это еще один способ остановки в нужной вам строке. Поставьте курсор в нужную строку и нажмите F4. Программа будет выполняться до тех пор, пока не наткнется на строку с курсором. А теперь поставьте курсор в другую строку и снова нажмите F4. Программа продолжит работу с того места, где остановилась, и будет выполняться до тех пор, пока не наткнется на строку с курсором. И так далее.

    Кстати, в процессе выполнения программы вы можете достаточно свободно переключаться между разными способами ее выполнения – F7, F4 или Ctrl-F9.

    Испольование Write и ReadLn. Если программа работает с графикой, то пользоваться вышеописанными средствами отладки или неудобно или нельзя. Не беда. Еще до существования всех и всяческих отладчиков программисты пользовались вспомогательной печатью значений переменных. Действительно, вместо использования окна отладчика для подсматривания за переменными n и k, вы просто можете в программу вставить дополнительный оператор Write(’ n=‘,n,’ k=‘,k). А вместо пошагового режима можете в нужных местах программы поставить ReadLn. Когда программа будет отлажена, вы уберете эти дополнительные операторы.

    Только имейте в виду, что когда экран с вашими картинками донизу будет заполнен информацией, напечатанной оператором Write, он начнет прокручиваться вверх, а вместе с ним вверх уползут и ваши картинки. Чтобы избежать этого, нужно сделать так, чтобы не допечатав донизу, компьютер при помощи ReadLn сделал паузу (чтобы вы успели посмотреть результаты печати) и снова стал печатать бы сверху. А для печати сверху необходимо вставить в нужное место программы оператор GotoXY (см.15.7). А уж для этого вам нужно использовать модуль CRT (см. 9.1) и вставить в начало программы оператор DirectV >

    Не нашли то, что искали? Воспользуйтесь поиском:

    Лучшие изречения: Увлечёшься девушкой-вырастут хвосты, займёшься учебой-вырастут рога 9794 — | 7671 — или читать все.

    #pascal — помогите найти ошибку в программе в Pascal

    Я тебе сказал уже: пиши в файл, а файл просматривай сторонними средствами. Это первый вариант. Второй вариант — выводишь по 25 строк, чтобы успеть просмотреть каждую порцию, потом жмешь Enter и на экран выводится следующая порция результатов. Устраивает тебя это? Тогда покажу, как сделать.

    Третий вариант — выводить не только «порциями», а еще и в несколько столбцов (не всегда приемлемо, несколько столбцов могут и не поместиться на экране). Тогда нажимать на Enter придется не так много раз.

    Я тебе сказал уже: пиши в файл, а файл просматривай сторонними средствами. Это первый вариант. Второй вариант — выводишь по 25 строк, чтобы успеть просмотреть каждую порцию, потом жмешь Enter и на экран выводится следующая порция результатов. Устраивает тебя это? Тогда покажу, как сделать.

    Третий вариант — выводить не только «порциями», а еще и в несколько столбцов (не всегда приемлемо, несколько столбцов могут и не поместиться на экране). Тогда нажимать на Enter придется не так много раз.

    у меня когда-то был паскаль в котором я мог смотреть результаты пролистывая клавишами page up page down, но в 7.1 не могу этого сделать

    Добавлено 08.09.09, 18:45
    да меня устроит выводить по 25 строк, если можно будет вернуться к уже просмотренным строкам, раньне у меня был паскаль в котором я мог перемещаться в окне результатов с помощью page up? page down? неужели в 7.1 нет такой возможности?

    Цукерберг рекомендует:  Введение в обработку Больших Данных
    Понравилась статья? Поделиться с друзьями:
    Все языки программирования для начинающих