Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методичка Программирование

.pdf
Скачиваний:
35
Добавлен:
13.03.2016
Размер:
3.61 Mб
Скачать

Создать новый

Открыть

Сохранить

Запуск

Окно редактирования

проект

проект

все

программы

 

 

 

 

программы

Трассировка с заходом в подпрограммы

Трассировка без захода в подпрограммы

Основной код программы

Рис. 2. Внешний вид Delphi 7 после создания консольного приложения

11

Для создания программы, работающей в консольном режиме, следует после запуска Delphi ввести команду File/New/Other... и выбрать вариант Console Application. При этом изменится набор окон, как показано на рис. 2 (окна Delphi при создании консольного приложения). В окне редактирования программы будет представлен стандартный шаблон консольной программы. Это работающая программа, которая при запуске только отображает окно и сразу же прекращает работу, закрывая его. Запуск программы в среде Delphi

выполняется командой Run/Run или щелчком на кнопке панели инструментов, или нажатием клавиши F9. Чтобы задержать окно программы до нажатия клавиши Enter, следует вставить в шаблон оператор ReadLn перед end. Впрочем, закрыть окно и завершить работу программы можно и любым другим способом, предусмотренным Windows.

Элементами шаблона программы являются:

заголовок;

директива {$APPTYPE CONSOLE};

предложение использования uses SysUtils;

пустой раздел операторов – пустой составной оператор2,

состоящий только из операторных скобок begin и end;

символ «точка» (.), указывающий компилятору, что текст программы закончен.

Внутри раздела операторов (между ключевыми словами3 begin и end) находится комментарий – текст, предлагающий разместить в этом месте операторы, реализующие алгоритм программы. Комментарии, в отличие от операторов, не порождают команд процессора при обработке компилятором, он их просто пропускает. Назначение комментариев состоит в том, чтобы облегчить понимание алгоритма программы. Оформить текст в виде комментария можно одним из следующих способов:

поместив два символа // перед текстом строки;

заключив текст, который может занимать несколько строк, в фигурные скобки{};

заключив текст, который может занимать несколько строк, в скобки вида (* и *).

Заголовок программы содержит ее имя. Delphi дает программе стандартное имя Projectl, или Project2, или Project3 и так далее в порядке создания очередной программы командой File/New... Заданное по умолчанию имя можно заменить на другое при сохранении текста программы командой File/Save All..., когда Delphi предложит сохранить ее в файле с расширением .dpr. Одновременно Delphi создаст и сохранит файлы с тем же именем и расширением .cfg и .drf. Вместе эти три файла образуют проект и для их

2Составным оператором называется конструкция, состоящая из операторных скобок begin и end, между которыми располагают выполняемые последовательно операторы.

3Ключевыми называют слова, используемые как обязательные элементы синтаксических конструкций языка программирования (begin, end, uses, type, var, if, for, do и др.), иное их использование запрещено. В тексте эти слова автоматически выделяются жирным шрифтом.

12

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

Директива {$APPTYPE CONSOLE} указывает компилятору, что он должен создать консольное приложение.

Предложение использования uses SysUtils; предписывает подключить к программе стандартный (входящий в систему программирования Delphi) модуль4 с именем SysUtils. Этот модуль, в свою очередь, содержит предложение использования, подключающее другие стандартные модули, и все, что объявлено в них, становится доступным в разрабатываемой программе. В частности, подключение модулей необходимо для создания консольного приложения и использования в нем некоторых стандартных типов данных5 (например, типа Integer для объявления переменных целого типа, типа Real для объявления переменных вещественного типа), стандартных подпрограмм6 – стандартных процедур (например, Write для вывода данных в окно программы или в файл, Read для чтения данных с клавиатуры или из файла) и стандартных функций (например, Sin для вычисления синуса, Sqrt для вычисления квадратного корня). Дополнительный набор стандартных подпрограмм (процедур и функций) содержит стандартный модуль с именем Math, который следует подключить к программе, добавив в предложение использования: uses SysUtils, Math;

Объявления именованных констант7, типов, переменных и подпрограмм, сделанные в подключенных к программе модулях, считают сделанными до аналогичных объявлений в программе, что соответствует правилу языка Object Pascal: в любом объявлении можно использовать только ранее объявленные имена.

4Модуль – это специальным образом оформленный набор именованных констант, типов, переменных, подпрограмм и директив, которые могут быть доступны в другом модуле или программе, если имя модуля включить в список предложения использования uses. Исходный текст модуля хранится в файле с расширением .pas, а откомпилированный модуль – в файле с расширением .dcu. Delphi позволяет создавать новые модули, автоматически или по запросу включая их в проект.

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

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

7Именованные константы объявляются в разделе, начинающемся со слова const. Например, <const Nmax=25;>. Имена таких констант представляют в программе соответствующие значения. Использование именованных констант облегчает понимание алгоритма программы и позволяет минимизировать ошибки при ее модернизации: если имя константы используется в разных частях программы, то достаточно изменить значение только в объявлении именованной константы.

13

Объявления и следующий за ними раздел операторов называют блоком. Используя этот термин, структуру консольной программы можно определить как последовательность, включающую заголовок программы, директиву {$APPTYPE CONSOLE}, предложение использования модулей, блок и точку. Кроме того, в тексте программы можно размещать директивы, управляющие работой компилятора.

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

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

Исполняемая программа может быть создана, только если подключены необходимые модули и устранены синтаксические ошибки (ошибки, связанные с нарушением в конструкциях программы правил языка программирования, которые обнаруживает компилятор). При обнаружении таких ошибок Delphi выдает сообщения с кратким пояснением причины в специальном окне, появляющемся под окном редактирования программы. Ошибки следует исправить и вновь выполнить команду Run/Run.

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

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

Сократить время отладки позволяет использование начальных значений переменных (значений, заданных при объявлении переменных, которые они имеют в момент старта программы), что особенно заметно при вводе большого числа исходных данных, например в программах обработки массивов. Использование начальных значений переменных облегчает также:

подготовку исходных данных для тестирования программы (если требуется изменять лишь их часть);

представление данных в удобном для восприятия виде (например, в виде матрицы) рядом с переменными;

быстрое изменение данных (так как после перезагрузки сразу становится активным окно редактирования программы).

14

На время отладки части программы, обеспечивающие ввод данных, превращают в комментарии, например, заключая между скобками ( (* и *) или { и } ). В представленной ранее программе выполнить это можно так:

var

S:Integer=15;//Переменная целого типа, //представляющая длину пути

Т:Real;//Переменная вещественного типа, //представляющая время

{РАЗДЕЛ ОПЕРАТОРОВ} begin

//Вывод пояснения о назначении программы WriteLn(Rus('Программа вычисляет время, ' +'за которое тело в свободном падении ' +'пройдёт заданный путь. ')) ;

{

//Вывод приглашения к вводу значения переменной S Write(Rus('Введите длину пути в метрах: ')); //Ввод значения переменной S

ReadLn(S); //

}

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

{$IFDEF <ИМЯ>}

.....//операторы, используемые при отладке

{$ENDIF}

ИЛИ

{$IFDEF <ИМЯ>} . . . . .//операторы, используемые при отладке

{$ELSE} .....//операторы, используемые в готовой программе

{$ENDIF}

Обе конструкции обрабатываются компилятором следующим образом. Если ранее в исходном тексте программы встретилась директива {$DEFINE <ИМЯ>}, объявляющая некоторое уникальное имя, то компилятор включает в исполняемую программу операторы, расположенные между директивами

{$IFDEF <ИМЯ>} и {$ENDIF} или {$IFDEF <ИМЯ>} и {$ELSE}. Если же директиву {$DEFINE <ИМЯ>} удалить либо превратить в комментарий, например так //{$DEFINE <ИМЯ>}, то компилятор включит в исполняемую

15

программу операторы, расположенные между директивами {$ELSE} и {$ENDIF}8. Если на время отладки в начале программы поместить директиву

{$DEFINE Debug}

и в разделе операторов

{$IFDEF Debug} S:=16;

Write(Rus('При длине пути = '), S ,Rus(' метров')); {$ELSE}

//Вывод приглашения к вводу значения переменной S Write(Rus('Введите длину пути в метрах: ')); //Ввод значения переменной S

ReadLn(S);

{$ENDIF},

то при запуске программы вычисление будет произведено для заранее заданного значения переменной S=16.

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

Среда Delphi также предоставляет встроенные средства отладки. Они позволяют остановить выполнение программы на любой строке ее исходного текста и просмотреть текущие значения переменных и выражений, установить или отменить точки останова и продолжить работу программы. Рассмотрим некоторые из этих средств:

Трассировка с заходом в подпрограммы (команда Run/ Step Into. Быстрая клавиша F7). Ввод одной команды приводит к выполнению операторов одной строки программы и останову до ввода очередной команды продолжения работы. Если в строке есть вызов подпрограммы, то будет произведен вход в эту подпрограмму и далее, будут выполнять операторы подпрограммы. В исходном

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

Трассировка без захода в подпрограммы (команда Run/Step Over. Быстрая клавиша F8). То же, что и Run/Step Into, но строка с вызовами подпрограмм выполняется за один шаг трассировки.

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

Точка безусловного останова. Устанавливается щелчком в полосе перед строкой операторов на значке . В результате значок и строка будут выделены. Например, Удаляется повторным щелчком на значке. При работе программы ее

8 Есть и другие директивы условной компиляции, в частности, {$IFNDEF <ИМЯ>} и {$UNDEF <ИМЯ>}, имеющие противоположный смысл по сравнению с директивами

{$IFDEF <ИМЯ>} и {$DEFINE <ИМЯ>}.

16

останов будет перед выполнением операторов строк, отмеченных как точки безусловного останова.

Перезагрузка программы (команда Run/program Reset. Быстрые клавиши Ctrl+F2). Выполняет выход из режима отладки и готовит программу к новому запуску.

Окно наблюдения9 (команда Run/Add Watch... Быстрые клавиши Ctrl+F5). При вводе команды открывается окно диалога, в котором можно указать, значения какой переменной или выражения должны отображаться в окне наблюдения в момент ожидания системой ввода очередной команды выполнения программы. Выражения могут содержать переменные и именованные константы программы, обычные константы, обращения к некоторым стандартным функциям. Допускаются любые выражения, не обязательно те, что есть в программе. Окно наблюдения можно буксировкой разместить в окне редактирования программы или вне его.

Тема № 1. Вычисление выражения с использованием стандартных функций

Программа на языке Object Pascal может содержать следующие символы:

латинские буквы А, В, С, ..., х, у, z;

цифры 0, 1, 2, ..., 9;

специальные символы «+» (плюс), «-» (минус), «/» (слэш), «=» (равно), «< >» (меньше, больше), [ ] (квадратные скобки), «.» (точка), ( ) (круглые скобки), «;» (точка с запятой), «:» (двоеточие), {} (фигурные скобки), $ (символ доллара), # (символ решетки), «_» (знак подчеркивания), @ (собачка).

Идентификатор – совокупность букв, цифр и символа подчеркивания, начинающаяся с буквы или символа подчеркивания. Идентификаторы используется в качестве имен программ, типов, констант, переменных, модулей и других объектов языка. Идентификатор не содержит пробелов. Каждый идентификатор уникален. Если в идентификаторах (именах) первые 63 символа неодинаковые, они считаются различными. Большие и маленькие буквы равнозначны.

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

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

9 Значения переменных и выражений можно также просматривать, подводя к ним в окне редактирования программы курсор мыши.

17

присваивается значение. Константы разделяются точкой с запятой, например, тип данных константы определяется автоматически:

const h=3; b=-7.5;

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

var

a,b: real; c,d: integer;

Типы данных в Паскале разделяют на простые и структурные. Существует возможность создавать пользовательские типы данных (рис. 3).

Рис. 3. Стандартные типы данных языка Object Pascal

Впростых типах данных выделяют следующие группы.

1.Целочисленные типы – занимают от 1 до 4 байт. Они представлены в табл. 1.

Пример описания переменных целочисленных типов:

18

var

a,b:byte; f:word;

Таблица 1

Целочисленные типы данных

Тип

 

Диапазон

 

Формат

Shortint

–128 до 127

8 битов

Smallint

–32 768 до 32 767

16

битов

Longint

–2 147 483 648 до 2 147 483 647

32

бита

Int64

–263 до 263–1

64

бита

Byte

0

до 255

8 битов, беззнаковый

Word

0

до 65 535

16

битов, беззнаковый

Longword

0

до 4 294 967 295

32

бита, беззнаковый

Обычно в программе применяется тип данных Integer – который является эквивалентным Longint.

2.Вещественные типы – могут занимать от 4 до 10 байт и быть записаны в форме как с плавающей (например, –3.2Е–6, –6.42Е+2), так и с фиксированной (например, 4.12, 6.05, –17.5489) точкой. Вещественные числа с плавающей точкой представлены в экспоненциальной форме mE±p, где m – мантисса (целое или дробное число с десятичной точкой), р – порядок (целое число). В табл. 2 приведены вещественные типы данных.

 

Вещественные типы данных

Таблица 2

 

 

 

Тип

Диапазон

Значащих

Байтов

 

 

 

цифр

 

 

 

 

 

 

 

Real48

2.9x10-39 – 1.7x1038

11-12

6

 

 

 

 

 

 

Single

1.5x10-45– 3.4х1038

7-8

4

 

 

 

 

 

 

Double

5.0x10-324 – 1.7x10308

15-16

8

 

 

 

 

 

 

Extended

3.6x10-4951 – 1.1х104932

19-20

10

 

 

 

 

 

 

Comp

263+1 – 263-1

19-20

8

 

 

 

 

 

 

Currency

-922 337 203 685 477.5808 –

19-20

8

 

 

922 337 203 685 477.5807

 

 

 

 

 

 

 

 

Обычно в программе применяется тип данных Real, который является эквивалентным Double.

Пример: var

a,b,c: real; d,f: double;

19

3.Символьным типом данных называется любой символ, который может быть отображен на экране дисплея.

a)тип Сhar – это символы в кодировке ANSI, которым соответствуют числа в диапазоне от 0 до 255;

b)тип Widechar – это символы в кодировке Unicode, им соответствуют числа от 0 до 65 535.

Втексте программы значения переменных и константы символьного типа заключены в апострофы (одиночные кавычки): 'а', 'b', '+'.

4.Логический (булев) тип данных. Данные этого типа принимают одно из двух значений: true (истина, 1) или false (ложь, 0).

Например:

Var

a,b: boolean;

5.Строковый тип данных предназначен для хранения и обработки строк, в Delphi есть поддержка нескольких строковых типов данных:

a)тип ShortString представляет собой статически размещаемые в памяти компьютера строки длиной от 0 до 255 символов;

b)тип LongString представляет собой динамически размещаемые

впамяти строки, длина которых ограничена только объемом свободной памяти;

c)тип WideString представляет собой динамически размещаемые

впамяти строки, длина которых ограничена только объемом свободной памяти. Каждый символ строки типа WideString является Unicode-символом.

ВDelphi для обозначения строкового типа допускается использование идентификатора String. Тип String эквивалентен типу shortstring.

Кроме стандартных простых типов можно вводить такие типы, как перечислимый и интервальный.

Перечислимый тип задается непосредственным перечислением значений, которые может принимать переменная данного типа, например:

var

а,с: (red,blue,green); b: (dog,cat);

Сначала введем перечислимый тип данных, а затем опишем его переменные. Для создания нового типа используется служебное слово type:

type <имя_типа>=<определение_типа>;

Например: type

color=(red,blue,green); var

a,b: color;

С помощью интервального типа данных можно задать две константы, которые определяют границы изменения переменных данного типа. Значение

20