- •230100 Информатика и вычислительная техника
- •Введение
- •1.Функции
- •1.1. Создание пользовательских функций. Передача аргументов
- •1.2. Глобальные и локальные переменные
- •2.Процедуры
- •2.1. Пользовательские процедуры
- •2.2. Упреждающее объявление процедур и функций (forward)
- •3.Концепция типа данных
- •3.1. Абстракции в обработке информации
- •3.2. Понятие типа данных
- •3.3. Иерархия типов данных
- •3.4. Стандартные типы данных
- •3.5. Тип данных Boolean
- •3.6. Тип данных char
- •3.7. Ограниченные типы
- •4.Множества. Массивы
- •4.1. Операции над множествами
- •4.2. Массивы
- •4.3. Утверждения о массивах
- •5.Индуктивные функции на последовательностях (файлах, массивах)
- •5.1. Схема Горнера
- •5.2. Индуктивные функции
- •6.Записи
- •6.1. Представление сложных типов данных в памяти
- •6.2. Упаковка элементов сложных типов данных
- •6.3. Представление записей в памяти
- •7.Процедуры и функции
- •7.1. Создание пользовательских функций. Передача аргументов
- •7.2. Процедуры
- •7.3. Передача параметров по ссылке и значению
- •8.Основы объектно-ориентированного подхода
- •8.1. Основные положения объектно-ориентированного подхода
- •9.Конструкторы и деструкторы. Инкапсуляция
- •9.1. Хранение объектов в памяти. Доступ к свойствам из методов
- •9.2. Принцип инкапсуляции
- •9.3. Поля и свойства
- •10.Наследование и полиморфизм
- •10.1. Принцип полиморфизма
- •10.2. Виртуальные методы
- •10.3. Пример описания объекта
- •10.4. Параметры-процедуры
- •11.Основы программирования графики
- •11.1. Основные понятия компьютерной графики
- •11.2. Получение сведений о режимах экрана. Эффекты прозрачности
- •11.3. Графические построения
- •11.4. Построение графиков функций
- •11.5. Использование компонента tChart
- •11.6. Построение геометрических фигур
- •11.7. Обновление изображения
- •12.Построение динамических изображений
- •12.1. Анимация на основе операции xor
- •12.2. Буферизация фона
- •12.3. Работа с таймером
- •13.Динамические структуры данных
- •13.1. Размещение динамических переменных в памяти
- •13.2. Захват и освобождение динамической памяти
- •13.3. Нетипизированные указатели
- •14.Линейные списки: основные виды и способы реализации
- •14.1. Линейный список как абстрактный тип данных
- •14.2. Операции с динамическими массивами
- •14.3. Сортировка динамических массивов
- •14.4. Деревья
- •14.5. Потоки в памяти
- •15.Сортировка и поиск
- •15.1. Алгоритмы поиска
- •15.1.1Линейный поиск
- •15.1.2Двоичный поиск
- •15.1.3Поиск текстовых строк
- •15.2. Сортировка данных
- •15.2.1Сортировка массивов
- •16.Сортировка файлов. Рекурсия
- •16.1. Рекурсивные определения и алгоритмы
- •16.2. Программирование рекурсивных алгоритмов
- •16.3. Сортировка файлов
- •17.Файлы
- •17.1. Буферизация
- •17.2. Работа с текстовыми файлами
- •17.3. Работа с двоичными файлами данных
- •17.4. Нетипизированные файлы
- •17.5. Файловые потоки
- •18.Работа с файловой системой
- •18.1. Стандартные файловые диалоги
- •18.2. Получение сведений о дисках
- •18.3. Получение сведений о файлах
- •18.4. Сканирование дисков и директорий
- •19.Обработка исключительных ситуаций
- •19.1. Векторы прерываний
- •19.1.1Хранение данных в стеке
- •19.2. Контроль ввода-вывода
- •19.3. Обработка исключительных ситуаций в Delphi
- •20.Отладка программ
- •20.1. Интегрированная среда программирования
- •20.2. Инструменты отладки программ
- •20.3. Типичные ошибки в программировании
- •21.Принципы построения трансляторов
- •21.1. Синтаксис и семантика языков программирования
- •21.2. Структура языков программирования
- •21.3. Структура и организация работы транслятора
- •22.Параллельные процессы
- •22.1. Создание многопоточных приложений
- •22.2. Управление скоростью работы потоков
- •23.Модульные программы
- •23.1. Создание dll-библиотеки на Delphi
- •23.2. Вызов dll
- •23.2.1Статическое связывание
- •23.2.2Динамическое связывание
- •23.3. Отладка проектов с dll
- •23.4. Хранение форм в dll-библиотеках
- •24.Обмен данными между приложениями
- •24.1. Работа с буфером обмена
- •24.2. Основы ole-технологии
- •25.События и сообщения
- •25.1. Отправка и получение сообщений
- •25.2. Предотвращение повторного запуска программы
- •26.1. Основы com-технологии
- •26.2. Вывод отчета при помощи Microsoft Word
- •26.2.1Проверка наличия сом-сервера на компьютере
- •Общее правило: при работе с любым сом-сервером запретите пользователю им пользоваться, пока с сом-сервером работает ваша программа.
- •26.3. Подключение к сом-серверу Word из Delphi
- •26.4. Управление форматированием документа
- •26.5. Работа с таблицами
- •26.6. Запуск Word из внешней программы
- •26.7. Работа с AutoCad по com-технологии
- •27.Принципы организации реляционных баз данных
- •27.1. Основные сведения о базах данных
- •27.2. Проектирование структуры базы данных
- •27.3. Нормализация структур баз данных
- •28.Работа с локальными бд
- •28.1. Драйвер баз данных bde
- •28.2. Создание баз данных
- •29.Программная обработка локальных бд
- •29.1. Редактирование локальных бд
- •29.2. Вывод бд на экран
- •29.3. Цветовое выделение строк бд
- •30.Работа с распределенными бд
- •30.1. Основы языка sql
- •30.2. Понятие алиаса
- •30.4. Подключение к sql-серверу
- •31.Программная обработка данных в архитектуре "клиент – сервер"
- •31.1. Программный доступ к полям бд
- •31.2. Фильтрация и сортировка данных
- •32.Работа с нормализованными бд
- •32.1. Связывание таблиц
- •32.2. Вычисляемые поля
- •33.Субд Interbase
- •33.1. Работа с сервером Local InterBase
- •33.2. Утилита InterBase Server Manager
- •34.Работа с языком xml
- •34.1. Структура xml-документа
- •34.2. Использование xml в среде Delphi
- •34.3. Концепция dom - объектная модель документа
- •34.4. Использование xml
- •35.Основы программирования для Интернет
- •35.1. Работа с протоколом ftp
- •35.2. Передача файлов по ftp
- •Библиографический список
- •Приложение. Зарезервированные слова sql
- •Предметный указатель
10.3. Пример описания объекта
Рассмотрим построение объекта "регулируемый асинхронный электродвигатель". Прежде всего, определимся с его свойствами и методами. Регулируемый асинхронный электродвигатель" может иметь свойства "мощность", "частота вращения", "момент на валу", "напряжение питания", и методы "запустить двигатель", "сменить частоту вращения", "остановить двигатель".
Первый этап – выделение характерных свойств и методов реального объекта. Для электродвигателя примем следующее:
Свойства |
Методы |
Потребляемая мощность |
Включить двигатель |
Текущая частота вращения |
Изменить частоту вращения |
Направление вращения |
Остановить двигатель |
Номинальная частота вращения |
Изменить направление вращения |
|
Аварийный останов |
Методы "остановить двигатель" и "Аварийный останов" отличаются тем, что в первом случае напряжение питания снижается в плавно, а во втором – мгновенно.
На втором этапе нужно дать названия полям, в которых хранятся свойства, и методам, для каждого свойства выбрать подходящий тип данных, а для метода – установить, какая информация необходима для его выполнения. Разумеется, все названия должны даваться по правилам языков программирования – английскими буквами, без пробелов и т.д. Настоятельно рекомендуется использовать правильные английские слова:
Свойство реального объекта |
Название поля |
Тип данных |
Потребляемая мощность |
Power |
REAL |
Текущая частота вращения |
RPM |
WORD |
Направление вращения |
Direction |
Tdir |
Сигнал аварийного останова |
BR |
Boolean |
Номинальная частота вращения |
Nominal |
WORD |
Свойство BR будет устанавливаться в TRUE при подаче команды «Авария».
А как быть с типом данных направления вращения? Конечно, можно договориться, что, к примеру, "1" или True означает вращение по часовой стрелке, а "2" или False – против часовой, но это неудобно.
Нормальные люди поступают следующим образом: вводят свой перечислимый тип данных TDir:
TYPE TDir=(CLOCKWISE, COUNTERCLOCKWISE);
Обратите внимание, что название типа данных (TDir) может быть выбрано произвольно. Оно никак не связано с названием переменной Dir. Просто обычно названия типов начинают с буквы "Т", чтобы не путать их с именами переменных. Аналогично классу нашего объекта присвоим название TMotor.
Теперь в программе можно создавать переменные типа Tdir, которые принимают только два значения: CLOCKWISE и COUNTERCLOCKWISE.
Разберемся с полями и свойствами. В рассматриваемом примере свойствами, доступными для чтения и/или записи извне объекта, являются:
- текущая частота вращения n:WORD (чтение/запись);
- номинальная частота вращения Nominal:WORD (только чтение, ее вообще нельзя менять);
- текущая потребляемая мощность pwr:REAL (только чтение, так как она зависит от частоты);
- текущее направление вращения dir:TDir (чтение/запись).
Имена свойств не должны совпадать с именами полей. Так как номинальная частота вращения является константой, ее можно не объявлять как поле, а представить только как свойство. Зададим набор процедур и функций для чтения/записи свойств:
Имя свойства |
Процедура записи |
Функция чтения |
n |
PROCEDURE TMotor.Feed(newRPM:WORD); VAR i:WORD; s:INTEGER; BEGIN IF RPM-newRPM>0 THEN s:=-1 ELSE s:=1; FOR i:=1 TO ABS(RPM-newRPM) DO BEGIN if br then exit; RPM:=RPM+s; Sleep(10); p; Power:=GetPower END END;
|
FUNCTION TMotor.GetRPM:word;
begin result:=rpm end;
|
Nominal |
- |
FUNCTION TMotor.GetNominal: WORD;
begin result:=1000 end; |
pwr |
- |
FUNCTION TMotor.GetPower:REAL;
BEGIN GetPower:=формула расчета мощности END; |
dir |
PROCEDURE TMotor.Flip(newd:TDir); VAR oldRPM:WORD; BEGIN IF (RPM=0) or (direction=newd) THEN { мотор стоит? ничего не делаем } EXIT; oldRPM:=RPM; { запомнили текущую частоту } Feed(0); { остановились } Direction:=newd; Feed(oldRPM) { установили прежнее значение частоты } END; |
FUNCTION TMotor.GetDr: TDir;
begin result:=direction end; |
Функции, возвращающие значения полей, очевидны и в комментариях не нуждаются (главное, чтобы тип возвращаемого ими значения совпадал с типом данных соответствующего поля).
Рассмотрим более подробно процедуру изменения частоты вращения Feed. Ей на вход подается новое значение частоты NewRPM. Нужно иметь в виду, что частота может как увеличиваться, так и уменьшаться. Делать два цикла – один с TO, а другой с DOWNTO – неразумно. Лучше поступить следующим образом: ввести переменную s, принимающую значения +1 или –1 в зависимости от того, надо ли увеличивать или уменьшать значение частоты, а затем в цикле s добавлять к значению RPM.
Оператор
if br then exit;
обеспечивает выполнение аварийного останова: если поле br оказывается установленным в True, выполнение цикла (и всей процедуры) тут же прервется. Задержка (Sleep(10)) необходима для плавного разгона/торможения мотора. Строка Power:=GetPower обеспечивает пересчет потребляемой мощности при изменении частоты вращения. А что такое p? Очевидно, это вызов процедуры с именем p. Но откуда она взялась? Об этом чуть позже, в разделе 10.4
Процедура смены направления вращения Flip сначала проверяет, не остановлен ли двигатель (тогда нечего менять) и не совпадает ли требуемое направление вращения newd с уже имеющимся (тогда тоже ничего не надо делать). Затем запоминается текущая частота вращения, двигатель останавливается командой Feed(0), направление вращения меняется, и двигатель снова разгоняется до запомненной частоты.
Нашему объекту также потребуется конструктор, в котором будут заданы начальные значения полей (частота – 0, направление вращения – по часовой и т.д.) и пустой деструктор: объект не использует динамическую память.