
- •Основы программирования
- •Введение
- •Основы delphi
- •Общая технология программирования
- •Язык программирования
- •Объектно-ориентированное программирование
- •Визуальное программирование
- •Событийно управляемое программирование
- •Windows-приложение
- •Среда программирования
- •Первоначальные сведения о проекте приложения
- •Встроенный отладчик
- •Использование встроенных классов
- •Иерархия классов
- •Использование палитры компонентов и инспектора объектов
- •Использование графики
- •Основные инструменты
- •Основные характеристики шрифтов
- •Графические данные и палитра
- •Некоторые общие свойства компонентов
- •Сохранение проекта
- •Построение простейшего проекта
- •Понятие исключительной ситуации
- •Введение в object pascal
- •Структура приложения
- •Структура программы-проекта
- •Структура модуля
- •Пример 1
- •Описания программных элементов
- •Программные элементы и адреса памяти
- •Области видимости
- •Правила записи имен
- •Время жизни идентификаторов
- •Использование локальных переменных в примере 1
- •Использование глобальных переменных в примере 1
- •Простые типы
- •Целые типы
- •Целые типы
- •Некоторые операции с целым типом
- •Символьные типы
- •Логические типы
- •Тип перечень
- •Интервальный тип
- •Вещественный тип
- •Вещественные типы
- •Некоторые операции с вещественным типом
- •Тип дата-время
- •Выражения
- •Константы
- •Типизированные константы.
- •Переменные
- •Операции
- •Унарная операция not (отрицание)
- •Логические операции and, or, xor
- •Функции
- •Порядок вычисления выражений
- •Виды операторов
- •Простые операторы
- •Составной оператор
- •Операторы условного перехода
- •Оператор if
- •Пример 2
- •Оператор case
- •Пример 3
- •Использование enter в примере 3
- •Операторы цикла
- •Оператор цикла for
- •Пример 4
- •Оператор цикла while
- •Пример 5
- •Оператор цикла repeat
- •Пример 6
- •Использование процедур break и continue
- •Пример 7
- •Массивы
- •Статические массивы
- •Динамические массивы
- •Пример 8
- •Пример 9
- •Записи (объединения)
- •Оператор with
- •Пример 10
- •Совместимость и преобразование типов данных
- •Идентичность типов
- •Совместимость типов
- •Совместимость по присваиванию
- •Преобразование типов
- •Операторы обработки исключительных ситуаций
- •Пример 11
- •Множества
- •Операции над множествами
- •Пример 12
- •Вариантный тип данных
- •Процедуры и функции
- •Процедура
- •Функция
- •Рекурсия
- •Формальные и фактические параметры
- •Параметры-значения
- •Параметры-переменные
- •Параметры-константы
- •Параметры без типа
- •Массивы открытого типа
- •Парамеры по умолчанию
- •Процедура exit
- •Директивы подпрограммы
- •Соглашения по передаче данных
- •Директива forward
- •Директива external
- •Директива assembler
- •Перегруженные подпрограммы
- •Пример 13
- •Инкапсуляция
- •Класс как объектный тип
- •Наследование
- •Области видимости
- •Операции is и as
- •Виды методов
- •Методы virtual и полиморфизм
- •Методы dynamic
- •Методы message
- •Методы abstract
- •Методы override
- •Методы class
- •Пример 14
- •Динамическое создание компонентов
- •Использование класса со счетчиком объектов
- •Отслеживание разрушения объектов
- •События
- •Указатели на методы
- •Пример 15
- •Типы ссылки на класс
- •Свойства
- •Свойства simple
- •Свойства enumerated
- •Свойства set
- •Свойства object
- •Свойства array
- •Задание начальных значений свойствам
- •Пример 16
- •Файловые типы
- •Текстовые файлы
- •Типизированные файлы
- •Файлы без типа
- •Дополнительные процедуры и функции
- •Пример 17
- •Компонент tmainmenu
- •Указатели
- •Пример 18
- •Динамические структуры данных
- •Однонаправленные списки
- •Двунаправленные списки
- •Стеки, очереди
- •Бинарные деревья
- •Пример 19
- •Процедурный тип
- •Программные единицы dll
- •Пример 20
- •Технологии программирования
- •Потоки данных
- •Пример 21
- •Пример 22
- •Интерфейс drag and drop
- •Пример 23
- •Технология drag and dock
- •Пример 24
- •Использование функций windows api при работе с файлами
- •Пример 25
- •Использование отображаемых файлов
- •Пример 26
- •Программные потоки
- •Приоритеты потоков
- •Класс tthread
- •Пример 27
- •Использование блокировки в примере 27
- •Многопоточное приложение в примере 28
- •Проблемы синхронизации потоков
- •Список используемых в примерах компонентов
- •Список используемых компонентов и других классов
- •Библиографический список
- •Оглавление
Оператор цикла for
Оператор For позволяет организовать выполнение какого-либо другого оператора заранее заданное число раз. Существуют 2 варианта этого оператора:
For <управляющая переменная> := <Start> to <Finish> do <оператор>;
For <управляющая переменная> := <Start> downto <Finish> do <оператор>;
Управляющая переменная позволяет ограничить количество расчетов заданного оператора, которое зависит от значений выражений <Start> и <Finish>. Выражение <Start> определяет начальное значение управляющей переменной, выражение <Finish> – конечное значение. При каждой итерации управляющая переменная увеличивается на единицу в операторе А и уменьшает своё значение на единицу в операторе B. Как только значение управляющей переменной превзойдет значение <Finish> в операторе A (станет меньше в операторе B), цикл прекращается. Выражения <Start> и <Finish> должны возвращать значения порядкового типа - соответственно <управляющая переменная> должна также иметь порядковый тип. Например,
FOR I:= 1 TO 10 DO Y:=sin(X);
FOR I:= 10 DOWNTO 1 DO Y:=sin(X);
Если в самом начале цикла значение <Finish> будет больше, чем значение <Start> для оператора А или значение <Finish> меньше, чем <Start> для оператора B, то не будет выполнено ни одной итерации.
В Delphi скорость выполнения циклических вычислений оптимизирована, поэтому имеют место ограничения на управляющую переменную:
должна иметь порядковый тип;
должна быть объявлена в том же блоке, в котором помещен цикл, т. е. должна быть локальной.
Пример 4
Пусть требуется рассчитать табл. 10 и построить на экране дисплея график y = f(x) = sin(x). Шаг изменения координат x и y графика зададим в пикселах и пусть, h = 1. В данном случае имеют место два типа графиков: физический и дисплейный. Пусть X, Y, Н - координаты и шаг физического графика, x, y, h - координаты и шаг дисплейного графика. Прежде, чем рисовать график, необходимо выполнить преобразование физических координат в дисплейные (или масштабирование) так, чтобы дисплейный график верно отражал процесс, смоделированный физическим графиком. Физический график начинается в точке x = a и заканчивается в точке x = b. Пусть дисплейный график начинается в точке X = xn и продолжается до точки X = xk (рис. 16). Выберем следующую схему построения дисплейного графика:
Используя заданное h, находим текущее значение x;
Рассчитываем H и находим значение физической переменной X;
Определяем Y;
Преобразуем Y в y;
На экране дисплея отображаем полученную точку x и y.
Рис. 16. Физический и дисплейный графики.
Введем масштаб
my.
и запишем соотношение y
= myY.
Так как данное соотношение справедливо
для любой точки графика, необходимо,
чтобы оно выполнялось и при значении
ymax
= my
Ymax
(все значения
y
будут воспроизводиться на экране). Из
этого соотношения можно определить
масштаб my,
т.е.
.
Максимальное значение Ymax
в данном случае для функции sin(X)
равно 1, а для дисплейного графика ymax
задаётся, в общем случае, произвольно.
Теперь найдём соотношение между x и X (или между h и H, что одно и то же). Примем, чтобы количество точек по оси абсцисс для дисплейного и физического графиков было одинаковым. Чтобы это выполнялось, необходимо согласовать значение шага H для физического графика с выбранным h для дисплейного графика. Запишем
,
откуда
следует
,
обозначив
,
получим требуемое соотношение H = mxh.
Для размещения графика понадобится компонент TImage (страница Additional). Форма примера 4 приводится на рис. 17. Какие объекты используются в данном примере, можно найти в тексте программы.
Рис. 17. Форма к примеру 4.
Компонент TImage используется для рисования графических объектов и геометрических фигур. Полезным свойством компонента TImage является Canvas (холст), которое включает, в частности, свойства Pen, Brush. Канва имеет методы: MoveTo (используется для перемещения невидимого графического курсора в заданную точку) и LineTo (позволяет рисовать линии). Эти два метода используются для рисования графика на канве TImage. Координаты задаются в пикселах, горизонтальная ось направлена слева направо, вертикальная - сверху вниз. Вариант решения задачи приводится на рис. 18.
Рис. 18. Результат решения примера 4.
Выбраны следующие размеры для Image1: Width = 305, Height = 154. Ось абсцисс проведена при значении y0 = 75. Текст программы приведен ниже.
unit prim4;
interface
uses Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, Buttons,
ExtCtrls;
Type TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
BitBtn1: TBitBtn;
Edit1: TEdit;
Label1: TLabel;
Edit2: TEdit;
Label2: TLabel;
Image1: TImage;
Label3: TLabel;
Bevel1: TBevel;
procedure Edit1KeyPress(Sender: TObject;
var Key: Char);
procedure Button1Click(Sender: TObject);
end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Edit1KeyPress(Sender: TObject;
var Key: Char);
begin
if not (key in ['0'..'9','-','.',#8]) then key:=#0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var a,b:real;
xn,xk,y0,yk:integer;
mx,my:real;
x,y,ymax:real;
i:integer;
begin
xn:=15;
xk:=280;
y0:=75;
yk:=70;
a:=StrToFloat(Edit1.Text);
b:=StrToFloat(Edit2.Text);
ymax:=1.0;
{Зададим цвет и толщину пера}
Image1.Canvas.Pen.Color:=clBlack;
Image1.Canvas.Pen.Width:=1;
{Закрасим цветом фона предыдущий график}
Image1.Canvas.Brush.Color:=clWhite;
Image1.Canvas.Rectangle(0,0,Image1.Width,
Image1.Height);
{Рисуем оси координат}
Image1.Canvas.MoveTo(xn,y0);
Image1.Canvas.LineTo(xk,y0);
Image1.Canvas.MoveTo(xn,y0+yk);
Image1.Canvas.LineTo(xn,y0-yk);
{Проверяем, введено ли b < a}
if b>=a then begin
Label3.Caption:= 'Графика нет';
Exit;
end else Label3.Caption:= '';
{Устанавливаем цвет и толщину карандаша для графика}
Image1.Canvas.Pen.Color:=clRed;
Image1.Canvas.Pen.Width:=2;
mx:=(b-a)/(xk-xn);
my:=yk/ymax;
{Устанавливаем начальную точку графика}
Image1.Canvas.MoveTo(xn,y0-round(my*sin(a)));
{Строим график в цикле for}
for i:=1 to xk-xn do begin
x:=a+i*mx;
y:=my*sin(x);
Image1.Canvas.LineTo(xn+i,y0-round(y));
end;
end;
end.
В обработчике событий OnKeyPress учтено, что вводятся вещественные числа. Используемая функция Round(Z) преобразует вещественное число Z в целое с предварительным округлением. Для того чтобы возможно было неоднократное построение графика, необходимо стирать предыдущий график.