Паскаль исправить ошибки в программе
Ошибки в программировании бывают двух типов: синтаксические и логические. Синтаксические ошибки это неправильное написание ключевых слов и символов языка программирования. Все виды синтаксических ошибок могут быть найдены компьютером в 99 % случаев.
Логические ошибки связаны с неправильной программной реализацией логики алгоритма. В 99 % случаев компьютер будет выполнять программу, но результат работы будет неправильный.
Примеры синтаксических ошибок в языке Паскаль и их исправление:
Error 85: ";" expected.
(Ошибка 85: ";" отсутствует.)
Error 3: Unknown identifier.
(Ошибка 3: Неизвестный идентификатор.)
Error 10: Unexpected end of file.
(Ошибка 10: Неправильный конец файла.),
Курсор установится на букву "e" в слове "end". Надо поставить точку и снова выполнить программу.
Выполнение программы. Ключевые кнопки
После того, как программа набрана, можно попробовать ее выполнить.
Для этого нажимаем клавиши + (удерживая клавишу , нажать клавишу ). Эту же операцию можно выполнить, перейдя в основное меню, нажав клавишу , а затем перемещением указателя выбрать опцию Run и нажать клавишу .
Теперь надо найти в новом меню опцию RUN (пуск) и нажать клавишу .
Если не было ошибки при вводе текста, то, спустя несколько секунд, произойдет смена изображения на экране. Турбо Паскаль предоставляет экран в распоряжение работающей программы пользователя. Такой экран называется окном программы.
После завершения прогона (работа программы часто называется ее прогоном) на экране вновь появится окно редактора с текстом программы. Если Вы не успели разглядеть изображение окна программы, то нажмите Alt-F5. При этом окно редактора скроется и вы сможете увидеть результаты работы программы. Чтобы вернуть экран в режим воспроизведения окна редактора, надо нажать на любую клавишу.
Первые ошибки и их исправление
Error 85: ";" expected.
(Ошибка 85: ";" отсутствует.)
Error 3: Unknown identifier.
(Ошибка 3: Неизвестный идентификатор.)
Error 10: Unexpected end of file.
(Ошибка 10: Неправильный конец файла.),
курсор установится на букву "e" в слове "end". Надо поставить точку и снова выполнить программу.
Помощь в “PASCAL”.
В Турбо Паскаль имеется справочная служба, охватывающая все возможные вопросы по написанию программ. Главное – это подсказки по ключевым словам языка.
Меню опции HELP
CONTENTS. Выводит на экран содержание справочной службы.
INDEX. Выводит на экран алфавитный список всех ссылок справочной службы. Вызывается из редактора командой Shift-F1.
TOPIC SEARCH. Осуществляет поиск в окрестности курсора зарезервированного слова или имени стандартной процедуры (функции) и дает соответствующую справку. Вызывается из редактора командой Ctrl-F1.
FILES. С помощью этой опции Вы можете установить нужные файлы справочной службы.
COMPILER DIRECTIVES. Показывает справку о директивах компилятора.
RESERVED WORDS. Показывает справку о зарезервированных словах.
STANDARD UNITS. Показывает справку о стандартных модулях.
TURBO PASCAL LANGUAGE. Показывает справку о языке Турбо Паскаль.
ABOUT. Выводит информацию об авторских правах и версии Турбо Паскаля.
Лекция №7 Процедуры. Программирование рекурсивных алгоритмов.
Дедуктивный метод программирования
Программист должен видеть в целом программу, которая решает какую-то задачу, а потом разбивает ее на отдельные части, составляет на выбранном языке программирования эти части программы, объединяет их в единое целое и получает программу.
Итак, весь творческий процесс можно разбить (разумеется, чисто условно) на следующие этапы:
1) основная идея решения задачи;
2) общая конструкция программы;
3) выделение отдельных, элементарных частей программы;
4) практическая реализация на языке программирования этих частей программы;
5) объединение их в единую программу.
Такой процесс программирования называют структурным или нисходящим. Более подробно с этим процессом мы познакомимся позже, когда изучим хотя бы основы языка программирования, но об отдельных частях, "кирпичиках", составляющих программу узнаем на этом занятии.
Подпрограммой называется группа операторов, к которой обращаются из основной программы несколько раз. Иногда это может быть 2, 3 раза, а очень часто, каждый раз из выполняемого цикла основной программы.
Вполне понятно, что писать несколько раз одинаковые группы операторов трудно, проделывается много "технической" работы, а в некоторых случаях просто невозможно (если обращаться приходиться каждый раз при выполнении цикла).
Для облегчения такой работы и созданы подпрограммы.
Использование подпрограмм позволяет:
1) сделать основную программу более наглядной и компактной;
2) уменьшить объем используемой памяти ЭВМ;
3) сократить время отладки программы.
На языке Паскаль подпрограммы бывают двух видов, - это процедуры и функции.
Рассмотрим следующий простой пример, с помощью которого попробуем разобраться в конструкции процедур на Паскале.
Пример. Составить программу, которая бы проверяла, являются ли три числа взаимно простыми.
Мы знаем, что числа называются взаимно простыми, если их наибольший общий делитель (НОД) равен 1. Значит, для решения этой задачи нам придется дважды находить НОД чисел. Если заданы три числа: a, b, c, то найти НОД(a, b), а затем найти НОД(НОД(a, b), c).
Дважды писать операторы для нахождения НОД нам не хочется, поэтому оформим операторы для НОД в виде процедуры.
Посмотрите, как это будет выглядеть в программе:
a, b, c, k : integer;
Procedure nod(a, b : integer; var n : integer);
write('Введите три натуральных числа '); readln(a, b, c);
if k = 1 then writeln('Числа взаимно простые')
else writeln('Числа не взаимно простые')
В разделе описаний, после описания переменных, записывается заголовок процедуры: Procedure
Это слово является служебным и зарезервировано в Паскале. В одной строке с ним, через пробел, записывается имя процедуры, которое должно удовлетворять всем требованиям, предъявляемым к именам, основными из которых являются: начинаться с буквы и не иметь пробелов, т. е., требования такие же, как и к имени программы (имя нашей процедуры - nod):
Procedure nod(a, b : integer; var n : integer);
Далее, в скобках, записываются имена переменных и их типы, значения которых будут вводиться в процедуру из основной программы, в нашем случае, их две (a, b) и они имеют тип integer.
Сразу надо заметить, что имена этих переменных могут не совпадать с именами переменных в основной программе, скажем мы могли их обозначить m, n или любыми другими именами.
После точки с запятой и зарезервированного слова var, записываются переменные и их типы, значения которых будет являться результатом работы процедуры и выводятся из нее в основную программу. Такая переменная в нашем примере одна - n. Она выведет значение НОД чисел a и b. Ее имя также может иметь одноименное в основной программе и это нисколько не отразится на работе процедуры.
Обратите внимание, что перед переменными, значения которых вводятся из основной программы, не ставится слово var, а перед переменной, значение которой выводится в основную программу, это слово записано. Это очень важное обстоятельство!
Так, если поставить var перед a и b, то компилятор будет воспринимать эти переменные как выходные и вводимые для них значения воспринимать не будет, и, наоборот, если var не будет записано перед выходной переменной, то компилятор воспримет ее как входную и выводить ее значение в основную программу не будет.
Дальнейшее построение процедуры строится также, как и основная программа на Паскале.
Описываются переменные, которые будут участвовать в ее работе, но их имена не должны повторять имена уже описанных входных и выходных параметров в заголовке программы. Далее описываются необходимые для работы операторы.
В нашем примере процедура nod будет такой:
Procedure nod(a, b : integer; var n : integer);
Основная программа строится обычным образом, но там, где необходимо найти НОД чисел, обращается к процедуре. Как?
Для этого обращаются к ней по имени, а в скобках записывают фактические значения входных переменных (в нашем случае для переменных a и b), а также имена выходных переменных (в нашем случае k).
Из приведенного ниже участка программы видно, что при первом обращении к процедуре nod определяется НОД чисел a и b (nod(a, b, k)) и результат запоминается в переменную k, далее, изменяются значения переменных a и b и снова вызывается процедура nod, которая уже находит НОД чисел k и c и результат присваивает переменной k.
Вы можете видеть основную часть программы:
write('Введите три натуральных числа '); readln(a, b, c);
if k = 1 then writeln('Числа взаимно простые')
else writeln('Числа не взаимно простые')
Сделаем общие выводы для построения и работы процедур
Процедуры помещаются в разделе описаний и начинается зарезервированным (служебным) словом
Процедуре обязательно дается имя, которое должно удовлетворять тем же требованиям, что и имена переменных, т.е. это может быть одна или несколько букв, комбинация букв и целых чисел, но без пробелов, начинаться с буквы и т.д.
После имени, в скобках записываются переменные - параметры и их тип: входные, значения которых используются для вычисления в качестве аргументов.
Выходные параметры - это те переменные, в которых получается результат выполнения процедуры.
Фактические, конкретные, значения формальные параметры должны получить в основной программе после обращения к ней (а пока в процедуре они являются не чем иным, как "пустышками").
После формальных параметров, описываются переменные, которые необходимы непосредственно для работы процедуры.
Это параметры процедуры. Они нужны в ней, как и в любой другой программе и описываются также. Их имена должны отличаться от имен входных и выходных параметров.
Надо заметить, что процедура может быть такой, что в ней не будет вообще параметров, достаточно тех, которые будут введены из программы.
Описание процедуры имеет вид:
Она помещается в основной программе в разделе описаний.
По входным и выходным параметрам процедуры могут быть следующих типов:
1) иметь и входные и выходные параметры:
Мы только познакомились с программой такого типа.
2) иметь входные параметры, но не иметь выходных:
3) иметь выходные параметры, но не иметь входных:
4) не иметь ни входных, ни выходных параметров:
В зависимости от этого различаются процедуры по своей конструкции и выполняемым функциям.
Далее следует раздел операторов, который составляется по тем же правилам, как и в других программах.
Процедура описана и после этого начинается основная программа.
Как происходит вызов подпрограммы - процедуры?
Обязательно указывается имя процедуры. В скобках задаются фактические значения входных параметров и те переменные, в которые будут "запоминаться" выходные значения.
Рассмотрим пример, где может быть использована процедура второго типа: имеет входные параметры, но не имеет выходных.
Пример. Составить программу, которая устанавливает, какие числа из заданного промежутка [a; b] можно представить в виде суммы двух квадратов целых чисел?
В этой программе, нам придется проверять каждое из чисел промежутка [a; b] можно ли его представить в виде суммы квадратов двух чисел, поэтому было бы разумно разработать процедуру, которая бы проверяла одно число и затем обращаться к ней из основной программы для проверки каждого числа из промежутка.
Процедуру составим по следующему способу. Пусть задано число n. Нам необходимо найти такие два числа a и b, чтобы сумма их квадратов была равна n, т.е. решить в целых числах уравнение:
Возникает естественное желание испытывать натуральные числа от 1 и до . А вот до какого значения неизвестно. Если их брать до числа n, то это будет слишком много лишней и бесполезной работы.
Чтобы выяснить этот вопрос, можно организовать цикл, в котором проверять сколько чисел a надо, чтобы выполнялось неравенство: Здесь, в качестве b взято наименьшее натуральное число 1. Организовав такой цикл, и подсчитав, сколько чисел a потребуется, мы узнаем сколько чисел надо просматривать, чтобы найти решение уравнения.
Этот цикл может быть таким:
Теперь ясно, что для испытания чисел, следует устроить цикл от 1 до k:
for a := 1 to k do
Второй цикл должен быть для значений b. Но если его организовать тоже от 1 до k, тогда могут повторяться дважды одинаковые значения, только на разных местах, например, для числа 20 могут быть выданы следующие значения:
2 2 + 4 2 = 20 и 4 2 + 2 2 = 20.
Чтобы избежать повторения чисел, цикл для чисел b можно организовать либо от 1 до a, либо от k до а.
Для того, чтобы найти ошибку, нужно поставить в соответствие друг другу все части условного оператора if и else.
Помним, что часть else относится к ближайшему if. При этом наличие части else не обязательно.
Кроме того, часто присутствует ошибка при вводе или выводе. Обязательно нужно проверить, та ли информация выводится на экран.
Особого внимания требует инициализация переменных.
Формат книги не позволяет рассмотреть все основные типы задач 2 части, рассмотрим лишь те, которые встречались на проверочных и экзаменационных работах последних двух лет.
На обработку поступает положительное целое число, не превышающее 10 9 . Нужно написать программу, которая выводит на экран сумму цифр этого числа, меньших 7. Если в числе нет цифр, меньших 7, требуется на экран вывести 0. Программист написал программу неправильно. Ниже эта программа для Вашего удобства приведена на пяти языках программирования.
Бейсик
Python
INPUT N
WHILE N > 0
DIGIT = N MOD 10
END IF
WEND
Паскаль
Алгоритмический язык
begin
readln(N);
while N > 0 do
begin
digit := N mod 10;
N := N div 10;
end;
writeln(digit)
нач
цел N, digit, sum
ввод N
нц пока N > 0
все
кц
вывод digit
Си
int main()
int N, digit, sum;
while (N > 0)
if (digit < 7)
Последовательно выполните следующее.
1. Напишите, что выведет эта программа при вводе числа 456.
2. Приведите пример такого трёхзначного числа, при вводе которого программа выдаёт верный ответ.
3. Найдите все ошибки в этой программе (их может быть одна или несколько). Известно, что каждая ошибка затрагивает только одну строку и может быть исправлена без изменения других строк. Для каждой ошибки:
1) выпишите строку, в которой сделана ошибка;
2) укажите, как исправить ошибку, т.е. приведите правильный вариант строки.
Достаточно указать ошибки и способ их исправления для одного языка программирования. Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, использующую другой алгоритм решения. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.
Решение использует запись программы на Паскале. Допускается использование программы на любом из четырёх других языков.
1. Программа выведет число 4.
2. Пример числа, при вводе которого программа выдаёт верный ответ: 835.
Программа работает неправильно из-за неверной выводимой на экран переменной и неверного увеличения суммы. Соответственно, программа будет работать верно, если в числе старшая цифра (крайняя левая) равна сумме цифр, меньших 7.
3. В программе есть две ошибки.
Первая ошибка. Неверное увеличение суммы.
Строка с ошибкой:
sum := sum + digit;
Вторая ошибка. Неверный вывод ответа на экран.
Строка с ошибкой:
Для заданного положительного вещественного числа A необходимо найти максимальное целое число K, при котором выполняется неравенство
(при K = 0 сумма считается равной 0).
Для решения этой задачи ученик написал такую программу.
Бейсик
Python
DIM K AS INTEGER
INPUT A
WHILE S < A
WEND
PRINT K
Алгоритмический язык
Паскаль
нач
вещ a, s
цел k
ввод a
нц пока s
кц
вывод k
k: integer;
begin
read(a);
end;
write(k);
Си
int main()
double a, s;
int k;
return 0;
Последовательно выполните следующее.
1. Напишите, что выведет эта программа при вводе числа 1.2.
2. Приведите пример числа, при вводе которого программа даст верный ответ.
3. Найдите в программе все ошибки (их может быть одна или несколько).
Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде.
Обратите внимание: вам нужно исправить приведённую программу, а не написать свою. Вы можете только исправлять ошибочные строки; удалять строки или добавлять новые строки нельзя. Постарайтесь также не внести новые ошибки – за это оценка снижается.
Решение использует запись программы на Паскале. Допускается использование программы на других языках.
1. При вводе числа 1.2 программа выведет число 2.
2. Примеры чисел, при вводе которых программа выводит верный ответ: 1.6, 2.05.
Программа содержит две ошибки, одна из которых приводит к увеличению ответа, другая – к уменьшению.
В некоторых случаях эти ошибки компенсируют друг друга, и ответ оказывается правильным. Это происходит, если значение A попадает в один из следующих диапазонов: 1.5 < A < 1.83, 2 < A < 2.08.
3. Программа содержит две ошибки.
1) Неверная инициализация. Начальное значение S должно быть равно нулю.
В приведённом варианте вычисленная сумма оказывается на 1 больше правильного значения.
Строка с ошибкой:
2) Неверное определение ответа. Приведённая программа находит не максимальное K, при котором выполняется неравенство, а минимальное, при котором оно не выполняется, то есть увеличивает верное значение на 1.
Кроме того, использованный порядок действий в цикле (увеличение K после увеличения S) приводит к увеличению ещё на 1. Это можно было бы исправить, изменив порядок действий в цикле и уменьшив K после завершения цикла, но эти действия не разрешены по условию задачи.
Поэтому для исправления ошибки можно просто скорректировать значение при выводе.
Каждый программист знает, что программу надо не только написать, иначе говоря - "заставить работать", а еще и отладить, т.е. заставить ее работать правильно . Для того, чтобы делать это быстро и эффективно, желательно научиться пользоваться встроенными в IDE средствами отладки программ.
Интегрированная интерактивная среда разработки программ Borland Pascal (IDE) включает в себя ряд средств, облегчающих разработку программ: автоматическое управление проектами, средств обеспечения модульной структуры программы, быструю компиляцию и простые в использовании оверлеи. Но, несмотря на все это, Ваша программа все равно может содержать ошибки, что не позволит ей корректно работать.
IDE для DOS Borland Pascal предоставляет вам инструментальные средства для отладки программ, то есть поиска и исправления ошибок. В этой статье описываются инструментальные средства и процедуры отладки программы в интегрированной среде Борланд Паскаль (большинство описанных возможностей применимо также к IDE FreePascal-я).
Отладка - это процесс поиска и исправления ошибок в программе, препятствующих корректной работе программы. Перед тем как углубиться в специфические средства IDE, которые помогают при отладке, дадим краткое описание видов ошибок, которые Вы можете наблюдать, и различного рода операций, которые будут использоваться для их поиска.
-
Ошибки этапа компиляции
Наиболее общей причиной ошибок этапа компиляции являются ошибки набора (опечатки), пропущенные точки с запятой, ссылки на неописанные переменные, передача неверного числа (или типа) параметров процедуры или функции и присваивание переменной значения неверного типа.
Ошибки этапа выполнения или семантические ошибки происходят, когда вы запускаете успешно откомпилированную программу, которая при выполнении делает что-то недопустимое. То есть, программа содержит допустимые операторы Паскаля, но при выполнении этих операторов что-то происходит неверно. Например, программа может пытаться открыть для ввода несуществующий файл или выполнить деление на ноль.
Логические ошибки - это ошибки проектирования и реализации программы. То есть, операторы, используемые в программе, допустимы, и что-то делают, но не то, что Вы предполагали. Эти ошибки часто трудно отследить, поскольку IDE не может найти их автоматически, как синтаксические и семантические ошибки. К счастью, IDE включает в себя также и средства отладки, помогающие вам найти логические ошибки.
Как пользоваться random?
если массив целочисленный
Как быстро научится пользоваться паскалем
Всем доброго времени суток! Подскажите пажалуйста как быстро выучить паскаль есле вообще.
Как пользоваться отладчиком?
Дайте ссылку на хороший материал или литературу
Как пользоваться отладчиком?
Вот код. В книжке написано: "поставьте точку останова Отладчика на оператор j=i и в цикле работы.
Основной смысл использования встроенного отладчика состоит в управляемом выполнении. Отслеживая выполнение каждой инструкции, Вы можете легко определить, какая часть Вашей программы вызывает проблемы. В отладчике предусмотрено пять основных механизмов управления выполнением программы, которые позволяют вам:
Само по себе выполнение программы по шагам может быть недостаточно полезным, разве что поможет найти то место, где что-то происходит совершенно неверно. Но управляемое выполнение дает Вам возможность проверять состояние программы и ее данных, например, отслеживать вывод программы и ее переменные.
Что такое шаг?
Когда Вы отлаживаете программу, наименьшим выполняемым элементом является строка. Это означает, что Вы можете управлять отладкой до уровня отдельной строки исходного кода программы. Поэтому, если на одной строке программы содержится несколько операторов Паскаля, эти операторы не могут быть отлажены индивидуально. С другой стороны, с целью отладки оператор можно разбить на несколько строк, каждая из которых будет выполняться за один шаг.
Все выполнение в отладчике, включая выполнение по шагам, трассировку и останов, основывается на строках. Подсвечивая строку, встроенный отладчик всегда сообщает Вам, какую строку он выполнит на следующем шаге (строка выполнения). Строка выполнения выводится цветом, отличным от нормального цвета. Благодаря этому Вы можете легко видеть, где находитесь.
Выполнение по шагам - это простейший способ выполнения программы по элементарным фрагментам. Выбор команды Run -> Step Over или нажатие клавиши F8 вызывает выполнение отладчиком всего кода в операторе, указанном строкой выполнения, включая любые вызываемые на ней процедуры или функции, пока управление не вернется обратно к вам. После этого строка выполнения указывает следующий выполняемый оператор.
Возьмем, например, следующую программу:
Если в окне редактирования Вы наберете этот текст и нажмете клавишу F8, то строка выполнения перемещается на оператор begin в начале основного цикла, поскольку это первое, что выполняется в программе. Второе нажатие клавиши F8 выполняет begin и перемещает строку выполнения вниз до оператора for на следующей строке. После этого нажатие F8 вызывает выполнение всего цикла for; на экран пользователя выводятся числа от -1 до -10, а строка выполнения перемещается к end.
Хотя функция Negate и вызывается 10 раз, строка выполнения никогда на нее не перемещается. Выполнение по шагам позволяет отладчику не показывать детали любых вызовов для отдельной строки. Выполнение по шагам вызывает выполнение всего цикла for сразу, поэтому Вы не сможете видеть изменения в ходе выполнения цикла. Если же Вы хотите видеть подробности выполнения цикла, внесите в пример следующее простое изменение:
Поскольку оператор Паскаля может занимать несколько строк, такая программа будет в точности эквивалентна предыдущей версии, и генерируемый код будет идентичен. Но поскольку оператор WriteLn теперь находится на отдельной строке, отладчик может интерпретировать его отдельно. Если теперь Вы будете нажимать клавишу F8, то увидите, что строка выполнения будет при выполнении цикла 10 раз возвращаться на WriteLn.
Трассировка программы во многом аналогична ее выполнению по шагам. Единственное исключение состоит в том, что когда встречается оператор вызова процедуры/функции, при трассировке эти процедуры и функции также выполняются по шагам, а при простом выполнении по шагам управление возвращается вам после завершения выполнения подпрограммы.
Например, чтобы выполнить трассировку кода в вышеприведенном примере, загрузите файл, затем выберите команду Run -> Trace Into или нажмите клавишу F7. Когда Вы в первый раз делаете это, управление перемещается на оператор begin основной программы. Повторное нажатие F7 снова перемещает строку управления на оператор for. После этого нажатие клавиши F7 трассирует вызов функции Negate - строка выполнения перемещается на оператор begin в блоке функции. Если Вы продолжаете нажимать F7, строка выполнения перемещается по функции, а затем, когда Вы дойдете до оператора end, возвращается к оператору вызова.
Формат программы влияет на поведение строки выполнения при трассировке, хотя и не в такой степени как при пошаговом выполнении. Если код сформатирован как в первоначальном варианте приведенного выше примера, то трассировка оператора for приводит к выполнению 10 раз функции Negate. Если вы разобьете оператор for на две строки, то трассировка оператора end функции возвращает строку выполнения: ту строку основной программы, которая будет выполняться следующей. Первые девять раз это снова будет вызов функции. В десятый раз строка выполнения перемещается на оператор end программы.
Трассировка или выполнение по шагам?
Пошаговое выполнение и трассировка выполняют одно и то же действие, кроме того случая, когда строка выполнения находится на строке вызова процедуры/функции, или когда выполняется оператор begin в начале программы или модуля, который использует другие модули.
Выполнение begin в блоке begin..end основной программы вызывает код инициализации для любого используемого в программе модуля в том порядке, который указывается в операторе uses программы. Аналогично, выполнение оператора begin в начале секции инициализации вызывает код инициализации для любых модулей, используемых в данном модуле. Выполнение по шагам и трассировка работает в этих случаях как и следовало ожидать - пошаговое выполнение begin выполняет всю инициализацию, возвращая управление на следующий оператор только после того, как все будет завершено; при трассировке выполняется трассировка кода инициализации.
Пошаговое выполнение и трассировка методов объектов
Если в программе используются объекты, отладчик ведет себя аналогично своему поведению в случае обычных процедур/функций. Пошаговое выполнение метода интерпретирует метод как один шаг, возвращая управление к отладчику после того как метод завершает выполнение. Трассировка метода загружает и выводит на экран код метода и трассирует его операторы.
Иногда, конечно, нежелательно выполнять по шагам всю программу только для того, чтобы добраться до того места, где возникает проблема. Отладчик дает Вам возможность выполнять сразу большой фрагмент программы до той точки, где вы хотите начать выполнение по шагам.
Чтобы задать в программе точку, до которой она должна выполняться, а затем остановиться, используйте команду Run -> GoTo Cursor или клавишу F4. (Этим вы сообщите отладчику, что не хотите выполнять программу по шагам, пока не достигнете заданной точки.) Установите курсор на той строке, где вы хотите возобновить управление отладкой, затем нажмите клавишу F4. Заметим, что Вы можете сделать это как в начале сеанса отладки, так и когда уже выполните часть программы по шагам или протрассируете.
Внимание: С использованием этой команды связана одна особенность: если Вы хотите, чтобы программа выполнилась до определенной строки, и устанавливаете курсор внутри модуля (Unit), то этого не произойдет, Вы просто получите ошибку Cannot Run a Unit, и этим все закончится, т.к. IDE понимает это действие, как приказ запустить модуль, чего делать нельзя. Требуется объяснить IDE, чего Вы от нее хотите примерно так: "Запусти основную программу, и только потом выполни все, до текущего положения курсора". Для этого надо зайти в меню Compile -> Primary File, указать системе основной файл (НЕ модуль) Вашего приложения, и только после этого установить курсор внутрь модуля, и нажать F4.
Казалось бы, что поменялось? А вот что: теперь IDE точно знает - основным файлом приложения является тот, который был установлен, как Primary File, следовательно, совершенно нет необходимости запускать модуль, достаточно запустить основной файл, и остановиться тогда, когда выполнение дойдет до нужной строки в модуле.
Если ваша предыдущая программа hello.pas закрыта, то откройте её, нажав клавишу F3 (File | Open). Напоминаю, что все наши программы мы сохраняем в папке «C:\FPC\3.0.0\work».
Чтобы не затереть файл hello.pas нашими модификациями, сохраним открытый файл hello.pas под другим именем. Откройте меню «File» (Alt + F) и нажмите «Save as. ». В поле «Name» напечатайте helloClr.pas ( Clr — сокр. от «clear» — очищать) и нажмите «OK», чтобы сохранить программу под новым именем. После этого модифицируйте текст программы так, чтобы он соответствовал нижеприведенному варианту:
Запустите программу, нажав Ctrl + F9.
Идентификатор — это имя. Компилятор не понимает, что такое ClrScr . Вспомним, в прошлый раз подобная ошибка у нас была, когда мы пропустили букву « e» в слове Writeln . Компилятор не знал, что такое Writln и из-за этого ругался. Может быть, мы допустили ошибку в названии процедуры (команды) ClrScr ? Смотрим внимательно. Нет ошибок? И тем не менее компилятор не понимает, что такое ClrScr .
Да, так и есть. Компилятор не знает, что такое ClrScr .
Но почему тогда он знает Writeln и не знает ClrScr ? Дело в том, что процедура (команда) Writeln относится к базовым процедурам Паскаля, а вот алгоритм работы процедуры ClrScr описан отдельно. Отдельно — означает в отдельном модуле (файле). И для того, чтобы компилятор Free Pascal знал, как работает эта процедура, вы должны указать в своей программе, что используете модуль Crt . Так называется модуль, в котором описан алгоритм процедуры ClrScr . Или как еще говорят: реализована процедура ClrScr .
Добавим к нашей программе недостающую строку « uses Crt; »:
Uses — по-английски означает «использует». Модуль Crt — тот самый модуль, в котором реализована процедура ClrScr .
Теперь мы можем запустить нашу программу (Ctrl + F9):
Что ж, на этот раз наша программа запустилась, и даже очистился экран, вот только вместо « Привет! » мы видим на экране какую-то белиберду. Т. е. Free Pascal не отображает русские буквы (кириллицу), если подключен модуль Crt и используется процедура ClrScr (эксперимент показывает, что даже если удалить строку с вызовом процедуры ClrScr , проблема с отображением кириллицы все равно остается).
Открываем браузер, и в поисковой строке гугла вбиваем «free pascal clrscr не отображает русские буквы»:
Первая же ссылка приводит нас на форум, где мы находим решение:
Открываем пункт «Свойства» и переходим на закладку «Шрифт».
Возвращаем «Точечные шрифты», размер выставляем «10 x 18». Нажимаем «ОК».
И снова запускаем Free Pascal:
Как видите, вид окна поменялся.
Запускаем нашу программу (Ctrl + F9), нажимаем Alt + F5, чтобы переключиться в окно результатов работы программы, и видим результат:
Краткое содержание урока
✔ Мы узнали как правильно закрывать Free Pascal (раньше вы, скорее всего, просто нажимали на крестик в правом верхнем углу окна):
✔ Дополнили нашу программу «Привет!» очисткой экрана:
✔ Узнали новое ключевое слово языка Паскаль:
- uses — ключевое слово, после которого перечисляются все модули, используемые нами в программе.
✔ Познакомились с еще одной процедурой:
✔ Узнали о существовании модуля Crt .
✔ И наконец, мы впервые столкнулись с проблемой на уровне инструмента (Free Pascal): когда после подключения модуля Crt у нас перестали отображаться русские буквы (кириллица) в окне результатов. Мы не разобрались, почему это происходит, т. к. причины скрыты внутри модуля Crt . Можно ли выяснить причины, по которым у нас возникла проблема с кириллицей? Чисто теоретически, да. Но для этого нам бы понадобились знания, которые выходят за рамки наших уроков. Поэтому мы воспользовались обходным решением (workaround) — поменяли используемый в программе шрифт Lucida Console на точечный шрифт.
И вот здесь я хочу остановиться подробнее
Приведу аналогию. Представьте себе, что вы — работник дорожной службы, которому поручили на такой-то улице нарисовать «зебру» и поставить соответствующие знаки пешеходного перехода. Вы приехали на заданную улицу и обнаружили, что в том месте, где вам надо рисовать «зебру», из-под асфальта бьет фонтан воды, и образовалась лужа. Какие у вас есть варианты действий:
- Выяснить откуда вода (скорее всего, прорвало трубу), устранить течь, высушить лужу и уже после этого рисовать «зебру».
- Нарисовать «зебру» 50 метрами ниже (или выше) — там, где нет воды, и где дорожные условия позволяют это сделать.
Так вот, второй вариант — это и есть обходное решение (workaround). Оно может иметь серьезные недостатки. Например, школа находится именно там, где и надо было изначально рисовать «зебру», и если вы нарисуете её ниже (выше), то далеко не все школьники дойдут до этой зебры, а значит, на изначальном участке дороги будет повышенная аварийность из-за школьников, перебегающих дорогу в неположенном месте.
А что нужно, чтобы пойти по пути первого варианта? Другие компетенции. Если вы не владеете нужными навыками (и инструментами) — у вас нет экскаватора, чтобы добраться до трубопровода, сварочного аппарата и т. д. — то вам нужно ждать, когда другие люди решат возникшую проблему, прежде чем вы сможете нарисовать «зебру» именно там, где вам надо. В нашем примере это означает, что вы должны написать письмо разработчикам Free Pascal, описать возникшую проблему (некорректное отображение кириллицы после подключения модуля Crt ), и ждать, когда разработчики устранят эту ошибку в модуле Crt. На всё это может уйти неопределенное время. Или разработчикам Free Pascal будет вообще не до этой проблемы, и ваша «лужа» так никуда и не денется.
Другой сценарий: обладая нужными навыками, устранить самому эту проблему в модуле Crt. А для этого нужно знать, что такое дизассемблирование, обратная разработка (reverse engineering) и т. д.
Идеальный вариант — это, конечно, когда лужу устраняют те, кто за нее отвечают. Т. е. разработчики Free Pascal. Но мы живем не в идеальном мире, и поэтому нам иногда приходится использовать обходные решения.
И последнее: когда ваши программы перестанут вмещаться на одну страницу экрана, и будут занимать сотни, а то и больше, страниц, у вас могут тоже возникать подобные ситуации. Когда что-то идет не так и нужно найти причины проблемы, а потом её решение. И вот тут может возникнуть соблазн «передвинуть «зебру» на 50 метров выше или ниже» (использовать обходное решение) вместо того, чтобы разбираться, почему возникла проблема и как её устранить. В случае, когда речь идет о вашей зоне ответственности, такой подход, в целом, недопустим (!). Вы должны всегда понимать, что и почему происходит в вашей программе. Если оказывается, что программа ведет себя не так, как вы это задумывали, надо разбираться, почему она себя так ведет (откуда лужа?), а не цепляться за первое попавшееся решение, которое вроде бы «решает» вашу проблему.
Задания
- Что будет выведено на экране после запуска следующей программы?
- Исправьте все ошибки в следующей программе, и запустите исправленный вариант:
«illegal character» переводится как «некорректный символ».
Задания повышенной сложности
- Напишите программу, которая выведет на чистый экран текст программы hello.pas (см. урок 1).
1) чтобы вывести на экран пустую строку, используйте команду « Writeln; » (без скобок и одинарных кавычек);
2) для отступов используйте по 3 пробела;
3) чтобы вывести одинарные кавычки на экран, используйте по 2 одинарных кавычки, например: « Writeln( '''Привет''' ); » напечатает на экране не просто Привет , а 'Привет' .
Непонятно почему в скобках по 3 кавычки? Смотрите: самая левая и самая правая одинарные кавычки обрамляют тот текст, который мы хотим вывести на экран, например:
Writeln( 'Кафе Огонёк' );
Обнаружив грамматическую ошибку, Паскаль выдает золотыми буквами на красном фоне краткое описание ошибки и ставит курсор в то место программы, где, по его мнению, она находится.
Вероятная причина ошибки
Unexpected end of file
Неожиданный конец файла
Вы забыли поставить точку после последнего END. Или не совпадает количествоbeginи количествоend
Ждал точку с запятой
Вы забыли поставить точку с запятой после предыдущего оператора
Вы указали слишком мало параметров в обращении к подпрограмме
Вы указали слишком много параметров в обращении к подпрограмме
Вы забыли описать это имя в разделе описаний
Неправильно записали стандартное имя, например, ReedLnвместоReadLn
В вашей программе встречаются примерно такие «сладкие парочки»: VAR c:String; … c:=1+2илиVAR h:Integer; … h:=9/7
Одно и то же имя описано два раза. Например, VAR a, c, a :String;
Паскаль затрудняется назвать причину ошибки. Часто причина в том, что вы забыли взять строковую константу в кавычки
Возможно, не совпадает количество beginи количествоend
Возможно, не совпадает количество beginи количествоend
String constant exeeds line
Строковая константа превышает допустимую длину
Вы забыли закрыть кавычки в строковой константе
Строчка слишком длинна
Слишком длинная строчка в программе (не путать со строковой константой, которую нужно брать в кавычки). Не рекомендую залезать программным текстом за правый край экрана
На вашем диске не осталось места. Надо что-то стереть
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
Ошибка проверки диапазона
Переменная в процессе выполнения программы вышла за пределы допустимого диапазона, как например, в 1.9
Constant out of range
Константа не в диапазоне
Величина константы в программе превосходит допустимый диапазон
Invalid numeric format
Неправильный числовой формат
Если, например, вы по оператору ReadLn(k)в программеVAR k:Integer; …. ReadLn(k) … пытаетесь ввести число 25.3
Более подробное описание некоторых ошибок вы найдете в 0.3.
expected ждал
identifier имя
invalid неправильный
operation операция
error ошибка
variable переменная
Читайте также: