Лабораторная работа № 3

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

Цель работы: приобретение практических навыков использования операторов циклов.

Используемые программные средства: Borland Delphi.

 

Теоретические сведения

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

Работа  с  компонентами.  Для  работы  с  многострочным  текстом  в Delphi

имеются компоненты Memo типа TMemo (панель Standard) и RichEdit типа TRichEdit (панель Win32), которые относятся к многострочным редакторам. Многострочный редактор предоставляет возможности для ввода, редактирования и отображения информации и позволяет содержать несколько строк.

Для работы с отдельными строками используется свойство Lines типа TStrings. Для того чтобы изменить значение свойства Lines компонента Memo в режиме проектирования приложения, используется StringListEditor, который вызывается с помощью Object Inspector:

Для добавления новой строки во время выполнения приложения необходимо вызвать метод Add (переменная типа string) компонента Memo:

Memo1.Lines.Add('новая строка');

Для выравнивания текста в поле компонента Memo используется     свойство

Alignment, которое может принимать значения: taCenter выровнять по центру; taLeftJustify выровнять по левому краю; taRightJustify выровнять по правому краю.


Для просмотра всей информации в компоненте Memo используются свойства WordWrap (перенос текста) и ScrollBars (полосы прокрутки), которые задаются, используя окно Object Inspector во время разработки приложения, или при обращении к этим свойствам компонентов непосредственно во время работы приложения. Для очистки содержимого компонента Memo используется метод Clear:

Memo1.Clear.

Содержимое компонентов можно загружать из текстового файла и сохранять в текстовом файле. Для этого удобно использовать методы

Memo1.Lines.LoadFromFile (const FileName: string)

и

Memo1.Lines.SaveToFile (const FileName: string)

класса TStrings.

 

3.1.    Порядок выполнения работы

 

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

Контрольный пример 3.1

Составить   программу   для   расчета                           f (x).   Значения    N       и                                                              x                           вводятся  с

 

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

зависимости от x , изменяющегося в диапазоне [x1, x2 ] с заданным шагом h :

 


 

f ( x) =


N   xn

å     .


 

Решение.


n =1 n!


1.  Открыть новый проект Delphi: File – New Application.

2.      Установить  с  помощью  Object  Inspector  следующие  свойства     компонента

Form1:

Form1.Height = 302

Form1.Wight = 326 Form1.BorderIcons


biMaximize = false Form1BorderStyle = bsSingle Form1.Position = poScreenCenter

Form1.Caption = ‘ Контрольный пример 1a’

3.    Рассмотрим по отдельности программирование каждого из слагаемых этого примера.


3.1.  Вычисление


n!. Вводится число


n . Переменной


f , предназначенной для


 

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


переменная


i   . Если   значение   параметра  цикла   меньше   или   равно


n   ,  то


выполняется  оператор  тела  цикла,  в  котором  из  участка  памяти    с  именем      f

 

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


именем  f . Когда параметр i

f:=1;


становится больше


n , цикл заканчивается.


for i:=1 to n do f:=f*i;


3.2.      Вычисление  степени


an .    Здесь a


   вещественное   число,  которое


необходимо возвести в целую положительную степень. Для того чтобы  получить


целую  степень n


числа


a , нужно умножить его само на себя     n


раз. Результат


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

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


основание   степени    a


и   снова   записываться  в   участок  памяти


st   . Цикл


выполняется n  раз.

st:=1;

for i:=1 to n do st:=st*x;

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


3.4. Объединив, получим:

st:=1; s:=0; f:=1;

for i:=1 to n do begin st:=st*x; f:=f*i; s:=s+st/f;

end;

4.    Расположить на форме следующие компоненты: три компонента Edit, три компонента Label, один компонент Button и один компонент BitBtn. Установить с помощью Object Inspector для них следующие свойства:

Label1.Caption = 'N' Label2.Caption = 'x' Label3.Caption = 'Сумма' Edit1.Text = '' Edit2.Text = '' Edit3.Text = '' Button1.Caption = 'Счет'

BitBtn1.Caption:=’&Закрыть’

5.   Для решения задачи запишем обработчик событий Button1.Click, щелкнув на компоненте Button1 (кнопка Счет) два раза левой кнопкой мыши.

Текст соответствующей процедуры имеет вид:

procedure TForm1.Button1Click(Sender: TObject); var n,i:integer;x,s,st,f:extended;

begin n:=StrToInt(Edit1.Text); x:=StrToFloat(Edit2.Text); st:=1; s:=0; f:=1;

for i:=1 to n do begin st:=st*x; f:=f*i; s:=s+st/f;

end; Edit3.Text:=FloatToStrF(s,ffFixed,7,3);

end;

Переменные,   которые   необходимы   для   решения   задачи,   описаны   в соответствующем разделе процедуры TForm1.Button1Click.

6.  Запустить проект на компиляцию и выполнение.


7.  Задать значения для


N = 5 ,


x = 2


и нажать кнопку Счет.


8.  Теперь нужно посчитать значение данной суммы на отрезке [x1; x2 ] .

Открыть новый проект Delphi: File New Application .


9.      Установить  с  помощью  Object  Inspector  следующие  свойства     компонента

Form1:

Form1.Height = 302

Form1.Width = 326 Form1.BorderIcons biMaximize = false

Form1.BorderStyle = bsSingle Form1.Position = poScreenCenter Form1.Caption = 'Контрольный пример 1-б'

10.    Расположить на форме следующие компоненты: четыре компонента Edit, четыре компонента Label, один компонент Button и один компонент Memo. Установить с помощью Object Inspector для них следующие свойства:

Label1.Caption = 'N' Label2.Caption = 'x1' Label3.Caption = 'x2' Label3.Caption = 'h' Edit1.Text = '' Edit2.Text = '' Edit3.Text = '' Edit4.Text = '' Button1.Caption = 'Счет' Memo1.Lines = ''

Memo1.ScrollBars = ssVertical

11.       Для решения задачи запишем обработчик событий Button1.Click, щелкнув на компоненте Button1 (кнопка Счет) два раза левой кнопкой мыши. Текст соответствующей процедуры имеет вид:

procedure TForm1.Button1Click(Sender: TObject); var x1,x2,x,h,s,st,f:extended; n,i:integer; stroka:string;

begin

Memo1.Clear; n:=StrToInt(Edit1.Text); x1:=StrToFloat(Edit2.Text); x2:=StrToFloat(Edit3.Text); h:=StrToFloat(Edit4.Text); x:=x1;

repeat

st:=1; s:=0; f:=1;

for i:=1 to n do begin st:=st*x; f:=f*i; s:=s+st/f;

end;


stroka:='f('+FloatToStr(x)+')= '+FloatToStrF(s,ffFixed,7,3);

Memo1.Lines.Add(stroka); x:=x+h;

until x>x2; end;

12.  Запустить проект на компиляцию и выполнение.


13.     Задать  значения  для


N = 10 ,


x1 = 1,


x2 = 10,


h = 0.5


и  нажать  кнопку  Счет.


 

Результат выполнения программы показан на рис. 3.1:

 

 


 

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

 

Контрольный пример 3.2

Корень       некоторого       уравнения       находится       последовательными

 


приближениями  по  формуле


xn+1 =


.  Написать  программу  для


 

нахождения такого приближения корня, при котором разность по модулю между двумя соседними приближениями не превосходит 10-6 , а начальное приближение x0 = 1.92 . Вывести на экран корень уравнения до 5-го знака и число итераций.

Решение.

1.  Открыть новый проект Delphi: File – New Application.


2.      Установить  с  помощью  Object  Inspector  следующие  свойства     компонента

Form1:

Form1.Height = 323

Form1.Wight = 268 Form1.BorderIcons

biMaximize = false Form1BorderStyle = bsSingle Form1.Position = poScreenCenter

Form1.Caption = ‘ Последовательные приближения’.

3.     Расположить на форме следующие компоненты: четыре компонента Edit, четыре компонента Label, один компонент Button. Установить с помощью Object Inspector для них следующие свойства:

Label1.Caption = 'начальное приближение' Label2.Caption = 'решение' Label3.Caption = 'количество итераций'

Label3.Caption  =  'Проверка:  подстановка  в  исходное


уравнение'


Edit1.Text = '' Edit2.Text = '' Edit3.Text = '' Edit4.Text = ''

Button1.Caption = 'Решение'


4.  Для решения задачи запишем обработчик событий Button1.Click, щелкнув на компоненте Button1 (кнопка Решение) два раза левой кнопкой мыши.

Текст соответствующей процедуры имеет вид:

procedure TForm1.Button1Click(Sender: TObject); var x0,x1,eps,f:extended; n:integer;

begin

x0:=StrToFloat(Edit1.Text); eps:=1E-6;

x1:=exp(ln(29+3*sqr(x0)+8*x0)*(1/4)); n:=1;

while abs(x0-x1)>eps do begin

x0:=x1;

x1:=exp(ln(29+3*sqr(x0)+8*x0)*(1/4)); n:=n+1;

end; Edit2.Text:=FloatToStrF(x1,fffixed,10,4); Edit3.Text:=IntToStr(n-1); f:=sqr(sqr(x1))-3*sqr(x1)-8*x1-29; Edit4.Text:=FloatToStrF(f,fffixed,10,6);


end;

Переменные,   которые   необходимы   для   решения   задачи,   описаны   в соответствующем разделе процедуры TForm1.Button1Click.

5.  Запустить проект на компиляцию и выполнение.

6.  Задать значение начального приближения и нажать кнопку Решение. Результат выполнения программы показан на рис. 3.2.


 

 

ий   ор

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

 

3.2.     Содержание отчета

 

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

3.3.     Контрольные вопросы

 

1.  Каково назначение операторов повторений (циклов)?

2.  В чем различия операторов повтора while и repeat?

3.   В каких случаях предпочтительнее использовать для организации циклов оператор повтора for? Что записывается в заголовке этого оператора?


4.    Какие ограничения накладываются на использование параметра цикла в цикле for?

5.  Что такое вложенные циклы?  Какие дополнительные условия необходимо

соблюдать при организации вложенных циклов?

6.  Перечислите основные свойства компонента Memo.

7.  Как получить доступ к заданной строке компоненте Memo?

8.  Что такое многострочный редактор?