- •Сборник МетодическиХ указаниЙ по выполнению лабораторных работ
- •Информатика
- •Введение. Назначение Delphi и его особенности
- •Начало работы
- •Меню и команды Delphi
- •Полоска кнопок быстрого доступа SpeedBar
- •Локальные меню SpeedMenu
- •Работа с формами
- •Палитра компонентов
- •Система подсказок
- •Навигатор кода
- •Написание кода
- •Справочная система
- •Структура проекта
- •Окончательная настройка приложения
- •Событие и процедура обработки события
- •Запуск программы
- •Предупреждения и подсказки
- •Ошибки времени выполнения
- •Компиляция
- •Отладка программы
- •Файлы, создаваемые системой
- •Репозиторий объектов и его страницы
- •Тула 2014 г.
- •Создание приложения в среде разработки Delphi
- •Первый проект
- •Компоненты
- •Начальные сведения о программах на языке Pascal
- •Комментарии
- •Директивы компилятора
- •Идентификаторы
- •Переменные и типы данных
- •Константы
- •Неименованные константы
- •Нетипизированные константы
- •Типизированные константы
- •Простейшие операторы
- •1. Простейшие арифметические и логические операции
- •2. Линейные программы
- •Тула 2014 г.
- •Сущность задач с ветвлениями
- •Логический тип данных
- •Организация ветвлений
- •Объединение операторов
- •Сложные условия
- •Множественное ветвление
- •Применение оператора-переключателя Case
- •Тула 2014 г.
- •Сущность задач с циклами
- •Цикл с предусловием
- •Вечный цикл
- •Цикл с постусловием
- •Цикл с переменной
- •Дополнительные операторы управления циклами
- •Вложенные циклы
- •Инструкция goto
- •1. Циклические программы
- •2. Задачи, решаемые методом перебора.
- •Тула 2014 г.
- •Статические массивы
- •Многомерные статические массивы
- •Ввод-вывод массивов
- •Считывание массива из файла
- •Поиск максимума и минимума
- •Пример программы
- •Динамические массивы
- •Создание динамических массивов
- •Многомерные динамические массивы
- •1. Одномерные массивы
- •2. Двумерные массивы
- •Тула 2014 г.
- •Процедуры и функции
- •Что такое функция?
- •Функция: туда и обратно
- •Процедуры
- •Передача данных в процедуры
- •Вложенные процедуры и функции
- •Тула 2014 г.
- •Символьный тип
- •Символ-константа и строка-константа Неименованные константы
- •Нетипизированные константы
- •Типизированные константы
- •Действия с символами Операции
- •Стандартные функции и процедуры обработки строк
- •Операции со строками Сравнения
- •Обращение к компонентам строки
- •Конкатенация
- •Удаление символов в строке
- •Определение позиции подстроки
- •Выделение подстроки
- •Множества
- •Описание множеств
- •Множество-константа Неименованная константа
- •Нетипизированная константа
- •Типизированная константа
- •Операции с множествами
- •Представление множеств массивами
- •Представление множеств линейными массивами
- •Представление множеств битовыми массивами
- •1. Строковый тип данных
- •2. Типы данных «множество» и «запись»
- •Тула 2014 г.
- •Введение
- •Что такое файл?
- •Когда нужно использовать файлы
- •Разновидности файлов
- •Описание файлов
- •Текстовые файлы
- •Оперирование файлами
- •Назначение файла
- •Открытие файла
- •Закрытие файла
- •Считывание из файла
- •Запись в файл
- •Пробельные символы
- •Пример использования файлов
- •Изменение реакции на ошибку
- •Бинарные файлы
- •Типизированные файлы
- •Нетипизированные файлы
- •Подпрограммы обработки директорий
- •Применимость подпрограмм обработки файлов
- •Индивидуальные задания
- •Свойства в Delphi
- •Вложенных свойств
- •Управление свойствами визуальных компонент в режиме выполнения
- •Программа shapedem2
- •Тула 2014 г.
- •Графические компоненты
- •Построение графиков с помощью компонентной технологии
- •Тула 2014 г.
- •Создание меню
- •Использование компонента tTimer
- •Тула 2014 г.
- •Работа с компонентом RichEdit
- •Тула 2014 г.
- •Тула 2014 г.
- •Что такое мультимедиа
- •Мультимедиа в Delphi
- •Компонент tMediaPlayer
- •Два вида программ мультимедиа
- •Пример программы с мультимедиа
Тула 2014 г.
1. ЦЕЛЬ И ЗАДАЧИ РАБОТЫ
Изучение применения процедур и функций для решения задач в среде Borland Delphi.
2. ТЕОРЕТИЧЕСКИЕ ПОЛОЖЕНИЯ
Процедуры и функции
При написании сколько-нибудь сложных программ они в обязательном порядке разделяются на отдельные "кирпичики" – процедуры и функции. Процедура или функция – это маленькая программа со своими переменными, в которую можно передавать информацию и из которой можно получать результаты. Чем больше таких кирпичиков, тем легче создавать и отлаживать программу. Рекомендуется, чтобы каждая процедура целиком умещалась на экране, т.е. не превышала 20..25 строк текста.
Разделение программы на кусочки позволяет, во-первых, избежать ненужного дублирования. Если в тексте программы что-то повторяется – Вы что-то неправильно делаете! Все повторяющиеся фрагменты должны выносится "за скобки" – в отдельные процедуры. Во-вторых, при проектировании программы методом "сверху вниз" сложная задача разделяется на более мелкие простые, которые и оформляются в виде процедур. Наконец, написание отдельных процедур можно поручить группе программистов, что резко ускорит разработку большого проекта.
Что такое функция?
Сначала рассмотрим функции, поскольку с ними вам уже приходилось сталкиваться. В Delphi предусмотрено много встроенных функций, таких, как SQR(), SQRT(), SIN(), COS() и др. Давайте создадим пользовательскую функцию, которая будет вычислять тангенс угла. Мы хотим, чтобы в любом месте программы в формуле можно было написать TAN(x), а не делить синус на косинус.
Запись TAN(x) является вызовом функции с именем TAN. Сама же функция должна быть где-то описана. По правилам Delphi все объекты в программе описываются до их первого использования. Поэтому глобальные (доступные во всей программе) процедуры и функции описываются в разделе реализации после оператора IMPLEMENTATION.
Функцию можно представить себе как "черный ящик", в который мы что-то кладем и из которого мы что-то достаем. Любая функция имеет вход и выход. У функции тангенса на входе – значение угла в радианах, а на выходе – значение тангенса этого угла. Входных параметров может быть несколько (например, функция вычисления длины гипотенузы по двум длинам катетов) или вообще не быть (функция, возвращающая текущее время). Возвращаемое значение у функции есть всегда.
Общий вид описания функции следующий:
FUNCTION имя_функции(арг1:тип; … аргn : тип): тип_возвр_знач;
раздел локальных описаний
BEGIN
…
Result := значение
END;
Арг1 … аргn – это переменные, в которые заносятся значения, подаваемые функции на вход. Как и для любой другой переменной, после них через двоеточие указывается тип данных. кроме того, нужно указать тип значения, возвращаемого функцией.
Функция: туда и обратно
Итак, в функцию при ее вызове должны попасть какие-то значения. Например, в основной программе написано:
a:=StrToFloat(Edit2.Text);
b := Tan(a);
Чтобы значение переменой a оказалось в функции, ее заголовок должен выглядеть следующим образом:
FUNCTION Tan(x: REAL):REAL;
Такое описание говорит, что передаваемое в функцию значение должно быть типа REAL и оно заносится в переменную x внутри функции. Второе слово REAL относится к типу результата, возвращаемого функцией Tan. При вызове значение переменной a будет скопировано в переменную х.
Все переменные, описанные внутри функции или процедуры, являются ЛОКАЛЬНЫМИ. Это значит, что они никак не связаны с одноименными переменными, описанными в других частях программы. Например:
IMPLEMENTATION
VAR a: REAL; { глобальная переменная а }
FUNCTION abc(a:REAL):REAL; { локальная переменная а }
BEGIN
…
END;
В примере в начале всей программы выделяется память под ГЛОБАЛЬНУЮ переменную с именем a. Глобальные переменные можно использовать в любом месте в тексте программы. Они постоянно занимают память. Большое количество глобальных переменных – признак низкой квалификации программиста.
Переменная a, описанная в заголовке функции abc, существует только внутри этой функции. Она никак не связана с глобальной переменной a, это две разные ячейки памяти. Внутри функции глобальная переменная a будет не видна, возможен доступ только к локальной переменной a.
В момент вызова функции Tan значение, записанное в скобках после ее имени, будет занесено в локальную переменную a. Например:
x := Tan(2*b+pi);
Сначала вычисляется выражение 2*b+pi, а затем начинает выполняться функция и полученное при вычислении значение заносится в ее локальную переменную а.
В процедурах и функциях могут быть и обычные локальные переменные, типы данных и константы:
FUNCTION abc(a:REAL):REAL;
TYPE TA=ARRAY[1..10] OF REAL;
VAR x:REAL;
BEGIN
…
END;
В приведенном примере в переменную a заносится значение при вызове функции, а переменная x является просто ячейкой памяти. Она никак не связана с другими переменными с именем x, описанными в других местах программы. Аналогично тип данных TA в примере действует (обычно говорят "виден") только до конца текста функции, т.е. до слова END.
После того, как в функции вычислено возвращаемое значение, самое главное – не забыть на самом деле вернуть его. Для возврата значения внутри функции всегда существует переменная с именем Result, а также с именем, совпадающем с именем самой функции. Например, внутри функции Tan живет переменная с именем Tan и типом REAL и переменная Result тоже типа Real (напомним, что тип возвращаемого значения указывается после заголовка функции). Этой-то переменной и нужно присвоить результат вычислений:
FUNCTION Tan(a:REAL):REAL;
BEGIN
Result:=SIN(a)/COS(a)
END;
Очень часто встречается следующая ошибка:
Такая функция возвращает неопределенное значение. И в самом деле, результат вычисления тангенса записан в переменную t. Но это локальная переменная, при выходе из функции она удаляется из памяти вместе с вычисленным значением. Соответственно и вся функция становится бесполезной. Нужно помнить простое правило: внутри функции обязательно должно присваиваться значение переменной result.
