- •Д.С.Ситкин
- •Информатика.
- •Программированиевdelphi
- •Лабораторныйпрактикум
- •Содержание
- •Введение
- •Основныепонятияпрограммирования
- •Этапыпрограммирования
- •Средаdelphi.Созданиепростейшегопроекта
- •Формаиеёсвойства
- •Компонентыформыиихсвойства
- •КомпонентLabeledEdit
- •Событиеипроцедураобработкисобытия
- •Пример1.1
- •Компиляцияизапускпроектанаисполнение
- •Структураисохранениепроекта
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Линейныйалгоритм
- •Типыданных
- •Константыипеременные
- •Арифметическиеоперации
- •Правилазаписитиповыхдействий
- •Структурапроцедурыобработкисобытия
- •Пример2.1
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Подпрограммы
- •Классификацияиструктураподпрограмм
- •Механизмработыподпрограммыиобменапараметрами
- •Пример3.1
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Структурамодуля
- •Созданиеиподключениемодуля
- •Пример4.1
- •Условныйоператор.Неполнаяформа
- •Условныйоператор.Полнаяформа
- •IfусловиеthenоператорS1elseоператорS2
- •Пример5.1
- •Пример5.2
- •Операторвыбора
- •Пример5.3
- •Содержаниеотчёта
- •Контрольныевопросы
- •Контрольсинтаксисавводимыхданных
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Алгоритмыповторений
- •Операторцикласпредварительнымусловием
- •Пример7.1
- •Операторцикласпараметром(сосчётчиком)
- •Пример7.2
- •Пример7.3
- •Операторцикласпоследующимусловием
- •Пример7.4
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Массивы
- •Объявлениемассива
- •Обработкамассивов
- •Пример8.1
- •Динамическиемассивы
- •Подпрограммасоткрытымпараметром-массивом
- •Пример8.2
- •Целесообразностьвыделенияпамятиподмассивы
- •Контрольсинтаксисаэлементовмассива
- •Задание
- •Обработкамногомерныхмассивов
- •Пример9.1
- •КомпонентStringGrid
- •Пример9.2
- •Сортировкамассивов
- •Пример9.3
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Внешниефайлы
- •Физическиеилогическиефайлы
- •Классификациялогическихфайлов
- •Процедурыифункцииобработкифайлов
- •Пример 10.1
- •КомпонентыOpenDialog иSaveDialog
- •Пример 10.2
- •Пример 10.3
- •Задание
- •Содержаниеотчёта
- •Контрольныевопросы
- •Олабораторнойработе
- •Информатика. Программированиев delphi
Операторцикласпараметром(сосчётчиком)
Счётный оператор цикла используется в случаях, когда числоповторенийизвестнозаранее.Он имеетвид
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);//приx0ошибкавыполнения
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;//конец процедуры
