
- •Технология программирования
- •Технология программирования
- •Оглавление
- •§1. Классификация и эволюция программного обеспечения
- •§2. Модульное и объектно-ориентированное программирование
- •Основные понятия ооп
- •Составные части объектного подхода
- •Инкапсуляция. Свойства
- •Наследование. Методы
- •Полиморфизм
- •§3. Визуальная среда программирования Структура проекта Delphi
- •Библиотека компонентов Delphi
- •Класс tButton (кнопки)
- •Класс tShape (фигуры)
- •§4. Основные типы данных в языке Паскаль
- •Класс tLabel (надписи)
- •Класс tEdit
- •Класс tMemo
- •Класс tMainMenu
- •Стандартные диалоги
- •Классы tOpenDialog и tSaveDialog
- •Класс tFontDialog
- •Инструкция case
- •§6. Программирование циклических алгоритмов
- •Цикл с параметром. Инструкция for
- •Цикл с предусловием. Инструкция while
- •Цикл с постусловием. Инструкция repeat … until
- •§7. Простейшие вычислительные методы
- •Метод прямоугольников
- •Метод Монте-Карло
- •Метод деления пополам
- •§8. Процедуры и функции
- •§9. Одномерные массивы
- •Класс tListBox
- •Класс tComboBox
- •§10. Двумерные и многомерные массивы
- •Класс tStringGrid
- •Алгоритмы поиска наименьшего и наибольшего элемента
- •§11. Алгоритмы поиска и сортировки. Понятие вычислительной сложности алгоритма
- •Алгоритм простого перебора
- •Алгоритм бинарного поиска
- •Алгоритм сортировки методом «пузырька»
- •Алгоритм сортировки включением
- •Понятие вычислительной сложности алгоритма
- •§12. Обработка исключительных ситуаций
- •§13. Программирование процессов реального времени
- •Класс tTimer
- •§14. Графическая подсистема Delphi Класс tImage
- •Класс tCanvas
- •§15. Динамическое создание компонентов. Конструкторы и деструкторы
- •§16. Тестирование и отладка программ
- •Методы тестирования программ
- •Средства отладки программ в Delphi
- •Трассировка программы
- •Точки останова программы
- •Наблюдение значений переменных
- •§17. Жизненный цикл программного обеспечения
- •Последовательный (каскадный) тип
- •Эволюционный (спиральный) тип
- •Библиографический список
- •Технология программирования
- •Редактор с.В.Пилюгина
- •620034, Екатеринбург, ул. Колмогорова, 66, УрГупс Редакционно-издательский отдел
Метод деления пополам
Еще один распространенный класс задач – решение уравнений. Для простых уравнений есть точные формулы, для более сложных – различные приемы (замена переменной и т. п.), однако универсального точного метода нет. На помощь приходят приближенные методы, самый простой из них – метод деления пополам.
Пусть
нам нужно найти приближенно корень
уравнения
на промежутке[a;b]
с точностью e.
Идея метода: делим промежуток пополам, определяя на каждом шаге, в какой половине находится корень. Корень находится там, где знаки левой части уравнения на концах промежутка различны. Процесс продолжается до тех пор, пока длина промежутка остается больше, чем требуемая точность. После завершения корень уравнения приближенно равен середине оставшегося отрезка.
Отметим, что метод работает только в том случае, если известно, что на указанном промежутке уравнение имеет ровно один корень. В противном случае программа дает неверный результат.
Для реализации этой программы инструкция цикла с параметром неприменима, т. к. число повторений цикла неизвестно. Из двух других выберем цикл с предусловием.
Фрагмент программы, предназначенный для вычисления площади, может выглядеть примерно так:
while b-a > e do {продолжаем вычисление до нужной точности }
begin
c:=(a+b)/2; {середина промежутка [a,b]}
if f(x)<0
{корень находится на отрезке [a,c], т.к. на концах этого отрезка произведение левых частей отрицательно,
значит знаки разные}
then b:=c
else a:=c;
{отрезок уменьшился вдвое, осталась либо левая,
либо правая половина}
end;
x:=(a+b)/2;
§8. Процедуры и функции
При разработке сложных программ нередко требуется один и тот же фрагмент кода использовать многократно в разных частях программы. Часто эти фрагменты целесообразно поручить разным разработчикам. Для того чтобы разделить работу, выделив какие-то подзадачи, удобно использовать аппарат процедур и функций.
Функция это подпрограмма, т. е. последовательность инструкций, имеющая имя.
Процесс перехода к инструкциям функции называется вызовом функции или обращением к функции. Процесс перехода от инструкций функции к инструкциям программы, вызвавшей функцию, называется возвратом из функции.
В общем виде инструкция обращения к функции выглядит так:
переменная := функция (параметры) ;
где
переменная - имя переменной, которой надо присвоить значение, вычисляемое функцией;
функция - имя функции, значение которой надо присвоить переменной;
параметры - список формальных параметров, которые применяются для вычисления значения функции. В качестве параметров обычно используют переменные или константы.
Следует обратить внимание на то, что:
каждая функция возвращает значение определенного типа, поэтому тип переменной, которой присваивается значение функции, должен соответствовать типу функции;
тип и количество параметров для каждой конкретной функции строго определены.
В общем виде объявление функции выглядит так:
function Имя (пар1 : тип1, ..., парК : типК) : Тип;
var
{здесь объявления локальных переменных}
begin
{здесь инструкции функции}
Имя := Выражение; {это результат}
end;
где
function - зарезервированное слово языка Delphi, обозначающее, что далее следуют инструкции, реализующие функцию программиста;
имя - имя функции. Используется для перехода из программы к инструкциям функции;
пар - (параметр) это переменная, значение которой используется для вычисления значения функции. Отличие параметра от обычной переменной состоит в том, что он объявляется не в разделе объявления переменных, который начинается словом var, а в заголовке функции. Конкретное значение параметр получает во время работы программы в результате вызова функции из основной программы;
тип - тип значения, которое функция возвращает в вызвавшую ее программу.
Следует обратить внимание, что последовательность инструкций, реализующих функцию, завершается инструкцией, которая присваивает значение имени функции. Тип выражения, определяющего значение функции, должен совпадать с типом функции, указанным в ее объявлении.
Пример
Во
всех вычислительных задачах предыдущем
параграфе говорилось о некоторой функции
.
В каждом конкретном случае эта функция
должна вычисляться по-своему. Удобно
оформить ее вычисление в виде функции
и при необходимости вносить изменения
только в нее, не затрагивая основной
программы. Пусть наша функция будет
квадратичной с целыми коэффициентами:
.
Объявление функции (назовем ее f):
function f (a,b,c : integer; x : real) : real;
{локальные переменные не требуются, var опускаем}
begin
f := a*x*x+b*x+c; {это результат}
end;
Пусть
теперь нам нужно вычислить площадь под
параболой
.Тогда вызов
функции в программе вычисления площади
методом прямоугольников будет выглядеть
так:
s:=s+f(-1,0,4,x);
Процедура - это разновидность подпрограммы. Обычно подпрограмма реализуется как процедура в двух случаях:
когда подпрограмма не возвращает в основную программу никаких данных. Например, вычерчивает график в диалоговом окне;
когда подпрограмма возвращает в вызвавшую ее программу больше чем одно значение. Например, подпрограмма, которая решает квадратное уравнение, должна вернуть в вызвавшую ее программу два дробных числа – корни уравнения.
В общем виде объявление процедуры выглядит так:
procedure Имя (var пар1: тип1; ... var парК: типК) ;
var
{здесь объявление локальных переменных}
begin
{здесь инструкции процедуры}
end;
где
procedure - зарезервированное слово языка Delphi, обозначающее, что далее следует объявление процедуры;
имя - имя процедуры, которое используется для вызова процедуры;
пар - формальный параметр, переменная, которая используется в инструкциях процедуры. Слово var перед именем параметра означает, что этот параметр является и входным, и выходным, если его нет, то этот параметр является только входным.
Параметры процедуры используются для передачи данных в процедуру, а также для возврата данных из процедуры в вызвавшую ее программу.
Инструкция вызова процедуры в общем виде выглядит так:
Имя(СписокПараметров);
где
имя - имя вызываемой процедуры;
список_параметров - разделенные запятыми фактические параметры.
Фактическим параметром, в зависимости от описания формального параметра в объявлении процедуры, может быть переменная, выражение или константа соответствующего типа.
Место процедур и функций в программе зависит от того, используют ли они компоненты Delphi: если нет, то они помещаются в раздел implementation перед строкой {$R *.dfm}, а если используют, то после нее.