К. Йенсен, Н. Вирт - Паскаль - Руководство для пользователя (1109480), страница 7
Текст из файла (страница 7)
она не входит в оператор. Точные правила, регламентирующие употребление точки с запятой, нашли отражение в синтаксисе, приведенном в приложении 4. Если кто-либо в примере поставит точку с запятой после второго оператора в программе 4.1. то будет считаться, что между этим знаком и словом епе) находится пустой оператор (не предусматривающий каких-либо действий) . Нег ничего страшного в появлении в этом месте пустого оператора. Однако неправильное употребление точки с запятой может приводить и к неприятностям (см. пример с условным оператором из равд.
4.5). 4.4. ОПЕРАТОРЫ ПОВТОРЕНИЯ (1(ИКЛЫ) Операторы повторения (циклы) предусматривают выполнение некоторых операторов несколько раз. Если число повторений из- 4. Концепция действия 4Б вестно заранее (до начала повторений), то в такой ситуации лучше воспользоваться оператором цикла с параметром. В других же случаях следует использовать операторы цикла с предусловием и с постусловием. 4.4.1.
Оператор цикла с предуслоаием Такой оператор строится по следующей схеме: Выражение нане Оператор Р и с. 4.10. Синтаксическая диаграмма для Цикла с прсдусяовием Оператор, идущий за словом г!о, выполняется нуль или более раз. Выражение, управляющее повторениями, должно быть логического типа. Это выражение вычисляется до выполнения указанного оператора.
Если оно дает значение 1гне, оператор выполняется, в противном случае выполнение всего оператора цикла с предусловием заканчивается. Поскольку выражение вычисляется при каждой итерации, его следует делать насколько возможно простым. Программа 4.3 возводит вегцественное значение Х в степень У, где г' — неотрицательное целое. Более простую и, очевидно, верную версию можно получить, убрав внутренний оператор цикла с предусловием: в этом случае переменная Кезп!1 получается путем г'-кратного умножения Х.
Обратите внимание на инвариант цикла: Кезн!1«роцег(Вазе,Ехропеп1) = роцег!Х, У). Внутренний оператор цикла с предусловием оставляет Кезп!1 и роцгег!Вазе,Ехропеп1) инвариантными и, очевидно, улучшает «производительность» алгоритма. 4.4«к Оператор цикла с постуслоиием Цикл с постусловием строится по такой схеме: —— ~Т р сссн Выражение Р и с. 4.11.
Сиитаксическая диаграмма для Цикла с посгусяовисм чб Руководство для полаэаеителя ргоВгае ИЬ11еЕхаер1е(1проС, Оаврас); ( Программа 4.2 — Вычисление М-й частичной суммы гармонического ряда Н (Ь)) =1+1/2+1/3+,, + 1/Й. Для итерации используется цикл с предусловием.) таг И: 1пСеКег; Н: Кеа!; Ье0(п Кеаа(1проС,И); Иг(ве(ОавраС,И); Н:= 0; ип(1е И > О бо Ье0)п Н:= Н + 1/И; И:= И вЂ” 1 епд; Иг1Се1п(0авраС,Н) епо . И Дает в качестве результатов: 10 2.928968Е+00 ргоВгае Ехропепв(ав(оп(1праС, ОоераЦ; ( Программа 4.3 — Вычисление рочаег (Х, У) — Х в степени У ) ааг Ехрапепв, у: 1пвеВег; Вазе, Кева1С, Х: Кеа1; Ье81п Кеад(1проС,Х,у); Иг)ве1п(ОоораС,Х,у); Кева1С := 1; Вазе := Х; Ехропепо := У; нп)1е Ехропепв > 0 Оо Ье8)п ( Кево1С>ракет(Вава,ЕхрапепС) = ранее(Х,у),ЕхропепС > 0 ) нЬ11е поС Обо(ЕхропепС) Оо Ье8(п Ехропепо := Ехрапепв 01у 2; Вазе := ЗОг(Вазе) епа; Ехропепо := Ехропепе — 1; Кева1С := Нева!С ' Вазе епо; 4.
Концепция беаогвпя 47 Иг(ее1п(Оиерии,йеьи1$) ( йези1ь = ронег(Х,У) ) епа Дает в качестве результатгк 2.000000Е+00 1.280000Е+02 Последовательность операторов между словами гереа( и цпЫ! выполняется по крайней мере один раз. После каждого выполнения последовательности операторов вычисляется логическое выражение. Повторения продолжаются до тех пор, пока выраткение не дает значение (гие.
Так как выражение вычисляется при каждой итерации, его следует делать насколько возможно простым. ргойгаа йереаФЕхаар1е(1при(,Оиариф); (Программа 4,4 — Вычисление (ч-й частичной суммы гармонического ряда Н (И) = 1 + 1(2+ 1/3+... 1/(ч. для итерации используется цикл с постусповием.) иаг й: 1пеейег; Н: йеа1; Ьей1п йеаб(1приь,й); Нг(бе(Оиориь,й); Н:= 0; гереаб Н:= Н + 1/й; й := й — 1 ипаг1 й = О; Иг(бе1п(Оиьриб,й) епд Дает в качестве результата: 10 2.928908Е+00 Приведенная выше программа правильно выполняется при )1» О.
А что произойдет прн И (=О? Версия же этой программы с оператором цикла с предусловием верна для любых )Ч), включая И=О. Обратите внимание„что представляет собой последовательность операторов, выполняемых в операторе цикла с постусловнем: 48 Руководство для пользователя пара скобок Ьеи(п и епб здесь не нужна, однако использование их не будет сшибкой. 4.4.3.
Оператор цикла с параметром Такой оператор предусматривает повторное выполнение некоторого оператора с одновременным изменением по правилу прогрессии значения, присваиваемого упраелянтщей ~еременной (параметру) этого цикла. Оператор цикла с параметром строится по следу)ошей схеме: Рис. 4.12. Синтаксическая диаграмма для Цикла с падиметроя ргоргаа ГогЕкаар1е(1про(,Оо(рпФ); ( Программа 4.5 — Вычиспение Ы и частичной суммы гармонического ряда Н (К) = 1 + 1/2+ 1/3+... 1/И.
Дпя итерации идяопьзуется цикл с шагале) каг 1, Й: 1п(ейег; Н: Неа1; Ье9(п Кеад(1прпЬ, И); Иг(ое(Оо(раЬ, Н); Н := 0; (ог 1 := и поипЬо 1 Оо Н:= Н+ 1/1; ИгтЬе1п(Оп(рой,Н) епо . Дает в качестве резупьтатов: 10 2.923968Еь00 Е Концепция действия 49 сопзс Ера(1оп = 1е-7; наг ( радианы); (угол в квадратей (элементы ряда ); ( очередной элемент ряда ); (число вычисляемых косинусов) (порядок очередного элемента) Апа1е.
йеа1 АБцоагед: Аеа1 Бег(ез: Реа1 Тегв: хеа1 1, а; Тпсеаег Роиег: 1псеаег оеетп Аеао1п(1прос, в); 1ог 1:= 1 Со И до Ьее)п реад!п(1прос, Апв1е); Тегв:= 1; Роиег:= 0; Бег(еа:= 1; АБцоагед := Бцг(хпа1е); ип( 1е Аоз(геев) > Ера(1оп ' АЬа(Бег(еа) до Ьеа1п Роиег := Роиег + 2; Тегв:= -Тегв ' Аацоагед / (Роиег ' (Роиег — 1)); Бег(ез:= Бег(еа + Тегв Параметр цикла, идущий следом за словом 1ог, должен относиться к ординальному типу и быть описанным в том же блоке, где появляется сам оператор цикла. Начальное и конечное значения должны относиться к ординальному типу, совместимому с параметром цикла.
В операторе-компоненте цикла параметр цикла изменяться ие должен, т. е. он не должен фигурировать в,качестве переменной в левой части присваивания, в обращениях к процедурам Кеес( или Кеас)!и, не должен использоваться как параметр дру; -гого оператора цикла с параметром внутри данного оператора цикла с параметром либо внутри процедуры или фунКции, описанных в данном блоке. Начальное и конечное значения вычисляются лишь единожды. Если при спецификации 1о (с)отуп1о) начальное значение больше (меньше) конечного значения, то цикл не выполняется. Если при выполнении оператора-компоненты невозможно присвоить начальное или конечное значение параметру цикла, то такая ситуация считается ошибкой.
При нормальном' выходе из оператора цикла с параметром управляющая переменная остается неопределенной. ргоагав Соа(пе(1прос,босроо); ( Программа 4. — Вычисление соа (Х) с использованием разложения: соа(Х) = 1 — ацг(Х)/(2'1) + ацг(Х)'ьцг(Х)/(4"Зе2е1) — ... ) 50 Рр«оеодстео для иольэоопг«зл епд; Иг(се1п(ОосроС, Ап81е, Зег(ез, Ронег 4(т 2 ( = число элементов )) епд епд . Дает в качестве результата: 1.534622Е-01 9.882478Е-01 3 З.ЗЗЗЗЗЗЕ-01 9.449569Е-01 4 5.0000ООЕ-01 8.775826Е-01 5 1.000000Е+00 5.403023Е-О1 6 3.14159ЗЕ+00-1.000000Е+ОО 10 Приведенная ниже программа «рисует» график функции ((Х), дающей вещественный результат. Считается, что ось Х идет вертикально и на месте соответствующих координат печатается звездочка. Положение звездочки определяется путем вычисления 'т'= 1(Х), умножения на некоторый масштабный множитель, округления до следующего целого значения и добавления некоторой константы.
Прежде чем напечатать звездочку, в соответствии с. полученным результатом «печатается» некоторое количество пробелов. ргойгаа Огзрп)(ОосроС); (Программа 4.7 — Формирование графического представления Функции: 1(Х) = ехр(-Х) ' з1п(2"Р(«Х). ) сопзС А ХЫпез = 16 (число строк на единицу абсциссы Бса1е = 32 ( число символов на единицу ординаты ); 2егоу = 34 ( положениеоси Х1; ХС(а(С = 32 (размер графика в строках). тат Ое1Са: йеа1 (приращение вдоль абсциссы); ТноРЫ йез1 ( 2 ' Р1 =- 8 "АгсТап(1.0) ); Х, У: йеа1;' Ро1пС: 1псейег; УРоз(С1оп: 1пСейег; Ьей(п ( инициация констант: ) Ое!Са := 1 ! Х1(пез; ТноР1 := 8 ' АгсТап(1.0); (ог Ро1пС := 0 Со ХЕгд(С до Ьейхп Х:= Ое1Са ' Ро(пС; У := Ехр(-Х) ' 6(п(ТноР1 ' Х); 4. Концепция действия о! УРозтС(оп := Ооопб(Зса1е ' у) + 7егоу; гереаС Иг1Се(ОоСроС, ' '); уРоз(С(оп := уРоз(С1оп — 1 опС11 уРоз1С!оп = О; Иг(Се1п(ОоСроС, '"') епо ел 0.
Дает в качестве результата: ду Руководства для пользователя ргойгаи Боииьпйтегиь(Ооороь); ( Программа 4.8 — Вычисление ряда 1 — 1/2 + 1/3 — . . + 1/9999 — 1/10000 четырьмя способами: ц последовательно слева направо, 2) слева направо, все положит.. затем — отриц. и вычитание, 3) последовательно справа налево. 4) справа налево, все полонит., затем — отриц. и вычитание.
) и таг Бег)ее!К, ( сумма, все слева направо 1 БоисйРоьТегиь, ( сумма положит..слева направо) БпиЬййей)егиь, (сумма отриц.,слева направо) Бегтеьй1, ( сумма, все справа налево) БаийсРоь1егиь, ( сумма положит.,справа налево) БоийсйейТегиь, ( сумма отриц..справа налево ) Роьтегисй, ( след. положит.,слева направо) йейтегиЬК, ( след. отрицтслева направо) РоьТегиК1, (след. попожиттсправа налево ) Кей)егийЬ: йеа1 ( след. положит.,справа налево); РаггьОТТегиги Тпоейег ( счетчик пар членов 1; Ьей)п Бег)еь!К:= 0; Бои!КРоьТегиь:= О; Беггеьй! := 0; БоийсРоьТегиь:= 0; Тог Ра)гьОТТегиь:= 1 Ьо 5000 Оо Ьей)п Роьтеги!К := 1 / (2 ' Ра)гьОТТегиь — 1); ИейТегиЬК:= 1 / (2 ' Ра)гьОТТегиь); РоьТегий! := 1 / (10001 — 2 ' Ра!гьОТТегиь); Пей)егий! := 1 / (10002 — 2 ' Ра1гь011егиь); Бег)ее!К:= Бег)ее!К + РоьТегисй — йей1егисй, БоисКРоьТегиь;= БоисКРоьТегиь + Роь)его!К; БоисКИейТегиь:= Бпи!КйейТагиь + йейТеги!К; Бег)еьй1:= Бег)еьй! + РоьТегий! — КейтегийЬ; БоийЬРоьТегиь:= Боий!РоьТегиь + РоьТегий1; БоийЬйейтегнь:= Боий!КейТегиь + йейТегийЬ; епо; БоиЬййейтегиь:= 0; Боийсйейтегиь:= 0; В качестве последнего примера рассмотрим такую программу: 4.
Концепция действия 55 Иг(те1п(Оитрие, зег(езЕК); Нг1(е1п(Ои'ьрпь, Зив(КРоз?егвз — Япв(ККе9?егвз); Нг(ее1п(0итрис, зег(езК!); Иг1ье1п(Оитрис, ЗивКЕРоаТегвз — ЗивКЕКеК?егвз) епд Дает в качестве результатов: 6.930919Е-01 6.931014Е-01 6.9309?ОЕ-01 6.9309?1Е-01 Почему четыре «идентичные» суммы так отличаются одна от другой? 4.6. ВЫБИРАЮЩИЕ ОПЕРАТОРЫ Выбирающие операторы предназначены для выделения из составляющих их операторов-компонент одного-единственного оператора, который и выполняется. В Паскале предусмотрены два вида выбирающих операторов: условные операторы и операторы варианта.