Программирование циклических алгоритмов на языке LAZARUS

advertisement
Министерство образования и науки Российской Федерации
Федеральное агентство по образованию
Саратовский государственный технический университет
Балаковский институт техники, технологии и управления
ПРОГРАММИРОВАНИЕ
ЦИКЛИЧЕСКИХ АЛГОРИТМОВ
НА ЯЗЫКЕ LAZARUS
Методические указания к выполнению лабораторной работы
по курсу «Системное программное обеспечение»
для студентов специальности 210100
дневной и вечерней форм обучения
Одобрено
редакционно-издательским советом
Балаковского института техники,
технологии и управления
Балаково 2009
ВВЕДЕНИЕ
Данные методические указания являются третьими из курса указаний для изучения языка Lazarus. В них рассматриваются основные правила
по работе с операторами цикла.
ЦЕЛЬ РАБОТЫ – изучить операторы цикла и создать программу с
циклической структурой с помощью объектно-ориентированного языка
Lazarus.
ОСНОВНЫЕ ПОНЯТИЯ
Операторы цикла используются для организации циклов (повторов).
Цикл представляет собой последовательность операторов, которая может
выполняться более одного раза. Группу повторяемых операторов называют
телом цикла. Различают три вида операторов цикла: while, repeat, for.
Если число повторений оператора (составного оператора) заранее
неизвестно, а задано лишь условие его повторения (или окончания), то используются операторы while, repeat. Оператор for используется, если число
повторений заранее известно.
Выполнение оператора цикла любого вида может быть прервано с
помощью оператора перехода goto или предназначенной для этих целей
процедуры без параметров Break, которая передает управление на следующий за оператором цикла оператор.
С помощью процедуры без параметров Continue можно задать досрочное завершение очередного повторения тела цикла, что равносильно
передаче управления в конец тела цикла.
Оператор while
Оператор while (пока) называют оператором цикла с предусловием,
т.к. проверка условия выполнения тела цикла производится в самом начале
оператора.
2
Формат:
while <условие> do <тело цикла>;
Условие – булевское выражение. Тело цикла – простой или составной оператор. Составной оператор используется в тех случаях,
когда тело цикла состоит из 2-х и более операторов.
Перед каждым выполнением тела цикла вычисляется значение
выражения условия. Если результат равен True, тело цикла выполняется и снова вычисляется выражение условия. Если результат равен
False, происходит выход из цикла и переход к первому после while
оператору.
Оператор повтора repeat
Оператор repeat реализует цикл с постусловием. Он аналогичен оператору while, но отличается от него тем, что условие проверяется после
очередного выполнения операторов тела цикла.
Формат:
repeat
<тело цикла>;
until <условие>;
Условие – выражение логического типа. Тело цикла – произвольная последовательность операторов.
Операторы тела цикла выполняются хотя бы один раз, после чего
вычисляется выражение условия: если его значение есть False, операторы
тела цикла повторяются, в противном случае оператор repeat завершает свою работу.
Оператор повтора for
В случаях, когда число повторений может быть заранее известно, для
организации циклической обработки информации применяется оператор
3
повтора for. Часто этот оператор повтора называют оператором цикла с
параметром, так как число повторений задается переменной, называемой
параметром цикла.
Оператор повтора for может быть представлен в двух форматах:
for <параметр цикла> := <S1> to <S2> do <тело цикла>;
for <параметр цикла> := <S1> downto <S2> do <тело цикла>;
где SI и S2 – выражения, определяющие соответственно начальное и конечное значения параметра цикла, должны иметь тип, совместимый с типом параметра цикла;
for ... do – заголовок цикла.
Параметр цикла представляет собой переменную порядкового типа,
которая должна быть определена в том же блоке, где находится оператор
цикла.
Тело цикла может быть простым или составным оператором. Оператор for обеспечивает выполнение тела цикла до тех пор, пока не будут перебраны все значения параметра цикла от начального до конечного с соответствующим шагом. Шаг параметра всегда равен 1 для первого формата
цикла и -1 – для второго формата. То есть значение параметра последовательно увеличивается (for...to) или уменьшается (for...downto) на единицу
при каждом повторении цикла.
Цикл может не выполниться ни разу, если для цикла for...to значение
начального выражения больше конечного, а для цикла for...downto, наоборот, значение начального выражения меньше конечного.
ЗАДАНИЕ
Изучить операторы цикла и создать Windows-приложение (форму и
модуль проекта), которое выводит таблицу значений функции y(x) и ее
разложения в ряд в виде суммы S(x) для значений x от xn до xk c шагом
4
h=(xk - xn)/10. В панели интерфейса предусмотреть возможность управления выводом исходных данных и погрешности вычислений.
Порядковый номер студента по списку группы соответствует номеру
варианта (таблица 1).
ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
Порядок выполнения работы состоит в следующем:
1. Определить порядок реализации вычислений.
2. Создать форму с необходимыми компонентами.
3. Записать программу модуля проекта.
4. Протестировать работу созданного приложения.
5. Написать отчет по лабораторной работе.
Таблица 1
Варианты заданий
№
1
1
2
3
4
5
6
7
xn
xk
2
3
0.1
0.1
0.1
0.1
0.1
0.1
0.3
1
1
S(x)
4
n
5
2 n 1
x3
n x
x
 ...  (1)
3!
(2n  1)!
1
x2
x 2n
 ... 
2!
(2n)!
cos

4 x  ... 
10
cos n

4 xn
1
1
1
2n
x2 x4
n x
1

 ...  (1)
2! 4!
(2n)!
1
1
0.8
16
1!
n!
12
2n
x2 x4 x6
n x
1


 ...  (1)
1! 2! 3!
n!
3
2 n 1
x
x
x
 ... 
3!
(2n  1)!
2
4

2 x  2 x 
2 2n x 2n
1

 ...  (1) n
2!
4!
(2n)!
5
Y(x)
6
sin x
e x  e x
2
e
x cos

4
8
cosx 
14
ex
8
10

cos(x sin )
4
2
e x  e x
2
cos2 x 
Продолжение таблицы 1
1
8
9
2
0.1
0.1
3
1
1
10
0.1
0.5
11
0.1
0.8
12
0.1
1
13
0.1
1
14
0.2
1
15
0.2
1
4
1
2x
(2 x)
 ... 
1!
n!
10
x
n2  1  x 
1  2  ... 
 
2
n!  2 
n
14
2n
(2 x) 2 (2 x) 4
n (2 x)


 ...  (1)
2
24
(2n)!
x x2
xn
1 
 ... 
1! 2!
n!
2
3
n
x
x
n 1 x
x

 ...   1
2
3
n
1  x  x 2  x 3  ...   1 x n
n
2 n 1
2
5
x
x
x
x
n


 ...   1
2n  1!
1!
3!
5!
16
0.1
0.9
17
0.1
1
1
18
0.1
1
1  x 2  x 4  ...  x 2 n
19
0.1
0.8
20
x2 x4
x 2n
0.1 1.1 1 

 ... 
1! 2!
n!
21
0.1
n
x x2
n x

 ...   1
1! 2!
n!
x2 
23
0.1
0.2
1
x 6 x10
x 22 n1

 ...  (1) n
3! 5!
(2n  1)!
1  x 2  x 4  ...   1 x 2 n
т
2 n 1 2 n 1
2 x 2 x 
x
n 1 2

 ...  (1)
1!
3!
(2n  1)!
0.7
3
2
5
2
e2 x
2 n 1
1
2
7
2
x
x
x
n x


 ...   1
2n  1!
1!
3! 5!
6
 x2 x 
   1e 2
 4 2 


15
arctgx
10
xarctgx   ln 1  x 2
8
2(cos 2 x   1)
12
ex
10
ln 1  x 
8
1
1 x
10
sin
14
ex
8
1
1 x2
12
sin x 2
10
ex
15
1
1 x2
10
sin 2x
8
x  sin
3
22
6
x
2 n 1
x3
n x
x
 ...  (1)
3
2n  1
x2 x4
x 2n
n 1

 ...  (1)
2 12
2n(2n  1)
3
1
5
n
 x
 
2
 x
Окончание таблицы 1
1
24
25
2
0.1
3
1
4
1
4
8
5
x
x
x

 ...  (1) n
2! 4!
(2n)!
x3 x5
x 2 n 1

 ...  (1) n 1 2
3 15
4n  1
4
6
2n
x
x
n 1 x
2
x 

 ...   1
2
3
n
6
4n2
x
x
x2 
 ...  (1) n
3
2n  1
2
4
6
2 т 2
x
x
x
n x


 ...   1
2n  1!
1! 3! 5!
0.1
1
26
0.1
1
27
0.1
1.1
28
0.2
0.8
29
0.1
1
1
1
n
x x2
n x
1 
 ...  (1)
2! 4!
(2n)!
30
0.1
6
 
4n
x3 x5
x 2 n1
  ...  (1) n
2! 4!
(2n)!
12
cos x 2
12
1 x2
x
arctg x  
2
2
10
ln 1  x 2
8
arctg x 2
14
x  sin x 
8
x  cosx
10
cos


 
 x
ПРИМЕР ВЫПОЛНЕНИЯ РАБОТЫ
Задание. Создать Windows-приложение, которое выводит таблицу
значений функции Y ( x)  (1 
x2
x
)  cosx    sin  x  и ее разложения в ряд в
2
2
2n 2  1 2 n
x для значений x от xn до xk c шагом
виде суммы S ( x)   (1)
(2n)!
n0
n
n
h=(xk - xn)/10.
1. Порядок реализации вычислений
При определении суммы членов ряда следует использовать рекуррентную формулу для получения общего члена ряда, выразив (n + 1)-ый
член через (n)-ый.
a n 1  R  a n .
(1)
a n 1
.
an
(2)
Откуда
R
7
Общий член ряда равен:
an 
 1n  2n 2  1 x 2n
.
2n !
(3)
Следующий член ряда равен:
an1 
 1n1  2n 2  4n  1 x 2n2
.
2n  2!
(4)
Распишем факториалы:
2n  1! 1  2  3  ...  2n  2n  1  2n  2
2n !  1  2  3  ...  2n
Подставим (3) и (4) в формулу (2), получим:
R




a n 1  1n 1  x 2 n  2  2n ! 2n 2  4n  3
 x 2  2n 2  4n  3


.
an
2n  12n  2 2n 2  1
2n  2! 1n  x 2 n  2n 2  1
R

 2n




2
 x2
 4n  3
.
2n  12n  2 2n 2  1


2. Создание формы с необходимыми компонентами
Один из возможных вариантов панели интерфейса создаваемого
приложения показан на рис.1.
Для указания числа членов ряда вместо компонента Edit используйте
компонент SpinEdit, который обеспечивает отображение и редактирование
целого числа с возможностью его изменения посредством двойной кнопки.
Компонент SpinEdit находится на вкладке Misc Палитры Компонентов. В тех случаях, когда объем выводимой информации превышает размер поля компонента Memo, целесообразно снабдить его линейками прокрутки. В свойстве ScrollBars компонента Memo1 установите значение
ssVertical – появится вертикальная линейка прокрутки. Сохраните модуль
под именем uncikl, а проект – prcikl.
8
Рис. 1. Окно учебной программы
3. Текст модуля uncikl
unit uncicl;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Spin,
StdCtrls, Buttons;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
CheckBox1: TCheckBox;
9
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Memo1: TMemo;
SpinEdit1: TSpinEdit;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
SpinEdit1.Value:=3; // количество членов ряда N
Edit1.text:='0,1';
// начальное значение Xn
Edit2.text:='2,0';
// конечное значение Xk
Memo1.Clear;
Memo1.Lines.Add('Лабораторная работа №3 – Циклический алгоритм');
end;
procedure TForm1.Button1Click(Sender: TObject);
10
var xn,xk,x,h,an,s,y,al,R,del: extended;
n,k: integer;
begin
n:= SpinEdit1.Value;
xn:=StrToFloat(Edit1.Text);
xk:=StrToFloat(Edit2.Text);
if CheckBox1.Checked then
Memo1.Lines.Add('Исходные данные: n='+IntToStr(n)+
' Xn='+FloatToStrF(xn,ffFixed,6,1)+' Xk='+FloatToStrF(xk,ffFixed,6,1));
h:=(xk-xn)/10;
// вычисление шага h
x:=xn;
repeat
// цикл по x
an:=1;
// нулевой член ряда
S:=an;
// начальное значение суммы ряда
for k:=0 to n do
begin
R:=-x*x*(2*sqr(k)+4*k+3)/((2*k+1)*(2*k+2)*(2*sqr(k)+1));
an:=an*R;
// следующий член ряда
S:=S+an;
// сумма членов ряда
end;
y:=(1-x*x*0.5)*cos(x)-0.5*x*sin(x);
al:=s-y;
// абсолютная погрешность
del:=abs((s-y)/y)*100; // относительная погрешность
if CheckBox2.Checked then
if CheckBox3.Checked then
Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,6,2)+
' S='+ FloatToStrF(s,ffFixed,6,3)+
' Y='+ FloatToStrF(y,ffFixed,6,3)+
' A='+ FloatToStrF(al,ffFixed,6,3)+
11
' D='+ FloatToStrF(del,ffFixed,6,0)+'%')
else
Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,6,2)+
' S='+ FloatToStrF(s,ffFixed,6,3)+
' Y='+ FloatToStrF(y,ffFixed,6,3)+
' A='+ FloatToStrF(al,ffFixed,6,3))
else if CheckBox3.Checked then
Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,6,2) +
' S='+ FloatToStrF(s,ffFixed,6,3)+
' Y='+ FloatToStrF(y,ffFixed,6,3)+
' D='+ FloatToStrF(del,ffFixed,6,0)+'%')
else
Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,6,2)+
' S='+ FloatToStrF(s,ffFixed,6,3)+
' Y='+ FloatToStrF(y,ffFixed,6,3));
x:=x+h;
until x>xk;
end;
initialization
{$I uncicl.lrs}
end.
Свойство Value компонента TSpinEdit содержит текущее значение
числовой величины типа longint.
СОДЕРЖАНИЕ И ОФОРМЛЕИНЕ ОТЧЕТА
ПО ЛАБОРАТОРНОЙ РАБОТЕ
Отчет оформляется в текстовом редакторе MS Word в формате А4 и
должен содержать:
1. Титульный лист.
12
2. Цель работы.
3. Задание.
4. Листинг программы.
5. Окно формы с полученными результатами.
ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ
1. Что такое цикл?
2. Что такое тело цикла?
3. Какие виды циклов вы знаете?
4. В каком случае тело цикла заключается в операторные скобки
begin…end?
5. В чем отличия операторов повтора while и repeat?
6. В каких случаях предпочтительнее использовать для организации
циклов оператор повтора for? Что записывается в заголовке этого
оператора?
7. Каким образом в операторе цикла for описывается направление изменения значения параметра цикла?
8. Для чего используется процедура без параметров Break?
9. Что можно задать с помощью процедуры без параметров Continue?
10. Для чего используется компонент SpinEdit?
ВРЕМЯ, ОТВЕДЕННОЕ НА ВЫПОЛНЕНИЕ
ЛАБОРАТОРНОЙ РАБОТЫ
Подготовка к работе – 0,5 акад. часа
Выполнение работы – 1,0 акад. час
Оформление работы – 0,5 акад. часа
Отчет по работе
– 0,5 акад. часа
13
ЛИТЕРАТУРА
1. Глинский Я.Н., Анохин В.Е., Ряжская В.А. Turbo Pascal 7.0 и Delphi/
учебное пособие. – 2-е изд., испр. и доп. – СПб: ДиаСофтЮП, 2003.
2. Гофман В.Э., Хомоненко А.Д. Delphi. Быстрый старт. – СПб.: БХВПетербург, 2003.
3. Сухарев М.В. Основы Delphi. Профессиональный подход. – СПб.: Наука
и техника, 2004.
4. Фаронов В.В. Система программирования Delphi. – СПб.: БХВПетербург, 2005.
5. Фленов М.Е. Delphi 2005. Секреты программирования. – СПб.: Питер,
2006.
14
СОДЕРЖАНИЕ
1. Введение
2
2. Цель работы
2
3. Основные понятия
2
4. Задание
4
5. Порядок выполнения работы
5
6. Пример выполнения работы
7
7. Содержание и оформление отчета по лабораторной работе
12
8. Вопросы для самоконтроля
13
9. Время, отведенное на выполнение лабораторной работы
13
Литература
14
15
ПРОГРАММИРОВАНИЕ
ЦИКЛИЧЕСКИХ АЛГОРИТМОВ
НА ЯЗЫКЕ LAZARUS
Методические указания к выполнению лабораторной работы
по курсу «Системное программное обеспечение»
для студентов специальности 210100
дневной и вечерней форм обучения
СОСТАВИЛИ: КАПРАЛОВА Ольга Альбертовна
ВЛАСОВ Вячеслав Викторович
Рецензент Т.Н. Скоробогатова
Редактор Л.В. Максимова
Корректор Е.В. Рубан
Подписано в печать
Бумага тип.
Тираж 100 экз.
Усл.печ.л. 1,0
Заказ
Формат 60х84 1/16
Уч.- изд.л. 1,0
Бесплатно
Саратовский государственный технический университет
410054, г. Саратов, ул. Политехническая, 77
Копипринтер БИТТиУ, 413840, г. Балаково, ул. Чапаева, 140
16
Download