107
Министерство образования Республики Беларусь Учреждение образования «Белорусский государственный университет информатики и радиоэлектроники» Кафедра «Вычислительные методы и программирование» Шестакович В. П. Электронный учебно-методический комплекс по дисциплине ОСНОВЫ АЛГОРИТМИЗАЦИИ И ПРОГРАММИРОВАНИЯДля студентов специальностей 1–36 04 01 «Электронно-оптические системы и технологии», 1–39 02 02 «Проектирование и производство радиоэлектронных средств», 1–39 02 03 «Медицинская электроника», 1–39 02 01 «Моделирование и компьютерное проектирование радиоэлектронных средств», 1–39 03 01 «Электронные системы безопасности». Лабораторный практимум Минск 2011

Лабораторный практикум

Embed Size (px)

Citation preview

Page 1: Лабораторный практикум

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

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

радиоэлектроники»

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

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

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

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

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

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

1–36 04 01 «Электронно-оптические системы и технологии», 1–39 02 02 «Проектирование и производство радиоэлектронных средств»,

1–39 02 03 «Медицинская электроника», 1–39 02 01 «Моделирование и компьютерное проектирование

радиоэлектронных средств», 1–39 03 01 «Электронные системы безопасности».

Лабораторный практимум

Минск 2011

Page 2: Лабораторный практикум

СОДЕРЖАНИЕ

ТЕМА 1. ОСНОВЫ РАБОТЫ В СРЕДЕ DELPHI. ПРОГРАММИРОВАНИЕ ЛИНЕЙНЫХ АЛГОРИТМОВ ................................................................................... 5

1.1. Интегрированная среда разработчика Delphi ................................................ 5 1.2. Структура программ Delphi............................................................................. 6 1.3. Пример написания программы........................................................................ 7

1.3.1. Настройка формы ..................................................................................... 7 1.3.2. Изменение заголовка формы..................................................................... 7 1.3.3. Размещение строки ввода (Edit) .............................................................. 8 1.3.4. Размещение надписей (Label) ................................................................... 8 1.3.5. Размещение многострочного окна вывода (Memo)................................ 8 1.3.6. Размещение кнопки Close.......................................................................... 9 1.3.7. Написание программы обработки события создания формы (FormCreate) ......................................................................................................... 9 1.3.8. Создание программы обработки события нажатия кнопки (ButtonClick) .......................................................................................................... 9 1.3.9. Запуск и работа с программой ............................................................... 10

1.4. Индивидуальные задания .............................................................................. 12 Тема 2. ОБРАБОТКА СОБЫТИЙ В СРЕДЕ DELPHI. ПРОГРАММИРОВАНИЕ РАЗВЕТВЛЯЮЩИХСЯ АЛГОРИТМОВ .............................................................. 14

2.1. Обработка событий ........................................................................................ 14 2.2. Операторы if и case языка Object Pascal....................................................... 15 2.3. Переключатели в Delphi................................................................................. 15 2.4. Пример написания программы...................................................................... 15

2.4.1. Coздание формы....................................................................................... 16 2.4.2. Работа с компонентом СheckBox.......................................................... 16 2.4.3. Работа с компонентом RadioGroup...................................................... 17

2.5. Индивидуальные задания .............................................................................. 18 Тема 3. СРЕДСТВА ОТЛАДКИ ПРОГРАММ В СРЕДЕ DELPHI. ПРОГРАММИРОВАНИЕ ЦИКЛИЧЕСКИХ АЛГОРИТМОВ ............................ 20

3.1. Средства отладки программ в Delphi ........................................................... 20 3.2. Операторы организации циклов repeat, while, for..................................... 21 3.3. Пример написания программы...................................................................... 22 3.4. Индивидуальные задания .............................................................................. 24

Тема 4. ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ МАССИВОВ..................... 27

4.1. Обработка исключительных ситуаций......................................................... 27 4.2. Использование функций ShowMessage и MessageDlg................................ 29 4.3. Работа с массивами......................................................................................... 30 4.4. Компонент StringGrid..................................................................................... 30 4.5. Пример написания программы...................................................................... 31 4.6. Индивидуальные задания .............................................................................. 35

2

Page 3: Лабораторный практикум

ТЕМА 5. УКАЗАТЕЛИ И ИХ ИСПОЛЬЗОВАНИЕ ПРИ РАБОТЕ С ДИНАМИЧЕСКИМИ МАССИВАМИ ....................................................................37

5.1. Динамическое распределение памяти...........................................................37 5.2. Индивидуальные задания ...............................................................................37

Тема 6. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ ПОДПРОГРАММ И МОДУЛЕЙ .................................................................................................................39

6.1. Использование модулей .................................................................................39 6.2. Создание модуля .............................................................................................39 6.3. Подключение модуля ......................................................................................40 6.4. Пример написания программы ......................................................................40 6.5. Индивидуальные задания ...............................................................................42

Тема 7. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ МНОЖЕСТВ И СТРОК.........................................................................................................................43

7.1. Системы счисления .........................................................................................43 7.2. Индивидуальные задания ...............................................................................43

Тема 8. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ ЗАПИСЕЙ И ФАЙЛОВ ....................................................................................................................45

8.1. Компоненты OpenDialog и SaveDialog..........................................................45 8.2. Настройка компонентов OpenDialog и SaveDialog ......................................45 8.3. Пример написания программы ......................................................................46 8.4. Индивидуальные задания ...............................................................................51

Тема 9. ПРОГРАММИРОВАНИЕ С ОТОБРАЖЕНИЕМ ГРАФИЧЕСКОЙ ИНФОРМАЦИИ ........................................................................................................53

9.1. Как рисуются изображения ............................................................................53 9.2. Как строится график с помощью компонента Chart....................................53 9.3. Индивидуальные задания ...............................................................................54

ТЕМА 10. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ РЕКУРСИИ .....56 10.1. Понятие рекурсии..........................................................................................56 10.2. Пример решения задачи ...............................................................................56 10.3. Индивидуальные задания .............................................................................59

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

11.1. Работа со списками .......................................................................................61 11.2. Индивидуальные задания .............................................................................61

ТЕМА 12. СПИСОК НА ОСНОВЕ РЕКУРСИВНЫХ ДАННЫХ В ВИДЕ СТЕКА ........................................................................................................................62

12.1. Работа со списками .......................................................................................62 12.2. Индивидуальные задания .............................................................................62

ТЕМА 13. ОРГАНИЗАЦИЯ ОДНОНАПРАВЛЕННЫХ СПИСКОВ В ВИДЕ ОЧЕРЕДИ ...................................................................................................................64

13.1. Работа со списками .......................................................................................64 13.2. Индивидуальные задания .............................................................................64

ТЕМА 14. ОРГАНИЗАЦИЯ ДВУНАПРАВЛЕННЫХ СПИСКОВ В ВИДЕ ОЧЕРЕДИ ...................................................................................................................66

3

Page 4: Лабораторный практикум

14.1. Работа со списками....................................................................................... 66 14.2. Индивидуальные задания ............................................................................ 66

ТЕМА 15. МЕТОДЫ РЕШЕНИЯ ЗАДАЧ ЛИНЕЙНОЙ АЛГЕБРЫ................... 68 15.1. Методы и алгоритмы решения задач линейной алгебры ......................... 68 15.2. Пример написания программы.................................................................... 73 15.3. Индивидуальные задания ............................................................................ 76

ТЕМА 16. АППРОКСИМАЦИЯ ФУНКЦИЙ. ВЫЧИСЛЕНИЕ ОПРЕДЕЛЕННЫХ ИНТЕГРАЛОВ ........................................................................ 77

16.1. Методы и алгоритмы аппроксимации функций и вычисления определенных интегралов..................................................................................... 77 16.2. Пример написания программы.................................................................... 80 16.3. Индивидуальные задания ............................................................................ 83

ТЕМА 17. МЕТОДЫ РЕШЕНИЯ НЕЛИНЕЙНЫХ УРАВНЕНИЙ.................... 84 17.1. Методы и алгоритмы решения нелинейных уравнений........................... 84 17.2. Пример написания программы.................................................................... 84 17.3. Индивидуальные задания ............................................................................ 86

ТЕМА 18. МЕТОДЫ НАХОЖДЕНИЯ МИНИМУМА ФУНКЦИИ НЕСКОЛЬКИХ ПЕРЕМЕННОЙ ............................................................................. 88

18.1. Методы и алгоритмы нахождения минимума ........................................... 88 18.2. Пример написания программы.................................................................... 88 18.3. Индивидуальные задания ............................................................................ 91

ТЕМА 19. РЕШЕНИЕ ЗАДАЧИ КОШИ ДЛЯ ОБЫКНОВЕННЫХ ДИФФЕРЕНЦИАЛЬНЫХ УРАВНЕНИЙ .............................................................. 92

19.1. Методы и алгоритмы решения обыкновенных дифференциальных уравнений ............................................................................................................... 92 19.2. Пример написания программы.................................................................... 98 19.3. Индивидуальные задания .......................................................................... 100

ПРИЛОЖЕНИЕ 1. Процедуры и функции для преобразования строкового представления чисел ............................................................................................... 102 ПРИЛОЖЕНИЕ 2. Математические формулы .................................................... 104 ПРИЛОЖЕНИЕ 3. Таблицы символов ASCII...................................................... 105 ЛИТЕРАТУРА......................................................................................................... 107

4

Page 5: Лабораторный практикум

ТЕМА 1. ОСНОВЫ РАБОТЫ В СРЕДЕ DELPHI. ПРОГРАММИРОВАНИЕ ЛИНЕЙНЫХ АЛГОРИТМОВ Цель лабораторной работы: научиться разрабатывать простейшую

программу в среде Delphi. Написать и отладить программу с линейным алгоритмом.

1.1. Интегрированная среда разработчика Delphi Программная среда разработки Delphi состоит из нескольких

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

Рис. 1.1. — Программная среда Borland Delphi 7.0 1 – главное окно; 2 – основное меню; 3 – пиктограммы основного меню;

4 – окно списка объектов; 5 - окно инспектора объектов; 6 – меню объектов; 7 – окно редактора текста программ; 8 - окно формы;

Главное окно необходимо для управления процессом создания

программы. Основное меню содержит все необходимые средства для управления проектом. Пиктограммы облегчают доступ к наиболее часто применяемым командам основного меню. Через меню объектов (компонентов) осуществляется доступ к набору стандартных сервисных программ среды Delphi, которые описывают некоторый визуальный элемент (компонент),

5

Page 6: Лабораторный практикум

помещенный разработчиком программы в окно формы. Каждый компонент имеет определенный набор свойств (параметров), которые разработчик может задавать, например цвет, заголовок окна, надпись на кнопке, размер и тип шрифта и др.

Окно инспектора объектов (вызывается c помощью клавиши F11) предназначено для изменения свойств выбранных компонентов и содержит две вкладки. Вкладка Properties (Свойства) предназначена для изменения свойств компонента, вкладка Events (События) – для определения реакции компонента на то или иное событие (например, нажатие определенной клавиши или щелчок «мышью» по кнопке).

Окно формы представляет собой визуальную оболочку программы. В это окно в процессе разработки программы помещаются визуальные и невидимые компоненты.

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

1.2. Структура программ Delphi Приложение в среде Delphi состоит из файлов с исходным текстом

программы (*.pas), файла формы (*.dfm) содержащем описание формы и ее компанентов, файла проекта (*.dpr), который связывает вместе все файлы проекта, ресурсного файла (*.res), содержашего значки, картинки, меню, которые будут помещаться в форму, файла настроек проекта (*.dof), файла (*.dcu), содержащего результат компиляции файла с расширением (*.pas) и файла, содержащего единый исполняемый файл (*.exe).

В файле проекта находится информация о модулях, составляющих данный проект. Файл проекта автоматически создается и редактируется средой Delphi и не предназначен для редактирования.

Файл исходного текста – программный модуль (Unit) предназначен для размещения текстов программ. В этом файле разработчик размещает текст

6

Page 7: Лабораторный практикум

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

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

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

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

арифметического выражения 3 2

2 | |( ) *( ) ln( )

ye xu tg x yarctg z x

−= +

+.

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

1.3.1. Настройка формы Для создания нового проекта в основном меню выбирается пункт

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

1.3.2. Изменение заголовка формы Новая форма имеет одинаковое имя (свойство Name) и заголовок (свойство

Caption) – Form1. Для изменения заголовка активируется форма щелчком мыши

7

Page 8: Лабораторный практикум

на форме и на вкладке Properties инспектора объектов в правой ячейке от свойства Caption вводится новый заголовок окна, например «Моя первая программа».

1.3.3. Размещение строки ввода (Edit) Для ввода данных, а так же вывода информации, которая вмещается в

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

Для этого необходимо сначала щелкнуть мышью по пиктограмме в меню компонентов 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.3.4. Размещение надписей (Label) На рис. 1.2 на форме имеются четыре пояснительные надписи. Для

нанесения таких надписей на форму используется компонент Label.

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

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

Для вывода нескольких строк на экран можно использовать компонент

Memo (пиктограмма в меню компонентов Standard). Для отображения вертикальной и горизонтальной полос прокрутки в данном компоненте, во вкладке Properties инспектора объектов необходимо установить свойство ScrollBars в положение SSBoth. Информация, которая отображается построчно в окне Memo, находится в свойстве Memo.Lines. Новая строка добавляется

8

Page 9: Лабораторный практикум

методом 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.3.6. Размещение кнопки Close

Для окончания работы программы лучше использовать не стандартную кнопку для закрытия окна , а компонент BitBtn расположенный на странице Additional меню компонентов и представляющий собой разновидность стандартной кнопки Button. Его отличительная особенность – наличие растрового изображения на поверхности кнопки, которое определяется свойством Clyph. Кроме того, имеется свойство Kind, которое задает одну из 11 стандартных разновидностей кнопок. Кнопка bkClose закрывает главное окно и завершает работу программы.

1.3.7. Написание программы обработки события создания формы (FormCreate) После запуска программы, на этапе ее выполнения, происходит

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

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

выбрать в меню компонентов Standart пиктограмму . Для изменения надписи на кнопке можно использовать свойство Caption. После этого два раза щелкнуть мышью по кнопке. В тексте программы появится текст процедуры обработчика события «щелчок мыши по кнопке»

Procedure TForm1.ButtonClick(Sender:TObject); Begin

9

Page 10: Лабораторный практикум

End; Наберите текст этой процедуры (см. Листинг 1).

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

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

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

Запустить программу можно, выбрав в главном меню пункт Run – >Run или нажав клавишу F9, или щелкнув мышью по пиктограмме . При этом происходит компиляция программы и, если нет ошибок, компоновка программы и создание исполняемого файла с расширением exe. На экране появляется активная форма программы (рис. 1.2).

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

Дальнейшая работа с программой осуществляется следующим образом. В соответствующих окнах задаются значения переменных x, y, z. Производится щелчок мыши по кнопке «Вычислить». В окне Memo1 появляется результат.

10

Page 11: Лабораторный практикум

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

11

Page 12: Лабораторный практикум

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.

1.4. Индивидуальные задания По указанию преподавателя выберите индивидуальное задание.

Установите необходимое количество окон Edit, меток Label. Выберите необходимые типы переменных и функции их преобразования при вводе и выводе данных. С помощью инспектора объектов измените цвет формы, шрифт выводимых символов.

1. 2

2 2

2cos6 1 .

0.5 sin 3 /5

xzt

y z

π⎛ ⎞−⎜ ⎟ ⎛ ⎞⎝ ⎠= +⎜ ⎟+ −⎝ ⎠

При x=14.26, y=-1.22, z=3.5×10-2 t=0.564846.

2. ( )23

22 2

8 11 .

2xx yx y

u e tx y

−+ − += −

+ +g z +

При x=-4.5, y=0.75×10-4, z=0.845×102 u=-55.6848.

3. ( )22

2 2

1 sin 1cos .2

1

yx yv x a

zyxx y

+ + ⎛ ⎞= + ⎜ ⎟⎝ ⎠−

+

rctg

При x=3.74×10-2, y=-0.825, z=0.16×102, v=1.0553.

4. ( )2 2 3 41 2sincos cos 1 .

2 3 4y z z zw x y z+ ⎛ ⎞

= − + + + +⎜ ⎟⎝ ⎠

При x=0.4×104, y=-0.875, z=-0.475×10-3 w=1.9873.

5. ( ) ( )2ln sin .2

x yy x arctgα − ⎛ ⎞= − +⎜ ⎟⎝ ⎠

z

При x=-15.246, y=4.642×10-2, z=20.001×102 α =-182.036.

12

Page 13: Лабораторный практикум

6. ( ) ( )2 2310 arcsin .yx x z xβ += + − − y

При x=16.55×10-3, y=-2.75, z=0.15 β =-40.63069.

7. ( ) ( )2

2315 arccos .

4x x y x

arctg x xx y z x

γ+ − +

= −− +

При x=0.1722, y=6.33, z=3.25×10-4 γ =-205.306.

8. ( ) ( )

6 23 ln .x yx ye x y

x yarctg x arctg z

ϕ+− −

= ++

+

При x=-2.235×10-2, y=2.23, z=15.221 ϕ =39.374.

9. ( ) ( )( )

32

cos.

1

yx

zyy xyx y x

x y xψ

−−

= − + −+ −

При x=1.825×102, y=18.225, z=-3.298×10-2 ψ =1.2131.

10. 3 1/sin42 .x x za x y e− −= + При x=3.981×10-2, y=-1.625×103, z=0.512 a=1.26185.

11. ( )3

2

3

sin1cos .

2

x

x y

zx yx y

b y y xe −

⎛ ⎞− +⎜ ⎟⎜ ⎟+⎝ ⎠= +

+

При x=6.251, y=0.827, z=25.001 b=0.7121.

12. ( ) ( )2

62 3 11

x yy xy arctgz

сx

y

.

π⎛ ⎞−⎜ ⎟⎝ ⎠= + −

++

При x=3.251, y=0.325, z=0.466×10-4 c=4.2514.

13. ( )

34

2

1sin

y xfx y z tg

+ −=

− + z.

При x=17.421, y=10.365×10-3, z=0.828×105 f=0.33056.

14. ( )1

1/sin

32 1

22 3

xz

yxyg xx yy

+−

+= + +

+− +.

При x=12.3×10-1, y=15.4, z=0.252×103 g=82.8257.

15. ( )2 31 1

11 2

y y y x y xx eh y xx y tgz

+ − − −+= + − + −

+ − 3.

При x=2.444, y=0.869×10-2, z=-0.13×103, h=-0.49871.

13

Page 14: Лабораторный практикум

ТЕМА 2. ОБРАБОТКА СОБЫТИЙ В СРЕДЕ DELPHI. ПРОГРАММИРОВАНИЕ РАЗВЕТВЛЯЮЩИХСЯ

АЛГОРИТМОВ Цель лабораторной работы: научиться пользоваться компонентами

организации переключений (CheckBox, RadioGroup). Написать и отладить программу разветвляющегося алгоритма.

2.1. Обработка событий Обо всех происходящих в системе событиях, таких как создание формы,

нажатие кнопки мыши или клавиатуры и т. д., ядро системы Windows информирует работающие программы путем посылки соответствующих сообщений. Среда Delphi позволяет принимать и обрабатывать такие сообщения. Каждый компонент содержит относящиеся к нему обработчики сообщений на вкладке Events инспектора объектов. Для создания обработчика события необходимо раскрыть список компонентов в верхней части окна инспектора объектов и выбрать необходимый компонент. Затем, на вкладке Events, нажатием левой клавиши мыши, выбрать обработчик и дважды щелкнуть по его левой (пустой) части. В ответ среда Delphi активизирует окно текста программы и покажет заготовку процедуры обработки выбранного события. Каждый компонент имеет свой набор обработчиков событий, однако некоторые из них присуши большинству компонентов. Наиболее часто применяемые события представлены в табл. 2.1.

Таблица 2.1

Событие Описание события OnActivate Событие при активировании компонента OnCreate

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

OnKeyPress

Возникает при нажатии кнопки на клавиатуре. Параметр Key имеет тип Char и содержит ASCII-код нажатой клавиши (клавиша Enter клавиатуры имеет код #13, клавиша Esc – #27 и т.д.)

OnKeyUp Является парным событием для OnKeyDown и возникает при отпускании ранее нажатой клавиши

OnClick Возникает при нажатии кнопки мыши в области компонента OnDblClick Возникает при двойном нажатии кнопки мыши в области

компонента

14

Page 15: Лабораторный практикум

2.2. Операторы if и case языка Object Pascal

Для программирования разветвляющихся алгоритмов в языке Object Pascal используются логические переменные типа boolean, которые могут принимать только два значения – true (да, правда) и false (нет, ложь), а также операторы if и case. Оператор if проверяет результат логического выражения, или значение переменной типа boolean, и организует разветвление вычислений. Например, для x, y, u: extended фрагмент программы с оператором if может выглядеть:

if x>y then u:=y-x else u:=x-y;

Оператор выбора case организует разветвления в зависимости от значения некоторой переменной порядкового типа. Например, для k: integer:

case k of 0: u:=x+y; 1, 5: u:=x-y; 2, 4, 6: u:=x*y else u:=0; end; В соответствии со значением переменной k вычисляется переменная u.

Если k=0, то u=x+y, если k=1 или 5, то u=x-y, если k=2 или 4 или 6, то u=x*y и, наконец, u=0 при остальных значениях k, отличных от 0, 1, 2, 4, 5, 6.

2.3. Переключатели в Delphi

При создании программ в Delphi для организации разветвлений часто используются компоненты в виде переключателей. Состояние таких переключателей (включен – выключен) визуально отражается на форме. На форме (рис. 2.1) представлены переключатели двух типов (CheckBox, RadioGroup). Компонент CheckBox представляет собой один независимый переключатель, с помощью которого пользователь может указать свое решение типа «да – нет». В программе состояние переключателя связано со значением булевого свойства CheckBox.Checked. Компонент Radiogroup организует группу зависимых переключателей. При включении одного из этой группы все остальные переключатели отключаются. В программу номер включенного переключателя (0, 1, 2, ..) передается значением свойства Radiogroup.itemindex, которое анализируется с помощью оператора case.

2.4. Пример написания программы Задание: ввести два числа – x, y. При выполнении в качестве функции

f(x) использовать по усмотрению одну из трех функций: sin(x), cos(x) или ex. Вычислить функцию r(x) по формулам:

r(x)=(f(x)+y)2, если 1<x<2, r(x)=f(x)2+ln(|3*y|), если 4<x<5, r(x)=f(x)+cos(y), в остальных случаях.

Предусмотреть возможность округления результата до целого.

15

USER
)
Page 16: Лабораторный практикум

Создать форму, представленную на рис 2.1, и написать соответствующую программу.

Рис. 2.1. Вид формы выполняемой программы

2.4.1. Coздание формы Создайте форму, такую же, как в первой лабораторной работе,

скорректировав текст надписей и положение окон Edit.

2.4.2. Работа с компонентом СheckBox

Выберите в меню компонентов Standard пиктограмму

и поместите ее в нужное место формы. С помощью инспектора объектов измените заголовок (свойство Caption) на «Округлять». В тексте программы появилась переменная CheckBox1 типа TCheckBox. Теперь в зависимости от того, включен или нет переключатель, свойство CheckBox1.Checked будет принимать значения true или false.

16

Page 17: Лабораторный практикум

2.4.3. Работа с компонентом RadioGroup

Выбрать в меню компонентов Standard пиктограмму

и поместить ее в нужное место формы. На форме появится окаймленный линией чистый прямоугольник с заголовком RadioGroup1. Замените заголовок (свойство Caption) на «Выбор функции». Для того чтобы разместить на компоненте переключатели, необходимо свойство Columns установить равным единице (переключатели разместятся в одном столбце). После двойного щелчка по правой части свойства Items появится строчный редактор списка заголовков переключателей. Набрать три строки с именами функций: в первой строке – «sin(x)», во второй – «cos(x)», в третьей – «exp(x)» и нажать кнопку «ОК». После этого на форме внутри окаймления появится три круглых окна переключателей с введенными надписями. Обратите внимание на то, что в тексте программы появилась переменная RadioGroup1 типа TRadioGroup. Теперь при включении одного из переключателей группы в свойстве RadioGroup1.ItemIndex целого типа будет находиться номер выбранного переключателя, что используется в тексте приведенной программы. Форма приведена на рис. 2.1. Текст программы приведен в листинге 2.1. Unit Unit1; Листинг 2.1

interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, Buttons, StdCtrls, ExtCtrls;

type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; Memo1: TMemo; RadioGroup1: TRadioGroup; Label1: TLabel; Label2: TLabel; BitBtn1: TBitBtn; CheckBox1: TCheckBox; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1;

17

Page 18: Лабораторный практикум

implementation {$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject); begin

// Активировать 1-ю кнопку в RadioGroup1 radiogroup1.itemindex:=0;

end;

procedure TForm1.Button1Click(Sender: TObject); var x,y,f,r:extended; s:string;

begin x:=strtofloat(edit1.Text); y:=strtofloat(edit2.Text); case radiogroup1.itemindex of

0: begin f:=sin(x); s:='sin(x)'; end; 1: begin f:=cos(x); s:='cos(x)'; end; 2: begin f:=exp(x); s:='exp(x)'; end;

end;

if(x>1)and(x<2)then r:=sqr(f+y) else if(x>4)and(x<5)then r:=f*f+ln(abs(3*y)) else r:=f+cos(y);

if CheckBox1.Checked then memo1.Lines.Add('x='+edit1.Text+' y= '+edit2.Text+ ' f(x)='+s+ ' округленный результат='+inttostr(round(r))) else memo1.Lines.Add('x='+edit1.Text+' y= '+edit2.Text+ ' f(x)='+s+ ' результат='+floattostrf(r,fffixed,8,3));

end;

end.

2.5. Индивидуальные задания В вариантах 1–10 вычислить выражение по одной из трех формул в

зависимости от результата выполнения условия, в вариантах 11–15 вычислить

18

Page 19: Лабораторный практикум

максимальные и минимальные из сравниваемых выражений. В качестве функции f(x) использовать по выбору: sh(x), x2 или ex.

1. 2( ( ) ) , 10

( ) cos( ), 1( ) , иначе

r f x y x yr f x y x yr f x y

= + ⋅ >= ⋅ ⋅ <= +

2. 3

ln( 2) ( ), / 0sin ( ( )), / 0

( ) , иначе

r y f x x yr y tg f x x yr f x y

= + + >= − <= ⋅

3.

( )

4

( ), 5 9( ) ( ) , 10

( ) ( ), иначе

f xr e sh y xr ch y f x x

r f x tg y

= + < <= + >

= ⋅ 4.

ln ( ) , 3 8cos( ( )) , 12

( ( ) cos( )), иначе

r y f x x yr f x y x yr sh f x y

= + < ⋅ <= − ⋅ >= +

5.

3

3 2

3

( ) ( ), 12( ( ) ) , 7

cos( ( ) ), иначе

r f x ctg y x yr sh f x y x yr x f x

= + ⋅ >= + ⋅= −

< 6.

3

3 2

3

( ) sin( ), 5( ( ) ) , 7

cos( ( ) ), иначе

r f x y x yr ch f x y x yr x f x

= + ⋅ <= + ⋅ >= +

7.

2( ( ) ) , 1 4( ) ( ), 8 10( ) , иначе

r f x y x yr f x tg y x yr f x y

= + < ⋅ <= ⋅ < ⋅ <= +

8.

( )

4

cos( ), 2 4( ) ( ) , 10

( ) ( ), иначе

f xr e y xr sh y f x x

r f x tg y

= + <= + >

= ⋅

<

9. 3

( ) ( ), 0ln ( ( )), / 0

( ) , иначе

r ctg y f x x/yr y tg f x x yr f x y

= += + <= ⋅

> 10.

3

3 2

3

( ) sin( ), 0( ( ) ) , 11( ( ) ), иначе

r f x y x yr ch f x y x yr tg x f x

= + ⋅ <= + ⋅ >= +

11. ( )

( )2

3

max ( ), 3, 15.

min ( ) 1, 1, sin( )

f x y zr

f x y z

+ −= +

+ −

12. ( )

( )3

2

min ( ) , , sin( ) 5.

max ( ), cos( ), 12

f x y y z y zr

f x y z

+ − +=

+

13. ( ) ( )2 2 2min ( ) , , ln( 3) max ( ), sin( )

.2 ( )

f x z y z z y f x z yr

tg y z

+ + + − + +=

+

14. ( )

( )2

2

max ( ) , ,.

min ( ) , cos( ) ,

f x y y z xyzr

f x y y z x y z

+ +=

+ + + +

15. ( )2 2 2max min( ( ) , ), ln( 2), .r f x y z y z y= + + + 2z+

19

Page 20: Лабораторный практикум

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

АЛГОРИТМОВ Цель лабораторной работы: изучить простейшие средства отладки

программ в среде Delphi. Составить и отладить программу циклического алгоритма.

3.1. Средства отладки программ в Delphi Практически в каждой вновь написанной программе после запуска

обнаруживаются ошибки. Ошибки первого уровня (ошибки компиляции) связаны с неправильной записью операторов (орфографические или синтаксические ошибки). При обнаружении ошибки компилятор Delphi останавливается напротив первого оператора, в котором обнаружена ошибка. В нижней части экрана появляется текстовое окно, содержащее сведения обо всех ошибках, найденных в проекте. Каждая строка этого окна содержит имя файла, в котором найдена ошибка, номер строки с ошибкой и характер ошибки. Для быстрого перехода к интересующей ошибке необходимо дважды щелкнуть на строке с ее описанием. Для получения более полной информации о характере ошибки необходимо обратится к Help нажатием клавиши F1. Следует обратить внимание на то, что одна ошибка может повлечь за собой другие, которые исчезнут при ее исправлении. Поэтому следует исправлять ошибки последовательно, сверху вниз. Компилятор часто выдает сообщения, указывая на совершенно правильную строку, но обычно это результат ошибки в предыдущей строке. Ошибки второго уровня (ошибки выполнения) связаны с ошибками выбранного алгоритма решения или с неправильной программной реализацией алгоритма. Эти ошибки проявляются в том, что результат расчета оказывается неверным либо возникает исключительная ситуация. Поэтому перед использованием отлаженной программы ее надо протестировать, т. е. сделать просчеты при таких комбинациях исходных данных, для которых заранее известен результат. Если тестовые расчеты указывают на ошибку, то для ее поиска следует использовать встроенные средства отладки среды Delphi. В простейшем случае для локализации места ошибки рекомендуется поступать следующим образом. В окне редактирования текста установить курсор в строке перед подозрительным участком и нажать клавишу F4 (выполнение до курсора) или щелкнуть на серой полосе слева от оператора для обозначения точки прерывания (появится красная точка) и нажать клавишу F9. Выполнение программы будет остановлено на указанной строке. Для просмотра текущих значений можно поместить на нужную переменную курсор (на экране будет высвечено ее значение), либо нажать Ctrl+F7 (окно оценки и модификации) или Ctrl+F5 (окно наблюдения) и в появившимся диалоговом окне указать интересующую переменную. Нажимая клавишу F7 (пошаговое выполнение), можно построчно выполнять программу, контролируя изменение тех или иных переменных и правильность вычислений. Если курсор находится внутри цикла,

20

Page 21: Лабораторный практикум

то после нажатия клавиши F4 расчет останавливается после одного выполнения тела цикла. Для продолжения расчетов выбрать опцию <Run> в меню <Run> или нажать клавишу F9.

3.2. Операторы организации циклов repeat, while, for Под циклом понимается многократное (итерационное) выполнение одних

и тех же операторов при различных значениях промежуточных данных. Число повторений может быть задано в явной или неявной форме. Для организации повторений в языке Object Pascal предусмотрены три различных оператора цикла.

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

организует повторение операторов, помещенных между ключевыми словами repeat и until (тело цикла), до тех пор, пока не выполнится <условие окончания цикла>, после чего управление передается следующему за циклом оператору.

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

организует повторение операторов, помещенных между begin и end (тело цикла), пока выполняется <условие продолжения цикла>. Заметим, что если <условие продолжения цикла > не выполняется при входе в цикл, то тело цикла не выполнятся ни разу, в отличие от оператора repeat, в котором они хотя бы один раз выполнятся.

Оператор с явно заданным числом повторений for i:=m to n do begin <тело цикла (список операторов> end;

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

for i:=m downto n do begin

<тело цикла (список операторов> end ;

организует повторения при убывающем изменении i на единицу. Заметим, что если m<n, то <список операторов> не выполнятся ни разу. Переменная цикла i может иметь любой порядковый тип (целочисленный, символьный, интервальный, перечисление). Для прекращения выполнение цикла

21

Page 22: Лабораторный практикум

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

3.3. Пример написания программы

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

значений функции ( ) xy x e−= и ее разложения в ряд 0 0

( ) ( 1)!

kk k

k k

xs x ak

∞ ∞

= =

= = −∑ ∑

для х, изменяющихся в интервале от a до b c шагом h. Функцию s(x) вычислять с заданной точностью ε. Вывести число итераций, необходимое для достижения заданной точности. При составлении алгоритма вычисления удобно использовать рекуррентную последовательность (такую последовательность, каждое новое слагаемое которой зависит от одного или нескольких предыдущих). Для получения расчетной формулы рассмотрим

значения слагаемых при различных значениях k: при 010; 1 ;1

k a= = при

11; 1 ;1xk a= = − при 22; 1 ;

1 2x xk a ⋅

= =⋅

при 33; 11 2 3x x xk a ⋅ ⋅

= = −⋅ ⋅

и т. д. Видно, что

на каждом шаге новое слагаемое дополнительно умножается на 1 xk

− . Исходя

их этого, формула рекуррентной последовательности будет иметь вид:

1 ;k kxa ak−= − . Полученная формула позволяет избавиться от многократного

вычисления факториала и возведения в степень для каждого отдельного слагаемого. Если в выражении имеется нерекуррентая часть, то ее следует рассчитывать отдельно. Окно формы программы представлено на рис. 3.1. Текст программы приведен в листинге 3.1..

22

Page 23: Лабораторный практикум

Рис. 3.1. Вид формы выполняемой программы

Unit Unit3; Листинг 3.1 interface uses Windows,Messages,SysUtils,Variants,Classes,Graphics, Controls,Forms,Dialogs,Buttons,StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label2: TLabel; Edit4: TEdit; Label3: TLabel; Button1: TButton; Memo1: TMemo; BitBtn1: TBitBtn; Label4: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations }

23

Page 24: Лабораторный практикум

public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var a,b,h,x,w,s,y,eps:extended; k:integer; begin a:= StrToFloat(Edit1.Text); b:= StrToFloat(Edit2.Text); h:= StrToFloat(Edit3.Text); eps:=StrToFloat(Edit4.Text); x:=a; Memo1.Clear; repeat s:=1; w:=1; k:=0; repeat inc(k); w:=-w*x/k; s:=s+w; until abs(w)<eps; y:=exp(-x); Memo1.Lines.Add(FloatToStrF(x,fffixed,5,2)+ ' '+FloatToStrF (s,fffixed,9,6)+ ' '+FloatToStrF (y,fffixed,9,6)+ ' '+IntToStr(k)); x:=x+h; until x>b+1e-6; end; end.

3.4. Индивидуальные задания Вывести на экран таблицу значений функции y(x) и ее разложение в ряд

s(x) для x изменяющегося от a до b с заданным шагом h и заданной точностью ε. Близость значений s(x) и y(x) с заданной точностью ε во всем диапазоне значений x указывает на правильность вычисления s(x) и y(x).

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

24

Page 25: Лабораторный практикум

Табл. 3.1 № nx kx s(x) ε y(x)

1.

0.1

1

2 1

0( 1)

(2 1)!

nn

n

xn

+∞

=

−+∑

0.001

sin x

2.

0.1

1

2

0 (2 )!

n

n

xn

=∑

0.0001 2

x xe e−+

3.

0.1

1

0

cos4

!n

n

nx

n

π∞

=∑

0.001

cos4 cos( sin )

4x

e xπ π

4.

0.1

1

2

0( 1)

(2 )!

nn

n

xn

=

−∑ 0.0001

cos x

5.

0.1

0.7

2

0

2 1!

n

n

n xn

=

+∑ 0.001

22(1 2 ) xx e+

6.

0.1

1

2 1

0 (2 1)!

n

n

xn

+∞

= +∑

0.0001 2

x xe e−−

7.

0.2

1

0

(ln9)!

nn

nx

n

=∑

0.001

9x

8.

0.1

0.7

0

(2 )!

n

n

xn

=∑

0.0001

2xe

9.

0.3

1

2

0

1! 2

n

n

n xn

=

+ ⎛ ⎞⎜ ⎟⎝ ⎠

∑ 0.001

221

4 2

xx x e⎛ ⎞

+ +⎜ ⎟⎝ ⎠

10

0.1

0.5

2 1

0( 1)

2 1

nn

n

xn

+∞

=

−+∑

0.0001

arctgx

11

0.2

1

22

0

2 1( 1)(2 )!

n n

n

n xn

=

+−∑

0.001

21 cos si

2 2x x nx x

⎛ ⎞− −⎜ ⎟

⎝ ⎠

12

0.1

1

2

1

(2 )( 1)(2 )!

nn

n

xn

=

−∑ 0.0001

22(cos 1)x −

13

-2

-0.1

2

0( 1)

(2 1)!

nn

n

xn

=

−+∑

0.0001

sin( )xx

14

0.2

0.8

2

1 (2 1)!n

n

n xn

= +∑ 0.0001

1 14

x sh x ch xx

+⎛ ⎞−⎜ ⎟⎝ ⎠

25

Page 26: Лабораторный практикум

15

0.1

0.8

21

1( 1)

2 (2 1)

nn

n

xn n

∞+

=

−−∑

0.001

2ln 1xarctgx x− +

26

Page 27: Лабораторный практикум

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

Цель лабораторной работы: изучить свойства компонента StringGrid. Написать программу с использованием массивов.

4.1. Обработка исключительных ситуаций Под исключительной ситуацией понимается некое ошибочное состояние,

возникающее при выполнении программы и требующее выполнения определённых действий для продолжения работы или корректного ее завершения. Стандартный обработчик (метод TApplication.HandleException), вызываемый по умолчанию, информирует пользователя о возникновении ошибки и завершает выполнение программы. Для предотвращения ошибок выполнения программы в языке Object Pascal используется оператор try, который перехватывает исключительную ситуацию и дает возможность разработчику предусмотреть определенные действия при ее возникновении.

Конструкция блока try… finally: try

<операторы, выполнение которых может привести к возникновению исключительной ситуации>

finally <операторы, выполняемые всегда, вне зависимости от возникновения исключительной ситуации>

end; При возникновении исключительной ситуации в одном из операторов управление сразу передается первому оператору блока finally. Данная конструкция позволяет корректно завершить выполнение программы вне зависимости от возникающей исключительной ситуации. Обычно в блок finally помещают операторы, закрывающие открытые файлы, освобождающие выделенную динамическую память. Недостатком такой конструкции является то, что программа не информирует о том, возникала ли исключительная ситуация и следовательно не позволяет пользователю ее скорректировать.

Конструкция блока try…except: try

<операторы, выполнение которых может привести к возникновению исключительной ситуации>

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

end;

27

Page 28: Лабораторный практикум

При возникновении исключительной ситуации управление сразу передается в блок except, в противном случае блок except пропускается. Такая конструкция позволяет определить причину возникшей проблемы и рекомендовать пользователю определенные действия для ее исправления. В простейшем случае в разделе except пишутся операторы, выполняемые при возникновении любой исключительной ситуации. Для определения типа возникшей ошибки в разделе except используется конструкция, работающая по схеме оператора case:

on <тип исключительной ситуации 1> do <оператор 1>; on <тип исключительной ситуации 2> do <оператор 2>; … else <операторы, выполняемые если не определен

тип исключительной ситуации >; Выполняется только оператор, стоящий после do для реализуемой исключительной ситуации. Некоторые из возможных типов исключительных ситуаций представлены в таблице 4.1.

Табл. 4.1 Тип исключительной ситуации

Причина

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

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

EConvertError Ошибка преобразования строки в другие типы данных EDivByZero Попытка целочисленного деления на нуль ERangeError Целочисленное значение или индекс вне допустимого

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

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

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

EZeroDivide Деление на нуль числа с плавающей точкой EOutOfMemory Недостаточное количество памяти EInvalidOp Неправильная операция с плавающей точкой EOverFlow Переполнение при выполнении операции с плавающей

точкой EAssertionFailed Возникает при намеренной генерации исключительной

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

28

Page 29: Лабораторный практикум

Внимание! Для отладки программы, содержащей обработку исключительных ситуаций, надо отключить опцию Stop on Delphi Exceptions находящуюся в Tools –> Debbuger Options … , закладка Language Exceptions.

Возникновение исключительной ситуации может быть инициировано преднамеренно. Для этого можно использовать процедуры Abort (прерывание и завершение работы функции), Assert (Exp: Boolean [; const Msg: string]) (возникновение исключительной ситуации при выполнении логического выражения Exp и указание файла, где возникла ошибка, строки в нем и дополнительного сообщения Msg (необязательное сообщение)), а также при помощи конструкции Raise, которая преднамеренно вызывает указанное исключение (<тип исключения>) с текстом сообщения, имеющая следующий вид:

Raise <тип исключения>.Create(<текст сообщения>); 4.2. Использование функций ShowMessage и MessageDlg

Для вывода сообщений полезно использовать функции ShowMessage и MessageDlg, Функция ShowMessage(Msg: string) отображает диалоговое окно с заданным сообщением и кнопкой OK для закрытия окна. В заголовке окна отображается имя выполняемой программы. Функция MessageDlg(const Msg: WideString; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Word отображает диалоговое окно с заданными кнопками и возвращает значение выбранной пользователем кнопки (mrYes, mrOK, mrHelp и т.д.), например, MessageDlg('Error', mtError, [mbOK, mbNo], 0);. Параметр Msg содержит текст сообщения, DlgType определяет вид отображаемого окна (табл. 4.2).

Табл. 4.2

mtWarning Предупреждающее сообщение

mtError Сообщение о какой-либо ошибке

mtInformation Информационное сообщение

mtConfirmation Сообщение с вопросом

mtCustom Пользовательское сообщение, не имеющее значка и типа

Параметр Buttons указывает, какие кнопки будут находиться в окне (табл. 4.3). Список необходимых кнопок заключается в квадратные скобки.

Табл. 4.3

mbYes mbCancel mbAbort mbNoToAll mbNo mbRetry mbHelp mbYesToAll mbOK mbIgnore mbAll

29

Page 30: Лабораторный практикум

Параметр HelpCtx определяет номер контекстной справки для данного окна (в случае отсутствия справки указывается 0). Результатом выполнения функции является значение, соответствующее нажатой кнопке. Возвращаемое значение имеет имя, состоящее из букв mr и имени кнопки, например: mrYes, mrOK, mr Help.

4.3. Работа с массивами Массив есть упорядоченный набор однотипных элементов, объединенных

под одним именем. Каждый элемент массива обозначается именем, за которым в квадратных скобках следует один или несколько индексов, разделенных запятыми, например: a[3], b[k], c[k, 2*k]. В качестве индекса можно использовать любые порядковые типы за исключением LongInt. Тип массива или сам массив определяются соответственно в разделе типов (Type) или переменных (Var) с помощью следующей конструкции:

Array [описание индексов] of <тип элемента массива>; Примеры описания массивов: Const Nmax=20; // максимальное значение индекса Type vek=array[1..Nmax] of extended; // Описание типа одномерного массива Var a: vek; // a – одномерный массив типа extended s : array[1..10] of integer; // s – одномерный массив типа integer y : array[1..5, 1..10] of char; // y – двумерный массив символьного типа Элементы массивов могут использоваться в выражениях так же, как и обычные переменные, например:

f:=2*a[3]+a[s[4]+1]*3; a[n]:=1+sqrt(abs(a[n-2]));

4.4. Компонент StringGrid При работе с массивами ввод и вывод массивов на экран удобно

организовывать в виде таблиц. Компонент StringGrid предназначен для отображения информации в виде двумерной таблицы, каждая ячейка которой представляет собой окно однострочного редактора (аналогично окну Edit). Доступ к информации осуществляется с помощью свойства Cells[ACol: Integer; ARow: Integer]: String, где ACol, ARow - индексы элемента двумерного массива Cells. Свойства ColCount и RowCount устанавливают общее количество столбцов и строк в таблице, а свойства FixedCols и FixedRows задают количество столбцов и строк фиксированной зоны, выделенной другим цветом, в которою запрещен ввод информации с клавиатуры. Она обычно используется для размещения пояснительных надписей. Оставшиеся строки и столбцы образуют рабочую зону. Объект типа StringGrid располагается во вкладке Additional ( пиктограмма ). По умолчанию в объект StringGrid запрещен ввод информации с клавиатуры, поэтому при использовании обьекта для ввода информации необходимо в инспекторе объектов раскрыть раздел Options

30

Page 31: Лабораторный практикум

(нажав на знак «+», стоящий слева от Options) и установить свойство goEditing в положение True.

4.5. Пример написания программы

Задание: создать программу для вычисления произведения матрицы n-го порядка A на вектор-столбец b. Элементы результирующего вектора y

определяются по формуле 1

n

i ijj

y A=

jb= ⋅∑ , i=1, n Значения порядка матрицы n

вводятся с использованием компонента Edit, А и b – с использованием компонентов типа StringGrid. Результаты также выводятся в компонент StringGrid. Панель диалога приведена на рис. 4.1. Текст программы приведен в листинге 4.1.

Рис. 4.1. Вид формы выполняемой программы unit Unit1; Листинг 4.1

interface

uses Windows, Messages, SysUtils, Variants, Classes,

Graphics, Controls, Forms, Dialogs, Grids,

31

Page 32: Лабораторный практикум

Buttons, StdCtrls;

type

TForm1 = class(TForm)

Edit1: TEdit;

Label1: TLabel;

StringGrid1: TStringGrid;

BitBtn1: TBitBtn;

StringGrid2: TStringGrid;

StringGrid3: TStringGrid;

Button1: TButton;

procedure FormCreate(Sender: TObject);

procedure Edit1Change(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

const max=10; // Максимальный размер массива

//Объявление типа двухмерного массива

Type mat=array[1..max,1..max] of extended;

//Объявление типа одномерного массива

vek=array[1..max] of extended;

var

Form1: TForm1;

a:mat; // Объявление двухмерного массива

b,y:vek; // Объявление одномерных массивов

n,i,j:integer;

implementation

32

Page 33: Лабораторный практикум

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin

n:=strtoint(edit1.Text); // Число строк

StringGrid1.RowCount:=n+1;

StringGrid1.ColCount:=n+1;

StringGrid2.RowCount:=n+1;

StringGrid3.RowCount:=n+1;

StringGrid1.cells[0,0]:= ' a';

StringGrid2.cells[0,0]:= ' b';

StringGrid3.cells[0,0]:= 'Результат';

for i:=1 to n do

StringGrid1.cells[0,i]:= ' i='+inttostr(i);

for j:=1 to n do

StringGrid1.cells[j,0]:= ' j='+inttostr(j);

end;

procedure TForm1.Edit1Change(Sender: TObject);

begin // Измение порядка

if edit1.text='' then exit;

n:=strtoint(edit1.Text);

StringGrid1.RowCount:=n+1;

StringGrid1.ColCount:=n+1;

StringGrid2.RowCount:=n+1;

StringGrid3.RowCount:=n+1;

for i:=1 to n do

StringGrid1.cells[0,i]:= ' i='+inttostr(i);

for j:=1 to n do

StringGrid1.cells[j,0]:= ' j='+inttostr(j);

end;

33

Page 34: Лабораторный практикум

procedure TForm1.Button1Click(Sender: TObject);

begin

{$R+} // Подключение директивы

try

//Заполнение массива a элементами из таблицы StringGrid1

for i:=1 to n do

for j:=1 to n do

a[i,j]:=StrToFloat(StringGrid1.Cells[j,i]);

//Заполнение массива b элементами из таблицы StringGrid2

for i:=1 to n do

b[i]:=StrToFloat(StringGrid2.Cells[0,i]);

except

on EConvertError do begin

ShowMessage('Проверьте значение числа'); Exit; end;

on ERangeError do begin

ShowMessage('Уменьшите размер массива'); Exit; end;

else begin

ShowMessage('Возникла неизвестная искл. ситуация');

Exit; end;

end;

try

//Умножение массива a на массив b

for i:=1 to n do

begin

y[i]:=0;

for j:=1 to n do y[i]:=y[i]+a[i,j]*b[j];

end;

except

on EInvalidOp do begin

MessageDlg('Неправ. операция с плав. точкой',

mtError, [mbCancel],0); Exit; end;

34

Page 35: Лабораторный практикум

on EOverFlow do begin

MessageDlg('Переполнение при операции с

плавающей точкой', mtError,[mbCancel],0);

Exit; end;

else begin

MessageDlg('Возникла неизвестная исключительная

ситуация! ',mtError,[mbCancel],0); Exit; end;

end;

//Вывод результата в таблицу StringGrid3

for i:=1 to n do

StringGrid3.Cells[0,i]:=FloatToStrf(y[i],fffixed,6,2);

end;

end.

4.6. Индивидуальные задания

Во всех заданиях массивы вводить и выводить с помощью компонентов StringGrid, в которых 0-й столбец и 0-ю строку использовать для отображения индексов массивов. В местах возможного возникновения ошибок использовать конструкции для обработки исключительных ситуаций.

1. Задана матрица, содержащая n строк и m столбцов. Для каждого столбца вывести сообщение «Нулевой» если все элементы столбца матрицы нулевые, и сообщение «Ненулевой» в противном случае.

2. Задана матрица, содержащая n строк и m столбцов. Для каждой строки матрицы вывести сообщение «Убывают» если элементы строки матрицы упорядочены по убыванию, и сообщение «Неубывают» в противном случае.

3. Задана матрица, содержащая n строк и m столбцов. Для каждой строки матрицы вывести сообщение «Симметрична», если строка матрицы симметрична, и сообщение «Несимметрична» в противном случае.

4. Задана матрица, содержащая n строк и m столбцов. Определить количество «особых» элементов матрицы, считая элемент «особым», если он больше суммы остальных элементов своего столбца.

5. Задана матрица, содержащая n строк и m столбцов. Определить количество «особых» элементов матрицы, считая элемент «особым», если все элементы строки, находящиеся слева от него, меньше его, а справа – больше.

6. Задана матрица, содержащая n строк и m столбцов. Упорядочить ее строки по возрастанию их первых элементов.

7. Задана матрица, содержащая n строк и m столбцов. Упорядочить ее строки по возрастанию суммы их элементов.

35

Page 36: Лабораторный практикум

8. Задана матрица, содержащая n строк и m столбцов. Упорядочить ее строки по возрастанию их наибольших элементов.

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

10. Задана матрица, содержащая n строк и m столбцов. Найти значение максимального элемента каждого столбца матрицы.

11. В матрице n-го порядка найти максимальный среди элементов, лежащих ниже побочной диагонали, и минимальный среди элементов, лежащих выше главной диагонали.

12. В матрице содержащей n строк и m столбцов поменять местами строку, содержащую элемент с наибольшим значением со строкой, содержащей элемент с наименьшим значением.

13. Из матрицы n-го порядка получить матрицу (n-1)-го порядка путем удаления из исходной матрицы строки и столбца, на пересечении которых расположен элемент с наибольшим по модулю значением.

14. В матрице n-го порядка сумму элементов, лежащих выше побочной диагонали, и произведение элементов, лежащих ниже главной диагонали.

15. Задана матрица, содержащая n строк и m столбцов. Поменять местами все четные и нечетные строки матрицы.

36

Page 37: Лабораторный практикум

ТЕМА 5. УКАЗАТЕЛИ И ИХ ИСПОЛЬЗОВАНИЕ ПРИ РАБОТЕ С ДИНАМИЧЕСКИМИ МАССИВАМИ

Цель лабораторной работы: изучить способы работы с динамическими массивами данных.

5.1. Динамическое распределение памяти В языке Object Pascal, наряду с обычным, статическим, возможна

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

5.2. Индивидуальные задания

Необходимый теоретический материал и примеры работы с динамическими массивами приведены в лекции «Указатели». Выделение памяти под массив организовать динамически.

1. Дан массив целых чисел. Найти сумму первых 3-х положительных чисел расположенных после первого нулевого числа.

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

3. Дан массив символов. Вывести на экран цифру, наиболее часто встречающуюся в этом массиве.

4. Дан массив символов. Определить количество различных элементов массива (т. е. повторяющиеся элементы считать один раз).

5. Дан массив целых чисел. Элементы массива циклически сдвинуть на k позиций влево.

6. Дан массив целых чисел.. Элементы массива циклически сдвинуть на k позиций вправо.

7. Дан массив символов. Преобразовать массив по следующему правилу: все прописные латинские буквы перенести в начало, а все строчные латинские буквы – в конец, сохраняя исходное взаимное расположение.

8. Элементы каждого из двух массивов X и Y упорядочены по возрастанию Объединить элементы этих массивов в один массив Z не сортируя его так, чтобы массив Z оказался упорядоченным по возрастанию.

9. Дан массив целых чисел. Найти произведение положительных чисел расположенных до 1-го отрицательного числа.

37

Page 38: Лабораторный практикум

10. Даны два массива целых чисел. Найти наименьшее среди тех элементов первого массива, не входящих во второй массив.

11. Дан массив целых чисел. Найти сумму чисел расположенных между 1-м и 2-м нулевым числом.

12. Дан массив латинских букв. Вывести на экран в алфавитном порядке все буквы, которые входят в этот массив по одному разу.

13. Дан массив символов. Удалить из него повторные вхождения каждого символа.

14. Дан массив целых чисел. Удалить из него все четные числа. 15. Дан массив целых чисел. Удалить из него все отрицательные числа.

38

Page 39: Лабораторный практикум

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

Цель лабораторной работы: изучить возможности Delphi для написания подпрограмм и создания модулей. Составить и отладить программу, использующую внешний модуль Unit с помещенными в него подпрограммами.

6.1. Использование модулей

Модуль – автономно компилируемая программная единица, включающая в себя процедуры, функции, а также различные разделы описаний. Структура модуля представлена в п. 1.2 и содержит следующие основные части: заголовок, интерфейсная часть, исполняемая, инициирующая и завершающая (последние две части могут отсутствовать).

Заголовок состоит из зарезервированного слова Unit и следующего за ним имени модуля, которое должно совпадать с именем файла содержащего текст модуля. Использование имени модуля в разделе Uses основной программы приводит к установлению связи модуля с основной программой.

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

Исполняемая часть начинается ключевым словом implementation и содержит описание процедур и функций, объявленных в интерфейсной части. Она может также содержать разделы описаний вспомогательных типов, констант, переменных, процедур и функций, которые будут использоваться только в исполняемой части и не будут доступны внешним программам.

Инициирующая часть начинается ключевым словом initialization и содержит операторы, которые исполняются перед началом выполнения основной программы (может отсутствовать).

Завершающая часть начинается ключевым словом finalization и выполняется в момент окончания работы программы (может отсутствовать).

6.2. Создание модуля В среде Delphi модули могут создаваться как со своей формой, так и без

нее. Для создания нового модуля без своей формы необходимо в меню File выбрать опции New –> Unit. В результате появится окно с заголовком Unit Unit2, содержащее текст заготовки модуля. Имя модуля нужно заменить на другое, отвечающее внутреннему содержанию модуля, например Unit biblio. Для этого необходимо сохранить текст модуля в файле с именем biblio.pas. Следует помнить, что имя файла должно совпадать с именем модуля. Наполнить модуль соответствующим содержанием.

39

Page 40: Лабораторный практикум

6.3. Подключение модуля Для того чтобы подключить модуль к проекту, необходимо в меню

Project выделить опцию Add to Project… и выбрать файл, содержащий модуль. После этого в разделе Uses добавить имя подключаемого модуля – biblio. Теперь в проекте можно использовать подпрограммы, содержащиеся в модуле.

6.4. Пример написания программы Задание: написать программу вывода на экран таблицы функции,

которую оформить в виде процедуры. В качестве функции использовать по

выбору ( ) xy x e−= или 0

( ) ( 1)!

kk

k

xs xk

=

= −∑ .

Рис. 6.1. Вид формы выполняемой программы

Тексты модуля (Листинг 6.1) и вызывающей программы (Листинг 6.2) приведены ниже.

unit biblio; Листинг 6.1 interface function y(x:extended):extended; procedure sum(x,eps:extended; var s:extended; var k:word);

40

Page 41: Лабораторный практикум

implementation function y; begin result:=exp(-x); end; procedure sum; var w:extended; begin s:=1; w:=1; k:=0; repeat inc(k); w:=-w*x/k; s:=s+w; until abs(w)<eps; end; end.

unit Unit1; Листинг 6.2 interface uses Windows,Messages,SysUtils,Variants, Classes, Graphics, Controls,Forms, Dialogs, Buttons, StdCtrls, biblio; type TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label2: TLabel; Edit4: TEdit; Label3: TLabel; Button1: TButton; Memo1: TMemo; BitBtn1: TBitBtn; Label4: TLabel; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public

41

Page 42: Лабораторный практикум

{ Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin memo1.Clear; end; procedure TForm1.Button1Click(Sender: TObject); var a,b,h,x,eps,s:extended; it:word; begin a:=strtofloat(edit1.Text); b:=strtofloat(edit2.Text); h:=strtofloat(edit3.Text); eps:=strtofloat(edit4.Text); x:=a; repeat sum(x,eps,s,it); memo1.Lines.Add(floattostrf(x,fffixed,5,2)+ ' '+floattostrf(s,fffixed,9,6)+ ' '+floattostrf(y(x),fffixed,9,6)+ ' '+inttostr(it)); x:=x+h; until x>b+0.0000000001; end; end.

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

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

42

Page 43: Лабораторный практикум

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

Цель лабораторной работы: изучить правила перевода чисел из одной системы счисления в другую. Написать программу для работы со строками.

7.1. Системы счисления Под позиционной системой счисления понимают способ записи чисел с

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

1 1 0 11 1 0 1 1 1 0 1, ,n n

n n k n n kR a a a a a a a p a p a p a p a p a p k− − −− − − − − −= = + + + + + +K K K K+

0

где – цифры, p – основание системы счисления. Количество цифр равно p. Для записи цифр в общем случае может быть использован любой набор p символов. Обычно для p≤10 используют символы 0…9, для p>10 добавляют буквы латинского алфавита A, B, C, D, E, F, которые в десятичной системе представляют числами 10, 11, 12, 13, 14, 15. Например

ia

1 0 1 1 0 115 10( 3, ) 15 3 15 15 13 15 3 15 14 15 (198,93)R D E D E − −= = ⋅ + ⋅ + ⋅ = ⋅ + ⋅ + ⋅ =

2 1 0 18 1(124,5) 1 8 2 8 4 8 5 8 (84,625)R −= = ⋅ + ⋅ + ⋅ + ⋅ =

В компьютерной технике обычно используются системы с основанием равным степени двойки: двоичная, восьмеричная и шестнадцатеричная. Имеются процессоры, реализующие троичную систему счисления. Для удобства пользователей ввод – вывод и операции над числами в компьютере производят в десятичной системе счисления. При переводе числа из десятичной системы счисления в другую систему счисления, целая и дробная часть числа переводятся различным образом. При переводе целой части, она делится на основание новой системы счисления, остаток представляет очередную цифру

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

0 1, , , na a aK

1 2, , , ka a a− − K − , а дробная часть опять умножается на основание системы. Расчеты ведут до получения требуемого количества цифр.

7.2. Индивидуальные задания

Необходимый теоретический материал и примеры приведены в лекциях «Работа с множествами» и «Строки». Для ввода строк использовать компонент TComboBox. Алгоритм оформить в виде подпрограммы.

43

Page 44: Лабораторный практикум

1. Дана строка символов, состоящая из слов. Найти количество слов с пятью символами.

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

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

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

5. Дана строка символов, состоящая из произвольных десятичных чисел, разделенных пробелами. Вывести на экран числа этой строки в порядке возрастания их значений.

6. Дана строка, состоящая из слов. Найти и вывести на экран самое короткое слово, его номер и номер позиции, с которой оно начинается.

7. Дана строка, состоящая из слов, отделенных друг от друга одним или несколькими разделителями (пробелы, точки, запятые, скобки и пр.). Подсчитать количество символов в самом длинном слове, его номер и номер позиции, с которой оно начинается.

8. Дана строка, состоящая из слов, отделенных друг от друга одним или несколькими разделителями (пробелы, точки, запятые, скобки и пр.). Найти и вывести на экран слова с четным количеством символов.

9. Дана строка, состоящая из слов, отделенных друг от друга одним или несколькими разделителями (пробелы, точки, запятые, скобки и пр.). Подсчитать количество разных символов в каждом слове.

10. Дана строка символов, состоящая из произвольных десятичных чисел, разделенных пробелами. Вывести четные числа этой строки.

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

12. Дана строка символов, состоящая из слов разделеных одним или несколькими пробелами. Вывести на экран порядковый номер слова, накрывающего k-ю позицию (если на k-ю позицию попадает пробел, то номер предыдущего слова).

13. Дана строка, состоящая из слов, отделенных друг от друга одним или несколькими разделителями (пробелы, точки, запятые, скобки и пр.). Вывести на экран порядковый номер слова минимальной длины.

14. Дана строка символов, состоящая из слов. Вывести на экран порядковый номер слова максимальной длины и номер позиции строки, с которой оно начинается.

15. Дана строка символов, состоящая из слов. Вывести на экран порядковый номер слова минимальной длины и количество различных символов в этом слове.

44

Page 45: Лабораторный практикум

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

ЗАПИСЕЙ И ФАЙЛОВ Цель лабораторной работы: изучить правила работы с компонентами

OpenDialog и SaveDialog. Изучить правила работы с записями. Написать программу с использованием файлов.

8.1. Компоненты OpenDialog и SaveDialog Компоненты OpenDialog и SaveDialog находятся во вкладке Dialogs меню

компанентов . Все компоненты этой вкладки являются невизуальными, т. е. не видны в момент работы программы. Поэтому их можно разместить в любом удобном месте формы. Оба рассматриваемых компонента имеют идентичные свойства и отличаются только внешним видом. После вызова компонента появляется диалоговое окно, с помощью которого выбирается имя файла и путь к нему. В случае успешного завершения диалога имя выбранного файла и маршрут поиска содержaтся в свойстве FileName. Для фильтрации файлов, отображаемых в окне просмотра, используется свойство Filter, а для задания расширения файла, в случае, если оно не задано пользователем, – свойство DefaultExt. Если необходимо изменить заголовок диалогового окна, используется свойство Title.

8.2. Настройка компонентов OpenDialog и SaveDialog Для установки компонентов OpenDialog и SaveDialog на форму,

необходимо на вкладке Dialogs меню компонентов выбрать соответственно по пиктограмму или и поставить их на любое свободное место формы. Настройка фильтра производится следующим образом. Выбрав соответствующий компонент, дважды щелкнуть по правой части свойства Filter инспектора объектов. Появится окно Filter Editor, в левой части которого записывается текст, характеризующий соответствующий фильтр, а в правой части – маску. Для компанента OpenDialod установить значения маски как показано на рис. 8.1. Формат *.dat означает что, будут видны все файлы с расширением dat, а формат *.* – все файлы (с любым именем и с любым расширением). Для того, чтобы файл автоматически записывался, например, с расширением dat, в свойстве DefaultExt компонета SaveDialog1 задается требуемое расширение dat, (для текстового файла – txt).

45

Page 46: Лабораторный практикум

Рис. 8.1. Окно редактора фильтра

8.3. Пример написания программы Задание: написать программу, содержащую режимы создания

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

Рис. 8.2. Вид формы после нажатия кнопки «Читать».

46

Page 47: Лабораторный практикум

Рис. 8.3. Вид формы после нажатия кнопки «Вывести». Текст программы приведен на Листинге 8.1.

unit Unit1; Листинг 8.1 interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, Buttons; type TForm1 = class(TForm) OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Button1: TButton;

47

Page 48: Лабораторный практикум

Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; BitBtn1: TBitBtn; Memo1: TMemo; Memo2: TMemo; Memo3: TMemo; Memo4: TMemo; Label5: TLabel; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure BitBtn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; type stud=record fam:string[20]; oc:array[1..3] of byte; end; var Form1: TForm1; f:file of stud; ft:textfile; w:stud; zak:boolean; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin button1.Enabled:=false; zak:=false; end;

48

Page 49: Лабораторный практикум

procedure TForm1.Button1Click(Sender: TObject); begin // Ввести w.fam:=edit1.text; w.oc[1]:=strtoint(edit2.text); w.oc[2]:=strtoint(edit3.text); w.oc[3]:=strtoint(edit4.text); write(f,w); memo1.lines.add(w.fam); memo2.lines.add(inttostr(w.oc[1])); memo3.lines.add(inttostr(w.oc[2])); memo4.lines.add(inttostr(w.oc[3])); edit1.clear; edit2.clear; edit3.clear; edit4.clear; end; procedure TForm1.Button2Click(Sender: TObject); begin // Создать SaveDialog1.Title:='Создать файл';//Лучше эти свойства SaveDialog1.DefaultExt:='dat';//задать в Object Incpector if SaveDialog1.Execute then begin AssignFile(f, SaveDialog1.FileName); Rewrite(f); end else exit; button1.Enabled:=true; zak:=true; label5.Caption:=' Общий список'; end; procedure TForm1.Button3Click(Sender: TObject); begin // Читать OpenDialog1.Title:='Открыть файл'; if OpenDialog1.Execute then begin AssignFile(f, OpenDialog1.FileName); Reset(f); end else exit; memo1.clear; memo2.clear; memo3.clear; memo4.clear; while not eof(f) do begin read(f,w); memo1.lines.add(w.fam); memo2.lines.add(inttostr(w.oc[1])); memo3.lines.add(inttostr(w.oc[2])); memo4.lines.add(inttostr(w.oc[3]));

49

Page 50: Лабораторный практикум

end; closeFile(f); label5.Caption:=' Общий список'; end; procedure TForm1.Button4Click(Sender: TObject); begin // Сохранить //Лучше эти два свойства задать SaveDialog2.Title:='Сохранить в текстовом файле'; SaveDialog2.DefaultExt:='txt'; // в Object Incpector if SaveDialog2.Execute then begin AssignFile(ft, SaveDialog2.FileName); Rewrite(ft); end else exit; writeln(ft,' Общий список студентов'); writeln(ft,' Фамилия Физика Математика Химия '); reset(f); while not eof(f) do begin read(f,w); with w do writeln(ft,fam:10,oc[1]:6,oc[2]:10,oc[3]:9); end; closeFile(f); closeFile(ft); end; procedure TForm1.Button5Click(Sender: TObject); var k,m:integer; begin // Вывести memo1.clear; memo2.clear; memo3.clear; memo4.clear; reset(f); while not eof(f) do begin read(f,w); m:=0; for k:=1 to 3 do if w.oc[k]=4 then m:=1; if m=0 then begin memo1.lines.add(w.fam); memo2.lines.add(inttostr(w.oc[1])); memo3.lines.add(inttostr(w.oc[2])); memo4.lines.add(inttostr(w.oc[3]));

50

Page 51: Лабораторный практикум

end; end; closeFile(f); label5.Caption:='Список студентов без четверок'; end; procedure TForm1.BitBtn1Click(Sender: TObject); begin if zak then closeFile(f); end; end.

8.4. Индивидуальные задания

Необходимый теоретический материал и примеры программ приведены в лекции «Файлы». Написать программу, содержащую режимы создания типизированного файла, чтения ранее созданного файла, записи содержимого в текстовый файл и вывода требуемого результата. Результаты выводить в окно просмотра и записывать в текстовой файл.

1. В магазине формируется список лиц, записавшихся на покупку товара.

Каждая запись этого списка содержит: фамилию, домашний адрес покупателя и дату постановки на учет. Удалить из списка все повторные записи, проверяя фамилию и домашний адрес.

2. Список товаров, имеющихся на складе, включает в себя наименование товара, количество и дату поступления товара на склад. Вывести в алфавитном порядке список товаров, хранящихся больше месяца.

3. Для получения места в общежитии формируется список студентов, который включает фамилию студента, средний балл, доход на члена семьи. Общежитие в первую очередь предоставляется тем, у кого доход на члена семьи меньше двух минимальных зарплат, затем остальным в порядке уменьшения среднего балла. Вывести список очередности предоставления мест в общежитии.

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

5. Информация о сотрудниках фирмы включает: фамилию и количество проработанных часов за месяц. Рабочее время свыше 144 часов считается сверхурочным и оплачивается в двойном размере. Ввести почасовой тариф и вывести размер заработной платы каждого сотрудника фирмы за вычетом подоходного налога, который составляет 12% от суммы заработка.

51

Page 52: Лабораторный практикум

6. Информация об участниках спортивных соревнований содержит: название команды, фамилию игрока и возраст. Вывести информацию о самой молодой команде.

7. Для книг, хранящихся в библиотеке, задаются: автор, название, год издания. Вывести список книг с фамилиями авторов в алфавитном порядке, изданных после заданного года.

8. Различные цехи завода выпускают продукцию нескольких наименований. Сведения о выпущенной продукции включают: наименование, количество, номер цеха. Для заданного цеха необходимо вывести количество выпущенных изделий по каждому наименованию в порядке убывания количества.

9. Информация о сотрудниках предприятия содержит: фамилию, номер отдела и дату начала работы. Вывести списки сотрудников по отделам в порядке убывания стажа.

10. Ведомость абитуриентов, сдавших вступительные экзамены в университет, содержит: фамилию, адрес, три оценки. Определить количество абитуриентов, проживающих в г. Минске и сдавших экзамены со средним баллом не ниже 4.5, вывести их фамилии в алфавитном порядке.

11. В справочной аэропорта хранится расписание вылета самолетов. Для каждого рейса указаны: номер рейса, пункт назначения, время вылета. Вывести все номера рейсов и времена вылета для заданного пункта назначения в порядке возрастания времени вылета.

12. У администратора железнодорожных касс хранится информация о свободных местах в поездах дальнего следования в следующем виде: пункт назначения, время отправления, число свободных мест. Оргкомитет международной конференции обращается к администратору с просьбой зарезервировать заданное количество мест до заданного города с временем отправления поезда не позднее заданного. Вывести время отправления или сообщение о невозможности выполнить заказ в полном объеме.

13. Ведомость абитуриентов, сдавших вступительные экзамены в университет, содержит: фамилию абитуриента, три оценки. Определить средний балл по университету и вывести список абитуриентов, средний балл которых выше среднего балла по университету.

14. В радиоателье хранятся квитанции о сданной в ремонт радиоаппаратуре. Каждая квитанция содержит следующую информацию: наименование (телевизор, радиоприемник и т. п.), дату приемки в ремонт, состояние готовности заказа (выполнен, не выполнен). Вывести информацию о состоянии заказов по группам изделий.

15. На междугородной АТС информация о разговорах содержит название города, время разговора, поминутный тариф и номер телефона абонента. Вывести по каждому городу общее время разговоров с ним и сумму.

52

Page 53: Лабораторный практикум

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

Цель лабораторной работы: изучить возможности построения изображений с использованием класса TСanvas и графиков с помощью компонента Сhart.

9.1. Как рисуются изображения Нарисовать картинку в среде Delphi можно на многих компонентах

(например, на форме, на PaintBox), однако наиболее удобно использовать компонент Image (вкладка меню компонентов Additional). Нарисованную в Image картинку можно перенести в отчет, используя процедуру ClipBoard.Assign(Image.Picture) (модуль Clipbrd). Для рисования используют класс TСanvas, который является свойством многих компонентов, и представляет собой прямоугольный холст в виде матрицы из пикселей и набор инструментов для рисования на нем. Каждый пиксель имеет координаты (x, y), где x – порядковый номер пикселя, начиная от левой границы холста, а y – порядковый номер пиксел, начиная от верхней границы холста. Левый верхний угол холста имеет координату (0, 0), а правый (Image.Width -1, Image.Height - 1).

9.2. Как строится график с помощью компонента Chart Обычно результаты расчетов представляются в виде графиков и

диаграмм. Среда Delphi имеет мощный пакет стандартных программ вывода на экран и редактирования графической информации, который реализуется с помощью визуально отображаемого на форме компонента Chart. Построение графика (диаграммы) производится после вычисления таблицы значений функции y=f(x). Полученная таблица передается в специальный двумерный массив Chart.SeriesList[k] (k – номер графика (0,1,2,...)) компонента Сhart с помощью метода AddXY. Компонент Chart осуществляет всю работу по отображению графиков, переданных в объект Chart.SeriesList[k]: строит и размечает оси, рисует координатную сетку, подписывает название осей и самого графика, отображает переданную таблицу в виде всевозможных графиков или диаграмм. При необходимости, с помощью встроенного редактора EditingChart компоненту Сhart передаются данные о толщине, стиле и цвете линий, параметрах шрифта подписей, шагах разметки координатной сетки и другие настройки. В процессе работы программы изменение параметров возможно через обращение к соответствующим свойствам компонента Chart. Так, например, свойство Chart.BottomAxis содержит значение максимального предела нижней оси графика. Перенести график в отчет можно через буфер обмена, используя процедуру Chart.CopyToClipboardMetafile(True). Для изменения параметров компонента Chart необходимо дважды щелкнуть по нему мышью в окне формы. Появится

53

Page 54: Лабораторный практикум

окно редактирования EditingChat1 (рис. 9.1). Для создания нового объекта Series1 щелкнуть по кнопке Add на странице Series. В появившемся диалоговом окне TeeChart Gallery выбрать пиктограмму с надписью Line (график выводится в виде линий). Если нет необходимости представления графика в трехмерном виде, отключить независимый переключатель 3D. После нажатия на кнопку OK появится новая серия с название Series1. Для изменения названия нажать кнопку Title. Закладка Legend задает список обозначений диаграммы (можно убирать с экрана). Название графика вводится на странице Titles. Разметка осей производится на странице Axis. Страница Series задает характеристики (цвет, толщина линий) для определенного графика. Нажимая различные кнопки меню, познакомтесь с другими возможностями EditingChart.

Рис. 9.1. Окно редактирования Editing Chart

9.3. Индивидуальные задания Необходимый теоретический материал и примеры программ приведены в

лекции «Графика». 1. Постройте графики любых двух функций s(x) и y(x). Таблицу данных

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

2. По указанию преподавателя выберите вариант задачи. Решите задачу, и используя функции класса TCanvas нарисуйте соответствующие геометрические фигуры. Расположите все рисунки в центре Image, так чтобы они занимали 2/3 области окна. Используйте масштабирование.

54

Page 55: Лабораторный практикум

1. Даны три числа а, b, с. Необходимо определить, существует ли треугольник с такими длинами сторон.

2. Даны четыре числа а, b, с, d. Необходимо определить, существует ли четырехугольник с такими длинами сторон.

3. Отобразить взаимное расположение двух окружностей радиусов R1 и R2 с центрами в точках (x1 , y1), (x2 , y2 ) соответственно.

4. Отобразить взаимное расположение окружности радиуса R с центром в точке (x0 , y0 ) и прямой, проходящей через точки с координатами (x1 , y1) и (x2 , y2 ) (пересекаются, касаются, не пересекаются).

5. Определить количество точек с целочисленными координатами, лежащих внутри окружности радиуса R с центром в точке (x0 , y0 )

6. Найти координаты точек пересечения двух окружностей радиуса R1 и R2 с центрами в точках (x1 , y1) и (x2 , y2 ) соответственно.

7. Найти координаты точки, симметричной данной точке М с координатами (х1 , у1) относительно прямой Ах+Ву+С=0.

8. Даны две точки М1 (x1 , y1), М2 (x2 , y2 ) и прямая Ах+By+С=0. Необходимо найти на этой прямой такую точку М0 (x0 , y0 ) чтобы суммарное расстояние от нее до двух данных точек было минимально.

9. Даны три точки с координатами (x1 , y1), (x2 , y2 ) , (x3 , y3 ) которые являются вершинами некоторого прямоугольника со сторонами, параллельными осям координат. Найти координаты четвертой точки.

10. Даны координаты четырех точек (x1 , y1), (x2 , y2 ), (x3 , y3 ), (x4 , y4 ). Необходимо определить, образуют ли они выпуклый четырехугольник.

11. Даны координаты четырех точек (x1 , y1), (x2 , y2 ), (x3 , y3 ), (x4 , y4 ). Необходимо определить, образуют ли они: а) ромб; б) квадрат; в) трапецию.

12. Даны координаты двух вершин (x1 , y1) и (x2 , y2 ) некоторого квадрата. Необходимо найти возможные координаты других его вершин.

13. Даны координаты двух вершин (x1 , y1) и (x2 , y2 ) некоторого квадрата, которые расположены на диагонали, и точка (x3 , y3 ). Необходимо определить, лежит или не лежит точка внутри квадрата.

14. Даны координаты трех вершин (x1 , y1), (x2 , y2 ), (x3 , y3 ) треугольника. Необходимо найти координаты точки пересечения его медиан.

15. Даны координаты трех вершин (x1 , y1), (x2 , y2 ) ,(x3 , y3 ) треугольника. Необходимо найти длины его высот.

55

Page 56: Лабораторный практикум

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

Цель лабораторной работы: изучить способы программирования алгоритмов с использованием рекурсии.

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

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

10.2. Пример решения задачи Написать программу вычисления максимального значения массива и

квадратного корня с использованием рекурсии и без. Листинг программы приведен ниже.

Рис. 10.1. Вид формы выполняемой программы unit Unit1; Листинг 10.1 interface uses Windows,Messages,SysUtils,Variants,Classes,Graphics, Controls, Forms,Dialogs, StdCtrls, Grids, Buttons; type

56

Page 57: Лабораторный практикум

TForm1 = class(TForm) StringGrid1: TStringGrid; Edit1: TEdit; BitBtn1: TBitBtn; Button2: TButton; Label1: TLabel; Button3: TButton; Label2: TLabel; Button5: TButton; Edit2: TEdit; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button5Click(Sender: TObject); private { Private declarations } public { Public declarations } end; type vek=array[1..50] of byte; var Form1: TForm1; a:vek; n,k:integer; implementation {$R *.dfm} function maxRn( x:vek; n:integer ):byte; begin if n=1 then result:=x[1] else if maxRn(x,n-1)>x[n] then result:=maxRn(x,n-1) else result:=x[n]; end; function max( x:vek; n:integer ):byte; begin result:=x[1]; for k:=1 to n do if x[k]>result then result:=x[k];

57

Page 58: Лабораторный практикум

end; function sqrtR( x:extended; n:integer ):extended; begin if n=0 then result:=x else result:=0.5*(sqrtR(x,n-1)+x/sqrtR(x,n-1)); end; function sqrtA( x:extended; n:integer ):extended; begin result:=x; for k:=1 to n do result:=0.5*(result+x/result); end; procedure TForm1.FormCreate(Sender: TObject); begin n:=5; edit1.Text:=inttostr(n); StringGrid1.colcount:=n; randomize; for k:=0 to n-1 do StringGrid1.cells[k,0]:=inttostr(random(100)); end; procedure TForm1.Button2Click(Sender: TObject); begin // Изменить n:=strtoint(edit1.Text); StringGrid1.colcount:=n; randomize; for k:=0 to n-1 do StringGrid1.cells[k,0]:=inttostr(random(100)); end; procedure TForm1.Button3Click(Sender: TObject); begin for k:=1 to n do a[k]:=strtoint( StringGrid1.cells[k-1,0]); label1.Caption:='Максимальный элемент '+ inttostr(maxRn(a,n)); label2.Caption:='Максимальный элемент '+ inttostr(max(a,n))+' рек'; end; procedure TForm1.Button5Click(Sender: TObject); begin

58

Page 59: Лабораторный практикум

label5.Caption:='sqrt(x)='+ floattostrf(sqrtR(strtofloat(edit2.Text),n),fffixed,9,5) +' рек'; label6.Caption:='sqrt(x)= '+ floattostrf(sqrtA(strtofloat(edit2.Text),n),fffixed,9,5); end; end.

10.3. Индивидуальные задания

Необходимый материал и примеры приведены в лекции «Рекурсия». Решить поставленные задачи двумя способами – с применением рекурсии и без нее.

1. Вычислить факториал n!=1*2*3*…*(n-1)*n, 0!=1. 2. В упорядоченном массиве целых чисел ai, i=1...n найти номер элемента

c методом двоичного поиска, используя очевидное соотношение: если / 2nc a≤ , тогда иначе [ 1 / 2... nc a a∈ ] [ ]/ 2 1...nc a a+ n∈ . Если элемент c отсутствует в массиве, то вывести соответствующее сообщение.

3. Найти наибольший общий делитель чисел m и n. Используйте теорему Эйлера (алгоритм Евклида): Если m делится на n, то НОД (n, m)=n, иначе НОД (n, m)=НОД (m mod n, n).

4. Вычислить число Фибоначчи Fb(n). Числа Фибоначчи определяются следующим образом: Fb(0)=1; Fb(1)=1; Fb(n)=Fb(n-1)+Fb(n-2).

5. Найти сумму элементов массива . 6. Вычислить значение полинома n-й степени по формуле,

. ( )( )0 1 10

... ...n

in i n n

iP a x a x a x a xa−

== = + + +∑

7. Вычислить значение x a= , используя рекуррентную формулу

( 1 112n n nx x a x− −= + ) , в качестве начального приближения использовать

значение x0=0.5(1+a). 8. Найти максимальный элемент в массиве a1...an, используя очевидное

соотношение max (a1...an)=max (max (a1...an-1), an). 9. Найти максимальный элемент в массиве a1...an, используя

соотношение (метод деления пополам) max (a1...an)=max (max (a1...an/2), max (an/2+1, an)).

10. Вычислить ( ) 1 2 ... 2y n n n n= + − + − + + + 1 .

59

Page 60: Лабораторный практикум

11. Вычислить ( ) 11

1( 1) 1( 2).. ..

1.... 11 .2

y nn

nn

=+

− +− +

++

12. Вычислить произведение n≥2 (n – четное) сомножителей 2 2 4 4 6 6 ....1 3 3 5 5 7

y = ⋅ ⋅ ⋅ ⋅ ⋅ ⋅

13. Вычислить по следующему алгоритму: , если n

четное и , если n нечетное.

ny x= / 2 2( )ny x=1ny x x −= ⋅

14. Вычислить ! ,!( )!

mn

nC mm n m

= ≤−

n .

15. Найти значение функции Аккермана A(m, n), которая определяется для всех неотрицательных целых аргументов m и n следующим образом: A(o, n)=n+1; A(m, o)=A(m-1, 1); (m>o); A(m, n)=A(m-1, A(m, n-1)); (m>o; n>o).

60

Page 61: Лабораторный практикум

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

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

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

Необходимый теоретический материал и примеры программ приведены в лекциях «Поиск и сортировка» и «Списки на основе динамических массивов».

11.2. Индивидуальные задания

Организовать работу со списками записей на основе динамического массива. Индивидуальные варианты типов записей использовать те же, что и в лабораторной работе № 8. Обеспечить добавление и удаление элементов в массив на заданную позицию, сортировку и поиск по ключу.

61

Page 62: Лабораторный практикум

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

Цель лабораторной работы: получить навыки программирования однонаправленных списков в виде стека.

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

Необходимый теоретический материал и примеры программ приведены в лекции «Связанные списки».

12.2. Индивидуальные задания

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

1. Создать стек со случайными целыми числами в диапазоне –50 до +50 и

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

2. Создать стек из случайных целых чисел и удалить из него записи с четными числами.

3. Создать стек из случайных целых чисел в диапазоне от –10 до 10 и удалить из него записи с отрицательными числами.

4. Создать стек из случайных целых чисел и поменять местами крайние элементы.

5. Подсчитать, сколько элементов стека, построенного из случайных чисел, превышает среднее значение от всех элементов стека.

6. Создать стек из случайных целых чисел и найти в нем максимальное и минимальное значение.

7. Создать стек из случайных целых чисел и определить, сколько элементов стека, начиная с вершины, находится до элемента с максимальным значением.

8. Создать стек из случайных целых чисел и определить, сколько элементов стека, начиная от вершины, находится до элемента с минимальным значением.

9. Создать стек из случайных чисел и определить, сколько элементов стека находится между минимальным и максимальным элементами.

10. Создать стек из случайных чисел и определить, сколько элементов стека имеют значения меньше среднего значения от всех элементов стека.

11. Создать стек из случайных чисел и поменять местами минимальный и максимальный элементы.

62

Page 63: Лабораторный практикум

12. Создать стек из случайных целых чисел и из него сделать еще два стека. В первый поместить все четные, а во второй – нечетные числа.

13. Создать стек из случайных целых чисел в диапазоне от 1 до 10 и определить наиболее часто встречающееся число.

14. Создать стек из случайных целых чисел и удалить из него каждый второй элемент.

15. Создать стек из случайных целых чисел и получить из него транспонированный.

63

Page 64: Лабораторный практикум

ТЕМА 13. ОРГАНИЗАЦИЯ ОДНОНАПРАВЛЕННЫХ СПИСКОВ В ВИДЕ ОЧЕРЕДИ

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

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

Необходимый материал и примеры программ приведены в лекции «Связанные списки».

13.2. Индивидуальные задания Организовать однонаправленный список. Обеспечить добавление и

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

1. Создать стек со случайными целыми числами в диапазоне –50 до +50 и

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

2. Создать стек из случайных целых чисел и удалить из него записи с четными числами.

3. Создать стек из случайных целых чисел в диапазоне от –10 до 10 и удалить из него записи с отрицательными числами.

4. Создать стек из случайных целых чисел и поменять местами крайние элементы.

5. Подсчитать, сколько элементов стека, построенного из случайных чисел, превышает среднее значение от всех элементов стека.

6. Создать стек из случайных целых чисел и найти в нем максимальное и минимальное значение.

7. Создать стек из случайных целых чисел и определить, сколько элементов стека, начиная с вершины, находится до элемента с максимальным значением.

8. Создать стек из случайных целых чисел и определить, сколько элементов стека, начиная от вершины, находится до элемента с минимальным значением.

9. Создать стек из случайных чисел и определить, сколько элементов стека находится между минимальным и максимальным элементами.

10. Создать стек из случайных чисел и определить, сколько элементов стека имеют значения меньше среднего значения от всех элементов стека.

11. Создать стек из случайных чисел и поменять местами минимальный и максимальный элементы.

64

Page 65: Лабораторный практикум

12. Создать стек из случайных целых чисел и из него сделать еще два стека. В первый поместить все четные, а во второй – нечетные числа.

13. Создать стек из случайных целых чисел в диапазоне от 1 до 10 и определить наиболее часто встречающееся число.

14. Создать стек из случайных целых чисел и удалить из него каждый второй элемент.

15. Создать стек из случайных целых чисел и получить из него транспонированный.

65

Page 66: Лабораторный практикум

ТЕМА 14. ОРГАНИЗАЦИЯ ДВУНАПРАВЛЕННЫХ СПИСКОВ В ВИДЕ ОЧЕРЕДИ

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

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

Необходимый теоретический материал и примеры программ приведены в лекции «Связанные списки».

14.2. Индивидуальные задания

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

1. Создать стек со случайными целыми числами в диапазоне –50 до +50 и

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

2. Создать стек из случайных целых чисел и удалить из него записи с четными числами.

3. Создать стек из случайных целых чисел в диапазоне от –10 до 10 и удалить из него записи с отрицательными числами.

4. Создать стек из случайных целых чисел и поменять местами крайние элементы.

5. Подсчитать, сколько элементов стека, построенного из случайных чисел, превышает среднее значение от всех элементов стека.

6. Создать стек из случайных целых чисел и найти в нем максимальное и минимальное значение.

7. Создать стек из случайных целых чисел и определить, сколько элементов стека, начиная с вершины, находится до элемента с максимальным значением.

8. Создать стек из случайных целых чисел и определить, сколько элементов стека, начиная от вершины, находится до элемента с минимальным значением.

9. Создать стек из случайных чисел и определить, сколько элементов стека находится между минимальным и максимальным элементами.

10. Создать стек из случайных чисел и определить, сколько элементов стека имеют значения меньше среднего значения от всех элементов стека.

66

Page 67: Лабораторный практикум

11. Создать стек из случайных чисел и поменять местами минимальный и максимальный элементы.

12. Создать стек из случайных целых чисел и из него сделать еще два стека. В первый поместить все четные, а во второй – нечетные числа.

13. Создать стек из случайных целых чисел в диапазоне от 1 до 10 и определить наиболее часто встречающееся число.

14. Создать стек из случайных целых чисел и удалить из него каждый второй элемент.

15. Создать стек из случайных целых чисел и получить из него транспонированный.

67

Page 68: Лабораторный практикум

ТЕМА 15. МЕТОДЫ РЕШЕНИЯ ЗАДАЧ ЛИНЕЙНОЙ АЛГЕБРЫ

Цель лабораторной работы: изучить основные методы и алгоритмы решения систем линейных алгебраических уравнений, вычисления обратных матриц, нахождения собственных значений и собственных векторов матриц и их реализацию в среде Delphi.

15.1. Методы и алгоритмы решения задач линейной алгебры

Необходимый теоретический материал приведен в лекциях «Алгоритмы решения систем линейных алгебраических уравнений» и «Собственные значения и собственные векторы матриц». Основные схемы алгоритмов приведены ниже.

68

Page 69: Лабораторный практикум

Рис. 15.1. Схема алгоритма метода Гаусса

69

Page 70: Лабораторный практикум

kks = |w|

Рис. 15.2. Схема алгоритма метода квадратного корня

70

Page 71: Лабораторный практикум

Рис. 15.3. Схема алгоритма метода простой итерации

71

Page 72: Лабораторный практикум

Начало

A,n,eps

i=1,n

j=1,n

i=j

pij=0 pij=1

k=1 m=2

i=1,n-1

j=i+1,n

|aij|>|akm|

k=i m=j

akk=amm

f=½*arctg(2akm/(akk-amm))f=π/4

i=1,n

j=1,n

i=j

tij=0tij=1tkm=-sin(f) tmk=sin(f) tkk=cos(f) tmm=cos(f)

i=1,n

j=1,n

bij=0 cij=0

i=1,n

j=1,n

pij=bij aij=0

k=1,n

aij=aij+tki*ckj

max=|a12|

i=1,n-1

j=i+1,n

|aij|>max

max=|aij|

max<eps

A,P

Конец

да

нет

да нет

да нет

да

нет

нет

да

k=1,n

bij=bij+pik*tkjcij=cij+aik*tkj

да

нет

Рис. 15.4. Схема алгоритма метода вращений Якоби

72

Page 73: Лабораторный практикум

15.2. Пример написания программы Изображение формы и текст программы решения системы линейных

алгебраических уравнений методом Гаусса приведены ниже. Сам метод Гаусса оформлен в виде процедуры Gauss(a,b,n,x), помещенной в библиотечный модуль.

Рис. 15.1. Вид формы выполняемой программы

unit biblio; Листинг 15.1 interface type mat=array[1..30,1..30] of extended; vek=array[1..30] of extended; procedure Gauss(a:mat; b:vek; n:integer; var x:vek); implementation procedure Gauss; var k,m,p,i,j:integer; r,c,s:extended; begin for k:=1 to n-1 do begin p:=k;

73

Page 74: Лабораторный практикум

for m:=k+1 to n do if abs(a[p,k])<abs(a[m,k]) then p:=m; for j:=k to n do begin r:=a[k,j]; a[k,j]:=a[p,j]; a[p,j]:=r; end; r:=b[k]; b[k]:=b[p]; b[p]:=r; for m:=k+1 to n do begin c:=a[m,k]/a[k,k]; b[m]:=b[m]-c*b[k]; for i:=k to n do a[m,i]:=a[m,i]-c*a[k,i]; end; end; x[n]:=b[n]/a[n,n]; for k:=n-1 downto 1 do begin s:=0; for i:=k+1 to n do s:=s+a[k,i]*x[i]; x[k]:=(b[k]-s)/a[k,k]; end; end; end.

unit Unit1; Листинг 15.2 interface uses Windows,Messages,SysUtils,Variants,Classes,Graphics, Controls,Forms,Dialogs,Buttons,Grids,StdCtrls,biblio; type TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit; Button1: TButton; Button2: TButton; StringGrid1: TStringGrid; StringGrid2: TStringGrid; StringGrid3: TStringGrid;

74

Page 75: Лабораторный практикум

BitBtn1: TBitBtn; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; a:mat; b,x:vek; n,i,j:integer; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin n:=3; edit1.Text:=inttostr(n); stringgrid1.Cells[0,0]:=' A'; stringgrid2.Cells[0,0]:=' B'; stringgrid3.Cells[0,0]:='Решение'; stringgrid1.RowCount:=n+1; stringgrid1.ColCount:=n+1; stringgrid2.RowCount:=n+1; stringgrid3.RowCount:=n+1; for i:=1 to n do begin stringgrid1.Cells[i,0]:=' i='+inttostr(i); stringgrid1.Cells[0,i]:=' j='+inttostr(i); end; end; procedure TForm1.Button1Click(Sender: TObject); begin n:=strtoint(edit1.Text); stringgrid1.RowCount:=n+1; stringgrid1.ColCount:=n+1; stringgrid2.RowCount:=n+1; stringgrid3.RowCount:=n+1; for i:=1 to n do begin

75

Page 76: Лабораторный практикум

stringgrid1.Cells[i,0]:=' i='+inttostr(i); stringgrid1.Cells[0,i]:=' j='+inttostr(i); end; end; procedure TForm1.Button2Click(Sender: TObject); begin for i:=1 to n do for j:=1 to n do a[i,j]:=strtofloat(stringgrid1.Cells[j,i]); for i:=1 to n do b[i]:=strtofloat(stringgrid2.Cells[0,i]); Gauss(a,b,n,x); for i:=1 to n do stringgrid3.Cells[0,i]:=floattostrf(x[i],fffixed,9,5); end; end.

15.3. Индивидуальные задания

Составить программу решения СЛАУ n-го порядка, вычисления обратной матрицы или нахождения собственных значений и собственных векторов матрицы n-го порядка одним из методов по указанию преподавателя. Вычисления оформить в виде подпрограммы, помещенной в библиотечный модуль

1. Метод Гаусса. 2. Метод квадратного корня. 3. Метод прогонки. 4. Метод простой итерации. 5. Метод Зейделя. 6. Вычисление обратной матрицы. 7. Вычисление максимального собственного значения матриц

итерационным методом. 8. Вычисление собственных значений матриц интерполяционным методом. 9. Вычисление собственных значений матриц методом вращений Якоби.

76

Page 77: Лабораторный практикум

ТЕМА 16. АППРОКСИМАЦИЯ ФУНКЦИЙ. ВЫЧИСЛЕНИЕ ОПРЕДЕЛЕННЫХ ИНТЕГРАЛОВ

Цель лабораторной работы: изучить основные методы и алгоритмы аппроксимации функций и вычисления определенных интегралов и их реализацию в среде Delphi.

16.1. Методы и алгоритмы аппроксимации функций и вычисления

определенных интегралов

Необходимый теоретический материал приведен в лекциях «Аппроксимация функций» и «Вычисление производных и интегралов». Основные схемы алгоритмов приведены ниже.

77

Page 78: Лабораторный практикум

Рис 16.1. Схема алгоритма расчета интерполяционного полинома Ньютона

78

Page 79: Лабораторный практикум

Рис 16.2. Схема алгоритма расчета интерполяционного полинома Лагранжа

79

Page 80: Лабораторный практикум

16.2. Пример написания программы Изображение формы и текст программы аппроксимации функции

полиномом Лагранжа и вычисления определенного интеграла методом Гаусса с двумя узлами приведены ниже. Вычисления оформлены в виде процедур lag(xt,x,y,n) и Gauss2(a,b,m,f), помещенных в библиотечный модуль.

Рис. 16.1. Вид формы выполняемой программы

unit biblio; Листинг 16.1 interface type vek=array[1..30] of extended; fun=function(x:extended):extended; function lag(xt:extended; x,y:vek; n:integer):extended; function gauss2(a,b:extended; n:integer; f:fun):extended; implementation function lag; var i,k:integer; s,p:extended; begin s:=0; for k:=1 to n do

80

Page 81: Лабораторный практикум

begin p:=y[k]; for i:=1 to n do if i<>k then p:=p*(xt-x[i])/(x[k]-x[i]); s:=s+p; end; result:=s; end; function gauss2; const c=0.5773502692; var x,h,s:extended; k:integer; begin h:=(b-a)/n; x:=a+h/2; s:=0; for k:=1 to n do begin s:=s+f(x-h/2*c)+f(x+h/2*c); x:=x+h; end; result:=h*s/2; end; end. unit Unit1; Листинг 16.2 interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, TeEngine, Series, Buttons, StdCtrls, ExtCtrls, TeeProcs, Chart, biblio; type TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label2: TLabel; Chart1: TChart; Button1: TButton; Button2: TButton; BitBtn1: TBitBtn;

81

Page 82: Лабораторный практикум

Label3: TLabel; Series1: TLineSeries; Series2: TLineSeries; Edit4: TEdit; Label4: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function f(x:extended):extended; begin f:=4*x-20*cos(3*x); end; procedure TForm1.Button1Click(Sender: TObject); var a,b,h,xt:extended; // Аппроксимировать n,k,m:integer; x,y:vek; begin a:=strtofloat(edit1.Text); b:=strtofloat(edit2.Text); n:=strtoint(edit3.Text); m:=strtoint(edit4.Text); h:=(b-a)/(n-1); for k:=1 to n do begin x[k]:=a+(k-1)*h; y[k]:=f(x[k]); end; series1.Clear; series2.Clear; for k:=0 to m do begin xt:=a+k*(b-a)/m; series1.AddXY(xt,f(xt),'',clred);

82

Page 83: Лабораторный практикум

series2.AddXY(xt,lag(xt,x,y,n),'',clblue); end; end; procedure TForm1.Button2Click(Sender: TObject); var a,b:extended; // Интеграл m:integer; begin a:=strtofloat(edit1.Text); b:=strtofloat(edit2.Text); m:=strtoint(edit4.Text); label3.Caption:='Интеграл= '+ floattostrf(gauss2(a,b,m,f),fffixed,9,6); end; end.

16.3. Индивидуальные задания Составить программу аппроксимации функции f(x) и вычисления

определенного интеграла одним из методов по указанию преподавателя. Во всех вариантах требуется аппроксимировать заданную исходную функцию f(x) многочленом на интервале [a, b]. Задано количество неизвестных параметров n, вид аппроксимации и m – количество точек, в которых задана функция. Вычисления оформить в виде подпрограммы, помещенной в библиотечный модуль. Провести исследование факторов, влияющих на точность аппроксимации.

1. Аппроксимация общего вида 2. Аппроксимация полиномом Лагранжа 3. Аппроксимация полиномом Ньютона 4. Аппроксимация методом наименьших квадратов 5. Линейная аппроксимация 6. Квадратичная аппроксимация

Вычислить интеграл:

1. Методом средних прямоугольников 2. Методом трапеций 3. Методом Симпсона 4. Методом с автоматическим выбором шага 5. Методом Гаусса с двумя узлами 6. Методом Гаусса с тремя узлами

83

Page 84: Лабораторный практикум

ТЕМА 17. МЕТОДЫ РЕШЕНИЯ НЕЛИНЕЙНЫХ УРАВНЕНИЙ Цель лабораторной работы: изучить основные методы и алгоритмы

решения нелинейных уравнений и их реализацию в среде Delphi.

17.1. Методы и алгоритмы решения нелинейных уравнений Необходимый теоретический материал приведен в лекции «Методы

решений нелинейных уравнений».

17.2. Пример написания программы Изображение формы и текст программы нахождения простых корней

нелинейного уравнения методом Ньютона приведены ниже. Вычисления оформлены в виде функций f(x), fp(x) и nyton(x,eps,f,fp) (описание нелинейного уравнения, его производной и самого метода Ньютона).

Рис. 17.1. Вид формы выполняемой программы

84

Page 85: Лабораторный практикум

unit Unit1; Листинг 17.1 interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, TeEngine, Series, Buttons, StdCtrls, ExtCtrls, TeeProcs, Chart; type TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label2: TLabel; Chart1: TChart; Button1: TButton; BitBtn1: TBitBtn; Series1: TLineSeries; Memo1: TMemo; Edit4: TEdit; Label3: TLabel; Label4: TLabel; Edit5: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} type fun=function(x:extended):extended; function f(x:extended):extended; begin // Задание нелинейного уравнения f:=x*x-4; end; function fp(x:extended):extended;

85

Page 86: Лабораторный практикум

begin // Производная fp:=2*x; end; function nyton(x,eps:extended; f,fp:fun):extended; var w:extended; begin // Метод Ньютона repeat w:=x; x:=x-f(x)/fp(x); until abs(w-x)<eps; result:=x; end; procedure TForm1.Button1Click(Sender: TObject); var a,b,h,x,eps:extended; // Выполнить n:integer; begin a:=strtofloat(edit1.Text); b:=strtofloat(edit2.Text); h:=strtofloat(edit3.Text); eps:=strtofloat(edit4.Text); series1.Clear; x:=a; repeat series1.AddXY(x,f(x),'',clred); x:=x+strtofloat(edit5.Text); until x>b+0.0000000001; x:=a; n:=0; repeat if f(x)*f(x+h)<0 then // отсечение корня begin inc(n); memo1.Lines.Add(inttostr(n)+'-й корень= '+ floattostrf(nyton(x+h/2,eps,f,fp),fffixed,9,6)); end; x:=x+h; until x>b+0.0000000001; end; end.

17.3. Индивидуальные задания

Составить программу нахождения всех простых корней уравнения f(x)=0 в заданном интервале [a, b] одним из методов по указанию преподавателя. Вычисления оформить в виде подпрограммы.

86

Page 87: Лабораторный практикум

1. Метод простой итерации 2. Метод Ньютона 3. Метод секущих 4. Метод Вегстейна 5. Метод парабол 6. Метод деления отрезка пополам

87

Page 88: Лабораторный практикум

ТЕМА 18. МЕТОДЫ НАХОЖДЕНИЯ МИНИМУМА ФУНКЦИИ НЕСКОЛЬКИХ ПЕРЕМЕННОЙ

Цель лабораторной работы: изучить основные методы и алгоритмы нахождения минимума функции нескольких переменной и их реализацию в среде Delphi.

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

оптимизации».

18.2. Пример написания программы Изображение формы и текст программы нахождения минимума функции

одной переменной методом золотого сечения приведены ниже. Вычисления оформлены в виде функции gold(a,b,eps,f).

Рис. 18.1. Вид формы выполняемой программы

88

Page 89: Лабораторный практикум

unit Unit1; Листинг 18.1 interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, TeEngine,Series, Buttons, StdCtrls, ExtCtrls, TeeProcs, Chart; type TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label2: TLabel; Chart1: TChart; Button1: TButton; BitBtn1: TBitBtn; Series1: TLineSeries; Memo1: TMemo; Edit4: TEdit; Label3: TLabel; Label4: TLabel; Edit5: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} type fun=function(x:extended):extended; function f(x:extended):extended; begin // Задание функции f:=sqr(x-3); end; function gold(a,b,eps:extended; f:fun):extended;

89

Page 90: Лабораторный практикум

const w=0.381966011; var x1,x2,y1,y2:extended; begin // Метод золотого сечения x1:=a+w*(b-a); y1:=f(x1); x2:=b-w*(b-a); y2:=f(x2); repeat if y1>y2 then begin a:=x1; x1:=x2; y1:=y2; x2:=b-w*(b-a); y2:=f(x2); end else begin b:=x2; x2:=x1; y2:=y1; x1:=a+w*(b-a); y1:=f(x1); end; until abs(b-a)<eps; result:=(a+b)/2; end; procedure TForm1.Button1Click(Sender: TObject); var a,b,h,x,eps:extended; // Выполнить n:integer; begin a:=strtofloat(edit1.Text); b:=strtofloat(edit2.Text); h:=strtofloat(edit3.Text); eps:=strtofloat(edit4.Text); series1.Clear; x:=a; repeat series1.AddXY(x,f(x),'',clred); x:=x+strtofloat(edit5.Text); until x>b+0.0000000001; x:=a; n:=0; memo1.Clear; repeat if (f(x)<f(x-h))and(f(x)<f(x+h))then begin inc(n); memo1.Lines.Add(inttostr(n)+'-й минимум= '+ floattostrf(gold(x-h,x+h,eps,f),fffixed,9,4)); end; x:=x+h; until x>b+0.0000000001; end;

90

Page 91: Лабораторный практикум

end.

18.3. Индивидуальные задания Составить программу нахождения минимума функции n переменных

одним из методов по указанию преподавателя. Вычисления оформить в виде подпрограммы.

1. Метод покоординатного спуска с использованием метода золотого

сечения при поиске минимума по направлению. 2. Метод Хука – Дживса с использованием метода Фибоначчи при поиске

минимума по направлению. 3. Метод Нелдера – Мида. 4. Метод наискорейшего спуска с использованием метода

последовательного перебора при поиске минимума по направлению. 5. Метод Флетчера – Ривса с использованием метода квадратичной

параболы при поиске минимума по направлению. 6. Метод Ньютона – Рафсона с использованием метода половинного

деления при поиске минимума по направлению. 7. Метод ДФП с использованием метода золотого сечения при поиске

минимума по направлению. 8. Метод покоординатного спуска с использованием метода кубической

параболы при поиске минимума по направлению. 9. Метод Хука – Дживса с использованием метода половинного деления при

поиске минимума по направлению. 10. Метод Нелдера – Мида. 11. Метод наискорейшего спуска с использованием метода золотого сечения

при поиске минимума по направлению. 12. Метод Флетчера – Ривса с использованием метода Фибоначчи при

поиске минимума по направлению. 13. Метод Ньютона – Рафсона с использованием метода квадратичной

параболы при поиске минимума по направлению. 14. Метод ДФП с использованием метода кубической параболы при поиске

минимума по направлению. 15. Метод наискорейшего спуска с использованием метода Фибоначчи при

поиске минимума по направлению.

91

Page 92: Лабораторный практикум

ТЕМА 19. РЕШЕНИЕ ЗАДАЧИ КОШИ ДЛЯ ОБЫКНОВЕННЫХ ДИФФЕРЕНЦИАЛЬНЫХ УРАВНЕНИЙ

Цель лабораторной работы: изучить основные методы и алгоритмы решения задачи Коши для обыкновенных дифференциальных уравнений и их реализацию в среде Delphi.

19.1. Методы и алгоритмы решения обыкновенных дифференциальных

уравнений Необходимый теоретический материал приведен в лекции «Решение

задачи Коши для обыкновенных дифференциальных уравнений». Основные схемы алгоритмов приведены ниже.

92

Page 93: Лабораторный практикум

Рис.19.1. Схема алгоритма метода Эйлера

93

Page 94: Лабораторный практикум

Рис. 19.2. Схема алгоритма неявной схемы 2-го порядка

94

Page 95: Лабораторный практикум

Рис. 19.3. Схема алгоритма метода Рунге-Кутта 2-го порядка

95

Page 96: Лабораторный практикум

Начало

a,b,n,ny,nit,Y,eps

h=(b-a)/n

x=a

Вывод x,Y x=x+h/2

Вычисление Fm(x,Y)

i=1,ny

ypi=yi+h/2*fmi

x=x+h/2

Вычисление Fp1(x,Yp)

i=1,ny

ypi=yi+h/2*fp1i

Вычисление Fp2(x,Yp)

i=1,ny

ypi=yi+h*fp2i

Вычисление Fp(x,Yp)

i=1,ny

ypi=yi+h/6*(fmi+2fp1i+2fp2i+fpi)

Вывод x,Y

Вычисление Fp(x,Yp)

k=2,n

i=1.ny

yi=ypi+h/2*(3fpi-fmi)

A B Выход

96

Page 97: Лабораторный практикум

Рис. 19.4. Схема алгоритма неявного метода Адамса 3-го порядка

97

Page 98: Лабораторный практикум

19.2. Пример написания программы

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

Рис. 19.1. Вид формы выполняемой программы unit Unit1; Листинг 19.1 interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, TeEngine, Series,Buttons,StdCtrls,ExtCtrls,TeeProcs,Chart; type TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label2: TLabel; Chart1: TChart;

98

Page 99: Лабораторный практикум

Button1: TButton; BitBtn1: TBitBtn; Series1: TLineSeries; Edit4: TEdit; Label4: TLabel; Series2: TLineSeries; Series3: TLineSeries; Series4: TLineSeries; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} type vek=array[1..20] of extended; procedure fpr(x:extended; var y,f:vek; ny:word); begin // Правые части системы диф. уравнений f[1]:=y[1]+y[2]-2*x-exp(x)+2; f[2]:=y[1]+y[2]-2*x; end; procedure wrt(x:extended; var y:vek; ny:word; chart:TChart); begin chart.series[0].AddXY(x,y[1],'',clred); chart.series[1].AddXY(x,y[2],'',clblue); // Точное решение chart.series[2].AddXY(x,2*x,'',clgreen); chart.series[3].AddXY(x,exp(x),'',$00FF00FF); end; procedure aler(a,b:extended; var y,f:vek; ny,nx:word; chart:TChart); // Метод Эйлера var x,h:extended; n,i:word; begin h:=(b-a)/nx; x:=a; wrt(x,y,ny,chart);

99

Page 100: Лабораторный практикум

for n:=1 to nx do begin fpr(x,y,f,ny); for i:=1 to ny do y[i]:=y[i]+h*f[i]; x:=x+h; wrt(x,y,ny,chart); end; end; procedure TForm1.Button1Click(Sender: TObject); var a,b:extended; // Выполнить nx,ny:word; y,f:vek; begin a:=strtofloat(edit1.Text); b:=strtofloat(edit2.Text); ny:=strtoint(edit3.Text); nx:=strtoint(edit4.Text); series1.Clear; series2.Clear; y[1]:=2*a; y[2]:=exp(a); // Начальные условия aler(a,b,y,f,ny,nx,chart1); end; end.

19.3. Индивидуальные задания

Составить программу решения задачи Коши для обыкновенных дифференциальных уравнений одним из методов по указанию преподавателя. Метод решения оформить в виде подпрограммы. Построить графики полученного и точного решений. С помощью этой программы решить задачу для системы двух уравнений в соответствии с вариантом из табл. 19.1.

11 1 2

22 1 2

01 1

02 2

( , , ),

( , , ),

,

( ) ,

( )

=

=

≤ ≤

=

=

du f x u udxdu f x u udxa x b

u a u

u a u

Точное решение для всех вариантов: 1 22 ,= = xu x u e .

100

Page 101: Лабораторный практикум

Методы решения задачи Коши

1. Метод Эйлера 2. Неявная схема 1-го порядка 3. Неявная схема 2-го порядка 4. Метод Рунге-Кутта 2-го порядка 5. Метод Рунге-Кутта 4-го порядка 6. Явная экстраполяционная схема Адамса 2-го порядка 7. Явная экстраполяционная схема Адамса 3-го порядка 8. Неявная схема Адамса 3-го порядка

Tабл. 19.1 № 1 1( , , )2f x u u 2 1( , , )2f x u u [a, b] u1(a) u2(a) Метод1

1 2/ / xu x u e− +1 1 2/(2 ) 1+ −u x u [1, 3] 2 e(1) №1 2

1 2 2 2+ − − +xu u x e 1 2 2+ −u u x [1, 2] 2 e(1) №2 3

1 22 / 2+ −xu u e x 2 2 1 /(2 ) /− +xu x e u u [2, 3] 4 e(2) №3 4

1 2( ) /(⋅ ⋅xu e x u ) 1 22 4+ −u u x [1, 4] 2 e(1) №4 5

1 22 ( ) / 4+ + −x xu u e e x 2 12 /x u u⋅ [2, 4] 4 e(2) №5 6

1 2 /( )⋅ ⋅xu u e x 1 22 / 2 1xx u u e+ − − [1, 3] 2 e(1) №6 7

1 2/ 2 / xu x u e+ 1 2 / 2⋅u u x [2, 3] 4 e(2) №7 8

1 2/ + − xu x u e 21 22 / / 1+ −xx u u e [1, 4] 2 e(1) №8

9 1 22 / 2+ −xu e u x 2 2

1 2/ 4+ −u x u [1, 2] 2 e(1) №7 10

1 24 / xx u u e− + 1 2/ 2 /− +x xu x u e e [2, 4] 4 e(2) №6 11

1 22 / /+ xx u u e 21 2/( 2 )xu e u x⋅ ⋅ [3, 4] 6 e(3) №5

12 1 2 /(2 ) 2⋅ −xu u e x + 1 22 2+ − − xu u x e [1, 3] 2 e(1) №4

13 2 21 2 4 2+ − − +xu u x e 1 2 2/ 2⋅ + −xu e u u x [1, 2] 2 e(1) №3

14 2 21 2/ 2 − + xu x u e 1 2/ 2 / 1⋅ +xu e x u e −x [2, 4] 4 e(2) №2

15 1 2/( )⋅ ⋅xu e x u 1 22 / 1+ −x u u [3, 4] 6 e(3) №1

101

Page 102: Лабораторный практикум

ПРИЛОЖЕНИЕ 1. ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ ПРЕОБРАЗОВАНИЯ СТРОКОВОГО ПРЕДСТАВЛЕНИЯ

ЧИСЕЛ Для работы со строками применяются следующие процедуры и функции

(в квадратных скобках указываются необязательные параметры).

Подпрограммы преобразования строк в другие типы Function StrToFloat(S: String): Extended;

Преобразует символы строки S в вещественное число. Строка не должна содержать ведущих или ведомых пробелов

Function StrToInt(S: String): Integer;

Преобразует символы строки S в целое число. Строка не должна содержать ведущих или ведомых пробелов

Procedure Val(S: String; var X, Code: Integer);

Преобразует строку символов S во внутреннее представление целой или вещественной переменной X, которое определяется типом этой переменной. Параметр Code содержит нуль, если преобразование прошло успешно

Подпрограммы обратного преобразования Function FloatToStr( Value: Extended): String;

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

Function FloatToStrF(Value: Extended; Format: TFloatFormat; Precision, Digits: Integer) : String;

Преобразует вещественное значение Value в строку символов с учетом параметров Precision и Digits (см. пояснения ниже)

Procedure Str(X [:width [:Decimals]]; var S: String);

Преобразует число Х любого вещественного или целого типа в строку символов S; параметры Width и Decimals, если они присутствуют, задают формат преобразования

Правила использования параметров функции FloatToStrF

Format Описание ffExponent Научная форма представления с множителем еХХ. Precision

задает общее количество десятичных цифр мантиссы. Digits -количество цифр в десятичном порядке XX.

ffFixed Формат с фиксированным положением разделителя целой и дробной частей. Precision задает общее количество десятичных цифр в представлении числа. Digits - количество цифр в дробной части. Число округляется с учетом первой отбрасываемой цифры: 3,14

ffGeneral Универсальный формат, использующий наиболее удобную для чтения форму представления вещественного числа. Соответствует формату ffFixed, если количество цифр в целой части меньше или равно Precision, а само число - больше или равно 0,00001, в противном случае соответствует формату ffExponent: 3,1416

102

Page 103: Лабораторный практикум

ffNumber Отличается от ffFixed использованием символа - разделителя тысяч при выводе больших чисел (для русифицированной версии Windows таким разделителем является пробел)

ffCurrency Денежный формат. Соответствует ffNumber, но в конце строки ставится символ денежной единицы (для русифицированной версии Windows - символы «р.»). Для Value = π*1000 получим: 3 141,60р

103

Page 104: Лабораторный практикум

ПРИЛОЖЕНИЕ 2. МАТЕМАТИЧЕСКИЕ ФОРМУЛЫ

Язык Object Pascal имеет ограниченное количество встроенных математических функций. Поэтому при необходимости использовать другие функции следует применять известные соотношения или модуль Math. В таблице приведены выражения наиболее часто встречающихся функций.

Функция Соотношение Модуль Math

)(xaLog )()(xLn

aLn

LogN(a, x)

ax )(xLnae ∗ Power(x,a)

)(xTg )(xCos

)(xSin Tan(x)

)(xCtg )(xSin

)(xCos CoTan(x)

)(xArcSin 21

ArcTg xx

⎛ ⎞⎜ ⎟

−⎝ ⎠

ArcSin(x)

)(xArcCos )(xArcSin

2−

π ArcCos(x)

)(xArcCtg )(xArcTg

2−

π

)(xSh 2

ee xx −− Sinh(x)

2ee xx −+

)(xCh Cosh(x)

( )Sign x ( )Sign x

1, если x>0; 0, если x=0; -1, если x<0

104

Page 105: Лабораторный практикум

ПРИЛОЖЕНИЕ 3. ТАБЛИЦЫ СИМВОЛОВ ASCII Стандартная часть таблицы символов ASCII

КС С КС С КС С КС С КС С КС С КС С КС С 0 16 ► 32 48 0 64 @ 80 P 96 ` 112 p 1 ☺ 17 ◄ 33 ! 49 1 65 A 81 Q 97 a 113 q 2 ☻ 18 ↕ 34 " 50 2 66 B 82 R 98 b 114 r 3 ♥ 19 ‼ 35 # 51 3 67 C 83 S 99 c 115 s 4 ♦ 20 ¶ 36 $ 52 4 68 D 84 T 100 d 116 t 5 ♣ 21 § 37 % 53 5 69 E 85 U 101 e 117 u 6 ♠ 22 ▬ 38 & 54 6 70 F 86 V 102 f 118 v 7 • 23 ↨ 39 ' 55 7 71 G 87 W 103 g 119 w 8 ◘ 24 ↑ 40 ( 56 8 72 H 88 X 104 h 120 x 9 ○ 25 ↓ 41 ) 57 9 73 I 89 Y 105 i 121 y 10 ◙ 26 → 42 * 58 : 74 J 90 Z 106 j 122 z 11 ♂ 27 ← 43 + 59 ; 75 K 91 [ 107 k 123 { 12 ♀ 28 ∟ 44 , 60 < 76 L 92 \ 108 l 124 | 13 ♪ 29 ↔ 45 - 61 = 77 M 93 ] 109 m 125 } 14 ♫ 30 ▲ 46 . 62 > 78 N 94 ^ 110 n 126 ~ 15 ☼ 31 ▼ 47 / 63 ? 79 O 95 _ 111 o 127 ⌂

Некоторые из вышеперечисленных символов имеют особый смысл. Так,

например, символ с кодом 9 обозначает символ горизонтальной табуляции, символ с кодом 10 – символ перевода строки, символ с кодом 13 – символ возврата каретки.

Дополнительная часть таблицы символов КС С КС С КС С КС С КС С КС С КС С КС С 128 А 144 Р 160 а 176 ░ 192 └ 208 ╨ 224 р 240 Ё 129 Б 145 С 161 б 177 ▒ 193 ┴ 209 ╤ 225 с 241 ё 130 В 146 Т 162 в 178 ▓ 194 ┬ 210 ╥ 226 т 242 Є 131 Г 147 У 163 г 179 │ 195 ├ 211 ╙ 227 у 243 є 132 Д 148 Ф 164 д 180 ┤ 196 ─ 212 ╘ 228 ф 244 Ї 133 Е 149 Х 165 е 181 ╡ 197 ┼ 213 ╒ 229 х 245 ї 134 Ж 150 Ц 166 ж 182 ╢ 198 ╞ 214 ╓ 230 ц 246 Ў 135 З 151 Ч 167 з 183 ╖ 199 ╟ 215 ╫ 231 ч 247 ў 136 И 152 Ш 168 и 184 ╕ 200 ╚ 216 ╪ 232 ш 248 ° 137 Й 153 Щ 169 й 185 ╣ 201 ╔ 217 ┘ 233 щ 249 ·

105

Page 106: Лабораторный практикум

138 К 154 Ъ 170 к 186 ║ 202 ╩ 218 ┌ 234 ъ 250 · 139 Л 155 Ы 171 л 187 ╗ 203 ╦ 219 █ 235 ы 251 √ 140 М 156 Ь 172 м 188 ╝ 204 ╠ 220 ▄ 236 ь 252 № 141 Н 157 Э 173 н 189 ╜ 205 ═ 221 ▌ 237 э 253 ¤ 142 О 158 Ю 174 о 190 ╛ 206 ╬ 222 ▐ 238 ю 254 ■ 143 П 159 Я 175 п 191 ┐ 207 ╧ 223 ▀ 239 я 255

В таблицах обозначение КС означает «код символа», а С – «символ».

106

Page 107: Лабораторный практикум

ЛИТЕРАТУРА 1. Архангельский А. Я. Программирование в Delphi 7 / А. Я. Архангельский.

– М. : ЗАО «Издательство БИНОМ», 2003. 2. Фаронов В. В. Delphi 6: Учебный курс. / В. В. Фаронов. – М.: Издатель

Молгачева С.В., 2001. 3. Дж. Гленн Брукшир. Введение в компьютерные науки / Дж. Гленн

Брукшир. – «Вильямс» М, С-П, Киев. 2001. 4. А. К. Синицын, С. В. Колосов, А. А. Навроцкий и др. Программирование

алгоритмов в среде Delphi. Лаб. практикум. Ч. 1. – Мн., БГУИР, 2004. 5. Колосов С. В. Программирование в Delphi. Учеб. пособие – Мн., БГУИР,

2005. 6. Калиткин, Н. Н. Численные методы / Н. Н. Калиткин. – М. : Наука, 1978. 7. Бахвалов, Н. С. Численные методы / Н. С. Бахвалов – М. : Наука, 1975. 8. Численные методы анализа / В. П. Демидович [и др.]. – М. : Физматгиз,

1963. 9. Волков, Е. А. Численные методы / Е. А. Волков – М. : Наука, 1982. 10. Вычислительные методы высшей математики / В. И. Крылов [и др.]. –

Мн. : Вышэйшая школа, 1972. – Т.1. 11. Вычислительные методы высшей математики / В. И. Крылов [и др.]. –

Мн. : Вышэйшая школа, 1975. – Т.2. 12. Машинные методы математических вычислений / Дж. Форсайт [и др.]. –

М. : Мир, 1980. 13. Шуп Т. Решение инженерных задач на ЭВМ / Т. Шуп – М. : Мир, 1982. 14. Самарский, А. А. Введение в численные методы / А. А. Самарский. – М.

: Наука, 1982. 15. Березин, И. С. Методы вычислений / И. С. Березин, Н. П. Жидков – М. :

Физматгиз, 1962. – Т.1. 16. Березин, И. С. Методы вычислений / И. С. Березин, Н. П. Жидков – М. :

Физматгиз, 1970. – Т.2. 17. Банди, Б. Методы оптимизации: Вводный курс / Б. Банди. – М. : Мир,

1989. 18. Копченова, Н. В. Вычислительная математика в примерах и задачах / Н.

В. Копченова, И. А. Марон – М. : Наука, 1972. 19. Мак-Кракен, Д. Численные методы и программирование на Фортране /

Д. Мак-Кракен, У. Дорн – М. : Мир, 1972. 20. Дьяконов, В. П. Справочник по алгоритмам и программам на языке

Бейсик для ПЭВМ / В. П. Дьяконов – М. : Наука, 1989.

107