
- •Основы программирования
- •Предисловие
- •Введение
- •1. Изучение интегрированной среды Delphi
- •Контрольные вопросы к главе 1
- •Задание к лабораторной работе № 1
- •2. Программирование линейных алгоритмов в системе Delphi
- •Контрольные вопросы к главе 2
- •Задания к лабораторной работе № 2
- •3. Программирование разветвленных алгоритмов в системе Delphi
- •Контрольные вопросы к главе 3
- •Задания к лабораторной работе № 3
- •4. Программирование простых циклических алгоритмов в системе Delphi
- •Контрольные вопросы к главе 4
- •Задания к лабораторной работе № 4
- •5. Программирование с использованием одномерных массивов в системе Delphi
- •Контрольные вопросы к главе 5
- •Задания к лабораторной работе № 5
- •6. Программирование с использованием двумерных массивов в системе Delphi
- •Контрольные вопросы к главе 6
- •Задания к лабораторной работе № 6
- •7. Программирование в системе Delphi с использованием подпрограмм
- •Контрольные вопросы к главе 7
- •Задания к лабораторной работе № 7
- •8. Изучение приемов работы с графикой в delphi
- •Контрольные вопросы к главе 8
- •Задания к лабораторной работе №8
- •9. Программирование в системе Delphi с помощью строк
- •Контрольные вопросы к главе 9
- •Задания к лабораторной работе №9
- •10. Изучение работы с файлами в системе delphi
- •Контрольные вопросы к главе 10
- •Задания к лабораторной работе №10
- •Заключение
- •Библиографический список
- •Предметный указатель
- •Delphi: основы программирования
Контрольные вопросы к главе 1
Какие этапы работы по созданию приложений можно выполнять с помощью IDE?
Для чего предназначен инспектор объектов?
Каким образом используется палитра компонентов?
Для чего используется панель инструментов?
Каким образом переключаются окна проектировщика форм и редактора кода?
Каким образом вставляется обработчик событий в код программы?
Как создать новый проект?
Как сохранить проект?
Каким образом открыть существующий проект?
Какие основные части содержит простая программа на Delphi?
Верно ли, что каждая форма должна иметь свой модуль Unit?
Верно ли, что каждый модуль Unitдолжен иметь форму?
Каким образом запустить проект только на компиляцию?
Каким образом запустить проект на компиляцию и выполнение?
Как используются контрольные точки для отладки программ?
Как используется окно WatchListв процессе отладки?
Как использовать пошаговый режим при отладке программ?
Каким образом можно использовать компонент Edit?
Каким образом можно использовать компонент Label?
Каким образом можно использовать компонент Button?
Задание к лабораторной работе № 1
Разработать программу сложения двух чисел:
Разместить на форме три компонента Label, три компонентаEditи два компонентаButton. Изменить свойстваCaptionилиTextэтих компонентов.
С кнопкой Button1 связать обработчик события OnClick и в теле обработчика события поместить следующие команды:
procedure TForm1.Button1Click(Sender: TObject);
var x,y,f : integer;
begin
{преобразовываем текст из Edit1 в целое число}
x := StrToInt(Trim(Edit1.Text));
{преобразовываем текст из Edit2 в целое число}
y := StrToInt(Trim(Edit2.Text));
{вычисление f}
f:=x+y;
{преобразовываем число f в строку и показываем результат в Edit3}
Edit3.Text:= IntToStr(f);
end;
С кнопкой Button2 связать обработчик события OnClick и в теле обработчика события поместить команду Close.
Сохранить проект на диске.
Откомпилировать проект.
Запустить проект на выполнение. Ввести исходные данные в Edit1 и Edit2. Убедиться, что при щелчке левой кнопкой мыши на кнопке Button1 в Edit3 выводится результат вычислений.
Убедиться, что при щелчке левой кнопкой мыши на кнопке Button2 проект закрывается.
Оформить отчет.
Подготовиться по контрольным вопросам к защите работы.
2. Программирование линейных алгоритмов в системе Delphi
Данный раздел посвящен изучению и приобретению навыков программирования линейных алгоритмов, освоению оператора присваивания, операторов ввода (компонент Edit) и вывода (компоненты Label и Edit), типов данных, арифметических операций и функций языка Delphi
Файлы, создающиеся Delphi при проектировании приложения
Проект Delphi состоит из форм, модулей, установок параметров проекта, ресурсов и т. д. Вся эта информация размещается в файлах. Многие из этих файлов создаютсяDelphi, когда вы строите ваше приложение. Ресурсы, такие, как битовые матрицы, пиктограммы и т. д., находятся в файлах, которые вы получаете из других источников или создаете при помощи многочисленных инструментов и редакторов ресурсов, имеющихся в вашем распоряжении. Кроме того, компилятор также создает файлы.
Файл проекта (.dpr)
Этот файл используется для хранения информации о формах и модулях. Вы также найдете здесь операторы инициализации.
Файл модуля (.pas)
Этот файл используется для хранения кода модулей. Некоторые модули связаны с формами; в некоторых хранятся только функции и процедуры.
Файл формы (.dfm)
Это двоичный файл, который создается Delphiдля хранения информации о ваших формах. Каждому файлу формы соответствует файл модуля (.pas).
Файл параметров проекта (.dfo)
В этом файле хранятся установки параметров проекта.
Файл информации о пакетах (.drf)
Этот бинарный файл используется Delphiпри работе с пакетами.
Файл ресурсов (.res)
Этот бинарный файл содержит используемую проектом пиктограмму. Этот файл не должен изменяться или создаваться пользователем, так как Delphiпостоянно модифицирует и пересоздает этот файл.
Файлы резервных копий (.dp, .df, .pa)
Это соответственно файлы резервных копий для файлов проекта, формы и модуля.
Файлы, создающиеся компилятором
Исполняемый файл (.exe)
Это исполняемый файл вашего приложения. Он является автономным исполняемым файлом, для которого больше ничего не требуется, если только вы не используете библиотеки, содержащиеся в DLL, OCX и т.д.
Объектный файл модуля (.dcu )
Это откомпилированный файл модуля (.pas), который компонуется в окончательный исполняемый файл.
Динамически присоединяемая библиотека (.dll)
Этот файл создается в случае, если вы проектируете свою собственную DLL.
Файл проекта представляет собой программу, написанную на языке Object Pascal и предназначенную для обработки компилятором:
program Project1;
uses
Forms,
Unit1 in ‘Unit1.pas’ {Form1};
{$R*.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Модуль – программная единица, предназначенная для размещения объектов программы. С помощью содержащегося в модуле программного кода реализуется алгоритм решения задачи. Модуль может состоять из четырех разделов: двух обязательных (nterface, implementation) и двух необязательных (initialization,finalization). В разделеnterface размещаются описания констант, типов, переменных, заголовки процедур и функций, которые должны быть доступны всем модулям и программам, использующим этот модуль и содержащим его имя в спискеuses. Разделimplementationназывается разделомреализации. В разделеimplementationможно размещать описания констант, типов, переменных, процедур и функций, которые используются только в этом модуле и за его пределами не видны. Также в этом разделе располагаются процедуры и функции, заголовки которых были приведены в разделеnterface. В разделеинициализации (initialization) размещаются инструкции, которые выполняются в начале работы программы. Разделы инициализации модулей выполняются в том порядке, в котором модули перечислены в спискеusesпрограммы. В разделедеинициализации(finalization) располагаются инструкции, которые выполняются при завершении программы. Разделы деинициализации модулей выполняются в обратном порядке списка модулей в директивеusesпрограммы.
Структура модуля:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls;
type
TForm1=class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var // Раздел описания переменных
Form1: TForm1;
implementation
{$R*.dfm}
{ В этом месте размещается программный код, реализующий алгоритм решения задачи }
end.
Любые данные (такие, как константы, переменные, свойства, значения функций или выражения) в Object Pascalхарактеризуются своими типами. Тип определяет множество допустимых значений, а также множество допустимых операций, которые применимы к нему. Кроме того, тип определяет также и формат внутреннего представления данных в памяти ПК (рис 2.1).
Рис. 2.1. Структура простых типов данных
Порядковые типы
Порядковые типыотличаются тем, что каждый из них имеет конечное число возможных значений. С каждым значением можно сопоставить некоторое целое число – порядковый номер значения.
Функции для работы с порядковыми типами:
Low(T) − минимальное значение данных типаT;
High(T) − максимальное значение данных типаT;
Ord (Х) – возвращает порядковый номер значенияХ;
Pred (Х) –возвращает предыдущее значение порядкового типа;
Succ (Х) – возвращает следующее значение порядкового типа.
Целые типы
Приведем названия целых типов данных, длину их внутреннего представления в байтах и диапазон возможных значений (табл. 2.1).
Таблица 2.1
Целые типы
Название |
Длина, байт |
Диапазон |
Byte |
1 |
0..255 |
ShortInt |
1 |
–128..+127 |
SmallInt |
2 |
–32768..+32767 |
Word |
2 |
0..65535 |
Integer |
4 |
–2147483648..+2147483647 |
LongInt |
4 |
–2147483648..+2147483647 |
Cardinal |
4 |
0..4294967295 |
Int64 |
8 |
-263.. 263-1 |
Перечень процедур и функций, применимых к целочисленным типам, приведен ниже (табл. 2.2). Буквами b,s,w,i,lобозначенывыражениясоответственно типаByte,ShortInt,Word,IntegerиLongInt, х – выражение любого из этих типов; буквыvb,vs,vw,vi,vl,vxобозначаютпеременныесоответствующих типов. В квадратных скобках указывается необязательный параметр.
Таблица 2.2
Стандартные процедуры и функции, применимые к целым типам
Обращение |
Тип результата |
Действие |
Abs(x) |
Как у параметра |
Возвращает модуль х |
Chr(x) |
Char |
Возвращает символ по его коду |
Dec(vx[,i]) |
– |
Уменьшает значение vx на i, а при отсутствии i на 1 |
Inc(vx[,i]) |
– |
Увеличивает значение vx на i, а при отсутствии i на 1 |
Hi(w) |
Byte |
Возвращает старший байт аргумента |
Hi(i) |
Byte |
Возвращает третий по счету байт |
Окончание табл. 2.2
Обращение |
Тип результата |
Действие |
Lo(i) |
Byte |
Возвращает младший байт аргумента |
Lo(w) |
Byte |
Возвращает младший байт аргумента |
Odd(l) |
Boolean |
Возвращает True, если аргумент – нечетное число |
Random(w) |
Как у параметра |
Возвращает случайное число из диапазона 0 .. (w–1) |
Sqr(x) |
Как у параметра |
Возвращает квадрат аргумента |
Swap(i) |
Integer |
Меняет местами байты в слове |
Swap(w) |
Word |
То же |
Логические типы
К логическим типам данных относятся типы Boolean (1 байт), ByteBool (1 байт), Bool (2 байта), WordBool (2 байта), LongBool (4 байта). Значениями логического типа может быть одна из предварительно объявленных констант False (ложь) или True (истина). Для них справедливы правила:
Ord (False) = 0;
Ord (True) <> 0;
Succ (False) = True;
Pred (True) = False.
Символьные типы
Значением символьного типа является множество всех символов ПК. Каждому символу приписывается целое число в диапазоне 0..255. Это число служит кодом внутреннего представления символа, его возвращает функция Ord ( ). Ксимвольным типамданных относятся типыChar,ANSICharиWideChar.Символьный тип – Char предназначен для хранения одного символа. В памяти ПК символ занимает один байт. Один байт–это 256 (28) различных символов, которые можно хранить в переменнойChar. Эти символы составляют символыASCII от 0 до 255. ТипCharэквивалентен типуANSIChar. ANSIChar –это 8-битный ANSI-символ. Третий символьный тип–WideChar, представляет собой 16-битный символьный тип. Эти три разных символьных типа введены для совместимости.Delphi поддерживает стандартUnicode. Эта поддержка осуществляется типомWideChar. СимволUnicodeиспользует все 16 бит типаWideChar. ХотяWindows NTсогласован сUnicode, ноWindows 95–нет. Если вы пишете приложения, которые собираетесь использовать на обеих системах, используйте функциюSizeOf( ).
К типу Char применимы операции отношения, а также встроенные функции:
Chr (B)–преобразует выражениеВтипа Byteв символ и возвращает его своим значением;
UpCase (СН)–возвращает прописную букву, еслиСН –строчная латинская буква, в противном случае возвращает сам символ СН (для кириллицы возвращает исходный символ).
Перечисляемый тип
Перечисляемый типзадается перечислением тех значений, которые он может получать. Каждое значение именуется некоторым идентификатором и располагается в списке, заключенном в круглые скобки:
type
colors = (red, white, blue);
vara:colors;
Соответствие между значениями перечисляемого типаи порядковыми номерами этих значений устанавливается порядком перечисления: первое значение в списке получает порядковый номер 0, второе – номер 1 и т.д. Максимальная мощность перечисляемого типа составляет 65536 значений.
Тип-диапазон
Тип-диапазонесть подмножество своего базового типа, в качестве которого может выступать любой порядковый тип, кроме типа-диапазона. Тип-диапазон задается границами своих значений внутри базового типа:
<мин.знач.>..<макс.знач.>
Здесь <мин.знач.>..<макс.знач.> –соответственно минимальное и максимальное значения типа-диапазона.
Примечания:
1. Два символа «..» рассматриваются как один символ, поэтому между ними недопустимы пробелы;
2. Левая граница не должна превышать его правую границу.
Тип-диапазон можно описывать непосредственно при объявлении переменной:
var
date : 1..31; .
Функции, поддерживающие работу с типами-диапазонами:
High(x) – возвращает максимальное значение типа-диапазона.
Low(x)–возвращает минимальное значение типа-диапазона.
Вещественные типы
В отличие от порядковых типов, значения которых всегда сопоставляются с рядом целых чисел и представляются в ПК абсолютно точно, значения вещественных типовопределяют произвольное число лишь с некоторой конечной точностью, зависящей от внутреннего формата вещественного числа.
Приведем названия вещественных типов, длину их внутреннего представления в байтах и диапазон возможных значений (табл. 2.3).
Таблица 2.3
Вещественные типы
Название |
Длина, байт |
Количество знач. цифр |
Диапазон |
Real48 |
6 |
11..12 |
2,9∙10-39..1,7∙1038 |
Single |
4 |
7..8 |
1,7∙10-45..3,4∙1038 |
Double |
8 |
15..16 |
5,0∙10-324..1,7∙10308 |
Real |
8 |
15..16 |
5,0∙10-324..1,7∙10308 |
Extended |
10 |
19..20 |
3,6∙10-4951..1,1∙104932 |
Comp |
8 |
19..20 |
–263..+263–1 |
Currency |
8 |
19..20 |
922 337 203 685 477,5807 |
Особое положение занимают типы CompиCurrency, которые трактуются как вещественные числа с дробными частями фиксированной длины. Тип Currency используется для представления денежных сумм. Это тип с плавающей запятой, совместимый со всеми другими типами с плавающей запятой. Тип Currency имеет точность четыре десятичных разряда после точки и хранится как64-битовое целое, в котором четыре наименьших значащих цифры представляют четыре дробных десятичных разряда.
Для работы с вещественными данными могут использоваться встроенные математические функции, представленные ниже (табл. 2.4). В этой таблице real означает любой вещественный тип, integer – любой целый тип.
Таблица 2.4
Стандартные математические функции
Обращение |
Тип аргумента |
Тип результата |
Примечание |
Abs(x) |
real, integer |
Тип аргумента |
Модуль аргумента |
ArcTan(x) |
real |
real |
Арктангенс, значение в радианах |
Cos(x) |
real |
real |
Косинус, угол в радианах |
Exp(x) |
real |
real |
Экспонента |
Frac(x) |
real |
real |
Дробная часть числа |
Int(x) |
real |
real |
Целая часть числа |
Ln(x) |
real |
real |
Логарифм натуральный |
pi |
– |
real |
=3,141592653 |
Random |
– |
real |
Псевдослучайное число, равномерно распределенное в диапазоне 0 .. 1 |
Random(x) |
integer |
integer |
Псевдослучайное целое число, равномерно распределенное в диапазоне 0 .. (х–1) |
Randomize |
– |
– |
Инициация генератора псевдослучайных чисел |
Sin(x) |
real |
real |
Синус, угол в радианах |
Sqr(x) |
real |
real |
Квадрат аргумента |
Sqrt(x) |
real |
real |
Корень квадратный |
Trunc(x) |
real |
integer |
Усечение дробной части |
Round(x) |
real |
integer |
Округление числа х до ближайшего целого |
Тип TDateTime (дата-время)
Тип дата-время определяется идентификатором TDateTime и предназначен для одновременного хранения и даты, и времени. Во внутреннем представлении он занимает 8 байт и представляет собой вещественное число с фиксированной дробной частью: в целой части числа хранится дата, в дробной – время.
Над данными типа TDateTimeопределены те же операции, что и над вещественными числами, а в выражениях этого типа могут участвовать константы и переменные целого и вещественного типов.
Тип Variant
Тип Variantразработан специально для тех случаев, когда на этапе компиляции программист не может сказать, какие типы данных будут использоваться в выражении. ТипVariantможет хранить целое число (кромеInt64), строку, символ, логическое значение или вещественное число. Применение этого типа изменяется в зависимости от того, какого типа значение ему присваивается. Переменная типаVariantзанимает в памяти дополнительные два байта, в которые помещается информация о действительном типе переменной. Эта информация позволяет компилятору создать код, который будет осуществлять необходимое преобразование типов на этапе прогона программы.
В Delphi определены следующие операции:
1. Унарные:
not – отрицание;
@ – адрес.
2. Мультипликативные:
* – умножение;
/ – деление;
div – целочисленное деление;
mod – остаток от деления;
and – логическое И;
shl – левый сдвиг;
shr – правый сдвиг.
3. Аддитивные:
+ – сложение;
- – вычитание;
or – логическое ИЛИ;
xor – исключающее ИЛИ.
4. Отношения:
= – равно;
<> – не равно;
< – меньше;
> – больше;
<= – меньше или равно;
>= – больше или равно.
Приоритет операции убывает в указанном порядке, т.е. наивысшим приоритетом обладают унарные операции, низшим – операции отношения.
Логические операциинад логическими данными дают результат логического типа по правилам, указанным ниже (табл. 2.5).
Таблица 2.5
Логические операции над данными логического типа
Операнд 1 |
Операнд 2 |
not |
and |
or |
xor |
true |
– |
false |
– |
– |
– |
false |
– |
true |
– |
– |
– |
false |
false |
– |
false |
false |
false |
false |
true |
– |
false |
true |
true |
true |
false |
– |
false |
true |
true |
true |
true |
– |
true |
true |
false |
С помощью оператора присваивания переменной или функции присваивается значение выражения. Для этого используется знак присваивания :=, слева от которого записывается имя переменной или функции, которой присваивается значение, а справа – выражение, значение которого вычисляется перед присваиванием.
Допустимо присваивание значений переменным любого типа, за исключением типа файл. Тип переменной и тип выражения должны быть совместимы для присваивания. Например, если в левой части оператора присваивания находится переменная целого типа, то в правой части оператора нельзя использовать выражение вещественного типа.
Ввод и вывод данных
На странице Standardпалитры компонентов размещена компонентаEdit: текстовый редактор, предназначенный для ввода и (или) отображения одной текстовой строки. Щелкнув мышью по соответствующей пиктограмме, перенесите компонентуEditна форму. Изменить свойства компоненты (имя, размер и т.п.) можно, используяObjectInspector/Properties. Например, чтобы очистить строку ввода, в свойствеTextкомпонентыEditудалите содержащуюся там запись. Так как компонентаEditработает со строками, то, чтобы преобразовать текст из компонентыEdit(имяEdit1) в число, потребуются специальные процедуры и функции.
Например, выражения
y := StrToInt(Trim(Edit1.Text));
z := StrToFloat(Trim(Edit2.Text));
преобразуют строку Edit1.Textв переменную типаInteger и строкуEdit2.text в вещественную переменную типаReal. ФункцияTrimудаляет пробелы и управляющие символы в начале и в конце строки. Возможны и обратные преобразования:
Edit1.Text:=IntToStr(x);
Edit2.Text:=FloatToStr(y),
где x– переменная типаInteger;y– вещественная переменная типаReal. Функции преобразования чувствительны к возможным ошибкам символьного представления числа (ошибки в программе можно блокировать с помощью редактораMaskEdit и функцииTrim).
На странице Standard палитры компонентов размещена компонента Label– метка. Эта компонента используется для размещения в окне не очень длинных однострочных надписей. Щелкнув мышью по соответствующей пиктограмме, перенесите компонентуLabel на форму. Изменить свойства компоненты (имя, размер и т.п.) можно, используяObject Inspector/ Properties. Например, чтобы метка содержала текст, в свойствеCaption компонентыLabelудалите содержащуюся там запись и наберите необходимый текст.
На странице Standard палитры компонентов размещена компонента Button– стандартная кнопка. Чтобы на кнопке изменить надпись, в свойствеCaption компонентыButton наберите необходимый текст. Обработчик событияOnClickпоможет ввести исходные данные, выполнить вычисления и вывести на форму результаты. Для этого щелкните дважды по кнопкеButton. Delphiавтоматически подготовит заготовку процедуры, останется только вставить необходимые операторы. Структура процедуры может содержать следующие разделы:
//Раздел объявления меток
Label met1,met2;
//Раздел объявления констант
ConstA=5;B=2.8;
//Раздел описания типов
Type tx=array [0..4] of real;
//Раздел описания переменных
Vary:integer;x:tx;
//Раздел описания встроенных процедур и функций
//Раздел операторов
Begin
<Операторы языка программирования>
End;
Разделы описаний и объявлений могут использоваться в произвольном порядке и встречаться несколько раз. При этом нужно соблюдать правило: все описания и объявления элементов программы должны быть сделаны до того, как они будут использованы.
Пример программирования линейного алгоритма
Линейному алгоритму соответствует следующая типовая блок-схема (рис. 2.2).
Рис. 2.2. Типовая блок-схема линейного алгоритма
Задание.
Даны целые числа х, у. ВычислитьF=.
1. Разработка алгоритма (рис. 2.3):
а) входные данные: x,y– целые числа;
б) выходные данные: F – действительное число.
Рис. 2.3. Блок-схема алгоритма задачи
2. Разработка формы (рис. 2.4, табл. 2.6):
Рис. 2.4. Внешний вид формы
Таблица 2.6
Используемые компоненты
Имя компонента |
Страница палитры компонент |
Настраиваемые свойства |
Значение |
1. Form1 |
– |
Caption |
Пример лабораторной работы №2 |
2. Edit1 |
Standard |
Text |
|
3. Edit2 |
Standard |
Text |
|
4. Button1 |
Standard |
Caption |
Результат |
5. Label1 |
Standard |
Caption |
ВНИМАНИЕ! Вводить только целые числа! |
6. Label2 |
Standard |
Caption |
Введите x |
7. Label3 |
Standard |
Caption |
Введите у |
8. Label4 |
Standard |
Caption |
Для вывода результата – щелчок по кнопке «Результат» |
9. Label5 |
Standard |
Caption |
|
10. Label6 |
Standard |
Caption |
Ввод числа – клавиша TAB |
3. Текст программы:
unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{обработчик события OnClick}
procedure TForm1.Button1Click(Sender: TObject);
var x,y:integer; f:real;
begin
{преобразование текста из Edit1 в целое число}
x:= StrToInt(Trim(Edit1.Text));
{преобразование текста из Edit2 в целое число}
y:= StrToInt(Trim(Edit2.Text));
{вычисление f}
f:=(sqr(x)+sqrt(abs(y)))/(1+abs(x*y));
{преобразование числа f в строку и вывод результата}
label5.caption:=FloatToStr(f);
end;
end.