- •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
- •Предметный указатель
5.1. Схема Горнера
Рассмотрим еще один важный пример функции на последовательности. Пусть дана последовательность коэффициентов многочлена p(x) по убыванию степеней:
p(x) = a0xn +a1xn-1 + ... + an
Нужно вычислить значение многочлена в точке x=t. Алгоритм, основанный на просмотре последовательности коэффициентов в направлении от старшего к младшему, называется схемой Горнера. Проиллюстрируем его идею на примере многочлена третьей степени:
p(x) = ax3+bx2+cx+d
Его можно представить в виде
p(x) = ((ax+b)x+c)x+d
Для вычисления значения многочлена достаточно трех умножений и трех сложений. В общем случае, многочлен представляется в следующем виде:
p(x) = (...((a0x+a1)x+a2)x+...+an-1)x+an
Обозначим через pk(x) многочлен k-ой степени, вычисленный по коэффициентам a0, a1, ..., ak:
pk(x) = a0xk + a1xk-1 + ... + ak
Тогда
pk+1(x) = pk(x)x + ak+1
т.е. при вычислении нового коэффициента многочлена надо старое значение многочлена умножить на значение x, а затем прибавить к нему новый коэффициент.
Выпишем алгоритм:
вещ алгоритм схема Горнера(вх: цел n, вещ a[n+1], вещ t)
| дано: n -- степень многочлена
| a[n+1] -- массив коэффициентов многочлена по
| убыванию степеней
| надо: вычислить значение многочлена в точке t
начало алгоритма
| вещ p; цел i;
| p := 0.0; // Инициализация значения многочлена
| i := 0;
| цикл пока i <= n
| | p := p * t + a[i]; // Вычисление нового значения по
| | // старому значению и добавленному коэффициенту
| | i := i + 1;
| конец цикла
| ответ := p;
конец алгоритма
5.2. Индуктивные функции
В рассмотренных выше примерах при добавлении к последовательности еще одного элемента новое значение функции на последовательности можно было вычислить, зная только старое значение функции и добавленный элемент. Обозначим через Sn последовательность
Sn = {a0, a1, ..., an-1}
длины n. С помощью знака & обозначим операцию приписывания нового элемента справа к последовательности (ее называют также конкатенацией):
Sn+1 = Sn&an = {a0, a1, ..., an-1, an}
Пусть f(S) - некоторая функция на множестве последовательностей, например, сумма элементов последовательности. Функция называется индуктивной, если при добавлении нового элемента к последовательности новое значение функции можно вычислить, зная только старое значение функции и добавленный элемент. На математическом языке функция
f:W Y
где W - множество всех последовательностей, составленных из элементов некоторого множества X, индуктивна, если существует функция G от двух аргументов
G:Y*X Y
такая, что для любой последовательности S из W и любого элемента a из X значение функции f на последовательности S, к которой добавлен элемент a, вычисляется с помощью функции G:
f(S&a) = G(f(S), a)
Функция G по паре (y,a), где y - старое значение функции f на последовательности S и a - элемент, добавленный к последовательности, вычисляет новое значение y, равное значению функции f на новой последовательности.
В примере с суммой элементов последовательности функция G равна сумме элементов y и a:
G(y, a) = y+a
В примере с максимальным элементом последовательности функция G равна максимуму:
G(y, a) = max(y,a)
В примере со схемой Горнера вычисления значения многочлена в точке t, где коэффициенты многочлена заданы в последовательности по убыванию степеней, функция G равна
G(y, a) = yt+a
Во всех трех случаях рассматриваемая функция на последовательности индуктивна.
Общая схема вычисления значения индуктивной функции на последовательности выглядит следующим образом:
алгоритм значение индуктивной функции( вх: последовательность S)
| дано: последовательность S
| надо: вычислить функцию y = f(S)
начало алгоритма
| y := значение функции f на пустой последовательности;
| встать в начало последовательности S;
| цикл пока в последовательности S есть
| | непрочитанные элементы
| | прочесть очередной элемент
| | последовательности S в (вых:x);
| | y := G(y, x);
| конец цикла
| ответ := y;
конец алгоритма
Таким образом, для каждой конкретной индуктивной функции надо лишь правильно задать ее значение на пустой последовательности (инициализация) и определить, как новое значение функции вычисляется через старое при добавлении к последовательности очередного элемента, т.е. задать функцию G(y,x). Схема вычисления для всех индуктивных функций одна и та же.
Однако не все функции на последовательностях являются индуктивными. Рассмотрим следующий пример. Пусть коэффициенты многочлена заданы в последовательности по убыванию степеней. Надо вычислить значение производной многочлена в точке x = 2. Обозначим через
S = {a0, a1, ..., an}
последовательность коэффициентов многочлена
p(x) = a0xn+a1xn-1+...+an
и через f(S) значение производной многочлена p′(x) в точке x=2:
f(S) = p′(2)
Покажем, что функция f не индуктивна. Достаточно указать две последовательности S1 и S2, такие, что значения функции f на них совпадают, но при добавлении к последовательностям S1 и S2 одного и того же элемента a новые значения функции уже не равны:
f(S1) = f(S2),
f(S1&a)≠ f(S2&a)
Возьмем последовательности
S1 = {1},
S2 = {1, -4,1}
Им соответствуют многочлены
p1(x) = 1
p2(x) = x2-4x+1
Производные многочленов равны
p′(x) = 0,
p′2(x)= 2x-4
Значения обеих производных в точке x=2 равны нулю, т.е.
f(S1) = p′1(2) = 0,
f(S2) = p′2(2) = 2*2-4 = 0
Припишем теперь к обеим последовательностям элемент a = 1:
S1&1 = {1,1},
S2&1 = {1, -4,1,1}.
Новым последовательностям соответствуют многочлены
g1(x) = x+1,
g2(x) = x3-4x2+x+1
Их производные равны
g1(x) = 1,
g2(x) = 3x2-8x+1
Значения производных в точке x=2 равны соответственно
f(S1&1) = g′1(2) = 1
f(S2&1) = g′2(2) = 12-16+1 = -3
Мы видим, что значения f(S1) и f(S2) совпадают, но значения f(S1&1) и f(S2&1) не совпадают. Следовательно, функция f не индуктивна.