Вы находитесь на странице: 1из 184

Министерство образования Республики Беларусь

Учреждение образования «Белорусский государственный университет информатики и радиоэлек- троники»

Кафедра «Вычислительные методы и программирование»

Шестакович В. П.

Электронный учебно-методический комплекс

по дисциплине

«ОСНОВЫ АЛГОРИТМИЗАЦИИ И ПРОГРАММИРОВАНИЯ»

Для студентов специальностей

36 04 01 «Электронно-оптические системы и технологии», 39 02 02 «Проектирование и производство радиоэлектронных средств», 39 02 03 «Медицинская электроника», 39 02 01 «Моделирование и компьютерное проектирование радиоэлек- тронных средств», 39 03 01 «Электронное обеспечение безопасности».

Курс лекций

Минск 2011

СОДЕРЖАНИЕ

ТЕМА 1. ОСНОВЫ АЛГОРИТМИЗАЦИИ

7

1.1. Понятие алгоритма и способы его записи

7

1.2. Программировие в среде Delphi

9

1.3. Структура программ Delphi

11

1.4. Линейные алгоритмы

12

1.5. Пример создания программы в среде Delphi

14

1.5.1. Настройка формы

14

1.5.2. Изменение заголовка формы

14

1.5.3. Размещение строки ввода (Edit)

14

1.5.4. Размещение

надписей (Label)

15

1.5.5. Размещение

многострочного окна вывода (Memo)

15

1.5.6. Размещение кнопки Close

15

1.5.7. Подпрограмма обработки события создания формы

16

(FormCreate)

16

1.5.8. Подпрограмма обработки события нажатия кнопки

(ButtonClick)

16

1.5.9. Запуск и работа с программой

16

ТЕМА 2. БАЗОВЫЕ ЭЛЕМЕНТЫ ЯЗЫКА OBJECT PASCAL

20

2.1.

Алфавит языка Object Pascal

20

2.2.

Типы данных

20

2.3.

Операторы языка Object Pascal

24

2.3.1. Оператор присваивания

24

2.3.2. Составной оператор

24

2.4.

Операции над переменными и константами

24

ТЕМА 3. ПРОГРАМИРОВАНИЕ РАЗВЕТВЛЯЮЩИХСЯ АЛГОРИТМОВ

27

3.1. Определение разветвляющегося алгоритма

27

3.2. Оператор

безусловной передачи управления goto

28

3.3. Оператор условного выбора if

28

3.4. Оператор выбора Case

30

3.5. Возможности, предоставляемые средой Delphi для организации

30

ТЕМА 4. ПРОГРАММИРОВАНИЕ ЦИКЛИЧЕСКИХ АЛГОРИТМОВ .32

разветвлений

4.1. Понятие циклического алгоритма

32

4.2. Оператор цикла с последующей проверкой условия repeat

32

4.3. Оператор цикла с предварительной проверкой условия while

33

4.4. Оператор цикла с явно заданныи числом повторений for

33

4.5. Вложенные циклы

34

4.6. Примеры циклических алгоритмов

35

ТЕМА 5. ОТЛАДКА ПРОГРАММ И ОБРАБОТКА

ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ

37

5.1.

Ошибки на этапе компиляции

37

5.2.

Понятие исключительной ситуации

37

5.3. Защищенные блоки

38

5.4. Некоторые стандартные типы исключительных ситуаций

39

5.5. Инициирование собственных исключительных ситуаций

40

5.6. Использование функций ShowMessage и MessageDlg

40

5.7. Пример программы с обработкой исключительных ситуаций

41

ТЕМА 6. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ МАССИВОВ

45

6.1. Понятие массива

45

6.2. Некоторые возможности ввода и вывода массивов в Delphi

46

6.3. Примеры алгоритмов работы с массивами

47

ТЕМА 7. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ

УКАЗАТЕЛЕЙ

49

7.1. Статическое и динамическое распределение оперативной

памяти

49

7.2. Понятие указателя

49

7.3. Динамическое распределение памяти

50

7.4. Организация динамических массивов

50

ТЕМА 8. ПОДПРОГРАММЫ И БИБЛИОТЕКИ

53

8.1. Понятие подпрограммы

53

8.2. Обмен данными между подпрограммой и программой

54

8.3. Оформление подпрограмм в библиотечный модуль

55

8.4. Пример создания библиотечного модуля

56

ТЕМА 9. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ МНОЖЕСТВ

58

9.1. Понятие множества

58

9.2. Операции над множествами

58

9.3. Пример программы с использованием множеств

59

ТЕМА 10. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ СТРОК

63

10.1. Описание переменных строкового типа

63

10.2. Основные операции над переменными строкового типа

63

10.3. Некоторые процедуры и функции обработки строк

64

10.4. Примеры алгоритмов обработки строк

65

ТЕМА 11. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ ЗАПИСЕЙ

 

66

11.1. Понятие записи

66

11.2. Операции над записями

66

ТЕМА 12. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ ФАЙЛОВ

 

68

12.1. Понятие файла

68

12.2. Операции над файлами

69

12.2.1. Типизированные файлы

69

12.2.2. Текстовые файлы

70

12.2.3. Нетипизированные файлы

70

12.3.

Подпрограммы работы с файлами

71

12.4. Компоненты OpenDialog и SaveDialog

71

12.5. Пример программы работы с файлами

72

ТЕМА 13. ПРОГРАММИРОВАНИЕ С ОТОБРАЖЕНИЕМ ГРАФИЧЕСКОЙ ИНФОРМАЦИИ

80

13.1. Как рисуются изображения

80

13.2. Построение графиков с помощью компонента Chart

81

ТЕМА 14. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ

РЕКУРСИИ

86

14.1. Понятие рекурсии

86

15.2. Примеры рекурсивных вычислений

87

ТЕМА 15. ПОИСК И СОРТИРОВКА МАССИВОВ

89

15.1. Организация работы с базами данных

89

15.2. Поиск в массиве записей

89

15.3. Сортировка массивов

90

15.3.1. Метод пузырька

91

15.3.2. Метод прямого выбора

92

15.3.3. Метод Шелла

92

15.3.4. Метод Хоара (Hoare)

94

ТЕМА 16. РАБОТА СО СПИСКАМИ НА ОСНОВЕ ДИНАМИЧЕСКИХ

МАССИВОВ

95

16.1. Работа со списками

95

16.2. Добавление элемента в список на заданную позицию

95

16.3. Удаления элемента с заданным номером

96

16.4. Пример программы

96

ТЕМА 17. СВЯЗАННЫЕ СПИСКИ НА ОСНОВЕ РЕКУРСИВНЫХ ДАННЫХ

101

17.1. Определение стека и очереди

101

17.2. Понятие рекурсивных данных и односвязных списков

101

17.3. Процедуры для работы со стеками

104

17.4. Процедуры для работы с односвязными очередями

107

17.5. Пример программы по созданию стека

110

17.6. Работа с двухсвязными очередями

114

17.7. Процедуры для работы с двусвязными очередями

116

17.8. Пример пограммы по работе с двухсвязным списком

120

ТЕМА 18. АЛГОРИТМЫ РЕШЕНИЯ СИСТЕМ ЛИНЕЙНЫХ АЛГЕБРАИЧЕСКИХ РЕШЕНИЙ

125

18.1. Основные понятия и определения

125

18.2. Прямые методы решения СЛАУ

127

18.2.1. Метод Гаусса

127

18.2.2. Метод прогонки

128

18.2.3. Метод квадратного корня

129

18.3.

Итерационные методы решения СЛАУ

130

18.3.1.

Метод простой итерации

130

18.3.2. Метод Зейделя

130

18.3.3.

Понятие релаксации

131

18.4.

Нахождение обратных матриц

131

ТЕМА 19. СОБСТВЕННЫЕ ЗНАЧЕНИЯ И СОБСТВЕННЫЕ ВЕКТОРЫ

МАТРИЦЫ

133

19.1. Интерполяционный метод

133

19.2. Метод вращений Якоби

134

19.3. Итерационный метод

135

ТЕМА 20. АППРОКСИМАЦИЯ ФУНКЦИЙ

136

20.1. Определение аппроксимации

136

20.2. Интерполяция

137

20.3. Многочлены и способы интерполяции

139

20.3.1. Интерполяционный многочлен Ньютона

139

20.3.2. Линейная и квадратичная интерполяции

139

20.3.3. Интерполяционный многочлен Лагранжа

140

20.3.4. Интерполяция общего вида

140

20.4.

Среднеквадратичная аппроксимация

140

20.4.1.

Метод наименьших квадратов

141

ТЕМА 21. ВЫЧИСЛЕНИЕ ПРОИЗВОДНЫХ ИНТЕГРАЛОВ

143

21.1. Формулы

численного

дифференцирования

143

21.2. Формулы численного интегрирования

144

21.2.1. Формула средних

144

21.2.2. Формула трапеций

145

21.2.3. Формула

Симпсона

145

21.2.4. Формулы Гаусса

145

ТЕМА 22. МЕТОДЫ РЕШЕНИЯ НЕЛИНЕЙНЫХ УРАВНЕНИЙ

147

22.1. Как решаются нелинейные уравнения

147

22.2. Итерационные методы уточнения корней

148

22.2.1. Метод простой итерации

148

22.2.2. Метод Ньютона

148

22.2.3. Метод секущих

149

22.2.4. Метод

Вегстейна

150

22.2.5. Метод парабол

150

22.2.6. Метод деления отрезка пополам

150

ТЕМА 23. РЕШЕНИЕ ОБЫКНОВЕННЫХ ДИФФЕРЕНЦИАЛЬНЫХ

УРАВНЕНИЙ

152

23.1.

Задачи для обыкновенных дифференциальных уравнений

152

23.2. Основные положения метода сеток для решения задачи Коши

 

153

23.2.1. Явная схема 1-го порядка (метод Эйлера)

154

23.2.2. Неявная схема 1-го порядка

154

23.2.3. Неявная схема 2-го порядка

155

23.2.4. Схема Рунге – Кутта 2-го порядка

155

23.2.5. Схема Рунге – Кутта 4-го порядка

155

23.3.

Многошаговые схемы Адамса

156

23.3.1. Явная экстраполяционная схема Адамса 2-го порядка

157

23.3.2. Явная экстраполяционная схема Адамса 3-го порядка

157

23.3.3. Неявная схема Адамса 3-го порядка

158

23.4. Краевая (граничная) задача

158

23.5. Численные методы решения краевых задач

159

23.5.1. Метод стрельбы

159

23.5.2. Метод

конечных разностей

160

ТЕМА 24. МЕТОДЫ ОПТИМИЗАЦИИ

162

24.1. Постановка задач оптимизации, их классификация

162

24.2. Методы нахождения минимума функции одной переменной163

24.2.1. Метод деления отрезка пополам

164

24.2.2. Метод золотого сечения

164

24.2.3. Метод

Фибоначчи

165

24.2.4. Метод последовательного перебора

166

24.2.5. Метод

квадратичной параболы

167

24.2.6. Метод кубической параболы

168

24.3. Методы нахождения безусловного минимума функции

нескольких переменных

169

24.3.1.

Классификация методов

169

24.4.

Методы нулевого порядка

170

24.4.1. Метод покоординатного спуска

170

24.4.2. Метод Хука – Дживса

171

24.4.3. Метод Нелдера – Мида

171

24.5.

Методы первого порядка

174

Метод

24.5.1. наискорейшего спуска

174

24.5.2. сопряженных градиентов Флетчера – Ривса

Метод

174

24.6.

Методы второго порядка

175

24.6.1.

Обобщенный метод Ньютона – Рафсона

175

24.7.

Методы переменной метрики

176

24.7.1.

Метод Дэвидона – Флэтчера – Пауэлла

176

24.8.

Методы условной минимизации функций

177

24.8.1.

Метод штрафных функций

177

ПРИЛОЖЕНИЕ 1. Процедуры и функции для преобразования

строкового представления чисел

179

ПРИЛОЖЕНИЕ

2.

Математические формулы

181

ПРИЛОЖЕНИЕ 3. Таблицы символов ASCII

182

ЛИТЕРАТУРА

184

ТЕМА 1. ОСНОВЫ АЛГОРИТМИЗАЦИИ

1.1. Понятие алгоритма и способы его записи Программирование – это процесс создания программы, состоящий из следующих этапов:

1. Формулирование требований к программе.

2. Разработка алгоритма.

3. Запись алгоритма на языке программирования.

4. Отладка программы.

5. Тестирование программы.

Алгоритмом называется последовательность действий, приводящая к решению поставленной задачи. Результатом разработки алгоритма является блок-схема или словесное описание алгоритма. При изображении блок-схемы могут использоваться следующие основные графические элементы:

Начало
Начало
Ввод x,y w=x+sin(y) Да x>2 Нет Выход k=1,n Тело цикла Уточнение корня
Ввод
x,y
w=x+sin(y)
Да
x>2
Нет
Выход
k=1,n
Тело цикла
Уточнение
корня

«Оконечная фигура» (начало и конец алгоритма)

«Данные» (Ввод и вывод информации)

«Процесс» (Линейный блок)

«Решение» (Разветвление алгоритма)

«Подготовка» (Организация цикла)

«Заранее определенный процесс» (Отдельно описанный

алгоритм)

Рис. 1.1. Графические элементы алгоритма

Отладка – это процесс поиска и исправления ошибок. Ошибки в про- грамме разделяются на синтаксические (ошибки в тексте программы) и алго- ритмические. Синтаксические ошибки выявляет транслятор программы на этапе компиляции (преобразовании операторов программы в набор машин- ных команд). Алгоритмические ошибки выявляются на этапе тестирования (прогонке программы при наборе входных данных с заведомо известным ре- зультатом).

1.2. Программирование в среде Delphi Выполняемая компьютером программа является набором команд над содержимым ячеек памяти. Составление программы в машинных командах является крайне неудобным и сложным процессом. Поэтому часть работы по составлению программы была предоставлена компьютеру. Были созданы языки программирования, которые сейчас принято называть языками высо- кого уровня, при использовании которых алгоритм записывается с помощью небольшого числа операторов соответствующего языка, после чего програм- ма проходит процесс так называемой компиляции, при которой компьютер проверяет правильность записи каждого оператора, а затем преобразует опе- ратор в набор машинных команд. После чего производится подключение не- обходимых стандартных библиотек (компоновка) и создание выполняемого файла (файл с расширением *.exe). Полученная программа в машинных кодах может быть записана на диск и при ее многократном выполнении уже не тре- буются этапы компиляции и компоновки. Delphi – это среда визуального программирования на основе языка Ob- ject Pascal. Этот язык программирования был создан Никлаусом Виртом, ди- ректором института информатики Швейцарской высшей политехнической школы в 1970 году специально как язык обучения программированию. Его отличает строгость в определении переменных и констант, модульность про- граммирования, широкие возможности в создании собственных структур данных, использование объектно-ориентированного программирования. Кор- порация Borland сделавшая ставку на визуальное объектно-ориентированное программирование с предоставлением возможности работы с любыми базами данных создала среду программирования Delphi по своим возможностям не уступающую таким средам программирования как С++, Visual C++, CBuilder, Visual Basic и др., а по удобству языка и простоте обучения Delphi значительно привлекательнее. Система Delphi реализует технологию объ- ектно-ориентированного визуального программирования (ООП). В ООП главным элементом является объект. Объектно-ориентированная программа – это совокупность объектов и способов их взаимодействия. Пользователь про- граммы является главным (управляющим) объектом. Обмен между объектами происходит посредством сообщений. Пользователь посылает свои сообщения посредством определенных действий на панели программы. Когда сообщение поступило некоторому объекту (произошло определенное событие), он начи- нает выполнять свои определенные действия и сообщает результаты пользо- вателю визуально через окна на панели программы. Объект представляет со- бой объединение под одним именем (именем объекта) данных и методов ра- боты с ними. Данные обьекта, определяющие вид, положение и поведение обьекта называются свойствами обьекта. Процедуры и функции обьекта предназначенные для работы с этими данными называются методами. Вы- зов метода производится указанием имени объекта и через точку имени мето- да, например, Memo.Clear.

Программная среда разработки Delphi состоит из нескольких одновре- менно открытых окон – главного окна, окна инспектора объектов, окна фор- мы, окна текста программы и окна списка обьектов. На рис. 1.2 представлена среда разработки Borland Delphi 7.0.

среда разработки Borland Delphi 7.0. Рис. 1.2. — Программная среда

Рис. 1.2. — Программная среда Borland Delphi 7.0 1 – главное окно; 2 – основное меню; 3 – пиктограммы основного меню; 4 – окно списка обьектов; 5 - окно инспектора объектов; 6 – меню обьектов; 7 – окно редактора текста программ; 8 - окно формы;

Главное окно необходимо для управления процессом создания про- граммы. Основное меню содержит все необходимые средства для управления проектом. Пиктограммы облегчают доступ к наиболее часто применяемым командам основного меню. Через меню объектов (компонентов) осуществля- ется доступ к набору стандартных сервисных программ среды Delphi, кото- рые описывают некоторый визуальный элемент (компонент), помещаемый разработчиком программы в окно формы. Каждый компонент имеет опреде- ленный набор свойств (параметров), которые разработчик может задавать, например цвет, заголовок окна, надпись на кнопке, размер и тип шрифта и др. Окно инспектора объектов (вызывается c помощью клавиши F11) предназначено для изменения свойств выбранных компонентов и содержит две вкладки. Вкладка Properties (Свойства) предназначена для изменения свойств компонента, на вкладке Events (События) перечислены события, на

которые может реагировать обьект (например, нажатие определенной клави- ши или щелчок «мышью» по кнопке). Окно формы представляет собой визуальную оболочку программы. В это окно в процессе разработки программы помещаются визуальные и неви- димые компоненты. Окно текста программы предназначено для просмотра, написания и редактирования текста программы. При создании программы первоначально в этом окне находится текст, предназначенный для нормального функциони- рования пустого проекта Windows-окна. При размещении компонента в окно формы, текст программы автоматически дополняется описанием необходи- мых для его работы библиотек стандартных программ (раздел uses) и типов переменных (раздел type) (см. Листинг 1.1). Программа в среде Delphi является набором алгоритмов, которые будут выполняться при возникновении того или иного события (например, щелчок мыши на кнопке – событие OnClick, создание формы – OnCreate). Для каждо- го обрабатываемого события, с помощью вкладки Events инспектора объектов в тексте программы организуется процедура (procedure), между ключевыми словами begin и end которой разработчик записывает на языке Object Pascal требуемый алгоритм. Переключение между окном формы и окном текста программы осуще- ствляется с помощью клавиши F12.

1.3. Структура программ Delphi

Приложение в среде Delphi состоит из файлов с исходным текстом программы (*.pas), файла формы (*.dfm) содержащем описание формы и ее компанентов, файла проекта (*.dpr), который связывает вместе все файлы проекта, ресурсного файла (*.res), содержашего значки, картинки, меню, ко- торые будут помещаться в форму, файла настроек проекта (*.dof), файла (*.dcu), содержащего результат компиляции файла с расширением (*.pas) и файла, содержащего единый исполняемый файл (*.exe). В файле проекта находится информация о модулях, составляющих данный проект. Файл проекта автоматически создается и редактируется сре- дой Delphi и не предназначен для редактирования. Файл исходного текста – программный модуль (Unit) предназначен для размещения текстов программ. В этом файле разработчик размещает текст программы, написанный на языке Object Pascal. Модуль имеет следующую структуру:

unit Unit1; interface // Раздел объявлений implementation // Раздел реализации begin

// Раздел инициализации

end. В разделе объявлений описываются типы, константы, переменные, заго- ловки процедур и функций, которые могут быть использованы другими моду- лями после подключения библиотек (Uses). В разделе реализации располагают- ся тела процедур и функций, описанных в разделе объявлений, а также типы, константы, переменные, процедуры и функции, которые будут функциониро- вать только в пределах данного модуля. Раздел инициализации используется редко и его описание можно пропустить. При компиляции программы Delphi создает файл с расширением dcu, содержащий в себе результат перевода в машинный код содержимого файлов с расширениями pas и dfm. Компоновщик преобразует файлы с расширением dcu в единый исполняемый файл с расширением exe. В файлах, имеющих расширения ~df, ~dp, ~pa, хранятся резервные копии файлов формы, проекта и исходного текста соответственно. При сохранении проекта необходимо создать отдельную папку с име- нем проекта в которую следует поместить файлы проекта (достаточно сохра- нять только файлы с расширениями *.dpr, *.pas, *.dfm, *.res. Остальные фай- лы являются рабочими и их можно не сохранять).

1.4. Линейные алгоритмы Линейными называются алгоритмы, в которых независимо от входных данных и результатов промежуточных расчетов всегда выполняется одна и та же последовательность действий. Например требуется организовать расчет некоторого арифметического выражения при различных исходных данных.

u

| e

tg x 2 ( y ) *
tg x
2
(
y
) *

3 y

x 2 |
x
2
|
arctg z ( ) ln( ) x
arctg z
(
)
ln( )
x

, где x, y, z – действительные числа.

Разработка алгоритма обычно начинается с построения блок-схемы. Проду- мывается оптимальная стратегия вычислений, при которой, например, отсут- ствуют повторения. При написании алгоритма рекомендуется также перемен- ным присваивать по возможности те же имена, которые фигурируют в задан- ном арифметическом выражении. Для того, чтобы не было «длинных» опера- торов исходное выражение полезно разбить на ряд более простых. В нашем случае предлагается схема вычислений, представленная на рис. 1.3.

Начало Ввод x,y,z
Начало
Ввод
x,y,z

a=tg 2 (x+y)

b=|e 3y -x 2 |

Ввод x,y,z a=tg 2 (x+y) b=|e 3y -x 2 | c arctg ( z ) ln(
Ввод x,y,z a=tg 2 (x+y) b=|e 3y -x 2 | c arctg ( z ) ln(
Ввод x,y,z a=tg 2 (x+y) b=|e 3y -x 2 | c arctg ( z ) ln(

c arctg ( z ) ln( x )

s=a*b/c Вывод x,y,z,s Конец
s=a*b/c
Вывод
x,y,z,s
Конец

Рис. 1.3. Схема линейного алгоритма

Она содержит ввод исходных данных, линейный вычислительный про- цесс и вывод полученного результата и исходных данных. Введя переменные a,b,c мы разбили сложное выражение на ряд простых. В Delphi чаще всего ввод или вывод небольшого количества данных производят из так называе- мых окон однострочных редакторов (компонент Edit) или табличных строч- ных редакторов (компонент StringGrid). Вывод большого числа данных обычно осуществляется в окно многострочного редактора (компонент Memo). Окна этих редакторов и пояснения к ним размещаются на форме по усмотре- нию программиста. В окна строчных редакторов может помещаться любой набор символов, в частности запись чисел, которые необходимо ввести или вывести. Для того, чтобы, например, в окне редактора Edit1 было помещено число 28.64 в программе достаточно написать оператор Edit1.Text:=28,64. Для вывода результатов можно поместить на форму окно многострочного ре- дактора Memo1. Окно многострочного редактора в данном случае предназна- чено для вывода результатов и представляет собой отображение в окне по- следовательности строк. Новая строка добавляется в окно с помощью опера- тора Memo1.Lines.Add(новая строка). Если нужно вывести содержимое вещественных или целых переменных их необходимо предварительно преоб- разовать в строковое представление. Для этого используются функции Float- ToStrF(х,fffixed,6,2) – преобразование вещественного числа x в строку из 6

символов с двумя цифрами после запятой и IntToStr(m) – преобразование це- лого числа m в строку.

1.5. Пример создания программы в среде Delphi Задание: составить программу вычисления для заданных значений x, y, z арифметического выражения

u

| e 3 y x 2 | tg x 2 ( y ) * .
|
e
3 y
x
2
|
tg x
2
(
y
) *
.
arctg z
(
)
ln( )
x

Панель диалога программы организовать в виде, представленном на рис. 1.4.

1.5.1. Настройка формы Для создания нового проекта в основном меню выбирается пункт File>New>Application. Пустая форма в правом верхнем углу имеет кнопки управления, которые предназначены: для сворачивания окна , для развора- чивания окна на весь экран , возвращения к исходному размеру и для за- крытия окна . С помощью мыши, «захватывая» одну из кромок формы или выделенную строку заголовка регулируются нужные размеры формы и ее по- ложение на экране.

1.5.2. Изменение заголовка формы Новая форма имеет одинаковое имя (свойство Name) и заголовок (свойст- во Caption) Form1. Для изменения заголовка активируется форма щелчком мыши на форме и на вкладке Properties инспектора объектов в правой ячейке от свойства Caption вводится новый заголовок окна, например «Моя первая про- грамма».

1.5.3. Размещение строки ввода (Edit) Для ввода данных, а так же вывода информации, которая вмещается в одну строку, используется компонент Edit. Доступ к отображаемой в окне информации в виде строки символов (тип данных String) осуществляется с помощью свойства Text. В составляемой ниже программе с помощью компо- нентов Edit будут вводиться значения переменных x, y, z (см. рис. 1.4). Для

x , y , z (см. рис. 1. 4 ). Для этого необходимо сначало
x , y , z (см. рис. 1. 4 ). Для этого необходимо сначало
x , y , z (см. рис. 1. 4 ). Для этого необходимо сначало
x , y , z (см. рис. 1. 4 ). Для этого необходимо сначало
x , y , z (см. рис. 1. 4 ). Для этого необходимо сначало

этого необходимо сначало щелкнуть мышью по пиктограмме в меню

компонентов Standard а затем в том месте формы, где необходимо размес- тить компонент. После рамещения на форме трех компонентов Edit, в тексте программы (см. Листинг 1.1) появится три новых переменных – Edit1, Edit2, Edit3. Последовательно выделяя компоненты, можно регулировать их разме- ры и положение. С помощью инспектора объектов устанавливаются шрифт, размер и цвет символов отражаемых в окне Edit (свойство Font). В свойстве Text инспектора объектов можно задать начальные значения переменных x, y,

z.

На этапе создания программы следует обратить внимание на то, что численные значения переменных x, y, z имеют действительный тип, а компо- нент Edit в свойстве Text содержит отображаемую в окне строку символов. Для преобразования строковой записи числа, находящегося в свойстве Edit.Text, в действительное его представление, используется стандартная функция StrToFloat, например x:=StrToFloat(Edit1.Text). Для перевода строки в целочисленный тип данных используется функция StrToInt. При этом в за- писи числа не должно быть пробелов, а целая и дробная часть действительно- го числа разделяется символом, заданным в разделе «Языки и стандарты» па- нели управления Windows (по умолчанию – запятой). Некоторые процедуры и функции для преобразования строк приведены в Приложении 1 и в теме 7.

1.5.4. Размещение надписей (Label) На рис. 1.4 на форме имеются четыре пояснительные надписи. Для на- несения таких надписей на форму используется компонент Label. (пикто-

компонент Label . (пикто- грамма в меню компонентов Standard

грамма в меню компонентов Standard). Отображаемая информация дан- ного компонента содержится в свойстве Caption (заголовок).

1.5.5. Размещение многострочного окна вывода (Memo)

на экран можно использовать компонент

Memo (пиктограмма в меню компонентов Standard). Для отображения вертикальной и горизонтальной полос прокрутки в данном компоненте, во вкладке Properties инспектора объектов необходимо установить свойство ScrollBars в положение SSBoth. Информация, которая отображается построч- но в окне Memo, находится в свойстве Memo.Lines. Новая строка добавляется методом Memo.Lines.Add(). Для очистки окна во время выполнения програм- мы используется метод Memo.Clear. Если в окно Memo выводятся данные, находящееся в переменных действительного или целого типа, то их необхо- димо предварительно преобразовать к типу String: для действительных чисел – FloatToStr() или FloatToStrF(), для целых – IntToStr(). Например, для пере- менной целого типа n:=100 Memo1.Lines.Add(‘Значение n=’+IntToStr(n)), для переменной действительного типа x:=-256,38666 Memo1.Lines.Add(‘Значение x=’+FloatToStrF(x,fffixed,8,2)). В данном случае параметр fffixed отвечает за вывод числа с фиксированной точкой, 8 – за об- щее количество выводимых цифр, 2 – количество цифр после запятой (дроб- ная часть).

Для вывода нескольких строк

Для вывода нескольких строк 1.5 .6. Размещение кнопки Close Для

1.5.6. Размещение кнопки Close Для окончания работы программы лучше использовать не стандартную кнопку для закрытия окна , а компонент TBitBtn расположенный в меню компонентов Additional и представляющий собой разновидность стандартной кнопки TButton. Его отличительная особенность – наличие растрового изо-

TButton . Его отличительная особенность – наличие растрового изо- 15

бражения на поверхности кнопки, которое определяется свойством Clyph. Кроме того, имеется свойство Kind, которое задает одну из 11 стандартных разновидностей кнопок. Кнопка bkClose закрывает главное окно и завершает работу программы.

1.5.7. Подпрограмма обработки события создания формы (FormCreate) После запуска программы, на этапе ее выполнения, происходит соз- дание спроектированной формы (событие OnCreate). Создадим подпро- грамму – обработчик этого события (TForm1.FormCreate). После запуска программы она будет очищать окно Memo1. Для этого необходимо дваж- ды щелкнуть мышью на любом свободном месте формы. На экране поя- вится текст, в котором автоматически внесен заголовок процедуры – об- работчика события создания формы: Procedure TForm1.FormCreate(Sender:TObject). Между begin … end вставляется текст программы (смотрите пример, расположенный ниже).

1.5.8. Подпрограмма обработки события нажатия кнопки (ButtonClick) Поместить на форму кнопку (компонент Button), для чего необходимо

Button ), для чего необходимо выбрать в меню компонентов Standart

выбрать в меню компонентов Standart пиктограмму . Для изменения над- писи на кнопке можно использовать свойство Caption. После этого два раза щелкнуть мышью по кнопке. В тексте программы появится текст процедуры обработчика события «щелчок мышью на кнопке» Procedure TForm1.ButtonClick(Sender:TObject); Begin End; Набрать текст этой процедуры (см. Листинг 1).

Внимание! Заголовки процедур ButtonClick и FormCreate создаются средой Delphi автоматически (если набрать их вручную – программа работать не будет). При запуске программы на выполнение все процедуры обработки со- бытий, у которых между begin и еnd ничего не было удаляются автомати- чески по соответствующему запросу среды Delphi. Поэтому нет необходи- мости вручную удалять ошибочно созданные обработчики.

Разместить на форме собственную кнопку для окончания работы, по- местив из меню компонентов Additional компанент BitBtn. Выбрать в инспек- торе объектов для этого компонента в свойстве Kind значение Close.

1.5.9. Запуск и работа с программой Запустить программу можно, выбрав в главном меню пункт Run >Run

в главном меню пункт Run – > Run или нажав клавишу F9 , или щелкнув

или нажав клавишу F9, или щелкнув мышью по пиктограмме . При этом

происходит компиляция программы и, если нет ошибок, компоновка про- граммы и создание исполняемого файла с расширением exe. На экране появ- ляется активная форма программы (рис. 1.4).

форма программы (рис. 1. 4). Рис. 1.4 . Изображение формы

Рис. 1.4. Изображение формы выполняемой программы

Дальнейшая работа с программой осуществляется следующим образом. В со- ответствующих окнах задаются значения переменных x, y, z. Производится щелчок мышью по кнопке «Вычислить». В окне Memo1 появляется резуль- тат. При изменении значений x, y, z в окнах и вторичных нажатиях кнопки «Вычислить» в окно Memo1 будут добавляться новые результаты. Завершить работу программы можно или нажав кнопку на форме или кнопку «Close» или, выбрав в главном меню Delphi пункт Run > Program Reset. Последний способ выхода из программы обычно используют в случае ее зацикливания. В Листинге 1.1 представлен текст программы. Для наглядности, опера- торы, которые следует набрать разработчику выделены полужирным курсив- ным шрифтом, остальные операторы вставляются средой Delphi автоматиче- ски.

Листинг 1.1.

unit Unit1;

ски. Листинг 1.1. unit Unit1; interface uses

interface

uses

Windows,Messages,SysUtils,Variants,Classes,Graphics,

Controls,Forms,Dialogs,Buttons,StdCtrls;

type

TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Memo1: TMemo;

Button1: TButton; BitBtn1: TBitBtn; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private

{ Private declarations } public

{ Public declarations }

end;

var Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject); begin

Memo1.Clear;

end;

//

Очистка окна

procedure TForm1.Button1Click(Sender: TObject); var x,y,z,a,b,c,s:extended; begin

x:=StrToFloat(Edit1.text);

y:=StrToFloat(Edit2.text);

z:=StrToFloat(Edit3.text);

a:=sqr(sin(x+y)/cos(x+y));

b:=abs(exp(3*y)-x*x);

c:=sqrt(arctan(z)+ln(x)); s:=a*b/c; // Вывод исходных данных и результата в окно memo1

Memo1.Lines.Add('x='+Edit1.Text+

y='+Edit2.Text+'

'

z='+Edit3.Text+

' Результат = '+FloatToStrF(s,fffixed,9,4));

end;

end.

ТЕМА 2. БАЗОВЫЕ ЭЛЕМЕНТЫ ЯЗЫКА OBJECT PASCAL

лов:

2.1. Алфавит языка Object Pascal Object Pascal оперирует следующим набором симво-

Алфавит языка

1) прописные и строчные буквы латинского алфавита

A, B, C, D, a, b, c, d,

,U,

V, W, X, Y, Z;

,u, v, w, x, y, z;

2) десятичные арабские цифры от 0 до 9; 3) _ – символ «подчеркивание»,

4) специальные символы

+

плюс

{}

фиг. скобки

:

двоеточие

-

минус

[ ]

кв. скобки

;

точка с запятой

*

звездочка

( )

круг. скобки

'

апостроф

/

дробная черта

#

номер

@

коммерческое а

=

равно

пробел

$

знак ден.единицы

>

больше

.

точка

^

каре

<

меньше

,

запятая

Комбинации специальных символов могут образовывать составные символы:

– присваивание – диапазон значений <= – меньше или равно >= – больше или равно < > – не равно

:=

(. .) – альтернатива квадратных скобок

(* *) – альтернатива фигурных скобок 5) ключевые (зарезервированные) слова. Например, Begin, End;

6) стандартные идентификаторы. Например, Sin, Cos; 7) идентификаторы пользователя.

2.2. Типы данных Величины, с которыми должна работать программа принято называть данными. Все данные при работе программы размещаются в различные ячей- ки памяти, им присваиваются оригинальные имена (идентификаторы) и ука- зываются их типы. Идентификаторы образуются из латинских букв, симво-

ла _ и арабских цифр и могут иметь произвольную длину до 127 символов, но значимыми будут только первые 63 символа. Первым символом должна быть

Пробелы, точки и другие специальные символы не могут

буква или символ

входить в имя. Данные могут быть константами и переменными. Кон- станты – это те данные, значения которых известны заранее и в процессе выполнения программы не изменяются. В качестве констант в Object Pascal могут использоваться целые, вещественные и шестнадцатеричные числа, ло- гические константы, символы, строки символов, конструкторы множеств и признак неопределенного указателя nil. Целые константы – это целые числа со знаком или без в диапазоне от –2 63 до 2 63 -1. Например, 286; -17; +1995 Можно использовать целую константу в шестнадцатеричном виде. Шестнадцатеричное число состоит из шестнадцатеричных символов ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F ), которым предшествует знак доллара $ ( код символа 36 ) Например, $3A4F; $100A Вещественные константы могут быть представлены в двух видах: с фиксированной и плавающей точкой. Константа с фиксированной точкой – это число, содержащее точку, разделяющую целую и дробную часть (наличие целой и дробной части обязательно). Например, -39.013; 0.256 Константа с плавающей точкой – это число, представленное с десятичным порядком: в виде mEp, где m – мантисса (как целые, так и вещественные числа с фиксированной точкой), E или e – признак записи числа с десятичным порядком, p – порядок числа (только целые числа). Например, -7.78Е-3; -13e6; 4.9e5 Логические константы могут принимать только одно из двух значений: True (истина) и False (ложь). Символьная константа – это любой символ, заключенный в апострофы. Допускается использование записи символа путем указания его внутреннего кода, которому предшествует символ #. Например, w’; ‘ф’; #53 Строковые константы – это последовательность символов, заключенная в апострофы. Например, 'БГУИР'; #75#58#93 Конструктор множества – это список элементов множества, обрамленный квадратными скобками. Например, [ 43, 76, 12, 90 ]; [ red, blue, green ] Константы могут иметь свои собственные имена. Этот вариант предпочтительней при многократном использовании константы. Форма описания констант:

Const <идентификатор> = <значение константы>; Например Const Min = 1; // Описание констант Max = 150; A=’Таблица’;

Переменная – это именованный участок оперативной памяти, который в процессе выполнения программы может принимать различные значения. Форма описания переменных:

Var <идентификатор 1,

Например,

Var

> : тип; a, b: integer:

sum, min :extended; c: Char; Тип переменных определяет, какие значения они могут иметь, какая структу- ра ячеек для их размещения используется, и какие операции над ними можно выполнять. В Object Pascal имеется развитая система типов данных. Их мож- но разделить на две группы: скалярные (простые) и структурированные (со- ставные). К скалярному типу относятся данные, представляемые одним зна- чением (числом, символом) и размещаемые в одной ячейке из нескольких байтов. Структурированные типы определяются пользователем через ска- лярные и описанные ранее структурированные с помощью оператора Type следующим образом Type <Тип> = <определение типа>; В языке Object Pascal имеется 7 скалярных типов (целочисленные, вещест- венные, логические (булевские), символьные, перечисляемые, интервальные, дата-время) и 10 основных структурированных типов (строки, массивы, мно- жества, записи, файлы, указатели, процедуры, объекты, варианты, классы). В Object Pascal предусмотрено создания программистом новых типов данных, поэтому общее количество типов, использующихся в программе, может быть сколь угодно большим. Характеристики двух основных скалярных типов представлены в следующих таблицах.

Целые типы.

 

Табл. 2.1.

Unsigned (Беззнаковые)

 

Signed (Знаковые)

Тип

Объем

 

Диапазон

Тип

Объем

Диапазон

Byte

1

 

0

255

ShortInt

1

-128

127

Word

2

 

0

65 535

SmallInt

2

-32 768

32 767

Long,

4

0

4 294 967 295

Integer,

4

-2 147 483 648 2 147 483 647

Cardinal

LongInt

     

Int64

8

-2 63

2 63 -1

Вещественные типы

Табл. 2.2.

Тип

Размер

Значащих цифр

Диапазон

Single

4

7

8

1,5*10 -45

3,4*10 38

Real, Double

8

15

16

5*10 -324

1,7*10 308

Extended

10

19

20

3,4*10 -4951

1,1*10 4932

Comp

8

19

20

-2 63

2 63 -1

Currency

8

19

20

±922 337 203 685 477, 5807

Для экономии памяти следует пользоваться более «короткими» типами, a для повышения точности более «длинными». Следует помнить, что арифметиче- ский сопроцессор всегда обрабатывает числа в формате Extended, а три дру- гих вещественных типа (Double, Real, Single) получаются простым усечением результата до нужных размеров и применяются, как правило, для экономии памяти. Следует так же учесть что тип Real оптимизирован для работы без сопроцессоров, однако его использование на ПК с сопроцессором приводит к дополнительным затратам (в 2 – 5 раз) времени на преобразование формата. Если ваш компьютер оснащен сопроцессором, то не рекомендуется использо- вать тип Real. Из логических типов наиболее часто используется тип Boolean (1 байт), другие логические типы ByteBool (1 байт), Bool (2 байта), WordBool (2 байта) и LongBool (4 байта) введены для совместимости с Windows.

Пользовательские типы переменных К ним относятся переменные перечисляемого и интервального типов. Переменная типа перечисление задается перечислением значений, которые она может принимать. Форма описания этих переменных:

Type <имя типа> = (список значений);

Var <идентификатор 1,

>

: <имя типа>;

или Var <идентификатор 1,

>:

(список значений);

Например Type elem = (Fe, Cu, Na, Zn, Be); Var a, b : elem; или Var a, b : (Fe, Cu, Na, Zn, Be);

Здесь a, b – переменные типа перечисление, которые могут принимать любое из заданных значений. Следует отметить, что описание типа перечисляемой переменной одновременно вводит упорядочение ее значений. Так, для данного примера Fe < Cu < Na < Zn < Be (в операциях сравнения). Для переменных интервального типа указывается некоторое подмножество значений, которые они могут принимать. Форма описания этих переменных:

Type <имя типа> = <константа 1>

Var <идентификатор 1,

или Var <идентификатор 1,

<константа 2>;

> : <имя типа>;

> : <константа 1>

<константа 2>;

где <константа 1>, <константа 2> – соответственно константы, определяющие нижнюю и верхнюю границы значений, которые может принимать интервальная переменная. Значение первой константы должно

быть обязательно меньше значения второй. Эти константы могут быть целого, символьного или перечисляемого типов. Например Type Dni = 1 31; Var x, y : Dni;

В этом примере переменные x и y имеют тип Dni и могут принимать любые

значения из диапазона 1

Выход из диапазона вызывает программное

прерывание. Можно определять интервальный тип и более универсальным способом, задав границы диапазона не значениями констант, а их именами.

31.

Например

Const Min=1;

Max=31;

Type Dni = Min Max; Var x, y : Dni;

2.3. Операторы языка Object Pascal Во всех языках фундаментальным понятием является оператор, кото- рый представляет описание определенного набора действий компьютера. Программа, написанная на языке программирования, состоит из последова- тельности операторов.

2.3.1. Оператор присваивания Одним из самых распространенных операторов является оператор при- сваивания форма записи которого имеет вид:

<имя переменной>:=<выражение>; где составной символ := (записывается без пробелов) означает «присвоить». Результатом выполнения оператора является присваивание переменной, имя которой записано слева результата вычисления <выражения>. Оператор за- канчивается точкой с запятой.

2.3.2. Составной оператор Группа операторов взятая в операторные скобки begin и end воспринима- ется компьютером как один оператор (составной оператор).

2.4. Операции над переменными и константами

Арифметические выражения Арифметические выражения строятся из числовых констант, переменных, стандартных функций и операций над ними. Для обозначения операций используются символы: + (сложение), - (вычитание), * (умножение) и / (деление). С операндами целого типа могут использоваться операции div (целочисленное деление) и mod (остаток целочисленного деления). В арифметическом выражении принят следующий приоритет операций:

1. Вычисление значений стандартных функций;

2. Умножение, деление, div, mod;

3. Сложение и вычитание.

Порядок выполнения операций изменяется с помощью скобок.

Стандартные функции

Таблица 2.3.

Вызов

Тип аргумента

Тип резуль-

Назначение функции

функции

тата

Abs(x)

Целый/веществ

Тип аргум.

Абсолютное значение x Значение числа π Синус x

Pi

Веществ.

Sin(x)

Целый/веществ

Веществ.

Cos(x)

Целый/веществ

Веществ.

Косинус x Арктангенс x Квадрат. корень из x, x>0 Значение квадрата x Значение показ. функ e x Натур. логарифм x, x>0 Целая часть значения x Дробная часть значения x Целая часть значения x «Правильное» округление x до ближайшего целого Сл. число из диап.0<=…<1 Сл. число из диап.0<=…<x Возвращает True, если

Arctan(x)

Целый/веществ

Веществ.

Sqrt(x)

Целый/веществ

Веществ.

Sqr(x)

Целый/веществ

Тип аргум.

Exp(x)

Целый/веществ

Веществ.

Ln(x)

Целый/веществ

Веществ.

Trunc(x)

Вещественный

LongInt

Frac(x)

Вещественный

Веществ.

Int(x)

Вещественный

Веществ.

Round(x)

Вещественный

LongInt

Random

Веществ.

Random(x)

Word

Word

Odd(x)

Целый

Логический

x

нечет. ( x целое)
нечет. ( x целое)

нечет. (x целое)

Succ(x)

Целый

Целый

Возвр. след. за x значение

в

перечисляемом типе

Pred(x)

Целый

Целый

Возвр. предыдущее знач. x

в

перечисляемом типе

Chr(x)

Целый(Byte)

Символьный

Возвр. симв. ASCII кода x Возвр.ASCII код символа x Увеличивает знач. x на 1

Ord(x)

Символьный

Целый(Byte)

Inc(x)

Целый

Целый

Dec(x)

Целый

Целый

Уменьшает знач. x на 1 Увеличивает знач. x на n Уменьшает знач x на n

Inc(x, n)

Целый

Целый

Dec(x, n)

Целый

Целый

A Div B

Целочисленное деление A на B. Возвращает целую часть частного, дробная часть отбрасывается

A Mod B

Восстанавливает целый остаток, полученный при выполнении целочисленного деления.

Отметим, что в тригонометрических функциях аргумент должен быть задан только в радианах. Как видно из таблицы 2.3 в Object Pascal имеются стандартные функции для вычисления только трех тригонометрических функций. Для вычисления остальных необходимо использовать известные математические соотношения:

математические соотношения: tg ( x ) siп ( x ) / cos( x ) ; 2

tg ( x ) siп ( x ) / cos(x ) ;

tg ( x ) siп ( x ) / cos( x ) ; 2 arcsiп (
2
2

arcsiп ( х ) arctg ( x /(1 x

)) ;

cos( x ) ; 2 arcsiп ( х ) arctg ( x /(1 x )) ;

arccos(x arcctg ( x ) ) / / 2 2 arcsiп arctg ( ( x х ) ) ; ; log a ( x ) lп ( x ) / lп ( а ) ;

; log a ( x ) lп ( x ) / lп ( а ) ;

Для вычисления логарифма с основанием а используется соотношение

вычисления логарифма с основанием а используется соотношение 25

Так как в Object Pascal отсутствует операция возведения в степень, то для вы- числения

ние:

используется известное математическое соотноше-

выражения

x

y

y

x = e

соотноше- выражения x y y x = e y ln x = exр ( y lп

y ln x

соотноше- выражения x y y x = e y ln x = exр ( y lп

=exр ( y lп ( x )) ;

Но таким образом нельзя возвести в целую степень отрицательное число. Это можно сделать с использованием операторов цикла. При выполнении дейст- вий с целыми числами, если операнды имеют различные целые типы, то тип результата будет соответствовать типу, который включает в себя оба операн- да. Например, при действиях с ShortInt и Word общим будет тип Integer.

Логические выражения Логические выражения строятся из логических констант и переменных, операций отношения и логических операций. В операциях отношения могут участвовать арифметические и логические выражения, а также символьные данные. Результатом логического выражения является значение True (истина) или False (ложь). Операции отношения : < (меньше), > (больше), = (равно), <= (меньше или равно), >= (больше или равно), < > (не равно). Логические операции:

Not

– >

НЕ

– логическое отрицание;

And

– >

И

– логическое умножение;

Or

– > ИЛИ – логическое сложение.

Xor

– > исключительное ИЛИ.

В логических выражениях операции выполняются слева направо с

соблюдением следующего приоритета:

1. Not;

2. /, Div, Mod, And, Shr, Shl ;

*,

3. -,

+,

Or,

Xor;

4. <>, <,

=,

>, <=,

>=, in.

К переменным символьного типа, кроме операции присваивания, применима функция Ordh), которая возвращает порядковый номер символа ch в кодо- вой таблице. Обратная к ней функция Chr(<порядковый номер символа >) возвращает символ по его порядковому номеру. Для кодировки используется ANSI - кодировка (American National Standart Institute). Функция Predh) воз- вращает символ, предшествующий символу ch в кодовой таблице. Функция Succ(ch) возвращает символ, следующий за символом ch в кодовой таблице. В виду упорядоченности над символами допустимы логические операции от- ношения, например ch > ’a’ , ‘ф’ <> ch, ‘+’ <= ch.

ТЕМА 3. ПРОГРАМИРОВАНИЕ РАЗВЕТВЛЯЮЩИХСЯ АЛГОРИТМОВ

3.1. Определение разветвляющегося алгоритма Алгоритм называется разветвляющимся, если он содержит две или бо- лее ветвей отличающихся друг от друга содержанием вычислений. Выход вычислительного процесса на ту или иную ветвь алгоритма определяется ис- ходными данными задачи или результатами промежуточных расчетов. На рис. 3.1 приведена схема разветвляющегося алгоритма решения квадратного уравнения ax 2 +bx+c=0:

x 1,2

b b 4 ac 2
b
b 4 ac
2

2 a

Начало Ввод a,b,c
Начало
Ввод
a,b,c

d=b 2 -4ac

Нет Да d>0 Нет d=0 Да
Нет
Да
d>0
Нет
d=0
Да

d

d
d

x 1 =(-b+d)/(2a)

x 2 =(-b-d)/(2a)

Вывод x 1 ,x 2
Вывод
x
1 ,x 2
1 =(-b+d)/(2a) x 2 =(-b-d)/(2a) Вывод x 1 ,x 2 x=-b/(2a) Вывод x Нет решения Конец

x=-b/(2a)

Вывод x Нет решения
Вывод
x
Нет
решения
x 1 ,x 2 x=-b/(2a) Вывод x Нет решения Конец Рис. 3.1. Схема
Конец
Конец

Рис. 3.1. Схема разветвляющегося алгоритма

Для организации разветвлений в языке Object Pascal используются операторы goto, if и case.

3.2. Оператор безусловной передачи управления goto Форма записи оператора безусловной передачи управления имеет вид:

goto <метка>;

где <метка> – это идентификатор или целое положительное число без знака, описанные в разделе описаний меток label. Например: labe1 8;

goto 8;

8: w:=exp(x); Оператор goto передает управление оператору с указанной меткой. Оператор, следующий за goto, обязательно должен иметь метку, иначе он никогда не получит управление. По возможности следует избегать использования опера- тора goto так как это приводит к созданию неэффективных программ.

3.3. Оператор условного выбора if Этот оператор служит для разделения естественного порядка выполне- ния операторов программы на две ветви. Он может иметь одну из следующих форм записи:

if <условие> then <оператор1> else < оператор2>; Допускается усеченный вариант (без else-ветви) if <условие> then <оператор>; где <условие> – выражение логического типа. Если условие выполняется, тогда выполняется оператор оператор1, иначе, в первом варианте, выполня- ется оператор оператор2, во втором – выполняется оператор, следующий за оператором if. Перед ключевым словом else точка с запятой не ставится (см. рис. 3.2 – 3.3).

Да Нет Условие Оператор 1 Оператор 2
Да
Нет
Условие
Оператор 1
Оператор 2

Рис. 3.2. Схема действия оператора if

Да Нет Условие Оператор
Да
Нет
Условие
Оператор

Рис. 3.3. Схема действия усеченного оператора if

При вложенности операторов if каждое else соответствует тому then, которое непосредственно ему предшествует, например (см. рис. 3.4):

if <условие1> then if <условие2> then оператор1 else оператор2

else оператор3; Да Нет Условие 1 Да Нет Условие 2 Оператор 1
else оператор3;
Да
Нет
Условие 1
Да
Нет
Условие 2
Оператор 1
Оператор 2
Оператор 3

Рис. 3.4. Схема действия при вложенности операторов if

В условном операторе после then и else можно размещать только один опера- тор. Однако, часто необходимо в какой-либо ветви выполнить группу опера- торов. В Object Pascal имеется возможность объединить группу операторов в

один составной оператор с помощью ключевых слов begin

end (оператор-

ные скобки). Такой составной оператор может быть размещен после then или else.

3.4. Оператор выбора Case Этот оператор служит для разделения естественного порядка выполне-

ния операторов на несколько (более двух) ветвей в зависимости от значения, которое принимает выражение порядкового типа – селектор. Напомним, что к порядковым типам относятся целые, символьные, логические, перечисляе- мые, интервальные. Оператор Case имеет следующую форму записи:

case <селектор> of Список констант 1: оператор 1; Список констант 1: оператор 1;

else оператор 0; end; где <список констант к> представляет перечисление тех значений перемен- ной <селектор> при которых выполняется оператор оператор к. Если значе- ние переменной <селектор> не попала ни в один <список констант к>, вы- полняется оператор 0. Допускается усеченный вариант оператора case, когда else-ветвь может отсутствовать. С помощью оператора case удобно програм- мировать алгоритмы, имеющие возможность выбора из нескольких вариан- тов.

3.5. Возможности, предоставляемые средой Delphi для организации раз- ветвлений При создании программ в среде Delphi для организации разветвлений часто используются компоненты в виде переключателей. Состояние таких пе- реключателей (включен – выключен) визуально отражается на форме. Компо- нент типа TCheckBox представляет собой один независимый переключатель, с помощью которого пользователь может указать свое решение типа «да – нет». В программе состояние переключателя связано со значением булевого свой- ства CheckBox.Checked (true false). Компонент CheckBox, помещенный на форму, позволяет пользователю с помощью щелчка мыши изменить значение CheckBox.Checked, что может быть использовано в операторе if внутри про- граммы, например:

if CheckBox.Checked then оператор1 else оператор2; Компонент типа TRadiogroup представляет собой группу зависимых пере- ключателей. При включении одного из этой группы все остальные переклю- чатели отключаются. В программу номер включенного переключателя (0, 1,

) передается значением свойства Radiogroup.itemindex. Компонент

2,

RadioGroup, помещенный на форму, позволяет пользователю организовать селектор, передающий в программу через переменную целого типа RadioGroup.ItemIndex номер включенного переключателя, который анализи-

руется с помощью оператора case внутри программы, например:

case radiogroup.itemindex of 0: w:=sin(x);

1:w:=ln(x);

2:w:=sqrt(x);

end;

ТЕМА 4. ПРОГРАММИРОВАНИЕ ЦИКЛИЧЕСКИХ АЛГОРИТМОВ

4.1. Понятие циклического алгоритма Под циклом понимается многократное (итерационное) выполнение неко- торой последовательности одних и тех же операторов при различных значе- ниях промежуточных данных. Число повторений может быть задано в явной или неявной форме. Практически все алгоритмы решения задач содержат циклически повторяемые участки. Цикл – это одно из фундаментальных по- нятий программирования. Реализовать его в можно с помощью операторов if

и goto следующим образом:

label m1; …… m1: <1-й оператор тела цикла>; …… <Последний оператор тела цикла>; if <условие продолжения цикла> then goto m1; <1-й оператор вне цикла>; где m1 – метка, которая описывается в разделе объявлений меток label. Цикл продолжается, пока выполняется <условие продолжения цикла>. В этом слу- чае управление передается оператору с меткой m1 (<1-й оператор тела цик- ла>). При первом нарушении <условие продолжения цикла> происходит вы- ход из цикла – передача управления на <1-й оператор вне цикла>. Такая тех- нология организации циклов была характерна для первых алгоритмических языков. Однако, очень скоро были выявлены ее недостатки. Особенно не- удобно оказалось составлять программы автоматизированной отладки и тес- тирования. Поэтому при разработке новых алгоритмических языков были введены специальные операторы, позволяющие организовать циклы без ис- пользования меток. В языке Object Pascal имеется три оператора цикла:

repeat, while, for. Все эти операторы организуют цикл и проверку условия вы- хода из него.

4.2. Оператор цикла с последующей проверкой условия repeat Этот оператор имеет следующую форму записи:

repeat <тело цикла (список операторов)> until <условие окончания цикла>;

и организует повторение операторов, помещенных между ключевыми слова-

ми repeat и until (тело цикла), до тех пор, пока не выполнится <условие окон-

чания цикла>, после чего управление передается следующему за циклом опе- ратору.

Например, необходимо вывести таблицу значений функции y=f(x) на интер- вале [a,b] с шагом h. x:=a; repeat y:=f(x); <Вывод x, y> x:=x+h; until x>b;

4.3. Оператор цикла с предварительной проверкой условия while Этот оператор имеет следующую форму записи:

while <условие продолжения цикла> do begin <тело цикла (список операторов> end;

и организует повторение операторов, помещенных между begin и end, до тех

пор, пока выполняется <условие продолжения цикла>. Заметим, что если <ус- ловие продолжения цикла> не выполнится при входе в цикл, то тело цикла не выполнится ни разу, в отличие от оператора repeat, в котором оно хотя бы один раз выполнится. Например, последняя задача может быть реализована с помощью оператора while следующим образом x:=a; while x<=b do begin y:=f(x); <Вывод x, y> x:=x+h; end;

4.4. Оператор цикла с явно заданныи числом повторений for Этот оператор имеет следующую форму записи:

for k:=m to n do begin <тело цикла (список операторов> end;

и организует повторение операторов при нарастающем изменении перемен-

ной цикла k от начального значения m до конечного n с шагом единица. Заме- тим, что если m>n, то тело цикла не выполнится ни разу. Модификация опе- ратора

for k:=m downto n do begin <тело цикла (список операторов> end ;

организует повторения при убывающем на единицу изменении k. Если m<n, то тело цикла не выполнится ни разу. Примечание: Переменная цикла k мо- жет иметь любой порядковый тип (целочисленный, тип char, интервальный, перечисление). Внимание! Внутри цикла нельзя принудительно изменять пе- ременную цикла. После окончания цикла переменная цикла становится неоп- ределенной и ее значение нельзя использовать. Пример использования этого оператора в случае, когда переменная цикла имеет тип char: Вывести все символы латинского алфавита в обратном порядке в компанент Memo1:

var c: char; . For c:=’z’ downto ‘a’ do

.

.

Memo1.lines.add(c);

Для досрочного прекращения выполнения цикла используется процедура Break, которая прерывает выполнение тела любого цикла и передает управле- ние следующему за циклом оператору. Для прерывания текущей итерации цикла и передачи управления следующей итерации используется процедура Continue.

Общие правила при работе с операторами цикла

1. Циклы можно вкладывать друг в друга, но не пересекать.

2. Можно передавать управление из цикла вовне его (выходить из цикла), но извне передавать управление во внутрь цикла нельзя.

3. Можно досрочно прерывать цикл с помощью процедуры break.

4. Можно досрочно прерывать текущую итерацию с переходом на начало следующей итерации с помощью процедуры continue.

4.5. Вложенные циклы Вложенность циклов имеет место тогда, когда внутри повторяемой час- ти операторов необходимо организовать цикл. Рассмотрим вычисление таб- лицы значений функции S(х,n), представляющую собой сумму ряда

на интервале [a, b] с шагом h=(b-a)/m. Задаются a, b, количест-

во членов ряда n и количество разбиений интервала m. h:=(b-a)/m; x:=a; repeat

n x i i 1
n
x
i
i
1
m . h:=(b-a)/m; x:=a; repeat n x i i 1 1 S ( x , n
1
1

S ( x , n )

s:=0;

for i:=1 to n do

s:=s+(x+1)/i;

< Вывод x, s> until x>b+0.0000001; Следует отметить, что при каждом приращении переменной х накапливается погрешность, связанная с тем, что величина h из-за округлений вычислена не-

точно. Поэтому возможна ситуация, когда после m+1 шага значение х не рав- но b и превышает b на некоторую незначительную величину, имеющую поря- док погрешности округлений. В результате, если условие выхода из цикла за- писано как x>b, то значение функции в точке b не вычисляется и не выводит- ся. Для того, чтобы в точке b функция всегда вычислялась в приведенном ал- горитме используется условие x>b+0.0000001.

4.6. Примеры циклических алгоритмов

Вычисление заданного члена рекуррентной последовательности

а n называется одношаговой рекур-

рентной, если каждый следующий член выражается через один предыдущий по определенному правилу a k =φ(a k-1 ). Поэтому для того, чтобы найти все чле- ны последовательности достаточно задать начальный a 0 . Фрагмент програм- мы вычислений члена с номером n, при заданном а 0 , имеют вид:

Последовательность чисел а 0 1 2

a:=a0;

for k:=1 to n do

a:=f(a);

Заметим, что для реализации алгоритма понадобилось не n, а только две пе-

ременных а0 и а. Последовательность а к сходится к некоторому пределу а,

если при

разность между соседними членами последовательности

этому для нахождения предела последовательности а с заданной точностью используется следующий алгоритм:

. При увеличении k так же стремится к нулю

. По-k так же стремится к нулю k , a k a 0 a k a k

k

,
,

a

k

a 0
a
0

a

k

a k 1
a
k 1
к нулю . По- k , a k a 0 a k a k 1 a:=a0;

a:=a0;

it:=0;

repeat

it:=it+1;

w:=a; a:=f(a); until (abs(a-w)<eps) or (it>100); где it – счетчик количества повторений, который служит как для их подсчета, так и для предотвращения зацикливания алгоритма, если последовательность не сходится к конечному пределу.

Вычисления сумм с использованием рекуррентной последовательности В практике вычислений часто приходится находить всевозможные суммы. Использование рекуррентности позволяет значительно упростить вы-

числения. Представим задачу суммирования в общем виде как

, гдесуммирования в общем виде как S а 0 , а 1 , торую функцию от k

S

в общем виде как , где S а 0 , а 1 , торую функцию от

а 0 , а 1 ,

торую функцию от k. Предположим, что из последовательности а к удается выделить рекуррентную последовательность с к : c k =φ(c k-1 ), представив а к к b k , где b k функция от номера k: b k =f(k). В этом случае программа вычис- ления суммы имеет вид:

n , последовательность, каждый член которой представляет неко-

а

к

а

последовательность, каждый член которой представляет неко- а к а 35

c:=c0

s:=c*f(0);

for k:=1 to n do begin

c:=φ(c);

s:=s+c*f(k);

end;

ТЕМА 5. ОТЛАДКА ПРОГРАММ И ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ

Мастерство программиста определяется умением составить правильный алгоритм, быстро отладить и протестировать программу его реализующую, т. е.:

1. выявить и исправить все ошибки;

2. убедиться в правильности алгоритма.

5.1. Ошибки на этапе компиляции Эти самые простые, их находит компилятор, который останавливается в

том месте, где обнаружена ошибка и внизу окна текста выдает сообщение о ее характере. Например:

– «Несоответствие типа i:=2.5;»

– «Переменная нигде не используется»

Компилятор часто выдает сообщения, указывая на совершенно правильную строку, но обычно это результат ошибки в предыдущей строке. Постарайтесь

исправить все замечания компилятора, даже если они несущественны.

5.2. Понятие исключительной ситуации Под исключительной ситуацией понимается такое состояние, возни- кающее при выполнении некоторых действий программы (например: деление на нуль, попытка открыть несуществующий файл, выход индекса за допусти- мые пределы массива и т. п.), при котором требуется выполнить определен- ные действия для продолжения ее работы или корректного завершения. При работе в среде Delphi возникновение одной из вышеназванных или других подобных ситуаций, которых насчитывается более 50, обычно приводит к полной остановке выполнения программы с указанием причины, что не все- гда удобно. Каждая такая ситуация имеет свое имя и тип. Для повышения на- дежности программы и защиты ее от преждевременного завершения в Delphi разработчику предоставлена возможность с помощью определенных операто- ров «перехватить» различные исключительные ситуации и организовать вы- полнение определенных операций при их возникновении. При отладке про- граммы, использующей обработку исключительных ситуаций предварительно необходимо отменить стандартную реакцию среды Delphi на эти ситуации. Для этого надо в главном меню Delphi отключить опцию Stop on Delphi Ex- ceptions находящуюся в Tools Debbuger Options на закладке Language Excep- tions. В этом случае отключается стандартная реакция среды Delphi на все ис- ключительные ситуации. С помощью директив можно отключать реакцию на отдельные исключительные ситуации на определенном этапе работы про- граммы. Например:

{$I-} <список операторов> {$I+} Директива {$I-} отключает реакцию среды на исключительные ситуации свя- занные с ошибками ввода – вывода при выполнении <список операторов>. Директива {$I+} – включает ее снова.

5.3. Защищенные блоки Для перехвата исключительных ситуаций и описания реакций на их

возникновение в Object Pascal предусмотрены операторы организации защи-

щенного блока try

end;

двух видов (except и finally):

1-й вид:

try // попытаться выполнить <последовательность защищенных операторов> except // обработчики исключительных ситуаций:

on <тип искл. ситуации 1> do <оператор–обработчик 1>;

on <тип искл. ситуации k> do <оператор–обработчик k>; else // эта ветвь может отсутствовать <операторы выполняемые если перехваченная ситуация не обнаружена среди типов ситуаций 1 k > end; <следующий оператор>; Здесь между except и else приводится список нескольких стандартных типов ситуаций между ключевыми словами on, do и соответствующих каждому из них операторов-обработчиков, выполняемых, если возникает эта ситуация. 2-й вид:

try <последовательность защищенных операторов> finally <последовательность операторов, которые выполняются всегда, независимо от того перехвачена ситуация или нет> end; <следующий оператор> Эти блоки отличаются лишь способом обработки перехваченной в <последо- вательности защищенных операторов> исключительной ситуации. Если все операторы в этой последовательности выполнялись без возникновения ис- ключительной ситуации, то в блоке except управление передается на <сле- дующий оператор>, в блоке finally на оператор, следующий за словом finally. Если при выполнении одного из защищенных операторов возникла исключи- тельная ситуация, то следующие за ним защищенные операторы пропускают- ся, причем в блоке finally управление передается опять на оператор, следую- щий за словом finally. В блоке же exception управление передается тому опе- ратору-обработчику, <тип искл. ситуации> которого соответствует возник-

<тип искл. ситуации> которого соответствует возник- 38

шей ситуации, и после его выполнения – <следующему оператору>. Если в списке операторов-обработчиков не обнаружен тип возникшей ситуации, то управление передается операторам, стоящим между else и end. Если при этом ветвь else отсутствует, то выполняется стандартная обработка ситуации, пре- дусмотренная в среде Delphi. Следует помнить, что поиск нужного обработ- чика осуществляется с начала списка вниз до первого, соответствующего. По- этому, если в списке имеется несколько типов ситуаций, соответствующих возникшей, то выполняется обработчик встретившийся первый. Если для со- ставителя программы важен лишь сам факт возникновения исключительной ситуации, то возможна следующая конструкция:

try <последовательность защищенных операторов> except <операторы, которые выполняются при возникновении исключительной ситуации>

end; которая отличается от блока finally тем, что область <операторы…> здесь выполняется только в случае возникновения исключительной ситуации. За- щищенные блоки могут вкладываться друг в друга на любую глубину, при-

чем в любой области, где возможно вставить оператор try

end.

5.4. Некоторые стандартные типы исключительных ситуаций Табл. 5.1

Тип тельной ситуации

исключи-

Причина

EAbort

Намеренное прерывания программы, генерируемое про- цедурой Abort

EArrayError

Ошибка при операциях с массивами: использование ошибочного индекса массива, добавление слишком большого числа элементов в массив фиксированной дли- ны (для использования требует подключения модуля mxarrays)

EConvertError

Ошибка преобразования строки в другие типы данных

EDivByZero

Попытка целочисленного деления на нуль

ERangeError

Целочисленное значение или индекс вне допустимого диапазона (при включенной директиве проверки границ массива {$R+})

EIntOverflow

Переполнение при операции с целыми числами (при включенной директиве {$Q+})

EInvalidArgument

Недопустимое значение параметра при обращении к ма- тематической функции

EZeroDivide

Деление на нуль числа с плавающей точкой

EOutOfMemory

Недостаточное количество памяти

EInvalidOp

Неправильная операция с плавающей точкой

EOverFlow

Переполнение при выполнении операции с плавающей точкой

EAssertionFailed

Возникает при намеренной генерации исключительной ситуации с помощью процедуры Assert (при включенной директиве { $С+ })

5.5. Инициирование собственных исключительных ситуаций Возникновение исключительной ситуации может быть инициировано самим разработчиком программы для обработки некоторых «своих» ситуа- ций. Для этого имеется три оператора:

Во-первых,