Читайте также:
|
|
Система программирования Turbo Delphi предоставляет возможность разработки и отладки различных программных продуктов, в том числе приложений, в консольном режиме или с использованием графического интерфейса пользователя.
Консольный режим используется, когда основными требованиями к программе являются, сокращение времени счёта и расхода оперативной памяти. На подготовку таких программ требуется меньше времени, поэтому консольный режим удобно использовать для быстрой проверки и отладки отдельных алгоритмов.
Для создания программы, работающей в консольном режиме, следует после запуска Turbo Delphi ввести команду File/New/Other/ Console Application.
В верхней строке расположено главное меню (File, Edit, Search, View, Project, Run, Component, Database, Tools, Window, Help), которое служит для ввода команд при работе с приложением. Под главным меню расположена панель инструментов в виде быстрых кнопок, дублирующих наиболее часто используемые команды главного меню.
Интерфейс пользователя представляется в виде текстового окна, называемого окном программы, в котором последовательно, строка за строкой отображаются данные, вводимые пользователем с клавиатуры, и данные, выводимые программой. Позицию начала ввода или вывода в окне программы указывает курсор - мигающий символ. По умолчанию длина строки равна 80, а количество строк – 50.
При вводе пользователь имеет возможность редактировать вводимые данные, используя клавиши с печатными символами и клавиши:
- BackSpace (удаление последнего введённого символа),
- Delete (удаление символа справа от курсора),
- Insert (переключения режимов вставки и замены),
- стрелки влево, вправо (перемещают курсор в предыдущую или в следующую позицию соответственно).
Ввод завершается нажатием клавиши Enter, при этом курсор перемещается в начало новой строки. Максимальная длина вводимой последовательности символов равна 254.
Вывод данных из программы выполняется в виде текста, символ за символом при автоматическом перемещении курсора в очередную позицию строки, а при достижении её конца – в начало новой строки.
В окне редактирования программы представляется стандартный шаблон консольной программы. Это работающая программа, которая при запуске отображает окно программы и сразу же прекращает работу, закрывая окно. Запуск программы в среде Turbo Delphi выполняется командой Run/Run, или щелчком на кнопке панели инструментов, или нажатием клавиши F9. Чтобы задержать окно программы до нажатия клавиши Enter, следует вставить в шаблон программы оператор ReadLn перед end. Закрыть окно и завершить работу программы можно и любым другим способом закрытия окна Windows.
Элементами шаблона программы являются
- заголовок программы (program Project # N;),
- директива {$APPTYPE CONSOLE},
- подключение модулей (uses SysUtils;),
- пустой раздел операторов, состоящий из операторных скобок begin и end,
- символ. (точка), указывающий компилятору, что текст программы закончен.
Внутри раздела операторов находится комментарий – поясняющий текст, предлагающий разместить в этом месте операторы, реализующие алгоритм программы. Комментарии, в отличие от операторов, не порождают команд процессора при обработке компилятором. Компилятор их просто пропускает. Назначение же комментариев состоит в том, чтобы облегчить понимание алгоритма программы. Оформить текст в виде комментария можно одним из следующих способов:
- поместить символ // перед текстом строки (однострочный комментарий),
- заключить текст, который может занимать несколько строк, в фигурные скобки { и },
- заключить текст, который может занимать несколько строк, в скобки вида (* и *).
Заголовок программы содержит её имя. Turbo Delphi даёт программе стандартное имя Project1, Project2 и так далее в порядке создания очередной программы командой File/New.... Это имя можно заменить на другое при сохранении текста программы командой File/Save All..., когда Turbo Delphi предложит сохранить программу в файле с расширением.dpr. Одновременно Turbo Delphi создаст и сохранит ещё файл с тем же именем и расширением.cfg и файл с расширением.drf. Вместе эти три файла образуют проект и для их сохранения желательно создать отдельную папку. В этой же папке будет размещена и созданная исполняемая программа, имеющая расширение.exe.
Директива {$APPTYPE CONSOLE} указывает компилятору, что он должен создать консольное приложение.
Предложение uses SysUtils; предписывает компилятору подключить к программе стандартный модуль с именем SysUtils, входящий в систему программирования Turbo Delphi. Этот модуль подключает другие стандартные модули, и всё, что объявлено в них, становится доступным в разрабатываемой программе. Подключение модулей необходимо для создания консольного приложения и использования в нём некоторых стандартных типов данных, стандартных функций и стандартных подпрограмм.
Например, тип Integer - для объявления переменных целого типа, тип Real - для объявления переменных действительного (вещественного) типа. Стандартные подпрограммы содержат стандартные процедуры (например, Write – для вывода данных в окно программы, Read – для ввода данных с клавиатуры) и стандартные функции (например, Sin – для вычисления синуса, Sqrt – для вычисления квадратного корня). Дополнительный набор стандартных подпрограмм (процедур и функций) содержит стандартный модуль с именем Math, который следует подключить к программе, добавив в предложение использования: uses SysUtils, Math;. Кроме стандартных модулей в этом предложении подключаются модули пользователей.
Объявления (описания)констант, типов, переменных и подпрограмм, сделанные в подключенных к программе модулях, считаются сделанными до аналогичных объявлений в программе, что соответствует правилу языка Pascal (в программе можно использовать только ранее объявленные имена).
Объявления и следующий за ними раздел операторов называют блоком. Используя этот термин, структуру консольной программы можно определить как последовательность, включающую заголовок программы, директиву {$APPTYPE CONSOLE}, предложения использования модулей, блок и точку. Кроме того, в тексте программы можно размещать директивы, управляющие работой компилятора.
Рассмотрим следующий пример программы.
program Project1;
{$APPTYPE CONSOLE}
uses SysUtils;
{ОБЪЯВЛЕНИЕ ФУНКЦИИ}// для использования кириллицы
function Rus(S:String):String;
var i:byte;
begin
Result:='';
for i:=1 to Length(S) do
case S[i] of
'А'..'п': Result:=Result+Chr(Ord(S[i])-64);
'р'..'я': Result:=Result+Chr(Ord(S[i])-16);
'Ё': Result:=Result+Chr(240);
'ё': Result:=Result+Chr(241);
else
Result:=Result+S[i];
end;
end;
const // РАЗДЕЛ ОБЪЯВЛЕНИЯ КОНСТАНТ
g=9.8; //именованная константа, представляющая ускорение
var //РАЗДЕЛ ОБЪЯВЛЕНИЯ ПЕРЕМЕННЫХ
S: Integer;// переменная целого типа, длина пути
T: Real;//переменная вещественного типа, время падения
{РАЗДЕЛ ОПЕРАТОРОВ}
begin
// пояснение о назначении программы
WriteLn(Rus('Программа вычисляет время, за которое тело')
,Rus(' в свободном падении пройдёт заданный путь.'));
// приглашение к вводу значения переменной S
Write(Rus('Введите длину пути в метрах:'));
//Ввод значения переменной S
ReadLn(S);
T:=Sqrt(S*2/g); //Вычисление времени падения тела
//Вывод результата с пояснениями
WriteLn(Rus('Путь будет пройден за',T:5:2,'секунд'));
//Задержка закрытия окна программы до нажатия клавиши Enter
ReadLn;
end.
Программа вычисляет время свободного падения тела с ускорением 9,8 м/с2 на пути заданной длины, вводимой с клавиатуры. Результат выводится с поясняющим текстом.
В блоке программы используется раздел объявления именованных констант (константа g), раздел объявления переменных (переменные T и S) и объявление функции Rus. Функция Rus выполняет изменение кодов символов для правильного отображения букв русского алфавита в окне редактирования программы.
Перекодирование символов кириллицы для вывода можно выполнить и с помощью стандартных средств Turbo Delphi.
Протокол ввода-вывода программы имеет вид:
Программа вычисляет время, за которое тело в свободном падении пройдет заданный
путь.
Введите длину пути в метрах: 15
Путь будет пройден за 1.74 секунд
Исполняемая программа может быть создана, только после устранения синтаксических ошибок (ошибки, связанные с нарушением правил записи операторов языка программирования, которые обнаруживает компилятор) и подключения необходимых модулей. При обнаружении таких ошибок Turbo Delphi выдаёт сообщения с кратким пояснением причины ошибки в специальном окне, появляющемся под окном редактирования программы. Ошибки следует исправить и вновь выполнить команду Run/Run.
Устранением указанных ошибок разработка программы не заканчивается. Это только начало этапа разработки программы, называемого отладкой. Суть отладки состоит в приведении программы к полному соответствию заданию на её разработку. Программа должна отвечать свойству массовости (на любых допустимых входных данных и их последовательностях давать требуемый результат).
На этапе отладки должны быть выявлены и устранены ошибки в алгоритме и другие ошибки, которые могут проявиться только во время работы программы. Для их обнаружения обычно используют при отладке вывод промежуточных результатов вычислений, проверку конечных результатов (если они не очевидны) другими методами и другие приёмы.
Сократить время отладки позволяет использование начальных значений переменных, что особенно заметно при необходимости ввода большого числа исходных данных, например, в программах обработки массивов. При этом на время отладки программы её части, обеспечивающие ввод данных, превращают в комментарии. В представленной ранее программе выполнить это можно так:
var
S: Integer=15;// переменная целого типа, длина пути
T: Real;//переменная вещественного типа, время падения
{РАЗДЕЛ ОПЕРАТОРОВ}
begin
//пояснение о назначении программы
WriteLn(Rus('Программа вычисляет время, за которое тело')
,Rus(' в свободном падении пройдёт заданный путь.'));
(*
//приглашение к вводу значения переменной S
Write(Rus('Введите длину пути в метрах: '));
//Ввод значения переменной S
ReadLn(S);
//*)
После завершения отладки ввод данных восстанавливается удалением скобок (* *) комментария. Использование начальных значений переменных облегчает подготовку исходных данных для тестирования программы (если требуется изменять лишь часть данных), позволяет представить данные в удобном для восприятия виде (например, в виде матрицы), быстро изменить данные (так как после перезагрузки программы сразу становится активным окно редактирования программы). Рассмотренный приём ускорения отладки программы предлагается использовать при выполнении заданий.
Среда Turbo Delphi также предоставляет средства отладки. Они позволяют остановить выполнение программы на любой строке её исходного текста и просмотреть текущие значения переменных и выражений, установить или отменить точки останова и продолжить работу программы. Часто используемые средства отладки:
- Трассировка с заходом в подпрограммы (Команда Run/Step Into или быстрая клавиша F7). Ввод одной команды приводит к выполнению операторов одной строки программы и останов до ввода очередной команды продолжения работы программы. Если в строке есть вызов подпрограммы, то следующие такие команды будут выполнять операторы строк подпрограммы. В исходном тексте очередная строка, подлежащей исполнению, будет выделена и отмечена значком стрелки, например,
- Трассировка без захода в подпрограммы (Команда Run/Step Over или быстрая клавиша F8). То же, что и Run/Step Into, но строка с вызовами подпрограмм выполняется за один шаг трассировки.
- Выполнить до курсора (Команда Run/ Run to Cursor или быстрая клавиша F4). Выполнение программы до строки её текста, в которой расположен курсор ввода.
- Точка безусловного останова. Устанавливается щелчком в полосе перед строкой операторов на значке . В результате значок и строка будут выделены. Например, . Удаляется повторным щелчком на значке. При работе программы её останов будет перед выполнением операторов строк, отмеченных как точки безусловного останова.
- Перезагрузка программы (Команда Run/ Program Reset или быстрая клавиши Ctrl+F2). Выполняет выход из режима отладки и готовит программу к новому запуску.
- Окно наблюдения (Команда Run/Add Watch.... или быстрая клавиши Ctrl+F5). При вводе команды открывается окно диалога, в котором можно указать, значения какой переменной или выражения должно отображаться в окне наблюдения в момент ожидания системой ввода очередной команды продолжения выполнения программы. Выражения могут содержать переменные и именованные константы программы, обычные константы, обращения к некоторым стандартным функциям. Допускаются любые выражения, не обязательно те, что есть в программе. Окно наблюдения можно буксировкой разместить в окне редактирования программы или вне его. Значения переменных и выражений можно также просматривать, подводя к ним в окне редактирования программы курсор мыши.
Ниже представлен пример окна редактирования программы, вычисляющей выражение
Sqrt(S*2/g).
. В нижней части окна редактирования расположено окно наблюдения.
Программа после запуска остановлена перед выполнением оператора WriteLn (эта строка объявлена точкой безусловного останова), и в окне наблюдения отображены значение именованной константы, текущие значения переменных и выражения. На вкладке с текстом программы виден курсор мыши, подведённый к переменной T, и под ним – значение этой переменной.
Среда Turbo Delphi предоставляет также программные средства выявления ошибок, связанных с ограничениями возможностей технических средств и особенностями выполнения некоторых операций. Такие ошибки могут приводить к неверным результатам или к аварийному завершению программы (генерации исключения и стандартной его обработке) без выдачи каких-либо сведений об их причине. В результате программа теряет информативность, оставляя пользователя в недоумении, что же произошло и как избежать подобных ситуаций.
Чтобы узнать причину исключения, следует выявить операторы, вызывающие исключение (например, выполняя трассировку программы), заключить их в блок try except, а между except и end вставить оператор on Exception do. В рассматриваемой программе исключение возникнет при вычислении значения переменной T, если ввести отрицательное значение переменной S. После добавления блока try except в программе вместо строки
T:=Sqrt(S*2/g)
появятся следующие строки:
try
T:=Sqrt(S*2/g)
except
on Exception do
end
При запуске программы из среды Delphi работа программы будет остановлена, строка программы с операторами, вызвавшими исключение, будет выделена, и появится сообщение вида
(окно с сообщением не появится, если запустить исполняемую программу из папки).
В сообщении текст, выделенный апострофами, поясняет причину возникновения исключения. После закрытия окна сообщения можно продолжить работу с программой в режиме отладки. Узнать текущие значения переменных и выражений (просмотром в окне наблюдения или подводя к ним курсор мыши), установить точки останова, использовать любую из команд выполнения программы (выполнить, выполнить до курсора, выполнить шаг трассировки и другие), подготовить программу к новому запуску (выполнить команду Run/ Program Reset).
В приведённом примере сообщения текст ‘Invalid floating point operation’ указывает на недопустимую операцию над вещественными данными. Причинами появления такого сообщения могут быть попытка вычислить функцию для аргумента, значение которого не принадлежит области её определения (как в приведённом примере программы – извлечение корня квадратного из отрицательного числа), попытка разделить 0 на 0 и другие. Соответствующий класс исключения - EInvalidOp. Для информативности пустой оператор on обработки исключения, то есть on Exception do, заменяется оператором, выводящим сообщение о причине ошибки и завершающим работу программы
try
T:=Sqrt(S*2/g)
except
on EInvalidOp do
begin
WriteLn(Rus('Вводимое значение должно быть >= 0'));
WriteLn(Rus('Для завершения работы программы')
,Rus(' нажмите клавишу Enter'));
ReadLn;
Halt
end
end;
Примером неправильного вычисления может служить сложение двух целых чисел 2000000000, как показано в следующей программе
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
I:Integer=2000000000;
begin
I:=I+I;
WriteLn(I);
ReadLn
end.
Результатом её работы будет вывод отрицательного числа –294967296. Объясняется это тем, что данные целого типа Integer обрабатываются на 32-разрядных регистрах, и все старшие двоичные цифры результата просо отбрасываются, а знак оставшейся части числа определяется двоичной цифрой в старшем разряде (0 – положительное число, 1 – отрицательное число).
Чтобы вызвать исключение при возникновении подобных ситуаций, следует ввести в программу директиву компилятора {$Q+}. Например, перед строкой с оператором I:=I+I.
Стандартная обработка такого исключения приведёт к выводу сообщения с текстом ‘Integer overflow’ – переполнение целого, и выделению соответствующей строки программы. После закрытия окна сообщения можно просмотреть значения переменных, но продолжение программы невозможно – она будет снята с выполнения. Для обеспечения информативности программы и возможности продолжения её работы наряду с директивой {$Q+} необходимо использовать блок try except обработки исключения.
Рассмотрим некоторые общие положения, связанные с исключениями и их обработкой. Исключения – это объекты классов исключения, которые создаются автоматически при наступлении соответствующего события и уничтожаются сразу после их обработки (примеры рассмотрены выше).
Единым предком всех классов исключений является класс Exception. Использование его имени в блоке try except позволяет обработать исключение любого из его наследников, а тип исключения, которое реально возникло, можно вывести, используя следующую конструкцию
try
<ОП>;
except
on E:Exception do
begin
.............
WriteLn('Возникло исключение ', E.Message
,' при выполнении оператора <ОП>');
.............
end
end
где ОП - оператор, вызвавший исключение, а E – имя переменной, используемое для вывода сообщения.
Аналогично, имя любого класса исключения может использоваться в блоке try except для обработки исключений его наследников.
Некоторые исключения, связанные с обработкой числовых данных. Классы EDivByZero, ERangeError и EIntOverflow, представляющие данные целых типов и имеющие общего родителя – класс EIntError, и классы EInvalidOp, EOverflow и EZeroDivide, представляющие вещественные данные и имеющие общего родителя – класс EMathError. Ниже даны пояснения к причинам появления исключений указанных классов.
- EDivByZero – деление данного целого типа (знак операции div) на выражение целого типа со значением 0.
- ERangeError – попытка присвоить переменной целого типа значение, выходящее за пределы диапазона её допустимых значений, или выход значения выражения, используемого в качестве индекса, за допустимые значения индекса. Исключение возникает только в том случае, если соответствующий участок программы скомпилирован с директивой «проверка диапазона» {$R+}. Конец участка отмечается директивой {$R-}. Таких участков может быть несколько. Размещение одной директивы {$R+} в начале программы обеспечит указанные проверки во всей программе.
- EIntOverflow – попытка вычислить значение выражения целого типа с использованием операций +, -, * и стандартных функций Abs, Sqr, Succ, Pred, Inc, Dec, выходящее за пределы диапазона от –2147483648 до 2147483647. Исключение возникает только в том случае, если соответствующий участок программы скомпилирован с директивой «проверка целочисленного переполнения» {$Q+}. Конец участка отмечается директивой {$Q-}. Таких участков может быть несколько. Размещение одной директивы {$Q+} в начале программы обеспечит указанные проверки во всей программе.
- EInvalidOp – пояснения были даны ранее.
- EOverflow – попытка присвоить переменной вещественного типа значение, большее допустимого для её типа или меньшего допустимого для её типа.
- EZeroDivide - попытка вычислить значение вещественного выражения, содержащее деление на 0 или очень маленькое число.
В случае возникновения исключения в блоке try except переменные программы будут возвращены в состояние, бывшее перед входом в этот блок, что позволяет в цикле, не завершая работу программы, предпринять повторные попытки выполнения операторов этого блока при задании новых значений переменным.
В общем случае блок может содержать несколько операторов on, а также допустимо вложение блоков один в другой. Например,
try //начало внешнего блока try except
......//проверяемые операторы внешнего блока try except
try //начало внутреннего блока try except
......//проверяемые операторы внутреннего блока try except
except
......//операторы вида «on <Имя исключения> do <Оператор>»
......//внутреннего блока try except
end; //конец внутреннего блока try except
except
......//операторы вида «on <Имя исключения> do <Оператор>»
......//внешнего блока try except
end; // конец внешнего блока try except
Если исключение, возникшее во внутреннем блоке, обработано в нём не будет, то оно может быть обработано в ближайшем охватывающем внешнем блоке. Если же в программе не предусмотрена обработка исключения, то исключение будет обработано стандартным способом.
Устранение всех видов ошибок приводит, как правило, к многократной корректировке текста программы, поэтому желательно настроить панель инструментов Turbo Delphi, добавив в неё кнопки типовых команд редакторов текста, показанных на рис. A. Делается это так. Вводится команда View/Toolbars/Customize...; в открывшемся окне Customize на вкладке Commands выбирается строка Edit; значки из списка Commands: буксируются на панель инструментов. Для удаления значка с панели инструментов нужно просто, находясь в этом режиме, отбуксировать его за её пределы.
Аналогично можно добавить кнопки, используемые при отладке, раскрыв список Run на вкладке Commands окна Customize. На рис A к расположенным по умолчанию кнопкам на панели инструментам добавлена кнопка перезагрузки программы (команда Run/Program Reset, быстрая клавиша Ctrl+F2).
Дата добавления: 2015-07-14; просмотров: 160 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Основна література | | | Элементы электрической цепи синусоидального тока |