Знак операции
|
Название
операции
|
Логические
операции могут комбинироваться с помощью связок: and (логическое И) or
(логическое ИЛИ) xor (исключающее ИЛИ) Для некоторых типов данных есть
дополнительные операции. Например, для множеств - оператор in, которая
проверяет, входит ли некоторое значение в множество. Например: X:= [2, 4, 5,
7, 8, 10]; Выражение 2 in X истинно (true); Выражение 6 in X ложно (false);
|
=
|
Равно
|
|
<>
|
Не равно
|
|
>
|
Больше
|
|
<
|
Меньше
|
|
>=
|
Больше или
равно
|
|
<=
|
Меньше или
равно
|
|
not
|
Логическое Не -
отрицание
|
|
Результат выполнения операции логического И равен true, если
оба операнда равны true.
Результат выполнения операции логического ИЛИ равен true,
если хотя бы один из операндов равен true.
Результат выполнения операции исключающего ИЛИ равен true,
если операнды не равны друг другу.
Операторы цикла позволяют организовать многократное
повторение одной и той же последовательности действий. В Delphi имеются три
оператора, позволяющих это сделать:
- простой оператор цикла;
- условный оператор цикла;
- условный оператор повторения.
Простой оператор цикла применяется, когда известно количество
повторений цикла. Он записывается так:счётчик:= выражение-1 to выражение-2 do
действие;
Счётчик - это переменная, которая должна быть объявлена перед
логическим блоком, в котором оператор цикла расположен, и её тип должен
относиться к одному из перечислимых типов, обычно Integer.
Выражение-1 и выражение-2 могут быть как константой или
идентификатором, так и вызовом функции.
Действие - один или несколько операторов Delphi. Если это
группа операторов, то они должны быть заключены в логические скобки begin/end.
В начале работы оператора переменная-счётчик получает
значение выражения-1. Если при этом значение счётчика окажется меньше или равно
значению выражения-2, то выполняются операторы, входящие в действие. Это и есть
один цикл. Затем переменная-счётчик принимает значение, следующее за текущим, и
начинается новый цикл, то есть сравнение счётчика и выражения-2, выполнение действия,
и так далее, до тех пор, пока значение переменной-счётчика не превысит значение
выражения-2.
Возможна работа оператора цикла, при котором
переменная-счётчик будет не увеличиваться, а уменьшаться. В этом случае
ключевое слово to заменяется на downto:счётчик:= выражение-1 downto выражение-2
do действие;
Соответственно, выражение-1 должно быть больше или равно
выражению-2.
Условный оператор цикла удобно использовать в том случае,
когда количество повторений заранее не известно:условие do
тело цикла;
Этот цикл будет выполняться до тех пор, пока истинно условие
(логическое выражение, возвращающее значение типа Boolean). При этом если это
выражение сразу равно false, тело цикла не будет выполнено ни разу.
Нужно очень внимательно следить за написанием условия и
контролем завершения цикла, так как в результате ошибки цикл while будет
повторяться бесконечное количество раз, что приведёт к «зацикливанию» и
«зависанию» программы.
Условный оператор повторения сначала выполняет тело цикла, а
затем уже проверяет выполнение условия:
тело циклаусловие
Таким образом, этот вариант цикла гарантирует, что тело цикла
будет выполнен по крайней мере один раз. И будет выполняться до тех пор, пока
условие не станет истинным (т.е. true). Стоит отметить, что это единственный
оператор Delphi, в котором тело цикла не требуется заключать в логические
скобки begin/end. Начало и конец тела цикла определяются по ключевым словам
repeat и until. Вместе с операторами цикла используются специальные команды:
- команда прерывания цикла;
- команда продолжения цикла.
Команда прерывания цикла применяется, если в процессе
выполнения операторов тела цикла выясняется необходимость его завершения. Вот
эта команда: Break;
При её выполнении управление передаётся на первый оператор,
следующий за оператором цикла.
Команда продолжения цикла позволяет немедленно продолжить
выполнение цикла, пропустив все оставшиеся операторы в теле цикла, то есть
начать следующую итерацию.
Вот эта команда: Continue;
Справедливости ради стоит рассказать об ещё одном операторе,
позволяющем изменить последовательность выполнения программы. Это оператор
перехода: goto метка;
В качестве метки может использоваться любой допустимый
идентификатор или число в диапазоне от 0 до 9999. Метку предварительно
необходимо объявить в разделе описания переменных, но с помощью не ключевого
слова var, а ключевого слова label:меткa;
илисписок меток;
Переходить можно как вниз, так и вверх по программе.
Двоеточие отделяет метку от оператора, на который производится переход.
Операторы организации ветвлений
Оператор ветвления if - одно из самых популярных средств,
изменяющих естественный порядок выполнения операторов программы. Вот его общий
вид:
if <условие> then
<оператор 1>
<оператор 2>;
Условие - это выражение булевского типа,
оно может быть простым или сложным. Сложные условия образуются с помощью
логических операций и операций отношения. Обратите внимание, что перед словом
else точка с запятой не ставится.
Логика работы оператора if очевидна:
выполнить оператор 1, если условие истинно, и оператор 2, если условие ложно.
Поясним сказанное на примере:
Console;
{$APPTYPE CONSOLE};
var, B, C: Integer;:=
2;:= 8;A > B then:= A:= B;
Writeln ('C=', C);('Press
Enter to exit…');;
end.
В данном случае значение выражения А >
В ложно, следовательно на экране появится сообщение C=8.
У оператора if существует и другая форма,
в которой else отсутствует:<условие> then <оператор>;
Логика работы этого оператора if еще
проще: выполнить оператор, если условие истинно, и пропустить оператор, если
оно ложно. Поясним сказанное на примере:
Console;
{$APPTYPE CONSOLE};
var, B, C: Integer;:=
2;:= 8;:= 0;A > B then C:= A + B;('C=', C);('Press Enter to exit…');;
end.
В результате на экране появится сообщение
С=0, поскольку выражение А > В ложно и присваивание С:= А + В пропускается.
Один оператор if может входить в состав
другого оператора if. В таком случае говорят о вложенности операторов. При
вложенности операторов каждое else соответствует тому then, которое
непосредственно ему предшествует. Например:
program Console;
{$APPTYPE CONSOLE};:
Integer;(A);A >= 0 thenA <= 100 then('A попадает в диапазон 0 - 100.')('A больше 100.')('A меньше 0.');('Press
Enter to exit…');;
end.
Оператор ветвления case:
Оператор ветвления case является удобной альтернативой
оператору if, если необходимо сделать выбор из конечного числа имеющихся
вариантов. Он состоит из выражения, называемого переключателем, и
альтернативных операторов, каждому из которых предшествует свой список
допустимых значений переключателя:
<переключатель> of
<список? 1 значений переключателя>:
<оператор 1>;
<список? 2 значений переключателя>:
<оператор 2>;
<список? N значений переключателя>:
<оператор N>;<оператор N+1>;
Оператор case вычисляет значение
переключателя (который может быть задан выражением), затем последовательно
просматривает списки его допустимых значений в поисках вычисленного значения и,
если это значение найдено, выполняет соответствующий ему оператор. Если
переключатель не попадает ни в один из списков, выполняется оператор, стоящий
за словом else. Если часть else отсутствует, управление передается следующему
за словом end оператору.
Переключатель должен принадлежать
порядковому типу данных. Использовать вещественные и строковые типы в качестве
переключателя не допускается.
Список значений переключателя может
состоять из произвольного количества констант и диапазонов, отделенных друг от
друга запятыми. Границы диапазонов записываются двумя константами через
разграничитель в виде двух точек (.). Все значения переключателя должны быть
уникальными, а диапазоны не должны пересекаться, иначе компилятор сообщит об
ошибке. Тип значений должен быть совместим с типом переключателя. Например:
Console;
{$APPTYPE CONSOLE};:
1..31;(Day);Day of
20..31: Writeln ('День попадает в
диапазон 20 - 31.');
, 5..10: Writeln ('День попадает в
диапазон 1, 5 - 10.');
else Writeln ('День не попадает в
заданные диапазоны.');
end;('Press Enter to
exit…');;
end.
Если значения переключателя записаны в
возрастающем порядке, то поиск требуемого оператора выполняется значительно
быстрее, так как в этом случае компилятор строит оптимизированный код. Учитывая
сказанное, перепишем предыдущий пример:
Console;
{$APPTYPE CONSOLE};
var: 1..31;(Day);Day of
, 5..10: Writeln ('День попадает в диапазон 1, 5 - 10.');
..31: Writeln ('День попадает в диапазон 20 - 31.'); Writeln ('День не попадает в
заданные диапазоны.');
end;('Press Enter to
exit…');;
end.
Операторы организации цикла
Условные операторы (операторы выбора) и оператор безусловного
перехода GOTO позволяют в зависимости от необходимости выполнять один
блок операторов, обходя при этом другой. Однако часто при написании программ
нужно решить задачу другого плана - многократно выполнять один и тот же блок
операторов. Программная конструкция, позволяющая организовать многократное
выполнение блока операторов, называется циклом.
Цикл можно организовать при помощи условного оператора и
оператора GOTO. Для этого, например, в процедуре можно объявить
целочисленную переменную, которая будет служить счетчиком. Перед входом в
группу операторов, подлежащих многократному выполнению (такая группа операторов
называется телом цикла), счетчику присваивается значение 0. Затем
следуют операторы тела цикла, среди которых необходимо обязательно разместить
оператор, увеличивающий значение счетчика на 1. Завершает всю конструкцию
условный оператор, в котором проверяется значение счетчика. Если оно еще не
превышает заранее заданного предельного значения, то при помощи оператора GOTO
осуществляется переход к первому оператору тела цикла. Операторы тела цикла
выполнятся еще раз, и так будет продолжаться до тех пор, пока значение счетчика
не превысит заданный предел.
Однако, как уже говорилось выше, оператор безусловного
перехода GOTO является своего рода операторным изгоем и применять
его благопристойным программистам не рекомендуется. Кроме того, Visual Basic
содержит четыре удобных в использовании оператора цикла: FOR… NEXT, FOR
EACH… NEXT, DO… LOOP и WHILE… WEND. Некоторые из этих
операторов имеют несколько вариантов синтаксиса и позволяют организовать какие
угодно циклы, так что вам нет необходимости пользоваться неправильным
оператором GOTO. Далее в этом разделе будут описаны все упомянутые
конструкции.
Оператор цикла FOR… NEXT повторяет группу операторов
указанное количество раз. Ниже приведен его полный синтаксис.счетчик = начало
ТО конец [STEP шаг]
[операторы]
[EXIT FOR]
[операторы][счетчик]
где:
счетчик - обязательный элемент; переменная числового типа,
используемая в качестве счетчика цикла; переменная не может быть типа Boolean
и не может быть элементом массива.
начало и конец - обязательные элементы; выражения, задающие
начальное и конечное значение счетчика цикла.
шаг - необязательный элемент; если он используется, то
указывается после ключевого слова STEP; этот элемент задает величину
приращения счетчика, то есть при каждом прохождении цикла счетчик будет
увеличиваться на шаг, пока не достигает значения 1 конец;
приращение шаг может быть как положительным, так «и отрицательным;
значение 0 задает бесконечный цикл (в этом случае нужно предусмотреть свой
собственный вариант выхода из цикла); если шаг не указан, то приращение
считается равным 1.
операторы - блок операторов, составляющих тело цикла; ни один
из операторов тела цикла не должен менять значение счетчика цикла (это может
привести к непредсказуемым последствиям);
EXIT FOR - необязательная конструкция; если присутствует,
то при получении управления осуществляет переход за пределы оператора FOR…
NEXT (прерывает выполнение оператора цикла); при помощи конструкции EXIT
FOR можно запрограммировать альтернативный вариант выхода из цикла
(например, при достижении какоголибо условия, в том числе для выхода из
бесконечных циклов); используется в сочетании с условными операторами.
Конструкция NEXT служит для завершения оператора
цикла. После ключевого слова NEXT можно указать переменную цикла счетчик,
ту же самую, что и в заголовке цикла (после ключевого слова FOR). Это
делать не обязательно, но настоятельно рекомендуется. Иначе вы обязательно
запутаетесь, особенно при использовании вложенных циклов.
Оператор цикла FOR EACH… NEXT выполняет блок
операторов, составляющих тело цикла, для всех элементов массива или набора
(коллекции). Синтаксис этого оператора следующий:EACH элемент IN группа
[операторы]
[EXIT FOR]
[операторы][элемент]
где:
элемент - переменная, используемая для итерации по
элементам массива или коллекции (набора). Для итерации по элементам набора, элемент
может быть переменной типа Variant или объектной переменной
соответствующего типа, а для итерации по элементам массива - только переменной
типа Variant.
группа - имя массива или коллекции (набора).
Остальные элементы оператора аналогичны соответствующим
элементам оператора FOR… NEXT который описывался выше. Ниже приводится
пример, иллюстрирующий наиболее часто встречающийся способ использования
оператора FOR EACH… NEXT.
В этом примере оператор цикла FOR EACH NEXT используется для
итерации по элементам набора открытых в данный момент форм. Переменная цикла
MyForm объявлена как переменная объектного типа FORM. Коллекция всех открытых
форм называется FORMS. Таким образом, в приведенном выше примере в операторе
цикла проверяется свойство Caption всех открытых в данный момент форм. Если
среди открытых форм есть форма, имеющая подпись (Caption) Форма2, то на экран
выдается соответствующее сообщение и цикл прерывается.
Наиболее гибким и удобным в семействе операторов цикла является
оператор DO… LOOP. Существует два варианта синтаксиса этого оператора.[{WHILE |
UNTIL} условие] 'Первый вариант
[операторы]
[EXIT DO]
[операторы]'Второй вариант
[операторы]
[EXIT DO]
[операторы][{WHILE | UNTIL} условие]
Процедуры и функции
При разработке больших программных продуктов принято разбивать
программу на несколько логических частей, называемых подпрограммами. Это
улучшает структуру программы, упрощает ее понимание, делает программу более
прозрачной и читаемой, позволяя тем самым избежать многих ошибок. Если
программа предназначена для решения задачи в целом, то подпрограмма
используется для выполнения логически завершенной последовательности действий.
В языке Delphi представлены две разновидности подпрограмм -
процедуры и функции. Принципиальное отличие между подпрограммами заключается в
их оформлении и способе передачи данных в подпрограмму и обратно. Все
подпрограммы делятся на стандартные (определенные в языке) и создаваемые
программистом (пользовательские).
Структура подпрограммы очень похожа на структуру программы и в
самом общем случае состоит из таких частей:
- заголовка подпрограммы;
- раздела объявления меток;
- раздела объявления констант;
- раздела объявления типов;
- раздела объявления переменных;
- раздела процедур и функций;
- тела подпрограммы.
Обязательными частями подпрограммы являются ее заголовок и
тело. Обращение к подпрограмме осуществляется через упоминания ее имени и
называется вызовом. Разделы объявления меток, констант. Типов и переменных
соответствует аналогичным разделам программы. Создание этих разделов происходит
по мере необходимости. Раздел процедур и функций может содержать описания
собственных процедур и функций. Тело подпрограммы содержит исполняемые
операторы. Под описанием подпрограммы понимается указание ее заголовка и тела.
Заголовок процедуры имеет вид: Procedure имя (параметры);
Заголовок функции: Function имя (параметры): тип;
Слова Procedure и Function являются зарезервированными.
Массивы
Объявление массива.
Массив, как и любая переменная программы, перед
использованием должен быть объявлен в разделе объявления переменных.
В общем виде инструкция объявления одномерного массива
выглядит следующим образом:
имя - имя массива;- зарезервированное слово языка Delphi,
обозначающее, что объявляемое имя является именем массива;
нижний_индекс и верхний_индекс - целые константы,
определяющие диапазон изменения индекса элементов массива и, неявно, количество
элементов (размер) массива;
тип - тип элементов массива.
В общем виде инструкция объявления двумерного массива
выглядит так:
Имя: array [НижняяГраница1..ВерхняяГраница1,
НижняяГраница2..ВерхняяГраница2] of Тип;
Имя - имя массива;- слово языка Delphi, указывающее, что
объявляемый элемент данных является массивом;
НижняяГраница1, ВерхняяГраница1, НижпяяГраница2,
ВерхняяГраница2 - целые константы, определяющие диапазон изменения индексов и,
следовательно, число элементов массива;
Тип - тип элементов массива.
При объявлении массива удобно использовать именованные
константы. Именованная константа объявляется в разделе объявления констант,
который обычно располагают перед разделом объявления переменных. Начинается
раздел объявления констант словом const. В инструкции объявления именованной
константы указывают имя константы и ее значение, которое отделяется от имени
символом «равно». После объявления именованной константы ее можно использовать
в программе как обычную числовую или символьную константу.
Ниже в качестве примера приведено объявление массива названий
команд-участниц чемпионата по футболу, в котором используются именованные
константы.
Для того чтобы в программе использовать элемент массива, надо
указать имя массива и номер элемента (индекс), заключив индекс в квадратные
скобки. В качестве индекса можно использовать константу или выражение целого
типа.
Если массив не является локальным, т.е. объявлен не в
процедуре обработки события, а в разделе переменных модуля, то одновременно с
объявлением массива можно выполнить его инициализацию, т.е. присвоить начальные
значения элементам массива. Инструкция объявления массива с одновременной его
инициализацией в общем виде выглядит так:
Имя: array [нижний_индекс..верхний_индекс] of тип = (список);
список - разделенные запятыми значения элементов массива.
Операции с массивами
Типичными операциями при работе с массивами являются:
- вывод массива;
- ввод массива;
- поиск максимального или минимального
элемента массива;
- поиск заданного элемента массива;
- сортировка массива.
Вывод массива
Под выводом массива понимается вывод на экран монитора (в
диалоговое окно) значений элементов массива.
Если в программе необходимо вывести значения всех элементов
массива, то для этого удобно использовать инструкцию for.
Пример:
const= 5;: array [1..NT] of string[10] =('Зенит', 'Динамо', 'Ротор', 'Спартак', 'СКА'TForml.
ButtonlClick (Sender: TObject);:string;:integer;i:=l to NT do:= st +
IntToStr(i)+ ' '+ team[i] + #13;
end;
Ввод (вывод) массива
Под вводом массива понимается процесс получения от пользователя
(или из файла) во время работы программы значений элементов массива.
Данны в массив можно вводить (выводить) с помощью компонентов
StringGrid и Memo (вкладка Additional).
Записи
Ключевое слово Record один из самых полезных, и отличительных
особенностей Delphi (и языка Паскаля). Оно обеспечивает средство сбора в одну
структуру набора различных типов данных.
На каждое поле в записи ссылаются следующим способом
record.field.
Когда объявлено, опция Packed, Delphi минимизирует память,
отведенную под запись.
Эти сокращения в памяти повлиять на выполнение, где данные не
выстроены, соответственно, по 2, 4 или 8 байт. По умолчанию должно выровняться,
где необходимо, с заполнителями.
Есть два основных типа полей записи, как показано в двух
синтаксических типах:
. Простое объявление поля
Это стандартные объявления переменных Delphi, типа:: Integer;
за исключением того, что их размер должен быть определен.
Например:: string[20];
потому, что Delphi должен знать точный объём памяти
необходимый этому полю в записи.
. Выбираемые (Различные) разделы поля
Они должны всегда следовать за любыми основными объявлениями
полей (ключевое слово Case не имеет закончившего слова End;).
Они позволяют различным, альтернативным типам данных заменять
друг друга. Например, запись пациента может иметь различный раздел объявлений
для женщин по сравнению с мужчинами. Использование той же самой записи с
Variant частью является разумнее.
По умолчанию, поля в записи выравниваются по Byte и Word
границам. Для обоих типов записи, опция packed позволяет ей быть изменённой,
чтобы уменьшить требуемый объём памяти.использованием ключевого слова With, к
полям записи можно обращаться без указания префикса каждый раз с названием
поля.
В отличие от Объектно-ориентированных языков подобно Java,
Тип Record в Delphi обеспечивает лучший механизм выполнения для передачи
подобных групп данных чем классы данных.
Указатели
Указатель - величина, которая указывает на некий адрес в
памяти, где хранятся некоторые данные. Указатели бывают двух видов:
типизированные, указывающие на данные определенного типа, и нетипизированные
(типа pointer), которые могут указывать на данные произвольного типа. Наиболее
часто указатели используются при работе:
- с объектами в динамически распределяемой
памяти. Динамически распределяемая память это создание новых объектов по мере
надобности. По сути это некая структура данных, которая описывается один раз и
по мере надобности вызывается в программе с присваиванием новых значений. В
следствии можно освободить занятую область памяти;
- при работе с записями. Для реализации
динамического размещения записи применяют самоадресуемую запись. Записи
снабжаются полями, поля имеют указатель на следующую запись. Применяется для
удобства перестановки записей или удаления. Для этого формируется список записей
посредством цикла по указателям.
Для первого случая выделение памяти можно осуществить при
помощи процедуры: procedure New <имя указателя>); Во втором случае
выделение памяти для новой записи воспользуемся New(pr), соответственно описать
ее:
New(pr);pr^ do:=….;:=….;:=….;;
В Object Pascal существует предопределенные типы указателей переменных: AnsiString,
ByteArray, Currency Extended, Ole Variant, ShortString, TVarRec, Variant,
WideString, TWordArray. Для обозначения типа указателя достаточно соответственно поставить
«P» перед типом переменной (пример: PByteArray).
Для объявления своего указателя на любой тип используется
конструкция вида: type <имя указателя> = ^<тип данных>.
Списки
Класс TList очень полезный универсальный контейнер списков.
Он отличается от массивов, в которых он обеспечивает более богатые
функциональные возможности.
В частности объекты TList могут быть отсортированы. Эта
сортировка может быть с использованием любых выбранных критериев. Например,
список может содержать набор объектов, которые имеют строку и численные поля.
Вы можете отсортировать список по строке, по числу, по обоим, с возрастанием
или убыванием, как Вы желаете. И пересортировать позже по другим критериям.
Показанный пример кода показывает такую сортировку.
Ключевые свойства и методы упомянуты ниже.
Свойство Capacity - Используется для установления размера
(число указателей на объекты) списка. Предварительно установив в разумное
значение, можно избежать множественных перераспределений памяти.
Свойство Count - Число элементов (указателей) в списке. Может
быть прочитано или записано. Если размер уменьшен в результате изменения
значения Count, то удаляются элементы в конце списка.
Свойство Items - Позволяет обращаться к элементам в списке.
Например, myList. Items[2]; возвращает 3-ий элемент в списке. Это свойство,
заданное по умолчанию, вышеупомянутое может быть упрощено до myList[2];.
Свойство List - Возвращает элементы в массиве.
Метод Add - Добавляет элемент в конец списока.
Метод Assign - Заменяет список содержанием другого списка.
Метод Clear - Удаляет все элементы списка, устанавливая Count
в 0.
Метод Delete - Удаляет элемент из списка по его позиции в
списке.
Метод Remove - Удаляет элемент из списка по его объектному
указателю.
Метод Exchange - Меняет позиции двух элементов
Метод Move - Перемещает элемент в новую позицию списка.
Метод Insert - Вставляет новый элемент в список в данную
позицию.
Метод First - Получает первый элемент в списке.
Метод Last - Получает последний элемент в списке.
Метод Sort - Сортирует список в соответствии с вашими
указанными критериями. Сортировка списка проводится внутри TList, но каждая
пара элемента сравнивается, вызывая функцию, которую вы указали для этого
метода.
Метод IndexOf - Выдает позицию указанного объекта в списке.
Модули
В состав среды Delphi входит великолепный набор модулей,
возможности которых удовлетворят даже самого привередливого программиста. Все
модули можно разбить на две группы: системные модули и модули визуальных
компонентов.
К системным модулям относятся System, SysUtils, ShareMem,
Math. В них содержатся наиболее часто используемые в программах типы данных,
константы, переменные, процедуры и функции. Модуль System - это сердце среды
Delphi; содержащиеся в нем подпрограммы обеспечивают работу всех остальных
модулей системы. Модуль System подсоединяется автоматически к каждой программе
и его не надо указывать в операторе uses.
Модули визуальных компонентов (VCL - Visual Component
Library) используются для визуальной разработки полнофункциональных
GUI-приложений - приложений с графическим пользовательским интерфейсом
(Graphical User Interface). Эти модули в совокупности представляют собой
высокоуровневую объектно-ориентированную библиотеку со всевозможными элементами
пользовательского интерфейса: кнопками, надписями, меню, панелями и т.д. Кроме
того, модули этой библиотеки содержат простые и эффективные средства доступа к
базам данных. Данные модули подключаются автоматически при помещении
компонентов на форму, поэтому вам об этом заботиться не надо. Их список слишком
велик, поэтому мы его не приводим.
Все основные модули среды Delphi, включая модули визуальных
компонентов, поставляются вместе с их исходными текстами на языке Delphi. По
мере роста вашего профессионального опыта мы рекомендуем чаще обращаться к этим
исходным текстам. Во-первых, в них вы найдете ответы на многие вопросы о
внутреннем устройстве среды Delphi, а во-вторых, они послужат образцовым
примером профессионального подхода в решении широкого круга задач. И,
в-третьих, что не менее важно, это поможет научиться красиво и правильно
2.
Специальная часть
.1 Общая постановка задачи
Разработать программный комплекс «Автоматизирываное рабочие
место дистпечера автопарка», который обеспечит создание и все операции по ведению базы
данных, включающих в себя следующие файлы:
1. Сотрудники (Фамилия Имя Очество, Дата рождения,
должность, образование, стаж);
2. Зарплата (Фамилия Имя Очество, должност, зарплата за
год, зарплата за месяц);
. Маршруты (номер маршрута, маршрут, начальная и
коечная станции, Время начало и окончания следования)
. Машины (Модели, дата поступления, последние ТО).
Обеспечить
решение задач с выдачей соответствующих документов:
1. Поиск сотрудника по следующим полям: Ф.И.О., адресс,
должность;
2. Вывод количества сотрудников;
. Вывод максимального стажа среди сотрудников;
. Вывод максимальной зарплаты за месяц;
. Распечатка необходимых машин на принтере.
Описание программ и процедур комплекса
Описание процедур и функций комплекса приведено в таблице
2.1.
Таблица 2.1. - Описание процедур и функций программного
комплекса
Процедура/программа
|
Назначение
|
Unit1
|
Окно ввода
пароля
|
Unit2
|
Основное окно
программы
|
Unit3
|
Бд сотрудников
|
Unit4
|
Бд Зарплаты
|
Unit5
|
Бд Машин
|
Unit6
|
Бд маршрутов
|
Описание наборов данных
Описание наборов данных представлены в таблице 2.2
Таблица
2.2 - Описание наборов данных
Идентификатор
|
Физическое имя
|
Название
|
Тип
|
Том
|
Marsh
|
Marsh. DB
|
Маршруты
|
Типизированный
Record
|
C:\
|
mashini
|
mashini. DB
|
Машины
автопарка
|
Типизированный
Record
|
C:\
|
zarplata
|
Zarplata.DB
|
Зарплта
сотрудников
|
Типизированный
Record
|
C:\
|
Sotrdniki
|
Sotrudniki. DB
|
Сотрудники
|
Типизированный
Record
|
C:\
|
Структура записей файлов
Структура записей файла «БД сотрудники» описана в таблице 3.
Таблица
2.3 - Структура записи файла
Идентификатор
|
Назначение
|
Длина
|
F.I.O
|
Фамилия Имя
Отчество
|
String
|
30 байт
|
Data_rozhdeniya
|
Дата Рождения
|
Real
|
16 байт
|
Telephone
|
Тедефон
|
String
|
8 байт
|
Dolzhnost
|
Должность
|
String
|
15 байт
|
Obraz
|
Образование
|
String
|
10 байт
|
Adress
|
Адресс
|
String
|
30 байт
|
Структура записей файла «БД Марка Авто» описана в таблице 4.
Таблица
2.4 - Структура записи файла
Идентификатор
|
Назначение
|
Тип
|
Длина
|
Data
postuplenya
|
Дата
поступления
|
String
|
15 байта
|
Data
posled TO
|
Дата последнего
ТО
|
String
|
4 байт
|
Model
|
Модель
|
String
|
15 байт
|
Структура записей файла «БД Поставщики» описана в таблице 5.
Таблица
2.5 - Структура записи файла
Идентификатор
|
Назначение
|
Тип
|
Длина
|
F.I.O
|
Фамилия Имя
Отчество
|
String
|
30 байт
|
Data_rozhdeniya
|
Дата Рождения
|
Real
|
16 байт
|
Za
god
|
Зарплата за год
|
Real
|
8 байт
|
Dolzhnost
|
Должность
|
String
|
15 байт
|
Za
mesyac
|
Зарплата за
месяц
|
Real
|
10 байт
|
Таблица компонент
Описания
компонент проекта представлены в таблице 2.6
Таблица 2.6 - Описания компонент проекта
Компонент
|
Тип
|
Свойство
|
Значение
|
Событие
|
Button1
|
TButton
|
Caption
|
Выход
|
OnClick
|
Edit1
|
TEdit
|
text
|
-
|
-
|
SpeedButton1
|
TSpeedButton
|
Glyph
|
Кнопка
|
-
|
PageControl
|
TPageControl
|
-
|
-
|
-
|
DataSource1
|
TDataSource
|
DataSet
|
-
|
-
|
DBGrid
|
TDBGrid
|
DataSource
|
-
|
-
|
DBNavigator
|
TDBNavigator
|
DataSource
|
Навигатор
|
-
|
DBImage1
|
TDBImage
|
DataSource
|
Изображение
|
-
|
Table1
|
TTable
|
DataBaseName
|
Таблица
|
-
|
OpenPictureDialog1
|
TOpenPictureDialog
|
-
|
-
|
-
|
2.2 Описание проблемной программы
Постановка проблемной программы №1
Организовать поиск по имени сотрудника.
Для поиска пользователю выдается окно табличного типа в окне
необходимо ввести марку машины и нажать Enter.
Постановка проблемной программы №2
Обеспечить решение задач с выдачей соответствующей информации
- вывод анкет сотрудников. Для этого пользователю выдается кнопка табличного
типа в ней записан пункт, для чего она необходима, при запуске кнопки, она
выводит информацию-отчет.
3. Организация производства
.1 Комплекс технических средств
Рекомендуемая конфигурация компьютера:
- BM PC - совместимый компьютер
с процессором Athlon 1600+ или выше;
- 512 Мбайт или выше оперативной памяти;
- 12 Мбайт или выше на жестком диске;
- ОС MS DOS 6.22;
- Клавиатура.
3.2 Инструкция пользователю
Для запуска программного комплекса пользователю необходимо
запустить файл dbtat. Окно ввода пароля представлено на рисунке 3.1
Рисунок 3.2
Если пароль введен не верно, выводится сообщение.
Рисунок 3.3
Если пароль введен верно, то вы перейдете в окно главного
меню рисунок 3.3
Рисунок 3.4
В нем можно выбрать 4 БД в верхнем углу окна программы
Рисунок 3.5
При выборе 1 из пунктов меню вы будете перемещены в 1 из БД
или в меню ввода пароля
Рисунок 3.6
Поиск ищет сотрудника по 3 полям: Имя фамилия Отчество
(Ф.И.О.), Адресс, должность.
Если такой записи нет будет выведено сообщение на рисунке 3.7
Рисунок 3.7
Заключение
По истечению срока курсовой, я освоил новые этапы работы с
программным языком Delphi, поднял благодаря практическим занятиям сноровку в отношении
функций и других видов деятельности в создании программ, теперь я уверен что
осознанно могу создать программы идентичные по свойствам с программами
созданными во время практики, а так же поверх них имея опыт и в других типах
функций и операторов написания программ.
Список литературы
1. Архангельский А.Я. Программирование в Delphi 6.-M.:ЗАО «Издательство
БИНОМ» 2003 г.
2. Гутман Г.Н. Статья в газете «Информатика»
№21, 2003 г.
. Иллюстрированный самоучитель по Delphi 6, 2002 г.
. Иллюстрированный самоучитель по Delphi 7 для профессионалов.
. Куандыков А.А. Создание системы базы
данных в среде Delphi: учебное пособие. Алматы: 2006 г.
. Малышев О.В. Справочная система по DELPHI. Версия 1.0. 1999 г.
. Попов В.Б. Turbo Pascal для школьников, M.: <<Финансы и статистика>>,
2003 г.
. Пинкус М. Электронный учебник 32 урока
по Delphi: электронная библиотека InfoCity.
. Фаронов В.В. Delphi 2005 разработка
приложений для баз данных и интернета.
СПб.: Питер, 2006 г.
10. Фаронов В.В. Turbo Pascal 7/0, 2001 г.
11. Фленов М.Е. Базы данных в среде Delphi 3, 2003 г.
Приложение
Листинг программы
program Project1;
uses,in 'Unit1.pas' {Form1},in 'Unit2.pas'
{Form2},in 'Unit3.pas' {Form3},in 'Unit4.pas' {Form4},in 'Unit5.pas' {Form5},in
'Unit6.pas' {Form6};
{$R *.res}. Initialize;. CreateForm (TForm1,
Form1);. CreateForm (TForm2, Form2);. CreateForm (TForm3, Form3);. CreateForm
(TForm4, Form4);. CreateForm (TForm5, Form5);. CreateForm (TForm6, Form6);.
Run;.Unit1;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,,
StdCtrls, jpeg, ExtCtrls;= class(TForm): TEdit;: TButton;: TLabel;:
TImage;Button1Click (Sender: TObject);FormClose (Sender: TObject; var Action:
TCloseAction);
{Private declarations}
{Public declarations};: TForm1;Unit2;
{$R *.dfm}TForm1. Button1Click (Sender:
TObject);f:textfile;, pass:string;:integer;:boolean;(f,
'C:\Users\Bismarck\Desktop\курсовой\курс (остались
задачи)\Пароль.txt');(f);:=Edit1. Text; chk:= false;(not EOF(f)) and
(chk=false) DO(f, a);a=pass then chk:=true;;(chk=true) then form2.show('Неверный
пароль', mtinformation, [mbOK], 0);(f);. Hide;TForm1. FormClose (Sender:
TObject; var Action: TCloseAction);.close;;.TForm2.N3Click (Sender: TObject);.
Show;.hide;;TForm2.N4Click (Sender: TObject);.show;. Hide;;TForm2.N5Click
(Sender: TObject);.show;. Hide;;TForm2.N1Click (Sender: TObject);.show;.
Hide;;TForm2.N2Click (Sender: TObject);.show;. Hide;;.Unit3;, Messages,
SysUtils, Variants, Classes, Graphics, Controls, Forms,, DBCtrls, StdCtrls,
Mask, DB, ExtCtrls, Grids, DBGrids, DBTables,, Buttons;= class(TForm):
TDBGrid;: TDBNavigator;: TLabel;: TDBEdit;: TLabel;: TDBEdit;: TLabel;:
TDBEdit;: TLabel;: TDBEdit;: TLabel;: TDBEdit;: TLabel;: TDBEdit;: TLabel;:
TDBEdit;: TLabel;: TDBEdit;: TLabel;: TDBEdit;: TLabel;: TLabel;: TDBImage;:
TButton;: TOpenPictureDialog;: TRadioGroup;: TEdit;: TLabel;: TSpeedButton;:
TButton;: TDataSource;: TQuery;: TTable;: TButton;: TLabel;: TLabel;: TLabel;:
TLabel;FIO: TStringField;Obraz: TStringField;Adress: TStringField;Telefon:
TFloatField;Dataroj: TDateField;Mesyzcroj: TDateField;Godroj:
TDateField;Doljnost: TStringField;Staj: TStringField;Foto: TStringField;Rab:
TFloatField;Sotr: TFloatField;: TLabel;: TLabel;: TButton;:
TButton;Button1Click (Sender: TObject);Button2Click (Sender:
TObject);SpeedButton1Click (Sender: TObject);Button4Click (Sender:
TObject);Button3Click (Sender: TObject);Button5Click (Sender: TObject);
{Private declarations}
{Public declarations};: TForm3;Unit2;
{$R *.dfm}TForm3. Button1Click (Sender:
TObject);openpicturedialog1. Execute then.picture.loadfromfile
(openpicturedialog1. FileName);;;TForm3.
Button2Click (Sender: TObject);k:integer;. Table1. First;:=0;not (form3.
Table1. Eof) do:=k+StrToInt (form3. Table1.fieldByName('FIO').AsString);.
Table1. Next;;.caption:='кол-во рабов='+inttostr(k);;TForm3. SpeedButton1Click
(Sender: TObject);pole: Shortstring;RadioGroup1. ItemIndex OF
: Pole:='FIO';
: Pole:='Adress';
: Pole:='Doljnost';;not Table1. Locate (Pole,
edit1. Text, [locaseinsensitive, loPartialKey]) then('Нет такой записи!',
mtinformation, [mbOK], 0);;TForm3. Button4Click (Sender: TObject);max:integer;.
First;:=0;not (Table1. Eof) do(Table1. FieldByName('Staj').Value)>(max)
then:=table1.fieldbyname('Staj').Value;. Next;;.caption:='Самый большой стаж=
'+inttostr(max);;TForm3. Button3Click (Sender: TObject);k, k1, k2:integer;.
First;:=0;:=0;not (Table1. Eof) do:=k+Table1.
FieldbyName('Rab').AsInteger;:=k1+Table1.
FieldbyName('Sotr').Asinteger;:=k+k1;. Next;;.caption:='Количество
рабов='+InttoStr(k);17.caption:='Количество сотрудников='+InttoStr(k1);
Label18.caption:='Количество всего='+InttoStr(k2);
end;TForm3. Button5Click (Sender: TObject);.
Hide;. Show;;.Unit4;, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,, StdCtrls, Mask, DBCtrls, DB, DBTables, ExtCtrls, Grids, DBGrids;=
class(TForm): TDBGrid;: TDataSource;: TTable;Sotrdniki: TStringField;Doljnost:
TStringField;Zarplata: TCurrencyField;Zaprlatazagod: TCurrencyField;: TLabel;:
TDBEdit;: TLabel;: TDBEdit;: TLabel;: TDBEdit;: TLabel;: TDBEdit;: TButton;:
TButton;: TButton;: TButton;: TButton;: TButton;: TButton;: TButton;: TButton;:
TButton;: TLabel;: TLabel;: TButton;: TButton;Button1Click (Sender:
TObject);Button8Click (Sender: TObject);Button2Click (Sender:
TObject);Button7Click (Sender: TObject);Button6Click (Sender:
TObject);Button9Click (Sender: TObject);Button4Click (Sender:
TObject);Button5Click (Sender: TObject);Button3Click (Sender:
TObject);Button10Click (Sender: TObject);Button12Click (Sender: TObject);
{Private declarations}
{Public declarations};: TForm4;Unit2;
{$R *.dfm}TForm4. Button1Click (Sender:
TObject);. First;;TForm4. Button8Click (Sender: TObject);. Prior;;TForm4.
Button2Click (Sender: TObject);.last;;TForm4. Button7Click (Sender: TObject);.
Next;;TForm4. Button6Click (Sender: TObject);. Delete;;TForm4. Button9Click
(Sender: TObject);. Cancel;;TForm4. Button4Click (Sender:
TObject);.post;;TForm4. Button5Click (Sender: TObject);.insert;;TForm4.
Button3Click (Sender: TObject);. Edit;;TForm4. Button10Click (Sender:
TObject);max:integer;. First;:=0;not (Table1. Eof) do(Table1.
FieldByName('Zarplata').Value)>(max)
then:=table1.fieldbyname('Zarplata').Value;. Next;;.caption:='максимальная
зарплата= '+inttostr(max);;TForm4. Button12Click (Sender: TObject);. Hide;.
Show;;.Unit5;, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,, StdCtrls, Mask, DBCtrls, DB, DBTables, ExtCtrls, Grids, DBGrids;=
class(TForm): TDBGrid;: TDBNavigator;: TDataSource;: TTable;: TDBMemo;:
TDBEdit;: TDBEdit;: TDBEdit;: TDBEdit;: TDBEdit;: TLabel;: TLabel;: TLabel;: TLabel;:
TLabel;: TLabel;: TLabel;: TLabel;: TButton;Button1Click (Sender: TObject);
{Private declarations}
{Public declarations};: TForm5;Unit2;
{$R *.dfm}TForm5. Button1Click (Sender:
TObject);.hide;. Show;;.Unit6;, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,, StdCtrls, Mask, DBCtrls, DB, DBTables, ExtCtrls, Grids,
DBGrids;= class(TForm): TDBGrid;: TDBNavigator;: TDataSource;: TTable;Model:
TStringField;PoslednieTO: TStringField;Datapostupleniya: TStringField;:
TDBEdit;: TDBEdit;: TDBEdit;: TLabel;: TLabel;: TLabel;: TLabel;:
TButton;Button1Click (Sender: TObject);
{Private declarations}
{Public declarations};: TForm6;Unit2;
{$R *.dfm}TForm6. Button1Click (Sender:
TObject);. Hide;. Show;;
end.