Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Delphi через Прат.doc
Скачиваний:
2
Добавлен:
14.11.2019
Размер:
631.81 Кб
Скачать

61

Delphi (Прат)

1. Приступаем к изучению языка delphi

Изучение языка программирования следует начинать с общей структуры программ. Лишь после этого можно переходить к деталям, таким как циклы и объекты. В этой главе дается общее представление о структуре программы, написанной на языке Delphi, и кратко описываются функции и классы, которые позднее будут рассматриваться более подробно. (Идея заключается в том, чтобы вводить, по крайней мере, некоторые основные понятия постепенно — по пути к последующим "открытиям".)

Начальные сведения о языке Delphi

Начнем с простой программы Delphi, которая выводит на экран сообщение.

Программа 1_1

//программа myfirst.pas – отображает на экране сообщение

program Project1; //заголовок программы

{$APPTYPE CONSOLE} //консольное приложение

uses

SysUtils; //подключаемая библиотека

begin //начало процедуры

Write('I love Delhi'); //текстовое сообщение

Writeln; //начать новую строку

Readln; //ожидание нажатия любой клавиши

end. //окончание процедуры

Для вывода символов в программе из листинга 1.1 используется оператор WriteLn. Исходный код содержит несколько комментариев для читателя (они начинаются с символов //; компилятор комментарии игнорирует). Язык Delphi не чувствителен к регистру. Другими словами, в нем не различаются символы верхнего и нижнего регистров. Например, в программе встречается оператор WriteLn. Если заменить его словом WRITELN или writeln, компилятор воспримет его и не сообщит об использовании неизвестного идентификатора. идентификатора. (Компилятор также не допускает орфографических ошибок, поэтому не стоит вводить Writ или WriteL.) Для обозначения программы на Delphi обычно применяется расширение .pas.

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

I love Delhi

Программа Delphi строится из отдельных блоков, называемых функциями (процедурами). Как правило, программа разбивается на несколько крупных задач, а затем для выполнения этих задач разрабатываются отдельные функции. Программа из листинга 1.1 достаточно проста и состоит из одной функции. Эта программа (myfirst.pas) содержит следующие элементы:

  • Комментарии, предваряемые двумя косыми чертами — //

  • Директиву {$APPTYPE CONSOLE}

  • Оператор uses

  • Тело процедуры, ограниченное словами begin и end.

  • Оператор для вывода сообщения на экран Write и WrietLn

  • Оператор для приостановления выполнения программы Readln

Рассмотрим теперь все эти различные элементы языка более подробно. Имеет смысл начать с процедуры begin .. end., поскольку понять некоторые предшествующие ей элементы, такие как директива препроцессора, после знакомства с процедурой будет проще.

Процедура begin .. end.

Учебная программа, представленная в листинге 1.1, имеет следующую структуру:

begin

операторы;

end.

Эти строки означают, что перед нами главное тело программы ограниченное словами begin и end.. Тело процедуры содержит инструкции для компьютера, т.е. определяет то, что собственно делает функция. В языке Delphi каждая завершенная инструкция называется оператором (statement). Каждый оператор должен оканчиваться точкой с запятой, так что не следует опускать точки с запятыми при вводе примеров программ.

Комментарии в языке Delphi

В языке Delphi комментарии обозначаются двойной наклонной чертой (//). Комментарий — это написанное программистом примечание, которое предназначается для тех, кто будет изучать эту программу; обычно комментарий служит для идентификации раздела программы или пояснения некоторые аспектов кода программы. Компилятор комментарии игнорирует. Для компилятора, скажем, листинг 1.1 выглядит так, как если бы он был написан вообще без комментариев:

program Project1;

{$APPTYPE CONSOLE}

uses

SysUtils;

begin

Write('I love Delhi');

Writeln;

Readln;

end.

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

Глобальные директивы компилятора

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

Оператор uses

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

Названия библиотек, подключаемых к программе с помощью оператора uses, должны разделяться запятой. Например:

uses StrUtils, Windows, Classes;

Вывод данных с использованием оператора Write и WriteLn

Теперь рассмотрим вывод сообщения на экран. В программе myflrst.pas для этого используется следующий оператор:

Write('I love Delhi');

Информация, заключенная в одинарные кавычки кавычки, является сообщением, которое должно быть выведено на экран. В языке Delphi любая последовательность символов, заключенная в одинарные кавычки, называется строкой символов — главным образом потому, что она состоит из нескольких символов, соединяемых вместе в более крупный блок. Обозначение Write указывает на то, что этот оператор отправляет данную строку на экран. Оператор Write способен отображать на экране разнообразные данные – строки, числа и отдельные символы.

Оператор WriteLn выводит строку символов и переводит курсор в начало следующий строки. Оператор Write выводит строку символов без перевода курсора в начало следующий строки.

Дополнительные сведения об операторах

Программа на Delphi представляет собой совокупность функций, а каждая функция — это совокупность операторов. Язык Delphi содержит несколько видов операторов. Рассмотрим некоторые из них.

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

Программа 1_2

//fleas.pas отображает на экране значение переменной

program Project1;

{$APPTYPE CONSOLE}

uses

SysUtils;

var

fleas: Integer; //Создает целочисленную переменную

begin

fleas := 38; //присваивает этой переменной значение

Write('My cat has ');

Write(fleas); //отображает на экране значение переменной fleas

Writeln(' fleas.');

Readln;

end.

В разделе var перед телом процедуры содержится список переменных, используемых в программе, и определяется их тип. Например:

var

A, B, C: Integer; //переменным A, B и C присваивается тип Integer (целое число),

DDT: Real; // а переменной DDT присваивается тип Real (вещественное число)

Операторы объявления и переменные

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

fleas: Integer;

Этот оператор выделяет в памяти достаточно места для хранения информации, тип которой обозначается словом Integer. Всю работу по выделению области памяти и присвоению ей идентификатора выполняет компилятор. В языке DELPHI можно обрабатывать данные нескольких видов (типов), a Integer относится к основным типам. Он соответствует целому числу, т.е. числу без дробной части. Данные типа Integer в языке DELPHI могут быть положительными и отрицательными, а диапазон значений зависит от реализации языка.

Помимо типа данных оператор объявления также указывает, что для идентификации значения в этой области памяти программа, начиная с данного момента, будет использовать имя fleas. Поскольку это значение может изменяться, fleas называется переменной. В языке DELPHI требуется объявлять все переменные. Если в программе fleas.pas опустить объявление этой переменной, то при попытке использовать далее в программе переменную fleas компилятор выдаст сообщение об ошибке (попробуйте опустить это объявление переменной, чтобы увидеть каким сообщением отреагирует компилятор, — тогда, если в дальнейшем придется столкнуться с таким сообщением еще раз, вы уже будете знать, что необходимо проверить, не пропущены ли объявления переменных).

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

Оператор присваивания

Оператор присваивания присваивает значение некоторой области памяти. Например, оператор

fleas := 38;

присваивает целое число 38 области памяти, представленной переменной fleas. Знак := обозначает операцию присваивания.

Важный момент, связанный с оператором Write.

В приводившихся до сих пор примерах оператору Write для вывода на печать передавались строки. Но в листинге 1.2 появилось что-то новенькое: этому оператору уже передается переменная, значением которой является целое число:

Write(fleas);

Теперь программа вместо слова fleas выведет на печать целочисленное значение, хранящееся в переменной fleas (оно равно 38). Фактически здесь важны даже не один, а два момента. Во-первых, оператор Write замещает имя переменной fleas ее текущим числовым значением 38. Во-вторых, это значение преобразуется в соответствующие символы, выводимые на экран.

Как видим, оператор Write может работать как со строками, так и с целыми числами. Возможно, в этом и нет ничего особенного, но следует обратить внимание на следующее: целое число 38 представляет собой нечто совсем иное, чем строка '38'. Строка содержит символы, посредством которых записывается это число: символ 3 и символ 8. В памяти компьютера хранится код символов 3 и 8. Чтобы вывести на печать строку, оператор Write просто отображает каждый ее символ. Совсем другая история с целым числом 38: оно хранится как числовое значение — не каждая цифра числа отдельно, а в виде двоичного числа. Главное здесь заключается в том, что оператор Write перед выводом на печать должен преобразовать целое число в символьную форму. Более того, оператор Write обладает способностью определять, что переменная fleas представляет собой целое число, требующее преобразования.

Еще несколько операторов языка DELPHI

Рассмотрим еще несколько примеров операторов. Программа из листинга 1.3 является расширением предыдущего примера, она позволяет вводить данные во время выполнения программы. Для этого в ней используется оператор Readln(fleas) — оператор, по своему назначению противоположный Write. Он служит для ввода данных. Кроме того, здесь показан еще один способ применения WriteLn — этого мастера перевоплощений.

Программа 1_3

//yourcat.pas - ввод и вывод

program Project1;

{$APPTYPE CONSOLE}

uses

SysUtils;

var

fleas: Integer;

begin

Write('How many fleas does your cat have? ');

Readln(fleas); //ввод в программу

//следующая строка объединяет выводимые данные

Writeln('Well, thats ', fleas, ' fleas too many!');

Readln;

end.

В результате выполнения программы получается следующее:

How many fleas does your cat have?

112

Well, that's 112 fleas too many!

В этой программе имеется две новые особенности: для ввода данных с клавиатуры применяется оператор Readln, и три оператора вывода объединяются в один. Рассмотрим их подробнее.

Применение оператора ReadLn

Из вывода программы видно, что значение, вводимое с клавиатуры (112), присваивается переменной fleas. Вот оператор, выполняет это:

Readln(fleas);

Подобно оператору WriteLn, оператор ReadLn — довольно "разумный". Он преобразует входные данные, которые представляют собой просто последовательность символов, вводимых с клавиатуры, в форму, приемлемую для переменной, принимающей информацию. В данном случае переменная fleas объявлена в программе как целочисленная, поэтому входные данные преобразуются в числовую форму, используемую компьютером для хранения целых чисел.

И снова оператор WriteLn

Вторая новая особенность программы yourcat.pas — это объединение трех операторов вывода в один.

Writeln('Well, that's ', fleas, ' fleas too many!');

Это позволяет комбинировать в одном операторе вывод строк и вывод целых чисел. Результирующие выходные данные будут идентичны выходным данным следующих трех операторов:

Writeln('Well, that's ');

Writeln(fleas);

Writeln(' fleas too many!');

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

Writeln('Well, that's ', fleas, ' fleas too many!');

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

Функции

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

Применение функций с возвращаемым значением

Функция, имеющая возвращаемое значение, в результате своей работы выдает значение, которое можно присвоить переменной. Например, в стандартную библиотеку DELPHI входит функция Sqrt(), возвращающая квадратный корень числа. Предположим, что требуется вычислить квадратный корень числа 6,25 и присвоить полученное значение переменной х. Для этого в программе можно использовать такой оператор:

x := Sqrt(6.25); //возвращает значение 2,5 и присваивает его переменной x

Выражение Sqrt(6.25) вызывает функцию Sqrt(). Выражение Sqrt(6.25) называется вызовом функции, сама функция называется вызываемой, а функция, в которой находится вызов функции, называется вызывающей (рис. 1.1)

Рис. 1.1 Вызов функции

Значение в круглых скобках (в данном случае 6.25) представляет собой информацию, посылаемую функции; говорят, что эта информация передается в функцию. Значение, посылаемое в функцию таким образом, называется аргументом или параметром (рис. 1.2). Функция Sqrt() вычисляет результат, который будет равен 2,5, и отправляет это значение обратно вызывающей функции. Это отправляемое значение называется возвращаемым значением функции. Можно считать, что возвращаемое значение замещает в операторе вызов функции после того, как функция завершит свою работу. Таким образом, в данном примере возвращаемое значение присваивается переменной Х. Коротко говоря, аргумент — это информация, посылаемая в функцию, а возвращаемое значение — это значение, передаваемое обратно из функции.

Рис. 1.2. Синтаксис вызова функции

Это практически все, что необходимо знать о вызове функции. Необходимо лишь добавить, что, перед тем как использовать функцию, компилятор DELPHI должен знать типы аргументов и возвращаемого значения функции. Другими словами, что возвращает функция? Целое число? Символ? Число с дробной частью? Приговор присяжных? Или что-нибудь еще? Если у компилятора отсутствует информация, он не сможет интерпретировать возвращаемое значение. В языке DELPHI эта информация передается компилятору с помощью прототипа функции.

Прототип функции является для функции тем же, чем для переменной является объявление переменной, — он информирует программу о типах данных. Например, в библиотеке DELPHI определено, что функция Sqrt() принимает в качестве аргумента число с необязательной дробной частью (например, 6,25) и возвращает число того же самого типа. В языке DELPHI такие числа называются вещественными типа Real (Extended) или числами с удвоенной точностью. Прототип функции Sqrt() выглядит так:

function Sqrt(const X: Extended): Extended;

Первое ключевое слово function означает, что функция Sqrt() возвращает значение типа Extended, указанное в конце оператора после двоеточия. Ключевое слово Extended в круглых скобках означает, что функции Sqrt() необходим аргумент типа Extended, т.е. этот прототип описывает функцию Sqrt() точно так, как она используется в следующем выражении:

var

х: Extended; // объявление х как переменкой типа Extended

begin

х := Sqrt(6.25);

Если в программе применяется функция Sqrt(), необходимо включить в код ее прототип. Это можно обеспечить двумя способами:

  • Вручную ввести прототип функции в исходный код программы.

  • Включить в программу заголовочный файл System, который содержит прототип этой функции.

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

Не следует путать прототип функции с определением функции. Прототип, как можно было видеть, лишь описывает интерфейс функции, другими словами, он описывает информацию, посылаемую в функцию и из функции. А определение содержит код функции — например, код вычисления квадратного корня числа. В языке DELPHI прототипы и определения функций хранятся раздельно. Библиотечные файлы (*.DCU) содержат скомпилированные коды функций, тогда как заголовочные файлы (*.PAS) содержат прототипы функций.

В листинге 1.4 демонстрируется применение библиотечной функции Sqrt(); прототип функции помещается в программу путем включения файла System в раздел uses.

Программа 1_4

//sqrt.pas - использование функции sqrt()

//не забудьте подключить библиотеку Math

program Project1;

{$APPTYPE CONSOLE}

uses

SysUtils, Math;

var

cover, side: Real;

begin

Writeln('How many square feet of sheets do you have?');

Readln(cover);

side := Sqrt(cover); //вызвать функцию и присвоить возвращаемое значение переменной

Writeln('You can cover a square with sides of ', side:0:1, ' feet with your sheets.');

Readln;

end.

Вот пример выполнения программы:

How many square feet of sheets do you have?

123.21

You can cover a square with sides of 11.1 feet with your sheets.

Функции, определяемые пользователем

В любой программе на Delphi должен присутствовать основной блок программы begin .. end. определяемый пользователем. Теперь предположим, что в программу необходимо добавить еще одну, определяемую пользователем функцию. Как и в случае с библиотечными функциями, для вызова определяемой пользователем функции в программе используется ее имя. И так же, как для библиотечных функций, в программе следует поместить определение функции до ее вызова; обычно определение помещается непосредственно перед основным блоком программы begin .. end... Этот способ иллюстрируется в листинге 1.5.

Программа 1_5

// определение собственной функции

program Project1;

{$APPTYPE CONSOLE}

uses

SysUtils;

var

count: Integer;

procedure simon(n: Integer); //определение функции simon()

begin

Writeln(' Alex fired a machine gun ', n, ' times.');

end;

begin

simon(3); //вызов функции simon()

Write('Pick an integer: ');

Readln(count);

simon(count); //повторный вызов этой функции

Readln;

end.

Основной блок программы вызывает функцию simon() дважды. Первый раз аргументом является число 3, а второй раз — переменная count. Между этими вызовами пользователь вводит целое число, которое сохраняется в переменной count.

Ниже приведен пример выходных данных программы:

Simon says touch your toes 3 times.

Pick an integer: 512

Simon says touch your toes 512 times.

Формат определения функции/процедуры

Сначала идет заголовок функции, затем следует тело функции/процедуры ограниченное зарезервированными слоами begin и end.

В общем случае формат определения функции следующий:

function имя_функции(список_аргументов): тип_возвращаемого_значения;

begin

операторы

end;

В общем случае формат определения процедуры следующий:

procedure имя_процедуры(список_аргументов);

begin

операторы

end;

Заголовок функции/процедуры

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

Заголовок процедуры simon() имеет следующий вид:

procedure simon(n: Integer);

Начальное ключевое слово procedure означает, что процедура simon() не имеет возвращаемого значения. Следовательно, в результате вызова процедуры simon() не будет получено число, которое можно было бы присвоить какой-нибудь переменной в основном блоке программы. Итак, первый вызов этой процедуры выглядит следующим образом:

simon(3); // правильно для функций без возвращаемого значения

Поскольку в процедуре simon() отсутствует возвращаемое значение, ее нельзя использовать таким образом:

simple := simon(3); //недопустимо для процедуры без возвращаемого значения

Выражение n: Integer в круглых скобках означает, что процедура simon() имеет один аргумент типа Integer. Здесь n — это новая переменная, которой присваивается значение, передаваемое в функцию во время ее вызова. Таким образом, при вызове следующей функции

simon(3);

переменной n, определенной в заголовке этой процедуры, присваивается значение 3. Переменная n в операторе WriteLn означает, что используется ее значение, передаваемое в процедуру при вызове. Вот почему в выходных данных процедуры simon(3) отображается число 3. В примере выходных данных при втором вызове процедуры simon(count) отображается число 512, поскольку это значение было присвоено переменной count. Иными словами, заголовок процедуры simon() информирует программу о том, что эта процедура принимает один аргумент типа Integer и у нее отсутствует возвращаемое значение.

Определяемая пользователем функция с возвращаемым значением

Теперь сделаем еще один шаг вперед и напишем функцию, в которой используется оператор Result (оператор возврата). С помощью такой функции можно решить проблему преобразования сантиметров в миллиметры.

Программа 1_6

program Project1; //преобразование см в мм

{$APPTYPE CONSOLE}

uses

SysUtils;

var

cm, mm: Integer;

function cm_to_mm(cantim: Integer): Integer;

begin

Result := cantim * 10;

end;

begin

Write('Enter length in cm: ');

Readln(cm);

mm := cm_to_mm(cm);

Writeln(cm, ' cm = ', mm, ' mm');

Readln;

end.

В результате выполнения программы мы получим следующие результаты:

Enter length in cm: 14

14 cm = 140 mm

С помощью оператора ReadLn основной блок программы вводит значение для целочисленной переменной cm. Это значение передается функции cm_to_mm() в качестве аргумента. Функция cm_to_mm() присваивает данное значение переменной cantim и, используя ключевое слово result, возвращает в основной блок значение 14 * cantim. Такая запись оператора Result иллюстрирует тот факт, что за ключевым словом Result вовсе не обязательно должно следовать простое число. Используя в данном операторе сложное выражение, мы избегаем необходимости создавать новую переменную и присваивать ей возвращаемое значение перед передачей вызывающей функции. Программа вычисляет значение этого выражения (в данном примере 140) и возвращает результирующее значение.

Вопросы для повторения

  1. Какой оператор следует использовать, чтобы вывести фразу 'Hello, world' и перейти на начало новой строки?

  2. Какой оператор следует использовать, чтобы создать целочисленную переменную с именем cheeses?

  3. Какой оператор следует использовать, чтобы присвоить переменной cheeses значение 32?

  4. Какой оператор следует использовать для ввода значения с клавиатуры и присвоения его переменной cheeses?

  5. Какой оператор следует использовать для вывода предложения 'We have X varieties of cheeses', где буква X будет заменяться текущим значением переменной cheeses?

  6. Какую информацию о функции дает следующий заголовок функции?

function froop(t: Real): Integer;

Упражнения по программированию

  1. Напишите программу, которая отображает на экране ваше имя и адрес?

  2. Напишите программу, которая запрашивает расстояние в километрах и переводит его в метры.

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

Three blind mice

Three blind mice

See how they run

See how they run

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

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

Please enter a Celsius value: 20

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