Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Sitkin_Informatika_Programmirovanie_v_DELPHI.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
600.56 Кб
Скачать

Операторцикласпараметром(сосчётчиком)

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

fori:=a1toa2doоператорS

гдеfor,to,doслужебные слова;iпараметр (счётчик);a1иa2начальное и конечное значение счётчика;операторSтело цикла.Счётчик последовательно принимает значения отa1доa2с шагомплюс один, причёмa1должно быть меньше или равноa2. Реализуемаясхемапредставленанарис.7.4а.

Возможендругойвидсчётногооператора

fori:=a1downtoa2doоператорS

здесь счётчик последовательно принимает значения отa1доa2с ша-гом минус один, причёмa1должно быть больше или равноa2. Реали-зуемаясхемапредставленанарис.7.4б.

В обоих случаях значенияi,a1иa2должны быть порядковоготипа.ОператорSвыполняетсяодинраздлякаждогозначенияi.

а б в

Рис.7.4

Иногдаработусчётногооператоралюбоговиданасхемеизоб-ражают упрощённо(рис.7.4в).

Пример7.2

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

S10ln(kx)lnxln(2x)ln(3x)...ln(10x)

k1 k2

4 9 100 .

Формуладлявычисленияk-гослагаемого

даннойсуммы

a ln(kx).Блок-схемапредлага-

k 2

k

Рис.7.5

емогоалгоритмапредставленанарис.7.5.Верхнийпределсуммированиязаданкаккон-стантаn=10. После вводаxзадаются начальныезначения суммыS=0 и номера слагаемогоk=1,которое в ходе циклического процесса должноизменяться в диапазоне 1..n. В теле цикла длякаждого из них вычисляется значение текущего(k-го)слагаемого,котороеприбавляетсякнакапливаемой в цикле частичной суммеS. Приэтом значенияaиSпредыдущей итерации «за-тираются». После этого, увеличивkна единицу,переходимкномеруследующегослагаемого,возвращаемся к началу цикла, проверяя, не пре-высиллиномерслагаемогочислоn.Еслинепревысил, то циклический процесс продолжает-ся, в противном случае он заканчивается, и вы-водитсяитоговаясуммаnслагаемых.

Числоповторенийизвестнозаранее,искаждойитерациейзна-чениеkнадо увеличивать на единицуиспользуем операторfor.procedureTForm1.Button1Click(Sender: TObject);

constn=10;

vara,x,S:real;

k:byte;//счётчиксчётногооператора цикла,долженбытьцелоготипа

begin

x:=StrToFloat(Edit1.Text);//приx0ошибкавыполнения

S:=0; //нач. знач. суммы, чтобы было к чему прибавлять на первой итерацииfork:=1tondo//нач. (и конеч.) знач. номера слагаемого устанавл-ся вforbegin //началотелацикла

a:=ln(x*k)/sqr(k);//вычислениетекущегослагаемогонаk-ойитерации

S:=S+a; //добавление слагаемогоk-ой итерации к накапливаемой суммеend;//конец тела цикла; операторforсам увеличитkна единицуLabel2.Caption:='S='+FloatToStr(S);//выводнакопленной суммы

end;//конецпроцедуры

Пример7.3

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

10 xk

x x2 x3

x10

k1

S(sin(2x))k1

sin2

(2x)

sin3

(2x)

sin4

(2x)

...

sin

11(2x).

Формуладлявычисленияk-гослагаемогоданнойсуммыимеетвид

xk

ak(sin(2x))k1,впринципевозможеналгоритм,идентичныйреше-

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

ak

ak1

xk

(sin(2x))k1

xk1

:(sin(2x))k

xk(sin(2x))k

xk1(sin(2x))k1

x ,

sin(2x)

откуда

aka

x

k1sin(2x)

.Такимобразомкаждоеслагаемоесуммы,

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

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

Первоеслагаемоевычислимпоформуле

a1

x

sin2(2x)

;S1

=a1

  • этизначения(онисоот-

Рис.7.6

ветствуютk=1) нужно будет задать до входавцикл для начала счёта по ним. Номер слагаемогоkв ходе циклического процесса должен изме-няться в диапазоне 2..n. С двух, т.к. дляk=1 зна-чения слагаемогоaи суммыSбудут определеныуже до входа в цикл. В теле цикла будет опреде-ляться текущее слагаемое через слагаемое, вы-численное на предыдущей итерации, «затирая»его, и добавляться к сумме, найденной также напредыдущей итерации, получая новое, текущее,значение суммы. Затем осуществляется переходк следующему номеру слагаемого. Когдаkпре-выситn,циклзавершится,будетвыведенанакопленнаясумма(рис.7.6).

procedureTForm1.Button1Click(Sender:TObject);

constn=10;

vara,x,S:real;

k:byte;//счётчиксчётного оператора цикла,долженбытьцелоготипа

begin

x:=StrToFloat(Edit1.Text);//при x = 0 будет ошибка выполненияa:=x/sqr(sin(2*x)); S:=a; //вычисление начальных значений до тела циклаfork:=2tondo//нач. (и конеч.) знач. номера слагаемого устанавл-ся вforbegin//начало телацикла

a:=a*x/sin(2*x);//выч-етек-гослаг.черезсамогосебяпредыдущ.итерации

S:=S+a; //добавление слагаемогоk-ой итерации к накапливаемой суммеend;//конец тела цикла; операторforсам увеличитkна единицуLabel2.Caption:='S='+FloatToStr(S);//выводнакопленнойсуммыend;//конец процедуры