Text
                    Конфигурация и размеры блоков, а также порядок по-
строения схем определяются ГОСТ 19.002—80 и
ГОСТ 19.003—80.
На этапе 4 составляется программа иа одном из языков
программирования. При описании программ необходимо ис-
пользовать характерные приемы программирования и учиты-
вать специфику конкретного языка. В качестве языков про-
граммирования выбраны языки БЕЙСИК, ФОРТРАН,
ПАСКАЛЬ, которые наиболее распространены в машинах
ЕС, СМ н ПЭВМ.
Этапы алгоритмизации и программирования являются
наиболее трудоемкими, поэтому нм уделяется большое
внимание.
При подготовке к лабораторной работе студент разраба-
тывает алгоритм решения задачи н пишет программу на
одном нз языков программирования.
В процессе выполнения лабораторных работ студент го-
товит исходные данные, вводит программу и исходные дан-
ные. При работе в диалоговом режиме ввод программы и ис-
ходных данных осуществляется с клавиатуры дисплея, а при
работе в пакетном режиме — с лерфоиосителей (перфокарты,
перфоленты).
Отладка программ состоит в обнаружении и исправлении
ошибок, допущенных иа всех этапах подготовки задач к ре-
шению иа ЭВМ. Синтаксические ошибки обнаруживаются
транслятором, который выдает сообщение, указывающее
место и тип ошибки. Обнаружение семантических ошибок
осуществляется на этапе тестирования программы, в котором
провёряется правильность выполнения программы на упро-
щенном варианте исходных данных или с помощью контроль-
ных точек.
Задание при обработке на ЭВМ проходит ряд шаге®:
трансляцию, редактирование (компоновку) и выполнение.
Обработка результатов решения задачи осуществляется
либо с помошыо ЭВМ (построение таблиц, графиков, гисто-
грамм), либо вручную. Выводимые результаты оформляются
в виде, удобном для восприятия человеком.

ГЛАВА I РАЗ РАБОТКА АЛ ГО РИТМА РЕШЕНИЯ ЗАДАЧИ Различают алгоритмы линейной, разветвляющейся и цикличе- ской структуры, а также алгоритмы со структурой вложенных циклов. Алгоритмы решения сложных задач могут включать все перечислен- ные структуры, которые используются для реализации отдельных участков общего алгоритма. 1.1. АЛГОРИТМЫ ЛИНЕЙНОЙ СТРУКТУРЫ Алгоритм линейной структуры — алгоритм, в котором блоки выполняются последовательно друг за другом, в порядке, заданном схемой. Такой порядок выполнения называется естественным. Пример 1.1. Вычислить высоты треугольника со сторо- нами а, Ь, с, используя формулы: У₽(р—а)(р —Ь)(р —с); Л,. Ур(р-а)(р —6)(р —с); л - ~ Vp (р—“)(р—*)(р—О. । и- р=(а+Ь+с)/2. Для решения любой нетривиальной задачи существует hi । kojh.ko алгоритмов, приводящих к получению результата. 111 возможных алгоритмов следует выбирать наилучший по iiviioi орому критерию. Чаще асего в качестве критерия вы- бнрлегся либо оценка точности решения задачи, либо за- ip itы времени на ее решение, либо некоторый интегральный крщсрий, включающий оценки точности н затраты времени. При решении данной задачи для исключения повторений । лгду«‘Т вычислять высоты не по приведенным выше формулам нгн< срсдственио, а используя промежуточную переменную ' 2 \4>(р-с)(р—ь)(р—с), пи ы hu — t/a, hb—t/b, hc=t/c. 7
Конфигурация и размеры блоков, а также порядок по- строения схем определяются ГОСТ 19.002—80 и ГОСТ 19.003—80. На этапе 4 составляется программа иа одном из языкоа программирования. При описании программ необходимо ис- пользовать характерные приемы программирования и учиты- вать специфику конкретного языка. В качестве языков про- граммирования выбраны языки БЕЙСИК, ФОРТРАН, ПАСКАЛЬ, которые наиболее распространены в машинах ЕС, СМ и ПЭВМ. Этапы алгоритмизации и программирования являются наиболее трудоемкими, поэтому им уделяется большое внимание. При подготовке к лабораторной работе студент разраба- тывает алгоритм решения задачи и пишет программу иа одном из языков программирования. В процессе выполнения лабораторвых работ студент го- товит исходные данные, вводит программу и исходные дан- ные. При работе в диалоговом режиме ввод программы и ис- ходных данных осуществляется с клавиатуры дисплея, а при работе в пакетном режиме — с перфоиосителей (перфокарты, перфоленты). Отладка программ состоит в обнаружении и исправлении ошибок, допущенных иа всех этапах подготовки задач к ре- шению на ЭВМ. Синтаксические ошибки обнаруживаются транслятором, который выдает сообщение, указывающее место и тип ошибки. Обнаружение семантических ошибок осуществляется иа этапе тестирования программы, в котором проверяется правильность выполнения программы иа упро- щенном варианте исходных данных или с помощью контроль- ных точек. Задание при обработке на ЭВМ проходит ряд шагов: трансляцию, редактирование (компоновку) и выполнение. Обработка результатов решения задачи осуществляется либо с помощью ЭВМ (построение таблиц, графиков, гисто- грамм), либо вручную. Выводимые результаты оформляются в виде, удобном для восприятия человеком.
ГЛАВА I РАЗРАБОТКА АЛГОРИТМА РЕШЕНИЯ ЗАДАЧИ Различают алгоритмы линейной, разветвляющейся и цикличе- ской структуры, а также алгоритмы со структурой вложенных циклоп. Алгоритмы решения сложных задач могут включать все перечислен- ные структуры, которые используются для реализации отдельных участков общего алгоритма. 1.1. АЛГОРИТМЫ ЛИНЕЙНОЙ СТРУКТУРЫ Алгоритм линейной структуры — алгоритм, в котором блоки выполняются последовательно друг за другом, в порядке, заданном схемой. Такой порядок выполнения называется естественным. Пример 1.1. Вычислить высоты треугольника со сторо- нами а, Ь, с, используя формулы: =— (р—с) (р — Ь) (р—с); й» =у (Р - с) (Р — «9 (Р - с); hr=у -\1р(Р—а) (р — Ь) (р — с), |де р=(а-|-Ь-|-с)/2. Для решения любой нетривиальной задачи существует несколько алгоритмов, приводящих к получению результата. Из возможных алгоритмов следует выбирать наилучшнй по некоторому критерию. Чаще всего в качестве критерия вы- бирается либо оценка точности решения задачи, либо за- каты времени иа ее решение, либо некоторый интегральный критерий, включающий оценки точности и затраты времени. При решении данной задачи для исключения повторений следует вычислять высоты ие по приведенным аыше формулам непосредственно, а используя промежуточную переменную I=2 — а) (р — Ь) (р—с), югда ha—tfa. ht = t/b, hc=t/c. 7
При этом схема алгоритма решения имеет вид, пред- ставленный на рнс. 1.1. Алгоритм, рассмотренный в примере 1.1, является основой для разработки алгоритмов решения задач 1.1—1.9. Задачи для решения 1.1. Вычислить площадь треугольника со сторонами а, Ь, с по формуле Герона: S = д/р(р—И)(р—£-)(р—с). где р=(о+Ь+с)/2. 1.2. Вычислить для усеченного конуса плошадь поверхности s = я (R + г) I4-nRz 4- № и объем V=л (/?’ 4- г2 Rr) h/3. i .3. Вычислить координаты центра тяжес- ти трех материальных точек с массами /Иц т-ь тз и координатами (х», уi), (х2, t/2), (х3, 4/з) по формулам: _ /гцх, 4- tn2x2 4- m3x3 с т{ 4-/n24-/n3 _ Шуу^т^ + т^ Ус т,+т2 + т3 1.4. Вычислить координаты точки, деля- щей отрезок [aiG2] в отношении пг.пг по фор- мулам: х=(х, +т*2)/(1 +т); р=(й +w2)/(l +т). где у=Л|/пг; Xi, yi — координаты точки щ; Х2, у2 — координаты точки й2- 1.5. Материальная точка совершает пря- молинейное движение по закону «(/)=*= 2/4~ 4-6Z2—f3, где s—путь; t—время. Найти Рис 1 1 наибольшее значение скорости движения точ- ки. Скорость материальной точки v (t)= =ds(f)/dt=2 4-12/—З/2. Приравнивая производную скорости dv(t)/dt к нулю, найдем значение I, при котором скорость достигает максиму- ма, а подставляя в выражение для v (/) найденное /, получим значение максимальной скорости. 1.6. Определить, за какое время t при электролизе медно- го купороса на электроде выделится масса меди т при про- хождении тока /ъ если известно, что при прохождении тока /,4-/2 масса меди т выделяется на электроде за время i\. 8
Рис. 1.2 Если одну половину этой массы т/2 получить при прохождении гока /|, а другую — при прохожде- нии тока /2, то вся масса выделится за время tz- Для /| и /2 имеем ** 2М, + 2Ы2 ’ Л(/,+/2): Требуется найти t—m/(kh). 1.7. Определить площадь гео- метрических фигур, представлен- ных на рис. 1.2, а—в. 1.8. Определить объем порш- ня, представляющего собой цилиндр с конической и цилиндрической выемками и тремя канавками (рис. 1.3). 1.9. Определить сопротивле- ния в электрической цепи (рнс. 1.4, а, б): Рис 1.3 Рис. 1.4 9
а) при преобразовании звезды в треугольник расчетные соотиошеиня: р __ R . р ___р _______ R • P:'~r7' R — R4R5+R&R& + RqR^ б) при преобразовании треугольника в звезду. „ __Я|/?2 г, _^2^3 г, __*3*1 «4----р-' «б----р-> Ъ—р-' R—R{-\- R2-i~ R3. 1.2. АЛГОРИТМЫ РАЗВЕТВЛЯЮЩЕЙСЯ СТРУКТУРЫ На практике редко удается представить решение задачи в виде алгоритма линейной структуры. Часто в зависимости от каких-либо промежуточных результатов вычисление осуществляется либо по од- ним, либо по другим формулам, т. е. в зависимости от выполнения некоторого логического условия вычислительный процесс осуще- ствляется по одной или другой ветви. Алгоритм такого вычислительного процесса называется алгорит- мом разветвляющейся структуры. В общем случае число ветвей в алгоритме разветвляющейся структуры не обязательно равно двум. Пример 1.2. Вычислить значения функции г—£ /у, где у—si п (пх) + 0,5. Казалось бы, что решение этой задачи описывает алго- ритм линейной структуры. Одиако для удовлетворения свойст- ва массовости и результативности алгоритма необходимо, чтобы при любых исходных данных был получен результат или сообщение о том, что задача не может быть решена при за- данных данных. Действительно, если у=0, то задача не может быть решена, так как деление на нуль невозможно. Поэтому в алгоритме необходимо предусмотреть такое условие и вы- дать в качестве результата информацию о том, что у=0. Таким образом, вычислительный процесс имеет две вет- ви. В одной ветви при у=£0 необходимо вычислить и отпеча- тать значение переменной у, в другой — вывести на печать информацию, что у—0. Такой вычислительный процесс мож- но описать следующей условной формулой: 2=_| Вычислить z=x?/у, если j/=#0; [ Вывести 't/=0', если у=0. 10
Схема алгоритма решения представлена на рис. 1.5, где после условного блока 4 располагаются блоки сначала одной ветви (блоки 5, 6), а затем второй (блок 7). Так как после выполнения действий, указанных в блоках первой ветви, нет необходимости выполнять действия, указанные во второй ветви, сразу осущесталяется переход к концу алгоритма (к блоку 8). В алгоритме дважды нарушается естественный порядок выполнения блоков: 1) при проверке условия у—0 (условный переход); 2) после выполнения действий, указанных в блоках пер- вой ветаи (безусловный переход). Пример 1.3. Вычислить {sin(x), если х^а\ cos (х), если a<Zx<Zb- tg(x), если x^b. Из математической формулировки задачи видно, что вычислительный процесс имеет три ветви. С помощью услов- ного блока проверяется выполнение только одного условия, по которому выбирается выражение для реализации одной ветви. Поэтому для определения того, по какой из двух остав- шихся ветвей должен идти вычислительный процесс после невыполнения первого условия, необходимо использовать еще один условный блок. Схема алгоритма представлена иа рис. 1.6. Первый ус- ловный блок 3 проверяет условие x^Za и в случае его выпол- нения осуществляет переход к блоку 4, вычисляющему z= sin (х). Если х>а, то блок 5 проверяет условие х^Ь. Если тго условие выполняется, то осуществляется переход к блоку 6', вычисляющему z=tg(x). В противном случае х находится н интервале между а и b и происходит переход к блоку 7, вычисляющему z = cos(x). После вычисления по любой из формул осуществляется переход в общую ветвь к блоку печати. Пример 1.4. Упорядочить три числа а, Ь, с по возраста- нию таким образом, чтобы переменной а соответствовало амое маленькое число, b — среднее, ас — наибольшее. Для решения задачи последовательно сравниваются зна- чения переменных а^Ь, затем а^с и далее Ь^с. Если какое-либо условие выполняется, то сразу осуществляется переход к следующему сравнению. В противном случае сиача- 11 осуществляется перестановка значений соответствующих переменных, а затем переход к следующему сравнению. Для перестановки значений даух переменных, например а и Ь, Н
используется вспомогательная переменная h. Перестановка осуществляется в такой последовательности: h=a, a—b, Ь — =.h. Схема алгоритма представлена на рис. 1.7. Алгоритмы, рассмотренные в примерах 1.2— 1.4, являются основой для разработки алгоритмов решения задач 1.10—1.22. Рис. 1.6 рис. 1.7 Рис. 1.5 12
и, следовательно, необходимо вычислить е и f по фор- мулам: б) Вычислить корни квадратного уравнения, учитывая, но любой из коэффициентов а, Ь, с может быть равен нулю. 1.11. Вычислить значения функции — 1, если х<0; О, если х=0; 4- 1, если х>0; {!п х, если х^1; 1, если 1 >х> — 1; е*. если х<^ — 1. 1.12. Вычислить значение функции, заданной графически (рис 1.8, а, б, в) по значению аргумента х. l) у Рис. 1.8 У К уг-К}-х* / IА— R О 2RV2 х 1.13. Найти квадрат наибольшего из даух чисел и и Ь и отпечатать признак N= 1, если наибольшим является и, и пришак /V—2 — в противном случае. 1.14. Определить, попадает ли точка с координатами х, // и itpyi радиуса г (уравнение окружности r2=x2-f-^). Вы- hi hi признак ДО=1, если точка находится внутри круга, и при nt 1к N—0, если точка находится вне круга. 1.1 Г». Определить значение угла а а градусах между ।. him, । оединяющим точку с координатами х, у с началом иоор 111Ц.1Г, и положительным направлением оси х. Отсчет • и >>u*iiiiff угла сс вести протиа часовой стрелки. I К». Определить, является ли значение целочисленной п р< мспной х кратным 3. Если является, то вывести значение х и । in и in., в противоположном случае отпечатать НЕТ. 1.17. Определить значение периодической функции, Ир. I. i .шлейной на рис. 1.9 при заданных значениях парамет- р «и и, h, t, для любого вводимого значения аргумента х. Так > н< t|iviiKiii»i периодическая, то необходимо привести зиаче- 1ш« » к coni ветствующему значению в первом периоде. 13
1.18. Вычислить момент инерции I для различных типоа профилей: при 6 = 1 /=(В№)/12: при 6 = 2 при 6 = 3 /=(В//3 + М3)/12; при 6=4 [=(ВН3— bh3)/12; I=(bfi—bh3 4- а%)/3, где li=(aH2-[-bd2)/(2-l-aH-l-bd); 1г=Н — 1{ при заданных значениях В, b, Н, h, a, d и указателя типа профиля k. Ис- пользовать блок принятия решения типа «переключатель». 1.19. Определить полярные координаты точки, задан- ной координатами к, у в прямоугольных координатах, по формулам: _____ <p-=arctg(i//x); При вычислении угла <р не- обходимо учесть, что значение х может быть рааио нулю, а угол может находиться в различных чет- вертях. 1.20. Определить высоту X уровня жидкости, отсчитываемой от диа резервуара, который имеет форму усеченного конуса высотой I и с радиусами оснований R и г, завершенного цилиндром с радиу- сом основания R (рис. 1.10), если в резервуар налито v литроа горю- чего. 1.21. Вычислить площадь тре- угольника со сторонами а, Ь, с по формуле Герои а, проверив условие 14
корректности исходных данных (длины всех сторон положи- п-п.ны, сумма длин любых двух сторон больше длины цнтьей). 1.22. На окружности с центром в точке (xq, уо) задана iyia с координатами начальной (хя, ук) и конечной (хк, t/к) 1очек. Определить номера четвертей окружности, в которых находятся начальная и конечная точки. 1.3. АЛГОРИТМЫ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ Часто при решении задач приходится многократно вычислять имчепия по одним и тем же математическим зависимостям для раз- ивших значений входящих в них величин Такие многократно no- li । приемке участки вычислительного процесса называются циклами. 1 li ппльзование циклов позволяет существенно сократить объем схемы i и оритма и длину соответствующей ей программы. Различают циклы I читанным и неизвестным числом повторений. К последним относятся пир щионные циклы, характеризующиеся последовательным при- п кипением к искомому значению с заданной точностью. Для организации цикла необходимо выполнить следующие дей- । ним: 1) задать перед циклом начальное значение переменней, изме- iihi нцейся в цикле; 2) изменять переменную перед каждым новым ион горением цикла; 3) проверять условие окончания или повторения ник hi, 4) управлять циклом, т. е. переходить к его началу, если он не । но пчен, или выходить из него по окончании. Последние три функции выполняются многократно. 1временная, изменяющаяся в цикле, называется параметром цнк ta В одном цикле может быть несколько параметров. I кременную, значения которой вычисляются машиной и хранят- . > и одной и той же ячейке памяти, называют простой переменной, । нгременную, являющуюся элементом массива,— переменной с ин- ,hh,a/u Следует иметь в виду, что параметром цикла является при н« iin.ii> ювании простой переменной сама переменная, а при использо- |ц и и и переменной с индексом — ее индекс. Пример 1.5. Вычислить и вывести на печать значения а3 функции у=—------— при значении х, изменяющемся от 0 до гг+х2 < । ui.li ом 0,1. >го цикл с заданным числом повторений, вычисляемым но выражению п -|-1, где хк и хн — конечное и на- ii.iioe значения аргумента; h — шаг изменения аргумента; «.ofiKii | [ означают, что берется целая часть от деления. 11ерсд первым выполнением цикла необходимо задать к плюс значение аргумента х, равное 0, а затем 31 раз <||||1>лнятг> вычисление и печать значений функции у. При 15
каждом новом выполнении цикла необходимо изменять аргу- мент иа величину шага, равного 0,1. Чтобы процесс ие был бесконечным, необходимо задать условия повторения или окончания цикла. Схема алгоритма приведена иа рис. 1.11, а. На схеме блок 3 выполняет первую функцию, необходимую для органи- зации цикла, блок 6 — вторую, блок 7 — третью и четвертую. Рис. 1.11 Схема алгоритма получается более компактной и наглядной, если для ее построения использовать блок цикла, который выполняет'все функции, необходимые для организации цикла (рис. 1.11,6). Пример 1.6. Вычислить значения членов бесконечного ряда X3 х" х —.... —... с точностью до члена — ’ 21 n! п! 16
Здесь имеет место итерационный цикл, так как заранее не известно, при каком п выполняется условие Для итерационных циклов число повторений зависит ие от пара- метра цикла, а от некоторого промежуточного или оконча- тельного результата. Сравнивая два соседних члена ряда, нетрудно заметить, что уп1ул_\=*х.[п. Поэтому для уменьшения времени счета при вычислении текущего члена ряда целесообразно исполь- зовать в цикле рекуррентную формулу уп=уп^,х/п. Чтобы использовать эту формулу для вычисления первого члена ряда £/|—jftjx/1, необходимо задать перед циклом начальное значение уо, равное 1. Параметром, изменяющимся в этом цикле, является номер члена ряда п. Пере- менную у будем считать простой переменной. Тогда формула для вычисления текущего члена ряда имеет вид у=ух/п. Схема алгоритма решения приведена на рис. 1.12. Если использовать для орга- низации цикла блок начала цикла, то в ием надо указать в качестве последнего значе- ния параметра цикла п некоторое большое число, заведомо большее того значения п, при котором выполняется условие у^~ь. Алгоритмы, рассмотренные в примерах 1.5— I (», являются основой для разработки алгоритмов решения задач 1.23—1.39. Задачи для решения 1.23. Вычислить значения функции у = аеЬх‘+сх‘, если X задано массивом, состоящим из 40 элементов. 1.24. Вычислить и вывести на печать положительные значения функции у — sin пх—cos п/х при н=1, 2.......50. 1.25. Рассчитать траекторию движения снаряда по формулам x=vxt\ y=vut—gt2/2 При ПОСТОЯННЫХ скоростях Vx, vy. Время t изменяется от 0 с шагом ДА Цикл закончить при 1/^0. 1.26. Вычислить значения функции xk/k, большие а, если fe=l, 2, 3, .... 1.27. Для функции z=xk/k определить шачение k, при котором z<a. _ рис. L12 ДнепропегроЕг..си£ 1 Гссу к ,ч ве рс игру
1.28. Резервуар имеет форму сферы с внутренним радиу- сом R. Определить объем жидкости в зависимости от уроаия аоды Н от нижней точки дна резервуара. Величина II изменя- ется от 0 до 2 с шагом 0,1/?. Объем шарового сегмента V = =nH2(R-H/3). 1.29. Определить с точностью до 0,1 точку пересечения функции у=х—arctg х—л с осью X, изменяя значение х от 2 до 5 с шагом 0,1. Изменение знака функции является при- знаком пересечения оси X. При х=2 фуикпия отрицатель- ная. 1.30. Определить с точностью до 0,2 точку пересечения функции у=х—с осью х при изменении аргумента х от Ьо до Ьт с шагом 0.2. Сначала определяется знак функции у при х=Ьс- Изме- нение знака функции свидетельствует о пересечении осн х. X1 з? х" 1.31. Вычислить члены ряда ..., (— I)" —, .., модуль которых больше d. 1.32. В окружность радиуса R вписан многоугольник со стороной ап. Сторона многоугольника с удвоенным числом сторон находится по формуле а2п = Определить ai28, если известно R и 1.33. Определить количество цифр в целом числе п. Если после деления k раз числа п иа 10 в целой части числа будет нуль, то k — количество цифр в числе п. 1.34. Для массива X, состоящего из 40 элементов, выпол- нить следующие действия: а) записать нули в массив; б) вывести иа печать положительные элементы массива; в) вывести на печать первый отрицательный элемент массива и его порядковый номер, полагая, что в массиве есть хотя бы один отрицательный элемент; г) вывести на печать номера элементов, удовлетворяю- щих условию д) записать на место отрицательных элементов масси- ва нули. 1.35. Вывести на печать элементы целочисленного масси- ва (%1, хг х'п), кратные трем; п^25. 1.36. Вывести иа печать положительные элементы глав- ной диагонали матрицы Х(пХп), п^Ю. 1.37. Вывести иа печать номера точек, лежащих в круге с радиусом г. Координаты точек заданы массивами (хь хг, ... , *ioo), (i/i, У2, ..., уюо). Точка принадлежит кругу, если ее расстояние от центра круга меньше или равно г. 18
Центр круга находится в начале координат. Расстояние «>т центра круга +{Л 1.38. Решить задачу 1.37. Центр круга имеет координаты (а, Ь). Расстояние от 1<»чки до центра круга R = д/(х—a)2+(i/ —fof. 1.39. Вычислить значение функции у в точке х, если ппесгны значения функции yi, у2, ..., в 20 точках хц .........Х2о- Проверить выполнение условия Х| sg^x^xig. Если ус ловие не выполнено, то вывести сообщение «Интерполяция in* выполнена». Если условие выполнено, то найти I, для второго Xi^.x^Xi+i. Далее найти значение у по интерполя- ционной формуле Ньютона: И=Ь0+Ь1 (*— *;)+Ь2 (*—W 1 «• Ьо=у£-, Ь{ У1 + 2 — У,+ 1 У1+1—У! xi+2—xi+l Xi+l—Xj xi+2— xi 1.4. ПРИЕМЫ АЛГОРИТМИЗАЦИИ Рассмотрим приемы, наиболее часто использующиеся при реше- нии практических задач. Организация цикла с несколькими одновременно изменяющимися параметрами В рассмотренных ранее примерах в цикле изменялся только один . «метр. На практике часто встречаются задачи, в которых одновре- чип тменяется несколько параметров. Цикл с несколькими одно- • । нно изменяющимися параметрами организуется по схеме, ана- HMicofi схеме организации цикла с одним параметром. Для осталь- параметров необходимо перед циклом задавать начальные . чеиия, а внутри цикла вычислять текущие значения. Пример 1.7. Вычислить значения функции ~ х+у/ л in х изменяется одновременно с yt от начального значения и । шагом h, значения переменной у, являются элементами м К сива (yt, у2, У2с). 19
| x-x+h Рис. 1.13 Здесь в цикле, который выполняется 20 раз, изменяются два параметра: прос- тая переменная х и индекс I переменной у,. Схема алгоритма решения представ- лена на рис. 1.13. Блок 4 задает закон изменения параметра г от 1 до 20 с шагом 1. Блок 3 задает перед циклом начальное значение параметра х, а блок 7 вычисляет новое значение параметра х. Задачи для решения Алгоритм, рассмотренный в примере 1.7, является основой для разработки алгоритмов решения задач 1.40—1.43. 1.40. Вычислить значения функции y = -^]Xj+a\/2, если: а) переменная х, является элемен- том массива (xj, хг, .... Х40), переменная а изменяется от 2 с шагом 0,3; б) переменная х изменяется от 2,5 до 0 с шагом —0.5, переменная а изме- няется от 0 с шагом h. 1.41. Вычислить значения функции z=(c-|-6-|-Ci)/r, если переменная а из- меняется от 0 до 1 с шагом 0,1, перемен- ная Ь изменяется от 1 до 3 с шагом 0,2, переменная Ci является элементом мас- сива (С|, Сг, .... Ci J. 1.42. Вычислить значения функции и=(х/+|/)/£я-1, ес- ли х/ и Zi являются элементами массивов (xi, xg.хео) и (zi, 22, ..., Zioo), переменная у изменяется от 1 с шагом 0,25. 1.43. Вычислить и вывести на печать т членов ряда: . х -|- h х -|- 2й х nh а) 3~ 5 ’ ' ’ ‘ ’ 2л-М ’ ’ *' ’ х0Ч-Дх х04~ЗДх х+(2л—1)Дх Ло+ЗДл ’ л0 + 5Дп’ ’ Ло-|-(2п-|-1) Дл Запоминание результатов В приведенных выше примерах результаты вычислений рассмат- ривались как простые переменные. Поэтому после окончания вы- числений сохранились лишь последние их значения. Если же необхо- димо сохранить в памяти (запомнить) все значения результатов, то необходимо: I) выделить для хранения результатов требуемое число 20
>рнгк памяти (массив); 2) вычислить результат как переменную индексом. Пример 1.8. Вычислить и запомнить значения функции -\к+ОЛ । ц* Xi - элементы массива (ль .... Х50). Схема алгоритма решения представлена на рис. 1.14. В t хеме блок печати стоит за цик- |<>м, так как на печать выводит- i я весь массив Z. Пример 1.9. Переписать ин* менты целочисленного мас- к=0 сива N=(«i, П2, П4о), кратные ). подряд в массив М. Если такие «лемеиты отсутствуют, то вы- ыть соответствующее сообще- ние. Особенностью этого примера является то, что индексы «ле ментов массивов N и М и совладают. Следовательно, nj5['5trii НЕТ ДА Рис. 1.15 21
в цикле изменяются два параметра и необходимо использо- вать прием организации цикла с несколькими одновременно изменяющимися параметрами. Схема алгоритма представлена на рис. 1.15. Блок 3 за- дает начальное значение индекса k — 0 для записи элемента в массив М. Блок 6 вычисляет текущее значение этого индек- са, а блок 7 записывает элемент, кратный 5, в массив М. Алгоритмы, рассмотренные в примерах 1.8—1.9, являются осно- вой для разработки алгоритмов решения задач 1.44—1.50. Задачи для решения 1.44. Вычислить и запомнить 2,-="\/х^-f-y? где х, и у,— элементы массивов, состоящих из 45 элементоа каждый. 1.45. Вычислить и запомнить {хр если xf>0; О, если х. = 0; — 1, если х£.<0, где Xi — элементы массива, состоящего из 20 элементов. 1.46. Вычислить значения функции y==nsinx—cos пх, если х изменяется от хо до хт с шагом h. Записать в мас- сив Z подряд значения функции, удовлетворяющие усло- вию О^у^. 1. 1.47. Записать в массив Z положительные значения мо- нотонно убывающей функции у=—x3-f-ax2-|-bx-|-c, если х изменяется от 0 с шагом 0,1 до 10. Отрицательные значения функции не вычислять. Функция имеет хотя бы один отрица- тельный элемент. 1.48. Для знакочередующейся функции z=sin (нх + <р) запомнить в массиве А значения аргумента п, при которых z3>0, в массиве В — значения аргумента п, при которых 2<С 0, где n= 1, 2, ..., 10. 1.49. Задан массив (х(, ха, ..., х50). Требуется; а) переписать элементы массива X в массив Y а обрат- ном порядке; б) переписать положительные элементы массива X под- ряд в массив Y; в) переписать положительные элементы массива X под- ряд в массиа Y, а отрицательные — подряд в массив Z; г) записать а массив N номера элементов массива X, удовлетворяющие условию О^х.^1; д) записать в массив Y подряд 10 первых положитель- ных элементов массива X; 22
г) записать в массив Y элементы массива X, имеющие •и тыс индексы; ж) записать в массив Y элементы массива X, имеющие •и । ные индексы, а в массив Z — элементы, имеющие нечетные пн щксы; <) записать в начале массива Y положительные, а в кон- II- отрицательные элементы в произвольном порядке. 1.50. Задана матрица А(пХ^). Переписать в одномер- |ц па массив В: >) элементы ан одной главной диагонали матрицы А; б) элементы a/in_1+l другой главной диагонали мат- рицы А; в) элементы ац и а/.л-i+i двух главных диагоналей мат- рицы А. Вычисление суммы и произведения Г ели необходимо вычислить сумму значений некоторой функции , I (л) при различных значениях аргумента, то целесообразно орга- нн кш,1 гь цикл, в котором не только вычисляются текущие значения нкции, но и накапливается их сумма путем прибавления полученно- • । а гаем ого к сумме предыдущих. Формула, - пользуемая для накопления, имеет вид i+{/i- При первом выполнении цикла iiij'iiK жется значение Zi=Zo+{/i, которое , 1ЛЖП0 быть равно 4/1. Поэтому начальному «11>к*нию суммы перед циклом следует при- । uiiiii. значение ноль. Аналогично накапливается и произведе- » и । той лишь разницей, что для его на- • • 114111Я используется формула z/=z,-—it/,, а . ) мп.ное значение произведения должно । равно единице. Пример 1.10. Вычислить 20 ^2 1= I 1, элемент массива (xi, Х2, .... хго). Схема алгоритма решения представ- и । па рис. 1.16. 1>лок 3, задающий начальное значе- пиг гуммы, стоит перед пиклом, в котором ... накапливается. Блок 5 вычисляет и гп-пие слагаемого н накапливает сум- му I .ж как результат решения представ- |ч.-1 собой одно число, то блок печати г*-1— z=z*xf/Z Рис. 1.16 23
Рис. 1.17 стоит за циклом и результаты печатаются один раз. Пример 1.11. Вычислить произведе- ние положительных элементов массива (xi, *2, ..., Хюо). Схема алгоритма реше- ния представлена иа рис. 1.17. Значения сомножителей вычислять не требуется, так как они уже имеются в массиве. Однако прежде чем накапливать произ- ведение, надо проверить, является ли сомножитель положительным (блок 5). Блок 3 задает начальное значение про- изведения, равное единице. В одной из ветвей разветвляющегося процесса стоит блок 6, накапливающий произведение. При невыполнении условия х,>0 ни- каких действий не выполняется и осуще- ствляется переход к концу цикла. Алгоритмы, рассмотренные в примерах 1.10—1.11, являются основой для разработки алгоритмов решения задач 1.51—1.66. Задачи для решения 1.51. Вычислить 20 z— £ sin 'Ч-Х,!, если х, изменяется от 0 с шагом 0,1 одновременно с I. 1.52. Вычислить сумму 20 первых элементов ряда ..2 г’9 Jt* S=! +*+ 2 + +-|g =l + £ "Г Для вычисления значений х* использовать прием накоп- ления произведения, т. е. х'=х1~1х. 1.53. Вычислить сумму членов ряда Для вычисления члена ряда использовать рекуррентную формулу 24
Ч” Уп-1 2и(2л—1)' 1.54. Вычислить сумму членов ряда х3 х3 х2"-1 х‘б г=1_х+___+...+(_ 1Г _^+.. Для вычисления члена ряда использовать рекуррентную формулу 9 —х у'~у"-' 2n (2n— if’ Принять начальные значения 2=1—х, у=—х. 1.55. Вычислить суммы положительных и отрицательных П| 1ЧСНИЙ функции 2=cos (лх+а) sin (пх—а), где л=1, 2, ..., 10. 1.56. Вычислить k = nl 1.57. Вычислить число сочетаний С из л элементов по т: ,.л_ _ тт 1 т\(п—т)\ I 1.58. Вычислить размещение А из н элементов по т\ Л"п1=п (п-1) (л-2)... (п-(т-1)). 1.59. Вычислить приближенное значение функции 1н юля 100 у (-1У(х/2)ж+" _(х/2)" , U *!(«+*)! «! + у (~1)4>72)м + " 1 kl(n+k)l Для вычисления л! использовать отдельный цикл. Для вычисления слагаемого использовать рекуррентную |"«рмулу —(х/2)г k(n+k)' В качестве начальных значений суммы и слагаемого н« пользовать член ряда при Аг = О, равный (х/2)"/л!. 1.60. Для массива (хь Хг, ..., Хюо), имеющего положи- • I п.пыс н отрицательные элементы, вычислить: О среднее арифметическое положительных элементов ...ина; 25
б) сумму элементов, стоящих иа четных местах; в) среднее геометрическое элементов, удовлетворяющих условию 1 Xi 2; г) количество положительных, отрицательных и равных нулю элементов; д) количество элементов, для которых ближайшим це- лым числом является 1. 1.61. Вычислить сумму элементов двух главных диагона- лей матрицы А(«Хл). Элементами f-й строки, лежащими иа главных диагоналях, являются а,, и а,<я-*+1. 1.62. Найти силу, с которой первая частица отталкивает- ся 50 другими частицами. Все частицы имеют одинаковый заряд и расположены вдоль луча иа одинаковом расстоянии Д одиа от другой. Сила отталкивания двух частиц с зарядами q\ и д?, на- ходящихся на расстоянии n.s, определяется формулой 1.63. Вычислить длину кривой, соответствующей функ- ции у—-\/х(20—х), при значении х, изменяющемся от 0 до 20 с шагом 0,2, аппроксимируя кривую ломаной линией. 1.64. Вычислять среднее (математическое ожидание) X, дисперсию D и среднеквадратическое отклонение о для п («<Ю0) случайных величин xlt х<г, ...» хп, получеииых в результате измерений, по формулам: 1.65. Определить коэффициенты уравнения линейной регрессии у~ах-\-Ь для двух последовательностей случайных величии ¥={у1,у2, ..., £/,.} н Х={х|,х2, хп), полученных в результате эксперимента. В соответствии с критерием наи- меньшего значения среднеквадратического отклонения коэф- фициенты а и Ь рассчитываются по формулам: 26
МЛ. Оценить для условия задачи 1.65 статистическую «>• । oiirpiiocTb принятого предположения о линейной взаи- •4И пили переменных х и у, вычислив коэффициент корреля- ции между вычисленными у, п измеренными у{ значениями по •l-ipM |<- sign («) и У : yi=axi+6. близость коэффициента г к единице означает хорошее со- 1 in-кпвне уравнения у—ах-j-b экспериментальным точкам. Вычисление суммы членов бесконечного рнда с заданной точностью Вычисление суммы бесконечного ряда с заданной точностью и* к гея типичной задачей, использующей итерационный цикл, так ч и> ««ранее не известно, при каком члене ряда будет достигнута цнпуемая точность. Выход из цикла осуществляется по условию достижения тре- • . • мой точности. Для вычисления суммы членов ряда используется im< । митренный ранее прием накопления суммы. Пример 1.12. Вычислить сумму членов ряда у2 „4 у2п — 1)" ——ь.. .= 2! 4! ' (2п)! >чн остью до члена ряда, меньшего е. Для уменьшения затрат времени иа вычисление текущего •I u-iiri ряда использовать рекуррентную формулу. Параметром цикла является иомер члена ряда п. Схема и оритма решения представлена на рис. 1.18. Блок 3 задает «и >льное значение у —1, начальное значение суммы, равное . 1гну ряда с нулевым номером, так как вычислять его иет •и < бходимости, и начальное значение параметра цикла, в цикле блок 4 вычисляет зиачеине текущего члена ряда, 27
сумму элементов, стоящих на четных местах; среднее геометрическое элементов, удовлетворяющих ю 1 <Х/<2; количество положительных, отрицательных н равных >лементов; количество элементов, для которых ближайшим це- 4слом является 1. 61. Вычислять сумму элементов двух главных диагона- 1трицы А(пХп). Элементами г-й строки, лежащими на >ix диагоналях, являются аи и ai,n-i+\. 62, Найти силу, с которой первая частица отталкивает- другими частицами. Все частицы имеют одинаковый н расположены вдоль луча на одинаковом расстоянии а от другой. [ила отталкивания двух частиц с зарядами qi и qz, на- днхся на расстоянии и.2, определяется формулой 71?2/г 1.2’ .63, Вычислить длину кривой, соответствующей функ- у = -^х'(20--х), прн значении х, изменяющемся от 0 до шагом 0,2, аппроксимируя кривую ломаной линией. [.64. Вычислить среднее (математическое ожидание) X, эрсню D и среднекв ад р этическое отклонение ст для <100) случайных величин Xi, ха, .... хя, полученных гультате измерений, по формулам: 1.65. Определить коэффициенты уравнения линейной „n„v ппгпрповательностей случайных
док полинома. Если полином не содержит членов с некоторыми степенями х, то на соответствующем месте в массиве необходимо поместить коэффициент, равный нулю. Пример 1.13. Вычислить значение многочлена —x‘+ix —5j?+6x+ 1, используя формулу Горнера. Коэффициенты полинома удобно представить массивом (2, 0, —1, 4, 0, 0, —5, 6, 1), порядок полинома п = 8. Схем i алгоритма аналогична схеме, представленной иа рис. 1.19 Алгоритм, рассмотренный в примере 1.13, является основой для разработки алгоритмов решения задач 1.68—1.72. Задачи для решения 1.68. Вычислить значение функции sin х*=+с2х7 4-СзХ5 + с4х® 4- с5х-Ьх, используя формулу Горнера si П X = ((((Г ,Х2 + С,) 3? + С3) X2 + с4) X2 + св) X+X, где Ci, С2, Сз, Са, Сь — элементы массива. 1.69. Вычислить значение многочлена z=x“ — 4,2/ +х7—0,5х4 —х2 + 1,3 н его первую производную, используя формулу Горнера. 1.70. Вычислить значение полинома Z = 1 х? + 2х7+3/ + 4/ + 5х4 + 6х3 + 7/ + 8х+9. Так как коэффициенты полинома являются числами нату- рального ряда, то сводить их в массив ие имеет смысла. Они будут вычисляться в процессе решения. Тогда формула для вычисления текущего значения полинома имеет вид 1.71. Вычислить значение s=(14-x)8, используя форму- лу Гориера 1 \ о \ я \ _ x+l х + 1 ) g-*+- •+* jSx+l. Множитель, на который умножается любая скобка, мож но представить как hi=ix/(m—Z-Ь 1), где ги=8. 1.72. Вычислить сумму членов ряда 30
hi 11и..1ьзуя формулу Горнера =(• ((^+,)^+*Н+- +!)x+1- Нахождение наибольшего и наименьшего значений Нахождение наибольшего или наименьшего значения функции . - I (л) выполняется в цикле, в котором вычисляется текущее значе» »•> функции и сравнивается с наибольшим или наименьшим из всех • । сущих значений этой функции. Если текущее значение функции .. . -1 ня больше наибольшего из предыдущих, то его надо считать I...I.IM «начением наибольшего. В противном случае наибольшее со- м - • • свое старое значение. Это можно описать условной математи- ки формулой если У'>Утах‘, (! 0 "... (»„;> если У,^У„„- Аналогично, для наименьшего значения [У? если г/,<»т|„, . [Уиш- «"" У1>Утт- 11<»с ю первого выполнения цикла вычисляется у\ и сравнивается . .'in п.ным значением утах или ymin. При этом значение у|рах или л iiui>Kiio быть равно у\. Тогда после вычисления уъ наибольшее | 1 нпнмс-иьшее находится из первых двух значений функции. Для . in обходимо в качестве начального значения t/max брать за- • -и -juice число, с тем чтобы наверняка выполнить условие , »/|, а в качестве начального значения ymjf| брать, наоборот, за- . большое число, с тем чтобы выполнить условие yrnin>£/r и- Ivor отметить, что здесь речь идет не о максимуме функции, • - uno о наибольшем или наименьшем из вычисленных значений ф, ни инн ->то объясняется тем, что ЭВМ вычисляет дискретные значе- ,. | bviihiiiiH и истинный максимум или минимум может находиться НИМИ. г 1ч мпгренный алгоритм нахождения наибольшего или наи- инляется универсальным, т. е. позволяет решить задачу »м смучае, если функция не имеет экстремума или имеет • -и экстремумов. Если же функция имеет один экстремум, то • нрсмсни на решение задачи можно существенно сократить, . • ipyj ой алгоритм. I. функция имеет один максимум. Тогда, вычисляя значения к п (холящиеся до максимума, новое значение функции всегда . н.пн* наибольшего из всех предыдущих (рис. 1.20), т. е. всег- • - выполняться условие У.>Утвх- После максимума функция • • ' 1>ып1гь, следовательно, все последующие yi меньше наи- ... it V» |овие У^утгя можно использовать для выхода из 31
Рис. 1.20 цикла, так как среди пп следующих значений функ ции не может быть наи- большего. Этот пронес, можно описать условный формулой Аналогично, при нахождении наименьшего выход из цикла. если у^у^. (1 3) = рг если S'min 1 выход из цикла, если У^Ут1Р1- Пример 1.14. Найти наименьшее значение функции у=а e~bx sin (сох 4- <р) в интервале изменения аргумента х от 0 до с с шагом h. Схема алгоритма решения представлена на рис. 1.2! Блок 3 задает перед циклом начальное значение ymin=10IB Блок 5 вычисляет текущее значение функции, а бло ки 6 и 7 реализуют условную формулу (1.4). Пример 1.15. Найти экстремальное значение функции j/=|ole'“+“! при изменении аргумента х от 0 до 4 с шагом h. Функция такого вида имеет один экстремум. Если с>0, b<zO, то функ- ция имеет минимум, если с<0, Ь>0, то — максимум. Рассматриваемая функция всегда положительна. В за внсимости от знака с она имеет или максимум, или минимум Поэтому алгоритм должен начинаться с проверки знака с. Схема алгоритма приведена иа рис. 1.22. Блок 3 про веряет знак величины с: если оиа положительна, то )V= = 1 (функция имеет минимум), если она отрицательна, п» =—1 (функция имеет максимум). Блок 6 задает начали иое значение угп — экстремум: если Af=l, то ут= 1019; если N=—1, то ут= —1019. Блок 9 в цикле проверяет условие Ny<.Nym-. при А'=1 оно аналогично условию у<ут (как и требуется при нахождении минимума); при W=—1 оно аналогично обратному условию у>ут (как и требуется при нахождении максимума) Если условие Ny<Nym выполняет ся, то значение у считается новым экстремальным значением функции. В противном случае осуществляется выход из цикл i 32
ияется. Блок 11 выдает иа печать признак экстремума N и экстре- шлчсние ут. Если выводится на печать А=1, >мц pi нт, что значение ут является минимумом; I. in шачение ут является максимумом. Сокра- I »]н мгни счета осуществляется за счет выхода из । in у« ливне Nydtym не выполняется. . . р и смотренные в примерах 1.!4—1.15, являются - Il ini 1|».|Г»<>гки алгоритмов решения задач 1.73—1.78. i > д а ч и для решения 1 I 11 пни мжсимум функции i/=sin л‘ + 2 sin х. Аргу- • и mi Инги н от 0 до п с шагом 0,1. а I 11 п1 in и 1именьшее значение функции у = ахг-\- | <1 и in 1чсцие аргумента, при котором оно получе- II I л < i,< । гп к др. 33
ио. Значение аргумента х изменяется от 0 до 10 с шагом 0,! 1.75. Найти экстремум функции y = axs-\-bx2-}-cx-}-d имеющей одни максимум и один минимум при а>0и Зас Ь2<0, если значение х изменяется от —10 до 10 с ша гом 0,2 и известно, что максимума функция достигает при меньших значениях аргумента. 1.76. Для условия предыдущей задачи найти зиачени i аргумента, при которых функция имеет наибольшее и наш меньшее значения. 1.77. Найти экстремум функции у = аеах— Ье~сх, ес ш значение х изменяется от xv до хт с шагом h. Функция имс * один экстремум. Чтобы определить, является этот экстремум максимумом или минимумом, можно использовать следующн Рис. I.23 Г* max ~%t способ. Вычислить два значения функции yi И У2. Если У2 >у\, то функция ИМС11 максимум, в противном случае— ми инмум. 1.78. Для функции у—ае“ь’Х Xsin (сох4-ф) найти первый максимум первый минимум и значения аргумент, i, при которых они достигаются. ФункцЛ сначала достигает максимума. Аргумем х изменяется от 0 до 6 с шагом 0,1. Нахождение наибольшего н наименьшего в массиве Пример 1.16. Найти наибольший эл—| мент массива (хц x-i, ..., х-ю) и его поря» | ковый иомер. Здесь нет необходимости вычислят, сравниваемые значения, так как hi* имеются в массиве X. Поэтому в качеств* начального значения принимается пер вый элемент массива. Поскольку срап иение первого элемента массива с соби*1 не имеет смысла, цикл выполняется hi чииая со второго элемента. Схема алгоритма решения предст.ш леиа на рис. 1.23. Блок 3 перед цик к м задает начальные звачения хтах—х> • /imax = l- В цикле блоки 5 и 6 реализую’ условную формулу (1.1), блок 7 ОП|» деляет иомер наибольшего элемента м н сива. 34
Задачи для решения iiopniM, рассмотренный в примере !. 16, является основой для •»O>ri>iiui алгоритмов решения задач 1.79—1.80. I /II. Для массива (хь х?, .... х10о) найти: I и шбольший и наименьший элементы массива и их •> pH и оные номера; • I н шбольшее и наименьшее значения модуля разности »>• iy соседними элементами; > и шменьший из положительных элементов; и шбольший и наименьший элементы; поменять их ► I IMII. ч наибольший элемент, удовлетворяющий условию 1а . 2; • | наибольший элемент; заменить его значением суммы М*,м<11Н1В, предшествующих ему; . | наибольший элемент; заменить (нормировать) все |0 him массива, поделив их значения на значение иаиболь- |смента. 1 Ml. Найти наибольший элемент главной диагонали мат- jbhuj К (20X20) и вывести иа печать строку, в которой он • 111 н я. Нахождение корней уравнений 1 штического решения многих алгебраических и трансцеиден- •••« р шпений получить не удается. Для решения таких уравнений -уки приближенные итерационные методы (методы последова- 1х приближений). При этом решение уравнения разбивается на • • 'll) определение грубого значения корня, например графи- ма чу гем или вычислением на ЭВМ, при задании грубых значений । аргумента; 2) уточнение значения корня. яшение значения корня уравнения рассматривается на при- ►- mi юда итераций и метода половинного деления. При изложе- на* и методов предполагается, что известен интервал •о» ч- которого существует один или несколько корней. упцюсть метода итераций заключается в том, что исходное • • .line представляется в виде x=F[x). Если в интервале между in кспным значением корня х0 и значением корня уравнения I шястся условие |f/(x)|<l, то метод дает возможность вы- пычение корня с заданной точностью е. Если это условие не • - Пн ин, то надо перейти к обратной функции. Новое значение • вычисляется через предыдущее по формуле !(*,„,) 1||цгоряя этот процесс для Xi, хг, хз, .... можно вычислить »• ш. < <аданной точностью, которая определяется с помощью вы- » linn |ла— 35
Пример 1.17. Вычислить наименьший положительный ко реиь уравнения х— tgx = 0 с точностью е=10-6. Преобразуем уравнение к виду x=tgx. Для этого урав- нения |tg' х| > 1, поэтому перейдем к обратной функции х=» =Arctg х, где Arctg x = arctg x-\-kn — ие главное значение Для решения необходимо иметь два смежных знамени i корня. Обозначим Хо — предыдущее значение корня, a Xi — | последующее значение корня. Начальное значение первого положительного корня хо=4,7. Для вычисления нового зна- чения корня используем формулу x(=arctg хо + л. Схема алгоритма решения представлена на рис. 1.24 Блок 2 задает начальное (грубое) значение корня Блок 3 вычисляет новое значение кория. Блок 4 проверяет достижение заданной точности. Если точность достигнута, тс осуществляется выход из цикла, в противном случае выпол- няются действия блока 5 и осуществляется переход к началу цикла. Блок 5 присваивает xq только что вычисленное значс ние корня. На печать выводятся два смежных значения кор ня, так как корень уравнения находится между ними. Рис. 1.24 Если функция f (х) имеет достаточ- но сложный вид, то проверка условны If' (х)|<! оказывается затруднительц ной. Для решения уравнения в это#|, случае можно использовать метод поло j винного делевия, который, хотя и требу* j ет значительного объема вычислений для медленно сходящихся функций, всег да приводит к искомому результату Сущность метода половинного делении заключается в следующем. Исходное уравнение представляется в виде f (х)=0, функции f (х) непрерывна » интервале (а, 0), где отыскивается ко- рень и f (a)Xf(P)<0, т. е. функцн 11 имеет разные знаки на концах иитерв.1 ла. Для нахождения корня, прииадлс жашего отрезку [а, р], делится отрезок пополам, т. е. выбирается начальное - а+Р ,• г/ х л приближение х= % . Если f(x)—О, то значение х является корнем уравне иия. Если f(X)#=O, то выбирается т< i из отрезков (а, х] или [х, р |, на концах которого функция f (х) имеет против» положиые знаки. Полученный отрезок 36
нов.! делится пополам и повторяется то же рассмотрение. Процесс деления отрезке® продолжается до тех пор, пока timid отрезка, на концах которого функция имеет противопо- । епые знаки, ие станет меньше наперед заданного числа е. Пример 1.18. Методом половинного деления найти корень ур ншенин х-|- =0 на отрезке [0,4; 1] с абсо- чинной погрешностью е=10-4. Алгоритм нахождения корня представлен иа рис. 1.25. 37
Блок 5 проверяет условие правильного задания интервал.! [а, 0], в котором отыскивается корень. Если функция / (> имеет противоположные знаки иа концах интервала [а, р|, и отрезок задай правильно и можно переходить к отыскании! корня. Блоки 10, 11, 15 выбирают новый (уже поделенный пополам) интервал, иа концах которого функция имеет про тивоположиые зиаки. Блок 12 проверяет достижение за д.1 и иой точности. Если точность ие достигнута, то осуществляв ся переход к блоку 7. Снова отрезок делится пополам и прй должается вычисление нового приближения корня х. Есл| точность достигнута, то осуществляются выход из цик i« и печать результатов. Алгоритмы, рассмотренные в примерах !.!7—1.18, являют основой для разработки алгоритмов решения задач 1.8! —1.85. Задачи для решевия 1.81. Используя метод итерации, вычислить приб in жеиные значения корней с точностью е для следуют» уравнений: а) х=1п(х4-2), хо=Ь, ах2 б) х—е 2 =0, хо=Ь. 1.82. Решить систему уравнений ( х=х2+г/2+0,05; 1 У=х2 — </' | 0,2.3 С ТОЧНОСТЬЮ 10 4, Хо = 0, 1/0 = 0. 1.83. Используя метод итераций, вычислить значение фуик цин у=\/-у$х по итерационной формуле yi^\=~^yt —2"^ с точностью 10-5, i/o=2(2—д/2). 1.84. Определить методом половинного деления кореш уравнения ех -f- "д/1 -|- е2’ иа интервале [—1; 0] с точносп 0,5-10-1. 1.85. Определить методом половинного деления кореш 2 11 уравнения cos-2 sin--1-=0 иа интервале J1; 2] с ™ ххх иостью 0,5-10-8. Оценить число итераций для достижепй задаииой точности. 38
I . АЛГОРИТМЫ CO СТРУКТУРОЙ вложеннык ПИКЛОВ В пик I. называемый внешним, могут входить один или несколько Вм иных циклов, называемых внутренними. Организации как • ...... < г nt и внутреннего цикла осуществляются по тем же прави- ....... простого цикла. Параметры внешнего и внутреннего цик- - • , । umr и изменяются не одновременно, т. е. при одном значении внешнего цикла параметр внутреннего цикла принимает • pi inn все значения. Прш-мы программирования, изложенные ранее, можно исполь- и при организации вложенных циклов. Пример 1.19. Вычислить сумму положительных элемен- । । • цж строки матрицы А (10X8). Для вычисления сум- п<| К1жительиых элементов одной • • I пн матрицы необходимо органи- зм • цикл, перебирающий все эле- ••»>* 1роки. параметром этого цикла Ь номер столбца /. Перед цик- • м 1.1гтся начальное значение сум- • (I. После окончания цикла , ii.i п выводится и а печать. Если «hi действия повторить во внеш- не цикле, изменяя индекс строки t, I I вычислены все 10 сумм. Схе- I чоригма решения приведена на В рассмотренном примере внеш- ний i обязательно должен быть t (индексу строки), так как в мпшом случае были бы вычис- ммы положительных элементов столбца. Часто встреч ают- для решения которых ие какому параметру орга- внешний и внутренний по Пример 1.20. Упорядочить элементы " Iti. Х2, ...,Хюо), расположив • порядке возрастания в том же 1*< нк-ппс сводится к многократ- ♦ ппхождению наименьшего эле- массива или его части. Поэ- • • ш-pin внутренним циклом за- ........ |льное значение наименьше- Рис. 1.26 го
го, а внутри цикла отыскивается наименьший элемент и ею порядковый номер. После окончания внутреннего цикла иаи меньший элемент записывается на место первого, а первый на место наименьшего. Повторяя эти действия, начиная со второго, затем третьего элемента и т. д., можно добиться того, что все элементы массива будут упорядочены по возрастанию Схема алгоритма решения представлена на рис. 1.27. Внешний цикл выполняется 99 раз, так как находить наименьший элемент из одного элемента Хюо ие имеет смысл*». 40
। / «адает начальное значение xmin и номер п наименьше- I . . п-мента. Блоки 6 н 7 находят наименьший элемент и его । (новый иомер. Блок 8 записывает fe-й элемент к । ячейку и наименьший элемент — к fe-ю ячейку. Пример 1.21. Упорядочить элементы массива (хц Хг, ... .), расположив их по возрастанию в том же массиве. Чля решения используется метод, сущность которого за- .р| ится в следующем. Первый элемент массива или его ‘loin х* сравнивается со всеми последующими элементами . П«який раз, когда элемент хь будет больше какого-либо .. п (ующего элемента х,, необходимо осуществить их пере- .if* 1|1ку. Для реализации этого во внутреннем цикле по • одимо перебрать все оставшиеся элементы от (fe + I- и* 100-го. После окончания этого цикла значение х* | . । наименьшим из рассматриваемых значением элементов fiii« пн i, а остальные элементы ие будут упорядочены. Для 1ч|к) >пчиваиия остальных элементов указанные действия м. илимо повторить, изменяя k от 1 до 99. Когда остаиет- »• 1едний элемент, процесс упорядочивания следует пре- •р. ни*. • «ома алгоритма решения представлена на рис. 1.28. • Ч проверяет выполнение условия Х/СХ*. а блок 6 осу- I? (ист перестановку элементов массива. Пример 1.22. Определить с точностью е==0,01 значение •сита, при котором функция у —ах — 1пх достигает Шннмума, при х, изменяющемся от 0,2 до 10. Можно было бы fiiiiiiih шаг изменения аргумента, равным 0,01. Одиако это |рип< к-т к увеличению времени счета. Поэтому решение «. и <><>бразио разбить иа два этапа: 1) определение грубого и> и пни аргумента, при котором функция достигнет миниму- | । in большого шага изменения аргумента (например, 0,2); t| iioiiiпрение процесса в области минимума при шаге изме- »нн цнумента, равном 0,01. I жим образом, при первом нахождении минимума на- с значение аргумента равно 0,2 и шаг его изменения • «и* и (1,2. При повторном нахождении минимума начальное • I- пне аргумента равно хт1П —0,2, а шаг его изменения ш»1 м-ма алгоритма решения приведена на рис. 1.29. 11<> внутреннем цикле осуществляется поиск наименьшего I» 1'кпия функции и соответствующего аргумента. Поскольку • и ппи имеет один минимум, выход из цикла происходит при ф • ч В качестве параметра цикла взята некоторая пере- . mill которая играет роль счетчика повторения цикла. 41
После окончания внутреннего цикла проверяется условие =0,01. Если условие выполняется, то осуществляется выход из внешнего цикла. В противном случае задаются hoboi начальное значение переменной х, новый шаг —0,01 и внешний цикл выполняется еще раз. 42
Пример 1.23. Вычислить значение определенного интег- f (х) dx с точностью е. II пи и значение определенного интеграла аналитически, । вычисления первообразной, не всегда удается. В этих I । nix используют приближенные численные методы вычис- III прямоугольников, трапеций, парабол (Симпсона) и др. Г птмотрим метод трапеций с автоматическим выбором н । пи югрироваиия для получения требуемой точности вы- н нпи. Сущность метода заключается в том, что вычисля- н инцадь, ограниченная кривой подынтегральной фун- >ки I. «кью абсцисс и пределами интегрирования. Площадь । • uni н-гся на п элементарных площадок шириной й, где а - начальный шаг интегрирования. Каждая эле- н > । и । ipiiая площадка считается прямоугольной трапецией. . in । дь которой равна У{ + '/. + ! 2 й, где у, и £/i4-i — значения • И.1К1 сгральиой функции на границах интервала й Сум- » цп1 in площадь всех прямоугольных трапеций » £ У.+У^=к £ %+/л j Li ।ем вычисляется новое значение площади S2 при шаге, । ином й/2. Если |$|—то требуемая точность до- • ни н”1 а и необходимо прекратить вычисления. Если же |si — , ।, го шаг снова делится пополам и снова вычисляется . । н-ннг площади. < н'ма алгоритма решения представлена на рис. 1.30. Гн внутреннем цикле вычисляется сумма sg. Во внешнем » . проверяется условие |si—S2I Если это условие * ii-..шяется, то осуществляется выход из цикла. В против- • > 1учае $1 присваивается значение «а, удваивается число деления отрезка интегрирования и осуществляется . жри к началу внешнего никла. \ иоритмы, рассмотренные в примерах 1.19—1.23, являются - - пни для разработки алгоритмов решения задач 1.86—1.102. Задачи для решения 1.86. Вычислить значение функции 20 п .л 43
б) элементы массивов А и В расположены в случайном порядке. 1.101. Обойти по спирали, начиная с центра, все эле- менты квадратной матрицы размером 15X15. Порядок обхо- да — против часовой стрелки. Вывести иа печать элементы матрицы в порядке обхода. 1.102. Для квадратной матрицы пХп найти: а) максимум средн сумм элементов диагоналей, парал- лельных главной диагонали; б) мнннмум средн сумм элементов диагоналей, парал лельных побочной диагонали; в) максимальную сумму модулей элементов каждой строки твх | г) удовлетворяет ли заданная матрица условию; для всех <>1 и />1 верно неравенство д) номер строки н столбца седловой точки — элемент# матрицы ац, являющегося минимальным в i-й строке и макси- мальным в /-м столбце; е) новую матрицу, полученную путем сглаживания ис- ходной матрицы. Элементы сглаженной матрицы получаются как среднее арифметическое соседней соответствующего эле- мента исходной матрицы. Соседями элементе ац называются элементы ан с индексами, удовлетворяющими условиям t-l<*Ct+l; (£,/)¥=(«,/); /-!</</+ I; ж) число локальных минимумов матрицы. Элемент мат рицы называется локальным минимумом, если он строга меньше всех имеющихся у него соседей (см. задачу 1.102, е). з) максимум среди локальных минимумов заданной мат рицы (см. задачу 1.102, ж). 1.6. разработка алгоритмов решения задач СМЕШАННОЙ СТРУКТУРЫ В предыдущих параграфах, предназначенных для усвоения ос нов алгоритмизации, условия задач даны в математической формул» ровке. В данном параграфе постановка задачи дается в терминах предметной области, поэтому необходимо выполнять все этапы под готовки задачи для решения на ЭВМ. Пример 1.24. Разработать алгоритм вычисления средне го балла и зачисления на стипендию студентов, если она на- 46
«км тем, кто по результатам сессии получил оценки н ».» или имеет одну оценку «3», ио активно занимается .« ии» 111С111ЮЙ работой. Студент, имеющий все оценки «5», । tri повышенную стипендию. < и»- гения о результатах сессии для группы сведены I •«||нщу А (25,8). В столбцах 2—6 приведены оценки, • ... и иные на экзаменах, в столбце 1 указана единица (1), и iiyicHT принимает активное участие в общественной п. и-, или ноль (0) —в противном случае. Результаты вы- c. in и । печать в виде матрицы. I! < голбец 7 поместить средний балл студентов. Для , шов, имеющих неудовлетворительные оценки, средний n.ii не вычислять (равен нулю). Признак стипендии no- ш.. гни. в столбец 8. Признак обычной стипендии — I, повы- иной стипендии — 2, отсутствие стипендии — 0. Вывести | . in *1.1 ib сформированную матрицу. 11ри решении следует проверять наличие неудовлетворн- ।. H.HIJX оценок. Если они имеются, то средний балл А (1,7) • ина следует считать равным нулю и в столбец 8 запнсы- • н. признак 0. Если неудовлетворительных оценок нет, то • • . ,сг подсчитывать сумму баллов для каждого студента, < in > ic окончания цикла — средний балл. Для назначения на ипи-ндию необходимо подсчитывать количество отличных пь I гоилетворнтельных п3 оценок. Если после окончания цикла I» 1Ж1*тся, что Пб=5, то назначается повышенная стипендия I ншнсывается признак 2 в столбец 8). В противном случае . •. гует проверить количество удовлетворительных оценок. Чп бы уменьшить объем работы, нз количества удовлетвори- н ||.ных оценок п$ необходимо вычесть признак общественной |||Си>|ы ац. Эта разность будет меньшей или равной нулю, . in студент не имеет удовлетворительных оценок или имеет iiiv оценку «3», но активно занимаетси общественной рабо- (DII В обоих случаях стипендия студенту назначается, । в столбец 8 записывается признак 1. Если разность би. плие нуля, то стипендия не назначается, т. е. в столбец м шисывается признак 0. Схема алгоритма решения представлена на рнс. 1.31. Алгоритм, рассмотренный в примере 1.24, является основой для । приборки алгоритмов решения задач 1.103—1.106. Задачи для решения 1.103. Для условия примера 1.24 вычислить средний о,| |л по каждой дисциплине для всей группы н вывести на печать результаты. 1.104. Разработать алгоритм, позволяющий определить 47
по результатам сессии число студентов «5, имеющих m • оценки «5», число студентов «4, имеющих все оценки «4» число студентов щъ, имеющих все оценки «5» и «4», чис к» студентов и», имеющих хотя бы одну оценку «3», число сту дентов «2, имеющих хотя бы одну оценку «2» или несданный 48
Гпудьтаты сессии сведены в матрицу А (25,5). I . । решения этой задачи необходимо подсчитать дли • i । vлента количество отличных ks, хороших А4, удов- ,iii ii.in.tx кз оценок. Если Аб=5, то необходимо Гн чип. п . на 1, если fe4=5, то надо увеличить п4 на I, если . I. го следует увеличить на I, в противном случае у иг шчить пз на 1. Если cty<2, то необходимо сразу । ниш in. л2 на I и выходить из цикла. 101». Разработать алгоритм для определения мест, за* । |м» 11 < чрениованин десятиборцами. Результаты, показаи- . п . пир гс менам и, помещены в матрицу X (20, 13). В стол- I ч крицы указан номер спортсмена, в столбцах 2— мины очки, набранные спортсменом в разных видах . «мп, в столбце 12 поместить сумму очков, набранных । мсиом. а в столбце 13 — занятое им место. Вывести | । пи в виде таблицы, содержащей номер спортсмена, л |бртнных очков, занятое место. I ни'нис задачи сводитси к вычислению сумм элементов ». й 11 роки, начиная со 2-го по 11-й столбец, и записи •i««. . ,мм в столбец 12. Затем элементы столбца 12 следует 94|, шчить по убыванию, переставляя в соответствии с этим «> • । иортсменов. Далее в упорядоченном массиве с номе- 9*. . |1пр1сменов определить место, занятое каждым из них, - отписывается в столбец 13. Спортсмены, имеющие •» «> ьчиую сумму очков, располагаются в порядке возраста- ум* и» номеров. I 1011. Для условия задачи 1.105 упорядочить все строки ^•11.1Ш11 в соответствии с набранной спортсменом суммой г- и !’<чультаты вывести в виде матрицы. Пример 1.25. Разработать датчик, генерирующий слу- it к» последовательность целых чисел в интервале от К до | » р шцомсрным законом распределения. Количество чисел • НИ1 Результаты запомнить в массиве Z. уч шные числовые последовательности широко исполь- и и моделировании различных систем н процессов. 1ли I енерировання случайного равномерно распределен- ......шла в языках программирования есть либо спеииаль- функции, либо подпрограммы, позволяющие за одно I/ ищ-пие получить случайное число х нз диапазона [0, I]. /I hi получении случайного равномерно распределенного в диапазоне [а, 6] необходимо вычислить z=(b — . ) । | а. Для получения случайного равномерно распреде- 14Й1пн>1<> целого числа т из диапазона [К, L] необходимо вос- »• н- иiii.ilься формулой т=] (L — К+!)х[-}-К, где (L—К-\- | h длина интервала с учетом границ. 49
Для получения случайных чисел, распределенных по »» спонеицнальному закону с параметром 1, можно воспел i. и ваться формулой z= — I/X In х. Числа z с распределением, близким к нормальному. средним значением т и дисперсией d можно получить иукм усреднения 12 равномерно распределенных чисел (12 \ X-— 6 Основными характеристиками случайных чисел явлики. ся: среднее нлн математическое ожидание тх, дисперсии i или ср едиеквадр этическое отклонение ох, которм вычисляются по следующим формулам: I d«=T X W-m9= = -|" У cK—-y/dx. к 1=1 Схема алгоритма генерирования целых чисел в интерн* ле от К до L представлена иа рис. 1.32. Блок 5 осуществ i и • обращение к подпрограмме генерирования случайного чп< к х из диапазона [0, 1]. Блок 6 вычисляет значение цеп in случайного числа из диапазона [К, L] н запись его в массив I Пример 1.26. Смоделировать моменты поступления ст» дентов в библиотеку в предположении, что в среднем чсш« каждые 5 мии в библиотеку приходит одни студент. На ш чать вывести время появления студентов в минутах от нач.м« работы и общее число студентов, пришедших в библнокя в течение одного часа от начала работы. В течение одноминутного интервала студент может и» i виться в библиотеке с вероятностью '/8. Генерируя случашнв число х в интервале [О, I], следует проверять выполнение условия х<1/ь- Его выполнение означает, что стунш появился в библиотеке, невыполнение — что студент не нц являлся. Схема алгоритма решения представлена на рис. I .1' Блок 2 задает частоту поступления студентов V в библиотека, общее времи Ть работы модели, начальное значение счетчш • k, фиксирующее число пришедших студентов. Блок 3 орган* зует цикл по параметру t — текущее время в минутах, и imi няющееся от I до 60 с шагом 1. Блок 5 проверяет услонп появления студента в библиотеке. Если оно выполняется, г« на печать выводится текущее время (блок 6), соответствую 50
I’m 1 32 hiii у появлении студента в библиотеке, н значение • унсличивается на единицу (блок 7). Нрнмгр 1.27. Разработать алгоритм проверки знании I I |блнцы умножения. Учащемуся задается 10 во- <« ни 11 п X т = ?, где пит — случайные целые числе из 51
диапазона [0, 20]. Если ответ правильный, то выдать соо лп« ние ПРАВИЛЬНО, и задать следующий вопрос; если шк ошибочный, то предложить снова ответить на вопрос; число попыток ответить на один н тот же вопрос равно ipi то предложить выучить таблицу умножения и прекраип. проверку. По результатам проверки определить оценку у'К щегося следующим образом: «отлично», если правильны* ответ был получен на все 10 вопросов с первой попынй «хорошо», если таких ответов было не меиее 8; «удовлетв« pi. тельно», если число правильных ответов не меньше 6; «ц<, довлетворительно» — в противном случае. Схема алгоритма решения представлена на рис. I О Блок 2 задает начальное число правильных ответов с nepinj попытки. Блок 3 открывает цикл, параметром в когорт является номер вопроса. Блок 4 задает начальное знамен*, количества попыток ответить на заданный вопрос. Би-« 5 и 6 генерируют случайные числа пит. Блок 7 выводи! - I экран дисплея вопрос. Блок 8 вводит ответ обучаемого. Ь >>• 9 проверяет его правильность: — если ответ правильный, (И блок 10 выводит сообщение об этом. Блоки // и 12 увеличн • ют иа 1 значение п, если ответ получен с первой попьин« если ответ неправильный, то выводится сообщение об (блок 16), увеличивается на 1 число попыток k (блок /0 Блок 14 проверяет условие k—З. Если оно выполняется, блок 15 выдает сообщение о необходимости выучить таб пня умножения и далее осуществляется переход к блоку 24. II• еле окончания цикла блоки 17—23 определяют оценку и вьпн дит ее обучаемому. Алгоритмы, рассмотренные в примерах 1.25—1.27, явл и<н^ основой для разработки алгоритмов решения задач 1.107—1.11-1 Задачи для решения 1.107. Разработать датчик, формирующий массив М i 300 целых псевдослучайных неповторяющихся чт м из диапазона (0,511]. При получении текущего значения случайного числы диапазона [0,511] необходимо делать проверку — есть «• уже такое число в массиве М: если есть, то следует перейю к генерированию следующего числа; если нет, то надо писать его в массив М подряд без пропусков, для чего нс<->* димо ввести счетчик индекса последнего записанного чм • • в массиве М. 1.108. Для условии задачи 1.107 определить колич<< k обращений к датчику случайных чисел. Вычислить мап*м«» 52
Рис. 1.34
тическое ожидание (среднее арифметическое) и ди< ш । сию Dx случайной величины х по формулам: 1=1 1=1 1.109. Написать программу, моделирующую брш Шф 1000 монет. Определить, сколько раз выпадет сторона « >*«м| бражением герба и сколько раз — с изображением цифр в Будем полагать, что если сгенерированное случ il •• число г<0,5, то выпадает сторона с изображением пр • если г.^0,5, то выпадает сторона с изображением цифр. При таком распределении вероятности появления i р # и цифры одинаковы. 1.110. Написать программу, моделирующую следуют эксперимент. В ящике находятся 2000 шаров. Из них KMmi красных, 500 — белых, 200 — зеленых, 200 — желтых, Я» Л черных, 50 — серебристых. Из ящика случайным об|чмЛ извлекается 100 шаров. Сообщите ЭВМ, сколько шаров и» дого цвета вы желаете увидеть. Считайте, что после топ» •• шар вынут и цвет его зафиксирован, шар возвращу 1 ♦ в ящнк. Программа должна моделировать извлечение ш << из ящика, суммировать число шаров каждого цвета н bi ih< * полученный результат и сообщенный вами ЭВМ. Для определения цвета извлекаемого шара необхоиг** смоделировать извлечение шара из ящика, т. е. сгенсрп|«» I вать случайное число 1 2000. Далее будем пол ага п>, < • если х<50, то извлекается серебристый шар и надо ути • чить значение счетчика серебристых шаров; если 50 «Л 100, то извлекается шар черного цвета и следует уве н • вать значение счетчика черных шаров; если 100^х<ЗШ1 ' извлекается шар желтого цвета и т. д. 1.111. Шарик, подброшенный вверх с начальной < стью Уо, достигает высоты И = V^/(2g). Разработать • ритм игры, в которой случайным образом выбирается ии< . из диапазона [0,1000] метров, сообщается пользовп>Л и запрашиваетси ввод начальной скорости шарика. Понш общается результат о положении шарика: НИЗКО, BI>!< «М КО нлн ХОРОШО. Точность совпадения равна 10-3. 1.112. Разработать алгоритм проверки знаний учаиц । < Я по разделу электротехники «Последовательное н парад и ное соединение проводников». Даются задания: опредц ь .» общее сопротивление цепи, состоящей а) из п последов.» г ио соединенных одинаковых сопротивлений номиналом R, (»« б) из п параллельно соединенных сопротивлений /?, <М 54
, и) из n последовательно н tn параллельно соединен- •н • 1Ч1|»<»1 пилений R, Ом, каждое; т н п — целые случайные о и' шапазона [0,9]. । in нее три задания выполнены правильно, то выдать к ине ПРАВИЛЬНО. Если задание выполнено ошнбоч- h . им i пт, сообщение НЕПРАВИЛЬНЫЙ ОТВЕТ НА ВО- 11" » и указать номер задания. I 11 I. Для новогоднего вечера выпущены лотерейные н» " ||»<‘х разрядов: для молодежи, взрослых н пенсноне- Ь Н> пр । билетов каждого разряда находятся в пределах: шч одежи — от I до 100; । । н । рослых — от 101 до 200; . । । пенсионеров — от 201 до 250. I помощью ЭВМ выберите случайным образом выиг- •ншП би ют в каждом разряде. I 111 Разработать алгоритм игры — выбрасывание мо- »i || in in роками — х н у. У обоих игроков по 20 монет » uni . .ом в 1 коп. Онн выбрасывают по одной монете на «кривая их от соперника. Если выясняется, что обе I* । । нч ли одной стороной, то их забирает игрок х; если же I♦ ♦ и ичли на разные стороны, то оии достаются игроку й "и .in итоговые результаты — сколько монет будет I | in ры у каждого нз игроков. пример 1.28. Разработать алгоритм вывода графика мцнн »/ —2 sin (x)-|-sin (2х) прн изменении аргумента *• й I»' Хщ с шагом h. Вывести перед графиком максималь- I ши и мильное значения функции и масштаб по оси у. 11рн выводе графиков необходимо определить: 1) направ- f « и координат графика; 2) масштабы по осям х и у. м< н< ею графики функции у строятся при изменении ' \ с постоянным шагом н представляются дискрет- Й* • н-ниями функции, изображаемыми на графике с по- ». к 1кок>-либо символа, например «*». Выводятся точки |«а . । и 1 <кран дисплея нлн АЦПУ по строкам, начинай • ( hi Поэтому в качестве положительного направлении • . «< ivcr выбрать перемещение бумаги АЦПУ или ин- ни.......... экране, т. е. сверху вниз. В качестве положи- II nip чтения оси у целесообразно выбирать направ- ив* 11>11/1«-иия по строке, т. е. слева направо. При выборе масштабов необходимо стремиться к тому, • I । р 1«|>ик размещался в отведенном для него поле. На- • и i in размещения графика на экране дисплея выделим и» А/ 20 строк по И/=60 позиций в каждой строке. I». • • .1 им ильное число значений аргумента х не должно ......... 20: 55
N— 4-1C20. Для определения масштаба по оси у необходимо inn- область ее изменения, т. е. наибольшее ytnax и наимспык- • t/min ее значения. Область изменения функции не должи* превосходить W позиций в строке: откуда где Му — масштаб по оси У. Тогда иомер позиции в строке, где должна расии -4 гаться точка, соответствующая значению функции yt, мол Н определить по формуле = (й — й™)1+ 1- Положение оси X на графике можно найти, приняв у\ - 1и т. е. ось X расположена в позиции п0 = ]—1 'I ось X расположена правее точки «/nijn на число / позиций, а для — левее точки t/rairi и выходит за н«. • чертежа, так как в первой позиции располагается зиачгшЛН Если необходимо, чтобы ось X находилась в поле грлфи ка, то следует считать областью изменения функции у ииьр вал от 0 до для положительной функции и от r/m)n до О i Я отрицательной функции. Это надо учитывать при выб< р- масштаба Му. Поскольку расстояние между позициям* в строке в 2—2,5 раза меньше, чем расстояние между стр< км ми, то при выборе масштабов следует учитывать эту от бениость, если необходимо иметь одинаковые линейные (i метрические) масштабы по обеим осям. Это особенно взжш| при вычерчивании фигур, так как в противном случае ки « рат, например, будет выглядеть прямоугольником, a Kpyi эллипсом (в программе не учитывается). Для решения можно использовать два способа 1. В цикле вычисляются значения функции, опреде j и i ся номер позиции в строке, соответствующий значению фуии ции у, и осуществляется печать в этой позиции символа ♦♦ Для использования этого способа необходимо зиать грапнч иые значения функции. 2. В цикле вычисляются значения функции, которые »i писываются в массив, и определяются максимальное и мини мальиое значения этой функции. После окончания ции.и 56
ши гея масштаб В другом цикле для каждого значении пинии находится позиция fa, в которой следует располо- ii. < имвол «*». Строится образ строки. Для этого в массив, ' I.тонный символами «lj», записывается на место эле- । • номером щ символ «*» и выводится иа печать со- . и мое этого массива. Можно строить образ всего графи- Hiijl 1 необходимо символ «♦» располагать в тех позициях ||и । м 1Трицы, которые соответствуют значениям функции у. И» пользуя второй способ решения, получим алгоритм, । । которого представлена иа рис. 1.35. Блок 3 задает значения уггах и ^min. Блок 4 задает начальное номера строки i и вычисляет количество строк b км 5—10 организуют цикл, в котором вычисляются <> ши функции и находится упг* и ^min. Блоки 11 и 12 под- I... пшают массив MAS, записывая в него символы «lj». и ♦ и 1.1 вычисляет масштаб Му. Блок 14 открывает цикл, »»-1<||><>м для каждой строки находится номер позиции fa к •. /5), осуществляется запись в Д-ю ячейку массива IS . 1мвола «*» (блок 16), выводится на печать (блок 17) । • MAS (строка символов) и восстанавливается массив S ьлок 18). |>ш 4. рассмотренный в примере 1.28, является основой для алгоритмов решения задач 1 115—1.118. Задачи дли решения I Н5 Построить график функции заданной матрицей . N । । к* N — число значений функции. В первом столбце к, । расположены значения аргумента, во втором столб- । hi тения функции. I 1111. Построить в одинаковом масштабе график двух null //i — sin х и у2—cos х при изменении аргумента х от it- ( i < шагом Ах. • » 11 Для условия задачи 1.115 построить график с вы- I- || iHiicM осей координат. I Ни. Построить графики трех функций «д, у2, у$, за- I- м нрицей Y (3, N), где N — количество значений hi Аргумент изменяется от Хо до хт с шагом h. В пер- м рои н третьей строках матрицы Y расположены соот- || ..... функции t/|, у2 и ys. Требуется: । роить все графики в одном масштабе по у, « i роить все графики в разных масштабах, исходя <н изменения значений дли каждой функции; । и- ipoHTb графики всех функций в одних осих ко- 57
Рис. 1.35
Пример 1.29. Построить изограмму функции 2= > (Ч \-х2 — у2 4-0,6) при изменении х и у от —3 до 3. Изо- I|«mmv разместить иа поле размером А%А, где А — и мм. Линейные масштабы по осям — одинаковы. Н< i имина z является функцией двух аргументов. По- h. ... [рафик такой функции можно в трехмерном про- .• ни1. чего нельзи реализовать на бумаге печатающего |bi|i*Hit iH.i или экране дисплея. Поэтому для изображения 11 'hi'11 функции используем способ, применяемый при со- iuiihiiiiii рельефных географических карт. Сущность его о- iti'i и*гея в том, что на карте точки, имеющие одинаковую м. । v инд уровнем моря, соединяются кривыми (изолииия- Н । шых цветов. При этом весь диапазон изменения высо- II» р . «бпиается иа п уровней. Чем больше высота, тем более 4» «hi ill цвет используется дли построения изолиний. В про- ги Jun м случае для черно-белых дисплеев и АЦПУ уровни фении <бозиачить различными символами, например цифра- • » и I. . , 9. Чем больше высота, тем большей цифрой она фиш и н*тси. Ось X направлена вниз, а ось У — вправо. Минимальное значение шага изменения аргумента х рав- »« р к i пинию между строками на экране (илн при печати), • нмним мьиое значение шага изменения аргумента у равно * • i пинию между позициими в строке. Пусть для выбранио- |р(Н!ства расстояние между строками равно 4,233 мм, ) ш • iy позициями в строке — 2,1167 мм. Масштабы по ' н । IM х и у одинаковые и равны При >том шаг изменения аргументов х и у, соответствую- i4«ill минимальному расстоянию между символами, 1 =0,21167; Ду=-^^-=0,10587. • О ’ у 20 •Im н> символов, печатаемых на одной строке, равно । • .1167=57. lb-л in часть заданной функции z изменяется от 0 до 9, • можно выводить непосредственно значения z. Схема • и ipiiiM.i решения представлена на рис. 1.36. I । внутреннем цикле вычисляются и записываются I . ин Z все значения функции при изменении аргумента 1 до 3 с шагом Ду. После окончания этого цикла выво- п । и । печать весь массив (вся строка чертежа, представ- 4«ini «и и символьной форме). Во внешнем цикле этн действия и ирпннся дли различных значений аргумента х. 59
Рис. 1.36 В общем случае, к«н ii вычисленные значения фу и и цни изменяются в более шн роком (или узком) диаиин не, выбирается масштаб иф переменной z Я“и/(гт.х-2ш.п) так, чтобы величина луч ала целые значения н ин тервале от 0 до п, где и J число уровней. Пример 1.30. Построим гистограмму распределении по п классам случайных «ш сел из диапазона [а, 6]. ( л , чайные числа сведены J массив X (200). Длина каж м го класса Z = (ft —а)/п. Опр едел ить кол нч сс i в • чисел, попадающих в каж класс. Эти количества ||| писать в массив Т размер i • Гистограмма предел ляет собой изображение м резков, длины которых нр<» порциоиальны tj. Для каж о«- го элемента массива tj опр делить длину kj каж i н столбца гистограммы и н i печатать горизонтальный •] резок, состоящий из kj сим «и лов, например «♦». Для определения длиш* kj необходимо определ in- масштаб гистограммы Число 0,5 прибавлено для округления до ближайшим целого. Знай масштаб М, вычислить длину отрезка kj = ](lt | -|-0,5)Л1[ и вывести на печать kj символов «*». Эти дейишн необходимо повторить в цикле для всех п классов. 60
. (лгоритма представлена на рис. 1.37. । <> > К'гчения распределения случайных чисел по клас- «< >лыуется следующий прием. Вычисляется целая Рис. 1.37 61
X/—a часть от делении —----|-1, которая соответствует ном-у класса, где I — длина класса. Блок 3 открывает цикл, в котором очищается массив I блок 6 — цикл, в котором подсчитывается количество ши в каждом классе. Блоки 9—12 находят /тах. Блок 14 открын ет цикл, в котором для каждого класса определяете i i длина kj н далее в цикле (блоки 16, 17) осуществлю м вывод kj символов «*» в одной строке. После окончания и< >ц ти символов «*» в строке необходимо предусмотреть перги иа новую строку. Алгоритмы, рассмотренные в примерах 1.29—1.30, явН1>1 основой для разработки алгоритмов решения задач 1.119—1.12'* Задачи для решения 1.119. Построить изограмму функции г для примера I 2 I используя в качестве символов не цифры, а буквы алфавшЛ 1.120. Построить изограммы следующих функций: a) 2-cos(x, у); б) z=sln Х-COS в] 2=х—№/12-^/2+ 0,25; г) г—5 — (х + 2)(х4-1)(х— !)(х — 2)—у2. Области изменения значений х и у принять равными 1) [0, 10]; 2) [0; 1]; 3) [0,0,1]. ’ 1.121. Построить диаграмму выпуска автомобилей н« чииая с 1940 г. по настоящее время с интервалом в 5 iri Исходные данные заданы массивом R (10), упорядоченны» м годам. Ширину столбика диаграммы принять равной in < строкам. 1.122. Построить диаграмму выпуска продукции по мг< м цам года (плановую и фактическую) Ширину столбик» in аграммы принять равной трем строкам. В качестве символ • планового показателя взить символ «:», а фактической» -4 символ «*». Если фактический показатель больше планов» Я то столбик диаграммы оформить до планового показаъм^ символом «:», а после планового уровня — символом Если фактический показатель меньше планового, то изобрЛ жеиие столбика оформить до фактического показателя сими* лом «*», а затем до планового показателя — символом «.»
I riAHA 2 ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ БЕЙСИК Ы И ('И К — язык программирования, широко используемый । • .у И))1мтоты и диалогового характера работы в процессе разра- и <1гл.1дки программ на персональных ЭВМ (ПЭВМ). В при- II, » pin*матривается версия языка БЕЙСИК, применяемая на и IM пни ЕС 1840, ЕС 1841, ПРАЙВЕЦ, МАЗОВИЯ и других I1M н|>< । раммно совместимых с ПЭВМ фирмы IBM, функцио- Вф(«<>||<11 в операционной среде АЛЬФА DOC (или MS—DOS), пользователю следует уточнить синтаксис и запись основ* «. . . 11П1рукций версии языка, применяемой в ПЭВМ, которой он I • >1111 н т. ПРОСТЕЙШИЕ КОНСТРУКЦИИ ЯЗЫКА » п|к । гейшим конструкциям языка относятся константы, пере- ♦ • функции и выражения. 1 .Н1ИСИ простейших конструкций и операторов языка МВ»»«||<н1я. прописные и строчные латинские буквы от А до Z, . . а <п <> до 9, специальные знаки: -|- — »/Д.,():;” lj? — # I 9 (или ХД)- li .ua I шты. В языке БЕЙСИК используются целые, веществен- I > । роковые константы. । мне константы — это последовательность цифр, пе- Ь«. . > р<ш может стоять знак плюс или минус. Например, —289; 1»< 0. I шественные константы — числа, имеющие целую » ч юти. Допускается запись вещественных констант в двух 9 -4i основной и с порядком. В первой форме константа имеет „ , al,, отделенную точкой от дробной части. Например,— It , 13.2498 завершающиеся знаком «!», представляют собой ве- ....... константы. Например, 5! —38! 1354879!. )ри ыписи константы с порядком число состоит из мантиссы, основания десятичной системы счисления и порядка, ынисывается по правилам записи констант, представлен- <1 основной форме, или целыми; порядок — по правилам lux констант с количеством цифр не более двух. Например, у . I) 527Е — 6; — 18.943ДЗ. Точность представления ве- * .....ах констант составляет до шести деситичных цифр. ни । гпенные константы с удвоенной точностью (точность co- lb десятичных цифр) имеют те же способы записи, что • - .....на с обычной точностью, только вместо буквы Е для указа- 63
ния порядка используется буква D, а для завершающе!» вместо «!» используется знак #. Например, 0.82£Х); 3.1413'»,,<. •• 143.5#:. Диапазон представления вещественных констант ccxii»«»« 10-38< |л| < Ю+зе. Строковые константы это последовательнойI * бых алфавитно-цифровых и специальных символов длиной, н< н| - m тающей 255 символов; ограничиваются с двух сторон дно Ин.« кавычками. Например: ’’ТАБЛИЦА f (X)”; ’’ПРОСПЕКТ МИРА Д. 6”; ’’M1S11 к * Переменные. Для обозначения имен переменных, массивн11. |> кций служат идентификаторы, представляющие собой комбнн ш«| символов: букв, цифр и точек. Первым символом имени должн i буква. Например: X, TABLE, XWRAt SPISOKADR. Различают переменные простые и с индексами. Простые переменные в каждый момент времени им одно значение, которое хранится в одной ячейке. Простая nepuMi и» обозначается только идентификатором (именем). Переменные с индексами являются элементами сивов. Для хранения каждого элемента массива отводится . ячейка. Переменная с индексами обозначается идентификатором « • сива (именем массива), за которым в круглых скобках через з ши ( записываются индексы. Индекс представляется константой, nipcagi ной или выражением и может принимать целочисленные положи! ные значения и быть нулем. Например, Z (5) означает 5-й эл числового массива Z, Х(/, /)— элемент i-й строки и /-го стиш » матрицы X. Допускается использование одинаковых имен для ирам <41 переменной и переменной с индексами. Например. У; Y (К, 2) различные переменные. • Описание типа переменных. Переменная мож>-1 лучить значение любой константы (целой, вещественной или ( |» - • вой). Указание типа переменной осуществляется добавлением к н> ни переменной символа, определяющего тип переменной: % цг н • • типа, ! и # — вещественного типа с обычной и двойной точит — соответственно, $ — строкового типа. По умолчанию считается переменная вещественного тип i. 11 пример, В %, Х%(Г) — переменные целого типа; В, X (Г) менные вещественного типа; В#, А’#(/) — переменные вещи1««Л йые удвоенной точности; В$, Х$ (!) - переменные строю . « | типа. В языке БЕЙСИК вещественная, целая и строковая перемени! имена которых начинаются с одной и гой же буквы или с fiyi и цифры, представляют собой различные переменные. Наирим-f | переменная Р6 — вещественная, Р6 % — целочисленная, строковая. Массив — упорядоченный по возрастанию индексов п и I переменных одного типа, для хранения которых отводятся послелипь 1 тельно расположенные ячейки памяти. Массив характеризуется иинш идентификатором, количеством измерений (индексов) и верхней i|i« вицей каждого из индексов. 64
111 ii run элементов массива описываются так же, как и пере- . Для описания размерности массивов используется оператор В in-м указывается идентификатор массива и в круглых скобках иные запятыми верхние границы индексов. Например, опера- |ИМ X (20) описывает одномерный числовой массив из Be- к. тих чисел А’(0), X (1), .... Х(20), а оператор • 12, 8) — матрицу целых чисел с максимальным номером и пи и номером столбца восемь. I in в программе используется элемент массива без предвари- ли объявления этого массива в операторе DIM, то такой массив и неявно как одномерный, состоящий из 10 элементов. II l.rii< ик-системах возможна работа с одно- и многомерными | ми до 255 измерений. Элементы одномерного массива по- ihiio располагаются в памяти. Двумерный массив (матри- । ». пил |гается построчно. Элементы многомерных массивов рас- п так. что вначале изменяется самый правый ин- Фуииции. В процессе решения задачи часто возникает необходи- । hi in нслении значений элементарных функций (логарифма, । . • и сытного, экспоненты, синуса и т. д.). Для обращения пн необходимо в выражении записать идентификатор функ- i ipvuiwx скобках — аргумент. Например, S!N(X), ЕХР(Х). ч и го употребляемые функции приведены в табл. 2.1. Аргу- | iiiiiiuiii могут быть константами, переменными, функцией или L.iiiiuMii Описание функций строкового типа приведено Таблица 2.1 »( >1111111 11 Illi Математи- ческое обозначение функции Запись функции в языке БЕЙСИК Примечание Sin х SIN (X) x — в радианах COS X COS (X) To же tg* TAN (X) — arctg x ATN (X) Вычисляется главное значение в интервале <—я/2; +п/2) М »• ни ♦* ««• In x LOG (X) х>0 lg* LOG 10 (X) х> 0 Vx SQR (X) х>0 знак x SGN (X) +1, если х> 0 0, если х=0 — 1, если х<0 ж» Ixl ABS (X) I It I Л и кесев и др. 65
Продолжение i.ifi । Название функции Математи- ческое обозначение функции Запись функции в языке БЕЙСИК Примечашн Целочисленная функция INT (х) Наибольшее щл. превышающее ш i аргумента INT (5.29) есть | INT (-5.29) ли Отбрасывание дробной части FIX (X) FIX (34.67) ecu. Генерирование случайного рав- номерно распре- деленного чис- ла в интервале (0; 1) RND (X) Аргумент х исполу ся для установки генерации случайны сел Выражения. Различают выражения арифметические, сцн.™ и выражения типа отношения. Арифметическое выражение записываетс-i » I мощью констант, переменных, функций, знаков арифметических J раций и круглых скобок. Результатом вычисления значения .i|nn| тического выражения является числовая константа (целая н п< щественная). Знаки арифметических операций: + (сложение), — (иыи* ние), «(умножение), / (деление), Л(возведение в степень). \| I ние нацело), MOD (определение остатка). При делении нацело дробная часть результата отбрасыил< Так, 5\2 есть 2. Операция вычисления остатка (деления по модулю) опрс к I остаток от деления одного целого числа на другое. НапрпЫ) 10 MOD 3 есть I. Сочетание в выражении величин целой и вещественней J вещественный результат. Порядок выполнения операций в выражении задается cicof При отсутствии скобок операций выполняются в порядке ст ipni.. ва: вычисление функции, возведение в степень, умножение или ние, деление нацело, определение остатка, сложение или вы>ии • Операции одного приоритета выполняются последовательно направо Пример 2.1. Записать выражения следующего вид» Математическая запись 0 + In 1 .Зя 4- cos at 2х cos by—3? sin bx 66
I ( lii axy « • . . i. и а языке БЕЙСИК |> 11 I К Ki (1.3*X)4-COS (A*T)) 1.1 r,{H*Y)— 3AT*SIN(B*X) I I ,1 к hSlN0*X*y)) | роковое выражение состоит из строковых констант, »4.|ц||lx н функций. Результатом вычисления строкового выраже- н 11 и строка символов В строковых выражениях использует- • •i>.iiu>i сцепление (конкатенация) строковых значений, обозна- - «• питом «+». Например, запись А$ 4~В$ означает присоеди- нит к концу строки А$. Количество символов результи- > I. кн не должно превышать 255. мы|1 । ж е н и я типа отношения служат для установле- | «•» пп кия между двумя числовыми или строковыми значениями. мшучимы 6 операций отношений; = (равно); ( ) (неравно); > • ин-); < (меньше); > = (больше или равно); < = (мень- । uno). Результат операции отношения принимает значение М • • II 1 и «ложь». • можно выполнение логических операций: NOT — отрицание, умножение (логическое И), OR — сложение, EQV — эквива- п 11р.1вила выполнения логических операций приведены [8}. । iiii.io можно формировать составные отношения или усло- ||<условия а>0 и &>0 можно записать, используя Mini омического умножения AND как (Л>0) AND (В>0), । О или х=2— как (Х = 0) OR (Х=2). Задачи для решения 1аписать следующие арифметические выражения: „ „ а д/sin 2х+cos2 к— In2 (Ьх) , У bt/ftx-b5«2; 2) —1--7--^- ------—-Ю”3; д/аз+е,з+сз I | In (д/х2 — а—0.82) 11 \/r |dn |s3— 11 — д/ls3— 11; х2 - * 1 11 *+ 2Г- > U .• ктисать логические выражения, определяющие «ini. при которых можно вычислять следующие арифме- । m выражения: 67
a) z=l/(x6^3); 6) x = (ft + \/б2 — 4ac)/(2a) при i в) zt— Ыпхц; r) y=algx\ Д) w = lny/(x—y). 2.2. ПРОГРАММИРОВАНИЕ ВВОДА-ВЫВОДА ДАННЫМ Ввод данных возможен в двух режимах — из блока i hi .. и с клавиатуры дисплея в процессе выполнения программы (ди мЯ вый ввод данных). Ввод данных из блока данных. Для ввода данных испил 1.1 оператор READ совместно с оператором DATA. Формат опер ннр^Н пс READ список переменных пс DATA список констант где пс — номер строки текущей программы. В языке БЕЙСИК < нумеруются целыми числами от 1 до 32767 (при работе в ... режиме строки можно не нумеровать). В списке переменных через запятую перечисляются и. стые или индексированные переменные, а в списке кош i — оператора DATA — значения этих переменных. Оператор 111 ТА может содержать любые числовые или строковые станты, допустимые в языке БЕЙСИК. Строковая кош i i«f( заключается в кавычки, если она начинается со знач им пробелов или кончается ими, либо один из входящих и «ц символов — запятая или двоеточие. Например, с помнив операторов IO DATA —20.3,100,"ЛУЧ",ЦИЛИНДР 20 READ Х,А,В*,С$ переменная X получит значение — 20.3; А — значение 100. 14 4 значение ЛУЧ ; — ЦИЛИНДР. Количество и типы переменных в операторах READ ди совпадать с «ислом и типом констант в операторах DATA I) • • эти операторы не обязательно должны быть парными. Наир двум операторам READ может соответствовать один оператор |»А • * 1О DATA -2О.3.1ОО."ЛУЧ”,ЦИЛИНДР 20 READ Х,А ВО READ В$,С$ Оператор DATA — невыполняемый, его можно pacini'i • в любом месте программы до оператора END, завершающей' граммный модуль. При выполнении оператора READ отслеживается текут 11 > • зиция в списке констант оператора DATA. Используя опер RESTORE, можно перейти на начало блока данных и осуши 111 повторное считывание одних и тех же данных. Например: 68
to READ X1.X2.X3 ,O RESTORE TO READ A.B.C 90 DATA 45.3,-28.7.146.28,-51.2,80.5 Vb END I» t • иные получат значения: X2 =-28.7; X3= 146.28; . Ii =—28.7; C =146.28 i|»i> иноный ввод данных (ввод данных по запросу). Он по- ► iiiiniuiii. данные с клавиатуры дисплея непосредственно при , нии lipin раммы в режиме диалога с ЭВМ. Формат оператора: 11’11 Г список переменных in- переменных через запятые перечисляются переменные, пчрых предполагается вводить с клавиатуры дисплея. ||Ш ныне>лнении программы по оператору INPUT на экран дисп- инк я шак «?» и делается пауза в вычислениях. Пользова- , । к |»иости значения переменных, указанных в списке, отде- п ими. Например, в программе записано: INPUT D, А$ । р «нс дисплея появится знак вопроса. Если введем 100, II и1 ||<)3 >» ч pi меппая D получит значение !00, а А$— значение (Р 1 I количество вводимых данных должно строго соответство- ш-ременных в операторе INPUT. Ipii р »боте в режиме диалога с ЭВМ удобно, чтобы и в и I 1ПИ1Д данных сопровождался текстовыми побужда- ли" • *« бтеннями («подсказкой») о том, какую информа- । одимо ввести пользователю. 11<и< казну» можно записывать непосредственно в опе- , INPUT. Например: IO INPUT "ЗАДАЙТЕ НАЧАЛЬНОЕ ЗНАЧЕНИЕ Н";Н П» INPUT "СООБЩИТЕ ВАНЕ НМЯ";Н$ • . । tn мены вывода знака «?» необходимо заменять 1° н< pi- INPUT после подсказки точку с запятой на за- I in шюца строковых констант с сохранением начальных. > цы и промежуточных пробелов, символов пунктуа- п ь тычек внутри константы используется оператор I INPUT. Формат оператора: I 1NI? INPUT [«подсказка»;] строковая перемен- Ныпод данных. В процессе выполнения программы для . • 1.1ННЫХ на экран дисплея используется оператор 11 Формат оператора: 69
nc PRINT список вывода Для вывода данных иа печатающее устройство с 1ул оператор LPRINT, формат которого идентичен опери» вывода данных иа экран PRINT. В списке выводимых данных могут стоять консипц переменные простые и индексированные, строковые или i левые выражения, функции. Элементы списка вывода р«। ляются либо запятой (зонный формат), либо точкой . пятой (компактный формат). При зонном формате каждое значение вывод» в своей зоне (вся строка разделена иа 5 зон по 14 щ ций). Наличие двух запятых подряд приводит к пропу одной зоны. При компактном формате выводимые строю i зиачеиня размещаются подряд, а числовые — через полип Аналогичные интервалы между выводимыми данными соп даются в том случае, если запятая илн точка с запятой 11 в конце списка. Отсутствие этих знаков в конце списк i зывает переход на новую строку. Запятая и точка с зап i могут применяться в операторе PRINT совместно. Оператор PRINT без списка выводит строку про х < В операторе PRINT можно использовать функцию табули i TAB, которая указывает номер позиции в строке. Напри при выполнении оператора 80 PRINT TAB (40); выводится символ «*» в 40-й позиции. (Использование форматного вывода данных с помощью опери PRINT USING здесь не рассматривается). Пример 2.2. Определить вид выводимых данных пр выполнении операторов: IO PRINT "БЕЙСИК","ПАСКАЛЬ" 20 PRINT "БЕИСИК";"ПАСКАЛЬ" На экране будет выведено БЕЙСИК ПАСКАЛЬ БЕЙСИК ПАСКАЛЬ Пример 2.3. Определить вид выводимых данных » выполнении операторов IO DEFTNT А-В го а=5о : в=4о 30 PRINT "СУММА А-ьВ="; А*В, 40 PRINT "СУММА А+Вх“, А+В 50 PRINT ; PRINT 1 PRINT БО PRINT ТАВ(2О);"ТАВЛИЦА",ТАВ|1Б|;"СТАНДАРТОВ" 70
II <краи будет выведено: • ММЛ А+В=90 СУММА А + В=90 (пропуск 3-х строку ТАБЛИЦА СТАНДАРТОВ При выполнении функции позиционирования TAB (15) •и полиция 15, находящаяся левее текущей позиции !»••• -по вызывает переход на новую строку. Задачи для решения I I шисать оператор ввода значений с использованием - > । ипи.тх для следующих переменных: I । 209 </ = 353,429 f=0.00000283 ИВАН ПЕТУХОВ: •i • 15 час 02 мин х1 = понедельник х2 = вторник ... х6=суб- | I I шисать операторы ввода и вывода для следующих ь — иных 39.018 у= 170.249 2=0.1Е—4 (вывод переменных • •пи. вместе с их наименованиями); I площадь круга 6=объем пирамиды с = объем конуса; '1 II поршень d2=шатун */3=втулка г/4 = кривошип; । 0 249Е5 z=l73.24 р= — 0.087 >. I.шисать операторы ввода по запросу анкетных данных • |||.1милия, имя, отчество, год рождения, национальность. | । nu t. вывод введенных значений: а) в зонном формате, »мп па пом формате. • I I шисать операторы для вывода заголовков таблицы; II ОБЬЕМЫ И СРОКИ ВЫПОЛНЕНИЯ РАБОТ ч ♦АРГУМЕНТ Х*ФУНКЦИЯ Q (X)* •----------*-----.—------— ♦----------------* ♦ X * Y (X) * Z (X) * •----------*----------------» — ------------* I] । ************ I ******************** 1 I ( ИМВОЛЫ I ДВОИЧНЫЙ КОД I I ************ I ******************** I I ! Выполнить последовательность операторов: ИЮ INPUT "КАК ВАС ЗОВУТ";Н» ИО INPUT "СКОЛЬКО ВАН ЛЕТ";Н» I и 1HPUT "ГДЕ ВЫ УЧНТЕСЬ”;В» WO INPUT "ВАЛА СПЕЦИАЛЬНОСТЬ В ВУДУЦЕМ";С$ 71
2.8. Написать и выполнить последовательность от |> i ров, обеспечивающих следующий диалог с ЭВМ: КАК ВАС ЗОВУТ ? ? ХХХХ ДОБРОЕ УТРО ХХХХ ! ВЫ РОДИЛИСЬ В МОСКВЕ ? ? ХХХХ КОГДА БЫЛА ОСНОВАНА НАША СТОЛИЦА ? ? ХХХХ 2.3. ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ ЛИНЕЙНОЙ СТРУКТУРЫ Все операторы языка БЕЙСИК подразделяются на выполи мые, используемые для указания действий и порядка их испоин и и невыполняемые, служащие для описания величин, например < ш * тор DIM, DATA. Для записи линейных программ чаще всего ik.ii» । зуются выполняемые операторы: присваивания, ввода, вывода, нова (STOP и END). Оператор присваивания служит для вычисления значении « ражения (арифметического или строкового) и присваивания ei о и ни переменной. Название оператора LET является необязат< л • и может опускаться. Формат оператора: пс [LET] переменная= выражение Операторы STOP и END используются соответственно дл пш останова и завершения выполнения программы. Оператор END «• лжен быть последним в программе, формат его: пс END Оператор STOP приостанавливает выполнение программы и •• завершает ее работу (в отличие от END), он может помет н в любой строке пр стр а м мы. Формат оператора: пс STOP На экран дисплея пользователю выводится сообщение < • нием номера строки останова. Приостанов программы позволяет пользователю вывести и i о ран дисплея значения переменных, изменить их и т. п. После пртн нова программа может быть продолжена с любого оператор • чего следует набрать команду GOTO пс\, где ncj — номер опери к ря продолжения программы. Программа на языке БЕЙСИК состоит из пронумеров.шш . строк. В одной строке можно записать один или несколько ih.hh* няемых операторов, разделив их знаком «:». Например: 50 Z=3.2:fi=A+0.85:Z=A*X—B*SIN (А) Номера строк указывают на порядок выполнения опер in 72
• I 11|»П |>.|ММЫ можно вводить в произвольном порядке, при «••ним и памяти они автоматически упорядочиваются. HpiiMtp 2.4. Составить программу вычисления высот тре- | инк ito сторонами д, Ъ, с, организуя ввод данных из ♦ • иннах и вывод результатов с их наимеиованиями. ‘ । алгоритма решения приведена в примере 1.1 иа I I ншшем операторы в программе в той последова- » || in. и которой они будут выполняться: to 'ВЫСОТЫ ТРЕУГОЛЬНИКА •О READ А,В,С !<) Р~|А+В*С|/2 'F--ПОЛУПЕРИНЕТР IO T-a*SQR(P*(P-A|*(P-B|*(P-C|| • о Н1=Т/А : Н2=Т/В : НЗ=Т/С ВО PRIHT ’НА=":Н1, -НВх-;Н2, -нс=-;нз 70 DATA 5,4.2,3.8 HO END < I. pH;iя строка программы — строка-коммеитарнй, пояс- I» .и и 11качение программы. Комментарий присутствует • распечатке программы пользователя, позволяет • по выделить функциональные части программы, «. ши. их назначение. Н|шм< р 2.5. Составить программу для вычисления мо- >• nut рции, момента сопротивления и площади попере- I । ния для кольца с внешним диаметром D и внутреи- . . •••- !ром do- Для расчета использовать формулы мо- « 11111’рции J, момента сопротивления W и площади pi инн о сечеиня S соответственно: н lipin р 1мме организуем ввод данных по запросу: Г1 Я 141592 INI ti Г “ВВЕДИТЕ ВНЕШНИЙ К ВНУТРЕННИМ ДИАНЕТР"Л>,ЬО I fl«(D*‘4-DO*4|/64 W • I/O H 1*1/ l»(D«-B-DO«DO) iHlkl -НОНЕНТ ИНЕРЦИИ КОЛЬЦА-"^ Г И INI "НОНЕНТ СОПРОТИВЛЕНИЯ КОЛЬЦА-";* it IN Г -ПЛОЩАДЬ ПОПЕРЕЧНОГО СЕЧЕНИЯ-";Б 73
Программы, рассмотренные в примерах 2.4—2.5, могут быть использованы как основа для решения задач |.|—1.8. • Составить и выполнить иа ЭВМ программы для реше- ния задач 1.1—1.8. 2.4. ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ РАЗВЕТВЛЯЮЩЕЙСЯ СТРУКТУРЫ Для нарушения естественного порядка выполнения операторов используются управляющие операторы. Оператор безусловного перехода GOTO исполь- зуется для организации безусловного перехода к строке, номер кото- рой указан в нем. Формат оператора: пс GOTO nci где ncI — номер строки, на которую осуществляется переход. Напри- мер, оператор GOTO 200 передает управление строке с номером 200. Оператор GOTO должен быть либо единственным в строке, либо последним оператором в многооператорной строке программы. Оператор ветвления ON GOTO служит для передачи управления разным строкам программы в зависимости от сложившей- ся в ходе выполнения программы ситуации. Формат оператора: пс ON выражение GOTO список номеров строк где выражение — любое арифметическое выражение или переменная. При выполнении оператора ON GOTO вычисляется значение выражения. Целая часть ею используется в качестве указателя перехода на один из перечисляемых номеров строк в списке. Напри- мер, в случае выполнения оператора ON К GOTO 100. 250, 500 при К=1 переход осуществляется к строке 100, при К=2 — к строке 250, при А = 3 — к строке 500. Если значение переменной или вы- ражения меньше или больше числа элементов списка, то управление передается оператору, следующему за ON GOTO Пример 2.6. Составить программу, которая вычисляла бы в зависимости от вводимого признака п либо периметр р треу- гольника, либо площадь s, либо медианы та, ть, тс. Ввод признака выполнить в диалоговом режиме. Расчетные формулы для решения: прн п=1 вычисляем периметр р—а-\-Ь-\-с; при п=2 вычисляем площадь по формуле Героиа: з=д/Р| (р| —<0(Р| — Ь)(Р1 — с). гда Pi=(“+l>+c)/2; при п=3 вычисляем медианы треугольника по формулам: 74
та=0,5 о2 ; т6=0,5 д/г^+гс2—б2; /пс=0,5 дД^ + гб2—Л Программа имеет вид IO IKPUT "ВВЕДИТЕ СТОРОНЫ ТРЕУГОЛЬНИКА А,В,С",А,В,С 20 PRINT "УКАЖИТЕ ВИД ВЫЧИСЛЯЕМОГО ПАРАМЕТРА" 30 PRINT "ЗАДАНИЕМ КОДА ПРИЗНАКА К " 40 PRIKT "1-ПЕРИМЕТР,2-ПЛОЩАДЬ.З-МЕДИАНН- 50 IKPUT К 60 ОК К GOTO 100,200,300 70 PRIHT "ЗНАЧЕНИЕ К ЗАДАНО НЕВЕРНО" : GOTO 999 60 ’-------------- 1ОО Р=А+В+С : PRIKT "ПЕРИНЕТР=";Р : GOTO 999 200 Р1=(А*В*С|/2 210 S=SQR4P1*(P1-А)*|Р1-В)*(Р1-С)| 220 PRIKT " ПЛОЩАДЬ ТРЕУГОЛЬНИКА=";8 : GOTO 999 ЛОО Х1-2«АяА : Х2=2*« ; ХЗ=2«С«С 310 N1=.5*SQR|X2+X3-A*A) 320 M2=.5*SQR(X1*X3-B»B) 330 M3=.5*SQR|X1+X2-C*C) 340 PRIKT -МЕДИАНЫ РАВНЫ";М1Д12,МЗ 999 EKD Пример 2.7. Период колебаний физического маятника с массой т и моментом инерции Jat подвешенного в точке А, не совпадающей с положением центра масс (точка 0), опреде- ляется выражением 7’==2л где q— ускорение сво- бодного падения; s — расстояние от точки 0 до точки А. Составить программу вычисления одного из параметров: а) момента инерции маятника относительно точки 0 по за- данному периоду Т. Для расчета использовать зависимость J0 = ms ( —s\ б) периода Т по заданному моменту \4я? / инерции Ja. Программа имеет вид 1О 'РАСЧЕТ ПАРАМЕТРОВ МАЯТНИКА 15 Р1=3.141592 20 PRINT "УКАЖИТЕ ВИД ВЫЧИСЛЯЕМОГО ПАРАМЕТРА" 30 PRINT -1-ВЫЧИСЛЕНМЕ МОМЕНТА КНЕРЦМИ" 40 PRIKT "2—ВЫЧИСЛЕНИЕ ПЕРИОДА КО ЛЕБ АН ИИ- 50 IKPUT н 60 PRINT "ВВЕДИТЕ МАССУ «.РАССТОЯНИЕ S ОТ ” 70 PRINT -ЦЕНТРА ТЯЖЕСТИ ДО ЦЕНТРА ПОДВЕСА.УСКОРЕНИЕ G" 60 IKPUT M.S.G 90 ОК К GOTO 100,140 95 PRIKT "НЕВЕРНЫМ ВВОД ЗНАЧЕНИЯ К" : GOTO 160 1ОО PRIHT "ЗАДАЙТЕ ПЕРИОД Т" 11O INPUT Т 120 JO=;M«S«(G»T»T/(4*PI*PI)-S) 75
130 print -нонент инЕРЦМи=-;ао : goto ibo 140 PRINT “ЗАДАЙТЕ НОНЕНТ ИНЕРЦИИ J А" 150 INPUT JA 150 T=2*PI*SQR| JA/(H*G«S)| 170 PRIHT -ПЕРИОД КОЛЕВАНИИ=";Т 180 EHD Оператор условного перехода IF THEN (IF GO- TO) в отличие от оператора GOTO передает управление в зависимо- сти от истинности (или ложности) условия. Формат оператора: пс IF условие GOTO номер строки [ELSE оператор] или пс IF условие THEN оператор [ELSE оператор] где условие — проверяемое условие, записываемое в виде от- ношения арифметического либо строкового; номер строки — номер строки, на которую осуществляется пере- ход, если условие окажется выполненным; оператор — один или группа операторов, разделенных двоето- чием. Если условие принимает значение «истина», то выполняется оператор или группа операторов, следующая за THEN или GOTO. В противном случае выполняется оператор или группа операторов ветви ELSE. Если в операторе опущена ветвь ELSE, то при невыпол- нении условия управление передается строке, следующей за IF. Примеры записи оператора IF: 200 IF C1>L THEN L=Ci ELSE Ci=L 250 IF X>O THEN Y=X*X : Z=1 : H=N+1 340 IF MOB THEN A=5O ELSE A=lO0 500 IF XOY THEN 720 600 IF IOI GOTO 80 После THEN в операторе IF допускается запись следующего условного оператора (вложенные IF), например: 140 IF X>Y THEN IF Х>О GOTO 280 300 IF X>Y THEN IF A>O THEN Y=X*X : K=K+1 ELSE Y=X-»1 : K=-l Пример 2.8. Составить программу вычисления значения функции г=з?/у, где y=sin nx-f-0,5. Если t/=0, то выдать сообщение Z НЕ ВЫЧИСЛЕНО. Г=0 В соответствии со схемой алгоритма (см. пример 1.2, рис. 1.5) программа решения для п=2> и х=2.8 имеет вид 1О 'ВЫЧИСЛЕНИЕ ФУНКЦИИ Z 20 DATA 3,2.6 30 READ N.X 40 Y=SIN|H*X)«-.5 50 IF Y=O THEN PRINT -Z HE ВЫЧИСЛЕНО .Y=O" ; GOTO 999 60 Z=X*3/Y 70 PRINT "Z=";Z 999 END 76
Пример 2.9. Вычислить функцию {sin х, если cos х, если а<х<6; tgx, если х^Ь. В соответствии со схемой алгоритма (см. пример 1.3, рис. 1.6) программа решения имеет вид io PRIHT "ВВЕДИТЕ ЗНАЧЕНИЯ А.В.Х" го input л,в.х 30 IF Х<=А ТНЕИ Z-SINIX) : GOTO ВО 40 IF Х>=В ТНЕИ Z=TAK|X) ; GOTO 60 50 Z=COS(X| 60 PRINT “Z=’;z : EHD Пример 2.10. Составить программу, выполняющую упо- рядочение трех чисел а, Ь, с, таким образом, чтобы после выполнения ее в ячейке с символическим адресом а находи- лось наименьшее число, в ячейке b — среднее, в ячейке с — наибольшее. В соответствии со схемой алгоритма (см. пример 1.4, рис. 1.7) программа имеет вид 1О 'УПОРЯДОЧИТЬ ЧИСЛА А.В.С 20 INPUT "ВВЕДИТЕ ТРИ ЧИСЛА"-.А.В.С 30 IF А<=В GOTO 50 40 50 60 70 ВО Н=А : А=В ; В-Н IF А<=С GOTO 70 Н=А : А=С : С=Н IF В<=С GOTO 90 Н=В ; В=С : С=Н 90 PRIHT "УПОРЯДОЧЕННЫЕ ЧНСЛА";А;В;С ЮО EHD Пример 2.11. Модифицировать программу примера 2.10 таким образом, чтобы она упорядочивала любые тройки чисел, вводимых в диалоговом режиме. Преимущество хорошо разработанной программы состоит в том, что она должна выполняться как для любых значений величин, так и для любого количества исходных данных. Проблему определения конца набора данных можно решить в программе следующим спосо- бом. В качестве конца набора данных задают либо нереальное число- вое значение (например, 1О10 или 999999), если для задачи это недо- пустимые значения числовых величин, либо отрицательные значения физических положительных величин, .indo нулевые значения. Для решаемого примера признаком окончания набора входных данных выберем нулевые значения а, Ь, с. В программу примера 2.10 введем дополнительные опера- торы, выполняющие опрос на конец данных, т. е. проверку выполнения условия а=0, Ь=0 и с=0. Если это условие 77
выполняется, то осуществляется переход яа окончание вы- числений. Если условие ложно, то следует выполнять упоря- дочение чисел а, Ь, с, их печать и переход к вводу новой тройки чисел. Программа имеет вид го ’упорядочить числа а.в.с 30 PRINT "ДЛЯ ОКОНЧАНИЯ ВЫЧИСЛЕНИИ" 40 PRINT "ВВЕДИТЕ НУЛЕВЫЕ ЗНАЧЕНИЯ А.В.С" 50 PRINT : PRIHT 60 INPUT "ВВЕДИТЕ ТРИ ЧИСЛА";А,В,С 70 • ПРОВЕРКА НА КОНЕЦ ВЫЧИСЛЕНИИ SO IF (А=О) AND |В:О| AND (С=О) GOTO 170 90 IF А<=В GOTO 11O 1ОО H=A : A=B : ВгН 11O IF A<=C GOTO 130 1го H=A : A=C : C=H 130 IF B<=C GOTO 150 140 н=в : b=c : c=H 150 PRIHT "УПОРЯДОЧЕННЫЕ ЧИСЯА"-,А;В;С 160 GOTO 60 170 END Программы, разработанные в примерах 2.8—2.11, могут быть использованы как основа для решения задач 1.9—1.22. 9 Составить и выполнить на ЭВМ программы для решения задач 1.9—1.22. Задачи для решения 2.9. Составить программу, которая запрашивала бы ввод числа п, отвергала ненатуральные числа, вычисляла бы №, п3, п4 и печатала эти значения в одной строке таблицы. Условие, определяющее ненатуральное число: п<— 1 или п не равно целой части п. Второе условие можно записать, используя функцию I NT в виде М< >INT(N) 2.10. Составить программу, вычисляющую в зависимости от введенного признака п площадь одной из геометрических фигур: п — 1 — трапеции, п=2 — конуса, п = 3 — усеченного конуса, п — 4 — круга. В соответствии с введенным призна- ком выполнить ввод необходимых исходных данных в диало- говом режиме. 2.5. ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ Возможны три способа организации циклических структур алго- ритмов: 1) цикл «повторять... до» (цикл с постусловием); 78
2) цикл «пока» (цикл по условию или цикл с предусловием); 3) счетный цикл (цикл с управляющей переменной). Схема организации таких циклов представлена на рис. 2.1. /77 < тело цикла ? IF < условие > СОТО т < следующий оператор ? /77 if < условие > then <тело цикла? СОТО т < следующий оператор? WHILE < условие > <тело цикла? Г к следующему оператору I) WEND FOR X = Хо ТО х* STEP й < тело цикла > NEXT л Рис. 2.1
Пример 2.12. Составить программу вычисления и печати значений функции у=а3/(а2+х2) при х, изменяющемся от О до 3 с шагом 0,1. Схема алгоритма решения приведена иа рис. 1.1! при- мера 1.5. Программа имеет вид 5 'цикл с заданный числом повторения 1О 'ТАБУЛИРОВАНИЕ ФУНКЦИИ Y=A*3/(А'2+Х~2) 30 INPUT "ВВЕДИТЕ А";А 40 Х=О ’---------НАЧАЛЬНОЕ ЗНАЧЕНИЕ ПАРАМЕТРА 50 У=АЛ3/(А*А+Х*Х) 60 PRINT ’,X=";X,"y=’‘;Y 70 Х=Х+Л '-------ТЕКУЩЕЕ ЗНАЧЕНИЕ X 60 IF X<=3.Oi THEN 50 90 END Программа получится более компактной и наглядной, если для построения такого цикла (цикла с заданным числом повторений) использовать оператор цикла FOR NEXT (см. пример 2.15). Пример 2.13. Составить программу вычисления значений членов убывающей последовательности х, 2Г’ 31 ’ ' ‘ ’ п! ’ ... до члена, меньшего заданной точности е. Это пример организации итерационного цикла, т. е. цикла с неизвестным числом повторений, в котором число повторе- ний цикла определяется требуемой точностью вычислений. Для организации такого цикла целесообразно использовать структуру цикла «повторять... до» (цикл с постусловием). В соответствии со схемой алгоритма (см. пример 1.6, рис. 1.12) программа имеет вид ю 'итерационный цикл 20 PRINT "ВВЕДИТЕ X Н ТРЕБУЕМУЮ ТОЧНОСТЬ 30 INPUT X.EPS 40 Y-1 : Н=1 50 Y=Y*X/H PRINT 60 H=K+i 70 IF Y>=EPS GOTO 50 80 END "N="; H," Y=";Y Пример 2.14. Вычислить наибольшее положительное чис- ло п, удовлетворяющее условию Зп5 — 690п^7. Программу поиска числа, удовлетворяющего заданному условию, можно реализовать с помощью итерационного цик- ла по условию: 80
lo ’ ПОИСК НАИВОЛЬНЕГО целого 20 ’ УДОВЛЕТВОРЯЮЩЕГО ЗАДАННОМУ УСЛОВИЮ 30 Н=1 40 IF 3*NA5-59O*N <= 7 THEN Н=Н«4 : GOTO 40 50 PRIHT "НАИБОЛЬШЕЕ ЦЕЛОЕ N=’’;H-1 60 END Для организации цикла по условию (цикл «пока») удобно ис- пользовать операторы WHILE и WEND, Первый из иих начинает цикл, а второй — завершает его. Структура такого цикла. WHILE условие оператор \ оператор2 оператор,, WEND Если значение условия — «истина», то выполняются операторы тела цикла. После этого снова проверяется значение условия цикла. Работа цикла завершится, когда значением условия в операторе WHILE станет «ложь». С использованием операторов WHILE и WEND програм- ма примера 2.14 имеет вид 30 К=1 40 WHILE 3»Н"5-Б9О»И <= 7 50 H=N+1 50 WEND 70 PRIHT "НАИБОЛЬНЕЕ ЦЕЛОЕ Н=";К-1 60 END При организации циклов с заданным числом повторений про- грамма получается более компактной и наглядной, если использовать специальные операторы цикла FOR и NEXT. Формат оператора FOR: пс FOR i=aj ТО а2 [STEP п3] где i— управляющая переменная, параметр цикла; С|, а2 — началь- ное и конечное значения переменной (любые арифметические выражения); аз — приращение ее (шаг изменения). По умолчанию «з=1. Операторы FOR и NEXT используются только совместно: опера- тор FOR определяет начало цикла и проверку условия выхода из цикла, когда параметр цикла превысит свое значение, а оператор NEXT — его конец. Формат оператора NEXT: пс NEXT i Выход из цякла можно осуществить двумя способами: 1) естественным, когда цикл выполняется заданное число раз, т. е при проверке обнаруживается, что параметр цикла превысил 81
конечное значение (в этом случае параметр цикла не сохраняет ко- нечного значения); 2) с любого оператора внутри цикла, не дожида- ясь естественного его окончания. Это можно сделать с помощью управляющего оператора GOTO. Пример 2.15. Напечатать таблицу значений аргумен- та х и функции z/(x) = a3/(°2+*2) при значениях х, изменяющихся от 0 до 3 с шагом 0,1. Программа имеет вид 10 ’ЦИКЛ с заданный числом повторении 20 IKPUT “ВВЕДИТЕ А"; А 30 FOR Х=О ТО 3.01 STEP .1 40 Y=A"3/|A*A+X«fX| 50 PRIKT "Х=";Х, "Y=";Y 60 HEXT X 70 EKD Пример 2.16. Определить, что напечатает программа сле- дующего вида: Ю FOR Х=1 ТО IO STEP -1 20 PRIKT "Х=";Х 30 HEXT X 40 PRIHT "КОНЕЦ" : EKD Будет напечатано КОНЕЦ. При первом выполнении опе- ратора FOR проверяется, не вышел ли параметр цикла х за границы заданного интервала (если шаг положительный, то не стал лн он больше конечного значения; если шаг отрицатель- ный, то не стал ли он меньше конечного значения). В данном случае будет обнаружено, что конечное значение уже «поза- ди» и осуществляется выход из цикла. Программы, разработанные в примерах 2.12—2.16, могут быть использованы как основа для решения задач 1.23—1.33. • Составить и выполнить на ЭВМ программы для реше- ния задач 1.23—1.33. 2.6. ОРГАНИЗАЦИЯ ВВОДА-ВЫВОДА МАССИВОВ. ОБРАБОТКА МАССИВОВ Возможны два способа ввода-вывода массивов: I) перечисление переменных с индексами в списке ввода-вывода в операторах READ, INPUT, PRINT. Такой способ применим при малых размерах обрабатываемых массивов; 2) ввод-вывод массивов с использованием оператора цикла FOR. Пример 2.17. Задан массив X—{3,2; 8,5; 20; —40; 8,2). Написать программу ввода и вывода элементов массива. 82
Программа имеет вид Ю DIM Х(5) 20 DATA 3.2.6.5.20.0,-40.0,8,2 30 READ X(1),X(2),X(3).X(4|,X(5) 40 PRIKT X(1),X(2|,X(3),X(4).X(5) 50 KKD Пример 2.18. Ввести 20 элементов массива С в диалого- вом режиме. Программа имеет вид 1О DIM С|2О) 15 PRIKT "ВВЕДИТЕ ЭЛЕМЕНТЫ' 20 FOR 1=1 ТО 20 30 PRIKT I ; 35 IKPUT C(I| 40 КЕХТ I 50 EHD Для ввода-вывода двумерных массивов необходимо орга- низовать два цикла — один внешний, например, по строкам; другой внутренний — по столбцам. Пример 2,19. Ввести по строкам матрицу А(5X3). Это можно выполнить с помощью операторов; IO DIM А|5,3) 20 FOR 1=1 ТО 5 30 FOR J=1 ТО 3 40 IKPUT A(I,J| 50 КЕХТ J 60 HEXT I ИЛИ IO DIH A|5,3) 20 FOR 1=1 TO 5 30 IKPUT A(I.i).A(I.2),A(Ia3) 40 КЕХТ I Пример 2.20. Записать операторы ввода-вывода масси- ва X, состоящего из п элементов (n 100). При работе с массивами переменной размерности необхо- димо зарезервировать память в операторе DIM по макси- мальной размерности, указанной в условии примера. Затем ввести значение п — текущее значение размера масси- ва X и в цикле выполнить ввод элементов массива, указав заион изменения индекса I от I до п. 83
Ю 'ВВОД МАССИВА С ПЕРЕМЕННЫМИ ГРАНИЦАМИ го dim x(ioo) 30 PRIHT "ВВЕДИТЕ Н <= 1ОО " 40 IKPUT Н : PRIHT "ВВЕДИТЕ ЗЛЕМЕНТЫ" 50 FOR 1=1 ТО Н 60 PRIHT I; 7 0 IKPUT Х(1) 60 HEXT I Пример 2.21. Записать операторы вывода матри- цы Х(6Х8) в общепринятом виде с заголовком МАТРИЦА X. Программа имеет вид IO DIM Х(6,6| го ’............... 90 PRIHT "МАТРИЦА X* 1ОО FQR 1=1 ТО 6 НО FOR J-1 ТО в 120 PRIHT X|I,J); 130 HEXT J 140 PRIHT 150 HEXT I Оператор 90 печатает заголовок МАТРИЦА X. Операто- ры 100, НО организуют соответственно циклы по строкам и столбцам. Элементы одной строки матрицы выводятся в од- ной строке экрана, так как в конце списка оператора 120 сто- ит точка с запятой, запрещающая переход на новую строку. После завершения цикла по J выполняется оператор 140, вызывающий переход к новой строке, и далее продолжается цикл по переменной /, т. е. начинается вывод элементов сле- дующей строки матрицы. Пример 2.22. Указать, что напечатает программа следую- щего вида: IO DIM R«(15) 20 FOR Ki=O TO 12 STEP 3 30 R$(K1*1)=*H" : R$(K1*2)="K' 40 R$|K1*3|="P" 60 HEXT KI 60 K=O 70 FOR 1=1 TO 15 80 PRIHT R$(I); : K=K + 1 90 IF K=3 THEN PRIHT s K=O lOO HEXT I MO EHD На печать будет выведено пять строк со словами МИР. Операторы 20—60 формируют массив из 15 символов МИР МИР...МИР. Чтобы выполнить печать по три символа из массива в одной строке, введен счетчик К. Задано начальное 84
значение счетчика К=0 до начала вывода. Так как в конце оператора PRINT (строка 80) стоит точка с запятой, что запрещает переход к новой строке печати, то в одной строке печатается посимвольно три символа. При достижении значе- ния /г=3 выполняется пустой оператор PRINT, обеспечиваю- щий переход к новой строке, и снова задается начальное значение счетчика К=0 и осуществляется переход к печати следующего символа. Задачи для решения * 2.11. Записать операторы ввода значений координат точек Xi, у,, zt (/=1,20). Выполнить в диалоговом режиме ввод координат одной точки одновременно. 2.12. Записать операторы вывода массива Z$, состояще- го из 100 элементов: а) организуя вывод по 20 элементов в одной строке; б) выводя слева перед каждой строкой номер строки. * 2.13. Записать операторы ввода матрицы К(г.Х^) где п<10, т^5. Элементы матрицы вводить по строкам. * 2.14. Записать операторы вывода на печать: а) левой треугольной матрицы А, полагая заданной матрицу А(ЮХ Х?0); б) правой треугольной матрицы А; в) элементов мат- рицы А (в общепринятом виде) и указывая слева номера выводимых строк, а сверху номера выводимых столбцов. Программы, разработанные в примерах 2.17—2.22, могут быть использованы как основа для решения задач 1.34—1.39. • Составить и выполнить на ЭВМ программы для реше- ния задач 1.34—1.39. 2.7. ПРИЕМЫ ПРОГРАММИРОВАНИЯ Вычисления в цикле с несколькими одновременно изменяющимиси параметрами Оператор цикла FOR позволяет задавать закон изменения одно- го параметра. Чтобы задать закон изменения остальных параметров, необходимо использовать операторы присваивания, которые перед началом цикла устанавливают начальные значения, а в цикле вы- числяют текущие значения. Пример 2.23. Составить программу вычисления значения функции z=xyi/(x+yi), где #—элементы массива ¥={«/], Уъ - -., </2о). а аргумент х изменяется одновременно с у, от начального значения а с шагом h. 85
Схема алгоритма решения представлена на рис. 1.13. Программа имеет вид IO DIM Y<2O) го PRIHT "ВВЕДИТЕ МАССИВ Y- 30 FOR 1=1 то го 40 PRIHT I; : IHPUT Y(I) : HEXT I 50 PRIHT "ВВЕДИТЕ А И H" 60 IHPUT A,H 70 X=A 'НАЧАЛЬНОЕ ЗНАЧЕНИЕ X ao FOR 1=1 TO 20 'ЦИКЛ ПО ПАРАМЕТРУ I 90 Z=X*Y(I)/(X+Y<I)} 1ОО PRIHT *X=";X,"Y(";I;">=*;Y(I)>"Z=“;Z 120 X=X+H 'ТЕКУЩЕЕ ЗНАЧЕНИЕ X 130 HEXT I 140 EHD Пример 2.24. Составить программу для вычисления зна- чения функции 1 е-сх/ cos (t — а) при одновременном изменении аргументов / от 2 до 3 с шагом 0,2 и х от I до 2 для а= —2,1. Зададим в операторе цикла FOR закон изменения одного параметра, например t. До начала цикла присвоим х значе- ние 1, а в цикле будем увеличивать это значение на 0,2 при каждом вычнсленнн у. Программа имеет вид 1О А= -2.1 : Х= 1 20 PRIHT " X", " Т", " Y 30 FOR Т=2 ТО 3.01 STEP .2 40 Y=SGR(T+1)»EXP(-A*X*TB 50 PRIHT X,T,Y 60 x=x+.a 70 КЕХТ T 60 EHD Y:SQR(TM)»EXP(-A*X*T}»COS(T-A) PRIHT X,T,Y X = X*.2 Программы, разработанные в примерах 2.23—2.24, могут быть использованы как основа для решения задач 1.40—1.43. ® Составить и выполнить на ЭВМ программы для реше- ния задач 1.40—1.43. Запоминание результатов вычислений Пример 2.25. Составить программу, в которой вычисля- ются н запоминаются значения функции Zi="y(x^4-l)/i, где х, — элементы массива X=(xj, х2, ..., xso)- Для запоминания вычисленных значений Z/ необходимо выделить массив, который следует описать в операторе DIM и результат вычислений определять как переменную с индексом. 86
Программа, реализующая (см. рис. 1.14), имеет вид схему алгоритма IO DIM X(5O),Z(5O) 20 'ВВОД МАССИВА X 30 PRIHT "ВВЕДИТЕ МАССИВ X ПО 5 ЧИСЕЛ В СТРОКЕ" 40 FOR 1=0 ТО 45 STEP 5 50 IHPUT X(I*l),X(I*2),X(I+3),X(I+4),X(I«-5) 60 HEXT I 70 * ФОРМИРОВАНИЕ МАССИВА Z BO FOR 1=1 TO 50 90 Z(I)=SGH((X(I)A2+1)/1) 95 ИЕХТ I 100 'ВЫВОД МАССИВА Z ПО 5 ЧИСЕЛ В СТРОКЕ НО FOR 1=0 ТО 45 STEP 5 120 PRIHT Z(I*-1),Z(I+2),Z(I + 3),Z(I + 4),Z(I*5) 130 HEXT I 140 EHD Цикл ввода элементов массива X н цикл вычисления элементов z< можно было бы объединить — после ввода оче- редного значения х,- сразу вычислять значение Zi. Модернизи- руйте программу, объединив указанные циклы. Пример 2.26. Переписать элементы целочисленного мас- сива N=(ni, «2, .. •, «/.о}, кратные пяти, подряд в массив М. Если такие элементы в массиве N отсутствуют, то выдать соответствующее сообщение. Особенностью решения является то, что индексы эле- ментов в массивах N и М не совпадают. Для фиксации теку- щего значения индекса в массиве М введем счетчнк k, задав ему начальное значение 0. Прн нахождении значения п, эле- мента из массива N, кратного пяти, будем увеличивать зна- чение k на 1. Схема алгоритма решения приведена на рис. 1.15. Программа имеет внд Ю DIM N*Z(4O),MZ(4O) 20 PRIHT "ВВЕДИТЕ МАССИВ Н" 30 FOR 1=1 ТО 40 40 IHPUT НХ(1) 50 HEXT I 60 К=0 70 FOR 1=1 ТО 40 60 IF HZ<I} MOD 5 О О ТНЕИ 1ОО 90 К=К*1 ; МХ(К)=НХ(1) ЮО HEXT I ИО IF К=О ТНЕН PRIHT "НЕТ ЭЛЕМЕНТОВ,КРАТНЫХ 5": GOTO 130 120 FOR J=1 ТО К : PRIHT MX(J), : HEXT J 130 EHD Программы, разработанные в примерах 2.25—2.26, могут быть использованы как основа для решения задач 1.44—1.50. 87
G Составить н выполнить на ЭВМ программы для реше- ния задач 1.44—1.50. Вычисление конечных сумм и произведения Пример 2.27. Составить программу для вычисления зна- 20 чення функции z~ (х?/«), где X/ — элемент массива «=1 Х = (Х1, Хг, . . . , Х2о}- Схема алгоритма решения представлена на рнс. 1.16. Видоизменим алгоритм, организуя в цикле ввод текущего значения элемента массива xt и накопление суммы z. Программа имеет вид tO DIM Х(2О) go Z=O 'НАЧАЛЬНОЕ ЗНАЧЕНИЕ СУММЫ 30 ---ЦИХЛ ДЛЯ ВВОДА ЗНАЧЕНИЙ Х(1) И НАКОПЛЕНИЯ Z 40 FOR 1=1 ТО го 50 PRTHT "ВВЕДИТЕ Х(";1; 60 IHPUT Х(1) 70 Z=Z+X(I)A2/2 80 HEXT I 90 PRIHT "СУМНА=";г tOO EHD Пример 2.28. Составить программу вычисления п!: п! = О, если пСО; I, если п = 0; 1-2-3-.. ,-п, если п>0. Выполним в диалоговом режиме ввод значения п. В ка- честве признака конца набора данных примем значение п = =999. Затем организуем ветвление вычислительного процес- са на три ветви в зависимости от значения п. Если п<0, то результату следует присвоить значение 0, осуществить пе- чать результата и ввести новое значение п. Если п=0, то результату следует присвоить 1 и также осуществить переход на печать результата и ввести новое значение п. Если п>0, то будем накапливать произведение f = 1 -2-3-.. ,-п, для чего перед циклом зададим начальное значение f=l. Организуем цикл по переменной i, задав закон ее изменения от 1 до п. В цикле будем накапливать произведение, исполь- зуя оператор присваивания F~F*1. После окончания цикла осуществляется печать накопленного произведения и переход на ввод нового значения п. 88
Программа имеет вид 1О •==.=====ФАКТОРИАЛ N5 20 PRIHT "ДЛЯ ОКОНЧАНИЯ ВЫЧИСЛЕНИЯ ВВЕСТИ Н=999" 30 INPUT "ВВЕСТИ N";N 40 IF И=999 GOTO ЮО 50 IF И<О THEN F=O : GOTO ЮО 60 IF Н=О ТНЕН F=i : GOTO ЮО 70 F=1 ВО FOR 1-1 ТО И : F=F*I : ИЕХТ I 90 PRIHT "QAKTOPHAH=";F : GOTO 30 ЮО END Программы, разработанные в примерах 2.27—2.28, могут быть использованы как основа для решения задач 1.51 — 1.63. g Составить н выполнить на ЭВМ программы для реше- ния задач 1.51 —1.63. Вычисление суммы членов бесконечного ряда с заданной точностью Пример 2.29. Составить программу вычисления членов бесконечного ряда V4 w+ -= -,+.S'-,rw с точностью до члена ряда, меньшего заданной точности в. Программа, реализующая схему алгоритма (см. рнс. 1.18), имеет вид 10 'СУННА ЧЛЕНОВ БЕСКОНЕЧНОГО РЯДА 20 PRINT "ВВЕДИТЕ X И ТОЧНОСТЬ EPS" 30 INPUT X.EPS 40 «ЗАДАНИЕ НАЧАЛЬНЫХ ЗНАЧЕНИЯ ЧЛЕНА РЯДА Y, 50 * СУННЫ Z, НОМЕРА N 60 Y=1 : Z=1 :Н=1 70 Y=Y*{-X*X)/(2*N*(2*N-1)) 90 Z=Z>Y : N=N+1 ЮО IF ABS(7) > EPS THEN 70 'ТОЧНОСТЬ ДОСТИГНУТА? 1Ю PRIHT "СУММА РЯДА =";Z 120 END С нспользованием операторов цнкла по условию WHILE н WEND программа имеет внд 20 PRINT "ВВЕДИТЕ X И ТОЧНОСТЬ EPS" 30 INPUT X, EPS 60 7=1 : z=l :и=1 65 WHILE ABS(Y) > EPS 70 Y=Y*(-X*X)/(2*N»(2*N-1)) 89
90 Z=Z+Y : H=-H*l too VETO 110 PRINT "СУННА РЯДА =.“;Z 120 EHD Программа, разработанная в примере 2.29, может быть исполь- зована как основа для решения задач 1.67. ® Составить н выполнить на ЭВМ программы для реше- ния задач 1.67, а — ж. Вычисление непрерывных дробей Пример 2.30. Составить программу вычисления дроби с точностью в: Целесообразно непрерывную дробь свертывать снизу вверх Проще вместо многоточия поставить 1, сложить ее с едини- цей, стоящей слева, вычислить обратную величину и снова прибавить 1. Обозначим это вычисленное значение Zi. Далее вычислим новое значение zi, взяв обратную величину от Z\ и прибавив 1. Основная идея решения основана на сравнении двух значений Zj nz%. Если \z%—Zil >£, то требуемая точность не достигнута и следует перейти к вычислению нового значе- ния, предварительно присвоив Zi значение Zg. Итак, в цикле продолжаем вычисления до тех пор, пока |z2— Zil достигнет значения, меньшего требуемой точности вычисления. Программа имеет вид Ю •----ЗОЛОТОЕ СЕЧЕНИЕ 20 IHPUT "ВВЕДИТЕ ТОЧНОСТЬ EPS";EPS 30 * Zi-ПРЕДНДУЩЕЕ ЗНАЧЕНИЕ 40 ‘ Z2-HOBOE ЗНАЧЕНИЕ 50 Zl=i+.S 60 Z2=i*l/Zl 70 IF ABS(ZE-Zl) > EPS ТНЕИ Z1=Z2 i GOTO 60 90 PRIHT "ЗОЛОТОЕ СЕЧЕНИЕ =";Z2 1OO EHD Выполнив эту задачу на ЭВМ, получим значение <7=1,618034, называемое в математике золотым сечением. Считается, что отрезок, разделенный на части, отношение которых совпадает с д, обладает особой эстетической привлекательностью. Если в дроби вместо много- точия поставить не 1, а другое начальное значение, то это не скажется на конечном результате. 90
Задачи для решения 2,15. Модифицировать программу примера 2.30 так, что- бы подсчитывалось число итераций, необходимых для вы- числения q с заданной точностью е. Если число итераций превысит т, то выдать сообщение ТОЧНОСТЬ НЕ ДОСТИГНУТА ЗА т ИТЕРАЦИЙ 2.16. Составить программу для вычисления с точностью €=10"6: а) золотого сечення q (см. пример 2.30), используя пред- ставление q в виде бесконечного корня. Вычисление полиномов и их производных Пример 2.31. Составить программу вычисления значения полинома по схеме Горнера: у=2х‘—х6+4х5— 5хЕ -| 6x 4 I. Схема алгоритма вычисления полинома п-й степени при- ведена на рис. 1.19. Коэффициенты полинома представим массивом (2; 0; —1; 4; 0; 0; —5; 6; 1), состоящим из девяти элементов. Порядок полинома п=8. Для х=1,2 программа имеет вид Ю 'ВЫЧИСЛЕНИЕ ПОЛИНОНА ПО СХЕМЕ ГОРНЕРА 20 DIM А<9) 25 DATA 6,1.2 30 DATA 2,0,0,-1,4,0,0,—5,6,1 40 BEAD И,Х 50 FOR 1=1 ТО Н+1 : READ A(I) :НЕХТ I 60 Y-A(l) 'НАЧАЛЬНОЕ ЗНАЧЕНИЕ ПОЛИНОМА 60 FOR 1=2 ТО Н*1 90 Y-Y«X*A(I) : HEXT I 1ОО PRIHT ’ЗНАЧЕНИЕ nOHHHOHA=";Y HO EHD 91
Программа, разработанная в примере 2.31, может быть исполь- зована как основа для решения задач 1.68—1.72. ® Составить н отладить на ЭВМ программы для реше- ния задач 1.68—1.72. 2.17. Вычислить для полинома примера 2.31: а) первую производную у' (х); б) первую и вторую производные — '/'(х), у" (х). Нахождение наибольшего и наименьшего значений функции Пример 2.32. Составить программу вычисления наимень- шего значения функции у=а e~bx sin (<dx <р) в интервале изменения аргумента х от 0 до с с шагом h. Схема алгоритма решения представлена на рис. 1.21. Программа имеет вид Ю •---НАИМЕНЬШЕЕ ЗНАЧЕНИЕ ФУНКЦИИ Y=F(X) 20 PRIHT "ВВЕДИТЕ КОЭФФИЦИЕНТЫ A.B.W.F" 30 IHPUT A.B.W.F 40 PRIHT "ВВЕДИТЕ ДИАПАЗОН ИЗМЕНЕНИЯ X И ШАГ" 50 IHPUT С,Н 60 Yi=lE+49 ’-НАЧАЛЬНОЕ ЗНАЧЕНИЕ НАИНЕНЬИЕГО 70 FOR Х=О ТО С STEP Н 60 7=А*ЕХР(— B*X)mSIH(W«X+F) z PRIHT X, У 90 IF Y<Y1 THEH Yi-Y 1OO HEXT X HO PRIHT "НАИНЕНЬИЕЕ ЗНАЧЕНИЕ =".Y1 120 EHD Пример 2.33. Составить программу, вычисляющую эк- стремальное значение функции у= |o|efcA+cx2 при изменении аргумента х от 0 до 4 с шагом h. Функция такого вида имеет один экстремум: при 0-0 — минимум; при с<0 — максимум. Схема алгоритма решения приведена на рис. 1.22. Программа имеет вид Ю ’-------ЭХСТРЕНАЛЬНОЕ ЗНАЧЕНИЕ ФУНКЦИИ 20 PRIHT "ВВЕСТИ КОЭФФИЦИЕНТЫ А.В.С И ШАГ Н" 30 IHPUT А.В.С.Н 40 ‘------ПРОВЕРКА ЗНАКА С -ВИД ЭКСТРЕМУНА 50 IF ОО THEH Н-i ELSE К=-1 60 Yi=H»iE+19 ’-НАЧАЛЬНОЕ ЭКСТРЕМАЛЬНОЕ ЗНАЧЕНИЕ 70 FOR Х=О ТО 4.01 STEP Н ao Y~ABS(A)*EXP(B*X+-C»X*X) : PRIHT X.Y 90 IF H*Y< H*71 THEH Yi=7 : GOTO 11O 1OO IF H»Y>=H»Y1 GOTO 120 HO HEXT X 120 PRIHT "ВИД ЭКСТРЕНУНА=";Н ,"ЭКСТРЕИУМ=";У1 130 EHD 92
Программы, разработанные в примерах 2.32—2.33, могут быть использованы как основа для решения задач 1.74—1.78. в Составить н отладить на ЭВМ программы для реше- ния задач 1.74—1.78. Нахождение наибольшего н наименьшего в массиве Пример 2.34. Составить программу нахождения наиболь- шего элемента массива Х=[хц хг, - •, и его порядкового номера. В соответствии со схемой алгоритма (см. рис. 1.23) про- грамма имеет вид Ю * НАИЕОЛЬИИИ ЭЛЕМЕНТ ХНАХ.ИНДЕКС-КМАХ 20 DIM Х(4О) 30 PRIHT "ВВЕДИТЕ ЭЛЕМЕНТЫ МАССИВА—ПО 5 ЧИСЕЛ " 40 PRIHT " В КАЖДОМ СТРОКЕ" 50 FOR 1=0 ТО 35 STEP 5 60 IKPUT X(I+1),X(I+2),X(H-3),X(I + 4),X(I + 5) 70 HEXT I GO XHAX=X(1) : НИАХ11 90 FOR 1=2 TO 40 WO IF X(I)>XMAX ТНЕИ XMAX=X(I) : HHAX=1 11О HEXT I 120 PRIHT "НАИБОЛЬНЕЕ=";ХМАХ,"ИНДЕКС=-Д1МАХ 130 EHD Программа, разработанная в примере 2.34, может быть исполь- зована как основа для решения задач 1.79—1.80. g Составить и выполнить на ЭВМ программы для реше- ния задач 1.79—1.80. Уточнение корней уравнений Пример 2.35. Составить программу вычисления наимень- шего положительного корня уравнения х—tgx = O с точно- стью е методом итераций. Начальное значение корня рав- но 4,7. В соответствии со схемой алгоритма (см. рис. 1.24) про- грамма имеет вид 1О •---МЕТОД ИТЕРАЦИИ 20 ’ XO НАЧАЛЬНОЕ,XI---УТОЧНЕННОЕ ЗНАЧЕНИЕ КОРНЯ 30 ХО=4.7 : Р1=3.141592 40 Х1=АТК(ХО)+Р1 50 IF ABS(Xl-XO)>.OOOOi THEH ХО-Х1 : GOTO 40 60 PRIHT "ЗНАЧЕНИЕ КОРНЯ =";X1 70 EHD Пример 2.36. Составить программу вычисления корня г 3 г методом половинного деления уравнения x-J-yx-f- \х—2,5= = 0 на отрезке [0,4; 1] с абсолютной погрешностью е=10~4. 93
В соответствии со схемой алгоритма (см. рис. 1.25) про- грамма имеет вид 1О ' = = МЕТОД ПОЛОВИННОГО ДЕЛЕНИЯ = - = = 20 А =• . 4 : В = 1 : EPS = . OOOl 30 Fl = А + SGR(A) + Ал (1/3) -2.5 40 F2 = В + SQR1B) ♦ ВА (1/3) -2.5 50 IF Fl» F2 < О GOTO 80 50 PRIHT " ОШИБКА В ЗАДАНИИ ИНТЕРВАЛА А К В ". А: В 70 GOTO 999 60 X х (А + В)/2 90 F3 = X + SOR(X) + ХА (1/3) -2.5 1ОО IF F3 = О GOTO 140 110 IF F1*F3 < О THEM В = X :GOTO 130 120 А = X s Ft = F3 130 IF ABS (B - A) > EPS GOTO 60 140 PRIHT " КОРЕНЬ = "; X . - F(X) = F3 999 EHD Программы, разработанные в примерах 2.35—2.36, могуг быть использованы как основа для решения задач 1.81—1.85. в Составить н выполнить на ЭВМ программы для реше- ния задач 1.81 —1.85. 2.8. ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ СО СТРУКТУРОЙ ВЛОЖЕННЫХ ЦИКЛОВ Структура правильно организованного вложенного цикла с ис- пользованием оператора FOR может иметь вид r^F0R^1= ••• ^FOR^~I = ... -NEXT^ I • NEXT^ 3 -NEXT^X Каждому оператору цикла FOR должен соответствовать опера- тор NEXT. Области действия циклов перекрываться не должны. Внутренний цикл целиком должен содержаться в теле внешнего цикла. Обрашение из внешнего цикла разрешается только через заголовок цикла. 94
Пример 2.37. Составить программу вычисления суммы положительных элементов каждой строки матрицы А (10X8). Схема алгоритма решения приведена на рис. 1.26. Программа имеет вид IO DIH А(1О,8) 20 PRIKT ” ВВЕСТИ И АТРИЦУ ПО СТРОКАМ - " 25 PRINT " 4 ЧИСЛА В ОДНОЙ СТРОКЕ •• 30 FOR I s 1 ТО 1О 40 IKPUT A(I,1),A(I,2),A(1,3).A(I,4) 45 IKPUT A(I,5),A(I,6),A(I,7),A(I,8) 50 NEXT I 00 • - = ВНЕИНИИ ЦИКЛ ПО СТРОКАМ TO FOR T = 1 TO IO 60 S = О 90 ’ = = ВНУТРЕННИЙ ЦИКЛ ПО СТОЛБЦАМ ЮО FOR J = 1 ТО 8 НО IF Afl.J} > О ТНЕН S = S ♦ A(I.J) 120 NEXT J 130 PRIHT "СТРОКА"; I, “СУММА = S 140 KEXT I 150 EKD Пример 2.38. Составить программу упорядочения эле- ментов массива X={xi, х-г, Люо}> расположив их по воз- растанию в том же массиве. В основу алгоритма решения положим многоэтапный поиск и размещение на левом краю массива наименьшего значения. На первом этапе найдем наименьший элемент из полного массива и сделаем перестановку найденного эле- мента с первым элементом массива. На втором этапе найдем номер наименьшего элемента из укороченного на один край- ний левый элемент массива н выполним перестановку най- денного элемента с первым элементом укороченного массива. Многократное выполнение этой процедуры, а именно 99 раз, приводит к упорядочению массива. Схема алгоритма решения представлена в примере 1.20 на рнс. 1.27. Программа имеет внд 1О • = = = УПОРЯДОЧЕНИЕ ЭЛЕМЕНТОВ МАССИВА 20 • ПО ВОЗРАСТАНИЮ ИХ ЗНАЧЕНИИ 30 DIM Х(ЮО) 40 FRIKT ’ВВЕДИТЕ МАССИВ ПО 5 ЧИСЕЛ В СТРОКЕ ’ 50 FOR I : О ТО 95 STEP 5 60 IKPUT X(I»l),X(It2),X(I+3),X(i+4),X(I»5) 70 HEXT I 60 FOR К = 1 TO 99 ’ - = ЦИКЛ ПО ЭТАПАМ 90 Xi = X(X) : К - К 1OO FOR J = К + 1 ТО ЮО ' = = ОТЫСКАНИЕ НАКИЕНЬНЕГО 1Ю IF X(J) < Xi THEM X1=X(J) : И = J 120 HEXT J 95
130 Х(Н) = Х(Х) * - = =- ЗАПИСЬ НАИНЕНЬИЕГО 140 Х(К) - XI • = s я В ЛЕВОЙ ЧАСТИ МАССИВА 150 НЕХТ К 160 PRIHT "УПОРЯДОЧЕННЫЙ МАССИВ X " 170 FOR I = 1 ТО 1ОО 1ВО PRIHT Х(1); 190 HEXT I 200 ЕИР Пример 2.39. Упорядочить элементы массива Х={хь Х2, ..хц>о), расположив их по возрастанию в том же массиве. В основу алгоритма положим метод поиска, идея которо- го изложена в примере 1.21. Схема алгоритма, реализующая указанный метод, приведена на рис. 1.28. Программа имеет вид 10 ‘ УПОРЯДОЧЕНИЕ ЭЛЕМЕНТОВ МАССИВА 20 DIH Х(1ОО) 30 ' = = ВВОД МАССИВА X = = - 35 ’................................ ао FOR К = 1 ТО 99 90 FOR I s 1 ТО 1ОО 1OO IF Х<1) < Х(К) ТНЕН Y = Х(К» : Х(К) 110 ИЕХТ I 120 НЕХТ К 130 ' ПЕЧАТЬ УПОРЯДОЧЕННОГО МАССИВА 135 •........................... ... 160 EHD X(i) : X(i) =. у Пример 2.40. Составить программу вычисления с точно- стью е=0,01 значения аргумента, при котором функция у— 0,2 do 10. Алгоритм решения представлен на рнс. 1.29. Программа имеет внд Ю • = = = ВЫЧИСЛЕНИЕ ЭКСТРЕМУМА ФУНКЦИИ го • с заданной точностью 30 PRIHT " ВВЕДИТЕ КОЭФФИЦИЕНТ А " 40 IHPUT А 50 Н =.2 : х=.г 60 Y1 = 1Е4-19 TO FOR 1 = 1 ТО 51 60 7 г А«х - LOG (X) 90 IF Y < Yl ТНЕН Y1=Y : Х1=Х : Х=Х+Н : НЕХТ I 1ОО IF Н>.О1 THRH Х=Х1-.г : Н=.О1 : GOTO 60 НО PRIHT - МИНИМАЛЬНОЕ ЗНАЧЕНИЕ АРГУМЕНТА - XI 120 PRIHT " ИНИЦИАЛЬНОЕ ЗНАЧЕНИЕ ФУНКЦИИ = ; Y1 130 ЕНО 140 EHD Пример 2.41. Составить программу вычисления интеграла г In2 х z=\------------dx । x 96
методом трапеций с точностью е = 0,001. Методика решения изложена в примере 1.23. В соответствии со схемой алгоритма (см. рис. 1.30) про- грамма имеет вид 10 *—ИЕТОД ТРАПЕЦИИ С МОДИФИКАЦИЕЙ ВЫБОРА НАГА 20 IRPUT "ВВЕДИТЕ НАЧАЛЬНОЕ ЗНАЧЕНИЕ N>2";N 30 EPS=.OO1 : А=1 -. В-4 : S1=O 40 Yi=LOG(A)A2/A Y2=L0G(B)A2/B 50 S2=(Y1+Y2)« 5 : H=(B-A)/N 60 FOR 1=1 TO N-i 70 Х=А + 1*И : S2 = S2+LOG(X)A2/X BO NEXT I 90 S2=S2»H iOO IF ABS(S1—S2)>=EPS THEN Slt£2 : N=N*2 : GOTO 50 HO PRINT "ЗНАЧЕНИЕ ИНТЕГРАЛА =";S2 120 PRINT “ЧИСЛО ИАГОВ=”; H 130 END Программы, разработанные в примерах 2.37—2.41, могут быть использованы как основа для решения задач 1.86—1.102. ® Составить и выполнить на ЭВМ программы для реше- ния задач 1.86—1.90 6 — г, 1.91—1.102. 2.9. ОБРАБОТКА СИМВОЛЬНЫХ ДАННЫХ Кроме арифметических данных в языке БЕЙСИК можно обра- батывать и строковые (символьные) данные — константы, перемен- ные, массивы. Они обрабатываются так же, как и числовые данные, операторами ввода данных READ, INPUT, LINE INPUT, оператора- ми вывода PRINT, PRINT USING, операторами присваивания. Над строковыми переменными можно выполнять операции сравнения, операции объединения (слияния) [8]. Бейсик-системы содержат набор строковых функций, позволяю- щих выделить цепочку символов из строкового выражения, найти слово, часть слова, букву, цифру или другой символ в строковом массиве. При описании функций обработки строковых данных х означает любое числовое выражение, х$ и у$ — любые строковые выражения, а п и т — выражения пел ого типа. Функция LEN (х$) определяет количество символов в строковой переменной или константе. Например, при выполнении оператора 50 PRINT LEN ("КИБЕРНЕТИКА”) на экран будет выведено число 11. Функция INSTR ([«], х$, у$) осуществляет поиск подстроки в строке х$, начиная с символа п строки х$. Обнаружив под- строку у$ в строке х$, она возвращает номер первого символа строки Если п не задано, то поиск начинается с первого символа. 4 В. Е. Алексеев и др. 97
Значение функции: либо целое число — номер позиции начала вхождения; либо 0 — если строка не найдена, либо п — если уф является пустой строкой. Например, при выполнении операторов 60 K=ISSTR(1. "КИБЕРНЕТИК А", "БЕРН”) 70 PRIHT X будет выведено число 3. Функция LEFT# (х$, п) выделяет п левых крайних симво- лов строки хф. Функция RIGHTS (хф, п) выделяет п правых крайних сим- волов строки хф. Функция M1DJ? (хф, n[,m]) выделяет подстроку в т симво- лов. Если параметр т опушеп или количество символов в строке справа от символа п меньше, чем т. то выделяются символы, начиная с символа п до конца строки. Если т=0 или значение п превышает длину строки, то результатом выполнения функции будет пустая строка. Например, при выполнении оператора во prist нн>$("кибернетика-,з,4) будет выведено на экран БЕРН Пример 2.42. Написать программу, которая хранит при- веденные ниже данные о результатах сдачн экзаменов по четырем предметам группой студентов, состоящей из 20 чело- век. Напечатать ведомость оценок н средний балл. Для хранения фамилий студентов выделим строковой массив из 20 элементов. Оценки занесем в числовой мас- сив Z (20, 4). Программа имеет вид Ю •— ПЕЧАТЬ ВЕДОМОСТИ ОЦЕНОК 20 DIM F$(2O).Z(2O,4> : S=O 30 PRINT "ВВЕДИТЕ ФАМИЛИИ СТУДЕНТОВ И ОЦЕНКИ" 40 FOR Irl ТО 20 50 PRIHT "НОНЕР"}!, 60 IHPUT F$<I),Z(I,i).Z(I,2),Z(I,3),Z(I,4) 70 FOR J=1 TO 4 'НАКОПЛЕНИЕ СУННЫ eo S-S+Z(I,J) ' HEXT J 90 NEXT I 1OO PRIST ТАЕ(5);"ВЕДОНОСТЬ ОЦЕНОК" HO FOR 1=1 TO 20 120 PRIHT TAB(5):F$(I):TAB(25};Z(I,1);Z(I,2);Z<I,3);Z(I,4) 130 HEXT I 140 PRIST : PRINT "СРЕДНИЙ ЕАЛЛ=";8/ВО 150 EHD Пример 2.43. Написать программу, которая подсчитыва- ет частоту появления символа А в тексте, состоящем из любо- го числа строк. Признаком окончания входного набора дан- ных считать строку из четырех символов Ф =# =# #. 98
Программа имеет вид IO PRIHT "ДЛЯ ЗАВЕРИЕНИЯ ПРОГРАММЫ ВВЕДИТЕ " 20 PRIHT " СТРОКУ ИЗ 4-Х СИМВОЛОВ #### " 30 К=О •--СЧЕТЧНК СИМВОЛОВ А 40 PRIHT "ВВЕДИТЕ СТРОКУ ТЕКСТА" 50 IHPUT А$ 60 ’—ПРОВЕРКА НА КОНЕЦ ВХОДНОГО ФАЙЛА 70 IF HID$(A».i.4}="####" ТНЕИ 200 60 И1=1 ’-позиция.с которой начинается поиск 90 H-IKSTR(Hl,A$,"a“ ) ’ОПРЕДЕЛЕНИЕ ТЕКУЩЕГО СИМВОЛА. ЮО ’ РАВНОГО А 110 IF Ы=О TH ЕН 40 ’—СИМВОЛ А НЕ ОБНАРУЖЕН .120 IF N=bEN(A«) THEM К=К+1 : GOTO 40 ’СИМВОЛ В КОНЦЕ 130 К=К+1 : H1=N+1 : GOTO 90 140 ’ПРОДОЛЖИТЬ ПОИСК С П1 СИМВОЛА 200 PRINT "КОЛИЧЕСТВО СИМВОЛОВ А Б ТЕКСТЕ:"; К 210 END Пример 2.44. Написать программу, в которой создается шаблон с текстом поздравления. УВАЖАЕМ ... СЕРДЕЧНО ПОЗДРАВЛЯЕМ ВАС С НАСТУПАЮЩИМ НОВЫМ ГОДОМ! ЖЕЛАЕМ ВАМ СЧАСТЬЯ, КРЕПКОГО ЗДОРОВЬЯ, ТВОРЧЕСКИХ УСПЕХОВ И РАДОСТНОГО НАСТРОЕНИЯ! ВАШИ ДРУЗЬЯ. Ввести цифры наступающего года, имена н отчества по- здравляемых и напечатать текст поздравительных открыток. Для создания шаблона открытки сформируем массив, состоящий из семи элементов строкового типа. Каждый эле- мент массива — это строка символов на экране. Введем шаб- лон, т. е. полный текст поздравления (вместо имени, отчест- ва, цифр года можно ввести пробелы). Попросим пользовате- ля ввести цифры наступающего года и занесем их в шаблон в четвертую строку. Введем признак пола — мужчина (М) илн женщина (Ж), имя н отчество поздравляемого. Сформи- руем в соответствии с введенными данными текст шаблона, напечатаем его н перейдем к вводу новых данных. Признаком конца вводимых данных выберем строку, содержащую вместо признака пола символ =#. Программа имеет вид IO DIM А$(7) 20 'ФОРМИРОВАНИЕ ШАБЛОНА ОТКРЫТКИ 30 PRINT "ВВЕДИТЕ ШАБЛОН ПОЗДРАВЛЕНИЯ" 40 FOR 1=1 ТО 7 50 ЫИЕ INPUT A$(I) : NEXT I 60 PRINT "НАСТУПАЕТ НОВЫЙ ГОД —УКАЖИТЕ КАКОЙ" 70 ЫНЕ INPUT С$ 80 • ВСТАВКА ЦИФР ГОДА 4* 99
90 К=1ИБТИ(1,А$(4),"ЩИИ") ЮО B$=LEFT$(A$(4),K+3)+C$+" " МО H=INSTR(1,A$(4),"НОВЫМ") 115 A$(4)=B$+RIGHT$(A*(^).LEH(A$(4))-H+1) 120 PRIHT " ДЛЯ ОКОНЧАНИЯ ВЫЧИСЛЕНИИ ВВОДИТЕ ft " 130 PRIHT " УКАЖИТЕ ПРИЗНАК ПОЛА —И ИЛИ Ж " 140 IKPUT Кф 150 IF K«-"ft" ТНЕИ 999 160 PRINT "УКАЖИТЕ ИМЯ И ОТЧЕСТВО" 170 LINE IHPUT Gt : A$(2)=G« 1ВО IF Kt-"H" THEN Р$="ЫЙ" ELSE Р$="АЯ" 190 ’-ВСТАВКА В 1-Ю СТРОКУ 200 K2=IMSTR(1,A»(1),"EH”) 205 PRIKT : PRIHT : PRIHT 210 A»(1)=LEFT$(A»(1),K2+1HP$ 220 FOR 1=1 TO 7 230 PRIKT A$(I) ; HEXT I 240 PRIKTZPRIHT ; GOTO 120 999 END Пример 2.45. Написать программу редактирования тек- ста, которая заменяет в последовательности символов все восклицательные знаки точками. Признаком окончания вы- числений является строка с начальными символами ФФ. Программа имеет внд 1О ’ ЗАМЕНА ! НА ТОЧКУ 20 PRIHT "ВВЕДИТЕ СТРОКУ ТЕКСТА (КОНЕЦ ft# )" 30 LIKE IHPUT А$ 40 IF LEFT»(A»,2)="ftft" ТНЕИ 999 50 И1=1 ’НАЧАЛО ПОИСКА 60 N=INSTR(H1,A$,"!") 70 IF Н=О ТНЕИ ЮО ВО IF H=LEN(A$)THEH A$=LEFT$(A$,LEN(A$)-1)+"." : GOTO ЮО 90 At=LEFT$(A$,N-l)+“."+HIDl(A|,H+l) : И1-Н+1 : GOTO 60 1OO PRIHT A$ : GOTO 20 999 END Задачи для решения * 2.18. С целью повышения производительности труда сборщиков изделия в конце недели в ЭВМ вводятся фамилии сборщиков, число изделий, собранных каждым сборщиком ежедневно. Составить программу, которая выдавала бы на печать следующую информацию; а) среднее число собранных за день изделий; б) наибольшее число изделий, собранных одним рабочим; в) фамилию того рабочего и день, когда он достиг наи- высшей производительности труда. 2.19. Написать программу, контролирующую резервиро- вание мест на самолет. В салоне размещено пять рядов по четыре кресла в каждом рнду. При бронировании места 100
программа должна запоминать три символа — инициалы пас- сажира. Напечатать схему мест после заполнения салона. * 2.20. Написать программу, выполняющую следующие финансово-экономические расчеты. Данные в виде месячной заработной платы рабочих со специальностями различных категорий представлены табл. 2.2. Таблица 2.2 Рабочий Фамилия Категория Разряд Месячный заработок, руб. Наименование цеха — отдела Карпов 4 150 К01 Хохлов 6 195 К02 Зверев 4 132 К02 а) Вычислить общую сумму выплат за месяц по всем категориям, по категориям раздельно, процент по категориям от общей суммы, среднюю месячную заработную плату по категориям. б) Напечатать список работников отдела XX с указани- ем размера заработной платы н итоговой ежемесячной суммы выплат. Название отдела ввести в диалоговом режиме. 2.22. Написать программу, которая а) создает телефонный справочник объемом не более 40 абонентов, содержащий следующие данные об одном або- ненте — ф. н. о. абонента, номер телефона. Затем по вводи- мому имени ЭВМ сообщает номер телефона; б) корректирует созданный телефонный справочник. Вводится код корректировки: 1 — добавить запись в справоч- ник при наличии свободного места, 2 — изменить запись, 3 — удалить запись. Имя абонента, номер телефона вводятся в соответствии с условиями кода корректировки в диалоговом режиме. 2.23. Написать программу, которая а) создает катался' деталей, хранящихся на складе, объемом не более 50 наименований. Каждая запись каталога содержит шифр детали, количество и место нахождения. По вводимому шифру ЭВМ сообщает о количестве деталей на складе и их местонахождении; б) вносит изменения о количестве деталей, находящихся на складе, при нх выдаче получателю. * 2.24. Написать программу, которая в подготовленный заранее шаблон письма (например, приглашение на симпози- ум) вписывает введенные пользователем дату, адрес, подпись н пр., а потом печатает готовое письмо. 101
* 2,25. Написать программу редактирования текста, ко- торая в каждой строке текста а) удаляет все символы, расположенные между скобка- ми (...). Предположить, что внутри каждой пары нет других скобок; б) заменяет группу рядом стоящих точек одной точкой; в) удаляет все пробелы из строки (сжатие строки); г) преобразует и печатает входной текст вида МАРИЯ ИВАНОВНА СИДОРОВА. КАРЛ ПЕТРОВИЧ ГЕ. в вид СИДОРОВА М. И. ГЕ К. П. 2.10. ОРГАНИЗАЦИЯ ПОДПРОГРАММ При составлении сложных программ удобно использовать под- программы. Это позволяет при необходимости вызвать подпрограмму много раз, в том числе и из разных мест программы. После выпол- нения подпрограммы управление передается обратно на то место, откуда она была вызвана, и работа по основной программе продол- жается. Переход на подпрограмму осуществляется по оператору пс GOSUB net где net — номер первой строки подпрограммы, куда передается управление. Возврат из подпрограммы осуществляется по оператору RETURN на строку, стоящую после оператора GOSUB. О передаче значений параметров подпрограмме и сохранении результатов ее работы должен заботиться программист. Например: 1ОО А=1 : В=2 : Р1=3.141592 НО GOSUB 2000 115 PRIHT "Ss";S,"T=";T 120 2000 'ПОДПРОГРАММА ПО ДАННЫЙ А.В ВЫЧИСЛЯЕТ S,T 2010 S=SIK(A*PI/a)- А«В*2.49 2020 T=EXP(A»B+2.5)/COS(B-PI) 2030 RETURK Для повышения читаемости программы рекомендуется тексты подпрограмм отделять комментариями вида 100 —.----------_1О1И юо ' %%%% Подпрограмма может, в свою очередь, вызвать другую под- программу, другая — следующую и т. д. Глубина вложения вызовов достаточно большая и зависит от версии языка. Необходимо следить за тем, чтобы возврат из подпрограммы осуществлялся в той же последовательности, что и вызовы. Подпрограмма может вызывать сама себя (рекурсия). 102
Пример 2.46. Составить программу вычисления значения функции г.+S/i «2+«2 и=е ' — е2 . где zlt z2—корни уравнения 5z24-20z—1,5=0; yh у2— корни уравнения 2у2—у—7,3 = 0. Вычисления корней офор- мить в виде подпрограммы. Если корни мнимые, то считать нх равными нулю. Оформим в виде подпрограммы вычисление корней хи х2 уравнения вида ах2 + ^х-|-с=0. Программа имеет вид Ю 'ЗАДАНИЕ КОЭФФИЦИЕНТОВ i-ГО УРАВНЕНИЯ 20 А=5 : В-20 t С=—1.5 30 GOSUB ЮОО 40 Z1=X1 :Z2=X2 ’--ЗАПОМИНАНИЕ РЕЗУЛЬТАТОВ 50 ' ЗАДАНИЕ КОЭФФИЦИЕНТОВ 2-ГО УРАВНЕНИЯ во А=2 : в=-1 : С--7.3 70 GOSUB IOOO 60 Y1=X1 : Ya=Z2 90 UsEXP(Zl+Yl)-EXP(Z2+Y2} ЮО PRIHT "ЗНАЧЕНИЯ КОРНЕИ " 105 PRIHT Z1.Z2 ,Y1,Y2 110 PRIHT "ЗНАЧЕНИЕ ФУНКЦИЙ"; U 120 EHD 900 • 7.7.7.7.7.7.7.7.77.7.7. IOOO D=B*B—4*A*C 1O1O IF D<O ТНЕИ X1=O : X2=O : RETURH 1020 D1=SQR(D) : Xl=4-B+Dl)/(a*A) 1030 X2=(- B — D1}/(2*A ) 1040 RETURH 1050 1 7.7.7.7.7.7.7.7.7.7.7.7.77. Пример 2.47. Написать программу, определяющую частоту появления символов А, В, С н цифры 9 в тексте, состоящем нз любого числа строк. Признаком конца набора данных является строка нз пяти символов **♦**. Вычисление частоты повторяемости символа X в строке текста оформить в виде подпрограммы. Программа подсчета частоты символа А в тексте, со- держащем любое число записей, приведена в примере 2.43. На осиоваинн этого примера составим подпрограмму под- счета частоты символа А'$ в одной строке У$5: 1O ' ОСНОВНАЯ ПРОГРАММА 20 PRIHT " ДЛЯ ЗАВЕРШЕНИЯ РАБОТЫ ВВЕСТИ " 30 PRIHT " СТРОКУ ИЗ 5 СИМВОЛОВ *»***" 40 ' S$(4)----МАССИВ СИМВОЛОВ А,В,С,9 50 ' М(4)--МАССИВ СЧЕТЧИКОВ ДЛЯ КАЖДОГО СИМВОЛА 60 DIM БФ(4),М(4) 70 DATA а.Ь.с.Э 80 ’ НАЧАЛЬНЫЕ ЗНАЧЕНИЯ МАССИВОВ S*(4),M(4) 90 FOR 1=1 ТО 4 103
1ОО READ S$(I) : H(I}=O : ИЕХТ I 11O PRIHT "ВВЕДИТЕ СТРОКУ ТЕКСТА” 115 LIKE IHPUT Y$ 120 IF LEFT»(Y$,5) ="««»»" THEH 190 130 'ПРОВЕРКА ЧАСТОТЫ ПОВТОРЕНИЯ СИМВОЛОВ 140 FOR 1=1 ТО 4 150 X$=S»(I} : GOSUB 1OOO 160 H(I)=H(I)+K 170 HEXT I ieo goto no 190 PRIHT "ЧАСТОТЫ ПОВТОРЕНИЯ СИМВОЛОВ A.B.C.9" ZOO PRIHT Н(1),Н(2),Н(3),И(4) 210 EHD 1OOO ' XXZZZZZZZZZZZZXZXZ 1O1O ' п/п ЧАСТОТЫ ВСТРЕЧАЕМОСТИ СИМВОЛА 1020 И1=1 : К=О ’ СЧЕТЧИК 1030 H=IHSTR(H1,Y$,X»} 1040 IF Н=О THEH RETURH 1050 IF H=LEH(Y$} THEH £=K+i : RETURH 1060 K=K+1 : N1=H+1 : GOTO 1030 1070 RETURH ioeo ’ zzzzzxzxxzzzzxxzxzx Задачи для решения * 2.26. Составить программу упорядочения трех чнс«* i 1 b, с (см. пример 2.10), оформив перестановку двух чш « х и у в виде подпрограммы. 2.27. Составить программу уточнения корней следующие уравнений с точностью е=10-'1, используя метод половин in. го деления (см. пример 2.36): 2 I 1 a) cos——2sin—4-—=0. Отрезок [а, Ь], содержащий корень, равен [1; 2]; б) sin2 x4-cos *2 — 10х=0, а=0, 6=1. Уточнение корня уравнения f (х)=0 на интервале |и. I1 оформить в виде подпрограммы. 2.28. Написать программу вычисления площади bi>iuv лого четырехугольника ABCD, заданного длинами сторон ЛИ ВС, CD, DA и диагональю АС. Диагональ делит выпук четырехугольник на два треугольника, к которым применим , формула Герона. Для вычисления площади треуголыии составить подпрограмму. 2.29. Написать подпрограмму вычисления полином.i г—о,/1 + а„х" “1+• •-+“i*+<% по схеме Горнера (см. пример 2.31). Использован. . ставленную подпрограмму для печати таблицы значений мни гочлена у=2х8—хь 4- 4х5—5х2 4- 6х 4-1 104
и । io первой производной. Значение х изменяется от началь- »|| о значения аргумента Хо до конечного хк с шагом Az. Вывод результирующих данных оформить в виде таблицы: \ ¥ 1-я произв. 2.30. Написать подпрограмму печати строки, состоящей и । К) символов *. Используя составленную подпрограмму, «писать программу вывода любого текста нз любого числа цюк в рамке. Например: » ХЛЕНДАРЬ КАМНЕЙ И ЦВЕТОВ Ml 1ЬОР ПО МЕСЯЦУ »**<|<****«***«***«:*¥*«*»*** Hl ШАРЬ ГРАНАТ ГВОЗДИКА КРАСНАЯ .♦♦♦а********************** I ВРАЛЬ АМЕТИСТ ФИАЛКА .+»**♦«:**«<*****»*»***#**** Функции, определяемые пользователем Часто в программе возникает необходимость использования од- u । и и того же математического или строкового выражения в не- ♦ч1,ких местах программы при различных исходных данных. Про- - • вычисления такого выражения можно оформить в виде функ- ции пользователя (оператор-функция) и использовать ее в программе > ip'ime со стандартными функциями языка БЕЙСИК. Описание функции производится с помощью оператора DEF. 1’> рм it оператора: пс DEF FNujca (91, <72, ..., qk)=выражение имя — вместе с префиксом FN определяет имя функции. Имя 1ся аналогично имени переменной и используется для обраще- .. । к функции; qt, q2, -... qk -список формальных параметров, прые могут быть целыми, вещественными или строковыми. Гип выражения должен соответствовать типу функции. Например: Ю DEF FKC(X)=5«X*X-4*X*3 20 DEF FKS(A,B}=LOG(A*A+B«B) 30 DEF FKK$(X$,H)=LEFT$(X$,H-iy*-,’."+HlD$(X$,H4-l) 40 DEF FHIHDZ(XZ)=XZ MOD IO Оператор DEF может располагаться в любом месте программы. < вращение к функции производится по имени функции и в скоб- । шваются фактические параметры. Ими могут быть константы, pi менные, выражения Фактические параметры должны соответ- Hi.rib формальным по типу, количеству и порядку следования. 105
Пример 2.48. Составить программу вычисления функции _ logs *+ logfe у ~ 2 logb+2 (* + »/) Для вычисления логарифма по любому основанию ис- пользовать оператор-функцию DEF. Любой алгоритм определяется как lcgo р = 1п р/ln а. Эта формула используется в операторе-фуикцни для вычисле* ния логарифма по любому основанию. Для обращения к опе- ратору-функции необходимо задать два параметра — основа- ние логарифма а и число р, от которого ои вычисляется. Присвоим имя этой функции FNB. Программа имеет вид IO DEF FHB(A,P)=LOG(P)/LOG( А) ao PRIHT "ВВЕДИТЕ Х.у.Ь" 30 IHPUT X,Y,B 40 Z=(FHB(2,X)+FHB(B,Y))/FHB(B+2,X+Y)*-5 50 PRIHT "Zr";Z 60 END Задачи для решения * 2.31. Составить программу вычисления значения функции s=д/л2+1/2sin2 ху4- д/л24-2^4-sin2 xz~\- + Vs’ + ^+sin2 jz, используя оператор-фуикцию для вычисления выражения вида д/а2 4- 62 sin2 ab. 2.32. Заданы длины трех сторон треугольника АВС. Рас- считать углы треугольника и вывести иа печать длины сторон и значения углов. Расчет значения угла с использованием теоремы косинусов оформить в виде оператора-функции. 2.33. Составить программу вычисления определенного г in X , f интеграла z — у —ах методом трапеции с точностью е = = 0,0001 (см. пример 2.42). Вычисление подынтегральной функции f (х) оформить в виде оператора-функции. 2.34. Составить программу, которая заменяет все вос- клицательные знаки в последовательности символов симво- лом «.» (см. пример 2.45). Оформить в виде оператора-функции замену n-го симво- ла строковой переменной символом «.». 106
2.11. РЕШЕНИЕ ПРИКЛАДНЫХ НАУЧНО-ТЕХНИЧЕСКИХ ЗАДАЧ Генерирование случайных числовых последовательностей. Элементы игровых ситуаций Для интегрирования случайного равномерно распределенного числа в интервале [0, 1 ] в языке БЕЙСИК можно воспользоваться функцией RND [(х)], где х<0 используется для установки базы гене- рации случайных чисел. В действительности функция не нуждается в аргументе. Пример 2.49. Составить программу, которая генерирует 100 случайных чисел в диапазоне [0, 1 ] и вычисляет их сред- нее значение. Оно должно быть приблизительно равно 0,5. Программа имеет вид 1О ’—ГЕНЕРИРОВАНИЕ ЧИСЛОВОЙ ПОСЛЕДОВАТЕЛЬНОСТИ 20 S-0 ’ ОБНУЛЕНИЕ СУММЫ 30 FOR К=1 ТО ЮО 40 G=RMD ’СЛУЧАЙНОЕ ЧИСЛО 0:1 50 S=S+G : NEXT К 60 PRINT "СУММА ЮО ЧИСЕЛ =“; S/1O0 70 EHD Если написанная программа выполняется несколько раз, то при каждом выполнении получается одна и та же последовательность случайных чисел, что может оказаться нежелательным. Если необхо- димо генерирование новой числовой последовательности, то следует использовать оператор RANDOMIZE [база] и поместить его в начало программы. Например: 15 RANDOMIZE Так как база не задана, то выполнение программы приоста- навливается и на экран дисплея выдается запрос на задание базы генерации (от —32768 до -J-32767). Введенное число используется в качестве базы генерации. Пример 2.50. Составить программу, генерирующую по- следовательность случайных целых чисел в интервале от 1 до 100. Методика генерирования таких чисел изложена в при- мере 1.25. Для получения случайного целого числа из диапазона [а, 6] с равномерным законом распределения воспользуемся формулой Х= 1NT «В - А) + 1>RND+А) Программа имеет вид Ю ’ДАТЧИК ЧИСЕЛ ОТ 1 ДО ЮО 20 RANDOMIZE 30 PRINT "УКАЖИТЕ КОЛИЧЕСТВО ЧИСЕЛ' 40 IRFUT Н 107
50 FOR 1=1 TO H : X=IHT(100*RHD+i) 60 PRIHT I, X : HEXT I 70 END Пример 2.51. Составить программу, моделирующую иг- ру двух игроков в кости. Игра заключается в бросании шестигранного кубика, каждая грань которого имеет номер от 1 до 6. Каждая грань может выпасть с одинаковой вероятно- стью, равной 1 /б, поэтому для моделирования броска можно использовать случайное число с равномерным распределени- ем от 1 до 6. В приведенной ниже программе предполагается, что число бросков задается до начала игры: 5 DEFIHT A—Z 10 '-МОДЕЛИРОВАНИЕ ИГРЫ JB КОСТИ 20 RAHDOMIZE 30 PRINT "УКАЖИТЕ ЧИСЛО БРОСАНИИ N" 40 INPUT Н 50 S1=O : Б2=О •-----НАЧАЛЬНЫЕ ЗНАЧЕНИЯ СУНН 60 FOR 1=1 ТО К 70 S3=IHT(RHD*6«-1) : Sl=Si+S3 60 S4=IHT(RHD«6+1) : S2=S2+S4 65 PRIHT "В ";I;“ БРОСАНИИ " 90 IF S3=S4 THEN PRIHT " HH4bH":GOTO 120 1OO IF S3>S4 THEH PRIHT " ПОБЕДА #1":GOTO 120 110 PRIHT "ПОБЕДА #2" 120 PRIHT "СУННА ОЧКОВ ЗА БРОСАНИИ" 130 PRIHT "#i---";S1, "#2--"JS2 : PRINT : PRIHT 140 HEXT I 150 EHD Пример 2.52. Смоделировать моменты прихода студен- тов в абонементный отдел библиотеки в предположении, что каждые 5 мин в среднем приходит одни студент. На печать выдавать время появления студентов (в минутах) от начала работы. Зафиксировать общее число студентов, пришедших в библиотеку в течение 1 ч от начала работы. Методика решения приведена в примере 1.26. В соответствии со схемой алгоритма (см. рис. 1.33) про- грамма имеет вид 10 ’--ПРИХОД СТУДЕНТОВ в библиотеку' 15 RAHDOMIZE 20 V=l/5! ’СКОРОСТЬ ПРИХОДА 30 Т-60 'ОВЩИИ ВРЕМЕННОЙ ИНТЕРВАЛ 40 К=О ’ОБЩЕЕ ЧИСЛО СТУДЕНТОВ 50 PRIHT "СКОРОСТЬ ПРИХОДАВ НИНУТУ" БО PRIHT : PRINT : PRIHT 70 PRINT "НОМЕНТЫ ПРИХОДА В МИН." 60 FOR 1=1 ТО Т : X=RHD 90 IF X<V THEH I^RIHT " ";I ; K=K+1 1O0 HEXT I 110 PRIHT "ОБЩЕЕ ЧИСЛО СТУДЕНТОВ";К 120 EHD 106
Пример 2.53. Написать программу, проверяющую зна- ние учеником таблицы умножения,— задается любое число вопросов вида т*п = ? (тип — целые случайные числа из диапазона [0; 20]). Если ответ правильный, то выдать со- общение ПРАВИЛЬНО и ввести новый вопрос. Если ответ ошибочный, то попросить проверить ответ. Подсчитать число ошибок; при числе ошибок, равных трем, попросить выучить таблицу умножения. Для прекращения вычислений в качестве признака конца набора данных попросить ввести число 99999. Методика решения приведена в примере 1.27. Программа имеет вид 10 DEFIHT К,И,Н EG RAHDOMIZE 30 PRINT "ПРОВЕРКА ТАБЛИЦЫ УМНОЖЕНИЯ" 40 PRINT "ДЛЯ ОКОНЧАНИЯ РАБОТЫ ВВЕСТИ 99999" 50 К=О 'К—СЧЕТЧИК ЧИСЛА ОШИБОК 60 H=INT(21«RND} ; H=IHT(21*RHD) 70 PRINT "СООБЩИТЕ РЕЗУЛЬТАТ УМНОЖЕНИЯ " ВО PRINT 90 INPUT 1. 100 IF I.=9999 9! THEH 150 120 IF M«N-L THEH PRINT "ПРАВИЛЬНО" : GOTO 40 130 K=KM 140 IF K=3 THEH PRIHT "ВЫУЧИТЕ ТАБЛИЦУ " ’ GOTO 150 145 PRINT "ВЫ ОШИВЛНСЬ.СООБЩИТЕ НОВЫЙ ОТВЕТ" GOTO 70 150 EHD Программы, рассмотренные в примерах 2.49—2.53, могут быть использованы как основа для решения задач 1.107—1.114. • Составить и выполнить иа ЭВМ программы для реше- ния задач 1.107—1.114. Решение графических задач с выводом на алфавитно-цифровой дисплей При отсутствии специальных графических средств ввода-вывода можно использовать в качестве графических устройств алфавитно- цифровые дисплеи. Пример 2.54. Построить изображение вертикального от- резка произвольной длины / в заданном месте экрана. Ко- ординаты начала отрезка х=20, у — 10. Длину отрезка за- дать в диалоговом режиме. Положение символа иа экране дисплея определяется двумя координатами —- номером строки у и номером позиции в строке х (отсчет координат ведем от левого верхнего угла экрана, ось X направим вдоль строки вправо, ось Y — вниз). Для построения символа с заданными координатами, напри- мер х—20, £/=10, иужио организовать пропуск 9 строк и печать в 10-й строке в 20-й позиции символа отрезка, иапример, «*». 109
Программа имеет вид 5 DEFIHT A-Z Ю ' ПОСТРОЕНИЕ ВЕРТИКАЛЬНОГО ОТРЕЗКА го PRIHT "ВВЕДИТЕ ДЛИНУ ОТРЕЗКА" 30 IHPUT L 35 •—ПРОПУСК 9 СТРОК 40 FOR 1=1 ТО 9 : PRIHT : HEXT I 50 '—ВЫЧЕРЧИВАНИЕ ОТРЕЗКА 60 FOR К=1 ТО L : PRIHT TAB(ZO);"*" 70 НЕХТ К : EHD Чтобы обеспечить возможность вывода данных, начиная с лю- бой позиции экрана, в состав языка БЕЙСИК включен оператор LOCATE для перемещения курсора в любое место экрана. Формат оператора: LOCATE номер строки, номер столбца В приведенной выше программе целесообразно строки 40—50 за- менить одним оператором: 40 CLS : LOCATE L, 1 Пример 2.55. Построить изображение горизонтального отрезка произвольной длины в заданном месте экрана: х=20, у= 10. Длину отрезка задавать в режиме диалога. Программа имеет тот же вид, что и в примере 2.54, одна- ко в операторе 60 в конце списка необходимо поставить точку с запятой, чтобы блокировать переход к новой строке: 60 PRINT TAB (19 + K); Можно дополнить программу проверкой соответствия длины вычерчиваемого отрезка размерам экрана. Пример 2.56. Построить изображение прямоугольной рамки фиксированных размеров. Входные параметры — ко- ординаты левого угла х, у; размеры сторон — высота h, ширина d. Оформим в виде подпрограммы построение горизонталь- ной линии длиной / с позиции х. Программа имеет вид 1О ' РАНКА С ЗАДАННЫМИ КООРДИНАТАМИ го ' ВЕРХНЕГО ЛЕВОГО УГЛА X.Y И РАЗМЕРАМИ СТОРОН 30 PRIHT "ВВЕДИТЕ КООРДИНАТЫ Х,7" 40 IHPUT Х,Т 50 IHPUT -ВЫСОТА И ШИРИНА РАМКИ";Н,В 60 "ПРОВЕРКА СООТВЕТСТВИЯ РАЗМЕРОВ РАНКИ И ЭКРАНА 70 IF(H+Y>24) OR (D+X>=BO) GOTO 130 60 CLS -. LOCATE 7,1 : L=D : GOSUB 1OOO 90 PRIHT ' ПОДАВЛЕНИЕ ПЕЧАТИ В ТОЙ ЖЕ СТРОКЕ 95 --ВЕРТИКАЛЬНЫЕ ОТРЕЗКИ НО
1ОО FOR 1=1 TO H 11O PRIHT TAB(X);”»”;TAB(X+D-1);"*" :HEXT I 120 GOSUB 1OOO : GOTO 999 130 PRINT "НЕСООТВЕТСТВИЕ РАЗМЕРОВ РАМКИ 999 EHD lOOO 'ПОДПРОГРАММА ВЫЧЕРЧИВАНИЯ 1O1O ' ГОРИЗОНТАЛЬНОГО ОТРЕЗКА 1020 ' ДЛИНЫ L С ПОЗИЦИИ X 1040 FOR 1=1 ТО L : PRIHT Т AB4X-1+I);"»"; 1050 HEXT I : RETURH Пример 2.57. Построить отрезок с координатами концов xl, 4/1, х2, у2. Для построения отрезка воспользуемся методом «заочно- го рисования». Весь экран или его часть представим как двумерный массив Z, состоящий из k строк и I столбцов, иными словами, содержащий ky^l односимвольных элемен- тов. Очистим этот массив (заполним пробелами). Используя уравнение прямой y—yi = x—xl 4/2 —4/1 х2 — х1 в цикле по координате х, изменяющейся от х1 до х2 с шагом 1, вычисляем у. Элементу массива z(y, х) присваиваем сим- вол «*». После окончания цикла, распечатав массив Z, полу- чим изображение прямой. Программа имеет вид 5 'ПОСТРОЕНИЕ ПРЯНОЙ Ю DIH Z»(2O,6O) 20 PRIHT "ВВЕДИТЕ КООРДИНАТЫ " 30 IHPUT "ПЕРВОЙ ТОЧКИ";Х1,Т1 40 IHPUT "ВТОРОЙ ТОЧКИ";Х2,Т2 50 PRIHT " ОЧИСТКА МАССИВА Z" 50 FOR 1=1 ТО 20 : FOR J=1 ТО 50 : Z»(I,J)=" " 70 HEXT J : HEXT I 80 S=1 : PRIHT "ИДЕТ ФОРМИРОВАНИЕ НАССИВА" 90 IF X1=X2 ТНЕН GOSUB 2000 : GOTO 150 'ВЕРТИКАЛЬ 1OO IF Y1=Y2 THEH GOSUB 3000 :GOTO 150 'горизонталь 110 IF X1>X2 THEH S--1 120 FOR X=X1 TO X2 STEP S 130 Y=((X-X1)*(Y2-Y1))\(X2-X1)<-Y1 140 Z$(Y,X)="»” ‘.PRIHT X.Y : HEXT X 150 PRIHT " ВЫВОД ИЗОБРАЖЕНИЯ" 170 FOR 1=1 TO 20 180 FOR J=1 TO 60 : PRIHT Z»(I,J); 190 HEXT J : PRIHT 200 HEXT I aio END 2000 ' П/П ВЕРТИКАЛЬ 2010 IF Y1>Y2 THEH S=-l 2020 FOR Y=Y1 TO Y2 STEP S 2030 Z$(Y,X1)="»" : HEXT Y 2040 RETURH 111
х. Поэтому вывод собственно графика начнем с 11-й позиции, а в 10-й и 71-й позициях очертим поле графика симво- лом «I». Программа имеет вид 5 DEFIHT Н 10 * ПЕЧАТЬ ГРАФИКА ФУНКЦИИ Y=F(X) го ' ОСЬ X НАПРАВЛЕНА вниз 30 DIM Y(53) 40 YHIH=1E*EO : YHAX=-1E«-2O : 1=1 50 FOR Х=О ТО 5.21 STEP .1 60 Y(I)=5«SIH(X)+SIH(2«X) TO IF Y(I)>YHAX THEH YHAX=Y(I) 60 IF Y(I)<YHIH THEH YMIH=Y(I) 93 priht "X=";X," Y=”;Y(i) : l=l+i 95 HEXT X 1OO PRIHT ТРАФИК ФУНКЦИИ" 11O D=59/( YHAX-YHIH) laO PRIHT "YHAX=";YHAX,’YHIH=";YHIH 130 PRIHT "НАГ ПО ОСИ y";D : PRIHT 140 X=0 150 FOR 1=1 TO 53 150 H=IHT((Y(I)-YHIH)»D)+1 160 PRIHT -I = ";M ;TAB(1O);"!";TAB(H+1O);"*”;TAB(71);"!" 190 X=X*.l : HEXT I 200 EHD Программы, разработанные в примерах 2.54 - 2.59, могут быть использованы как основа для решения задач 1.115—1.118. • Составить и выполнить на ЭВМ программы для реше- ния задач 1.115—1.118. Построение изолиний функции двух переменных (изограмм) Пример 2.60. Построить изограмму функции г= = 0,5(9-|-х2— i/2-f-0,6) при изменении х и у от —2 до 3. Раз- мер изограммы должен составлять 120X120 мм. Печатаемые символы изограммы должны являться целыми значениями величины г. Ось X направить вниз. Методика решения приведена в примере 1.29. Схема алгоритма построения изограммы представлена на рис. 1.36 примера 1.29. Для преобразования числовых значений массива Z в строку символов необходимо в схему алгоритма включить преобразования целого числа г,- в соответствующий символ цифры, для чего введем строковый массив А$ из деся- ти элементов и присвоим им значения символов цифр О, 1, ..., 9. 114
Программа имеет вид Ю 'ИЗОГРАННА ФУНКЦИИ Z=O.5»(9+X»X-Т«Т- 0.6) 20 DIH 2(57),А»(1О) 30 DATA "0","l"."2","3",”4","5","6- 35 DATA "7",“8","3" 40 'ФОРМИРОВАНИЕ СТРОКОВОГО МАССИВА 50 FOR 1=1 ТО 1О 60 READ А4(1) 65 NEXT I 70 Х1=. 21167 : Т1=.10587 60 PRIHT "ИЗОГРАММА. ОСЬ X НАПРАВЛЕНА ВНИЗ" 90 'ВЫЧИСЛЕНИЕ 2 КАК ФУНКЦИИ 2-Х ПЕРЕМЕННЫХ ЮО FOR Х=-3 ТО 3 STEP XI НО 1=1 120 FOR Т=-3 ТО 3 STEP Т1 130 Z(I)=INT(.5»(9+X«X-T*Y + .6>) 140 1=1+1 : НЕХТ Y 150 ' ПЕЧАТЬ СТРОКИ ИЗОГРАММЫ 160 FOR J=1 ТО 57 170 R$ = A$(Z( J)+l) 180 PRINT R$; : NEXT J 190 PRIHT : NEXT X 200 END Программа, разработанная в примере 2.60, может быть исполь- зована как основа для решения задач 1.119—1.120. • Составить и выполнить на ЭВМ программы для реше- ния задач 1.119—1.120. Построение гистограмм, диаграмм Пример 2.61. В системе моделирования используется датчик случайных чисел, генерирующий случайное число в интервале [а, Ь], который разделен на десять классов, т. е. на десять подынтервалов одинаковой длины. Найдено распределение случайных чисел в каждом из этих классов. Результаты сведены в массив Т, содержащий десять эле- ментов. Напечатать гистограмму распределения. Методика построения гистограммы распределения при- ведена в примере 1.30. Программа имеет вид Ю 'ГИСТОГРАММА РАСПРЕДЕЛЕНИЯ 20 DIM Т(1О) 50 PRINT "ВВЕДИТЕ МАССИВ РАСПРЕДЕЛЕНИЯ" 60 PRINT " ЧИСЕЛ ПО КЛАССАН" 70 FOR 1=1 ТО 1О : PRINT I; : INPUT T(I) :НЕХТ I 60 PRIHT "СООБЩИТЕ МАКСИМАЛЬНЫЙ РАЗМЕР ПОЛЯ* 90 PRINT " W < 70 " ЮО INPUT W НО 'ВЫБОР НАСНТАБА ГИСТОГРАММЫ 120 А=Т(1) 130 FOR 1=2 ТО 1О 140 IF T(I) > A THEN A=T(I) : NEXT I 115
150 H-W/A 160 PRIHT ПЕЧАТЬ ГИСТОГРАММЫ “ 170 FOR Ixl TO IO 160 K=IHT(T(I)«M+.5) 190 FOR J=1 TO К 'ПЕЧАТЬ СТОЛБИКА ДЛИНОЙ 200 PRIHT »*, ' к символов ею нехт j его priht : нехт i азо EHD Модифицировать программу, увеличив ширину столбика гистограммы в 2 раза. Программа, разработанная в примере 2.61, может быть исполь- зована как основа для решения задач 1.121—1.122. • Составить и выполнить на ЭВМ программы для реше- ния задач 1.121 —1.122. Решение графических задач с выводом на графический дисплей В состав языка БЕЙСИК входят операторы и функции, позволя- ющие выполнять графическую обработку данных на экране графиче- ского дисплея. При этом экран рассматривается программистом как прямоугольная таблица, где элементы изображения (светящиеся точки) образуют строки и столбцы таблицы. Графические дисплеи, используемые для ПЭВМ ЕС, IBM PC, могут работать в следующих режимах: — текстового вывода данных; — графического вывода со средней разрешающей способностью (на экране размещаются 200 строк и 320 столбцов. Каждая точка может окрашиваться в один из четырех цветов, которые нумеруются цифрами от 0 до 3); — графического вывода с высокой разрешающей способностью (на экране размещается 200 строк и 640 столбцов. Изображение монохромное, точки могут быть белого или черного цвета). Режим работы дисплея задается в программе оператором SCREEN номер режима, где номер режима принимает значение: 0 — режим текстового выво- да, 1 — режим графического вывода, 2 — режим с высоким разреше- нием. Например, оператор 300 SCREEN 1 устанавливает режим графического вывода со средним разрешением. В дальнейшем рассматривается только режим графического вывода. Координаты точек экрана. Любая точка экрана од- нозначно определяется координатами (х, у), где х — номер столбца; у — номер строки, иа пересечении которых она находится. Столбцы нумеруются, начиная с крайнего левого, который имеет номер 0. Крайний правый столбец имеет номер 319 в графическом режиме со средним разрешением или 639 в режиме высокого разреше- ния. В обоих режимах строки нумеруются сверху вниз, верхняя стро- 116
ка имеет номер 0, а нижняя — 199 При средней разрешающей спо- собности координаты точки в левом верхнем углу экрана равны (0, 0), в правом верхнем — (319, 0), в левом нижнем — (0, 199) и в правом нижнем — (319, 199). При этом форма задания координат называет- ся абсолютной. Возможна относительная форма задания координат операндом STEP (х, у). При этом координаты задаются относительно последней выведенной точки, координаты которой запоминаются после выпол- нения любого оператора, обрабатывающего графическую информа- цию. Например, если координаты последней выведенной точки равны (60,80), то операнд STEP (25, —10) определяет точку с координата- ми (85,70). Очистка экрана во время выполнения программы осу- ществляется оператором CLS. Вся информация на экране стирается и курсор размещается в левом верхнем углу экрана. Управление цветом изображения. При описании процесса построения изображения на экране дисплея используются понятия: фон, передний план, окантовка. Фон — это область экрана, на которой воспроизводится все, что выводится на экран. Передний план — это совокупность точек, формирующих изо- бражение. Окантовка — окружение фона, но, как правило, она бывает того же цвета, что и фон, и потому неразличима. Например, если на экране изображена буква А, то передний план — это точки, составляющие букву А; фон — точки, окружающие букву А. Изображение, как правило, формируется наложением точек переднего плана на фон. Цветные изображения на экране можно получить только при средней разрешающей способности. Управление цветом осуществляется с помощью оператора COLOR [фон] [, палитра] где фон — число от 0 до 15, которое задает номера цвета фона. Номе- ра цветов фона приведены в табл. 2.3; палитра — число 0 или 1, определяющее набор из четырех цветов для переднего плана изо- Таблица 2.3 Номер цвета Цвет Номер цвета Цвет 0 Черный 8 Серый 1 Синий 9 Светло-синий 2 Зеленый 10 Светло-зеленый 3 Г олубой II Светло-голубой 4 Красный 12 Розовый 5 Пурпурный 13 Светло- пурпур ный 6 Коричневый 14 Желтый 7 Белый 15 Ярко-белый 117
бражения. Цвета, составляющие палитру 0 и 1, приведены в табл. 2.4. Смена палитры приводит к смене раскраски всего экрана. Таблица 2.4 Номер цвета Палитра 0 Палитра 1 0 Фоновый цвет Фоновый цвет 1 Зеленый Голубой 2 Красный Пурпурный 3 Коричневый Белый Например, операторы 10 SCREEN 1 го color г,о определяют режим графического вывода со средней разрешаю- щей способностью, цвет фона — зеленый, палитра переднего плана — нулевая. Отображение точки на экране выполняется опе- ратором PSET (х, у) [, цвет] где (х, у) — координаты точки; цвет — число в диапазоне от 0 до 3, указывающее номер цвета актив- ной палитры, в который будет окрашена точка. Например, оператор 450 PSET (100, 150), 1 окрасит точку на пересечении 150-й строки и 100-го столбца в зеленый или голубой цвет в зависимости от текущей палитры. Если в операторе PSET собственно координатам точки пред- шествует слово STEP, то эти координаты интерпретируются как смещение относительно координат последней выведенной точки. На- пример: 1ООО PSET(12O,BO) 1O1O PSET БТЕР(-гО,5) В строке 1000 обеспечивается вывод точки с абсолютными ко- ординатами (120, 80), а в строке 1020 — с относительными координа- тами. Высветится точка на пересечении 100-го столбца и 85-й строки. Построение отрезка прямой выполняется с по- мощью оператора LINE: LINE (xl, i/l)—(х2, у2) [, цвет] где (xl, yl) и (х2, у2)— координаты начальной и конечной точки отрезка соответственно; цвет — число в диапазоне от 0 до 3 (задает номер цвета, в который будет окрашена линия). 118
Если цвет опущен, то трактуется цвет с номером 3 в режиме среднего разрешения, а в режиме с высокой разрешающей способно- стью — цвет переднего плана. Если координаты (xl, t/1) не заданы, то по умолчанию использу- ется координата последней выведенной точки. Пример 2.62. Построить прямоугольник с координатами верхнего левого угла (20,20) и нижнего правого (100,60): Ю SCREEN 1 'СРЕДНЯЯ РАЗРЕШАЮЩАЯ СПОСОБНрСТЬ го COLOR 0,0 'ЧЕРНЫЙ ФОН.ПАЛИТРА о 30 LINE (2О,2О)(1ОО,2О),1 'ВЕРХНЯЯ СТОРОНА-ЗЕЛЕНАЯ 40 LINE (1OO,2O)-(1OO,6O),2 'ПРАВАЯ -КРАСНАЯ 50 LINE (1OO.6O)-(2O,6O),1 60 LINE (2O,6O)-(2O,2O), 2 ТО END При выполнении указанных операторов на экране стро- ится прямоугольник, противоположные стороны которого имеют одинаковый цвет, а смежные — разные цвета. Можно использовать более удобный способ построения отрезка, основанный на том, что каждый раз при выводе какой-либо линии в памяти ПЭВМ запоминаются координаты последней выведенной точки. В операторах LINE (строки 40—60) можно опустить координаты начальной точки отрез- ка. Тогда имеем: IO SCREEN 1 20 COLOR 0,0 30 LINE (20,20)-(100,20),1 40 LINE Ч1ОО,6О),2 50 LINE -(20,60), 1 60 LINE —(20,20),2 Построение прямоугольника можно выполнить и с помощью оператора LINE специального типа, дописав букву В после указания цвета: LINE (xl, i/l)—(х2, у2), цвет, В Для построения прямоугольника с координатами, заданными в условии примера 2.62, можно записать всего один оператор LINE в виде 30 LINE (20, 20)—(100, 60), 2, В При выполнении этого оператора на экране строится прямоу- гольник красного цвета с координатами одной из вершин (20, 20) и диагонально ей противоположной (100,60). Закрашивание прямоугольника одним цветом вы- полняется с помощью оператора LINE, в котором после В надо до- бавить еще букву F. Например, оператор 30 LINE (20, 20) —(100, 60), 2, BF вызовет окраску всего прямоугольника в красный цвет. 119
Построение окружности и ее дуг выполняется с по- мощью оператора CIRCLE, имеющего формат: CIRCLE (х, у), радиус, цвет [, ндуги] [, кдуги] [, сжатие] где (х, у) — координаты центра окружности; радиус — число, задающее радиус окружности; цвет — целое число от 0 до 3, определяющее цвет палитры; ндуги, кдуги — числа, задающие в радианной мере углы, соответст- вующие начальной и конечной точкам дуги, которую необходимо вычертить; сжатие — коэффициент сжатия (отношение размеров окружно- сти по вертикали к размерам по горизонтали). Реально по оператору CIRCLE строится сжатая окружность (эллипс), размер которой определяется ее радиусом, причем едини- цей измерения радиуса является ширина одного столбца экрана. Ширина столбца не совпадает с шириной строки, т. е. клетка экрана не является квадратной — в ширину она больше, чем в высоту. Со- отношение между большим и малым радиусом характеризуется ко- эффициентом сжатия. При значении коэффициента, принимаемом по умолчанию, строится окружность, близкая к правильной форме (при средней разрешающей способности это значение равно 5/е, а при высокой — 5/12>- Если операнды начала и конца дуги опущены, то строится пол- ная окружность. Если значение, определяющее начальную точку дуги, меньше значения, определяющего конечную точку, то дуга проводится про- тив часовой стрелки; если первое значение больше второго, то дуга проводится по часовой стрелке. Если обе концевые точки заданы отрицательными значениями, то проводятся еще и оба радиуса, обра- зуя сектор. Пример 2.63. Построить концентрические окружности с радиусом, изменяющимся от 20 до 120 точек с шагом 10. Выберем координаты центра окружности (х, у) равными (100, 100). Расстояния от центра до нижнего и верхнего края экрана равны 100 точкам. Максимальное значение радиуса, равное 120 точкам, возможно, так как при коэффициенте сжатия, равном 6/в> по вертикали от центра откладывается радиус, равный не 120, а 100 точкам. Программа построения имеет вид Ю SCREEN 1 'РЕЖИМ СРЕДНЕГО РАЗРЕИЕНИЯ го cls 'очистка экрана 25 COLOR 0,0 'ПАЛИТРА о 30 FOR R=2O ТО 120 STEP IO 40 CIRCLE (ieo,lOO),R,l 'ЦВЕТ ЗЕЛЕНЫЙ 50 NEXT R 50 END 120
Пример 2.64. Построить дугу третьей четверти окружно- сти с центром окружности, находящимся в середине экрана, и радиусом 80. Это можно сделать следующими операторами: IO SCREEN 1 : CLR : Р1=3.141592 го CIRCLE(15O,1OO),BO,1,PI1PI+PI/B Пример 2.65. Построить радиусы окружности с интерва- лом в л/10 радиан. Центр окружности находится в середине экрана, радиус равен 50 точкам изображения. Для построения радиуса в операторе CIRCLE надо за- дать начало и конец дуги одинаковыми и отрицательными. Ю SCREEN 1 го CLS : ХЕТ OFF ’ ОЧИСТКА ЭКРАНА 30 CIRCLE (15О,1ОО),5О,г 'ПОСТРОЕНИЕ ОКРУЖНОСТИ 40 Р1=3.141592 50 FOR 1=0 ТО г»Р1 STEP PI/1O 50 CIRCLE (150,100),50,1,-1,-1 70 NEXT I Раскраска областей экрана. Оператор PAINT по- зволяет раскрашивать заданную область экрана любым допустимым цветом или их комбинацией. Формат оператора: PAINT (х, у), трафарет, контур где (х, у) — координаты точки области, с которой начинается рас- краска; трафарет — числовое выражение, определяющее цвет, в который окрашивается область экрана (при средней разрешающей способности; 0 — цвет фона; I, 2, 3 — цвет из текущей палитры); контур — числовое выражение, определяет цвет замкнутой кривой, которая ограничивает раскрашиваемую область (за- дается по тем же правилам, что и трафарет). Пример 2.65. Построить окружность в центре экрана с радиусом 60 точек и раскрасить окружность в красный цвет. Программа имеет вид 10 SCREEN 1 'СРЕДНЕЕ РАЗРЕШЕНИЕ BO COLOR 7,0 'ФОН БЕЛЫЙ,ПАЛИТРА О 30 CLS 'ОЧИСТКА ЭКРАНА 40 KEY OFF 'ОТНЕНА ОТОБРАЖЕНИЯ 50 ' ФУНКЦИОНАЛЬНЫХ КЛАВИШ 50 CIRCLE (150,100),б0,г 'ВЫЧЕРЧИВАНИЕ КОНТУРА 70 paint (1бо,юо),г,г 'раскрашивание области Вывод текстовой информации совместно с графи- ческой реализуется с помощью операторов PRINT, PRINT USING. 121
Местоположение выводимого текста на экране задается с по- мощью оператора LOCATE, перемещающего курсор в требуемую позицию экрана. При выводе текстовых данных предполагается, что экран со- держит 25 строк с номерами от 1 (для верхней строки) до 25 (для иижней строки) и 40 столбцов (при средней разрешающей способно- сти) либо 80 столбцов (при высокой разрешающей способности). Таким образом, одна строка текстового режима соответствует восьми строкам графического, а символ в ширину занимает 8 графических столбцов. Формат оператора LOCATE LOCATE строка, столбец где строка — числовое выражение, задающее номер строки; столбец — числовое выражение, задающее номер столбца, в который будет помещен курсор. После выполнения оператора LOCATE курсор находится на пересечении строки и столбца, номера которых указаны в операторе. Например, оператор 300 LOCATE 22,7 помещает курсор на пересе- чение 22-й строки и 7-го столбца. Следует иметь в виду, что в операторе LOCATE номер строки должен стоять перед номером столбца, а в координатах, задаваемых операторами графического вывода PSET, LINE, наоборот. Обычно 25-я строка не используется для вывода, в ней отобра- жается информация об использовании функциональных клавиш. С по- мощью оператора LOCATE можно перевести курсор в 25-ю строку и использовать ее для вывода данных. Для этого необходимо очистить эту строку с помощью оператора KEY OFF, имеющего формат KEY OFF Установка длины строки экрана осуществляется с помощью оператора WIDTH, имеющего формат WIDTH длина-строки где длина-строки — числовое выражение, принимающее значение 40 либо 80. Например, оператор 400 WIDTH 80 устанавливает дли- ну строки экрана для вывода текстовой информации, равной 80 сим- волам. Построение графиков функций, изограмм, гистограмм, диаграмм. Вычерчиваемые графики могут со- стоять из отдельных точек (точечный график, рис. 2.3, а); представ- лять собой ломаные линии (кусочно-линейный график, рис. 2.3, б) или гистограмму, диаграмму (рис. 2.3, в), круговую диаграмму (рис. 2.3, г). График можно строить с использованием нескольких цветов, делая его тем самым более наглядным и информативным. Пример 2.67. Построить точечный график функции у=2 sin х -|- sin 2х при изменении х от а= — 3 до6=3 с шагом Ях = 0,1. В системе координат экрана неудобно расположение на- 122
6) Рис. 2.3 чала координат (левый верхний угол) и одной из осей коорди- нат (только вниз). Поэтому, чтобы облегчить работу над графиками, необходимо преобразовать исходную (рабочую) систему координат в систему координат экрана. Выберем направление осей рабочей системы координат: ось X — вдоль строки экрана, ось Y — по вертикали. Зада- димся рабочим полем графика: по вертикали Wy= 168 точек (что соответствует 21 строке в текстовом режиме) и по гори- зонтали В7х = 310 точек. Выберем масштаб по осям X и Y так, чтобы максимально использовать отведенную область. Аб- сциссу Хо начала рабочей системы координат выберем в точ- ке 155 из условия, что аргумент х изменяется симметрично относительно начала координат. Всего на оси X должно быть размещено 60 делений, соответствующих шагу изменения аргумента Лх=0,1. Для одного деления шкалы отведено пять точек. Масштаб Мх по оси X составит Mx=]Wx/(b—а)[ точек на единичное значение аргумента. Для выбора ординаты Ко начала рабочей системы ко- ординат и масштаба по оси Y необходимо рассчитать значе- ния наибольшего утах и наименьшего z/nljn значений функции. Если утах>0 и j/min>0, то ординату начала координат Уо следует принять равной 168. Если утак гС 0 и «/min < 0, то орди- нату Уо следует принять равной 0. Если утак>0 и ymin<0, то ордината Уо вычисляется как Уо = ]168/1 утак - f/min I *утах + 0,5[ Значение 0,5 добавлено для округления. Масштаб по оси Y составит 123
Тогда координаты точки (х, у) рабочей системы координат в координатах экрана определятся как хе=]х- Л4х-|-Хо-|-О,5[; Уе=1—У • МУ + уо + о,5[. Знак «—» при вычислении уе поставлен для того, чтобы изменить направление оси ординат. Программа имеет вид Ю DEFIHT I.C го ’»»»*« график функции «««•»» 30 DIM Y(61) 40 А=-3 : В=3 : HXs.l 50 PRIHT ОБЛАСТЬ ИЗМЕНЕНИЯ X" во priht "а=";а;"в=":в,"шаг dx=";hx ТО 'ВЫЧИСЛЕНИЕ ОБЛАСТИ ЗНАЧЕНИИ Y.YMAX.YHIH 80 YMAX=-1E+1O : YMIH=1E+1O : 1=0 90 FOR X=A TO В STEP HX 1OO 1=1*1 11O Y(I)=2*SIH(X)+SIH(2»X) 120 IF Y(I»YHAX THEH YMAX=Y(I) 130 IF Y(I)<YMIH THEH YHIH=Y(I) 135 PRIHT X,I,T(I) 140 HEXT X 145 PRIHT "YHIH=";YHIH,"ymaX=";YHAX 150 'ВЫЧИСЛЕНИЕ МАСШТАБОВ HX,HY,КООРДИНАТЫ YO 160 ИХ: 31O/(B—A) 180 HY=168/ABS(YMAX-YMIH) 190 IF (YMAX>O) AHD (YMIH>=O) THEH YO=166 200 IF (YMAXxO) AHD (YMIH<0) THEH YO=O 210 IF (YMAX>O) AHD (YMIH<O) THEH YO=IHT(MY*YMAX*.5) 220 PRIHT "ПОСТРОЕНИЕ ГРАФИКА" 223 CLS ’ ОЧИСТКА ЭКРАНА 225 SCREEH 1 'РЕЖИМ СРЕДНЕГО РАЗРЕШЕНИЯ 226 ' ДЛИНА СТРОКИ 80 230 KEY OFF 'ОТМЕНА ОТОБРАЖЕНИЯ КЛАВИШ 240 COLOR 2.0 'ЦВЕТ ФОНА ЗЕЛЕНЫЙ ПАЛИТРА О 250 РАЗНЕТКА НКАЛ X.Y 260 LIHE (O,TO)-(31O,YO) 'ГОРИЗОНТАЛЬНАЯ ОСЬ 265 ХО=165 270 FOR 1=0 ТО 310 STEP 5 'НАНЕСЕНИЕ ДЕЛЕНИИ 280 LIHE (I,YQ-3)-(I.YO+3) : НЕХТ I 290 LIHE (ХО,О)-(ХО,168) 'ВЕРТИКАЛЬНАЯ ОСЬ 300 FOR I=YO-1O ТО О STEP -1О 310 ЫНЕ (ХО-3,1)-(ХО+3.1) 'НАНЕСЕНИЕ ДЕЛЕНИИ 320 НЕХТ I 'НА ОСЬ +Y 330 FOR I=YO+1O ТО 168 STEP IO 340 ЫНЕ (XO-3,I)-(XO+3,I) 'НА ОСЬ -Y 350 НЕХТ I 355 1=0 360 'ПОСТРОЕНИЕ ТОЧЕЧНОГО ГРАФИКА 370 COL=2 'ЦВЕТ ТОЧКИ КРАСНЫЙ 380 FOR Х=А ТО В STEP НХ 390 1=1+1 400 ХЕ=1НТ(Х»МХ*.5)*ХО 'ПРЕОБРАЗОВАНИЕ (X.Y) 410 TE=YO-IHT(Y(I)*HT+.5) 'В КООРДИНАТЫ ЭКРАНА 420 PSET(XE,YE),COL 'ОТОБРАЖЕНИЕ ТОЧКИ 124
430 HEXT X 435 A»xIHPUT»(l) 'ПРИОСТАНОВКА ПРОГРАММЫ ДО 436 'НАЖАТИЯ ЛЮБОЙ КЛАВИШИ 440 'ВЫВОД ТЕКСТА О ЦЕНЕ ДЕЛЕНИИ ПО ШКАЛАМ Х,Т 510 LOCATE 24,1 'УСТАНОВКА КУРСОРА В 24 СТРОКЕ 520 PRIHT " ЦЕНА ДЕЛЕНИЯ ШКАЛЫ ПО ВЕРТИКАЛИ";10/НТ 530 PRIHT » ЦЕНА ДЕЛЕНИЯ ШКАЛЫ ПО ГОРИНЗОТАЛИ";5/МХ 540 EHD В строке 30 определяется массив для размещения значе- ний функции у. В строках 90—150 вычисляются и запоминаются в масси- ве Y значения функции и одновременно ведется поиск наи- большего и наименьшего значений утах и (/min, необходимых для определения масштаба по оси Y и месторасположения начала координат Хо, Уо. В строках 170—210 вычисляются масштабы Мх, Му по соответствующим осям X и Y и значение ординаты Уо начала координат. В строках 220—240 устанавливается режим графическо- го вывода со средней разрешающей способностью, белый цвет фона и нулевая палитра. В строках 260—350 наносятся оси X и Y и выполняется разметка осей. По оси X размещено 60 делений через каждые пять точек. На оси Y деления размещаются с интервалом в десять точек по обе стороны от ординаты Уо. Длина линии деления выбрана равной семи точкам изображения. В строках 370 задается цвет отображаемой точки графи- ка — красный, так как номер цвета — 2, а палитра объявлена нулевой. Печать точек графика выполняется в строках 370— 430. Затем программа переходит в состояние ожидания и на- ходится в нем, пока пользователь не ознакомится с выведен- ной информацией. Выход из этого состояния осуществляется нажатием любой клавиши. В строке 450 курсор перемещается на 24-ю строку для вывода текста о цене деления по осям X и Y. Пример 2.68 Построить график функции t/ = 2 sin х-|- sin 2х при изменении х от —3 до -|-3 с шагом 0,1, аппрок- симируя криволинейный участок функции между соседними значениями аргумента х, и x,+ i отрезком прямой (кусочно- линейный график). Программа построения точечного графика функции у = f (х) изложена в примере 2.67. Программа построения ку- сочно-линейного графика отличается только операторами, обеспечивающими построение отрезка прямой между точками с координатами (х„ «/,) и (х,+(, гд+i)- При этом воспользуемся 125
тем фактом, что при выводе на экран отрезка в памяти ПЭВМ запоминаются координаты последней выведенной точки. В программе примера 2.67 заменим операторы (стро- ки 360—430) следующими: 360 'ПОСТРОЕНИЕ КУСОЧНО- ЛИНЕЙНОГО ГРАФИКА 370 COL=a 'ЦВЕТ ОТОБРАЖАЕМОГО ГРАФИКА КРАСНЫЙ 380 'ОТОБРАЖЕНИЕ ПЕРВОЙ ТОЧКИ 390 PSET (IHT (А»МХ+. 5)+ХО, TO-IHT (7 ( 1) *М7+. 5)) 400 1=1 410 FOR Х=А+НХ ТО В STEP НХ 4ао 1=1+1 430 ХЕ=1НТ (Х*МХ+. 5)+ХО 'ПРЕОБРАЗОВАНИЕ (X, Т> 440 YE=YO-IHT(T(I)«HY+. 5) 'В КООРДИНАТЫ ЭКРАНА 450 ЫНЕ -(ХЕ, YE),COL ’ПОСТРОЕНИЕ ОТРЕЗКА 460 HEXT X 465 А»=INPUT*(1) 'ПРИОСТАНОВКА ПРОГРАММЫ ДО 466 ' НАЖАТИЯ ЛЮБОЙ КЛАВИШИ 510 LOCATE 24, 1 'УСТАНОВКА КУРСОРА В 24 СТРОКЕ 520 PRIHT ” ЦЕНА ДЕЛЕНИЯ ШКАЛЫ ПО ВЕРТИКАЛИ"; 10/MY 530 PRIHT ” ЦЕНА ДЕЛЕНИЯ ШКАЛЫ ПО ГОРИНЗОТАЛИ”; 5/МХ 540 END Пример 2.69. В системе моделирования используется датчик случайных чисел, генерирующий числа в интервале [а,6]. Интервал [а, 6] разделен на п классов, т. е. на п по- дынтервалов одинаковой длины, и найдено распределение случайных чисел в каждом из этих классов. Результаты сведены в массив Т, содержащий п элементов. Напечатать гистограмму распределения, полагая, что 10. В примере 2.61 приведена программа решения задачи при отсутствии графических средств вывода данных. С использованием операторов графического вывода про- грамма имеет вид 10 'ПОСТРОЕНИЕ ГИСТОГРАММЫ ao DEFIHT 1,Н 30 DIM Т(1О) 40 CLS 50 ТМАХхО 'НАЧАЛЬНОЕ ЗНАЧЕНИЕ НАИБОЛЬШЕГО 60 INPUT "ВВЕДИТЕ ЧИСЛО КЛАССОВ Н<=1О";Н 70 PRINT "ВВЕДИТЕ ЗНАЧЕНИЯ МАССИВА Т” 80 FOR 1=1 ТО N 90 PRINT I; : IHPUT T(I) 1ОО IF T ( I ) >THAX THEN TMAX=T(I) 110 IF T(I)»TMAX THEH TMAX=T(I) iao hext i 130 CLS : SCREEN 1 140 KEY OFF 150 COLOR 1,0 'ЦВЕТ ФОНА ГОЛУБОЙ 160 'ВЫВОД ОСЕЙ ГИСТОГРАММЫ 165 'И РАЗМЕТКА ВЕРТИКАЛЬНОЙ ШКАЛЫ 170 LINE (10, 1О)-(10, 165) 'ВЕРТИКАЛЬНАЯ ОСЬ 180 LINE (1О, 165)-(310, 1,65)'ГОРИЗОНТАЛЬНАЯ ОСЬ 190 FOR 1=165 ТО IO STEP -1О 126
200 LINE . (7, I)-(13, I) 'РАЗМЕТКА ВЕРТИКАЛЬНОМ ОСИ 210 HEXT I 220 'МАСШТАБИРОВАНИЕ ЗНАЧЕНИИ МАССИВА т 230 IF ТМАХЯ5 THEN THS = 15/TMAX ELSE THS=1 : GOTO 260 240 FOR 1 = 1 TO H 250 T(I)=T(I)»THS : HEXT I 260 * ПОСТРОЕНИЕ ГИСТОГРАММЫ 270 Xl=20 'КООРДИНАТА НИЖНЕГО ЛЕВОГО УГЛА ГИСТОГРАММЫ 280 FOR 1=1 ТО N 290 Y1=T(I)»1O 'ВЫСОТА СТОЛБИКА ГИСТОГРАММЫ 300 ЫНЕ (XI, 165)-(Х1+25, 165-Yl), 3.BF 'ОКРАШЕННЫЙ СТОЛБИК 310 Х1=Х1+25 320 HEXT I 330 LOCATE 22, 1 'УСТАНОВКА КУРСОРА ДЛЯ ВЫВОДА НАДПИСЕЙ 340 PRIHT " 1234 5 67 8910" 350 LOCATE 24, 5 360 PRIHT "ЦЕНА ДЕЛЕНИЯ ШКАЛЫ ПО ВЕРТИКАЛИ"; 1/TMS 370 END В строке 30 определяется память для хранения числового массива Т с обычной точностью, используемого для хранения значений, для которых строится гистрограмма. В строке 40 выполняется очистка экрана и устанавлива- ется равной 80 длина строки экрана. В строках 50—120 выполняется ввод элементов массива Т(п), где п< 10, и одновременно ведется поиск наибольшего значения Ттах среди элементов этого массива. Значение Ттах используется для определения цены деления шкалы гистог- раммы. В строках 130—150 устанавливается графический режим работы экрана со средней разрешающей способностью, голу- бой цвет фона, нулевая палитра. В строках 170—180 с помощью оператора LINE строятся оси гистограммы. В строках 190—210 наносится шкала на вертикальную ось. Для одного деления шкалы выделено 10 точек. Всего по оси размещается 15 делений. Ширина отметки деления принята равной семи точкам. В строках 230—250 выполняется масштабирование мас- сива Т, для чего вычисляется масштаб tms. Так как на верти- кальной шкале имеется всего 15 делений, то при <тах> 15, все данные в массиве Т пропорционально уменьшаются так, что- бы максимальное масштабированное значение не превышало значения 15. Высота столбика i-ro класса гистограммы, вы- раженная в точках, определяется умножением масштабиро- ванного значения Т, на 10, так как одно деление шкалы вы- брано равным десяти точкам. В строках 270—320 выполняется построение столбиков гистограммы, окрашенных в желтый цвет, поскольку в опера- торе LINE (строка 300) указан номер цвета в нулевой палит- 127
ре, равный 3. Ширина одного столбика выбрана равной 25 точкам изображения. В строках 330—360 осуществляется вывод текста — нумерация классов гистограммы 1, 2, .. 9, 10 и вывод «цены» деления шкалы. Пример 2.70. Построить на экране круговую диаграмму для заданного массива исходных данных Т (и), где п — число секторов диаграммы. Максимальное число секторов составля- ет не более 20. Напечатать около середины дуги каждого сектора соответствующее этому сектору значение. Программа имеет вид 1О 'ПОСТРОЕНИЕЕ КРУГОВОЙ ДИАГРАММЫ го DIM Т(2О) : Р1=3. 141592 30 KEY OFF 40 CLS 50 '-----ВВОД МАССИВА Т 50 IHPUT "УКАЖИТЕ ЧИСЛО СЕКТОРОВ НЕ БОЛЕЕ 20" ;Н ТО SUM=O ’ ДЛЯ ПОДСЧЕТА СУММЫ ВВЕДЕННЫХ ЗНАЧЕНИИ 80 FOR 1:1 ТО Н 90 PRIHT "ЗНАЧЕНИЕ СЕКТОРА ";I : IHPUT Т(1) ЮО SUM=SUM»T(I) 110 НЕХТ I 120 IF SUM>1OO THEN PRIHT "ДАННЫЕ ОШИБОЧНЫ" : GOTO 50 130 ' ----ПОДГОТОВКА К ПОСТРОЕНИЮ ГИСТОГРАММЫ 140 SCREEN 1 : CLS 150 LOCATE 1,5 'УСТАНОВКА КУРСОРА ДЛЯ ПЕЧАТИ ЗАГОЛОВКА 160 PRINT "ИТОГО"; SUM 170 HDUGI:О 'НАЧАЛЬНАЯ ТОЧКА ДУГИ 180 RADIUS: 80 ' РАДИУС ОКРУЖНОСТИ 190 ' ----ПОСТРОЕНИЕ СЕКТОРОВ НА ЭКРАНЕ 200 FOR J=1 ТО Н 210 KDUGI=2»P1»T( J)/SUM+HDUGI ' КООРДИНАТА КОНЕЧНОЙ ТОЧКИ 220 HITTEL:(HDUG1+KDUGI)/2 ' КООРДИНАТА СЕРЕДИНЫ ДУГИ 230 L= (10O-SIH(HITTEL)»(RADIUS+8))/8 231 К=(16O+COS(HITTEL)»(RADIUS+16))/8 232 LOCATE L.К 240 PRIHT T(J); 'ВЫВОД ЗНАЧЕНИЯ I-ГО СЕКТОРА 250 CIRCLE( 160, ЮО) , RADIUS. 3, -HDUGI -. OO1, -KDU^I 251 S1=16O-«COS (HITTEL) «RADIUS*. 75 252 S2:1OO-SIH (HITTEL) «RADIUS*. 75 260 PAIHT(S1, S2), J HOD 4,3 'ОКРАСКА СЕКТОРА 270 HDUGI=KDUG1 280 HEXT J 290 EHD В строке 20 отводится память под массив значений Т (п). Далее производится ввод числа отображаемых секторов, их значений и подсчитывается общая сумма (строки 60—110). Если сумма превышает значение 100 %, то выдается сообще- ние об ошибке во вводимых данных (строка 120). При нор- мальном завершении ввода экран очищается, устанавливает- ся режим графического вывода со средней разрешающей способностью. Курсор перемещается на первую строку и вы- 128
водится заголовок (строки 140—160). Устанавливается зна- чение начальной точки дуги для первого сектора — 0 радиан и начальное значение радиуса. Координаты центра окружно- сти взяты в середине экрана (100, 160). В строках 200— 280 строятся сектора диаграммы. Для каждого сектора вы- числяется конец дуги, средняя точка дуги (строки 210—220). Вблизи средней точки выводится соответствующее этому сек- тору значение (строки 230—240), при выводе текста учитыва- ется, что расстояние между строками в текстовом режиме соответствует восьми строкам графического режима. В строке 250 строится сектор, причем кроме дуги на экране проводятся и оба радиуса, для этого в операторе CIRCLE начальная и конечная точки дуги заданы отрицательными значениями. Чтобы значение, определяющее начальную точку, всегда бы- ло отрицательным (оно может оказаться равным нулю для первого сектора), из него вычитается 0,001. В строке 260 за- крашивается текущий сектор, начиная с точки, расположен- ной приблизительно в центре сектора. Для построения следующего сектора начальной точке дуги присваивается конечное значение дуги предыдущего сектора. Задачи для решения Программы, разработанные в примерах 2.62—2.70, могут быть использованы как основа для решения задач 1.115—1.120, 2.35—2.36. • Составить и выполнить на ЭВМ программы для реше- ния задач 1.115—1.120. • Составить и выполнить на ЭВМ программы для реше- ния задач 2.35—2.36. 2.37. Написать программу для построения: а) раскрашенного треугольника по заданным координа- там вершин, отметить точки пересечения высот, биссектрис, медиан; б) п раскрашенных в различные цвета концентрических окружностей, радиусы которых образуют геометрическую прогрессию; в) семейства эллипсов с координатами центра (Хо, Уо) и радиусом г, равным 60 точкам изображения, меняя ко- эффициент сжатия от значения 1/3 до 5/3 с шагом 1/6; г) изображения сферы с параллелями и меридианами; д) изображения цилиндра и его образующих; е) изображение конуса и его образующих; ж) развертки треугольной пирамиды, заданной длина- ми ребер; 5 В Е. Алексеев и др. 129
з) масштабной сетки на экране дисплея для вычерчива- ния графика функции. Линии масштабной сетки сделать менее яркими, чем оси координат. * 2.38. Написать программу, рисующую радугу, т. е. раз- ноцветные дуги концентрических окружностей, опирающиеся на нижнюю границу экрана. 2.39. Луч света, направленный из верхнего угла экрана по главной диагонали, падает на зеркало, установленное случайным образом на экране. Написать программу, изо- бражающую на экране ход луча. * 2.40. Написать программу построения графика функ- ции R = f(z) в полярной системе координат при изменении г от 0 до 2зт с шагом 0,01 для следующих функций: а) б) в) г) д) е) 7? = sin(2z) —четырехлепестковая роза; 7? = sin(7z) —семилепестковая роза; R = 1 -|-sin (2z) — двухлепестковая роза; /?= 1 -|-2 cos (z) —улитка Паскаля; 7?= 1 -|-2 cos (2z) — петельное сцепление; R = az —при а= 1/3 и аргументе г, изме- няющемся в диапазонеО^г^бл с шагом 0,1. Примечание. Отличие построения графика в полярной системе координат от декартовой состоит в том, что координаты точки (/?, z) в полярной системе эквивалентны координатам точки (7? cos z, R sin z) в декартовой. 2.12. РАБОТА С ФАЙЛАМИ ПОСЛЕДОВАТЕЛЬНОГО И ПРЯМОГО ДОСТУПА Интерпретатор языка БЕЙСИК обеспечивает возможность ра- боты с дисковыми файлами данных. Передача данных из оперативной памяти на диск и обратно производится по внутренним каналам, номера которых в программе связываются с именем определенного файла, т. е. перед обращением к файлу его необходимо открыть, а при завершении работы с файлом — закрыть (и тем самым закрыть данный канал). Для этих целей используются операторы OPEN и CLOSE. Интерпретатор позволяет работать с файлами как последова- тельного доступа (поиск записи в файле ведется всегда с начала файла), так и прямого доступа (обращение к записи по номеру за- писи в любом порядке). Выбор метода доступа диктуется в основном характером решае- мой задачи. Последовательный доступ более прост, в этом случае дисковая память используется более экономно, одиако для поиска записи нужно просматривать весь файл от начала до требуемой записи. Корректировку последовательных файлов можно выполнять 130
только переписывая файл. Файлы прямого доступа обычно требуют больше места на диске, но позволяют выполнить чтение или корректи- ровку любой записи за одну операцию ввода-вывода. Файл последовательного доступа Оператор OPEN открывает файлы как для ввода, так и для вывода, связывая номер файла, иными словами, номер канала с име- нем файла. Формат оператора пс OPEN ”сп” FOR [ INPUT )AS номер файла т OUTPUT? I APPEND? * где сп — спецификация файла, состоящая из трех составляющих: [иу:] иф[тф] Здесь иу — имя устройства. Определены стандартные имена устройств: при выводе данных на устройство печати — LPT1; при выводе на диск — А, В, С... или 1, 2, 3, .... Имя устройства можно не упоминать, если вывод осуществляется на системный диск, с кото- рого вводился интерпретатор; иф — имя файла от 1 до 8 символов, задаваемое пользователем, первый символ — буква; тф — тип файла, указывает режим использования. Для некото- рых типов файлов установлены стандартные имена: .DAT — для файла данных при выводе из памяти (по умолчанию тип DAT), .BAS — для программного файла иа языке БЕЙСИК. Режим INPUT открывает существующий на диске файл для считывания его в оперативную память, OUTPUT подготавливает создание нового файла путем записи файла из оперативной памяти иа диск или печатающее устройство, APPEND подготавливает файл для добавления новых записей в конец файла; номер файла — целое десятичное число в диапазоне от 1 до максимального значения (задается при вызове интерпретатора; по умолчанию — 3). Заданный номер используется в операторах вво- да-вывода для обращения к файлу. Например: 1О ОРЕН "CzMASSIV” FOR OUTPUT AS #1 TO OPEN "BrDATAS’ FOR IHPUT AS #2 Оператор 10 открывает файл для вывода данных из оперативной памяти на системный диск. Имя файла на диске С — MASSIV. В программе этому файлу присвоен номер 1; оператор 20 открывает файл для ввода данных с имеющегося файла на диске В в оператив- ную память, обращение к этому файлу осуществляется по номеру файла 2. Оператор CLOSE закрывает файлы, как вводные, так и выво- дные, освобождая номера файлов им соответствовавшие. Его формат 5* 131
nc CLOSE =# список номеров файлов Например, оператор 100 CLOSE # 1,2 обеспечивает закрытие файлов с номерами 1 и 2; а оператор 200 CLOSE обеспечивает закрытие всех файлов, которые были открыты в программе. Чтение записи из файла последовательного доступа, предварительно открытого оператором OPEN, выполняется операто- рами INPUT LINE INPUT tf=. Их действие аналогично соответ- ствующим операторам INPUT, LINE INPUT, используемым для вво- да данных с клавиатуры. Формат операторов: INPUT =#= номер файла, список ввода LINE INPUT & номер файла, переменная При выполнении операторов INPUT # и LINE INPUT # символы последовательно выбираются из дискового файла и ин- терпретируются как числовое или строковое значение в зависимости от типа переменной, которой присваивается значение. Для обнаружения признака конца файла в языке БЕЙСИК ис- пользуется функция обнаружения конца файла — EOF (номер фай- ла). Функция EOF возвращает значение 1 («истина»), если достиг- нут конец файла, и 0 («ложь») — в противном случае. Это значение может использоваться в операторе IF для принятия решения о ходе выполнения программы. Оператор вывода данных PRINT помещает дан- ные из памяти ЭВМ в файл. Формат оператора: пс PRINT //= номер файла, список вывода Оператор PRINT =#= аналогичен ранее рассмотренному операто- ру вывода данных на экран PRINT. Следует отметить, что значения, записываемые в дисковый файл оператором PRINT =#=, должны быть отделены друг от друга симво- лом — разделителем. В качестве разделителя для строковых данных используется запятая или символ возврата каретки, для числовых — запятая или пробел. Один из гарантированных способов расстановки разделителей состоит в том, чтобы присвоить значение «запятая» строковой пере- менной и записывать ее после каждого значения в операторе PRINT #. Оператор INPUT интерпретирует при считывании каждую встреченную запятую как признак конца значения. Пример 2.71. Написать программу, которая записывает в файл последовательного доступа квадраты и кубы 30 пер- вых натуральных чисел. Программа имеет вид 10 ОРЕН "C-.KUB * FOR OUTPUT AS #£ 15 DS=", " 'СИМВОЛ РАЗДЕЛИТЕЛЬ го for i=i то зо 30 PRIKT #2, I«I,D$, I«I«I «1О HEXT I 50 CLOSE #г : EHD 132
Пример 2.72. Написать программу, которая считывает данные из файла KUB, созданного в предыдущем примере и выводит их на экран парами. Программа имеет вид 5 DEFIHT X, Y 10 ОРЕН "C:KUB" FOR IHPUT AS #2 го IF EOF(E) THEH CLOSE #2 : EHD 30 IHPUT #2, X, Y 40 PRIHT "X=";X, "Y=";Y SO GOTO го В результате выполнения программы получим 1 1 4 8 9 27 Пример 2.73. Написать программу, которая записывает в файл последовательного доступа информацию о студентах, проживающих в общежитии: фамилию, индекс группы, до- машний адрес, номер комнаты в общежитии. Если в качестве фамилии студента вводится пустая строка, то выполнение программы прекращается. Программа имеет вид 1О 'СОЗДАНИЕ ФАЛЛА СТУДЕНТ го ОРЕН "С: STUDENT" FOR OUTPUT AS #1 30 D$-"," -ЗНАК РАЗДЕЛИТЕЛЬ 40 IHPUT "ФАМИЛИЯ”; FAM$ SO IF FAH$="" THEH PRIHT "КОНЕЦ" : CLOSE #1 : EHD 60 IHPUT "ГРУППА"; GRUP« 70 IHPUT "АДРЕС ";ADR$ BO IHPUT "НОМЕР КОМНАТЫ”:HUMER® 90 PRIHT #1, FAM$, D», GRUPt, D$, ADR®, D$, HUMER» : GOTO 40 Повторное выполнение программы приведет к удалению файла STUDENT и созданию нового файла с тем же именем. Если необходимо накапливать информацию, то следует в опе- раторе OPEN заменить режим OUTPUT на режим добавле- ния в файл APPEND: ао ОРЕН "С: STUDENT" FOR APPEND AS #1 Пример 2.74. Написать программу, которая выводит список студентов, проживающих в общежитии в комнате XX, на основании информации, записанной в существующий файл STUDENT. Программа имеет вид 133
1О 'ЧТЕНИЕ ИЗ ПОСЛЕДОВАТЕЛЬНОГО ФАЙЛА го OPEN -С: STUDENT" FOR IHPUT AS #1 30 IHPUT "УКАЖИТЕ НОМЕР КОМНАТЫ"; XX* 40 1=0 'ПОРЯДКОВЫЙ НОМЕР СТУДЕНТА В СПИСКЕ 50 IHPUT #1, FAM*, GRUP*, ADR*, HUMER* 60 IF HUMER*=XX* THEH K=K+1 : PRIHT K, FAM*. GRUP* 70 IF HOT EOF(l) THEH 50 ' ПЕРЕХОД .ЕСЛИ HE КОНЕЦ 60 IF K=O THEH PRIHT "НЕТ СВЕДЕНИИ О КОМНАТЕ ";XX* 90 CLOSE #1 : EHD 10 OPEN "GcMAIHLIB" AS #1 го FIELD #1, г AS HUMBER*, 15 AS AUTOR*. 30 AS BOOK*, 1 AS CODE*, Файл прямого доступа Файл прямого доступа состоит из записей, доступ к которым осуществляется в любом порядке. Для обмена данными между про- граммой и файлом прямого доступа используется буфер, который связывается с файлом во время открытии. При выполнении операции чтения запись из файла помещается в буфер, а при выполнении опе- рации вывода, наоборот, содержимое буфера переносится в файл, в область, отведенную для записи с указанным номером. Обработка файлов прямого доступа сводится к выполнению четырех операций: 1) открытию файла прямого доступа; 2) чтению записи из файла; 3) выводу записи в файл; 4) закрытию файла. Открытие файла прямого доступа выполняется оператором OPEN, имеющим формат: OPEN "спф" AS нф [LEN = длина-записи] где спф — спецификации файла; нф — номер файла; длина-записи — длина записи в бантах. Может изменяться от 1 до 32767. По умолчанию принимается значение 128. Чтобы обеспечить доступ к данным, находящимся в буфере, необходимо объявить все переменные, размещаемые в буфере файла, в соответствии с логической структурой записи с помощью оператора FIELD. Формат оператора: FIELD # нф , длина поля AS имя переменной, [, длина поля AS имя переменной}. . . Имя переменной должно быть именем строковой переменной или элемента строкового массива. Пример 2.75. Открыть файл и описать структуру записи для файла прямого доступа, содержащего информацию о личной библиотеке. 134
Каждая запись файла содержит следующую информа- цию (поля): NUMBER? —номер книги (2 символа); AUTOR? —фамилию автора (15 символов); BOOK? — название книги (30 символов); CODE? —признак наличия книги (1 символ); PERSON? — информацию о читателе, взявшем книгу (22 сим- вола); DAT? — год издания (10 символов). Длина записи равна 80 символам (байтам). Для открытия файла и описания структуры можно ис- пользовать операторы: 10 OPEN "GcHAIHLIB" AS #1 20 FIELD #1,2 AS NUMBER». 15 AS AUTOR*. 30 AS BOOK», 1 AS CODE», гг AS PERSON». 10 AS DAT» Использование переменных, объявленных в операторе FIELD. Для выбора значений из буфера достаточ- но использовать переменную буфера в любом выражении или опера- торе языка БЕЙСИК. Для занесения значений в буфер используются специальные операторы присваивания LSET — поместить слева и RSET — поместить справа. Формат операторов: LSET имя переменной — строковое выражение RSET имя переменной —строковое выражение В результате выполнения этих операторов значение строкового выражения помещается в поле, заданное переменной. При использо- вании оператора LSET данные прижимаются к левому краю поля, а при использовании оператора RSET—к правому. Остальные по- зиции заполняются пробелами. Так как переменным, распределенным в буфере файла, можно присваивать только строковые значения, то для занесения в буфер числовых значений используются функции интерпретации памяти, занимаемой числом, в строку символов длиной соответственно 2, 4 и 8 символов в зависимости от типа переменной. Обращение К функциям: MKI? (целочисленное выражение) (выражение с обычной точностью) MKD? (выражение с двойной точностью) Для выполнения обратного действия, т. е. выборки числовых значений из буфера, используются функции CVI, CVS н CVD, кото- рые возвращают соответственно целочисленное значение, значение с обычной точностью и значение с двойной точностью. Вывод записи из буфера файла на диск осуще- ствляется оператором PUT #=: PUT # номер файла, номер записи 135
где номер файла определяет файл, в который выводится запись, сформированная в буфере этого файла; номер записи указывает номер, под которым запись помещается в файл и впоследствии извле- кается из него. Перед выполнением оператора PUT =#= в буфере файла не- обходимо сформировать текст записи в соответствии с используемой структурой. Чтение записи из файла в буфер выполняется опе- ратором GET =#=: GET ф номер файла, номер записи Операнды номер файла н номер записи аналогичны соответ- ствующим операндам в операторе PUT =#=. Для обработки записи, прочитанной в буфер файла, могут использоваться переменные, объявленные в операторе FIELD, или операторы последовательного ввода (INPUT #, LINE INPUT =#=). Закрытие файла прямого доступа выполняется аналогично закрытию файла последовательного доступа с помощью оператора CLOSE. Пример 2.76. Написать программу, в которой создается файл прямого доступа, содержащий сведения о числе деталей с заданным шифром. Шифр соответствует номеру записи. Сведения о числе деталей сведены в целочисленный массив А (10). Создаваемый файл прямого доступа содержит десять записей. Каждая запись содержит порядковый номер записи и одно целочисленное значение, равное числу деталей с шиф- ром, соответствующим номеру записи. Длина записи равна 4 байт. Программа имеет вид 5 DEFJHT I.C, А 1О ОРЕН "C:DETALI" AS #1 LEH=4 20 DIH А(1О) 30 DATA IO, 20, 30, 40, 60, ВО, 90, 1 50, 30, BO 60 FIELD #1, г AS I», 2 AS BUFER$ * ОПИСАНИЕ БУФЕРА TO FOR 1 = 1 TO 10 BO READ A(I) 'СЧИТЫВАНИЕ ЧИСЛА 90 LSET I«=HKI«(I) 'ЗАНЕСЕНИЕ НОМЕРА В БУФЕР ЮО LSET BUFER$=HKI$ (A(I) ) 'ЧИСЛА В БУФЕР НО PUT #1. I 'ВЫВОД ЗАПИСИ В ФАЙЛ 1го нехт I 130 '-------------ПЕЧАТЬ СОДЕРЖИМОГО ФАЙЛА 135 PRIHT "НОМЕР", "КОЛИЧЕСТВО" 140 FOR 1=1 ТО 10 150 GET #1,1 * ЧТЕНИЕ ЗАПИСИ ИЗ ФАЙЛА 160 C=CVI (BUFERt) 'ЧТЕНИЕ БУФЕРА С ПРЕОБРАЗОВАНИЕМ 170 PRIHT I,C : HEXT I 1В0 CLOSE #1 : EHD 136
Пример 2.77. Написать программу создания файла пря- мого доступа, содержащего информацию о личной библиоте- ке. Структура записи файла приведена в примере 2.75. Ин- формация о книгах вводится с клавиатуры. Номером записи является шифр книги. Программа имеет вид 5 • ПРОГРАММА РЕГИСТРАЦИИ КНИГ ЛИЧНОМ БИБЛИОТЕКИ 6 DEFIHT Н 10 ОРЕН "G:HAINLlB" AS #1 го FIELD #1, г AS HUMBER*. 15 AS AUTOR*. 30 AS BOOK*, 1 AS CODE*, aa AS PERSON*. 10 AS DAT* 40 PRIHT "ВВЕДИТЕ ШИФР КНИГИ ’ SO PRIHT " ДЛЯ ОКОНЧАНИЯ РАБОТЫ ВВЕСТИ НУЛЬ " 60 IHPUT Н 70 IF Н=0 ТНЕН PRIHT "КОНЕЦ РАБОТЫ" : CLOSE #1 : EHD ВО LSET HUMBER*=MKI* (Н) 'ЗАНЕСЕНИЕ В БУФЕР ШИФРА 90 IHPUT "ВВЕДИТЕ ИМЯ АВТОРА КНИГИ" ;W* 100 LSET AUTOR* =W* ' АВТОРА КНИГИ НО IHPUT "ВВЕДИТЕ НАЗВАНИЕ КНИГИ"; W* 120 LSET BOOK*=W* 'НАЗВАНИЯ КНИГИ 130 IHPUT "ВВЕДИТЕ ГОД ИЗДАНИЯ"; W* 140 LSET DAT*=W* 'ГОДА ИЗДАНИЯ 150 LSET CODE*="X" 'ПРИЗНАК НАЛИЧИЯ КНИГИ 160 LSET PERSOH*=" • 'ОЧИСТКА ПОЛЯ О ЧИТАТЕЛЕ 170 PUT #1,Н 'ВЫВОД ЗАПИСИ В ФАЙЛ 160 PRIHT :PRIHT : GOTO 40 В строках 1—20 выполняется открытие файла и распре- деление переменных в буфере. В строках 40—70 вводится шифр книги, являющийся номером записи, выполняется проверка на окончание работы, если введенный шифр равен нулю. В строках 80—160 в буфер файла заносится информация о книге: шифр, имя автора, название, год издания, признак наличия книги. В строке 170 осуществляется вывод сформи- рованной записи в файл. Следует иметь в виду, что пере- менную, объявленную в операторе FIELD, нельзя использо- вать в операторах ввода или присваивать ей целочисленное или вещественное значение с помощью операторов присваи- вания. Поэтому в строках 90—140 вводится переменная W?. Пример 2.78. Написать программу, которая в созданном в примере 2.77 файле MAINLIB находит книгу с заданным шифром и регистрирует выдачу книги товарищу, причем в ка- честве признака выдачи книги в поле CODE? помещается символ «W», а в поле PERSON?—сведения о товарище, которому отдана книга. Программа имеет вид 5 ' ПРОГРАММА РЕГИСТРАЦИИ ВЫДАЧИ КНИГ 6 DEFIHT Н, М 10 OPEN "G: HAIHLIB" AS #1 137
го FIELD #1,г AS NUMBERS, 15 AS AUTORS, 30 AS BOOKS. 1 AS CODES. 22 AS PERSONS. 10 AS DATS 40 MAX= LOF (1) /ВО ’ МАКСИМАЛЬНЫЙ НОМЕР ЗАПИСИ 45 PRINT "ЧИСЛО ЗАРЕГИСТРИРОВАННЫХ КНИГ"; МАХ 50 INPUT "ВВЕДИТЕ ШИФР КНИГИ" ;Н 60 IF НхО THEN PRINT "ПРОГРАММА ЗАВЕРШЕНА. • : CLOSE #1 :END 70 IF Н>МАХ THEH PRIHT "ШИФР ОШИБОЧЕН" : GOTO 50 ВО GET #1. Н * ЧТЕНИЕ ЗАПИСИ С НОМЕРОМ Н 90 IF CODES=”W" THEN PRIHT "КНИГА ВЫДАНА":GOTO 50 1ОО IHPUT "ВВЕДИТЕ ДАННЫЕ О ТОВАРИЩЕ"; RS 110 LSET PERSOHS=RS 'КОРРЕКТИРОВКА ЗАПИСИ 120 LSET CODES="W" 130 PUT #1,H 'ЗАНЕСЕНИЕ СКОРРЕКТИРОВАННОЙ ЗАПИСИ 140 PRIHT "ЗАПИСЬ СКОРРЕКТИРОВАНА. '. PRIHT : PRIHT : GOTO 50 В строке 40 вычисляется максимальный номер записи, существующей в файле, для чего использована функция LOF (номер файла), позволяющая получить информацию о длине файла в байтах. Затем в строке 70 проверяется, являет- ся ли шифр введенной книги больше максимального номера записи. Если это так, то выдается сообщение об ошибочном шифре. В строках 110—120 корректируются поля записи: зане- сением в поле CODE? признака выдачи книги W, а в поле PERSON? — сведений о товарище, которому отдана книга. Задачи для решения * 2.41. Написать программу, которая создает файл по- следовательного доступа, содержащий 100 случайных чисел, сгенерированных датчиком случайных чисел с нормальным законом распределения. Ввод параметров — математического ожидания и дисперсии — выполнить по запросу ЭВМ. 2.42. Написать программу, оценивающую качество рабо- ты датчика случайных чисел, созданного в задаче 2.41, для чего построить гистограмму распределения случайных чи- сел, считываемых из файла, с количеством классов распреде- ления, равным 20. * 2.43. Написать программу создания файла «Телефон- ный справочник», объем не более 100 абонентов и содержа- щего следующие сведения об абоненте: ф. и. о. абонента, адрес, номер телефона. 2.44. Написать программу корректировки файла «Теле- фонный справочник», созданного в задаче 2.43. Вводятся ф. и. о. абонента и код корректировки: 1 — добавить запись, 2 — изменить запись, 3 — удалить запись. 2.45. Написать программу создания файла, содержащего сведения о сдаче сессии студентами специальности: индекс группы, ф. и. о. студента, шифры предметов и оценки. 2.46. Написать программу, которая для файла, созданно- го в задаче 2.45, выполняет одну нз следующих функций: 138
а) подсчитывает средний балл по результатам сессии для всех курсов специальности; б) выдает список неуспевающих студентов, упорядочен- ный по курсам, и их процент от общего числа студентов; в) выдает список отличников, упорядоченный по курсам, и их процент от общего числа студентов; г) подсчитывает процент студентов, обучающихся па «хорошо» и «отлично»; д) подсчитывает процент студентов, получивших в сес- сию «удовлетворительно» по всем предметам, и выдает список этих студентов. 2.47. Результаты соревнований по шести видам спорта летней Олимпиады 1988 г. записаны в файл прямого доступа OLIMP. Написать программу, которая выполняет одну из следую- щих функций: а) выдает данные в виде таблицы о всех призерах Олим- пиады — золотая, серебряная, бронзовая медали по запра- шиваемому виду спорта; б) выдает список призеров страны XXX. * 2.48. Создать файл «ТОВАР», содержащий сведения о товарах, хранящихся на складе: шифр товара, наименова- ние товара, количество единиц, стоимость одной единицы. Все записи в файле должны быть отсортированы в порядке воз- растания шифра товара. * 2.49. Написать программу, которая на основании ин- формации, содержащейся в файле «ТОВАР», созданном в за- даче 2.48: а) добавляет новые товары, поступившие на склад; б) производит корректировку записи о товаре с шиф- ром XX — изменение количества, стоимости единицы товара.
ГЛАВА 3 ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ФОРТРАН Язык ФОРТРАН является наиболее распространенным языком, широко используемым в машинах ЕС ЭВМ. В настоящей главе рас- сматриваются вопросы программирования на языках ФОРТРАН-IV и ФОРТРАН-77. Задачи, сформулированные в главе, могут одинако- во успешно решаться с использованием обоих языков, за исключени- ем особо оговоренных случаев. 3.1. ПРОСТЕЙШИЕ КОНСТРУКЦИИ ЯЗЫКА К простейшим конструкциям языка относятся константы, пере- менные, функции и выражения. Для записи простейших конструкций используются следующие символы: прописные латинские буквы, арабские цифры, специальные знаки « + », «—», «*», «/», « = », «(», «)», «.», «,», «’», «&», «ед»,а в языке ФОРТРАН-77 еще и сим- вол «:». Константы. В языке ФОРТРАН используются целые, действи- тельные, комплексные, логические, шестнадцатеричные и символьные (текстовые) константы. Все константы, кроме символьной, могут иметь стандартную и нестандартную длину. Целые константы — последовательность цифр со знаком. Перед положительной константой знак « + » можно не записывать. Например, —1, +0,4, 1989. Целые константы представляются в ма- шине точно. Целая ковстанта стандартной длины при записи в про- грамме ие может содержать более девяти цифр, а целая константа нестандартной длины (2 байт) не может превосходить по абсолютной величине 32767. Действительные константы в программе записыва- ются в естественной форме и в форме с порядком. В машине действи- тельные константы представляются приближенно. Константа в естественной форме имеет целую и дробную части, отделенные друг от друга точкой. Нулевая целая или дробная часть может быть отпущена. Например, —1.5, 0.0, —1., —.5, +17. Константа в форме с порядком состоит нз мантиссы, символа основания системы счисления и порядка. Мантисса записывается как целая или действительная константа в естественной форме. В качест- ве символа основания системы счисления используются символы Е (для констант стандартной длины) или D (для констант удвоенной точности). Порядок представляется в виде целой константы, содер- жащей не более двух десятичных цифр. Мантисса и порядок могут иметь знак. Например, 0.5Е — 8, —1.Е10, 5Е4, +1 Е + 0,2, 1D—12. При записи в программе действительная константа стандартной 140
длины или ее мантисса ие могут содержать более семи цифр, а кон- станты удвоенной точности — не более 16 цифр. Комплексные константы записываются в виде пары действительных констант, разделенных запятой и заключенных в скобки. Первая константа соответствует действительной, а вто- рая — мнимой части комплексного числа. Каждая константа записы- вается в любой форме записи действительных констант. Например, (1.5,—4.7), (1Е2, 1.5Е —8), (4D1, 1.7D—12). Логические константы имеют одно из двух значе- ний — .TRUE, или .FALSE. Стандартная длина логической констан- ты 4 байт, нестандартная — I байт. Символьная (текстовая) константа — последо- вательность любых символов, заключенных в апострофы. Символьная константа может иметь любую длину, не превышающую 255 симво- лов. Например, ’КОРНИ УРАВНЕНИЯ’. Переменные. Для обозначения имен переменных, массивов, фун- кций служат идентификаторы, представлнющие собой комбинацию букв и цифр, начинающуюся обязательно с буквы. Число символов в идентификаторе не более шести. Например, X, YA, Х2, SIGMA, S2C44, ВЕТА5. Различают переменные простые и с индексами. Простые переменные в каждый момент времени имеют одно значение, которое хранится в одной ячейке. Простая переменная обозначается с помощью идентификатора. Переменные с индексами являются элементами мас- сивов. Для хранения каждого элемента массива отводится отдельная ячейка. Переменная с индексами обозначаетсн идентификатором мас- сива, за которым в круглых скобках через запятую записываются 1—7 индексов. Индекс представляется константой, переменной или выражением и должен быть целочисленным значением. Например, В (5) означает, что это пятый элемент массива; А (I) —t-й элемент массива А; X (5, 6) — элемент пятой строки, шестого столбца матри- цы X; Z (3,2*N—1) —элемент третьей строки, (2и—1)-го столбца. Описание типа переменных. Переменная может получать значения любой константы (целой, действительной, комплексной, логической или символьной). Указание типа переменной осуще- ствляется с помощью описаний. Существуют три способа описания типа переменных Описание типа переменных по соглашению (умолчанию). Переменные, идентификаторы которых начинают- ся с букв I, J, К, L, М, N, считаются переменными целого типа; пере- менные, идентификаторы которых начинаются с других букв,— пере- менными действительного типа. Этот способ позволяет описывать только переменные целого и действительного типов стандартной дли- ны (4 байт). Для описания размеров массивов, тип которых определяется по соглашению, используется оператор DIMENSION. В нем указывают- ся идентификатор массива и далее в круглых скобках максимальные значения индексов в виде целых чисел. Например, оператор DIMEN- SION Х(20), Y (5, 10) описывает одномерный массив X, индекс эле- 141
ментов которого изменяется от 1 до 20, двумерный массив Y, первый индекс которого (индекс номера строки) изменяется от 1 до 5, а вто- рой индекс (индекс номера столбца) — от 1 до 10. Описание типа переменных операторами яв- ного описания. Эти операторы позволяют описывать перемен- ные любого типа как стандартной, так и нестандартной длины, а так- же тип, длину и размер массива. В качестве указателей типа исполь- зуются ключевые слова: REAL — действительный, INTEGER — целый, COMPLEX — комплексный, LOGICAL — логический, DOUB- LE PRECISION — двойной точности. Оператор явного описания имеет вид <*sai*si (/ii), 02*32 (Аг), • - - a„*s„ (fe„), где t — указатель типа; s — общий указатель длины в байтах, а, — идентификатор переменной или массива; з,- — указатель длины аг, ki — размер массива. Если указатель длины s( отсутствует, то длина определяется по з. Если s также отсутствует, то длина будет стандартной. Оператор REAL*8X, Y (20), А*4 (5, 8) описывает действительно- го типа: переменную х длиной 8 байт; массив Y, состоящий из 20 элементов длиной 8 байт каждый; матрицу А, состоящую из пяти строк и восьми столбцов стандартной длины. Оператор INTEGER X (40), Y*2, Z*2 (10) описывает целочис- ленные: массив X, состоящий из 40 элементов стандартной длины; переменную у и массив Z, состоящий из десяти элементов нестандар- тной длины (2 байт). Операторы LOGICAL*1C, N (5) и COMPLEX Q, D*16 (5), Е (8) описывают логические и комплексные переменные и массивы стандар- тной и нестандартной длины. В языке ФОРТРАН-77 переменные и массивы могут иметь сим- вольный тип. Для их описания используется оператор CHARACTER*nai*/i1 (fei), a2*«2 (Лг).... где п, п, — длина символьных переменных и элементов массивов в байтах. Например, оператор CHARACTER*80A, R (10) описывает сим- вольную переменную А и массив R, состоящий из десяти элементов. Длина символьной переменной и элементов массива составляет 80 байт. В языке ФОРТРАН-77 нижняя граница изменения индекса мо- жет быть равной нулю или отрицательной, поэтому при описании массива указываются верхняя и нижняя границы изменения индек- сов, которые могут быть выражениями целого типа, разделенные символом «:». Например, оператор DIMENSION X(0:2*N — 1) запи- сан правильно, если N определено как параметр до оператора DI- MENSION. Описание типа переменных оператором IM- PLICIT. Этот оператор описывает тип и длину переменных и масси- вов, идентификаторы которых начинаются с букв, указанных в нем. 142
Оператор IMPLICIT имеет вид IMPLICIT Ii*siCi, ti*S2C2, ..., где h, Si, c, — соответственно указатели типа, длины, величин. Оператор IMPLICIT INTEGER (A, D —F), REAL*8 (R—Т, Z) указывает, что переменные, начинающиеся с буквы А, а также с букв от D до F (т. е. D, Е, F),— целого типа стандартной длины (так как S отсутствует), а переменные, начинающиеся с R, S, Т и Z,— действи- тельного типа нестандартной длины. Следует иметь в виду, что описание переменных операторами явного описания отменяет описание оператором IMPLICIT и по соглашению. Задачи для решения * 3.1. Описать переменные: 1) z и q как переменные целого типа стандартной длины, массив S целого типа из десяти элементов нестандартной длины, действительную пе- ременную х и массив Y из 50 элементов нестандартной дли- ны; 2) i, k как целочисленные переменные нестандартной длины, целочисленный массив N из десяти элементов стан- дартной длины, логическую стандартную переменную с; 3) k как действительную переменную стандартной длины, массив комплексных переменных из 40 элементов нестандар- тной длины. * 3.2. Описать переменные, используя все виды описаний: 1) i, j, k и I как переменные целого типа нестандартной длины; массив KOL целого типа из 15 элементов стандартной длины; a, b, с, d, е, f как действительные переменные нестан- дартной длины; 2) начинающиеся с букв от А до К как цело- численные нестандартной длины, массив D1 как действитель- ный, состоящий из 20 элементов нестандартной длины; 3) массивы X и Y как действительные, состоящие из 30 эле- ментов каждый, XS как действительную переменную стандар- тной длины, XSO как действительную переменную стандарт- ной длины. 3.3. Определить тип и длину переменных и массивов: 1) I, II, L, Nl, Q и KOL, NOM, QI, R, описанных в опе- раторах IMPLICIT IHTEGER»a (Н-К, Q) INTEGER I1,KOL(5),R(5, 8) DIMENSION NOH(8),G1 2) LST, L, NOMER, N, N5A, XI, LIST, N5 и X, LS, опи- санных в операторах 143
IMPLICIT REAL (L-P) INTEGER«2 N5, X(50) REAL* 8 LST, LS(5),X1 3) N, INT, I, DI и D, E, IN, описанных в операторах LOGICAL N«1,D5 REAL»B INT, E(6) DIMENSION IN(8) Функции. Функция записывается в виде идентификатора функ- ции и параметров, список которых указывается в круглых скобках. Например, F (Xl, Х2..... XN). Правила записи идентификаторов функций такие же, как и переменных. За наиболее употребимымв функциями закреплены имена. Некоторые из них приведены в табл. 3.1. Значениями этих функций может быть константа целого, действительного или комплексного типа стандартной или нестандарт- ной длины. Аргумент может быть константой, переменной, функцией или выражением. Таблица 3.1 Функция Матема- тическое обозна- чение функции Запись функции в языке ФОРТРАН Функция Матема- тическое обозна- чение функции Запись функции в языке ФОРТРАН Синус Косинус Тангенс sin х COS X tgx SIN (X) COS (X) TAN (X) Логарифм натураль- ный 1п X ALOG (X) Арксинус Арккосинус Арктангенс arcsin x arccos x arctg x ASIN (X) ACOS (X) ATAN (X) Корень квадрат- ный -\[х SQRT (X) Экспонента ex EXP (X) Модуль |х| ABS (X) Примечание. Все функции — действительные, стандартной длины. Имя действительной функции нестандартной длины начи- нается с буквы D, а комплексной — с буквы С. Например, DSIN, DLOG, СЕХР, CDSIN. Выражения. Различают выражения арифметические, логические и строковые (символьные). Арифметическое выражение записывается с по- мощью констант, переменных, функций, знаков арифметических опе- раций и круглых скобок. Результатом вычисления значения арифме- тического выражения является числовая константа (целая, действи- тельная или комплексная). Порядок выполнения операций в выражении задается скобками. При отсутствии скобок операции выполняются в порядке старшинст- ва: вычисление функции, возведение в степень, умножение или деле- ние, сложение или вычитание. Операции одного порядка выполняют- 144
ся последовательно слева направо. Операция извлечения корня за- меняется возведением в дробную степень. Следует иметь в виду, что комплексную константу можно воз- водить только в целую степень и комплексная константа не может быть показателем степени. Задачи для решения * 3.4. Записать следующие арифметические выражения: 1) х а + bx , .о ---------; 2) —Ц—; 3) ех — 8ИГХ; \+^/(2у) cd 4) 1 Ч-arctg(х/(1 + д/х)); 5) ; а л1х — Ь2 ~\[х 6) —-----„ _ v ; 7) ах3—fex2+ |а| cos2 |х|; х+0,5 sin х3 —cos х3 х™ — ат ’ 2? = 9) 10) e“°xsin(<o^ + <p); И) ?!-; аг — ах + сг 12) д/х —2 Д^Ц-е. Логическое выражение. Простейшее логическое вы- ражение — отношение вида ayb, где у — знак операции отношения: .GT.—>; .GE.—>; .LT.— <; .LE.—sg; .EQ.—=; .NE.—¥=; а и b — арифметические выражения целого или действительного типа либо строковые. Более сложные логические выражения строятся с помощью знаков логических операций: .NOT.— НЕ; .AND.— И; .OR.— ИЛИ. Логическое выражение может принимать значения или .TRUE, или .FALSE. Порядок выполнения логических операций следующий: сначала вычисляется значение отношений, затем операции .NOT.; .AND. и .OR. В языке ФОРТРАН-77 используются еще логические операции эквивалентно .EQV. и неэквивалентно .NEQV., имеющие самый ни- зкий приоритет. Задачи для решения * 3.5. 1. Записать логические выражения, определяю- щие условия, при которых можно вычислять следующие арифметические выражения; a) z=l/(xy); б) z=a/ln у, в) z = yjx/(\n у + х); г) х — (Ь — д/^ — 4ас); д) z = In у/(х — у). 2. Записать условия кратности трем для целочисленной переменной п. 3. Записать условия кратности пяти одновременно двух целочисленных переменных а и Ь. 145
Строковое выражение. Над символьными данными до- пускается операция присваивания и сцепления, обозначаемая симво- лом «//». Например, операторы CHARACTER*4 А, В CHARACTER*8 С А=’МАХ’ В =’БАЛЛ’ С=А//В присвоят переменным А, В значения ’МАХ’ и ’БАЛЛ’, а переменной С — значение ’МАХ БАЛЛ’. Длн выделения подстроки вслед за переменной или элементом массива в круглых скобках указывается через символ «:» два целых числа, первое из которых указывает номер первого выделяемого символа, второе — номер последнего. Например, если символьная переменная FAM(5) имеет значения ’ИВАНОВ А.К..’, то оператор присваивания FAM1 = FAM (5) (1:6) присвоит переменной FAM1 в качестве значения подстроку ’ИВАНОВ’. В языке ФОРТРАН-77 используются следующие символьные функции: LEN (XI) —определяет длину символьной строки XI; INDEX (XI, Х2)— определяет номер позиции в строке XI, начиная с которой в нее входит подстрока Х2; CHAR (XI) — преобразует целый аргумент XI в соответствующий символ; ICHAR(Xl) —преобразует символьный аргумент XI длиной в 1 байт в соответствующее целое. 3.2. ВВОД И ВЫВОД ДАННЫХ Ввод и вывод значений простых переменных Для ввода и вывода данных используются операторы READ и WRITE совместно с оператором FORMAT. Общий вид операторов: READ (т, п) s WRITE (m, n) s n FORMAT (c) где n — метка оператора FORMAT; s — список переменных для вво- да-вывода; с — список спецификаций; т — номер устройства вво- да-вывода. В ДОС ЕС для стандартного устройства ввода с перфокарт т = 1, для устройства вывода т = 3, а в ОС ЕС соответственно т = 5 и zn = 6. Список спецификаций определяет формат данных и их располо- жение на строке при вводе или выводе. Наиболее употребимы специ- фикации: а1и< — для ввода-вывода значений переменных целого ти- па; aFw.d — для ввода-вывода значений действительных переменных, представленных в основной форме; aEw.d и aDw.d— для ввода- 146
вывода значений действительных переменных в форме с порядком стандартной и нестандартной длины; аХ — для пропуска позиций при вводе и выводе; аН (текстовая константа) и литернал —для вывода на печать текстовых констант; аАге> — для ввода-вывода значений символьных переменных; aLw — для ввода-вывода значений логиче- ских переменных, где w — общее число позиций, отводимых под константу на строке, перфокарте или бумажной ленте; d — число позиций, отводимых под дробную часть константы; а — коэффициент повторения спецификации. Например, 315 означает, что надо ввести или вывести три кон- станты целого типа, под каждую из которых отводится пять позиций: 2F6.2 — ввести или вывести две действительные константы в основной форме, каждая из которых занимает вместе со знаком числа и деся- тичной точкой шесть позиций, в том числе две позиции для дробной части; 6Е12.5 — ввести или вывести шесть действительных констант в форме с порядком, каждая из которых занимает 12 позиций (знаки числа и порядка, две цифры порядка, буква Е, десятичная точка, цифра в целой части мантиссы, пять цифр в дробной части мантиссы), при этом очевидно, что w~^d-\-7\ 5Х — пропустить пять колонок при вводе информации с перфокарты или пять позиций при печати; ’РЕШЕНИЕ УРАВНЕНИЯ’ или 18Н РЕШЕНИЕ УРАВНЕ- НИЯ означает, что надо вывести на печать 18 символов; 2L4 — ввести или вывести две логические константы, занимающие четыре позиции (при выводе будет печататься Т для константы, имеющей значение •TRUE., и F — при значении .FALSE. При выводе на печать первый символ в строке является управля- ющим и не печатается. Он может иметь следующие значения: lj (пробел) — пропуск одной строки, 0 — пропуск двух строк, 1 — печать с новой страницы, -|-печать в той же строке. В операторе FORMAT может использоваться косая черта, озна- чающая переход на новую строку при вводе или выводе. Например, оператор FORMAT (I3/5F4.1) означает, что на первой строке в трех позициях располагается целая константа, а на второй строке — пять констант в основной форме. В операторе FORMAT (13/(5Е 14.6)) внутренние скобки означа- ют, что начиная со второй строки все остальные строки содержат кон- станты, соответствующие спецификации 5Е14.6. Для ввода значений переменных: 1 = 170, К= —15, А = — —23.065, В=—0.5Е—12 операторы ввода н FORMAT должны быть следующими: READ (5,7) I, К, А, В 7 FORMAT (213, F7. 3, Ев. 1) При печати значений этих же переменных операторы вывода и FORMAT с учетом пробелов между печатаемыми числами имеют вид: WRITE (6,6) I.K.A.B в FORMAT (1Н , 214, F8. 3, Е9. I) 147
При этом числа на строке располагаются так: lj 170 lj — 15 i_i —23.065 i_i — 0.5Е — 12 Если необходимо отпечатать значения переменных вместе с их наименованиями, то используют спецификации Н или литерал. Тогда оператор FORMAT имеет вид в FORMAT (ЗН 1 = , 13, ЗН К=, 13, ' A=',F7. 3, ‘ В=',Еа. 1) При этом данные отпечатаются в следующем виде: 1= 170i_iK= — 15i_j А= — 3.065i_iB=—0.5Е —12 Для ввода и вывода символьных данных используется специфи- кация aAw, где а — коэффициент повторения спецификации, w — длина поля, которая при вводе обозначает число вводимых символов, а при выводе — ширину поля, отведенную для символьных данных. Если длина символьной константы больше, чем а>, то при вводе кон- станта усекается слева, а если меньше, то располагается в левых позициях поля, а в остальных позициях ставятся пробелы. При опре- делении длины символьной константы учитываются все символы, включая пробелы. Если длина символьной константы больше длины поля, то при выводе выводятся самые левые символы, в противном случае символы располагаются в правых позициях поля, а перед ними находятся пробелы. Задачи для решения * 3.6. Записать операторы ввода и вывода для следую- щих переменных: 1) NAME=1, KOL = 20, А= —172.04; 2) Х=—25.004; Y= 170.725, Z = 0.17E—3; 3) А = 70.0, В= — 1.2, С=—7.3 (вывод переменных осуществить вместе с их наименованиями); 4) Е = 0.573£—12, F= 121.001—25; D = 0.235 17; 5) А=—2., В = 7.5, С=1Е —6. Перед выводом на печать отпечатать заголовок ИСХОДНЫЕ ДАННЫЕ. * 3.7. Записать 1) операторы ввода Х = 0,9879£—2, Y = —197.ЕЗ, используя спецификацию Е; 2) операторы ввода Z= — 0.12597Е2, W=0.63574, используя спецификации Е и D; 3) операторы ввода К=121, N=—8, Х = 0.50£6, используя спецификации I и Е; 4) операторы вывода для печати заголовка РЕЗУЛЬТАТЫ СЧЕТА; 5) операторы вы- вода для печати заголовка КОРНИ УРАВНЕНИЯ, а в следу- ющей строке — XI =0.66666, Х2=—0.33333; 6) операторы вывода для печати заголовка таблицы АРГУМЕНТ i_j i_i i_i X ФУНКЦИЯ Y Ввод и вывод значений элементов массивов Существует три способа организации ввода и вывода массивов. 1. Массив вводится или выводится целиком. В этом случае в операторе ввода или вывода указывается только имя массива: 148
DIMENSION X(20) READ (5, 2) X 2 FORMAT (1 OFB. 3) WRITE(6. 3) X 3 FORMAT(1OF12. 3) 2. Ввод и вывод элементов массива осуществляется в цикле: DIMENSION Х(2О) DO 2 1 = 1, 20 READ(5, 1) X(I) 2 WRITE(8, 3) X(I) 1 FORMAT (FB. 3) 3 FORMATtFIR. 3) 3. Используются автоматические индексации: DIMENSION X(20) READ(5,1) (X(I), 1=1,20) 1 FORMAT(1OFB. 3) WRITE(6,2) (X(I), 1 = 1, 20) 2 FORMAT (10F12. 3) Последние два способа позволяют осуществлять ввод и вывод части массивов: DIMENSION Х(2О) READ(5,1) (Х(1), 1=1, 15) 1 FORMAT (10FB. 3) Эти способы применимы также для двумерных и многомерных массивов. Например, ввод матрицы с использованием автоматических индексаций имеет вид DIMENSION Х(5, 10) READ(5,1) ( (X(I, J) . 1 = 1,5) , J= 1, 1О) 1 FORMAT (1 OFB. 3) Первым изменяется индекс, заключенный во внутренние скобки. При такой записи оператора ввода элементы матрицы вводятся по столбцам. При выводе с помощью операторов DIMENSION Х(1О, В) WRITE(6, 2) ( (X (I, J) , J= 1, В), 1 = 1, 10) 2 FORMAT(ВЕ12. 4) матрица печатается в общепринятом виде по восемь элементов в каждой строке. DIMENSION X (20, 30) READ (5, 1) N, M,((X(I, J), 1=1, N) J=l, M) 1 FORMAT (212/(10F8.3)) 149
Пример показывает ввод матрицы пут (и ^20, лц^ЗО): сначала вводятся значения п и т по спецификации 12. Косая черта в операторе FORMAT означает, что перед ней указывается располо- жение чисел на первой строке, а после нее — на второй. Внутренние скобки для 10F8.3 означают, что не только на второй, но и на всех последующих строках располагается по десять чисел в спецификации F8.3. Аналогично назначение косой черты и при выводе. Задачи для решения * 3.8. Записать операторы ввода массива С, состоящего из 200 элементов. Под каждое число отвести по пять позиций, предусмотрев в дробной части одну цифру. * 3.9. Записать операторы ввода массивов X и Y, со- стоящих из 100 элементов каждый. Под каждое число отвести восемь позиций, предусмотрев в дробной части три цифры. * 3.10. Записать операторы ввода значений переменных а, Ь, с, под которые отвести соответственно пять, шесть и семь позиций, и массива D, состоящего из 80 элементов, зани- мающих по шесть позиций каждый. Для дробной части всех чисел отвести две позиции. * 3.11. Записать операторы ввода значений первых т элементов, используя спецификацию F6.2, в массив D, состоящий из 120 элементов. » 3.12. Записать операторы ввода матрицы A(nXm), где п ^30, /п^ЗО, используя спецификацию F5.1. Элементы матрицы расположить по столбцам. * 3.13. Записать операторы ввода значений переменных а и Ь, используя спецификацию F6.3, и матрицы Х(иХи) (и «С 100), используя спецификацию F4.2. Элементы матрицы расположить по строкам. * 3.14. Записать операторы ввода целочисленного мас- сива М состоящего из k элементов (/г ^120). Каждый эле- мент массива должен занимать три позиции. * 3.15. Записать операторы ввода массивов N0M и X, состоящих из и элементов (п^ЮО), занимающих по пять позиций каждый. Элементы массивов расположены парами: NOMi, X,; NOM2, Х2 и т. д. * 3.16. Решить задачу 3.15, если элементы массивов рас- положены в таком порядке: сначала элементы массива NOM, а затем элементы массива X. * 3.17. Записать оператор печати массива Z, состоящего из 50 элементов. В каждой строке отпечатать десять чисел, используя спецификацию F12.4. * 3.18. Записать оператор печати массивов X и Y, со- стоящих из 20 элементов каждый. Сначала отпечатать эле- 150
менты массива X, а затем массива Y, используя специфика- цию Е12.4. * 3.19. Отпечатать значения аргумента и функции в два столбца, используя спецификацию F6.2 и Е12.3 соответствен- но, если значения аргумента сведены в массив X, а функ- ции — в массив Y. Оба массива состоят из десяти элементов. » 3.20. Записать оператор печати значения переменной т на одной строке по спецификации 15 и массива Y, состоя- щего из т элементов, по восемь элементов на каждой строке, используя спецификацию Е15.5. * 3.21. Записать оператор печати массивов А, В, С, со- стоящих из 20 элементов каждый. В строке печатать порядко- вый номер элемента и по одному элементу каждого массива, используя спецификацию Е20.5. * 3.22. Записать оператор печати матрицы А, состоящей из десяти строк и восьми столбцов, в общепринятом виде, используя спецификацию Е13.4. * 3.23. Записать оператор печати матрицы А, состоящей из 30 строк и 30 столбцов. Элементы располагать по строкам, используя спецификацию Е12.3. * 3.24. Записать оператор печати матрицы Z, состоящей из 15 строк и 8 столбцов, в общепринятом виде, используя спецификацию Е12.3. Слева перед каждой строкой печатать номер строки. » 3.25. Решить задачу 3.24, выводя на печать номера не только строк, но и столбцов. Номер столбца печатать над серединой элемента. Номера столбцов сведены в массив NOM. » 3.26. Вывести на печать левую треугольную матрицу, используя спецификацию F8.2, если дана матрица Х(10Х Ю). * 3.27. Решить задачу 3.26, выводя на печать правую треугольную матрицу. * 3.28. Вывести на печать элементы главной диагонали матрицы А (10X10), используя спецификацию Е12.3. * 3.29. Записать оператор печати матрицы С, состоящей из восьми строк и пяти столбцов, в общепринятом виде, ис- пользуя спецификацию Е20.5. Перед матрицей отпечатать заголовок ЗНАЧЕНИЯ МАТРИЦЫ С. 3.3. ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ ЛИНЕЙНОЙ СТРУКТУРЫ Все операторы языка ФОРТРАН подразделяются на выпол- няемые, используемые для указания действий и порядка их выпол- нения, и невыполияемые, служащие для описания величин, формы представления данных при вводе-выводе и т. д. Для записи 151
линейных программ чаще используются выполняемые операторы — присваивания, ввода, вывода, останова (STOP) и невыполняемые операторы (FORMAT и END). Оператор присваивания служит для вычисления значения ариф- метического или логического выражения и присваивания этого значе- ния имени переменной. Общий вид оператора о = а, где v — имя переменной, значение которой вычисляется; а — арифметическое или логическое выражение. Если выражение а арифметическое, то и переменная о прини- мает числовое значение. Если выражение а логическое, то и перемен- ная v должна быть логической. Результат вычисления выражения преобразуется к типу и длине, соответствующим переменной п. На- пример, Х=А-|-1. Значение выражения /V4-1 —целое число. Пере- менная х по соглашению является действительной, поэтому целое число сначала преобразуется в действительную форму, затем при- сваивается переменной х. Если z описана как целая переменная нестандартной длины, то какой бы тип и длину не имел результат вычисления выражения правой части оператора Z = 2*X*(SIN (N*X)4- К), ему присваивается целая константа нестандартной длины. Преобра- зование действительной константы в целую осуществляется отбрасы- ванием дробной части числа. Если результат вычисления выражения является комплексной константой, а переменная в левой части оператора — целая или действительная, то коэффициент при мнимой единице отбрасывается. Если переменная в левой части оператора комплексная, а выражение имеет действительное значение, то переменной присваивается значе- ние, состоящее из действительной части комплексной переменной, а мнимая часть получает значение 0. Оператор STOP используется для завершения выполнения про- граммы, когда вычисления закончены. Если снова продолжить вы- числения, то выполнение программы начинается с первого оператора. Оператор PAUSE также используется для прекращения вы- числения. Однако если снова продолжить вычисление, то машина будет выполнять программу, начиная с оператора, следующего за оператором PAUSE. Оператор END используется для обозначения конца программы. По нему никаких действий машина не выполняет. Это самый послед- ний оператор программы. В программе сначала записываются невыполняемые операторы, а затем выполняемые. Исключение составляет иевыполняемый опера- тор FORMAT, который может стоять в любом месте программы до оператора END. Все переменные, используемые в программе, описываются либо па соглашению, либо операторами описания. 152
Исходные данные должны быть определены (заданы своими значениями) до их использования. Это достигается либо оператором присваивания, либо оператором ввода, либо оператором DATA, либо оператором явного описания. Операторы в программе должны располагаться в той последова- тельности, в которой оии будут выполняться. Пример 3.1. Составить программу для вычисления вы- сот треугольника со сторонами о, Ь, с по формулам: ha=t/a\ hb = t/b, hc = t/c, где t=2 д/р(р—а)(р — Ь)(р — с), p=(a + b + с)/2. Схема алгоритма приведена на рис. 1.1. Программа имеет вид READ (5, 1) А, В, С 1 FORMAT (3F6. 2) Р=(А+В+С)/2 T=SQRT(Р*(Р-А)*(Р-В)*(Р-С))*2 НА=Т/А НВ=Т/В нс=т/с WRITE (6, 2) НА. НВ, НС г format (ЗЕ1 г. «•> STOP END Программа, разработанная в примере 3.1, может быть использо- вана как основа для решения задач 1.1 —1.9. • Составить программы для решения задач 1.1 —1.9. 3.4. ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ РАЗВЕТВЛЯЮЩЕЙСЯ СТРУКТУРЫ Для нарушения естественного порядка выполнения операторов используются управляющие операторы. Оператор перехода GOTO п применяется для организации бе- зусловного перехода к оператору, имеющему метку п. В качестве метки используется целое число без знака, содержащее 1—5 цифр. Метка ставится перед оператором. Оператор, следующий за операто- ром GOTO, обязательно должен иметь метку, так как в противном случае он не будет выполняться. Условный оператор используется для изменения естественного порядка выполнения операторов после проверки некоторого условия. Различают условные арифметический и логический операторы. Условный арифметический оператор имеет внд IF (с) «1, п2, п3, где а — арифметическое выражение; Hi, п2, «з — метки. 153
При fl<0 осуществляется переход к оператору с меткой nt, при а=0 — к оператору с меткой пг и при а>0 — к оператору с меткой Пз. Оператор, следующий за условным арифметическим оператором, должен иметь метку. Условный логический оператор имеет вид IF (6) s где b — логическое выражение; s —• любой выполняемый оператор, кроме другого условного логического и оператора цикла. Если логическое выражение b имеет значение .TRUE., то вы- полняется оператор s и далее оператор, следующий за условным, если оператор s не является управляющим и не осуществляет пере- ход к другому месту программы. Если же b имеет значение .FAL- SE., то оператор s пропускается и выполняется оператор, следующий за условным. В языке ФОРТРАН-77 используется также структурный услов- ный оператор, имеющий внд: IF (6) THEN Si ENDIF где b — логическое выражение; Si — последовательность операторов. Если логическое выражение имеет значение .TRUE., то выпол- няется последовательность операторов si, в противном случае выпол- няется оператор, следующий за оператором ENDIF. Другая модификация структурного условного оператора имеет вид IF (6) THEN Si ELSE s2 ENDIF где s2 — последовательность операторов. Если логическое выражение имеет значение .TRUE., то выпол- няется последовательность операторов si, в противном случае — последовательность операторов s2. Последовательности s, и s2 могут быть пустымн или содержать любые операторы языка, в том числе и другие структурные условные операторы. Прн этом каждый структурный условный оператор до- лжен заканчиваться своим оператором ENDIF. Пример 3.2. Составить программу для вычисления 2 = х3/#> гДе «/=sin (nx)-f-0,5. Схема алгоритма приведена на рис. 1.5. Для реализации разветвления использовать услов- ный арифметический оператор, проверяющий условие у = 0. Если у=0, то организовать переход к оператору с мет- кой 2, которую должен иметь оператор, осуществляющий вывод на печать Y = 0. Если у¥=0, то осуществить переход 154
к оператору с меткой 3, который должен вычислять z. После печати z организовать переход к оператору STOP с помощью оператора GOTO l_i 4. Программа решения имеет вид READ(5, 1) X. N 1 FORMAT (F4. 1, 12) Y=SIN (N»X) tO. 5 IF (Y) 3,2,3 3 Z=X«»3/Y WRITE(6, 5) Z 5 FORMAT (El 2. 4) GOTO 4 2 WRITE(6, 6) 6 FORMAT(4H Y=O) 4 ' STOP END При использовании условных логического или структурного операторов программа имеет внд READ (6,1) X, N 1 FORMAT (F4. 1, 12) 1 YzSIN(N»X)+O. 5 IF (Y. EQ. О) GOTO 2 Z=X**3/Y WRITE(6, 5) Z 6 5 FORMAT (El 2. 4) GOTO 4 2 WRITE(6, 6) 6 FORMAT(4H Y=O) 5 4 STOP END READ(5, 1) X, N FORMAT(F4. 1, 12) Y=SIN (N«X)+O. 5 IF (Y. EQ. O) THEN WRITE(6,6) FORMAT(4H Y=O) ELSE Z=X»«3/Y WRITE(6, 5) Z FORMAT (El 2. 4) ENDIF STOP END Пример 3.3. Составить программу для вычисления ( sin х, если х^а; z=-lcosx, если a<x<ft; ( tg х, если х> ft, используя условный арифметический оператор. Схема алгоритма приведена на рис. 1.6. Программа имеет вид READ (5, 1) А. В, X 1 FORMAT (3F5. 2) IF (Х-А) 2, 2, 3 2 Z=SIN(X) GOTO 6 3 IF (Х-В) 5,4,4 4 Z=TAN(X) GOTO 6 5 Z=COS (X) 6 WRITE(6, 7) Z 7 FORMAT(F8. 4) STOP EHD 155
Если х— а^О, то осуществляется переход к оператору с меткой 2, в противном случае — к оператору с меткой 3. Здесь проверяется одно из оставшихся условий. Если х — Ь^О, то организуется переход к оператору с меткой 4, в противном случае — к оператору с меткой 5. Затем обяза- тельно осуществляется переход к оператору печати. Пример 3.4. Составить программу для упорядочивания трех чисел (а, Ь, с) по возрастанию. Схема алгоритма при- ведена на рис. 1.7. Программа имеет внд READ ( 5, 1) А, В, С 1 FORMAT (3F4. 1) IF (A. LE. В) GOTO 2 Н=А А=В В=Н 2 IF (A. LE. С) GOTO 3 Н=А А=С С=Н 3 IF (В. LE. С) GOTO Ч Н=В В=С С=Н 4 WRITE(6, 5) А, В, С 5 FORMAT ( 3F6. 1 ) STOP END Программы, разработанные в примерах 3.2—3.4, могут быть использованы как основа для решения задач 1.10—1.22. • Составить программы для решения задач 1.10—1.22. 3.5. ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ Рассмотренных выше операторов вполне достаточно для органи- зации цикла, так как для этого необходимо (см. гл. 1): задать перед циклом начальное значение параметра цикла (с помощью оператора присваивания); в цикле вычислить текущее значение параметра (с помощью оператора присваивания); проверить условия окончания цикла (с помощью логического выражения); управлять циклом (с по- мощью управляющего оператора). Пример 3.5а. Составить программу для вычисления у = а3/(а2 + х2) прн О^х^З, Дх = 0.1. Схема алгоритма при- ведена на рис. 1.11. Программа имеет внд 156
READ (5, 1) A 1 FORMAT(F4. 1) X=O. 2 Y=A»*3/(AmA+X*X) WRITE(6, 3) Y 3 FORHAT(E12. 4) X=X+O. 1 IF (X. LE. 3. 05) GOTO 2 STOP END Пример 3.56. Составить программу для вычисления чле- нов бесконечного X2 х3 рядах,—,—,.. х" п! ’ .. с точностью до члена х" п! <е, используя условный арифметический оператор. Схема алгоритма приведена на рис. 1.12. Программа имеет вид READ (5, 1) X, EPS 1 FORMAT (F4. 1,Е7. 1) Y=l. N=1 г y=y»x/h N=N+1 WRITE(6, 3) Y 3 FORMAT(F6. 3) IF (Y-EPS) 4, 4, 2 4 STOP END В примере 3.56 цикл — итерационный. Для организации таких циклов наиболее удобно использовать условный опера- тор. При известном числе повторений программа получается более компактной и наглядной, если использовать для орга- низации таких повторений специальный оператор цикла. Оператор цикла имеет вид DO п i = tn\, тг, тз, где п — метка последнего оператора, входящего в цикл; i — параметр цикла — простая переменная целого типа, начальное значение кото- рой «1, конечное значение тг и шаг изменения тз (т\, m2, т3 — целые числа без знака или целочисленные переменные, значения которых должны быть определены до оператора цикла). Если т3 = 1, то оператор цикла имеет вид DO п i = mi, тг. В языке ФОРТРАН-77 параметры i, т\, тг, т3 могут быть действи- тельного типа, a mlt тг, тз могут быть выражениями. Последним оператором цикла не может быть управляющий опе- ратор (за исключением условного логического, не содержащего уп- 157
равляюшего оператора). В этом случае для обозначения конца цикла используется оператор CONTINUE, обязательно имеющий метку. Входить в цикл можно только через оператор DO. Выход из цикла можно осуществить двумя способами: естествен- ным, когда цикл выполняется заданным количеством раз (в этом случае после выхода из цикла параметр цикла не сохраняет своего значения); с помощью управляющего оператора, находящегося внут- ри цикла (в этом случае параметр цикла сохраняет свое значение). Параметры, входящие в оператор DO, внутри цикла изме- нять нельзя. Пример 3.6. Составить программу, используя оператор цикла, для вычисления z=Vxf + a?/2’ где xi и а,- — элементы массивов, состоящих из 40 элементов. Программа имеет вид DIHEHSIOH А(40), X(40) READ ( 5, 1) А, X 1 FORMATdOFB. 3) DO 2 1 = 1, 40 Z=SQRT (X ( I ) **2+A (I ) *»2) /2. 2 WRITE(6, 3) Z 3 FORMAT ( IX, F1O. 4) STOP EHD Исходные массивы А и X.описаны в операторе DIMENSI- ON. Оператор DO организует цикл с параметром I, изменяю- щимся от 1 до 40 (шаг равен 1, поэтому не указывается). Внутри цикла повторяются операторы: присваивания, вы- числяющий Z, и печати. Программы, разработанные в примерах 3.5—3.6, могут быть использованы как основа для решения задач 1.23—1.39. • Составить программы для решения задач 1.23—1.39. 3.6. ПРИЕМЫ ПРОГРАММИРОВАНИЯ Организация цикла с несколькими одновременно изменяющимися параметрами Оператор цикла языка ФОРТРАН позволяет задавать закон изменения только одного целочисленного параметра. Для задания закона изменения других параметров нужно использовать операторы присваивания, одни из которых перед циклом задают начальные значения, а другие внутри цикла вычисляют текущие значения. Если в цикле изменяется один параметр, который не является целочислен- ным, то он не может быть указан в операторе цикла. В этом случае необходимо вводить вспомогательный целочисленный параметр, кото- рый будет счетчиком количества повторений цикла. Последнее утвер- 158
жденне не относится к языку ФОРТРАН-77, где параметр цикла может быть действительной переменной. Пример 3.7. Составить программу для вычисления фун- кции z=xyl/(x + yi), если х изменяется одновременно с yit принимая значения от а с шагом h, переменная yL является элементом массива ((/>, у2, ..., у20). Схема алгоритма при- ведена на рис. 1.13. Параметр i будем изменять с помощью оператора цикла, а переменную х — с помощью двух операторов присваивания: DIHEHSIOH Y(20) READ (5, 1) Y, А, Н 1 , FORHATC10F8. 3) Х=А DO 2 I=1,20 Z=X*Y(I)/(X+Y(I)) WRITE(6, 3) Z 2 X=X+H 3 FORMAT (El 2. 4) STOP EHD Программа, разработанная в примере 3.7, может быть использо- вана как основа для решения задач 1.40—1.43. • Составить программы для решения задач 1.40—1.43. Запоминание результатов. Для запоминания результатов необ- ходимо выделить массив, который должен быть описан в операторе DIMENSION илн операторах явного описания. В программе следует вычислять результат как переменную с индексом. Пример 3.8. Составить программу для вычисления и за- поминания значений функции z; = д/xf + 1 /i, где х, — элемент массива (xi, х2, ..., хбо). Схема алгоритма приведена на рис. 1.14. Программа имеет вид DIMENSION X(50),Z(50) READ (5, t) X 1 FORMAT ( 10F6. 3) DO 2 1 = 1, 50 2 Z(I)=SQRT(X(I)**2+1. )/I) WRITE(6, 3) Z 3 FORMATC 1OE12. 4) STOP EHD Пример 3.9. Составить программу для записи элементов целочисленного массива (пь п2, .. ., Пю), кратных пяти, под- ряд в массив М. Если таких элементов нет, то вывести со- общение К = 0. Схема алгоритма приведена на рис. 1.15. Программа имеет вид 159
DIHEHSIOH H(4O),H(40) READ(5, 1) H 1 FORMAT (2014) K=0 DO 2 1x1,40 IF (H(I)/5*5-H(I)) 2,3,2 3 K=K+1 H(K)=H(I) 2 COHTIHUE IF (K) 4, 4, 5 4 WRITE(6,6) 6 FORMATl* K=0*) STOP 5 WRITE(6.7) (H(I),I = 1,H) 7 FORMAT (2016) STOP EHD Первый условный оператор проверяет условие кратности пяти элементов массива, а следующие за ним операторы определяют текущее значение индекса и осуществляют за- пись элемента, кратного пяти, в массив М. Второй условный оператор проверяет, сколько элементов записано в массив М. Если их записано один или более, то осуществляется переход к метке 5 и вывод на печать всех элементов, записан- ных в массив М. В противном случае выводится сообщение, что К=0. Программы, разработанные в примерах 3.8—3.9, могут быть использованы как основа для решения задач 1.44—1.50. • Составить программы для решения задач 1.44—1.50. Вычисление суммы и произведения Для вычисления суммы необходимо перед циклом задать на- чальное ее значение, равное нулю, а внутри цикла вычислять слагае- мое и накапливать сумму. Пример 3.10. Составить программу для вычисления 20 где xi — элементы массива (хц хг, .... %2о)- Программа имеет вид DIHEHSIOH Х(2О) READ (Б, 1) X 1 FORMAT (2OF4. 1) Z=O. DO 2 1=1.20 2 Z=Z+X(I)*.*2/I WRITE(6, 3) Z 3 FORMAT (El 2, 4) STOP END 160
Для вычисления произведения необходимо перед циклом задать начальное значение произведения, равное единице, а внутри цикла вычислять сомножитель и накапливать произведение. Пример 3.11. Составить программу для вычисления про- изведения положительных элементов массива (xi, Х2, ... хюо). Схема алгоритма приведена на рис. 1.17. Программа имеет вид DIHEHSIOH Х(1ОО) READ (Б. 1) X I FORMAT ( 2OF4. 1) Z-1. DO 2 1-1, 1ОО 2 IF (X(I).GT. О) Z=Z*X(I) WRITE(6, 3) Z 3 FORMAT (El 2. 4) STOP END Программы, разработанные в примерах 3.10—3.11, могут быть использованы как основа для решения задач 1.51 —1.66. • Составить программу для решения задач 1.51 —1.66. Вычисление суммы членов бесконечного ряда Пример 3.12. Составить программу для вычисления сум- мы бесконечного ряда z=l+ х2" (2п)! (—1)‘ с точностью до е. Цикл организовать с помощью условного оператора. Схема алгоритма приведена на рис. 1.18. Программа имеет внд READ (5. 1) X, EPS 1 FORMAT(F4. 1, Е6. 1) Y=l. Z=i. H=1 2 Y=Y*(-X*X)/((2*H-1)*2*B) Z=Z+Y H=N+1 IF (Y. GT. EPS) GOTO 2 WRITE (6, 3) Z 3 FORMAT (El 2. 4) STOP EHD Точность, как правило, задается в виде константы с порядком, поэтому для ввода EPS используется специ- фикация Е. Программа, разработанная в примере 3.12, может быть исполь- зована как основа для решения задач 1.67. 6 В. Е. Алексеев и др. 161
• Составить программы для решения задачи 1.67. Вычисление полинома Пример 3.13. Составить программу для вычисления полинома у=2х8—х6-}-4х5—5х2 + 6х-|-1, используя формулу Горнера. Схема алгоритма приведена на рис. 1.19. Программа вычисления полинома любой степени п(п< <30) имеет вид DIMENSION А(30) READ(5, 1) Н, (А(1). 1 = 1, N), X 1 FORMAT ( 12/ (2OF4. 1) ) Y=A(1) DO 2 1 = 2, N 2 Y=Y»X+A(I) WRITE (6, 3) Y 3 FORMAT (E12. 4) STOP EHD Программа, разработанная в примере 3.13, может быть исполь- зована как основа для решения задач 1.68—1.72. • Составить программы для решения задач 1.68—1.72. Нахождение наибольшего и наименьшего Пример 3.14. Составить программу для нахождения на- именьшего значения функции у = ае~Ьк sin (юх+<р) при из- менении аргумента х от 0 до с с шагом h. Схема алгоритма приведена на рис. 1.21. Программа имеет внд READ (5,1) А, В, С, Н, OMEGA, FI 1 FORMAT (6F5. 2) YMIN=1E2O X=0. H=C/H+1 DO 2 1 = 1, H Y=A»EXP(-B*X) «SIH (OMEGA*X+FT) X=X+H 2 IF (Y. LT. YHIN) YMIN=Y WRITE (6, 3) YHIN 3 FORMAT (El 2. 4) STOP END В языке ФОРТРАН-IV параметр цикла, указанный в опе- раторе DO, не может быть действительного типа, поэтому для изменения переменной х пришлось использовать два операто- ра присваивания: Х = 0 и Х = Х-рН. В языке ФОРТРАН-77 программа имеет вид 162
READ (5, 1) А, В, С. H, OMEGA, FI 1 FORMAT(6F5. 2) YMIN=1E2O do a x=o.. c.h Y=A*EXP(-B*X)*SIN(OMEGA*X+FI) 2 IF (Y. LT. YMIN) YMIN=Y WRITE(6, 3) YMIN 3 FORMAT (El 2. 4) STOP END Пример 3.15. Составить программу для нахождения эк- стремума функции i/=|a| &Ьх+сх при изменении аргумента х от 0 до 4 с шагом h. Функция имеет один экстремум. Если О 0, то функция имеет минимум, если с-С 0, то функция имеет максимум. Схема алгоритма приведена на рис. 1.22. Программа имеет вид READ (5, 1) А» В, С,Н 1 FORMAT (4F5. 2) IF (С) 2, 2. 3 3 N=1 GOTO 4 2 H=-i 4 YM=N»1E2O X=O. M=4/H+l DO 5 Г=1,M Y-ABS(A)*EXP(B*X+C*X*X) IF (N*Y-N*YM) 6, 7. 7 6 YM=Y 5 X=X+H 7 WRITE(6, 6) YM. N 6 FORMAT (Ё12. 4, 13) STOP END Пример 3.16. Составить программу для нахождения на- ибольшего элемента массива (xi, Х2, ..., Х40) и его порядкового номера. Схема алгоритма приведена на рис. 1.23. Программа имеет вид DIMENSION Х(4О) READ (5, 1) X 1 FORMAT (2OF4. 1} XMAXrX(i) NMAXxl DO 2 1x2,40 IF (X(I)-XMAX) 2,2,3 3 XMAX=X(I) NMAXxI 2 CONTINUE WRITE(6, 4) XMAX, NMAX 3 FORMAT(F9. 2. 14) STOP END 6* 163
Программы, разработанные в примерах 3.14—3.16, могут быть использованы как основа для решения задач 1.74—1.80. • Составить программы для решения задач 1.74—1.80. Нахождение корней уравнений Пример 3.17. Составить программу для нахождения на- именьшего положительного корня уравнения х — tgx = 0 с точностью до е=10-5 методом итераций. Схема алго- ритма приведена на рис. 1.24. Программа имеет вид ХО=4. 7 i XI = АТАН (ХО)+3. 14159 IF (ABS(Xl-XO). LE. IE-5) GOTO 2 XO=X1 GOTO 1 2 WRITE (6,3) XO, Xl 3 FORMAT(2E15. 7) STOP EHD Пример 3.18. Составить программу для нахождения г 3 г корня уравнения х+-ух+-ух—2,5 = 0 методом половинного деления при изменении х от 0,4 до 1 с точностью до е=10~4. Схема алгоритма приведена на рис. 1.25. При этом приняты следующие обозначения: На схеме алгоритма а Р Ко) КЬ) f(x) В программе А В F Fl Fl Программа имеет вид АО=О. 4 В=1. F= A+SQRT ( А)+А** ( 1. /3. )-2. 5 Fl xB+SQRT (В) +B»« ( 1. /3. ) -2. 5 IF (F»F1) 1,2,2 2 WRITE(6, 3) 3 FORMAT (.'НЕТ КОРНЯ') . STOP i х=(А*в)/а. F1=X+SQRT(X)+X»»(1./3. )-2. 5 IF (Fl) 5,8,5 5 IF (F1»F) 4,6,6 4 B=X GOTO 7 6 A=X F=F1 164
7 IF (ABS(B-A) —IE—4) 8,8,1 8 WRITE (6, 9) X, Fl 9 FORMAT (2E13. 5) STOP EHD Программа, разработанная в примере 3.18, может быть исполь- зована как основа для решения задач 1.81 —1.85. • Составить программы для решения задач 1.81—1.85. 3.7. ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ СО СТРУКТУРОЙ ВЛОЖЕННЫХ ЦИКЛОВ В правильно организованном вложенном цикле операторы внут- реннего цикла не могут выходить за пределы внешнего цикла, хотя внутренний и внешний циклы могут заканчиваться одним оператором. Пример 3.19. Составить программу для вычисления сум- мы положительных элементов каждой строки матрицы А(10X8). Схема алгоритма приведена на рис. 1.26. Программа имеет вид DIHEHSIOH А(1О, 8) READ (5, 1) А 1 FORHATUOF6. 3) ио г 1 = 1, ю s=o DO 3 J=l, В 3 IF (A(I, J). GT. О) S=S+A(I,J) 2 WRITE (6, 4) S 4 FORMAT (El 2. 4) STOP EHD Во внутреннем цикле вычисляется сумма положительных элементов каждой строки матрицы А. Внешний цикл переби- рает строки и выводит на печать вычисленные суммы. Пример 3.20. Составить программу для упорядочивания элементов массива (xi, х2, .... Хюо), располагая их по воз- растанию в том же массиве. Схема алгоритма приведена на рис. 1.27. Программа имеет вид DIHEHSIOH Х(ЮО) READ (5, 1) X 1 FORMAT (20F4. 1) DO 2 Kxl, 99 XHIH=X(K) H=K К1=К<-1 DO 3 J=K1, ЮО IF (X(J)-XHIH) 4,3,3 165
4 XHIH=X(J) H=J 3 CONTINUE X(N)=X(K) 2 X(X)=XMIN WRITEJ6, 5) X 5 FORMAT (2OF6. 1) STOP END Во внутреннем цикле находится минимальный элемент и его порядковый номер, а во внешнем цикле осуществляется перестановка минимального и первого из рассматриваемых элементов массива. Пример 3.21. Составить программу для упорядочивания элементов массива (xi, Х2, ..., Хюо), располагая их по воз- растанию в том же массиве. Схема алгоритма приведена на рис. 1.28. Программа имеет вид DIMENSION Х(1ОО) READ (5, 1 ) X 1 FORMAT (2OF4. S J DO 2 K=l, 99 L=K+1 DO 3 J=L, 1OO IF (X(J).GE. X(K)> GOTO 3 Y=X(X) X(K)=X(J> X(J)=Y 3 CONTINUE 2 CONTINUE WRITE(6, 5) X 5 FORMAT (20F6. 1) STOP END В этом примере во внутреннем цикле осуществляются перестановки х* и х,- прн х;<х*. Пример 3.22. Составить программу для определения с точностью до е = 0,01 значения аргумента, при котором функция у = ах—In х достигает минимума, при изменении аргумента от 0,2 до 10. Схема алгоритма приведена на рис. 1.29. Программа имеет вид READ(5, 1) А 1 FORMAT (F4. 1) Н=О. 2 Х=О. 2 6 YHIN=lE2u DO 2 1 = 1, 50 Y=A*X-ALOG(X> IF (Y-YMIH) 3, 4, 4 166
3 YMIH=Y XHIH=X 2 X = X+H 4 IF (H. LE. O. O1) GOTO 5 X=XHIH-O. 2 H=O. 01 GOTO 6 5 WRITE(6, 7) ХН1Я 7 FORMAT (El 5. 6) STOP END Во внутреннем цикле находится минимальное значение функции у и аргумента, при котором он достигается. Внешний цикл организует повторное вычисление минимума с меньшим значением шага изменения аргумента h. Пример 3.23. Составить программу для вычисления зна- Ь X— Se ------------------------------------dx с точностью до а % е. Схема алгоритма приведена на рис. 1.30. Программа имеет вид READ ( 5, 1) Н, А, В, EPS 1 FORMAT(I2, 2F4. 1,Е4. О) Y1=ЕХР(A-A*A)/ABS(А) Y2 = ЕХР (В -В*В) /ABS (В) 51=0. 3 S2=(Y1+Y2)/2. Х=А Н=(В-A)/Я Н1=Н-1 DO 2 1 = 1, Hl Х=Х<-Н Y=EXP (Х-Х*Х) /ABS (X) 2 S2=S2+Y S2=S2»H IF (ABS(S1-S2). LE. EPS) GOTO 4 S1=S2 N=2*N GOTO 3 4 WRITE (5, 7) S2 7 FORMAT (El 3. 5) STOP EHD В программе Y1 и YN — значения подынтегральной фун- кции в точках а и b\ S1 и S2 — предыдущая и последующая суммы, вычисленные при шагах h и й/2 соответственно; X — аргумент. Для уменьшения времени, затрачиваемого на вы- полнение программы, при вычислении значения X использо- ван прием организации цикла с несколькими одновременно изменяющимися параметрами. 167
Программы, рассмотренные в примерах 3.19—3.23, могут быть использованы как основа для решения задач 1.86—1.102. • Составить программы для решения задач 1.86—1.102. 3.8. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ ПОДПРОГРАММ В процессе решения многих задач необходимо многократно про- изводить одни и те же вычисления при различных значениях пара- метров. При этом для уменьшения размера программы целесообразно выделять эти вычисления в подпрограмму, где описывается процеду- ра вычисления некоторой функции при формальных параметрах. В основной программе в нужных местах'осуществляется обращение к подпрограмме при заданных значениях фактических параметров. В языке ФОРТРАН используются подпрограммы: оператор-функция, подпрограмма-функция, подпрограмма общего вида. Оператор-функция применяется для записи подпрог- раммы, состоящей из одного оператора, и имеет вид F(ai, а2, а„)=е, где F — имя подпрограммы; а, — формальные параметры; е — вы- ражение. Формальные параметры могут быть только простыми переменны- ми. Тип функции определяется или по соглашению, или операторами явного описания, или оператором IMPLICIT. Обращение к операто- ру-функции осуществляется с помощью указателя функции F(bi, Ьг, ..., Ьп), которая, как и любая другая функция, входит в состав вы- ражения [F — имя функции, bi — фактические параметры' (констан- ты, простые или индексные переменные, выражения) ]. Формальные и фактические параметры должны быть согласова- ны по количеству, порядку следования и типу. Располагается оператор-функция в основной программе перед первым выполняемым оператором. Пример 3.24. Составить программу вычисления функции log2x + logfc у Z =--——........— 2 10g(b+2) (Х+У) Для вычисления логарифма использовать оператор-фун- кцию. Любой логарифм определяется через натуральный ло- гарифм по формуле loga z=ln z/ln а. Эту формулу использу- ем в операторе-функции для вычисления логарифма по любо- му основанию. Для обращения к оператору-функции необхо- димо задать два параметра: основание логарифма и число, от которого он вычисляется. Присвоив рассматриваемой подпрограмме имя ALG, получим 168
ALG (A, Z) zALOG (Z) /ALOG (A) В программе с помощью указателя функции необходимо три раза обратиться к оператору-функции для вычисления трех логарифмов, используя следующие фактические пара- метры: ALG(2, X); ALG(В, У); ALG(B+2, X+Y); Программа имеет внд ALG(A, Z) =ALOG (Z)/ALOG (А) READ(5, 1) В, X, У 1 FORMAT (3F6. 1) Z= (ALG (2, X) +ALG(B, Y) )/ALG(B+2, X+Y) WRITE(6, 2) Z 2 FORMAT (El 5. 7) STOP END Подпрограмма -функция служит для организации подпрограмм, допускающих любое количество операторов, ио вы- числяющих только одно значение, которое присваивается имени под- программы. Структура подпрограммы-функции следующая: t FUNCTION F*s (ai, as, . a„) (операторы подпрограммы) F=... (операторы подпрограммы) RETURN END где t — указатель типа функции (REAL, INTEGER, LOGICAL, COM- PLEX илн CHARACTER в языке ФОРТРАН-77). Если этот указа- тель отсутствует, то тип функции определяется по соглашению; F — имя подпрограммы; s — указатель длины, если его иет, то длина стандартная; RETURN — оператор возврата в основную программу; а-, — формальные параметры, в качестве которых могут быть исполь- зованы простые переменные, имена массивов или подпрограмм. В подпрограмме должен быть хотя бы один оператор присваивания, в левой части которого стоит имя подпрограммы. Если среди фор- мальных параметров есть имя массива, то этот массив в подпрограм- ме должен быть описан. Подпрограмма-функция оформляется в виде отдельной програм- мной единицы и располагается после основной программы (после опе- ратора END) или после оператора END предыдущей подпрограммы. Для обращения к подпрограмме-функции используется указа- тель функции F (bi, Ьг, ..., 6„), где F — имя подпрограммы; Ь,— фактические параметры (константы, простые или индексные пере- менные, массивы, выражения, имена других подпрограмм). Фактнче- 169
ские параметры должны согласовываться с формальными по количеству, порядку следования и типу. Пример 3.25. Составить программу вычисления функции у—ах2 + Ьх+с, п 100 20 где а— Ь= с= q{-, к и q,— элементы массивов. 1 = 1 1=п+1 1=1 Для вычисления функции использовать подпрограмму- функцию. Присвоим подпрограмме имя SUM. Чтобы вычислить по этой подпрограмме любую из приведенных выше сумм, не- обходимо среди формальных параметров указать имя масси- ва и пределы суммирования. В общем случае подпрограмма должна вычислять i = k В основной программе необходимо трижды обратиться к этой подпрограмме для вычисления а, Ь, с при соответству- ющих значениях фактических параметров: DIHEHSIOH T(1OO),Q(2O) READ (5, 1) N. Т, Q, X 1 FORMAT (12/(2OF4. 1) ) Y=SUM(T, 1, N)«X»X+SUM(T, N+l, 1OO) »X+SUM(Q, 1,20) WRITE(6, 2) Y 2 FORMAT (El 5. 7) STOP EHD FUNCTION SUH(Z, X, L) DIMENSION Z(L) S=O. DO 1 I=K, L 1 S=S+Z(I) SUMzS RETURH END С помощью указателя функции осуществляется обраще- ние к подпрограмме для вычисления суммы элементов масси- ва Т от 1 до N (SUM (Т, 1, N)), суммы элементов масси- ва Т от 7V-J-1 до 100 (SUM (Т, N+1,100)) и суммы эле- ментов массива Q от 1 до 20 (SUM (Q, 1, 20)). В подпрограмме используется массив Z, который описан в операторе DIMENSION. Оператор SUM = S присваивает значение суммы имени подпрограммы. 170
Оператор RETURN осуществляет возврат в основную программу. Подпрограмма общего вида используется для полу- чения в подпрограмме нескольких выходных результатов. Структура подпрограммы общего вида записывается как SUBROUTINE F(ai, а2, ..., а„) (операторы подпрограммы) RETURN END Тип подпрограммы не специфируется, так как разные результа- ты ее выполнения могут иметь разные типы. Для обращения к подпрограмме общего вида используется спе- циальный оператор CALL F(6i, Ь2, .... 6„), где F — имя подпрограммы; 6; — фактические параметры. Правила записи формальных и фактических параметров здесь такие же, как и для подпрограммы функции. Пример 3.26. Составить программу вычисления функции Л. k,, х у Z —-------, «1+«2 где si и kt — сумма и число положительных элементов масси- ва (ai, а2, .... a?o); s2 и k2 — сумма н число положительных элементов массива (bi, b2, ..., 640). Для вычисления суммы н числа положительных элемен- тов массива использовать подпрограмму общего вида. Здесь два выходных параметра (результата): сумма и число положительных элементов массива (эти параметры разного типа). В подпрограмме вычислим сумму s положительных эле- ментов массива X и их число п. Число элементов массива обозначим т: DIHEHSIOH А(ТО),В(4О) READ (5. 1) А, В, X, Y 1 FORMAT (2OF4. 1) CALL F(A. ТО, SI, Xl ) CALL F(B, 40, S2, X2) Z=X*»X1*Y»»X2/(S1+S2) WRITE(6, 2) Z 2 FORMAT (El 2. 4) STOP EHD SUBROUTINE F(X, M, S, N) DIHEHSIOH X(H) H=O s=o. 171
DO 1 1 = 1,И IF (X(I).LE. О) GOTO 1 S=S*X(I) 1 CONTINUE RETURH END При первом обращении к подпрограмме по оператору CALL вместо массива X подставляется массив А и вычисля- ется сумма и число положительных элементов, которые при- сваиваются переменным S1 и К1. При втором обращении к подпрограмме определяются S2 и К2 для массива В. По оператору RETURN осуществляется возврат в основ- ную программу к оператору, следующему за оператором CALL, вызывающим подпрограмму. Оператор EXTERNAL. В список фактических параметров под- программы могут входить имена внешних функций и подпрограмм, которые обязательно должны быть перечислены в операторе EX- TERNAL. Общий вид оператора: EXTERNAL Д|, аг, ..., а„ где at — имена внешних функций или подпрограмм, которые являют- ся фактическими параметрами. Оператор EXTERNAL помещается перед первым выполняемым оператором основной программы. Пример 3.27. Составить программу для вычисления функции 20 30 V cos а; + У sin in У I с,-I i=l Для вычисления суммы использовать подпрограмму об- щего вида. В подпрограмме необходимо один раз вычислить сумму косинусов, второй раз — сумму синусов, третий раз — сумму модулей элементов некоторых массивов. В подпрограмме сле- дует описать вычисление суммы некоторой функции F от аргумента х,, являющегося элементом массива X, т. е. в под- программе вычисляется /?= У Г(х;). i=I 172
При первом обращении к подпрограмме вместо F надо подставить COS, при втором — SIN и при третьем — ABS, т. е. имя функции надо передать в подпрограмму как факти- ческий параметр. Имена этих функций должны быть пере- числены в операторе EXTERNAL. С учетом сказанного программа решения имеет вид DIHEHSIOH А(20) , В(30) , С(40) EXTERHAL COS, SIH, ABS READ(5, 1) А.В.С FORMAT (20F4. 1) CALL SUH (COS, A, 20, R1) CALL SUH(SIH, B, 30, R2) CALL SUM(ABS, C, 40, R3) Z=(R1+R2)/ALOG(R3) WRITE(6, 2) Z FORMAT (El 2. 4) STOP EHD SUBROUTIHE SUM(F, X, H, R) DIHEHSIOH X(H) R=0. DO 1 1=1, H R=R*F(X(I) ) RETURH EHD При первом обращении к подпрограмме вместо F надо подставить COS, вместо X — подставить А, вместо N — под- ставить число 20; при этом получается результат R1. После других обращений аналогично получаются R2 и R3. В исход- ном выражении есть еще одна функция 1п, которая в опера- торе EXTERNAL не описана, так как не является фактиче- ским параметром. В языке ФОРТРАН-77 имена стандартных функций, ука- занных в списке фактических параметров, описываются в спе- циальном операторе INTRINSIC, а имена подпрограмм, со- ставляемых пользователем,— в операторе EXTERNAL. Про- грамма решения примера 3.27 на языке ФОРТРАН-77 со- держит оператор INTRINSIC COS, SIN, ABS вместо оператора EXTERNAL. Дополнительные входы в подпрограмму. В рассмотренных при- мерах при обращении к подпрограмме выполнялись все операторы начиная с первого. Иногда появляется необходимость выполнять только часть подпрограммы. Например, в подпрограмме вычисляется z = fi+f2. При обращении к ней выполняются операторы, вычисляю- щие fi и f2. Если необходимо при обращении к подпрограмме исклю- чить вычисление ft и сразу приступить к вычислению f2, то целесо- образно иметь дополнительный вход, определяющий, с какого места должна выполняться подпрограмма. Для обозначения дополнитель- 173
ного входа используется невыполняемый оператор ENTRY, который имеет структуру: ENTRY Fl (сь С2, ..., сп) где F1 — имя части подпрограммы, которое должно отличаться от имени всей подпрограммы; с,- — формальные параметры, используе- мые в части подпрограммы. Обращение к части подпрограммы осуществляется по ее имени F1 с указанием фактических параметров, которые согласуются с Ci. Дополнительные входы может иметь и подпрограмма-функция, и подпрограмма общего вида. Пример 3.28. Составить программу для вычисления функции ' m c+m~' xh если ____i=l % = ‘ n In tn /П f/j+m-1 x., если d>0. Значения выражения вычислить в подпрограмме. Все Если в подпрограмме вычислять сначала среднее гео- метрическое из yt, а затем среднее арифметическое из х, и получать их сумму, то эта подпрограмма реализует вторую ветвь вычислительного процесса. Если организовать допол- нительный вход перед вычислением среднего арифметическо- го из х/, то эта часть подпрограммы используется для реали- зации первой ветви. Программа имеет вид DIMENSION Х(1ОО), Y(1OO) READ(5, 1) N, М, ( (X(I), 1 = 1, М), ( (Y (I) , 1= 1, N) , С, D 1 FORMAT(EIE/(E0F4. 1) ) IF (D) E, E, 3 3 CALL SR (X, Y, N, M, Z) GOTO 4 E CALL SRAR(X, M, C, Z) 4 WRITE(6, 5) Z 5 FORMAT(E1E. 4) STOP END SUBROUTINE SR (X, Y, H, M, Z) DIMENSION X(M),Y(H) P=l. DO 1 1 = 1,H 1 P=P*Y(I) ENTRY SRAR(X,M, P, Z) S=O. DO 2 1 = 1, M 174
г S=S+X(I) S=S/H Z=P*S RETURH EHD Если d>0, то вычисляется сначала среднее геометриче- ское Р элементов массива Y, затем среднее арифметиче- ское S массива X и далее Z, равное их сумме. Если d^O, то вычисляется сразу среднее арифметическое S, вместо значе- ния Р подставляется значение С и вычисляется Z = C+S. Дополнительные выходы из подпрограммы. В рассмотренных подпрограммах возврат в основную программу осуществлялся с по- мощью оператора RETURN к месту, откуда осуществлялось обраще- ние к подпрограмме. Подпрограмма общего вида позволяет возвра- щаться в любое место основной программы. Для этого используется оператор RETURN i, где i — целочисленная переменная или целая константа без знака. Для обозначения места в основной программе, куда следует вернуться после выполнения подпрограммы, среди фактических пара- метров надо указывать метки операторов, к которым будет происхо- дить возврат. Эти метки в списке фактических параметров помещают- ся после символа & (амперсанд). На соответствующем месте в списке формальных параметров записывается *. Если в списке фактических параметров п меток, то i принимает значения 1, 2, .., п. Выход по оператору RETURN К происходит к метке, стоящей на К-м месте в списке меток фактических параметров. Например, CALL F(X, Y, Н. Z, All, 47, 416. 422) По оператору RETURN 3 осуществляется возврат к оператору с меткой 16 основной программы. ш = 2 Пример 3.29. Составить программу вычисления значений функций u = sin(, если (>0; v = cos(/ + n/4), если /<0; 100 , если / = 0, где t= i= 1 Определение аргумента этих функций выполнить в под- программе. В подпрограмме накопим сумму и в зависимости от знака ее определим аргумент у, равный или t, или (4~л/4, или (xi+%ioo)/2. После этого выйдем из подпрограммы и в за- висимости от значения аргумента, возвращаясь в основную программу, вычислим или и, или v, или ш. Следовательно, при различных значениях аргумента надо возвращаться в разные места основной программы. К вычислению одной функции можно вернуться по оператору RETURN, к вычисле- нию других функций — используя дополнительные выходы. 175
Программа имеет вид DIMENSION Х(100) READ (5, 1) X 1 FORMAT ( 2 0F4. 1) CALL ARG(X, 100, 3. 14159/4, Y, 84, 85) U=SIN(Y) WRITE(6, 2) U STOP 4 V=COS(T) WRITE(6, 2) V STOP 5 W=SQRT(ABS(Y)> WRITE(6, 2) W 2 FORMATJEia. 4) STOP END SUBROUTINE ARG (A, H, C, Z, *, ») DIMENSION A(H) Z=0. DO 1 1=1,Я 1 Z=Z+A(I) Z=Z/N IF (Z) 2,3,4 2 Z=ZtC RETURH 1 3 Z= (A ( 1) *A (N) )/2. RETURH 2 4 RETURH END Если Z>0, то осуществляется переход к оператору с меткой 4 и по оператору RETURN выход в основную про- грамму к оператору, следующему за оператором CALL, т. е. к вычислению U. При Z<0 организуется переход к опе- ратору с меткой 2, который к Z прибавляет значение С, равное л/4, и по оператору RETURN1 передает управление в основную программу к оператору с меткой 4, указанной на первом месте в списке меток, т. е. к вычислению V. Если Z = 0, то вычисляется Z = (Xi + %ioo)/2 и происходит возврат в основную программу к оператору с меткой 5, ука- занной на втором месте в списке меток, т. е. происходит воз- врат к вычислению W. Общие области памяти. Ограниченный объем оперативной памя- ти делает необходимым выделение одного и того же места для хране- ния нескольких переменных или массивов. Это достигается с по- мощью операторов EQUIVALENCE и COMMON. Оператор EQUIVALENCE используется для выделения общей памяти двум (или более) переменным одной программной единицы. Общий вид оператора: EQUIVALENCE (oi, а2.....ап), (М, b2...bm), где at, bi — простые или индексные переменные. 176
Всем переменным одной группы, заключенной в скобки, отводится для хранения один и тот же участок памяти. Переменные одной группы могут быть различных типов, но обязательно одинаковой длины. Эквивалентность двух элементов разных массивов приводит к выделению общей памяти и для других элементов этих массивов. Например, DIHEHSIOH А(8),В(3, 3) EQUIVALENCE (А(1), В(1, 1)) Оператор выделит общую память для хранения элементов А (1) и В (1, 1), А (2) и А (2, 1), А (3), В (3, 1) ... А (8) и В (2, 3) масси- вов. Последний элемент В (3, 3) массива хранится в отдельной ячей- ке, так как эквивалентного ему элемента в массиве А нет. Оператор COMMON выделяет общую область памяти для хра- нения переменных различных программных единиц, например основ- ной программы и подпрограммы. При этом оператор COMMON за- писывается в каждой программной единице. Общий вид оператора: COMMON С|, с.......сп где Ci — имя переменной или массива. Массив в операторе может указываться с размерностью, поэтому необходимость описывать этот массив в других операторах отпадает. Типы согласуемых переменных могут быть разными, но длина обяза- тельно одинаковая. Согласуемые массивы должны иметь один и тот же размер. Операторами COMMON А, В, С (20) COMMON X, Y, Z(2O) выделяется общая область для хранения переменных Л и X, В и У, а также массивов С и Z. Переменные, указанные в операторах COMMON и EQUIVA- LENCE, не могут быть формальными параметрами. Это часто исполь- зуется для передачи параметров в подпрограмму, которая может стать подпрограммой без параметров. Пример 3,30. Составить программу для вычисления мате- матического ожидания и дисперсии массивов А, В, С, со- стоящих из m элементов каждый, используя подпрограмму без параметров. В целях экономии памяти массивы А, В, С и формальный массив X хранить в одной области памяти. В основной программе с помощью оператора EQUIVA- LENCE выделяется общая память для массивов А, В, С, а с помощью операторов COMMON — общая память для массивов А и X. Чтобы подпрограмма была без параметров, в операторах COMMON указываются все остальные фактиче- ские и формальные параметры. 177
Программа имеет вид REAL MX COMMON М,НХ, DX, А (100) DIMENSION В(1ОО), C(lOOj EQUIVALENCE (A(1),B(1),C(1)) DO 1 J=l, 3 READ (5, 2) M, (A(I), 1=1,M) 2 FORMAT ( 13/ (20F4. 1) ) CALL STAT 1 WRITE (6, 3) MX, DX 3 FORMAT (3E15. 7) STOP SUBROUTIHE STAT COMMON N, T, Z, X(100) 7=0. DO 1 1=1,H 1 Y=T+X(I) T=T/N Z=O. do г i=i,h 2 Z=Z+(X(I) —7) **2 Z=Z/H RETURH END Программа может использоваться для вычисления тх и Dx трех массивов размерностью М, но не более 100 эле- ментов каждый. В основной программе для обозначения мас- сивов можно использовать имя или А, или В, или С. Поскольку массивы А, В, С хранятся в одной области памяти, вводиться они должны поочередно. Все параметры в подпрограмму передаются с помощью оператора COMMON. Задачи для решения * 3.30. Составить программу вычисления значения функции s = д/х2 + у2 + sin2 ху+ дД^ + ^ + эш2 xz-\- + ‘y4/2+z2 + sin2 У2' используя оператор-функцию. * 3.31. Составить программу вычисления функций y/sz3 + qz2 + tt + t р sin a + t cos P + 3,5 a=— -----------------, b=—--------‘—----———. l+esz3+z_i r2 Для определения многочленов использовать оператор- функцию у (а, Ь, с, d, х) = ах3 + 6х2 4 сх 4 г/. 178
* 3.32. Составить программу вычисления функции а^~1 д/cos b д/cos (a+t>) + 0,5 Z ~ 4 1 - ’ 1-0 2 д/ас2+' используя два оператора-функции. * 3.33. Составить программу вычисления приближенного 3 г значения функции у=ух по итерационной формуле уп+\ = , \ / X \ S ---( ——уп 1 с точностью е=10 , используя опера- 3\У / тор-функцию. Начальное значение функции вычислить по формуле {х/3, если х^\; Зх, если х< 1. * 3.34.Составитьпрограммудлявычисленияс = используя подпрограмму-функцию: п\ ml (п—т)\ ’ п! = О, если п<0; 1, если п=0; п!, если п>0. * 3.35. Составить программу вычисления среднего ариф- метического положительных элементов массивов X (60), Y (75), Z (80), используя подпрограмму-функцию. В масси- вах есть положительные элементы. Массивы X, Y, Z хранить в одной области памяти. * 3.36. Составить программу вычисления среднего гео- метрического положительных элементов каждого столбца матрицы А (10X20), используя подпрограмму-функцию. Фактическую и формальную матрицы хранить в одной об- ласти памяти. В каждом столбце есть положительные эле- менты. * 3.37. Составить программу вычисления e^maxl _^«так1 I 1/тах’ Д/' ^max^min' где хтах и xmin — наибольший и наименьший элементы масси- ва X (100); утах— наибольший элемент массива Y (120). Нахождение наибольшего и наименьшего осуществить в од- ной подпрограмме-функции, причем результатом выполнения 179
I подпрограммы должно быть A = AminAmax. Если требуется определить только Атах, то Д1 = 1-Атах, для чего использо- вать дополнительный вход. * 3.38. Составить программу вычисления значения функции 1 V , 1 /г Z 2 Л а2. . + 2 Д/Е Ь2. ’ тип у i=l Mminz где ат(ш- и — минимальные значения первых i элементов массивов А (40) и В (60), используя подпрограмму-функцию. Для вычисления сумм использовать подпрограмму SUM, а для вычисления квадрата наименьшего — подпрог- рамму MIN. 3.39. Составить программу для вычисления суммы поло- жительных элементов матрицы A(AXAf) и их количества {N<130, Л4<30), используя подпрограмму общего вида. 3.40. Составить программу вычисления значения функ- ции « = е "—с \ где х>, х2— корни уравнения ах + -\-bx- 1,5 = 0; yi, у2 — корни уравнения 2у2—у-|-с = 0. Корни находить в подпрограмме. Если корни мнимые, то считать их равными нулю. * 3.41. Составить программу вычисления и запоминания сумм элементов каждой строки матрицы А(АХЛ1), исполь- зуя подпрограмму общего вида (А <30, А1<30). 3.42. Составить программу определения наибольшего об- щего делителя двух целых положительных чисел х и у путем вычисления ai = max (х, у), a2=min(x,y), a3=max(at — а2, а2) — min (m — а2, а2), ..., а, = max (щ_2 —а,_,, а,-1) — min (а,_2 — ац-i, а/-1). Если а„ = а„_2, то а„ — наи- больший общий делитель. Для нахождения max и min ис- пользовать подпрограмму общего вида. Здесь в каждый мо- мент имеются три значения: щ, а,_ц, п,_2. Обозначим их аз, а2, at. Тогда пз = тах(Ц|—а2, а2)—min (а,—а2, а2). Начальные значения Ц| = тах(х, у), а2 = min (х, у). 3.43. Составить программу вычисления z = X)+x2+x3, 10 20 Е °2' +i Е Ь'2‘ ГДе Х|=-'21Г ’ Х2==2Чб!~’ Хз = 40 Е с‘+' 1=1 =—^-j-j— (о<, bi и Ci — элементы массивов). 180
Вычисление х, осуществить в подпрограмме общего вида. Для определения факториала использовать подпрограмму- функцию. 3.44. Составить программу вычисления математического ожидания тх и дисперсии Dx для моментов появления случай- ных событий ti, t2, . .., Coo и интервалов между ними. Для вычисления тг и Dx использовать подпрограмму без пара- метров. Перед вычислением тх и Dx для интервалов необхо- димо упорядочить по возрастанию элементы массива Т, вы- числить и записать в массив Т1 интервалы между смежными 4 (/./=4+.-Л)- * 3.45. Составить программу вычисления значений функций t= —., если х = X at<y = У Ьл и -4- b 1 I—1 max ‘ mm (=| i=l ^min ^max +*> min если где amax, £>max, flmin. ^min — соответственно наибольший и наи- меньший элементы массивов А и В. Вычисление сумм и проверку условия осуществить в одной подпрограмме с именем SUM. В другой подпрограм- ме предусмотреть нахождение наибольшего, наименьшего или их суммы, для чего использовать дополнительный вход. Имя этой подпрограммы EKSTR. В качестве одного из выходных параметров подпрограммы вычисления сумм предусмотреть параметр k, который принимает значение 1, если x<t/, и значение 0 — в противном случае. В подпрограмме SUM предусмотреть дополнительный выход. В основной программе сначала обратиться к подпрограм- ме EKSTR для вычисления t>max + ^mm. затем — к подпрог- рамме SUM. Выход из этой подпрограммы осуществляется либо к оператору, следующему за оператором CALL, если х<у, либо к оператору, метка которого указана среди факти- ческих параметров подпрограммы SUM. В первом случае необходимо обратиться к подпрограмме EKSTR для вычисле- ния amax, во втором — к ее части EKS для вычисления amin. В подпрограмме EKSTR находить сначала максимум и, если fe=l, выходить из подпрограммы. Если же k=Q, то после определения максимума находить минимум и их сумму. При обращении к части подпрограммы с именем EKS вы- числяется только минимум. 181
3.9. ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ СМЕШАННОЙ СТРУКТУРЫ Пример 3.31. Составить программу для вычисления сред- него балла и зачисления на стипендию студентов, если она выплачивается тем, кто по результатам сессии получил оцен- ки «4» и «5» или имеет одну оценку «3», но активно зани- мается общественной работой. Студент, имеющий все оценки «5», получает повышенную стипендию. Сведения о результа- тах сессии сведены в матрицу А (25,8). В столбце 1 указа- на 1, если студент активно .занимается общественной рабо- той, или 0 — в противном случае. В столбцах 2—6 указаны оценки студентов, полученные на экзаменах. В столбце 7 по- местить средний балл студентов (для студентов, имеющих хотя бы одну неудовлетворительную оценку, средний балл не вычислять). В столбце 8 поместить признак зачисления на стипендию: 0 — отсутствие стипендии; 1 — обычная стипен- дия; 2 — повышенная стипендия. Вывести на печать сформи- рованную матрицу. Схема алгоритма приведена на рис. 1.31. Программа имеет вид DIHEHSIOH А(25, 8) READ(5, 1) ((A(I, J), J=i,6), 1=1,25) 1 FORMAT(6F2. О) DO 2 III, 25 S=O. H5=O H3=O DO 3 J=2, 6 K=A(I, J) +0. 5 IF(K. LT. 3) GOTO 4 S=S+A(I, J) IF(K-5) 6, 5, 5 5 H5=H5+1 GOTO 3 6 IF(K-3) 3, 6, 3 В H3=H3+1 3 COHTIHUE A(I, 7)=S/5. IF(H5-5) 7,9,9 9 A(I.6)=2. GOTO 2 7 H3=H3-A(I, 1)+0. 5 IF(H3) 10,10,11 10 A(I,B)=1. GOTO 2 4 A(I,7)=0. 11 A(I,8)=O. a cohtihue WRITE (6, 13) 13 FORMAT!' РЕЗУЛЬТАТЫ СЕССИИ') WRITEC6, 12) ( (Al. J), J-l, 6), 1 = 1, 25) 12 FORMAT (6F6. 2) STOP 182
Так как в программе используется матрица действитель- ного типа, то оценки студента представляются приближенно. Именно поэтому для сравнения оценки с целым числом «5» или «3» пришлось преобразовать ее к целому типу, а так как оценка может быть представлена с недостатком, пришлось к ней добавить 0,5. Значения исходной матрицы А вводятся только в первые шесть столбцов, так как в остальных столбцах будут разме- щены результаты. Выводится матрица А полностью в общеп- ринятом виде. Недостаток программы заключается в том, что оценки, признак общественной работы и признак стипендии будут выведены на печать в виде действительных чисел (прибли- женно). Чтобы исключить этот недостаток, можно выделить отдельный массив для хранения среднего балла студентов (исключить столбец 7), а оставшуюся матрицу описать как целочисленную. В языке ФОРТРАН-77 можно вывести результаты сессии вместе с фамилиями студентов, для этого необходимо ввести символьный массив, в котором расположить эти фамилии. Тогда вывод следует организовать следующим образом: орга- низовать цикл по номеру студента, в котором выводится сначала фамилия студента (элемент символьного массива), затем вывести строку матрицы, содержащую оценки, признак общественной работы, признак назначения на стипендию и средний бал для данного студента. Программа, разработанная в примере 3.31, может быть исполь- зована как основа для решения задач 1.103—1.106. • Составить программу для решения задач 1.103—1.106. Пример 3.32. Составить программу, моделирующую мо- менты появления студентов в библиотеке в предположении, что в среднем через каждые 5 мин в библиотеку приходит один студент. Вывести на печать время (в минутах) появле- ния студентов в библиотеке от начала работы и количество студентов, пришедших в библиотеку в течение одного часа от начала работы. Схема алгоритма приведена на рис. 1.33. Программа имеет вид v=o. г к=о т=о. DO 1 1=1,60 Т=Т*1 CALL RAHDU(1, IT, X) IF(X. GT. V) GOTO 1 WRITE(6, 2) T 183
г FORMAT(E12. 4) К=К+1 1 COHTIHUE WRITE(6, 3) К 3 FORHAT(I3) STOP EHD В отличие от схемы алгоритма в программе введены операторы присваивания, вычисляющие значение перемен- ной Т, параметр цикла является переменной целого ти- па /. В языке ФОРТРАН-77 программа может полностью соответствовать схеме алгоритма. Пример 3.33. Составить программу для проверки значе- ния учащимся таблицы умножения. Учащемуся задается де- сять вопросов в виде J*M = , где J и М — случайные числа из диапазона [0, 20]. Если ответ правильный, то выдать сообще- ние «Правильно» и следующий вопрос. Если ответ ошибочный, то предложить снова ответить на вопрос. Если число попыток ответить на один и тот же вопрос равно трем, то предложить выучить таблицу умножения и прекратить проверку. По результатам проверки определить оценку учащегося следующим образом: «5» — при правильных ответах с первой попытки на все десять вопросов; «4» — при правильных отве- тах с первой попытки не менее чем иа восемь вопросов; «3» — при правильных ответах с первой попытки не менее чем на шесть вопросов; иначе — оценка «2». Схема алгоритма приведена на рис. 1.34. Для получения равномерно распределенных псевдослу- чайных чисел в интервале [0, 1] в языке ФОРТРАН использу- ется библиотечная подпрограмма RANDU, для обращения к которой используется оператор CALL RANDU (IX, IY, YFL), где YFL — значение вычисленной равномерно рас- пределенной величины. При входе IX — нечетное целое чис- ло; IY — вычисленное целое случайное число в диапазоне [0, 231]. Программа имеет вид н=о DO 1 1=1. 1О к=о CALL RAHDU(1, IY, X) J=2O*X+O. 5 CALL RAHDU(1, IY. X) M=2O*X+O. 5 10 WRITE(6. 2) J.M 2 FORMAT(5X, 12, ’*’, 12, '=’/’ВВЕДИТЕ ОТВЕТ’) READ (5,3) L 3 FORMAT(I3) IF(J»M-L) 4,5,4 4 WRITE(6, 6) 6 FORMAT (’НЕВЕРНО. СНОВА ОТВЕТЬТЕ НА ВОПРОС’) К=К+1 IF(K-3) 7, В, 8 7 GOTO 1О В WRITE(6, 9) 9 FORMAT ( ' ВЫУЧИТЕ ТАБЛИЦУ УМНОЖЕНИЯ’ ) STOP 5 WRITE (6, 11) 11 FORMAT ( ' ПРАВИЛЬНО' ) IF(K. EQ. O)H=H+1 1 COHTIHUE IF(H-IO) 13, 12, 12 12 WRITE(6, 14) 14 FORMAT('ОТЛИЧНО’) STOP 13 IF(H-B) 15, 16, 16 16 WRITE(6, 17) 17 FORMAT ( ’ ХОРОШО ' ) STOP 15 IF(H-6) IB, 19, 19 19 WRITE(6, 20) 20 FORMAT ( ’ УДОВЛЕТВОРИТЕЛЬНО’ ) STOP 16 WRITE(6, 21) 21 FORMAT ( ' НЕУДОВЛЕТВОРИТЕЛЬНО ’ ) STOP ЕНГ В программе Пъ заменено на N, а п на J. Программа на языке ФОРТРАН-77 может получиться более наглядной, если использовать структурный условный оператор. Программы, разработанные в примерах 3.32—3.33, могут быть использованы как основа для решения задач 1.107—1.114. • Составить программы для решения задач 1.107— 1.114. Пример 3.34. Составить программу для вывода графика функции у = 2 sin x + sin (2х) при изменении аргумента х от О до 2л с шагом 0,1. В языке ФОРТРАН имеются специальные библиотечные подпрограммы для вывода на печать графиков функций. Например, подпрограмма PLOT позволяет вывести на печать (АЦПУ) графики до девяти функций, заданных таблично относительно одного аргумента. Описание подпрограммы имеет следующий вид. Обращение к подпрограмме: CALL PLOT (NO, А, М, NL, NS). Описание формальных параметров: NO — номер графика (целое число, содержащее не более трех цифр); 184 185
A — матрица вычерчиваемых данных Первый столбец содержит значения аргумента, последующие — значения функций (не более 9); N — число строк матрицы А; М — число столбцов матрицы А; NL — число строк в графике. Если NL = 0, то использует- ся 50 строк; NS — код упорядочивания аргумента: если NS= 1, то не- обходимо упорядочить аргумент по возрастанию; если NS = 0, то нет необходимости в упорядочива- нии. Программа имеет вид DIHEHSIOH А(64, 2) Х-О. DO 1 1=1,64 А(1, 1)=Х A(I, 2)=2«SIN(X) +SIH(2*X) 1 XzX+O. 1 CALL PLOT (1, A, 64, 2, 64, O) STOP EHD Использование библиотечной подпрограммы позволило существенно сократить программу решения задачи (см. схему алгоритма на рис. 1.35). Программа, разработанная в примере 3.34, может быть исполь- зована как основа для решения задач 1.115—1.118. Составить программу для решения задач 1.115—1.118. Задачи для решения 3.46. Составить программу на языке ФОРТРАН-77 для решения примера 3.34, описывающую алгоритм, схема кото- рого представлена на рис. 1.35. Пример 3.35. Построить гистограмму для распределения по п классам случайных чисел из диапазона [а, Ь]. Случай- ные числа сведены в массив X (200), п^20. Длины каждого класса 1 = —Необходимо опреде- лить количество чисел, попадающих в каждый класс, и за- писать их в массив Т(п). Для каждого элемента t. опреде- лить длину kj (количество символов) и вывести на печать kj символов «*». Схема алгоритма приведена на рис. 1.37. Программа имеет вид DIMENSION Х(2ОО),Т(2О) REAL L READ (5,1) N, A, B.W, X 1 FORMATU2, 3F4. 1/ (2OF4. 1) ) DO 2 J- 1, N 186
г T(j)=o. L=(B-A)/H DO 3 1 = 1, 200 J=X(I)/L-A/L+1 3 T(J)=T(J)*1 TMAX=T(1) DO 4 J=2, H 4 IF(T(J).GT. TMAX) TMAX=T(J) M=W/TMAX*0. 5 DO 5 J=1,H K=T(J) WO, 5 DO 6 1 = 1, К 6 WRITE (6, 7) 7 FORMAT!*+’,'«') 5 WRITE(6, в) в FORMAT (' ') STOP EHD В программе переменная L описана как действительная, так как по соглашению L — переменная целого типа, а это может привести к тому, что значение L станет равным нулю. Программа, разработанная в примере 3.35, может быть исполь- зована как основа для решения задач 1.119—1.122. • Составить программы для решения задач 1.119—1.122.
ГЛАВА 4 ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПАСКАЛЬ Язык программирования ПАСКАЛЬ является достаточно про- стым и компактным языком, который широко применяется в ми- ни-ЭВМ и ПЭВМ. Конструкции языка позволяют работать не только со стандартными типами данных, но и представляют пользователю возможность выполнять операции над файлами, множествами и за- писями, использовать динамические структуры данных. Программа на языке ПАСКАЛЬ состоит из заголовка и блока, заканчивающегося точкой. Заголовок программы начинается с клю- чевого слова PROGRAM. В языке ПАСКАЛЬ используются следующие символы: 1. Буквы: 26 приписных латинских букв; 2. Цифры: О, I, .... 9; 3. Специальные символы: «:=», « + », «—», «*», «/», «>», «О, « = », «(», «)», «[», «]», «.», «,», «;», «[_!», «{», «)». 4. Ключевые слова: AND — и, ARRAY—массив, BEGIN — начало, CASE — вариант, CONST — константа, DIV — деление на- цело, DO — выполнять, DOWNTO — уменьшать до, END — конец, FILE — файл, FOR — для, FUNCTION — функция, GOTO — перей- ти на, IF — если, IN — включение, LABEL — метка, MOD — модуль, NIL —отсутствие указателя, NOT — не, OF — из, OR — или, PACKED —упакованный, PROCEDURE — процедура, PROGRAM — программа, RECORD — запись, REPEAT — повторять, SET — мно- жество, THEN — то, ТО — до, TYPE — тип, UNTIL — до, VAR — переменная, WHILE — пока, WITH — с. 5. Знаки операций: арифметических: ф- (сложение), — (вы- читание), * (умножение), / (деление), DIV (деление нацело, с отбра- сыванием остатка), MOD (нахождение остатка от деления нацело); отношения: > (больше), < (меньше), < = (меньше нли равно), >= (больше или равно), = (равно), •<> (не равно); логических: NOT (отрицание), OR (логическое сложение), AND (логическое умножение); над множествами: * (пересечение множеств), ф- (объединение множеств), — (разность множеств), IN (принад- лежность множеству). 4.1. ПРОСТЕЙШИЕ КОНСТРУКЦИИ ЯЗЫКА К простейшим конструкциям языка относятся числа, константы, переменные, стандартные функции и выражения. Программы обраба- тывают данные, которые могут принимать числовые, логические и ли терные значения. В языке используются четыре типа скалярных данных: целые (INTEGER), действительные (REAL), логические (BOOLEAN) и символьные (CHAR). 188
Числа могут быть целого и действительного типов. Числа целого типа не имеют дробной части и записыва- ются последовательностью цифр. Например, 42, —6,786,2000, —2121. Числа действительного типа записываются с фик- сированной точкой в виде целой и дробной частей (например, —4.85, 1.64, —0.25) или с плавающей точкой для значений с десятичным порядком (например, 1.68Е — 5, 0.5Е5, —12.64Е—4). Данные логического типа могут иметь значение TRUE или FALSE. Данные символьного типа принимают значение од- ной литеры, имеющейся в наборе данной ЭВМ. Набор литер должен отвечать следующим требованиям: содер- жать буквы и цифры, упорядоченные в алфавитном порядке и в по- рядке возрастания; включать символ пробела; каждый символ до- лжен иметь порядковый номер. В программе целесообразно использовать не сами значения, а их имена (идентификаторы). Имя — последовательность букв и цифр, начинающихся с бук- вы. В большинстве ЭВМ трансляторы ограничивают длину имени в восемь символов. Например, X, Y, Z, SUMMA, REZ, REZ2. В языке ПАСКАЛЬ имеются стандартные имена, использующие- ся для записи стандартных констант (TRUE, FALSE, MAXINT), стандартных типов (INTEGER, REAL, BOOLEAN, CHAR, TEXT), стандартных файлов (INPUT, OUTPUT), стандартных функций (ABS, SQR, SIN, COS) и др. Простейшие конструкции языка записывают, используя число- вые, логические, символьные значения и имена данных. Константа представляется в программе иеизменяющимся значе- нием, которое может относиться к следующим типам данных; целые, действительные, логические, символьные или строковые. Например: 1001, —44, 26.85, —0.5Е —5, TRUE, ’С’, ’8’, ’ФАКТОРИАЛ = ’, ’6.8-1-Т’ Константы описываются в разделе описания констант, который начинается с ключевого слова CONST. Например: CONST Х=1ОО; Н=5О; Р1 = 3. 14159?; LHP=P‘; Переменная используется для записи значений, изменяющихся в программе, и может принадлежать к различным типам переменных: целые, действительные, логические, символьные. Различают простые переменные, записывающие свои- ми именами, и переменные с индексом, в записи которых указываются имя массива и индексы этого элемента. Например: TOR, X , Y, Z, VOL, A[l], B[2, 1),A[I], ВЦ, J] Раздел описания переменных начинается с ключевого слова VAR, после которого перечисляются переменные, массивы и их типы. Например: 189
VAR ART, TOP, CP6: REAL; KOL.IMAX :INTEGER; BOK, KI, V : BOOLEAN; CONST HMAXzlOO; ISTR = 2O; ISTB=25; VAR COP: ARRAY[i. . ЯМАХ] OF REAL; HOR:ARRAY[1. . ISTR. 1. . ISTBJ OF INTEGER; Стандартные функции используются для вычисления часто встречающихся функций при обработке данных. Обращение к стан- дартным функциям записывается именем функции, а в скобках ука- зывается аргумент. Для арифметических функций (абсолютное значение ABS (X) и возведение в квадрат SQR (X)) результат имеет тот же тип, что и аргумент, который может быть типа REAL или INTEGER. Для функций SIN (X), COS (X), EXP (X), LN (X), SQRT (X), ARCTAN (X) аргумент может иметь тип REAL или INTEGER, а ре- зультат всегда имеет тип REAL. Функции выделения целой части числа TRUNC (X) и округле- ния числа ROUND (X) используют аргумент типа REAL, а результат всегда имеет тип INTEGER. Функции упорядочивания типов, исполь- зующиеся для нахождения предшествующего PRED (X) и последую- щего SUCC (X) элементов, могут иметь тип аргумента INTEGER, CHAR или BOOLEAN, а результат имеет тот же тип, что и аргумент. Например, для целочисленного значения 5 результатом функции PRED (5) будет 4, а результатом функции SUCC (5) — 6. Функции преобразования типов: ORD (X) — определение поряд- кового номера символа X в наборе символов использует тип аргу- мента CHAR или BOOLEAN, а результат всегда имеет тип INTEGER. Функция CHR (I) определяет символ из набора символов по порядковому номеру I и использует аргумент типа INTEGER, а ре- зультат имеет тип CHAR; функция ODD (X) определяет нечетность числа. Аргумент имеет тип INTEGER, а результат — тип BOOLEAN. Если аргумент имеет нечетное значение, то результатом является значение TRUE, в противном случае — FALSE. Выражения определяют последовательность вычисления значе- ния. Выражения могут включать в себя константы, переменные, стандартные функции, которые разделяются скобками и знаками операций. Порядок вычисления выражения определяется скобками, а при их отсутствии — в соответствии со старшинством операций: операция отрицания (NOT), мультипликативные операции (*, /, DIV, MOD, AND), аддитивные операции (-)-, —, OR), операции отношения (<=, <, =, <>, >, >=, IN). Тип результата выражения зависит от типов операндов, участву- ющих в операции. Тип результата операций « + », «*», «—» является INTEGER, если оба операнда имеют тнп INTEGER, и REAL — в противном случае. Результатом операции «/» всегда является тип REAL, а резуль- тат операций DIV и MOD всегда тимеет тип INTEGER, так как аргу- менты могут быть только типа INTEGER. 190
Результат выполнения логических операций NOT, OR, AND всегда имеет тип BOOLEAN. Аргументы операций сравнения на равенство и неравенство ( = , < > ) могут иметь любой тип перемен- ных и констант, а результат всегда имеет тип BOOLEAN. В операциях сравнения и включения (>, С, > =, <=, IN) аргументы могут быть любого типа, а результат имеет только тип BOOLEAN. Примеры записи выражений: А*ЕХР (Т*Т) — SQRT (X*Y*Z) А*Х*Х + (4.0*А*В — Х*С/2.0) Задачи для решения * 4.1. Записать следующие арифметические выражения: 1) °+Ч; 2) _______Х—; cd 3) ех sin2 х; 4) 1 + arctg- 1+Л/Л —ox I t I \ 1^ I х 5) е ах sin (со/ + <р); 6) —----г; х — ax-j-a 7) а -у/х + 62 -\[х; 8) ах3 — Ьх2 + a cos2 |х|; -2L-+--------; ю) 2,64+/sinxI±^\ 2L 16 I х~у \ л/\х+у\ / рг ’ еР У 4.2. ВВОД И ВЫВОД ДАННЫХ Для ввода используются операторы: READ (6i, &2, ..., Ьп)\ READLN(b,, Ь2, .... Ь„)- READLN; где Ь|, Ь2...Ьп — имена переменных, значения которых вводятся. Оператор READ(bi, Ь2, .... 6„); осуществляет ввод данных из стандартного файла INPUT. Типы вводимых данных должны соответ- ствовать типам переменных в списке оператора ввода. Оператор READLN (6,, Ь2, .... Ь„); осуществляет ввод данных из стандартного файла INPUT и после выбора значения последней переменной обеспечивает переход к началу новой строки файла. При 191
I вводе значений целого и действительного типов операторы READ и READLN игнорируют пробелы между значениями. Оператор READLN; обеспечивает пропуск одной строки в стан- дартном файле INPUT и переход к началу новой строки. Ввод переменных логического типа недопустим. Для вывода информации используются операторы: WRITE (Ьь Ь2, .... Ь„); WRITELN (61, 62, .... b„); WRITELN; где bt, Ьг,..., Ь„ — имена переменных, значения которых выводятся. Оператор WRITE(61, 62, Ьп); выполняет вывод значений, соответствующих перечисленным именам в стандартный файл OUTPUT, размещая выводимые значения в одной строке. Оператор WRITELN (fei, 62, ..., b„); выполняет вывод значений в стандартный файл OUTPUT н после вывода последнего значения осуществляет переход к новой строке файла. Оператор WRITELN; обеспечивает пропуск строки в файле и пе- реход к началу новой строки. । Имена переменных в списке операторов вывода могут принад- лежать к целому, действительному, символьному нли логическому типам. Ширина поля вывода зависит от типа устройства, используе- мого в данной ЭВМ. Значения величин действительного типа выво- дятся в нормализованном виде (мантисса числа с порядком), а цело- го типа — в обычной форме. Операторы вывода допускают использо- вание указания о ширине поля, отводимого под значение. Общий вид записи операторов для вывода значений целого типа: WRITE (b:m); WRITELN (fe:m); а для вывода действительного типа: WRITE (b’.m'.n); I WRITELN (Ь:т:п}; где Ь — имя выводимой переменной; т — поле, отводимое под значе- ние и задаваемое константой или выражением целого типа; п — часть поля, отводимого под дробную часть числа. Например, оператор . WRITE(KOL: В, НОМ: 4) ; выделяет на строке под значения переменных KOL и NOM соответ- ственно восемь и четыре позиции, а оператор WRITELN(SUM:1O: 5>; выделяет под значение SUM десять позиций, из которых пять позиций отводится под дробную часть числа. 192 4.3. ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ ЛИНЕЙНОЙ СТРУКТУРЫ Операторы программы линейной структуры записываются друг за другом в соответствии с порядком, определяемым алгоритмом. Для записи программы такой структуры необходимы операторы присваи- вания, ввода исходных данных и вывода результатов вычислений. Программа на языке ПАСКАЛЬ оформляется в виде заголовка программы и блока, заканчивающегося точкой. Заголовок программы имеет вид PROGRAM имя (INPUT, OUTPUT); Имя программы выбирается пользователем. Блок программы включает в себя разделы: описания меток (LABEL); определения констант (CONST); определения типов (TYPE); описания переменных (VAR); описания функций и процедур (FUNCTION и PROCEDURE). Раздел операторов включает в себя операторы, которые за- писываются в соответствии с алгоритмом решения и заключаются в операторные скобки BEGIN и END. Описания и определения в разделах заканчиваются символом «;». При отсутствии описаний или определений, принадлежащих како- му-либо разделу, данный раздел опускается. Операторы присваивания служат для вычисления значения вы- ражения и присваивания его имени результата. Общий вид оператора: о: —а; где v — имя переменной (результата); а — выражение. Например: IH: -О; Р:=1; IM:=1Н+2; Р:=Р«1Н; Имя переменной и результат выражения должны принадлежать одному типу. Исключение может составить случай, когда выражение имеет значение целого типа, а имя результата — действительного типа. Например, для описаний и определений вида CONST N=160; VAR т: real; справедлив оператор присваивания T:=N; Пример 4.1. Составить программу для вычисления высот треугольника со сторонами а, Ь, с, используя формулы А«=у «)(р—а)(р—с); 7 В. Е. Алексеев и др. 193
hb=^- ~\lp(p—a)(p — b)(p — c); hc=— y/p(P~a)(p — b)(p — c), где p=(a + b + c)/2. Схема алгоритма решения приведена на рис. 1.1. Исходными данными для решения являются значения длин сторон треугольника — а, Ь, с. Для ввода этих значений следует использовать оператор READ. При этом значения а, Ь, с должны быть расположены на одной строке экрана дис- плея. В программе используются переменная р для вычисле- ния полупериметра и вспомогательная переменная t для исключения повторений. Вычисленные значения высот ha, й», he необходимо вывести со своими именами, каждую на одной строке. Программа имеет вид PROGRAM HTR(IHPUT,OUTPUT); VAR A,B.C,P.T,HA,HB,HC:REAL; BEGIN READ(A,B,C); P: = (A + B*C)/2; T:=2»SQRT(P*(P-A)*(P-B)*(P-C)); HA:=T/A; HB:=T/B; HC:=T/C; WRITfcLHt'H A=',HA); WRITELNCHBx'.HB); WRITELN(*HC=',HC) END. В программе отсутствуют метки, константы, типы, функ- ции н процедуры. Поэтому разделы определения и описания указанных структур отсутствуют. При записи программ следует использовать имена констант или переменных, наилучшим образом отражающих их назначение. Не рекомендуется одно и то же имя использовать для нескольких по- следовательно получаемых результатов с целью экономии имен. В языке ПАСКАЛЬ допускается размещать на одной строке несколь- ко операторов. Однако этого следует избегать, так как такое разме- щение приводит к плохому восприятию программы. Одним из способов, улучшающих восприятие программы, явля- ется применение комментариев. Комментарий представляет собой текст, вставляемый в программу для дополнительных пояснений. Комментарии не воспринимаются н не обрабатываются ЭВМ, поэтому они могут быть записаны на русском языке. Текст комментария за- ключается между символами «(» и «}» или «(»» и «»}» и может со- держать цифры, буквы, ключевые слова н специальные символы. 194
Например: (* ПРОГРАММА УПОРЯДОЧИВАНИЯ ЭЛЕМЕНТОВ МАС- СИВА *) Комментарии могут использоваться для пояснения назначения программы, констант, переменных, разделов программы или для по- яснения используемых методов в алгоритме. В языке ПАСКАЛЬ символьные переменные и массивы описыва- ются в разделе описания типов. Описание типов имеет вид TYPE (имя) OF CHAR; где (имя) — имя символьной переменной или символьного массива. При этом размеры массива описываются обычным образом (как для скалярных массивов). Символьным переменным и элементам массивов можно задавать значения с помощью операторов присваивания. Например: А: =’NAME В [1J: = ’IWANOW’; Над символьными данными можно выполнять операцию сцепле- ния, которая обозначается символом « + »- Например, оператор С: = А + В [1]; присвоит переменной С значение ’NAME IWANOW’. Программа, рассмотренная в примере 4.1, может быть использо- вана как основа для решения задач 1.1 —1.9. • Составить программы для задач 1.1 —1.9, используя операторы WRITE и WRITELN для вывода результатов, текстовых пояснений к результатам, а также комментариев. 4.4. ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ РАЗВЕТВЛЯЮЩЕЙСЯ СТРУКТУРЫ Разветвления в программах возникают при необходимости вы- бора одного из нескольких возможных путей в решении задачи, который может зависеть от исходных данных или промежуточных результатов. Для организации разветвлений в программах используются опе- раторы перехода, условный и выбора. Оператор перехода имеет общий внд записи: GOTO п; где п — метка оператора. Метка назначается пользователем и представляет собой число без знака, содержащее не более четырех цифр. Используемые в про- грамме метки должны быть описаны в разделе описания меток. На- пример: GOTO 120; GOTO 250; 7* 195
Эти операторы осуществляют передачу управления оператором, имеющим соответственно метки 120 и 250. Использовать оператор GOTO следует только в редких случаях, например, для выхода к концу программы илн процедуры в случае неправильного задания данных или выхода из тела цикла. Непра- вильное использование оператора GOTO усложняет программу за счет многократных переходов вперед или назад по программе, за- трудняя ее чтение, отладку и проверку на правильность. Условный оператор имеет два вида запнсн: IF b THEN а; IF b THEN a, ELSE а2; где Ь — логическое выражение; a, а,, аг — операторы простые или составные. Составной оператор представляет собой последовательность опе- раторов, заключенных в ключевые слова BEGIN и END. Первый вид записи оператора позволяет организовать выпол- нение оператора а при условии, что логическое выражение имеет значение TRUE, а в противном случае оператор а не выполняется, а выполняется оператор, стоящий за условным. Второй вид записи оператора позволяет производить выполнение оператора а( в случае, если логическое выражение имеет значение TRUE, и оператора а2 — в противном случае. Примеры записи операторов: IF N DIV 2*2=N THEN N1:=N ELSE N2:=N*N; IF X<0.1 THEN V:=EXP (X); Условный оператор можно расширить за счет вложенности но- вых условий в операторе. Это приводит к сокращению числа операто- ров, но одновременно снижает наглядность программы. Новое усло- вие может записываться за ключевыми словами THEN и ELSE. По принятому соглашению в языке ПАСКАЛЬ ключевое слово ELSE всегда относится к ближайшему ему слову IF. Например: IF fe, THEN at ELSE IF fi2 THEN a2 ELSE a3. Пример 4.2. Составить программу для вычисления значе- ния функции Z=x3/у, где t/ = sin пх -|- 0,5. Схема алгоритма решения приведена на рис. 1.5. В программе используются имена N, X для исходных данных, имя Y для промежуточного значения и имя Z для результата. Для записи программы используются два варианта за- писи условного оператора. 196
Вариант 1 PROGRAM USL1(INPUT,OUTPUT); LABEL 20,30; VAR N-.IHTEGER; X,Y,Z:REAL; BEGIN READ(H.X); Y:=SIN(H«X)*O.5; IF Y:O THEN GOTO 20; Z: = SQR(X)»X/Y; WRITE(’Z = *,Z); GOTO 30; 20:write('Y=o'); 30: END. Вариант 2 PROGRAM USL2(IHPUT,OUTPUT); VAR H:INTEGER; X,Y,Z:REAL; BEGIN READ(H,X); Y:=SIH(H»X)*O.5; IF Y=O THEH WRITE(’Y=O') ELSE BEGIN Z:=X»X*X/Y; WRITE('Z=',Z) END END. Вариант 1 написан в соответствии со схемой алгоритма, приведенной на рис. 1.5, а вариант 2 использует возможно- сти языка. Пример 4.3. Составить программу для вычисления функции {sin х, если а; cos х, если а<х<Ь; tgx, если х~^Ь. Схема алгоритма решения представлена на рис. 1.6. Получить разветвление на три ветви можно различными сочетаниями операторов перехода и условного. Однако в язы- ке ПАСКАЛЬ условный оператор можно наращивать за счет использования вложенности условий. С использованием одно- го условного оператора программа имеет вид 197
PROGRAM UCL3(IHPUT,OUTPUT); VAR X.A,B,Z:REAL; BEGIN READ(X.A.B); IF X<=A THEN Z:=SIH(X) ELSE IF X>B THEH Z:=SIH(X)/COS(X) ELSE Z:=COS(X); WRITELH(Z) END. Пример 4.4. Составить программу для упорядочивания трех чисел а, Ь, с по возрастанию таким образом, чтобы имени а соответствовало наименьшее число, имени b — среднее, а имени с — наибольшее. Схема алгоритма решения пред- ставлена на рис. 1.8. Программа имеет вид PROGRAM SORT(IHPUT.OUTPUT); LABEL 10,20,30; VAR A,B,C,H:REAL; BEGIN READ(A.B.C); IF A<=B THEN GOTO 10 ELSE BEGIN H:=A; A:xB; B:xH EHD; 1O:IF A<=C THEH GOTO 20 ELSE BEGIN H;=A; A:=C; C:=H EHD; 20:IF B<=C THEH GOTO 30 ELSE BEGIN H:=B; B:=C; C:=H END; 30:WRITELH(A,B.C) EHD. Оператор выбора (CASE) обеспечивает выполнение одного опе- ратора (простого или составного) из нескольких возможных. Выбор оператора (последовательности операторов) определяется значением выражения (селектора), которое располагается между ключевыми словами CASE и OF. Значение выражения должно совпадать с кон- стантами, стоящими перед операторами. Выражение может принад- лежать любому типу, кроме REAL. Выбор оператора определяется совпадением значения селектора и константы, стоящей перед оператором. Пример 4.5. Написать программу для вывода дней недели. 198
Программа имеет вид: PROGRAM DAYWEEK (INPUT, OUTPUT); VAR NUMBER:INTEGER; BEGIN READ (NUMBER); CASE NUMBER OF 1: WRITELN (’ПОНЕДЕЛЬНИК’); 2: WRITELN (’ВТОРНИК’); 3: WRITELN (’СРЕДА’); 4: WRITELN (’ЧЕТВЕРГ’); 5: WRITELN (’ПЯТНИЦА’); 6: WRITELN (’СУББОТА’); 7: WRITELN (’ВОСКРЕСЕНЬЕ’) END END. Программы, разработанные в примерах 4.2—4.5, могут быть использованы как основа для решения задач 1.10—1.22. • Составить программы для решения задач 1.10—1.22. 4,5. ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ Циклическая структура программы позволяет производить мно- гократные вычисления группы операторов при изменении одного или нескольких параметров одновременно. В языке ПАСКАЛЬ имеются операторы цикла FOR, WHILE, REPEAT. Оператор цикла FOR используется для организации цикла с из- вестным числом повторений. Общий внд записи: — при увеличении значения параметра FOR I:«=m1 ТО т2 DO s; — при уменьшении значения параметра FOR i: = m, DOWNTO m2 DO s; где i — параметр цикла (не может быть величиной действительного типа); т, и т2— начальное и конечное значения параметра цикла соответственно; s — тело цикла, состоящее из простого или составно- го оператора. Значения mi и т2 могут быть записаны константами или выражениями, совпадающими по типу с параметром цикла. Шаг изменения параметра цикла равен 1. Оператор цикла WHILE используется для организации цикла с неизвестным числом повторений. Общий вид записи оператора: WHILE b DO s; где Ь — логическое выражение; s — тело цикла. 199
Значения переменных, входящих в условие, должны изменяться в теле цикла, иначе цикл не будет завершен. Оператор цикла REPEAT используется для организации цикла с неизвестным числом повторений. Общий вид записи оператора: REPEAT s UNTIL fc; где s — тело цикла; b — логическое выражение. В отличие от оператора WHILE в операторе REPEAT проверка условия выполняется в конце оператора, поэтому он обеспечивает хотя бы одно вычисление при значении логического выражения TRUE. Пример 4.6. Вычислить и вывести на печать значения а3 у——х----X- при значениях х, изменяющихся от 0 до а +зс 3 с шагом 0,1. Схема алгоритма решения приведена на рис. 1.11, а. Программа, реализующая этот алгоритм с оператором 1F, имеет вид PROGRAM TABULFUN(IHPUT,OUTPUT); LABEL 50; VAR A,X,Y:REAL; BEGIH READ(A); X:=O; 5O:Y::(A»A«A)/(SQR(A)tX«X); WRITELN(X.Y); X:=X+O.l; IF X<=3.O1 THEH GOTO 50; END. Эту же программу можно записать с использованием операторов цикла. В программе заранее можно определить число повторе- ний и использовать оператор цикла FOR. Программа в этом случае соответствует схеме алгоритма, представленной на рис. 1.11, б: PROGRAM TABULFUN(IHPUT.OUTPUT); VAR A,X,Y:REAL; I'.IHTEGER; BEGIH READ(A); X:=O; FOR I:=l TO 31 DO BEGIH Y:=(A«A*A)/(A»AtX«X); WRITELH(X.Y); X::XH).i END END. 200
Можно разработать универсальную программу для табулирования функции на интервале от хнач до хКОн с шагом hx. В этом случае необходимо предварительно подсчитать число повторений, которое будет использова- но в операторе цикла. Программа имеет вид PROGRAM TABULFUH(IHPUT. OUTPUT) ; VAR XH, XK. HX, A, X, Y :REAL; I.H : IHTEGER; BEGIH READ(XH, XK, HX. A); H:=TRUHC((XK-XHJ/HX)+1; X:=XH; FOR I:=l TO H DO BEGIH Y:=(A»A»A)/(A»A+X»X); WRITELH(X, Y); X:=X+HX EHD EHD. При использовании оператора цикла WHILE в универ- сальной программе будут отсутствовать описания переменных целого типа N, I и оператор присваивания, вычисляющий число повторений N. Фрагмент программы с оператором цикла имеет вид WHILE Х< =3.01 DO (тело цикла) Фрагмент программы с оператором цикла REPEAT, ана- логичный программе с оператором WHILE, имеет вид REPEAT (тело цикла) UNTIL Х>3.01 Пример 4.7. Составить программу для вычисления значе- ния членов бесконечного ряда х, . х" ——, ... до члена п! ряда —=^е. Схема алгоритма решения приведена на I! рис. 1.12. Для разработки программы можно использовать опера- торы цикла WHILE и REPEAT. Тело цикла включает в себя вычисление значения члена ряда, вывод этого значения и вы- числение значения N. 201
Программа с оператором REPEAT имеет вид PROGRAM RYD(INPUT,OUTPUT); VAR X,Y,EPS:REAL; N-.IHTEGER; BEGIN READ(X.EPS); H:=l; Y:=l; REPEAT Y:=Y»X/H; WRITELN(Y); H:=H+1; UNTIL Y<EPS EHD. При использовании оператора цикла WHILE тело цикла необходимо заключить в операторные скобки, а оператор цикла записать в виде WHILE Y>EPS DO Программы, рассмотренные в примерах 4.6 и 4.7, могут быть использованы как основа для решения задач 1.23—1.38. • Составить программы для решения задач 1.23, 1.24, 1.28, 1.34, 1.37 с оператором FOR и 1.25, 1.27, 1.29, 1.33, 1.38 с операторами WHILE и (или) REPEAT. 4.6. ПРИЕМЫ ПРОГРАММИРОВАНИЯ В языке ПАСКАЛЬ имеются большие возможности для реализа- ции типовых алгоритмов вычислений. Организация цикла с несколькими одновременно изменяющимися параметрами Пример 4.8. Составить программу для вычисления функ- Х-1-Uj ции z= _ , если х изменяется одновременно с у, от на- х yi чального значения а с шагом h. Значения yt являются эле- ментами массива (yt, у2, ..., yw). Схема алгоритма решения представлена на рис. 1.13. В программе количество элементов массива следует за- дать константой N в разделе определения констант, а пере- менные z, х, й, а и массив Y описать в разделе описания переменных. Ввод элементов массива можно осуществлять в теле цикла. Программа имеет вид PROGRAM FUHC(IHPUT,OUTPUT); CONST Нх2О; 202
VAR X,H,A,Z:REAL; ItlHTEGER; Y:ARRAY[1..H] OF REAL; BEGIN READ(H,A); X:=A; FOR i:=i TO H DO BEGIN READ(Y[I]); Z: = (X + YIID/(X-Y[ID; WRITELH(Z); x-.-x+h EHD EHD. Программу для данного условия можно записать с опе- раторами WHILE и REPEAT. В этом случае разделы опреде- ления констант и описания переменных остаются без измене- ния. Фрагмент такой программы, записанный после операто- ра Х:=А; с использованием оператора REPEAT, имеет вид 1:=1; REPEAT READ(Y[I]; Z: = (X+Y[I) )/(X-Y[I] ) ; WRITE(Z); X: -X+H; I:=I+1 UNTIL I>H; Программы, разработанные в примерах 4.6—4.8, могут быть использованы как основа дли решения задач 1.40—1.43. • Составить программы для решения задач 1.40—1.43. Запоминание результатов Пример 4.9. Составить программу для вычисления и за- "\ +1 поминания функции z,= \ /-----;--, где х,- — элементы масси- ва (хь х2, .... xgo). Схема алгоритма решения представлена иа рис. 1.14. Для вычисления и вывода результатов вычислений удоб- но использовать цикл FOR. Программа имеет вид PROGRAM MASZCTHPUT,OUTPUT); CONST NM=50; VAR N,I:INTEGER; X,z-.ARRAY[1..NH) OF REAL; BEGIN READ(N); FOR I:=l TO N DO BEGIN 203
READ(X[I)); Z[I1::SORT((SQMX[I1»L)/I)) EHD; FOR I:=l TO H DO VRITE(Z[IJ); EHD. Пример 4.10. Переписать элементы целочисленного мас- сива М (Mi, М2, .... М40), кратные пяти, подряд в мас- сив М5. Если такие элементы отсутствуют, то выдать соответ- ствующее сообщение. Схема алгоритма решения представле- на на рис. 1.15. Программа имеет вид PROGRAM KRA5 (INPUT, OUTPUT) ; COHST HM=4O; VAR К, I. H:INTEGER; H, H5: ARRAY [1. .HM] OF INTEGER; BEGIN READ(H); K: =O; FOR I;=l TO N DO BEGIN READ(H[I] ) ; IF M[I] DIV 5«5=M[I] THEH BEGIH K:=K+1; M5[K1:=M[I] EHD END; IF K=O THEH WRITELN(/ЭЛЕМЕНТОВ КРАТНЫХ 5 НЕТ’) ELSE FOR I:=l TO К DO WRITE(H5[I) : 8) END. Для изменения индекса элементов массива М5 в про- грамме введена переменная с именем К. Программы, разработанные в примерах 4.9—4.10, могут быть использованы как основа для решения задач 1.44—1.50. • Составить программы для решения задач 1.44—1.50. Вычисление суммы и произведения Пример 4.11. Составить программу для вычисления z = V = д гДе х> — элемент массива (хь Кг, ..., Х20). Схема алгоритма решения представлена на рис. 116. Программа имеет вид 204
PROGRAM SUMMA (IHPUT, OUTPUT); CONST HM-SO; VAR N, I: INTEGER; Z:REAL; X:ARRAY [1..HM] OF REAL; BEGIN READ(H); Z: =0; FOR I:=l TO N DO BEGIH READ (X [I] ); Z:=ZtSQR(X(I])/I END; WRITELN (’СУММА Z= ’, Z) END. Пример 4.12. Составить программу для вычисления про- изведения z положительных элементов массива (х;, х?, х1Оо). Схема алгоритма решения приведена на рис. 1.17. Программа имеет вид PROGRAM PROIZ(IHPUT, OUTPUT); CONST HMzlOO; VAR I, H: INTEGER; ZzREAL; X: ARRAY [ 1. . HM) OF REAL; BEGIH READ(N); Z:=l; FOR I:=l TO N DO BEGIH READ(X[I)); IF X[I)>O THEH Z:=Z«X[I] EHD; WRITELN(’ПРОИЗВЕДЕНИЕ ЭЛЕМЕНТОВ Z=’,Z) EHD. Программы, разработанные в примерах 4.11—4.12, могут быть использованы как основа для решения задач 1.51—1.66. • Составить программы для решения задач 1.51 —1.66. Вычисление суммы членов бесконечного ряда с заданной точностью Пример 4.13. Составить программу для вычисления сум- мы членов ряда z= 1 .-+(-I/1 - V' X . ..= 14- > (—1)"_—_ с точностью до члена ряда, мень- (2л)! шего е. Схема алгоритма решения представлена на рис. 1.18. Программа имеет вид 205
PROGRAM RYD(IHPUT.OUTPUT); VAR Y,Z,X,EPS:REAL; HrIHTEGER; BEGIH READ(X.EPS); Y:=i; Zs=i; H:=l; REPEAT Y:£Y»(-X»X/(a»H+(2»H*(2*H-l))B: Z:=Z+Y; H:=H+1 UHTIL YCEPS; WRITE(Z) EHD. Программа, разработанная в примере 4.13, может быть исполь- зована как основа для решения задач 1.67. • Составить программы для решения задачи 1.67. Вычисление полиномов и производных Вычисление полинома п-й степени по схеме Горнера сводится к организации цикла с известным числом повторений. Коэффициенты полинома записываются в массив, состоящий из n+1 значения. Пример 4.14. Составить программу для вычисления поли- нома у = 2х8—xe-f-4x5— 5х2+6х-|-1, используя формулу Гор- нера. Схема алгоритма решения аналогична схеме, представ- ленной на рис. 1.19. Для ввода коэффициентов полинома необходимо органи- зовать дополнительный цикл, а в остальном программа со- ответствует схеме алгоритма, приведенной на рис. 1.19. Программа имеет вид PROGRAM POLIHOH(IHPUT.OUTPUT); COHST Н=9; VAR HD.I’.IHTEGER; X,Y:REAL; A'.ARRAY[1..H) OF REAL; BEGIH READ(MD); FOR I:=l TO HD DO READ(A[U); Y:=a[1]; FOR l:=2 TO MD DO Y:=Y*X*A[I); WRITE(Y) EHD. Программа, разработанная в примере 4.14, может быть исполь- зована как основа для решения задач 1.68—1.72. • Составить программы для решения задач 1.68—1.72. 206
Нахождение наибольшего и наименьшего значения В программе нахождение наибольшего (наименьшего) значения сводится к организации цикла, в котором вычисляется значение функции и сравнивается с предыдущим. В качестве начального значе- ния при нахождении наибольшего берется заведомо меньшее число, например —1О20, а при нахождении наименьшего — заведомо боль- шее число, например 1О20. Пример 4;15. Составить программу для нахождения наи- меньшего значения функции у=аеГЬх sin (<ох+<р) при изменении аргумента х в интервале от 0 до с с ша- гом h. Схема алгоритма решения приведена на рис. 1.21. При организации программы с оператором FOR необхо- димо подсчитать число повторений, зависящее от интервала аргумента и его шага. Поэтому программа не полностью соответствует схеме алгоритма. При использовании операторов WHILE и REPEAT введе- ние дополнительного параметра не требуется, так как цикл организуется с изменением аргумента. Программа с оператором FOR имеет вид PROGRAM MIMFUH(INPUT,OUTPUT); VAR A.B.C.OMEGA.FI.H.Y.YMIN.XzREAL; K.LIKTEGER; BEGIH READ(A,B,C,OMEGA,FI,H); YMIN: = 1E19; I::TRUHC(C/H)tl; X:=O; FOR I:=l TO К DO BEGIN Y:=A*EXP(-B*X)*SIN(OHEGA*X+FI); IF Y<YMIN THEN YMIH:=Y X:sX*H END; WRITE(*YHIH= '.YMIN) END. В программе с оператором WHILE отсутствует описание переменных К и I, а собственно цикл имеет вид WHILE Х<=С DO BEGIN Y: =А*ЕХР(-В*Х) *SIH(CMEGA*X+FI) ; IF Y < YHIN THEH YHIN:=Y; X;=X+H END; Пример 4.16. Составить программу для нахождения эк- 207
стремального значения функции у= [а|е6х+сх2 при изменении аргумента х от х„ач = 0 до хКОн = 4 с шагом h. Схема алгорит- ма решения приведена на рис. 1.22. В программе для использования оператора цикла FOR после ввода исходных данных определяется число повторений. Выход из цикла осуществляется при условии N*Y>N*YM. Программа имеет вид PROGRAM EXTREH (IHPUT, OUTPUT); LABEL IO; VAR А, В, С. H, X, XH, XK, Y, YH: REAL; I. H, K: INTEGER; BEGIN READ (А, В, С. H, XH. XK) ; K:-TRUHC((XK-XN)/Н)+1; IF OO THEH H:=l ELSE N:=-l; YM: = H«1E19; X:=XH; FOR I: = 1 TO К DO BEGIN Y: =ABS(A) *EXP(B*X*C»X*X) ; IF N»Y<N»YH THEN YH: =Y ELSE GOTO IO; X:=X+H END; 10:WRITE(YM. Y) END. Программы, разработанные в примерах 4.15—4.16, могут быть использованы как основа для решения задач 1.74—1.78. • Составить программы для решения задач 1.74—1.78. Нахождение наибольшего и наименьшего в массиве Нахождение наибольшего (наименьшего) элемента массива яв- ляется частным случаем предыдущего приема нахождения наибольшего или наименьшего значения функции. В качестве на- чального значения наибольшего или наименьшего берется первое значение массива, с которым последовательно сравниваются осталь- ные элементы. Пример 4.17. Составить программу для нахождения наи- большего значения элемента массива (xj, х2, .... Хго) и его порядкового номера. Схема алгоритма решения приведена на рис. 1.23. Программа имеет вид PROGRAM MAX(INPUT.OUTPUT); CONST Nz40; VAR XHAX:REAV. I,ND,HHAX:IHTEGER; X:ARRAY[1..H] OF REAL; 208
BEGIN READ(ND); FOR I:=l TO HD DO READ(X[I]1; XHAX:=X[1]; HMAX:=1; FOR I:-2 TO HD DO IF X[I]>XMAX THEH BEGIH XMAX:=X[I1; NMAX:=I; EHD; WRITELH('Xmax=',XMAX); WRITELN(*Nmax=',HHAX) EHD. Программа, разработанная в примере 4.17, может быть исполь- зована как основа для решения задач 1.79—1.80. • Составить программы для решения задач 1.79 и 1.80. Нахождение корней уравнения Уточнение значения корня уравнения методами итерации и поло- винного деления требует организации цикла с неизвестным числом повторений. Для этого в программах используются операторы WHILE и REPEAT, в которых условием окончания цикла является до- стижение заданной точности. Пример 4.18. Составить программу для вычисления наи- меньшего положительного корня уравнения к — tg х = 0 с точ- ностью до е=10-5. Схема алгоритма решения приведена на рис. 1.24. Программа с использованием оператора REPEAT не со- ответствует схеме алгоритма, так как проверка условия про- изводится в конце цикла, а значения Хо и е задаются операто- ром ввода. Программа имеет вид PROGRAM COR(INPUT.OUTPUT); CONST PI=3.141592653; VAR XO.X1,X2,EPS:REAL; BEGIN READ(XO.EPS); REPEAT X1::ARCTAN(XO)*PI; XO:=X1; XSuXl; UNTIL ABS(X2-X1) < EPS; WRITE(X1,X2) END. Пример 4.19. Составить программу нахождения корня уравнения х + д/х-Ьд/х—2,5 = 0 методом половинного деле- 209
ния на отрезке от 0,4 до 1 с точностью до е=10-4. Схема алгоритма решения приведена на рис. 1.25. Программа имеет вид PROGRAM COR(IHFUT.OUTPUT); LABEL 10,20; VAR A.B.DX.FA.FB.FX.X.EPSlREAL; BEGIN READ(A,B,EPS); FA:=A+SGRT(A)+EXP(l/3«LN(A))-2.5; FB:=B+SQRT(B)+EXP(l/3»LH(B))-2.5; IF FA*FB>O THEN BEGIN WRITELNl'KOPHH HET'); GOTO IO END; 20:X: = (A + B)/2; DX: = (B-A)/2; IF DXCEPS THEN BEGIN WRITELH('X = ',X); GOTO 10 END ELSE FX:=X+SQRT(X)+EXP(l/3*LN(X»-2.5; IF FX*FA>O THEN BEGIN A:=X; GOTO 20 EHD ELSE IF FX*FA<O THEN BEGIN B:=X; GOTO 20 END; 10: EHD. Программы, разработанные в примерах 4.18—4.19, могут быть использованы как основа для решения задач 1.81 —1.85. • Составить программы для решения задач 1.81—1.85. 4.7. ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ СО СТРУКТУРОЙ ВЛОЖЕННЫХ ЦИКЛОВ При записи программ со структурой вложенных циклов необхо- димо обращать внимание на правильность размещения внешнего и внутреннего циклов. Одни постановки задач допускают смену мест внутреннего и внешнего циклов, а в других постановках такая смена приводит к неправильным результатам. При записи программ со структурой вложенных циклов зона действия внутреннего цикла должна располагаться в зоне действия охватывающего цикла. Пример 4.20. Составить программу для вычисления сум- мы положительных элементов каждой строки матрицы А (10X8). Схема алгоритма решения приведена на рис. 1.26. В данном примере не безразлично, какой цикл будет внешним. Внешний цикл определяет изменение индексов 210
строк, а внутренний — номера элементов на строке. Перед внутренним циклом необходимо задать начальное значение суммы SUM = 0. Так как числа строк и столбцов определены, можно воспользоваться оператором цикла FOR. Программа имеет вид PROGRAM SUMSTR(IHPUT, OUTPUT) ; CONST NM=10; MM=B; VAR SUM:REAL; N, M, I, J: INTEGER; A: ARRAY [1. . HM, 1. . HM] OF REAL; ASTR: ARRAY [ 1. . HM] OF REAL; BEGIH READLN (H, H) ; FOR I:=1 TO H DO FOR J:=l TO M DO READ(A[I, J]); FOR I:=l TO H DO BEGIH SUM:=0; FOR J: =1 TO M DO IF A[I,J]>O THEH SUM:-SUH*A[I, J); ASTR [I] : =SUM END; FOR l:=l TO H DO WRITE(ASTR[I]) ; EHD. Программу можно сократить за счет включения операто- ра ввода во внутренний цикл. При этом тело внутреннего цикла будет составным оператором: FOR J: = l ТО ММ DO BEGIN READ (A [I, J]); IF A [I, J] >0 THEN SUM: = SUM + A [I, J] END; Пример 4.21. Составить программу для упорядочивания элементов массива (xi, ха, .х,и), расположив их в по- рядке возрастания в том же массиве. Схема алгоритма реше- ния приведена на рис. 1.27. Упорядочивание элементов массива по возрастанию можно выполнить, используя прием нахождения наименьшего элемента. Решение сводится к многократному нахождению наименьшего элемента массива, начиная с первого и до по- следнего, затем со второго и т. д. После нахождения наимень- шего элемента осуществляется перестановка элементов. Программа имеет вид 211
PROGRAM SORT1 (INPUT, OUTPUT); CONST NMAXxlOO; VAR I. J, К, H, HD: INTEGER; XMIH:REAL; X: ARRAY [1. . NMAX] OF REAL; BEGIH READ(ND); FOR I:=l TO HD DO READ(X(I]); FOR K:=1 TO HD-1 DO BEGIN XMIH:=X[K); N: =K; FOR J:=K+1 TO HD DO IF X[J]<XMIH THEH BEGIH XHIH:=XtJ]; H: -J END; X[H] ;zX[K); X[K]:=XMIH END; FOR I: = l TO HD DO WRITE (X(I) END. Во внутреннем цикле находятся наименьший элемент и его порядковый номер, а во внешнем цикле осуществляется перестановка наименьшего и первого из рассматриваемых элементов массива. Пример 4.22. Составить программу для упорядочивания элементов массива Х(хь хг, ..., хюо), располагая их по воз- растанию в том же массиве. Схема алгоритма показана на рис. 1.28. Программа имеет вид PROGRAM SORT2 (IHPUT, OUTPUT) ; CONST HMAX= 1OO; VAR I, K, HD: INTEGER; Y:REAL; X: ARRAYI1. . HMAX] OF REAL; BEGIH READ (HD) ; FOR I: - 1 TO HD DO READ (X[I)); FOR K::l TO HD-1 DO FOR I;=K+1 TO HD DO IF X[I]<X[K] THEN BEGIH Y:=xm; X[K]:=x[ij; X[I]:=Y; END; FOR I:=1 TO ND DO WRITE (X[I)); END. 212
В данном примере во внутреннем цикле осуществляется перестановка элементов Xk и х, в тех случаях, когда выпол- няется условие Xi<Xk- Пример 4.23. Составить программу для определения зна- чения аргумента с точностью до е = 0,01, при котором функ- ция у = ах— In х достигает минимума, при изменении аргу- мента от 0,2 до 10. Схема алгоритма представлена на рис. 1.29. Программа не полностью соответствует схеме алгоритма, так как для организации цикла используется оператор RE- PEAT. Для уменьшения числа вычислений вначале шаг изме- нения аргумента принимается равным 0,2. Начальное и ко- нечное значения аргумента определяются в разделе определе- ния констант. Значение е задается оператором ввода, а шаг — оператором присваивания. Программа имеет вид PROGRAM ARG (IHPUT. OUTPUT); LABEL 20, 30; CONST XH=O. 2;XX-10; VAR A, EPS, X, XHIH, Y, YHIN, HX: REAL; BEGIH HX: =O. 2; READ (A, EPS); X:-XH; aO-.YMIH: = 1E2O; REPEAT Y: =A*X-LN(X); IF Y<YHIH THEN BEGIH YHIN:=Y; XHIH:-X; END; X:-X+HX; UNTIL X>XK; IF HX<-EPS THEN GOTO 30; X: =XHIN-HX; HX:=EPS; GOTO 20; 30:WRITE(XHIH); END. Пример 4.24. Составить программу для вычисления зна- Ь х-х2 г е , чения определенного интеграла z=\--------ах с точностью J X а до е. Схема алгоритма приведена на рис. 1.30. В программе YA и YB — значения подынтегральной фун- кции в точках А и В; S1 и S2 — предыдущая и последующая суммы, вычисленные соответственно с шагом h и Л/2; х — аргумент. 213
Программа имеет вид PROGRAM IHTEGRIIHPUT,OUTPUT); LABEL 30,40; VAR A,B,HX,S1,SE,X,YA,YB,Y,EPS:REAL; H:IHTEGER; BEGIH READIH.A.B.EPS): YA:^EXP(A-A*A)/A; YB:=EXP(B-B«B)/B; S1:=O; 30;S2:=(YA*YB)/E; X:=A; HX:=(B-A)/H; WHILE X<=B DO BEGIH X:=X<HX; Y: = EXP(X-X«X); S2:=Sa+Y; ehd; S2;:S2+HX; IF ABS(S1-SEX=EPS THEH BEGIH WRITELH(Sa); GOTO 40 EHD ELSE BEGIH Sl:=Sa; H:s2»H; GOTO 30; EHD; 40:EHD. Программы, рассмотренные в примерах 4.20—4.24, могут быть использованы как основа для решения задач 1.86—1.102. • Составить программы для решения задач 1.86—1.102. 4.8. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ ПОДПРОГРАММ Подпрограммы позволяют разрабатывать программы в виде отдельных частей (модулей), которые могут взаимодействовать меж- ду собой. Каждая подпрограмма описывается один раз, при необхо- димости к ней можно многократно обращаться. В языке ПАСКАЛЬ имеется два вида подпрограмм: функция и процедура. Используемые функции н процедуры должны быть описаны в разделе описания функций я процедур. Описания подпрограмм включают в себя заголовок подпрограм- мы, разделы описаний (меток, констант, типов, переменных, а также дополнительных функций и процедур, являющихся локальными по отношению к данной подпрограмме), тело процедуры. В заголовке подпрограммы за ключевым словом (FUNCTION или PROCEDURE) указываются имя подпрограммы, а в скобках — список формальных параметров со своими описаниями. В отличие от процедуры в за- головке функции должен быть определен тип результата, передавае- мого функцией. 214
Описание действий в подпрограмме осуществляется с использо- ванием формальных параметров. Обращение к подпрограмме осуще- ствляется с фактическими параметрами, которые должны соответ- ствовать формальным по числу, типу и месту расположения. Функции используются для вычисления одного значения. Общий вид записи функции: FUNCTION F(«?i:Ti; ?2:Т2; ...):Т; (Разделы определений и описаний локальных параметров и под- программ ) BEGIN Л; Рг; END;' где F — имя функции; q, — имена формальных параметров; Т — тип имени функции; Ti — типы параметров; Р1 — операторы тела функции. Обращение к функции записывается в правой части оператора присваивания, при этом указывается имя и в скобках — фактические параметры в виде F (61, 62, • • •), где б,- — фактические параметры. Пример 4.25. Составить программу для определения зна- чений и!, ml, (n — m)l, используя функцию при вычислении факториала. Программа имеет вид PROGRAM FACTLCIHPUT,OUTPUT); VAR NF,MF,NMF:IHTEGER; FUNCTION FACT(K:IHTEGER):INTEGER; VAR PF,I:INTEGER; BEGIN IF K<0 THEN FACT:=O ELSE IF K=O THEN FACT:=1 ELSE BEGIN PF:=1; FOR I:=2 TO К DO PF:=PF«I; FACT:=PF END; BEGIN READ(N.M); NF:=FACT(N); MF:=FACT(M); HMF:=FACT(H-M); WRITE(-HF-',HF,' ':4/MF=V -:4,MF,'HMF:J,HMF) END. В операторах присваивания программы записаны три обращения к функции: FACT (N), FACT (М), FACT (N —М). 215
юо а= £ ъ= У Z(; Пример 4.26. Составить программу для вычисления зна- чения функции y=ax2 + dx-|-d, где 20 d= Z ft* /=1 /=л/4-1 i—1 I используя функцию SUM= £ maSj. i=k Программа имеет вид PROGRAM FUHY (IHPUT. OUTPUT) ; COHST Hx100; TYPE IHDEX-1..H; VECT:ARRAY[INDEX] OF REAL; VAR I, HR, MT. HQ: INTEGER; T, Q: VECT; Y:REAL; FANCTIOH SUM (HAS:VECT;K:INTEGER;MH:INDEX):REAL; VAR J:INTEGER; BEGIN S: =0; FOR J: = l TO ИМ DO S:=S»HAS[JJ; SUM:-S EHD; BEGIH READ (NR, NT, HQ); FOR I:sl TO NT DO READ(T[I]); FOR I: = l TO HQ DO READ(Q[I]); Y:=SUM(T, i, HR) *X*X+SUM(T, NR+i, HT) *X+SUM (Q, 1,NQ); WRITE ('Y: Y) END. Процедуры используются при получении нескольких результа- тов. Общий вид записи процедуры: PROCEDURE F(<7i:Ti; q2:T2;... VAR q3:T3); (Разделы определений и описаний локальных параметров и под- программ ) BEGIN Pi; Р2; END;’ где F — имя процедуры; qt — имена формальных параметров; 7, — типы параметров; Pi — операторы тела подпрограммы. Обращение к процедуре осуществляется оператором процеду- ры в виде P(6i, Ь2, ...); где F — имя подпрограммы; 6,- — имена фактических параметров. 216
Пример 4.27. Составить программу для вычисления z = Sh2n+Sh(a — b) с, е* —е-х Sha+ySh(a2 —д2) 2 Программа имеет вид PROGRAM FSN (INPUT, OTPUT); VAR A, В, Z, Tl, T2, T3:REAL; PROCEDURE SH (X:REAL; VAR R:REAL); BEGIN R: = (EXP (X)-EXP (-X))/2.0 END; BEGIN READ (A, B); SH (A, TI); SH (A-В, T2); SH (A»A—B*B, T3); Z: = (T1*T1+T2)/(T1+ SQRT (T3)); WRITE (Z=’« Z) END. Пример 4.28. Составить программу вычисления функции Л| kn X х Z =--;----, s,+s2 где si и s-2 — сумма и количество положительных элементов массива А(АЬ ..., Ато); «2 и k2 — сумма и количество положительных элементов массива B(Bi, В2, В;о). Для вычисления суммы и количества положительных элементов массива использовать процедуру. В процедуре с именем SUMKOL вычисляются s — сумма положительных элементов массива MAS и k — количество этих элементов. Программа имеет вид PROGRAM FUNZ<INPUT,OUTPUT>; CONST RAZM=1OO; TYPE INDMAX=L-RAZM; VECTDR=ARRAYIINDMAX1 OF REAL; VAR NMA,NMB,I,Kl,K2:INTEGER; P,Z,S1,S2,X:REAL; A,Bs VECTOR; PROCEDURE SUMKOL<MAS:VECTOR;MM:INDMAX;VAR S:REAL;K:INTEGER>; VAR JsINTEGER; BEGIN Ss=O; Kt=O; FOR Jr=l TO MM DO IF MASCJ»O THEN BEGIN S:=S+MAStJ3; Ks=K+l; END; 217
END; BEGIN READ(NMA); FOR b=l TO NMA DO READCAIID; SUNK OL(A,NMA,S1.KD; READ(NMB); FDR I:=l TO NMB DO READCBIID; SUMKOL(B,NMB,S2,K2>; READOO; P:=(EXP<K1*P>*EXP<K2»P>/<S1+S2>; WRITECZ=,,2>; END END. Если в процедуре и главной программе используются одни и те же имена параметров (процедура связана с программой посредством глобальных параметров), то процедура может быть без параметров. Пример 4.29. Составить программу с процедурой без параметров для вычисления полярных координат г = д/?-|-у2 и f = arctg (у/х) по прямоугольным координатам х и у (х>0). Программа имеет вид PROGRAM POLKOR(IHPUT,OUTPUT); VAR X,Y,R,F:REAL; H,I:IHTEGER; PROCEDURE POLAR; BEGIH R:--SGRT(X«XH«T); F:=ARCTAH(Y/X); EHD; BEGIH READ(H); FOR I:=l TO H DO BEGIH READ(X.Y); POLAR; VRITE(R.F); EHD; EHD. Задачи для решения * 4.2. Составить программу для вычисления значения функции s = -^х2 + t? + &т2 ху 4 дДг2 4-г2 4-sin2 yz4 д/х2+х2 + sin2 zx, используя функцию. * 4.3. Составить программу для вычисления значений функции "\Jsz:i + <?z2 + iz -(4 Z2 sin а 4- i cos В 4 3,5 а=---------;; b=-----------------b.----- . ис- l+eS23+*-' z24-2r — t пользуя в качестве подпрограммы функцию. 218
* 4.4. Составить программу для вычисления значения с = и! , и=----------, используя в качестве подпрограммы функцию т\(п—т)\ Г 0, если п<0; п! = < 1, если л = 0; (я!, если я>0. * 4.5. Составить программу для вычисления среднего арифметического положительных элементов массивов Х(60), Y (75), Z (80), используя в качестве подпрограммы функцию. В массивах имеются положительные элементы. * 4.6. Составить программу для условия 4.31, используя процедуру. * 4.7. Составить программу для вычисления среднего геометрического положительных элементов каждого столбца матрицы А (8, 10), используя процедуру. * 4.8. Составить программу для вычисления z=---- - —, где хтах и xmin — наибольший и наи- yl । меньший элементы массивах (100),aymaxHymin — наибольший и наименьший элементы массива Y (80). « 4.9. Составить программу для вычисления значения функции Л. -j-у. —9 I u = e 1 е2 2, где хь х2 — корни уравнения ах + Ьх— 1,5 = 0; у,, у?— корни уравнения 2у2 — у + с = 0. Корни находить в процедуре. Если корни мнимые, то считать их равными нулю. * 4.10. Составить программу для вычисления значения функции io 20 40 £°2i+i £ &2i ZC2i+‘ г=х1+х2+х3,гдех1=-^т1--------, x2=2zL__, ---= a,-, bi. Ci — элементы массивов. Вычисление х,- выполнить в процедуре, а для вычисления факториала использовать функцию. * 4.11. Составить программу для вычисления математи- ческого ожидания тх и дисперсии Dx для моментов появления случайных событий h, t-i, ..., /200 и интервалов между ними. Для вычисления тх и Dx использовать процедуру без пара- метров. 219
4.9. ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ СМЕШАННОЙ СТРУКТУРЫ С ИСПОЛЬЗОВАНИЕМ СТРУКТУРИРОВАННЫХ ТИПОВ ДАННЫХ К структурированным типам языка относятся массивы, записи, множества, файлы. Запись представляет собой структуру, состоящую из фиксиро- ванного числа компонентов, называемых полями. Компоненты записи могут принадлежать разным типам. Общий вид записи: TYPE P = RECORD C,:Ti; С2:Г2; ...; С„:Т„ END; где Р — имя типа записи; С, — имя компонента (поля) записи; Г,— имя типа полей. Например: TYPE FIOrARRAYfi. . 15J OF CHAR; REZ=ARRAY[1. . 4] OF INTEGER; SRBAL-RHAL; ACTIVr INTEGER; STIP= IHTEGER; STUDENT - RECORD FAM: FIO, EKZ:REZ; SRB:SRBAL; ACT:ACTIV; PRIZ:STIP EHD; В определении базовых типов приняты следующие: FIO — массив типа CHAR из 15 элементов, содержащий фамилию и инициалы студентов; REZ — массив целого типа, содержащий результаты че- тырех экзаменов; SRBAL — определяет средний балл четырех экзаменов и относится к типу REAL; ACTIV — определяет участие студентов в общественной работе (1 — участвует, 0— нет); STIP — определяет признак назначения стипендии сту- денту (0 — отсутствие стипендии, 1 — обычная стипендия, 2 — повышенная); Запись STUDENT содержит значения, соответствующие базовым характеристикам: FAM — фамилия и инициалы, относящиеся к типу FIO; EKZ — результаты экзаменов, относящиеся к типу REZ; ACT— признак участия студента в общественной рабо- те, относящийся к типу ACTIV; SRB — средний балл студента по результатам сессии, относящийся к типу SRBAL; 220
PRIZ — признак назначения на стипендию, относящийся к типу STIP. Обращение к компонентам записи осуществляется вы- бором имени типа записи и имени поля, разделенных точ- кой. Если использовать в программе имя ST как переменную типа GRUP, то: ST [I].FAM — переменная типа FIO ST [IJ.FAM [I] CHAR ST [IJ.EKZ [J] » INTEGER ST II] .SRB REAL ST (Ij.ACT » INTEGER ST [IJ.PRIZ INTEGER Пример 4.30. Составить программу для вычисления сред- него балла и зачисления на стипендию студентов, получив- ших оценки «4» и «5» или имеющих одну оценку «3», но ак- тивно выполняющих общественные поручения. Студент, име- ющий все оценки «5», получает повышенную стипендию. Программа составляется из расчета четырех экзаменов и должна использовать признак 1, если студент активно выполняет общественные поручения, или 0 — в противном случае. Для студентов, имеющих хотя бы одну неудовлетво- рительную оценку, средний балл не вычислять. Признаками зачисления на стипендию являются: 0 — отсутствие стипен- дии; 1 — обычная стипендия; 2 — повышенная стипендия. Программа с учетом предварительных описаний име- ет вид PROGRAM SESSIY(IBPUT.OUTPUT); LABEL Р О; CONST NCH=15; ВК=4; NST-R5; TYPE FIO=ARRAY[i..BCH] OF CHAR; REZ=:ARRAY[1..BK] OF INTEGER; SRBAL=REAL; ACTIVE INTEGER; STIP=IBTEGER; STUDENT=RECORD FAMzFIO; ECZzREZ; SRBzSRBAL; ACTzACTIV; PRIZ’STIP EHD; GRUP=ARRAYI1..BST] OF STUDENT; VAR STzGRUP; SUMzREAL; I.JzIRTEGER; BEGIN FOR I:=i TO NST DO BEGIN FOR J'=i TO BCH DO BEGIB WRITE(* • , J READ(ST[I].FAM[J]) END; 221
FOR J::l TO BI BO READ(ST[I].EIZ[ J]); RM AD(ST[I]. ACT) EHD; FOR I:=l TO HST DO BEGIH SUM:=O; FOR J:=i TO HI DO IF ST[I].EIZ[J]<3 TBEH GOTO 20 ELSE SUM;=SUM+ST[I].EKZ[ J J; ST[I].SRB:=SUM/NI; IF (SUM=2O) AHD (ST[I].ACT=1) THEH ST[I].PRIZ;=2 ELSE IF (SUM>=17) AHD (SUM<20) AHD (ST[I].ACT=1) TBEH ST[I].PRIZ:=1; 2O:STri].SRB: = 0; ST[IJ.PRIZ: = O END; FOR I:=l TO HST DO BEGIH FOR J:=l TO HCH DO WRITELN(ST[II.FAH[I]); WRITELH(’ *:4,ST[I].SRB:4:2,' *:4,STII].PRIZ) END; EHD. Программа, разработанная в примере 4.30, может быть исполь- зована как основа для решения задач 1.103—1.106. • Составить программы для решения задач 1.103— 1.106. Задачи для решения • 4.12. Составить программу для составления списков студентов, имеющих оценки: только «5», «5» и «4», только «4», «4» и <3», только «3». • 4.13. Составить программу для нахождения групп на курсе, в которых учатся студенты, имеющие одинаковые фамилии. Множества представляет собой ограиичеиный набор различных элементов базового типа, который может быть скалярным или ограни- ченным. Общий вид записи множественного типа: TYPE P = SET OF Г; где Р — имя множественного типа; Т — тип компонентов. Тип компонентов должен быть базовым. Множества образу- ются из элементов и состоят из перечисления элементов множества, заключенных в квадратные скобки. Запись [ ] означает пустое мно- жество. Например: TYPE STUD=1 ..25; GRUP = SET OF STUD; или TYPE M = SET OF 1..3; Переменная M может принимать одно значение из следующего множества: [1, 2, 3]. [1, 2], [2, 3], [1, 3], [1], [2], [3], [ |. 222
К объектам множественного типа применимы операции: объеди- нения ( + ), пересечения (»), вычитания (—), проверка иа равенство (=) и неравенство (<>), включение (> = или < =), принад- лежность множеству 1N; Например, выражение с использованием логических операций вида (СН>=’А’) AND (CH<=’Z’) может быть заменено на выражение с использованием операции IN CH IN |’A’..’Z’] Файлы представляют собой последовательность произвольного числа компонентов одного типа. Естественный порядок компонентов в файле определяется их последовательностью. Описание файла имеет вид TYPE P = FILE OF Т; где Р — имя файла, Т — тип компонентов файла. Например, TYPE FL = FILE OF REAL; С каждым описанием новой файловой переменной автоматиче- ски вводится дополнительная переменная типа компонентов файла, которая является буферной переменной и обозначается Pf. Для данного описания буферной переменной является FLf типа REAL. К файлам применимы следующие стандартные функции и про- цедуры: EOF (иф) — функция конец файла указывает, находится ли файл с именем ИФ в состоянии конец файла. Если файл пуст, то функция EOF принимает значение TRUE; в противном случае — значение FALSE; PUT (иф) — процедура осуществляет запись значения буфер- ной переменной иф\ в файл иф. Запись производится в том случае, если значение функции EOF равно TRUE. При этом после записи значение функции EOF остается равным TRUE, а значение буферной переменной не определено; GET (иф)—процедура осуществляет передвижение по файлу на один компонент. Буферная переменная иф\ получает значение этого компонента, если файл не пуст. Если следующее значение ком- понента не существует, то значение функции EOF принимает значе- ние TRUE, а значение буферной переменной иф\ не определено. Процедура GET определена в тех случаях, когда перед выполнением следующего вызова функция имеет значение FALSE (файл не пуст); RESET (иф) — процедура осуществляет поиск начала файла и подготавливает его к просмотру. Если функция EOF имеет значение FALSE, то буферная переменная иф( приобретает значение первого компонента файла. В противном случае функция EOF имеет значение TRUE, а значение буферной переменной не определено; REWRITE (иф)—процедура предшествует созданию файла иф. Значение иф заменяется иа пустой файл. Функция EOF (иф) принимает значение TRUE и можно создавать новый файл. 223
Все действия по созданию и просмотру файлов могут быть опи- саны с помощью указанных функций и процедур. Привязка реальных файлов к выполненной программе осуществляется по командам, не входящим в состав программы. Пример 4.31. Составить программу для вычисления среднего арифметического положительных значений z, пред- ставленных в виде файла FL. Программа имеет вид PROGRAM SREDZ (FL,OUTPUT); TYPE FL=FILE OF REAL; VAR S,SR:REAL; H1IHTEGER; BEGIH H:=O; S:=O; RESET(FL); REPEAT IF FL?>0 THEH BEGIH S:=S*FLB; EHD; GET(FLB); UHTIL EOF(FLB); SR:=S/H; WRITE('SR=',SR) EHD. Программа с использованием оператора WHILE имеет вид PROGRAM SREDZ (FL, OUTPUT) ; TYPE FL=FILE OF REAL; VAR S, SR: REAL; H:INTEGER; BEGIH H: =o; S: =0; RESET(FL); WHILE HOT EOF(FL) DO BEGIH IF FLB>0 THEH BEGIH S: =S*FLB; H:=H*i; GET (FL) ЕНП; SR:= S/H; WRITE('SR=‘, SR) END. Программа, разработанная в примере 4.31, может быть исполь- зована как основа для решения задач 1.49, 1.60, 1.66, 1.79, 1.94, 1.100. • Составить программы для решения задач 1.49, 1.60, 1.66, 1.79, 1.94, 1.100, представив входные данные в виде файла. 224
ГЛАВА 5 ЛАБОРАТОРНЫЙ ПРАКТИКУМ Дисплей является основным средством общения пользователя с ЭВМ. Текстовые дисплеи позволяют отображать на экране текст, состоящий из букв латинского и русского алфавитов, цифр и специ- альных символов. Клавиатура управления обеспечивает ручной ввод на экран текста и выполнение ряда редактирующих и управляющих функций. Большинство дисплеев позволяет производить стирание знака, строки и части строки, очистку экрана, сдвиг текста вправо-влево и создание защитных областей. Ииформациоиная емкость экрана представляет- ся 12, 16, 24 строками по 40, 60 и 80 знаков на строке. В вычислительных машинах ЕС и ПЭВМ используются следую- щие типы дисплеев. На экране алфавитно-цифрового дисплея ЕС-7927 размещается 24 строки по 80 символов в каждой. Дисплей имеет буферное запо- минающее устройство из 1920 ячеек, достаточное для хранения ин- формации всех 24 строк. Под экраном на панели блока расположено шесть индикаторов: АВАР, СЕТЬ, ВКЛ, СИСТ. ДОСТ., РЕЖИМ ВСТАВКИ, ВВОД ЗАПР.; ручки регулировки: КОНТРАСТ, ЯРКОСТЬ; замок. При включении дисплея в сеть напряжением 220 В загорается индикатор СЕТЬ. Для работы на дисплее необходимо вставить ключ в замок и повернуть его направо. При повороте ключа на 45° загорается индикатор ВКЛ. Загорание индикатора АВАР сигнализирует о на- рушении питания или неисправности самого дисплея. Поворот ключа на 90° приводит дисплей в рабочее состояние и состояние готовности к обмену информацией с ЭВМ. Через 1—2 с загорается индикатор СИСТ. ДОСТ. и разрешается доступ к ЭВМ. Загорание индикатора ВВОД ЗАПР. предупреждает о незаконченности предыдущей опера- ции обмена с ЭВМ или о попытке выполнить недопустимую операцию. При нажатии управляющей клавиши ВСТВ загорается индикатор РЕЖИМ ВСТАВКИ, который используется для вставки пропущен- ных символов в тексте. Индикаторы РЕЖИМ ВСТАВКИ, ВВОД ЗАПР. могут быть погашены нажатием клавиши СБРОС. Используется две модификации клавиатуры подготовки данных: клавиатура ЕС-0101-02, состоящая из групп управляющих клавиш и алфавитно-цифровых клавиш; клавиатура ЕС-0101-01, имеющая дополнительно группу цифровых клавиш. Большинство алфавитно- цифровых клавиш используется для воспроизведения двух символов. Символы, расположенные в верхней части клавиш, высвечиваются на экране при нажатой клавише ВР. Символы, расположенные в нижней части клавиши, вводятся при нажатой клавише HP. Переключение регистров осуществляется клавишей ФБР. 8 В. Е. Алексеев и др. 225
В момент включения дисплея автоматически устанавливается режим иижиего регистра, о чем свидетельствует отсутствие свечения индикатора ВР на клавиатуре. В режиме иижнего регистра набира- ются буквы латинского алфавита и большинство специальных симво- лов, а в режиме верхнего регистра — буквы русского алфавита, цифры и специальные символы. Для символа i_j (пробел) применяет- ся длинная черная клавиша, расположенная в низу клавиатуры. Ввод программы осуществляется посимвольно. Очередной сим- вол вводится в позицию экрана, под которой располагается курсор (маркер), изображаемый символом «—». После набора символа курсор автоматически сдвигается иа одну позицию вправо, а из по- следней (восьмидесятой) позиции строки — в начало следуюшей строки. После завершения набора последней строки курсор переме- щается в левый верхний угол экрана (начало первой строки). Управляющие клавиши используются для перемещения курсора без изменения введенной и высвеченной на экране информации. Клавиши работают одинаково в любом режиме регистров. Черные клавиши с выгравированными стрелками (f, |, ->-) и белая клавиша с символом «---» при однократном иажатии перемешают курсор иа одну позицию по направлению стрелки. Управляющая клавиша с символом « я_| » сдвигает курсор в начало следующей строки. Все клавиши черного цвета при длительном их нажатии осуществляют динамическое повторение выполняемых функций. Ввод информации с клавиатуры возможен лишь в том случае, если ие горит индикатор ВВОД ЗАПР. Для вставки символов в уже введенный и высвеченный на экране текст нужно нажать управляющую клавишу ВСТВ, подвести курсор под символ, находящийся правее начальной, неизменяемой части текста, и набрать нужную вставляемую часть текста. После оконча- ния коррекции текста следует нажать клавишу СБРОС. В процессе вставки при наборе очередного символа исходный текст от позиции, отмеченной курсором (включительно), до конца строки сдвигается на одну позицию вправо, освобождая место для нового вставляемого символа. Для удаления из текста лишних, ошибочно введенных сим- волов под самый левый из них подводится курсор и в режиме верхнего регистра нажимается управляющая клавиша ВЧРК. При каждом нажатии символ из помеченной позиции исчезает, а часть текста строки правее курсора сдвигается на одну позицию влево. Назначение остальных управляющих клавиш и работа с ними зависят от используемого программного обеспечения. Алфавитно-цифровой дисплей ПЭВМ ЕС 1841, ЕС 1842 предоставляет возможность отображения информации в 25 строк по 80 символов на строке. Клавиатура дисплея состоит из трех групп клавиш: алфавитно- цифровые и управляющие, цифрового ввода и управления курсором, функциональные. Алфавитно-цифровые и управляющие клавиши используются для набора текстов программ, исходных данных и команд операцион- ной системы. На клавишах этой группы размещается по два символа. 226
Используются прописные и строчные буквы русского и латинского алфавитов. Клавиатура может находиться в режимах: «Русский ни- жний», «Русский верхний», «Латинский нижний», «Латинский вер- хний». Нижиему регистру соответствуют строчные буквы русского и латинского алфавитов, верхнему регистру — прописные буквы. Ре- гистр устанавливается фиксирующими клавишами РУС или ЛАТ, клавишей фиксации букв прописных и клавишами верхнего регистра, расположенными в левой и правой частях клавиатуры. Ввод строчных букв русского или латинского алфавита осуще- ствляется после нажатия и отпускания клавиш РУС или ЛАТ со- ответственно. После загорания индикатора, расположенного над кла- вишей, можно набирать текст. Для ввода прописной буквы необходи- мо нажать на любую клавишу верхнего регистра и, удерживая ее, нажать на клавишу с нужной буквой. При вводе нескольких про- писных букв подряд следует нажать и отпустить клавишу ФБП и по- сле этого набирать текст. Для перехода на строчные буквы необходи- мо снять фиксацию путем нажатия и отпускания клавиши ФБП. Переход на алфавит, противоположный установленному, осуществля- ется клавишей Р/Л. при этом клавишу следует удерживать в на- жатом состоянии. Цифры вводятся в режиме нижиего регистра, а специальные символы — в режиме верхнего и нижнего регистров. Управляющие клавиши позволяют выполнять функции управле- ния вводом и редактированием информации, выполнением программ и связью с операционной системой. Нажатие на клавишу ВВОД обеспечивает запись информации и перевод курсора на новую строку. Нажатие на клавишу ВОЗВРАТ НА СИМВОЛ («-) вызывает стирание символа в текущей позиции. Клавиша ПЕЧ (печать экрана) при нажатии на нее в режиме верхне- го регистра вызывает вывод содержимого экрана на печатающее устройство. Управляющие клавиши УПР (управление) и ДОП (дополнение) используются совместно с другими клавишами. Совместное использование клавиш УПР — ПЕЧ позволяет дуб- лировать на печатающем устройстве символы, выводимые иа экран. Повторное нажатие на клавиши УПР — ПЕЧ отменяет функции вывода. Использование клавиш УПР — СТОП вызывает прекращение выполнения программы и на экран выводится системное сообщение. Клавиши УПР — ЦИФ позволяют приостановить выполнение программы. Клавиша КЛЮЧ, используемая при редактировании текста вы- полняет совместно с другими клавишами различные функции. Клавиши цифрового ввода и управления курсором позволяют осуществлять ввод цифровой информации и перемещение (сдвиг) курсора. Переход на клавиши с цифровыми символами осуществляется нажатием на клавишу ЦИФ. Функционирование клавиш для переме- щения курсора зависит от используемой программы-редактора. Функциональные клавиши Ф1 — Ф10 позволяют вводить наибо- 8* 227
лее часто используемые команды ОС, которые закреплены за отдель- ными клавишами. Команды, закрепленные за функциональными кла- вишами, можно менять в процессе работы. За функциональной клави- шей можно закрепить последовательность символов, но ие более 20. Соответствие основных клавиш ПЭВМ ЕС 1841, СМ 1914, ЕС 1832 приведено в табл. 5.1. Таблица 5.1 Назначение клавиш Обозначение клавиш ЕС 1841 ЕС 1842 СМ 1914 EC 1832 Ввод информации в ОП ВВОД Enter J Фиксация прописных ФБП Caps Lock CAPS букв Переход иа верхний ре- гистр без фиксации t Shift t Вывод содержимого эк- ПЕЧ Shift 4~ Screen PRTSCR рана на печать Переход на буквы рус- РУС ского алфавита Переход на буквы ла- тинского алфавита ЛАТ | Alt + Shift | CYP-LAT Возврат иа символ с -ч— 4— 4— удалением Удаление символа в данной позиции УДЛ DeL DEL Вставка символов вст Ins INS Примечание. «4- » означав т нажатие двух клавиш. Подготовка ПЭВМ к работе включает в себя: — установку в НГМД1 гибкого диска с операционной системой; — включение тумблерами электропитания устройств в опреде- ленной последовательности: печатающее устройство, НГМД, базовый блок, дисплей. После этого при нормальном функционировании системы авто- матически выдаются следующие сигналы и сообщения: загорается и гаснет индикатор иа лицевой панели НГМД1; подается звуковой сигнал; вторично загорается индикатор НГМД1; происходит автома- тическая загрузка ОС в ОП ПЭВМ и иа экране дисплея появляется сообщение о готовности ЭВМ к работе. Для копирования дискеты необходимо выполнить следующие действия: вставить копируемую дискету в дисковод 1 (А), а пустую дискету — в дисковод 2 (В); набрать на клавиатуре команду ФДСКТ и нажать клавишу ВВОД. Пользователь получает сообщение на экране о дальнейших действиях.
ЛАБОРАТОРНАЯ РАБОТА № 1 ОРГАНИЗАЦИЯ РАБОТЫ ПОЛЬЗОВАТЕЛЯ С ЭВМ Цель работы — освоение работы с клавиатурой дисплея и порядка работы на ПЭВМ. Задание для самостоятельной подготовки 1. Ознакомиться с расположением и назначением кла- виш клавиатуры ПЭВМ. 2. Ознакомиться с порядком работы на ПЭВМ. 3. Изучить инструкцию по технике безопасности при ра- боте на ПЭВМ и строго ее выполнять. 4. Ознакомиться с программой вычисления площади тре- угольника. Задание к работе 1. Освоить работу с клавиатурой, набрав текст и выпол- нив его редактирование. 2. Набрать программу вычисления площади треугольни- ка по формуле Герона и получить результат: s = ^p(p-a)(p-b) (р-с). где р=(а-\-Ь-\-с)/2. 3. Проверить правильность решения. Программы решения задачи имеют вид: а) на языке БЕЙСИК 10 REH ПЛОЩАДЬ ТРЕУГОЛЬНИКА го трит а,в,с зо р=(А*в+с>/2 40 S=SQR(P«(P-A)*(P-B)«(P-C» 50 PRIHT "S=”;S;"P=“;P 60 EHD б) на языке ФОРТРАН с площадь треугольника READ(5.1) А,В,С 1 FORMAT (3F4.1J р=(А*в+с>/г S=SQRT(P»(P-AJ«(P-B)«(P-C)) WRITE(6,2) S,P г FORHAT(1H ,'S-',E12.5,4X.'P-',E12.5) STOP EHD 229
в) на языке ПАСКАЛЬ PROGRAM TREYG(IHPUT.OUTPUT); VAR A,B,C,P,S:REAL; BEGIH READ(A,B,C); P:=(A*B*C)/2; S:-SQRT(P*(P-A)*(P-B)*(P-C)); WRITE('S=',S:4,'P=',P); EHD. Пример выполнения работы 1. Набрать текст, например ПРОГРАММА РАСЧЕТА КОРНЕЙ УРАВНЕНИЯ 2. Вставить между словами КОРНЕЙ и УРАВНЕНИЯ слово КВАДРАТНОГО. 3. Убрать слово ПРОГРАММА, текст сдвинуть влево, исправить слово РАСЧЕТА на РАСЧЕТ. 4. Набрать программу на языке программирования, про- верить и исправить ее при наличии ошибок. 5. Выполнить трансляцию программы. При наличии оши- бок внести исправления (см. прилож. 1, 2, 4). 6. Выполнить загрузку программы. При наличии ошибок внести исправления (см. прилож. 3, 5). 7. Выполнить программу и проверить правильность рабо- ты программы на тестовом варианте исходных данных. Тестовый вариант исходных данных: а = 3, Ь = 4, с = 5, s = 6, р = 6. Примечание. Инструкции по работе на ПЭВМ и с СВМ ЕС ЭВМ даны в прилож. 7 и 8. ЛАБОРАТОРНАЯ РАБОТА № 2 ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ ЛИНЕЙНОЙ СТРУКТУРЫ Цель работы — овладение практическими навыками раз- работки и программирования вычислительного процесса ли- нейной структуры и навыками по отладке и тестированию программ. Задания для самостоятельной подготовки 1. Изучить: — запись констант, переменных, стандартных функций; — правила записи арифметических выражений; 230
— арифметический оператор присваивания; — организацию простейшего ввода-вывода данных 2. Разработать алгоритм решения в соответствии с за- данием. 3. Составить программу решения задачи. 4. Подготовить тестовый вариант исходных данных и вы- числить для них вручную или с помощью микрокалькулятора значения вычисляемых в программе величин. Задание к работе I. Вычислить на ЭВМ значения переменных, указанных в табл. 5.2 (вариант задается преподавателем), по заданным расчетным формулам и наборам исходных данных. На печать вывести значения вводимых исходных данных и результаты вычислений, сопровождая вывод наименованиями выводимых переменных. Таблица 5.2 Вариант задания Расчетные формулы Значения исходных данных 1 2cos (х—л/6) а = = 1/2 + sin2 1/ 6-11 3 + z2/5 x= 1,426 y=-1,220 z=3,5 2 - 1 т ^7 + J =>“ Ч - 1 II э II x= 1,825 (/=18,225 z=—3,298 3 г® s = l+x+—+—+— i|> = х (sin x3 + cos2 у) x=0,335 (/=0,025 4 у=е~ь‘ sin (at-\-b)—^\bt+a\ s=b sin (at2 cos 2t)— 1 a = —0,5 6 = 1,7 /=0,44 5 w = -y]x2 + b — b2 sin3 (x+a)/x у = cos2 x3 —x/~\]a2 + b2 сч 1 II II II Q О * 6 s=x3 tg2 (х + 6)2+а/д6Г+6 Q = Ь?~а e"— 1 Ю — (О -co о II II II Q -O * 231
Продолжение табл. 5.2 Вариант задания Расчетные формулы Значения исходных данных 7 R=x2 (х4-1)/6—sin2 (х4-а) s=-\]xb/a 4-cos2(x4-6)3 * о- о II II II PPP 018 м- 8 </=sin3 (х24-а)2—\]x/b Z = -^-4-COS (х4-6)3 * О* D II II II о с >— 9 f=\m tg <+ |c sin Z| z=m cos (Ы sin Z) + c “ и и ii 10 у = b tg2 x £ sin2 (x/a) d=ae~x,« cos (bx/a) a=3,2 6 = 17,5 x=—4,8 11 f = ln (o + x2) + sin2 (x/b) z=e-c„ x + Vx + a _ x —tJ\x — b\ * о Q II II II II P M CO - СЛ 'to to P to 12 a2x-|-b~“ cos (a4-6)x x+1 R = \x2 4-6 — 62 sin3 (x 4- a)/x a=0,3 6 = 0,9 x = 0,61 13 z = \lax sin 2x4-e-2x (x4-6) is/ = cos2 x3—x/-^a2 4~62 II II II — wo L- cn 14 y_ a2x-\-e~x cos bx bx — e~x sin 6x4-1 f=e2x In (a-f-x)—bix In (b —x) * О II II II p JO p W ?D СЛ 15 sin x z =— —cm In mx -^/1 -\-m2 sin2x s=e-°xA/*+l 4-e "x m =0,7 c = 2,l x=l,7 c = 0,5 6 = 1,08 232
2. Модифицировать программу, а затем и выполнить ее на ЭВМ таким образом, чтобы вывод вычисленных значений переменных осуществлялся в соответствии со следующей разметкой строк: ***«««****•*««**«« • РЕЗУЛЬТАТЫ ВЫЧИСЛЕНИЙ • ****************** (пропуск 1-ой строки) (имя) ....... ******** (имя)=....... ******** Пример выполнения работы Задание 1. Вычислить на ЭВМ значения у и р, ис- пользуя расчетные формулы: р=1п (a+^ + sin2 — а при значениях a=0,59, z= —4,8, х = 2,1. Схема алгоритма решения представ- лена на рис. 5.1. В блоке 1 вводятся исходные данные а, х, г, в блоке 3 осу- ществляется вывод введенных значений исходных данных. В блоках 4 и 5 вычис- ляются значения функций у и р, а в блоке 6 осуществляется вывод вычислен- ных значений. Программы, реализующие приведен- ный алгоритм, на рис. 5.1 имеют вид: а) на языке БЕЙСИК 10 'ЛАБОРАТОРНАЯ РАБОТА П2 20 'СТУДЕНТ ГРУППЫ РЛ-21 ИВАНОВ И. И. 30 DATA О. 59. 2. 1. -4. В 40 READ А, X, Z 50 PRIHT *А="; А,-Х=-;Х, •Zz.'-.Z 60 Y=A«TAH (Х*Х) * 3 +SQR (Z«ZZ (А«А*Х»Х) ) ТО Р = ЫХЗ(А+Х«Х) *SIH(Z/A)*2 60 PRIHT “Рх-;Р 90 EHD Р У,Р Рис. 5.1 233
б) на языке ФОРТРАН С ЛАБОРАТОРНАЯ РАБОТА П2 С СТУДЕНТ ИВАНОВ и. и PRIHT», 'ВВЕДИТЕ X, A, Z' READ(5, 1) X, A. Z 1 FORMAT (3F5. 2) WRITE(6, 2>X. A, Z 2 FORMAT(IX. 'X=', F5. 2, ' A=',F5. 2, ' Z=',F5. 2) Y=A«TAK(X»X)**3+SQRT(Z*ZZ(A*A+X«X)) P=ALOG(A»X»X)+SIH(Z/A)»»2 WRITE(6, 3)Y, P 3 FORMAT(1X, ’Y=', Ell. 3, 2X, ’P:’, Ell. 3) STOP EHD в) на языке ПАСКАЛЬ PROGRAM PR IM2( IHPUT. OUTPUT): ( ЛАБОРАТОРНАЯ РАБОТА П2) ( СТУДЕНТ ГРУППЫ РЛ-21 ИВАНОВ И. И| VAR А, X. Z. Y, Р. С: REAL; BEGIH WRITELH ( ' ВВЕДИТЕ А. X, Z' ) ; READ (А. X. Z) ; С:=SIH(X»X)/COS(X»X); Y:=A»C»SQR(X)+SQRT(Z»Z/(A»A*X»X)); Р:-LH(А+Х»Х)*SQR(SIH(Z/A)); WRITELH('Y=', Y:B:3. • P=',P:B:3) EHD. В качестве тестового набора исходных данных использу- ем следующие значения переменных: а=1, z=l, х = 0,5. Тогда вычисляемые значения у и р будут равны: </=l-tg3(0.5)2 + 1____ 1 +(0,5)2 0,911; р=1п (1 +0,25) +sin2 (1) = 0,223. Вычисленные значения у и р следует сравнить со значе- ниями, вычисленными на ЭВМ. Контрольные вопросы 1. Какие типы величин используются в языке программи- рования? 2. Указать диапазон значений величин целого и действи- тельного типов. 3. Какие имена переменных допустимы в программе? Как задать тип переменной в программе? 4. Указать имена стандартных функций для вычисления ~>Jx, е', sin х, cos х. In х, |х|. 234
5. Можно ли в качестве операнда в арифметическом выражении использовать: а) имя массива; б) имя стандарт- ной функции, например SIN (Y); в) имя символьной перемен- ной или переменной логического типа? 6. Назвать последовательность действий при выполнении арифметического оператора присваивания. Допустимо ли ис- пользование величин разных типов в арифметическом вы- ражении? 7. Написать арифметический оператор присваивания для вычисления значения Р W=((((“5* + а«) * + °з) х + аг) х + си) х + ас- 8. Указать старшинство выполнения операций при вы- числении арифметического выражения. 9. Указать средства, имеющиеся в языке программиро- вания для управления размещением данных на строке. Как организовать вывод значений, сопровождая выводимое чис- ловое значение наименованием переменной? Как организо- вать пропуск одной, двух строк при выводе? 10. Как выбрать значения исходных данных для тестово- го варианта счета? ЛАБОРАТОРНАЯ РАБОТА № 3 ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ РАЗВЕТВЛЯЮЩЕЙСЯ И ЦИКЛИЧЕСКОЙ СТРУКТУРЫ Цель работы — овладение практическими навыками раз- работки, программирования вычислительного процесса раз- ветвляющейся и циклической структур, получение дальней- ших навыков по отладке и тестированию программы. Задания для самостоятельной подготовки Задание А 1. Изучить возможности языка программирования для реализации: — условной и безусловной передачи управления; — вычислительного процесса разветвляющейся струк- туры 2. Разработать алгоритм решения в соответствии с за- данием. 3. Составить программу решения задачи. 4. Подготовить тесты (число тестов равно числу ветвей вычислительного процесса) для проверки правильности фун- кционирования программы. 235
Продолжение табл. 5.3 Задание Б. 1. Изучить возможности языка программирования для реализации: — вычислительных процессов циклической структуры с известным числом повторений в цикле; — приема программирования — табулирования функ- ции от одного аргумента (вычисление значений функ- ции при изменении значения аргумента в заданном диапазоне с шагом Дх). 2. Разработать алгоритм табулирования функции, опре- деленной в задании А. 3. Составить программу табулирования функции. Задание к работе Задание А. 1. Вычислить значение функции, заданной в табл. 5.3 (в соответствии с вариантом задания). Осущест- вить вывод значений вводимых исходных данных и результат вычисления значения функции, сопровождая вывод наимено- ваниями переменных. Таблица 5.3 Вариант задания Функция Условие Исходные данные Диапазон и шаг изменения аргумента 1 У = ( at2 In t < 1 I e“' cos bt l</</2 t> 2 a =—0,5 6=2 /е[0; 3] Д/ = 0,15 2 У=' лх2 — 7/х2 ах3 4- 7 х[х Ig(x4-7VT) CO. co CO. V T A ч ч X a = l,5 хе[0,8; 2] Дх = 0,1 3 w= < ’ ах2 + Ьх-\-с a/x+^Jx2-\-1 1 (a+ bx)/-ylх2+1 * * * У £ л K> M K5 a=2,8 b = —0,3 c = 4 хе[1;2| Лх = 0,05 4 Q=' лх2—7/х2 ах3-|-7 [ 1п (х4-7д/|х4-а| ) x<l,4 x=l,4 x> 1,4 a=l,65 хе[0,7; 2| Дх=0,1 5 у= ‘ 1,5 cos2 x 1,8ax (x —2)24-6 3tgx * Л И h V * II A to A — to a = 2,3 хе[0,2;2,8| Дх = 0,2 Вариант । задания | Функция Условие Исходные данные Диапазон н шаг изменения аргумента 6 w = ( xfyc—a < х sin ах ( е_<“ cos ах X it ,K A II v а о о a = 2,5 xe[l; 5] Дх=0,5 7 Q= ( bx — lgbx 4 1 ( 6x4-1g bx bx< 1 6x= 1 6x> 1 6 = 1,5 хе[0,1; 1] Дх=0,1 8 У= J sin x 1g x [ cos2 X CO CO AV/ * * — хе[2; 5] Дх = 0,25 9 f= ( lg(x4-l) ( sin2 -\l\ax\ /Л v a=20,3 хе[0,5; 2] Дх=0,1 10 г 2= \ In3 x+x2)/x[x+t x+t +1/X cos x + t sin2 x St * V || A p p p сл СП сл / = 2,2 хе[0,2; 2] Дх = 0,2 и 5= < - a-t-b e'4-COSJ( | (a+b)/(x+ 1) < е'4-sin x x<2,8 2,8 ^x< 6 x^6 a=2,6 6 = —0,39 хе[0; 7| Дх = 0,5 12 У = [ algx4-Vl*l [ 2a cos x4-3x2 k * /AV a=0,9 хе[0,8; 2] Дх=0,1 13 ш = ( 4-+6/24-c 1 I ) i (. ai 4- bi3 i<4 4sji^6 i> 6 a=2,l 6 = 1,8 с =—20,5 ie|0; 12[ Д< = 1 14 z = as,n( n ) cos(/+t) sin > 0 n sin^+l<0 n a=0,3 n = 10 «е[1; Ю] д;=1 15 -\]at2+b sin <4-1 at 4-6 а о о П л a=2,5 6=0,4 /е[-1;1] Д/ = 0,2 -\]at2 + b cos /4-1 237 236
2. Выполнить программу на ЭВМ и протестировать все ветви алгоритма. Задание Б. 1. Модифицировать программу таким образом, чтобы вычислялось многократно значение функции при изменении аргумента в указанном диапазоне и с заданным шагом (табл. 5.2). Организовать вывод значения аргумента и вы- численного значения функции в виде таблицы. ТАБЛИЦА ФУНКЦИИ Y (X) X Y 2 Выполнить на ЭВМ модифицированную программу. Пример выполнения работы Задание А. Вычислить на ЭВМ значение функции а/ + б, cos at, е~а‘ cos at. если at < 1; если at— 1; если at> 1, для a =1,3, 6 = 1,29, / = 0,38. Схема алгоритма решения представлена на рис. 5.2, а. Блоки 3, 5, 7 осуществляют проверку условия — at меньше, равно или больше единицы — ив зависимости от результата сравнения направляют вычисления по одной из ветвей — 4, 6 или 8. Блок 9 выводит на печать полученное значение функ- ции s совместно с введенными исходными данными. Представленная схема алгоритма не является единствен- ной. Число проверок можно сократить до двух (рис. 5.2, б). Программы, реализующие схему алгоритма, представ- ленную на рис. 5.2, б, имеют вид: а) на языке БЕЙСИК 1O 'ЛАБОРАТОРНАЯ РАБОТА ПЗА го 'студент группы рл-ai Иванов и. и. 30 PRIHT -ВВЕДИТЕ ЗНАЧЕНИЯ А, В, Т" 40 IHPUT А, В, Т 50 SzA*T+B CO IF А*Т=1 THEN S=COS(A»T) 70 IF А*Т>1 THEH SzEXP(-A»T)«COS(A«T) 80 PRIHT "A=";A , "Bz";B, "T=";T 90 PRIHT "РЕЗУЛЬТАТ S=";S : EHD 238

б) на языке ФОРТРАН С ЛАБОРАТОРНАЯ РАБОТА ПЗА С СТУДЕНТ ИВАНОВ и. и PRINT*, 'ВВЕДИТЕ А, В, Т' READ (5, 1) А. В, Т 1 FORMAT (3F5. 2) S=A*T+B IF (А*Т. EQ. 1) S=COS (A*T) IF (A*T. GT. 1 > S=EXP (A«T) *COS (A*T> WRiTEte, ajA, в,t, s 2 FORHAT(1X, 'A='.F5.2,2X, 'B=',F5 2, 2X, 'T= '. F5. 2/ • 10X, 'S=’,FB. 3) STOP END в) на языке ПАСКАЛЬ PROGRAM PR IM3A( IHPUT, OUTPUT); t ЛАБОРАТОРНАЯ РАБОТА ПЗА) (СТУДЕНТ ГРУППЫ РЛ-21 ИВАНОВ и. ) VAR А, В, Т. S: REAL; BEGIH WRITELN ('ВВЕДИТЕ А, В, Т* ) ; READ (А, В, Т); S:=А*Т+В; IF А*Т=1 THEN S:=COS(A»T): IF А*Т>1 ТНЕН S:=ЕХР(—А*Т)*COS(А*Т); WRITELN('А=',А:В:3,' В=',В:В:3, ' Т='.Т:8:3); WRITELN ( 'РЕЗУЛЬТАТА , S: В: 3) END. В качестве тестовых наборов исходных данных примем следующие тесты: 1) д=1, b=l, 1=0,5, s= 1-0,5+ 1 = 1,5; 2) а=1, 6=1, 1=1, s = cos(l) = 0,5403; 3) а=2, 6 = 1, 1=1, s = e~s cos (2)= —0,0563. Задание Б. Вычислить на ЭВМ значение функции, указанной в задании А при изменении аргумента t в диапазоне <е[0,1; 2,1] с шагом 0,1. Вывод значений t и s выполнить в виде таблицы. Схема алгоритма решения приведена на рис. 5.3, а. Бло- ки 5, 6 выполняют собственно расчет значений функции с выдачей их на печать. Это рабочая часть цикла. Блоки 4, 7, 8 являются вспомогательными и служат для организации циклического повторения рабочей части цикла. Блок 4 задает начальное значение параметра цикла t, т. е. осуществляет подготовку цикла. Блок 7 вычисляет текущее значение пара- метра цикла, увеличивая значение аргумента (параметра цикла) на величину заданного шага. Блок 8 проверяет усло- 240
Рис. 5.3 вие окончания цикла. Для печати заголовка таблицы служит блок 3. Для цикла с известным числом повторений программа получается более компактной и наглядной, если для его организации использовать оператор цикла, который выпол- няет функции блоков 4, 7, 8. Схема алгоритма решения с использованием блока моди- фикации (цикла) представлена на рис. 5.3, б. Программы, реализованные в соответствии со схемой алгоритма (рис. 5.3, а, б) имеют вид: 241
а) на языке БЕЙСИК Ю • ЛАБОРАТОРНАЯ РАБОТА ПЗБ го -студент группы рл-ei Иванов и. и. 30 PRIHT -ВВЕДИТЕ значения А, В, ТО, ТК, TD" 40 IHPUT А, В, ТО, ТК, ВТ 50 PRIHT -ТАБЛИЦА ФУНКЦИИ S(T)- во PRIHT ’ Т S(T)“ ТО 'ОРГАНИЗАЦИЯ ЦИКЛА во FOR T=lTO ТО ТК STEP ВТ 90 S=A*T+B 1ОО IF A*T=1 THEH S=COS(A»T) 110 IF A»T>1 THEH SxEXP (~A»T) *COS (A*T) 120 PRIHT T, , S ; HEXT T : кип б) на языке ФОРТРАН С ЛАБОРАТОРНАЯ РАБОТА ПЗБ С СТУДЕНТ ИВАНОВ И. И PRIHT», ' ВВЕДИТЕ А, В, ТО, ТК, ВТ' READ(5, 1) А, В, ТО, ТК, DT 1 FORHAT (3F5. 2 ) WRITE(6, 2) 2 FORHAT(5Х, 'ТАБЛИЦА ФУНКЦИИ S(T)'/ * 7Х, 'Г, 9Х, 'S' ) С ЗАДАНИЕ НАЧАЛЬНОГО ЗНАЧЕНИЯ АРГУНЕНТА Т=Т0 3 S=A*T+B IF (А»Т. EQ. 1) S-COS(A»T) IF (A»T. GT. 1> S=EXP (A»T) *COS (A«T) WRITE(6, 20JT, S 20 FORHAT(5X, F5. 2, 4X, F8. 3) С ВЫЧИСЛЕНИЕ ТЕКУЩЕГО ЗНАЧЕНИЯ АРГУНЕНТА T=T+DT С УСЛОВИЕ ПОВТОРЕНИЯ ЦИКЛА IF (Т. LE. ТК) GOTO 3 STOP EHD в) на языке ПАСКАЛЬ PROGRAH PRIH3BC IHPUT, OUTPUT); (ЛАБОРАТОРНАЯ РАБОТА ПЗБ) (СТУДЕНТ ГРУППЫ РЛ-21 ИВАНОВ И. И) VAR А, В, Т, S: REAL; ТО, ТК, ВТ: REAL; BEGIH WRITELH ( ' ВВЕДИТЕ А, В, ТО, ТК. DT' ) ; READ (А, В, ТО, ТК, DT) ; WRITELH('ТАБЛИЦА ФУНКЦИИ S(T)'); WRITELH(' Т S(T) '); Т: =Т0; REPEAT S:=А*Т*В; IF А»Т=1 THEH S:=COS(A*T); IF А*Т>1 THEH S:-EXP (-А»Т) *COS (А»Т) ; WRITELH (Т: 10: 3, ' ',S:10:3); T:=T»DT UNTIL T>TK EHD. 242
Контрольные вопросы 1. Перечислить действия, реализуемые при выполнении условного оператора. 2. Какие действия выполняются оператором перехода? 3. Что такое вычислительный процесс разветвляющейся структуры? Как организовать разветвление вычислений: а) на две ветви; б) на три ветви? 4. Составить последовательность операторов для вычис- ления величины 2=0, если х<—2; 2=1, если —2^х^2; 2= — 1, если х>2. 5. Зачем необходимо при отладке программы тестиро- вать все ветви алгоритма? 6. Указать последовательность действий, выполняемых при организации циклических участков программы с задан- ным числом повторений. 7. Указать назначение и правила организации цикла. 8. Перечислить возможные способы организации цикла с заданным числом повторений в изучаемом языке програм- мирования. ЛАБОРАТОРНАЯ РАБОТА № 4 ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ ИТЕРАЦИОННОЙ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ Цель работы — овладение практическими навыками раз- работки и программирования алгоритмов итерационной цик- лической структуры; приобретение дальнейших навыков по отладке и тестированию программ. Задания для самостоятельной подготовки 1. Изучить: — организацию итерационных циклов; — возможности языка программирования для органи- зации таких циклов; — приемы программирования — уточнение корня урав- нения методом итераций, вычисление суммы членов бесконечного ряда, накопления суммы. 2. Разработать алгоритмы решения задач для заданий А и Б. 3. Составить программы решения задач для заданий А и Б. 4. Вычислить предел суммы членов ряда, указанного в задании Б. 243
Задание к работе Задание А Методом итераций вычислить на ЭВМ ко- рень уравнения вида f(x)=0 (табл. 5.4), расположенный на интервале [а, р], с абсолютной погрешностью е (в соответст- вии с вариантом задания). Определить также число итера- ций, необходимое для нахождения корня. Таблица 5.4 Вариант задания Уравнение Отрезок Точность 1 е'—е-х—2=0 [0; 1] 10~3 2 3 sin -\/х”-|-0,35х— 3,8 = 0 [2; 3] 10"3 3 х —2-)-sin (1/х)=0 [1.2; 2] 10-" 4 1 —x-f-sin х—In (1 -|-х)=0 [0; 1,5] 10-5 5 х2 —In (1 Ч-х)—3 = 0 [2; 3] 10~4 6 З-J-sin 3,6х [0; 0,85] 0,5-10—4 7 In х—х+ 1,8 = 0 [2; 3] 0,5-10-4 8 0,1х2—х In х = 0 [1;2] 0,5-10-3 9 x+cos (х°-524-2)=0 [0,5; 1] 10"3 10 д/1 —0,4х —arcsin х=0 [0; 1] ю-3 11 х24-10х—10 = 0 [0; 1] IO"5 12 Зх —4 In х —5 = 0 [2; 4] 0,5-10“3 13 0,4 -f- arctg -у/х~—х = 0 [1;2] 10-3 14 arccos х—д/1 —0,Зх3 =0 [0; 1| 0,5-10“3 15 2х — 3 In х — 3 = 0 [0,5; 0,6] 10-3 Задание Б. Вычислить на ЭВМ значение суммы чле- нов бесконечного ряда (табл. 5.5) с заданной точностью е. На печать вывести значение суммы и число членов ряда, вошедших в сумму. 244
Сравнить полученное на ЭВМ значение суммы членов ряда со значением, вычисленным вручную. Таблица 5.5 Вариант задания Сумма членов ряда Зна- чение Точность вычисле- ния 1 ® 2 1 24 *' (2л)! 0,20 Ю-5 2 3 2п-1 з++< 0,10 0,5-10-* 3 JC3 V5 1*"+1 s-t ;7+-+< •)',+|^+г+- - 0,15 10~3 4 л COS п -т- s_1+cos^^+...H — V+... 0,12 10-* 5 № х* х2л chx^_l+2! + 4! +...+ (2п)! +... 0,70 10~* 6 n~s = 4( 1 -±+-1—±+±-... + -+< '>"гЛ|+') — 10-* 7 arctgx^s^-^Ч-^-... '+( (2л-|~ 1)хг"+1 1,5 0,5-10-’ 8 + Т 8 — сл '» о| а -•'Т'' IR “ о> а и 1 + : £ о>| а '>Чви,*М + й ст>| а .1 0,5-10-* 9 х3 х5 х2л+1 chx_x+ 3! | 5| 1 ... I (2Л 4-1)! । 1,7 io-3 245
Продолжение табл. 5.5 Вариант задания Сумма членов ряда Зна- чение Точность вычисле- ния 10 sin 3 —s 3 3! 1 5! 1 • (т)”+1 -+( ') (2/+1), I - 0,5-10-" 11 , X2 _ 3*4 , , ( .у. 2п~1 х2п , S '+2! 4! •-•( ') (2л)! Х + • 0,75 0,5-10 12 2 з s=-^- sin 2х—— sin Зх-|-... о о + ( — 1)”-2" sin пх п— 1 0,62 10~4 13 , , cos х cos 2х , s Ч—ir+—— cos пх ' 1 п! +" 0,20 io-4 14 уЗ у5 у 2 л 4" 1 S=-T—й+' +(- 1>п+' ^—г+- • 3 15 4п — 1 0,30 10-5 15 Л о «ГТ х cos — х cos 2— S , 1 - 2 4-- и Л X cos п — ...4- п 4-... 0,25 10“4 Пример выполнения работы Задание А. Методом итераций найти корень уравне- ния arcsin (2х4-1) — х2=0, расположенный на отрезке |—0,5; 0], с абсолютной погрешностью e=10"4. Напечатать число итераций, необходимых для вычисления корня. Заданное уравнение преобразуем к виду х = <р(х) следующим образом: arcsin (2x4-1)=*2; sin (arcsin (2x4- l)) = sin х2-. 246
2х + 1 = sin х2; х = 0,5 (sin х2—1). Проверка условия сходимости метода итераций: <р' (х) = xcosx2. Очевидно, что |<р'(х)| = Ixcos х2| ^0,5 для всех — 0,5 ^х^О. Следовательно, рассматриваемый процесс ите- раций сходится. Алгоритм решения уравнения по методу итераций пред- -ставлен на рис. 5.4. Блоки 3, 4 задают начальное приближе- ние корня и начальное значение счетчика числа итераций, равное нулю. Блоки 4—8 вычисляют следующее приближение корня, увеличивают счетчик числа итераций на единицу, вычисляют модуль разности между вычисленным приближе- нием корнд и предыдущим, присваивают хо значение последу- ющего приближения (подготовка к выполнению следующей итерации). Блок 9 осуществляет проверку достижения требу- емой точности вычисления. Блок 10 выводит иа печать най- денное значение корня и соответствующее число выполненных итераций. Программы, реализующие схему алгоритма (рис. 5.4), имеют вид: а) на языке БЕЙСИК 1О 'ЛАБОРАТОРНАЯ РАБОТА П4А 15 'СТУДЕНТ ГРУППЫ РЛ-21 ИВАНОВ И. И. 20 PRIHT -ВВЕДИТЕ ЗНАЧЕНИЯ А, В, EPS • 30 IHPUT А, В, EPS 40 ХО=(А+В)/2 : И=0 50 Xl = . 5«SIH(XO»XO-1) : H=H+1 : DELTA=ABS(Xl-XO) 50 XOzXl 70 IF DELTA>KPS THEH 50 BO PRIHT -КОРЕНЬ s*;Xl 90 PRIHT -ЧИСЛО ИТЕРАЦИИ Hz-;H : EHD б) на языке ФОРТРАН С ЛАБОРАТОРНАЯ РАБОТА П4А С СТУДЕНТ ИВАНОВ И. И. PRIHT», 'ВВЕДИТЕ А, В. EPS’ READ15, 1)А, В, EPS 1 FORMAT(2F4. 1, F5. 4) Х0= (А+В) /2 Н=0 2 Х1 = 0. 5«SIH(XO»XO-1) Н=Н»1 DELTA=ABS(X1-ХО) Х0=Х1 IF (DELTA. GT. EPS) GOTO 2 WRITE(6, 20)Xl, H 20 FORMAT(1X. 'KOPEHb='. F7. 5/IX, 'ЧИСЛО ИТЕРАЦИИ=', 15) STOP EHD 247
Рис. 5.4
в) иа языке ПАСКАЛЬ PROGRAM PRIM4A (INPUT, OUTPUT) ; < ЛАБОРАТОРНАЯ РАБОТА П4А] I СТУДЕНТ ГРУППЫ РЛ-21 ИВАНОВ И. И) VAR А, В. XI, ХО, DELTA, EPS: REAL: И : INTEGER; BEGIH WRITELH ('ВВЕДИТЕ A, В, EPS' ) ; READ (A, B, EPS); XO:=(A*B)/2; H: =0; REPEAT X1:=O. 5«SIH(XO*XO-1); H:=+!; DELTA: zABS(Xl-XO); XO:=X1 UNTIL DELTA<EPS ; WRITELH('КОРЕНЬ-'.Xl:9:4); WRITELH ('ЧИСЛО ИТЕРАЦИИ = ' , И: 5) ; EHD. Задание Б. Вычислить значение суммы членов бес- конечного ряда S=X Г® V? Х^П * ———+ .-+(— 1)"—------------------ 3! 5! 7! т V ' (2п—1)! с точностью до члена ряда, меньшего е=10~4 для х = 0,1. Определить число членов ряда, вошедших в сумму. Для вычисления общего члена ряда ( (2га—1)! используем рекуррентное соотношение, выразив n-й член че- рез (п— 1)-й: °" (2п-2)(2/1—1)’ *’ П 2’3,4’’ - Значение первого члена ряда вычислим до цикла с по- мощью оператора присваивания а = х, а всех последу- ющих членов ряда по рекуррентному соотношению а= —а---------------— в цикле. (2/г —2) (2п—1) Схема алгоритма решения представлена на рис. 5.5. В блоке 3 подготовки цикла задано значение первого члена ряда, начальное значение суммы, равное этому члену, и номер члена ряда, равный 1 (просуммирован один член). Блоки 4, 5 выполняют расчет текущего номера члена ряда и значения этого члена с использованием рекуррентных соотношений. Блок 6 реализует функцию накопления суммы. Блок 7 выпол- няет проверку условия окончания цикла. 249
Программы, реализованные в соответствии со схемой алгоритма (рис. 5.5), имеют вид: а) на языке БЕЙСИК 1О 'ЛАБОРАТОРНАЯ РАБОТА 4Б 15 'СТУДЕНТ ГРУППЫ РЛ-Е ИВАНОВ И.И ЕО PRINT "ВВЕДИТЕ ЗНАЧЕНИЯ X.EPS" 30 INPUT X.EPS 40 A=X:S-O:N=1 50 IF ABSCXXEPS GOTO 60 55 A=-A*X»X/«E»N-E>«<E»N-1»:N=N*1:S=S+A:GOTD 50 60 PRINT ' СУММА РЯЛА';3 70 PRINT "ЧИСЛО 4BEHOB'*;N:END б) на языке ФОРТРАН С ЛАБОРАТОРНАЯ РАБОТА П4Б С СТУДЕНТ ИВАНОВ И. И. PRIHT»,’ВВЕДИТЕ X, EPS* READ(5, 1)Х, EPS 1 FORMAT (F4. 1, FB. 4) A=X S=X H=1 г IF (ABS(A). LT. EPS)GOTO 3 Н=И+1 Ax-a»x«x/((г»н-г)»(г»и-1)) s=s+a goto г 3 WRITE (0, 20) S, и 20 FORHAT(1X, ,CVMU=*,FT. 5/IX, "ЧИСЛО ЧЛЕНОВ: ’ , 14) STOP EHD в) на языке ПАСКАЛЬ PROGRAM PRIH4B(IHPUT, OUTPUT) ; f ЛАБОРАТОРНАЯ РАБОТА П4Б1 (СТУДЕНТ ГРУППЫ РЛ-21 ИВАНОВ И. И] VAR X, EPS, A. S:REAL: Н: IHTEGER; BEGIH WRITELH ("ВВЕДИТЕ X.EPS"); READ(X, EPS) ; А:=Х ; S:=O; И:=1; WHILE ABS(A)>:EPS DO BEGIH S:=S*A; И: =H*1; A:=-A»X*X/((2*H-2)»(2»H-1)) EHD; WRITELH ("СУННА РЯДА: ". S: В: 4); WRITELH ("ЧИСЛО ЧЛЕНОВ РЯДА-', Н:4-) EHD. Сопоставить на ЭВМ значение суммы членов ряда с при- ближенным значением, определяемым пределом суммы ряда: СО lim У ап (х) = sin х. л-коо 250
Контрольные вопросы 1. Что такое итерационный циклический процесс? Его отличия от цикла с заданным числом повторений. 2. Какие два этапа необходимо выделить при нахожде- нии корней уравнений? 3. В чем заключается сущность метода итераций при уточнении корня? Как определить число итераций, необходи- мых для получения значения корня с требуемой точностью? 4. Каковы условия сходимости метода итераций? 5. Почему при программировании итерационных процес- сов не используются индексированные переменные для обозна- чения последовательных приближений к корню? Сколько со- седних приближений одновременно используется в вычис- лениях? 6. Каково условие выхода из цикла при вычислении значения суммы бесконечного ряда? 7. Какие операторы организуют цикл в программе вы- числения суммы членов бесконечного ряда? 8. Почему при вычислении значения текущего члена ап используется простая переменная, а не индексированная? 9. Зачем используются рекуррентные соотношения для вычисления значений члена ряда? ЛАБОРАТОРНАЯ РАБОТА № 5 ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ С ЗАДАННЫМ ЧИСЛОМ ПОВТОРЕНИЙ Цель работы — овладение практическими навыками раз- работки и программирования алгоритмов циклической струк- туры с заданным числом повторений, приобретение дальней- ших навыков по отладке программ. Задания для самостоятельной подготовки 1. Изучить: — организацию алгоритмов циклической структуры с заданным числом повторений; — возможности языка программирования для построе- ния таких циклов; — приемы программирования — вычисление опреде- ленных интегралов по методу прямоугольников и тра- пеций. 2. Разработать алгоритм решения в соответствии с за- данием. 251
3. Составить программу решения задачи. 4. Для контроля вычислений определить математическое выражение точного значения интеграла и включить вычисле- ние его в программу. Задание к работе ь Вычислить на ЭВМ значение интеграла z=Jf(x)dx, а приведенного в табл. 5.6, иа заданном отрезке интегрирова- ния [a, ft] (в соответствии с вариантом задания). Считать заданным число разбиений отрезка интегрирования п и чис- ленный метод решения. Включить в программу вычисление точного значения интеграла. На печать вывести приближен- ное, точное значения интеграла и относительную погрешность вычисления в процентах. Примечание. Требуемая точность, указанная в табл. 5.6, в данной работе не используется. Таблица 5.6 Вариант задания Подынтегральная функция f (х) Метод численного решения Число отрез- ков п Интер- вал интегри- рования [а, 6] Требуемая точность е 1 1п2 х/х Трапеций 60 11; 4] 10'4 2 1 . 1 -5-sin хг X Прямо- угольни- ков 50 [1; 2.5] 0,5-10“3 3 х'(1+1пх) Трапеций 40 [1; 3] 10~4 4 COS X 60 , о , 10"4 5 sin2 х 60 1 ч К |сч , о , 0,5-10~3 6 х еЛ sin х 100 [0; 1] IO'4 7 (In x/xf Прямо- угольни- ков 50 [1; 2.5] 10'4 8 x arctg x Трапеций 50 [0; 3] 0,5-10~3 252
Таблица 5.6 Вариант задания Подынтегральная функция f (х) Метод численного решения Число отрез- ков п Интер- вал интегри- рования («. *1 Требуемая точность е 9 М-^Э + х2 Прямо- угольни- ков 100 [0; 2] 10-5 10 е’ cos2 х Трапеций 60 [0; л] 10“" 11 х’/о+х) Прямо- угольни- ков 80 [1;2] 0,5-10-" 12 (In х/х)3 Трапеций 50 [1;2] ю-" 13 1 си 1 ъ Прямо- угольни- ков 50 [0; 2] ю-" 14 х2 sin 2х Трапеций 100 [1.2] io-4 15 X х4+Зх2 + 2 50 |1;2] 0,5-IO*3 В табл. 5.7 приведены выражения для вычисления перво- образных функций F (x)—\f (х) dx. Таблица 5.7 Вариант задания Первообразные функции f(x)=Sf (x)rfx Вариант задания Первообразные функции F (x)=\f(x)dx 1 In3 х/3 4 sin х 2 cos (1 /х) 5 х sin 2х 2 4 3 Xх 6 4 х sin х+(1 —х) cos х J 253
Таблица 5.7 Вариант задания Первообразные функции F(x)=\f(x)dx Вариант задания Первообразные функции f (x)=Jf (x)dx 7 -у (ln2x4-21nx-f-2^ 12 (4 In3 X-|-6 In2 X-|- oX \ 4-6 In x-f-3^ x ch x— sh x о arctg(x2 + l)~ х 8 -------2------- 9 ln|x+V*2+9 I 10 e* (т+7о cos2x+ + -i-sin 2x^ 2x2 — I x . ---—- cos 2x+—sin 2* x3 3 Il -5---^-x24-9x-271n(x-|-3) Пример выполнения работы Вычислить на ЭВМ методом трапеций значение интеграла Ь 2 SSin Х J „ , ----------— ах для а=0; Ь = п; 1 4-2Л cos х4~« й=0,5, разбивая отрезок интегрирования на 60 частей. Для контроля вычислить точное значение интеграла и оценить на ЭВМ относительную погрешность метода. Вычислить точное значение интеграла. Для |Л| ^0,9 f sin2 х л \----------------s- dx==-—. g I 4-2Л cos x4-^2 Схема алгоритма решения задачи представлена на рис. 5.6. Блок 3 задает начальное значение суммы г, равное (/а4~ + Л)/2; накопление суммы организовано циклически. Перед циклом значению х присваивается значение левого конца интервала интегрирования а. При каждом прохождении цик- ла в блоке 7 значение х увеличивается на шаг Дх, в блоке 254
Рис. 5.6 8 вычисляется текущее значение ординаты функции f (х) и прибавляется к сумме г. После выполнения цикла (п — 1) раз осуществляется переход к блоку 9, где вычисляется окон- чательное значение интеграла. Блоки 10, 11 вычисляют точное значение интеграла и относительную погрешность Дг в процентах. Программа, реализующая схему алгоритма (рис. 5.6), имеет вид: а) на языке БЕЙСИК Ю -ЛАБОРАТОРНАЯ РАБОТА п5 15 'СТУДЕНТ ГРУППЫ РЛ-21 ИВАНОВ И. И. 20 PRIHT "ВВЕДИТЕ ДИАПАЗОН ИНТЕГРИРОВАНИЯ А, В 30 IHPUTA, В, Н : 5 255
40 Z1=SIH(A)*2/(1+2*K*COS(A)+K*K) 50 Z2=SIH(B) *2/(l+2»K»COS(B) *-K»K) 60 Z=(Zl+Z2)/2 70 DX=(B-A)/H : X=A 90 FOR 1 = 1 TO И-1 1OO X-X+DX : Z=Z+SIH(X)"2/(1+2*K*COS(X)*E»K) 110 HEXT I 130 Z=Z»DX : ZT=3. 141592/2 150 DZ=ABS(ZT-Z)/ZT*1OO 160 PRIHT "ПРИБЛИЖЕННОЕ ЗНАЧЕНИЕ Z=";Z 170 PRIHT "ТОЧНОЕ ЗНАЧЕНИЕ ZT=";ZT 160 PRIHT "ОТНОСИТЕЛЬНАЯ ПОГРЕШНОСТЬ"; DZ; "X 190 EHD б) на языке ФОРТРАН С ЛАБОРАТОРНАЯ РАБОТА п5 С СТУДЕНТ ИВАНОВ и. и. REAL К PRIHT*, • введите А, В, Н’ READ(5, 1)А, В, И 1 FORMAT(2F5. 2, 13) Х=0. 5 Z=(SIH(А) **2/ (1 +2*К*СОБ (А) +К*К) ♦ * SIH(B)««2/(1*2*X*COS(B)+K*K))/2 DX= (В-A) /Н Х-Х+А do г 1=1.и-i X=X+DX z= z+s ih (x) * «а/ (i+2*x«cos < x) +к»ю 2 COHTIHUE Z=Z*DX ZT=3. 141592/2 DZ= ABS (ZT-Z) /ZT*100 WRITE(6, 3)Z. ZT, DZ 3 FORMATUX. 'Z=',F6. 4/IX, ’ZT=’,F8. 4/ * IX. 'DZ-*.F5, 3. 'X') STOP EHD - в) на языке ПАСКАЛЬ PROGRAM PR IM5 (IHPUT, OUTPUT); (ЛАБОРАТОРНАЯ РАБОТА П51 I СТУДЕНТ ГРУППЫ РЛ-21 ИВАНОВ Н. И] VAR А, В. X, X, Z, ZT. DZ. DX :REAL; Н, I: IHTEGER; BEGIH WRITELH ( ВВЕДИТЕ А, В, Н' ) ; READ (А, В, Н) ; К:-О. 5; Z:=(SQR(SIH(А))/(1+2*K*COS(А)+К»К)♦ SQR(SIH(B) )/(l+2«K«COS(B)+X»K) )/2; DX:=(B-A)/H; Х:=А; FOR I:=1 ТО н-l DO BEGIH X:=X+DX; Z: = Z+SGR (SIH(X) ) / (1 *2«K»COS(X) *X«K) EHD; Z:=Z*DX; ZT:=PI/2; 256
DZ:=ABS(ZT-Z)»1OO; WRITELH ('ПРИБЛИЖЕННОЕ ЗНАЧЕНИЕ Z=' , Z:9:5); WRITELH(’ТОЧНОЕ ЗНАЧЕНИЕ ZT-* , ZT: 9: 5) ; WRITELH('ОТНОСИТЕЛЬНАЯ ПОГРЕИНОСТЬ ',DZ:9:4) EHD. Контрольные вопросы 1. Указать отличия в организации циклов с заданным числом повторений и итерационных. 2. Какие средства языка целесообразно использовать для организации циклов с заданным числом повторений? 3. Почему при программировании формулы трапеций и прямоугольников индексированные переменные х, и f (xi) можно заменить простыми переменными? 4. Почему начальное значение суммы по формуле трапе- ций принимается не равным нулю, а по формуле прямоуголь- ников — равное нулю? 5. Указать, какие операторы составляют тело цикла. 6. В чем состоят преимущества использования операто- ров цикла в программах? ЛАБОРАТОРНАЯ РАБОТА № 6 ОБРАБОТКА ОДНОМЕРНЫХ МАССИВОВ Цель работы — овладение практическими навыками ра- боты с массивами, особенностями их ввода и вывода, приобре- тение дальнейших навыков по организации программ цикли- ческой структуры с использованием приемов программирования. Задание для самостоятельной подготовки 1. Изучить: — способы описания размеров массивов на языке про- граммирования; — способы ввода и вывода массивов; — реализацию на конкретном языке программирова- ния приемов накопления суммы или произведения, запоминания результатов, нахождения наибольшего и наименьшего. 2. Разработать алгоритм решения в соответствии с за- данием. 3. Составить программу решения задачи. 4. Подготовить тест для проверки программы. Задание к работе 1. Обработать на ЭВМ массив в соответствии с вари- антом задания, указанного в табл. 5.8. 9 В. Е. Алексеев и др. 257
Таблица 5.8 Вариант задания Массив Действия Условия и ограничения 1 X (100) Вычислить сумму и количе- ство элементов массива X 0<х,<1 2 А (80) Вычислить среднее арифме- тическое значение элемента массива А а,> 0 3 X (70) Переписать элементы масси- ва X в массив Y и подсчитать их количество — 1<х,<1 4 В (50) Определить максимальный элемент массива В и его поряд- ковый иомер х,> 0 5 С (40) Вычислить минимальный элемент массива С и его иомер XiCO 6 D (80) Найти максимальный и ми- нимальный элементы масси- ва D и поменять их местами — 7 V (20) Вычислить среднее геомет- рическое элемента массива Y уо о 8 Z (30) Расположить в массиве R сначала положительные, а за- тем отрицательные элементы массива Z — 9 N (50) Определить сумму элемен- тов массива N, кратных трем п,/3*3 = п, 10 X(N) Вычислить сумму и количе- ство элементов массива X х,>0, N<30 11 A(N) Найти среднее геометриче- ское элементов массива А а,> 0, N < 50 12 X(N) Переписать в массив Y под- ряд положительные элементы массива X x,>0,N<40 13 X(N) Переписать подряд в мас- сив Y положительные и в мас- сив Z отрицательные элементы массива X N<40 14 В (К) Определить максимальный элемент массива В и его поряд- ковый иомер х,<0, К <40 15 С (К) Определить минимальный элемент массива С и его поряд- ковый иомер — 1<х,<1,К<20 258
2. Проверить правильность выполнения программы с по- мощью тестового варианта. Пример выполнения работы Задание 1. Вычислить на ЭВМ наибольший элемент массива х(, х2, .... х„ и его порядковый номер; п^ЗО. Про- верить правильность программы на тесте при п = 3 и следую- щих элементах массива (1.5, 4.3, 2.4). При выполнении за- дания необходимо использовать прием нахождения наиболь- шего. Для этого перед циклом следует задать начальное значение наибольшего, равное первому элементу массива, а в цикле сравнивать наибольший с текущим элементом массива; в том случае, если текущий элемент больше наи- большего из предыдущих, то считать его наибольшим. Для нахождения по- рядкового номера наибольшего эле- мента массива необходимо перед циклом задать его начальное значе- ние, равное 1, а в цикле всякий раз, когда текущий элемент массива больше наибольшего, считать номером наибольшего номер текущего элемен- та массива. Схема алгоритма решения представлена иа рис. 5.7. Блок 2 осу- ществляет ввод значения п и мас- сива X, состоящего из п элементов. Блок 3 задает начальные значения хтах и «шах- Блок 4 организует цикл, перебирающий элементы мас- сива, начиная со второго и кончая п-м. Блоки 4 и 5 находят наибольший элемент массива и его порядковый номер. Блок 7 за циклом выводит результаты на печать. Программа имеет вид: а) на языке БЕЙСИК 10 REM РАБОТА 6 го dim х(30) 30 PRIHT “ВВЕДИТЕ ЗНАЧЕНИЕ И' «О IHPUT н 50 FOR 1=1 ТО И 60 PRIHT "ВВЕДИТЕ ЭЛЕМЕНТ МАССИВА* 70 IHPUT.Х(1) 60 НЕХТ I 90 Х1=Х(1):И1=1 1ОО FOR 1=2 ТО 110 IF (X(I)<=X1) ТНЕИ 130 9* 259
120 X1-X(I):H1=I 130 NEXT I 140 PRIHT •HMAX-’;Ni;-XMAX=";X1 150 EHD б) на языке ФОРТРАН C LR 6 DIMENSION X(3O) READ (5,1) N, (X(I), 1=1, N) 1 FORMAT(12/(2OF4. 12)) XHAX=X(1) HHAX= 1 DO 2 1 = 1. H IF (X(I)-XMAX) 2,2,3 3 XHAX=X(I) HMAXz I 2 CONTINUE WRITE(6, 4) NHAX, XMAX 4 FORMAT (4X. ’HMAX=', 12. 4X, 'XMAX='.F4. 1) STOP END в) на языке ПАСКАЛЬ PROGRAM MAX(INPUT, OUTPUT); CONST HH=30; VAR N, 1, IMAX: INTEGER; XMAX: REAL; X:ARRAYtl. . НЯ) OF REAL; BEGIN WRITE('ВВЕДИТЕ ЗНАЧЕНИЕ H’) ; READ(N) ; FOR l:=t TO H DO READ(X[I] ); XMAX: =X[1): IMAX:=1; FOR I: =2 TO H DO IF X[I]>XMAX THEH BEGIN XMAX:=X[I] ; IMAX:;I EHD; WRITE ('ХНАХ--', XMAX. " : 4. ’ IMAX= '. IMAX) END. run Контрольные вопросы 1. Указать особенности программ, использующих массивы. 2. Какие операторы языка можно использовать для опи- сания массивов? 3. В чем состоит особенность организации цикла при обработке массивов? 260 1и
4. В чем состоит особенность использования приемов программирования при обработке массивов? 5. Указать особенности ввода и вывода массивов. ЛАБОРАТОРНАЯ РАБОТА № 7 ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ СО СТРУКТУРОЙ ВЛОЖЕННЫХ ЦИКЛОВ Цель работы — овладение навыками алгоритмизации и программирования вычислительных структур с вложенными циклами. Задание для самостоятельной подготовки Задание А 1. Изучить: — организацию вычислительных структур с вложенны- ми циклами; — возможности языка программирования по организа- ции таких структур; — прием программирования для вычисления опреде- ленного интеграла с заданной точностью. 2. Разработать алгоритм решения задачи в соответствии с заданием А. 3. Составить программу решения задачи. Задание Б. 1. Изучить: — прием программирования — нахождение экстремума функции с заданной точностью; 2. Разработать алгоритм решения в соответствии с за- данием Б. 3. Составить программу решения задачи. 4. Для контроля вычислить точное значение экстремума заданной функции (в табл. 5.7 указано точное значение аргу- мента х, при котором достигается экстремум). Задание к работе Задание А. Вычислить на ЭВМ с заданной точностью ь е значение определенного интеграла f(x) dx, приведенного а в табл. 5.6 (в соответствии с вариантом задания). Исходны- ми данными для решения считать значения интервала интег- рирования [а, 6], точность вычисления е и метод численного решения. Включить в программу вычисление точного значе- ния интеграла, оценить абсолютную погрешность метода. Примечание. Значение числа отрезков, указанное в табл. 5.6, в данной работе не используется. 261
Задание Б. Вычислить на ЭВМ с заданной точностью е экстремум функции, приведенной в табл. 5.9 (в соответст- вии с вариантом задания). На печать вывести таблицу значе- ний аргумента х и функции y=f(x) только при «грубом» значении шага изменения аргумента, а также вычисленное конечное значение экстремума и значение аргумента, при котором оно достигается. Таблица 5.9 Вариант задания Вид функции Вид экстремума ^►экстр Диапазон изменения аргумента |с.Ь| «Гру- бое» значе- ние шага h Точность вычисле- ния экстре- мума е 1 2 + х—х2 Максимум 0.5 [0; 1.0] 0,15 I0's 2 (1-х)4 Минимум 1,0 [0,2; 1,5] 0,25 0,5-IO"4 3 cos x-|-ch х Минимум 0,0 1-0,8; 0,4] 0,25 [Ю-5] 4 х'/3(1_х)2/3 Максимум 0,333333 [0,1; 0,6] 0,1 10~5 5 х3 — 6х2+9х-|-4 Максимум 1,0 [0,2; 1,5] 0,3 I05 6 х3 —6х2-|-9х-|-4 Минимум 3,0 [2; 4] 0,3 0,5- 10 s 7 2х2—х4 Минимум 0,0 1 — 2; 0,8] 0,15 10" 8 х2 —Зх+2 х2 + 2х—1 Минимум 1,4 П;2] 0,15 0,5-10~4 9 х V*—1 Минимум 0,75 [0,1; 1,2] 0,2 10-s 10 хе-Л Максимум 1,0 [0,1; 1,5] 0,25 10-5 11 In2 х/х Максимум 7,389 [6; 8] 0,15 10-5 12 х+1/х Минимум 1,0 [0,1; 1,5] 0,2 10-" 262
Продолжение табл. 5.9 Вариант задания Вид функции </=((*) Вид экстремума ЛГэкстр Диапазон изменения аргумента [О.6| <Гру бое» значе- ние шага h Точность вычисле- ния экстре- мума е 13 arctgx—у In (14-х2) Максимум 1,0 (0,15; 1,5] 0,2 Ю"5 14 |х|е—,х —11 Максимум — 1,0 (-2; -0,5] 0,15 10-5 15 1п2х/х Минимум 1,0 [0,1; 1,9] 0,2 10-" Пример выполнения работы Задание А. Вычислить на ЭВМ методом трапеций А • 2 С Sin X . значение интеграла z=\-----------------— ах с точностью J i4-2A!cosx4-Ar е=10-4 для а=0; Ь~л; Л = 0,5. Для контроля вычислить точное значение интеграла и оценить абсолютную погреш- ность вычисления. В примере выполнения лабораторной работы № 5 при- ведены оценка точного значения данного интеграла, схема алгоритма и программа вычисления для фиксированного зна- чения числа разбиений п интервала интегрирования. Схема алгоритма решения по методу удвоения числа разбиений п приведена на рис. 5.8. Блок 3 задает первоначальное значе- ние п. За начальное значение интеграла Zi в блоке 4 прини- мается значение, равное нулю. В блоках 5—10 организуется вычисление нового значения интеграла 2ч по методике, изло- женной в лабораторной работе 5. В блоках 11, 12, 13 вы- числяется модуль разности между новым и предыдущим зна- чениями интеграла, новое значение интеграла пересылается в предыдущее и число разбиений удваивается (проводится подготовка к выполнению следующего итерационного цикла). Блок 14 осуществляет проверку точности. Если заданная точность не достигнута (6>е), то осуществляется возврат в начало внешнего цикла к блоку 5. По достижению точно- сти вычисляется окончательное значение интеграла. Блоки 16—17 служат для контроля вычислений. Программы, реализованные в соответствии с алгоритмом (рис. 5.8), имеют вид: 263
Рнс. 5.8
а) на языке БЕЙСИК 1О ’ЛАБОРАТОРНАЯ РАБОТА П7А 15 'СТУДЕНТ ГРУППЫ РЛ-21 ИВАНОВ И. И. го PRIHT "ВВЕДИТЕ ДИАПАЗОН ИНТЕГРИРОВАНИЯ А. В 30 IHPUT А. В, EPS : Х=.5 35 Н=5 : Z1 = O 40 Z3=SIH(Aj"2/(l*2*I*COS(A)+X*I) 50 Z4=SIH(B)"2/(1+2*X*COS(B)+I*X) во гз=(z3fZ4>/г то Z2=Z3 : dx=cb—А)/н : x=a 90 FOR 1 = 1 TO H-l 1OO X=X*DX Z2=Z2*SIH(X)*2/(1+2*X»COS(X)+X*X) 110 HEXT I : Z2=Z2»DX : PRIHT "H="; H, "Z2="; Z2 115 DELTA?ABS(Z1—Z2) : Z1=Z2 : H=2*H 120 IF DELTA>EPS THEH 70 130 ZT=3. 141592/2 160 PRIHT "ПРИБЛИЖЕННОЕ ЗНАЧЕНИЕ Z=";Z2 170 PRIHT "ТОЧНОЕ ЗНАЧЕНИЕ ZT=";ZT 160 PRIHT "АБСОЛЮТНАЯ ПОГРЕИНОСТЬ" ; ABS (Z2-ZT) 190 EHD б) на языке ФОРТРАН С ЛАБОРАТОРНАЯ РАБОТА П7А С СТУДЕНТ ИВАНОВ Н. Н. REAL К PRIHT*, 'ВВЕДИТЕ А, В, EPS' READ(5, 1)А. В. EPS 1 FORMAT(2F5. 2, F7. 5) X=0. 5 H=5 Zi = O Z3=(SIH(A)**2/(1+2*X*COS(A)+K*K)♦ • SIH(B)**2/(1+2*K*COS(B)+X»K))/2 2 Z2=Z3 DX= (B-AJ/H X=A DO 3 1 = 1, H-l X=X+DX Z2=Z2+SIH(X) »*2/(l*2«X*COS(X)+X»X) 3 COHTIHUE Z2=Z2*DX DELTA=ABS ( Zi -Z2 ) Z1=Z2 H=2«H IF (DELTA. GE. EPS) GOTO2 ZT=3. 141592/2 DZ=ABS(ZT-Z2) WRITE(6, 10) Z2, ZT, DZ 10 FORMAT(IX, 'Z=*,F6. 5/IX, 'ZT=',F6. 5/ > IX. 'DZ=',F8. 5) STOP EHD 265
в) на языке ПАСКАЛЬ PROGRAM PRIMTAI IHPUT, OUTPUT) ; f ЛАБОРАТОРНАЯ РАБОТА П71 ( СТУДЕНТ ГРУППЫ РЛ-21 ИВАНОВ И. И| VAR А, В, К, X, Zi, Z2, Z3, DZ : REAL; DELTA, DX, ZT, EPS:REAL; H, I: IHTEGER; BEGIH WRITELH ( ‘ ВВЕДИТЕ A. B, EPS' ) ; READ (A, B, EPS) ; K:=O. 5; H: =5; Z1:=O; Z3: = (SQR (SIH (A) ) / (1+2*K*COS (A) *K*K) * SQR (SIH (B) ) / ( i+2*X«COS(B)+X*X))/2; REPEAT Z2:=Z3; DX: = (B-A)/H; X: =A; FOR I:=1 TO H-i DO BEGIH X:=X*DX; Z2: =Z2+SQR (SIH(X) )/(1+2«X«COS(X) *-K*K) EHD; Z2:=Z2*DX; DELTA:=ABS(Z2-Z1) ; Z1:=Z2; H:=H«2 UNTIL DELTA<EPS; ZT:=PI/2; DZ:=ABS(ZT-Z2); WRITELH ('ПРИБЛИЖЕННОЕ ЗНАЧЕНИЕ Z= ' , Z2: 9: 5) ; WRITELH('ТОЧНОЕ ЗНАЧЕНИЕ ZT=* . ZT: 9: 5) ; WRITELH ('АБСОЛЮТНАЯ ПОГРЕИНОСТЬ ',DZ:9:4) EHD. Задание Б. Вычислить на ЭВМ с заданной точностью е=10—5 экстремум функции у=х (х— I)2 (х—2)3 на интер- вале [—0,3; 0,5]. Вид экстремума — минимум. «Грубое» зна- чение шага изменения аргумента принять равным 0,15. На печать вывести вычисленное значение экстремума и значение аргумента, при котором оно достигается. Схема алгоритма решения приведена на рис. 5.9. Блок 4 задает начальное значение аргумента х, равное а при пер- вом нахождении минимума с шагом 0,15. В блоке 5, входящем во внешний цикл, присваивается начальное значение ymin,рав- ное большому числу 4-Ю10. Блоки 6—9 составляют внут- ренний цикл с параметром цикла х, в котором вычисляется наименьшее значение функции с текущим значением шага — изменения аргумента й. При выполнении в блоке 8 условия y>ymin, т. е. про- хождения экстремальной точки, осуществляется выход из цикла к блоку 10. Выход из цикла может выполняться и естественным образом, когда цикл выполнен для всех значе- ний аргумента х и условие выхода из внутреннего цикла ни разу не выполнилось, т. е. функция является монотонно убы- вающей на интервале (а, Ь). 266
Блок 10, расположенный во внешнем цикле, проверяет условие достижения требуемой точности. Если условие вы- полнено, то осуществляется выход из внешнего цикла и пе- чать результатов. В противном случае в блоке 11 задается новое начальное значение аргумента х в окрестностях мини- мума, равное хт1П—Л, в блоке 12 дробится шаг изменения аргумента Л=Л/2 и осуществляется переход на повторение внешнего цикла. 267
Программы, реализующие схему алгоритма (рис. 5.9) имеют вид: а) на языке БЕЙСИК IO 'ЛАБОРАТОРНАЯ РАБОТА П7В 15 СТУДЕНТ ГРУППЫ РЛ 21 ИВАНОВ и. н. 20 PRIHT "ВВЕДИТЕ ГРАНИЦЫ ИНТЕРВАЛА А, В" 30 IHPUT А, в 40 KPS=. OOOOl : Н=. 15 : ХО=А 50 ТМ1Н=1Е+10 60 FOR ХгХО ТО В STEP Н ТО Y=X*(X—1) *2» (X—2) *3 60 IF Y> = TMIH ТНЕН 100 90 YMIH=T : XHIH-X : HEXT X 100 IF H<=EPS THEN PRINT _XMIN = ”,XMIN:STOP 110 XO = XMIN-H:H = H/2:GOTO 50 120 END б) на языке ФОРТРАН С ЛАБОРАТОРНАЯ РАБОТА П7Б С СТУДЕНТ ИВАНОВ Н. Н. PRIHT», 'ВВЕДИТЕ А, В' READ(5, 1)А, В 1 FORMAT (2F5. 2) Н=0. 15 EPS=1Е-5 H=IHT( (B-AI/H+0. 5) ХО=А 4 YHIH=iE»10 Х=ХО DO 2 1 = 1, И Т=Х»(Х-1)<»2»(Х-2)»»3 IF (Т. GE. TMIH) GOTO 3 tmih=t XMIHX х=х*н 2 COHTIHUE 3 IF(Н. LE. EPS)GOTO 5 XO=XMIH-H H=H/2 GOTO 4 5 WRITEI6, 10)XMIH, TMIH 10 FORMAT(IX, *XMIH=',F6. 3/IX, 'TMIH=',F6. 3) STOP EHD В языке ФОРТРАН-IV в операторе цикла DO нельзя использовать вещественную переменную в качестве парамет- ра цикла. Поэтому введена целочисленная переменная I, которая выполняет роль счетчика числа повторений цикла. В языке ФОРТРАН-77 допускается использование в опе- раторе цикла вещественных переменных в качестве парамет- ра цикла. Поэтому программа будет полностью соответство- вать схеме алгоритма (рис. 5.9), т. е. оператор цикла имеет вид DO 2Х = Х0, В, Н и нет необходимости в операторах Х0 = = А; N = INT((B — A)/H-|-0,5) и X = X-|-H. 268
в) на языке ПАСКАЛЬ PROGRAM PRIНТВ(IHPUT, OUTPUT) ; (ЛАБОРАТОРНАЯ РАБОТА пТ) ( СТУДЕНТ ГРУППЫ РЛ-21 ИВАНОВ Н. Н1 СОИБТ EPSHE-5; VAR А, В, ХО, XMIH, Y, YMIH, X, Я : REAL; BEGIH WRITELH(’ВВЕДИТЕ А, В’) ; READ (А, В); ХО:-А; Я: =0.15; WHILE H>=EPS DO BEGIH YMIH:=1E1O; х: =ХО; REPEAT Т: =X*SQR (X-i ) »SGR (X-a) * (X-2 ); IF Y<YMIH THEH BEGIH YMIHzsY; XMIH: =X END: X: =X*H UNTIL Y>YMIH; XO: =XMIH-H; H: -H/2 EHD; WRITELH('XMIH=' , XMIH:8:3. ' YMIH=', TMIH:8: 5) EHD. В соответствии с принципами структурного программирования для организации итерационного внешнего цикла используется опера- тор цикла WHILE, а для внутреннего цикла с заданным числом по- вторений— оператор REPEAT—UNTIL. Для контроля вычислений определим экстремум функции у=х(х— 1)2(х—2)3 на интервале [—0,3; 0,5]. Минимум функ- ции равен ymin«—0,76. Контрольные вопросы 1. Указать основные правила организации вложенных циклов. 2. Возможен ли выход из внутреннего цикла до его полного завершения? 3. Почему при вычислении определенного интеграла за- дание начального значения суммы осуществляется каждый раз при выполнении внешнего цикла? 4. Почему при нахождении наибольшего значения функ- ции в качестве начального значения утгл взято число —1О10? 5. Почему выход из внутреннего цикла при нахождении экстремума функции осуществляется до достижения правой границы интервала [а, Ь]? 6. Указать, какие операторы входят во внешний цикл в задании Б? 269
7. Указать, какими возможностями обладает изучаемый язык программирования для построения итерационных цик- лических структур и циклических структур с заданным чис- лом повторений. ЛАБОРАТОРНАЯ РАБОТА № 8 ОБРАБОТКА МАТРИЦ Цель работы — овладение навыками алгоритмизации и программирования структур с вложенными циклами, навы- ками использования приемов программирования во вложен- ных циклах, способами ввода и вывода матриц. Задания для самостоятельной подготовки 1. Изучить: — правила организации вложенного цикла с учетом порядка перебора элементов матрицы; — • правила использования приемов программирования в структурах с вложенными циклами; — способы ввода и вывода матриц, имеющиеся в языке программирования. 2. Разработать алгоритм решения в соответствии с за- данием. 3. Составить программу решения задачи. 4. Подготовить тестовый вариант программы и исходных данных. Задание к работе 1. Обработать на ЭВМ матрицу в соответствии с вари- антом задания, указанного в табл. 5.10. Вывести на печать результаты и исходную матрицу в общепринятом виде. 2. Проверить правильность выполнения программы с по- мощью тестового варианта. Пример выполнения работы Задание 1. Выполнить на ЭВМ решение задачи. За- писать в массив В (N, КМАХ) положительные элементы строк матрицы A(N, М) (N^20, М^Ю) до первого отрица- тельного, где КМАХ — наибольшее значение числа положи- тельных элементов в строке до первого отрицательного. Вы- вести на печать сформированную матрицу В. На печать выводить только те элементы, которые записаны в матрицу В. Алгоритм решения следующий. Организовать вложенный цикл для перебора элементов исходной матрицы А по стро- 270
Таблица 5.10 Вариант задания Имя матрицы н размеры Действия Условия и ограничения 1 А (10, 15) Вычислить и запомнить сумму и чис- ло положительных элементов каждого столбца матрицы. Результаты отпеча- тать в виде двух строк а.)> 0 2 A (N, М) Вычислить и запомнить суммы и числа элементов каждой строки мат- рицы. Результаты отпечатать в виде двух столбцов V/V/ Z S 3 В (N, N) Вычислить сумму и число элементов матрицы, находящихся под главной диагональю и на ней N<12 4 С (N, N) Вычислить сумму и число положи- тельных элементов матрицы, находя- щихся над главной диагональю о « Л V/ Z 5 D (К, К) Записать на место отрицательных элементов матрицы нули и вывести ее на печать в общепринятом виде К<10 6 D (10. 10) Записать на место отрицательных элементов матрицы нули, а на место положительных — единицы. Вывести на печать нижнюю треугольную мат- рицу в общепринятом виде 7 F (N, М) Найти в каждой строке матрицы максимальный и минимальный эле- менты н поместить их на место первого и последнего элемента строки соответ- ственно. Матрицу напечатать в обще- принятом виде N<20 М< 10 8 F (10, 8) Транспонировать матрицу н вы- вести на печать элементы главной диа- гонали и диагонали, расположенной под главной. Результаты разместить в двух строках 271
Продолжение табл. 5.10 Вариант задания Имя матрицы и размеры Действия Условия и ограничения 9 N (10, 10) Для целочисленной матрицы найти для каждой строки число элементов, кратных пяти, и наибольший из полу- ченных результатов Пу/5 * 5 ~~ Hq 10 N (10, 10) Из положительных элементов мат- рицы N сформировать матрицу М (10, КМАХ), располагая их в строках матрицы подряд, где КМАХ — макси- мальное число положительных эле- ментов строки матрицы N. Записать нули на место отсутствующих элемен- тов. Отпечатать обе матрицы в обще- принятом виде 11 Р (N, N) Найти в каждой строке наибольший элемент и поменять его местами с эле- ментом главной диагонали. Отпеча- тать полученную матрицу в общепри- нятом виде N<15 12 R (К, N) Найти наибольший н наименьший элементы матрицы к поменять нх местами К<20 N< 10 13 S (25, 8) Ввести исходные данные в первые 24 строки н первые 7 столбцов. Вы- числить среднее арифметическое зна- чение элементов каждой строки н записать его в 8-й столбец, а так- же среднее арифметическое каждого столбца н записать его в 25-ю строку. Отпечатать полученную матрицу в об- щепринятом виде 14 Т (N, М) Найти строку с наибольшей и наи- меньшей суммой элементов. Вывести на печать найденные строки н суммы их элементов 3: z /Л/Л — ND сл О 15 V (15, 10) Упорядочить по возрастанию эле- менты каждой строки матрицы. Отпе- чатать полученную матрицу в обще- принятом виде 272
кам. Для этого во внешнем цикле следует изменять индекс строки, а во внутреннем — индекс столбца; во внутреннем цикле — находить и записывать в соответствующую строку матрицы В положительные элементы строки до первого отри- цательного, а также подсчитывать число положительных эле- ментов К в этой строке. Для подсчета числа положительных элементов необходимо перед внутренним циклом задать его начальное значение, равное 0, а внутри цикла считать число таких элементов, используя оператор присваивания К= К-1- 4-1. Если положительных элементов в строке нет, то К = 0, если в строке все элементы положительны, то K = N. Как только встретится отрицательный элемент в строке матрицы, необходимо записать в матрицу В вместо него —1 и выйти из внутреннего цикла. Во внешнем цикле следует найти наибольшее значение из всех К, вычисленных для отдельных строк. Для этого перед внешним циклом необходи- мо задать начальное значение КМАХ, например, равное ну- лю, а внутри внешнего цикла сравнивать К с КМАХ и на- ходить наибольшее из них. Таким образом, матрица В имеет размер NXКМАХ. В некоторых строках матрицы В будет записано элементов меньше, чем КМАХ. По условию задачи на печать необходи- мо вывести только элементы, записанные в матрицу В. На- личие в строке матрицы — 1 указывает на окончание выво- да элементов этой строки. Схема алгоритма решения представлена на рис. 5.10. Блок 3 задает начальное значение КМАХ, блок 4 организует внешний цикл, изменяющий индекс строки, блок 5 задает начальное значение К, блок 6 организует внутренний цикл, изменяющий индекс столбца. Блок 7 проверяет знак элемента массива ац. Если он положительный, то блок 8 осуществляет запись этого элемента в массив В и увеличивает значение К на 1. Если элемент отрицательный, то блок 9 осуществляет запись —1 в матрицу В и далее осуществляется выход из внутреннего цикла к блоку 10. Из внутреннего цикла возможен естественный выход (если в строке не было отрицательных элементов), который осуществляется также к блоку 10. Блоки 10 и 11 находят значение КМАХ. Блоки 12 и 13 организуют цикл для печати результатов. Внутри цикла проверяется знак элемента. Если он положительный, то осуществляет вывод его на печать. При печати необходимо предусмотреть блокировку перехода на новую строку перед выводом следующего элемента этой же строки. Если элемент ai(- отрицательный, то осуществляется выход из внутреннего цикла к блоку 16, который обеспечивает 273
переход на следующую строку печатающего устройства, под- готавливая его для вывода элементов следующей строки. Естественный выход нз внутреннего цикла также осуществля- ется к блоку 16. 274
Программы имеют вид: а) на языке БЕЙСИК 5 КЕМ РАБОТА 8 Ю DIM А (20, 1О),В(2О, Ю) 20 INPUT И, М 30 XI =0 40 FOR III ТО И 50 Х=0 60 FOR J=1 ТО И ТО INPUT AU. J): HEXT J 75 FOR J =1 ТО И 80 IF A(I.J)<0 THEH 1ОО 90 B(I, J)-A(I, J) : X=X+1: GOTO 11O 1OO B(I, J) = -1:GOTO 120 110 HEXT J 120 IF X>X1 THEH X1=I 125 HEXT I 130 FOR Ixl TO H 140 FOR J=1 TO H 150 IF B(I,J)<0 THEH 170 160 PRIHT B(I, J) : 165 HEXT J 170 PRIHT 175 HEXT I lao EHD б) на языке ФОРТРАН С лабораторная 6 DIMENSION A(20, 1О),В(2О, 10) READ(5, 1) И, И, ( (А(I. J) , J= 1, М) , 1=1, N) 1 FORMAT (212/(20F4. 1) ) КМАХ=О DO 2 1 = 1, Н Х=0 DO 3 J=1,M IF (A(I.J)) 4,5,5 5 B(I. J) =A(I. J) K=K*i GOTO 3 4 B(I,J) = -1. GOTO 2 3 CONTINUE 2 IF (X. GT. XMAX) XMAX=X DO 6 1 = 1, H DO 7 J=1,KMAX IF (ВЦ, J). LT. O) GOTO 6 7 WRITE(6, 8) B(I,J) 8 FORMAT('*', F6. 1) 6 WRITE(6. 9) 9 FORHAT(' ') STOP EHD 275
в) на языке ПАСКАЛЬ PROGRAM LRa (IHPUT, OUTPUT); LABEL 10; CONST N=2O; H=1O; VAR I. J, HR, MR, K, KMAX: INTEGER; A, B:ARRAT[1. . H. 1. ,M] OF REAL; BEGIN WRITELH('ВВЕДИТЕ ЗНАЧЕНИЕ HR, MR’) ; READ(HR. MR); WRITELHI'ВВЕДИТЕ ЗНАЧЕНИЯ МАССИВА A'); FOR I: -1 TO HR DO FOR J: = 1 TO MR DO READ(A[I, J]); KMAX:=0; FOR J: = 1 TO HR DO BEGIH K: =0; FOR J: = 1 TO MR DO IF A[I,J]> = 0 THEH BEGIH K:=K*1; Btl, J]:=A[I, J) END ELSE BEGIH B[I, JJ-.z-l; GOTO IO EHD; 10: IF К > KMAX THEH KMAX:=K; EHD; FOR I: - 1 TO HR DO FOR J:=l TO KMAX DO IF B[I, J)>0 THEH WRITE(B[I, J) ) ELSE WRITELH; END. Задание 2. Выполнить программу прн N = 4 и М = 4, приняв следующие значения исходной матрицы А: ( 1.5 2.0 —1.0 2 \ 3.3 4.4 5.5 6.6 \ — 2. 3. 4. 5. I 0.0 —2. 7. —4 / В результате выполнения программы выводится матрица в виде 1.5 2.0 3.3. 4.4. 5.5 6.6 (пустая строка) 0.0 Правильность выполнения программы легко устанавли- вается сравнением исходной матрицы А с результатом печати 276
матрицы В. В тестовом наборе данных рассмотрены следую- щие случаи: I) в строке есть отрицательный элемент; 2) в строке нет отрицательных элементов; 3) первый элемент строки — отрицательный. Использование указанных случаев позволяет убедиться в работоспособности программы при любых наборах данных. Контрольные вопросы 1. Указать основные правила организации вложенных циклов. 2. Указать способы выхода из внутреннего цикла. 3. Сколько раз выполняются операторы К=0 и К=К + 1 в программе примера? 4. Как организовать вывод матрицы в общепринятом виде? 5. Как организовать вывод нижней треугольной матрицы в общепринятом виде? 6. Как организовать ввод матрицы размером NXM эле- ментов? ЛАБОРАТОРНАЯ РАБОТА № 9 ПРОГРАММИРОВАНИЕ С ВЫВОДОМ РЕЗУЛЬТАТОВ В ВИДЕ ГРАФИКОВ НА ЭКРАН АЛФАВИТНО-ЦИФРОВОГО ДИСПЛЕЯ Цель работы — овладение методами вывода результатов в виде графиков, практическими навыками по работе с сим- вольными данными. Задания для самостоятельной подготовки 1. Изучить: — метод построения графиков на экране алфавитно- цифрового дисплея; — возможности языка программирования для обработ- ки и вывода символьных данных. 2. Разработать алгоритм решения в соответствии с за- данием. 3. Составить программу решения задачи. 4. Подготовить тестовый набор данных для контроля правильности вычисления значений функции. Задание к работе Вывести на экран алфавитно-цифрового дисплея график функции y=f(x), приведенной в табл. 5.11, в заданном диа- 277
Таблица 5.11 Вариант задания Вид функции y—f (х) Диапазон изменения аргумента Число точек графика n a b I sin х Л "2 30 2 cos X 0 3л ~2~ 40 3 I sin х| -f- |cos xl 0 Л 40 4 I sin x| — |cos x| 0 Л 40 5 2 sin x-f-3 cos x — Л + « 50 6 sin x-f-cos (2x) — Л + Л 50 7 2 —cos x 0 3л ~2~ 40 8 sin (-/2x)4-cos x 0 2л 50 9 2 sin (2x)4- 1 Л “ T 2 50 10 sin x-f-cos x— 1 — n 4-л 40 11 Vх2+2 — 3 5 40 12 10/(14-x2) -3 3 30 13 (x-3)/(x2 + 2) — 1 4 50 14 x cos (2x) — 1 4 50 15 x2e— I*' — 1 3 40 пазоне изменения аргумента х от а до b с числом точек графи- ка п(п^50). Ширину поля графика w и расположение его относительно края экрана (параметр т) задать самостоя- тельно. Предусмотреть перед выводом графика печать вы- численных значений yt в виде таблицы, а также печать наи- большего и наименьшего значений функции. Пример выполнения работы Вывести на экран дисплея график функции у=1/(х2 — —х-Ь 1) при изменении аргумента х от — 1 до 3. Число точек графика равно 40. 278
Примем ширину поля графика w, равной 61 позиции. Отступим от левого края экрана на zn=10 позиций. Для вывода строки выделим символьный массив С, состоящий из элементов, т. е. 71 элемента. Масштаб по оси х при- мем равным шагу Дх при перемещении на одну строку. Мас- штаб по оси у выберем таким, чтобы максимально использо- вать поле графика w. Для этого необходимо вычислить 1/max = max {z/Д и ymin = min {z/J. i i „ - , Утах Угтп .. Определим масштаб ту по формуле гпу =--------. Мас- штаб ту означает, что при каждом изменении значения функ- ции на величину ту символ, изображающий точку на графи- ке, смещается в очередную позицию по строке. По вычисленным значениям ymin и ту определим номер позиции k, в которой изображается ось Ох: fe=ll^J+0,5r+m, I т I где ] [ — целая часть выражения; 0,5 добавлено для округле- ния до ближайшего целого. Для определения номера I позиции в строке, в которой надо изобразить значение у,, воспользуемся формулой У‘ Утт +0,5 ту 1 = + т. Для вывода собственно графика в цикле в очередной строке, соответствующей значениям аргумента х, и функции yh выведем символ «I» в позиции с номером k и символ «»» в позиции с номером I (при l = k в данной позиции следует выводить символ «*»). Схема алгоритма решения задачи представлена на рис. 5.11. В блоке 3 символьный массив С заполняется про- белами. Блоки 4—11 организуют вычисление текущего значе- ния функции yi=f(Xi), запоминание вычисленных значений yt в массиве Y, состоящем из 40 элементов, вычисление наиболь- шего и наименьшего значений функции на заданном интерва- ле изменения аргумента х. В блоках 12—13 вычисляется масштаб ту графика по оси у, номер k позиции в строке графика, соответствующий оси Ох, и осуществляется при- сваивание Л-му элементу массива С символа «1». Вычисление номера позиции / в строке, соответствующей точке графика, занесение в /-й элемент массива С символа «*» и печать символьного массива С реализуются блоками 279
1______________ Рис. 5.11
16—18, восстановление символьного массива С в исходное состояние — блоками 19—21. Программы, реализующие схему алгоритма рис. 5.11, имеют вид: а) на языке БЕЙСИК 10 'ЛАБОРАТОРНАЯ РАБОТА п9 15 'СТУДЕНТ ГРУППЫ РЛ-21 ИВАНОВ И. И. 20 DIH Y(40), С»(71) 25 DEFIHT К, L.M.W 30 PRIHT "ВВЕДИТЕ А, В, И* 40 IHPUT А, В, И : W=5i : М=10 50 FOR 1=1 ТО 71 50 C»(I)=* " : HEXT I 60 Н=(В-A)/И : YHAX=-1E+1O : ТН1И=1Е+10 : Х=А 90 FOR 1=1 ТО И 1ОО Т(1)=1/(Х»Х-Х+1) 110 IF Y(I)>YMAX THEH YHAX=Y(I) 120 IF Y(I)<YMIH THEH YHIH=Y(I) 130 X=X+H : HEXT I 140 DHY= (YHAX-YMIH) / (W—1) 150 K=IHT(ABS(YHIH)/DHY+. 5) 150 C»(K)="I" 165 PRIHT "YMAX="; YMAX, " YMIH= "; YMIH, "НАСИТАБ= ": DHY 170 PRIHT TAB(5) ; "ГРАФИК ФУНКЦИИ Y=F(X)" 180 FOR 1 = 1 TO И 190 L=IHT((Y(I)-YMIH)/DMY+. 5) *M 200 C»(L)="*" 210 FOR J=1 TO 71 220 PRIHT C4(J); : HEXT J 230 PRIHT 240 C»(L)=" " 250 IF K=L THEH C»(L)="I" 260 HEXT I : EHD б) на языке ФОРТРАН С ЛАБОРАТОРНАЯ РАБОТА п9 С СТУДЕНТ ИВАНОВ И. И. REAL Y(41), MY INTEGER W CHARACTER *1 C(71) С ЗАПОЛНЕНИЕ СТРОКОВОГО МАССИВА ПРОБЕЛАМИ DATA C/71*' '/ PRINT», 'ВВЕДИТЕ А, В, H' READ (5, 1)A, В, И 1 FORMAT(2F5. 2, 12) W=61 M=10 H= (B-A)/H YMAX=-1E1O YHIH= 1E10 X=A DO 2 1=1, H Y(I)=1/(X»X-X+i) IF (Y(I). GT. YMAX) YMAX=Y (I ) IF (Y (I). LT. YMIH) YMIH= Y (I ) 281
г х=х+н MY= (YMAX-YMIH) / (W-1) K = IHT (ABS (YMIH) /MY*O. 5) C(K)=’I* WRITE (6, 10) 10 FORMAT(6X, 'ГРАФИК ФУНКЦИИ ' /6Х, 71 ('-' ) ) DO 4 1 = 1, И L=IHT( (Y(I)-THIM)/MY+O. 5)+M C (!>) = '*' WRITE(6, 20)C 20 FORMAT! IX. 71 Al) C(L)=' ' IF (K. EQ. L) C(L)='I' 4 COHTIHUE STOP EHD Для резервирования памяти под символьный массив, состоящий из односимвольных элементов, используется оператор LOGICAL*! С (71) для языка ФОРТРАН-IV ЕС ЭВМ и CHARACTER»! С (71) для языка ФОРТРАН-77. Для вывода символьных данных используем спецификацию типа А. В языке ФОРТРАН имеются библиотечные программы, предна- значенные для вывода графиков и гистограмм, использование кото- рых позволяет существенно уменьшить объем программы (см. лабо- раторную работу 11); в) на языке ПАСКАЛЬ PROGRAM PR IМ9 (IHPUT, OUTPUT) ; (ЛАБОРАТОРНАЯ РАБОТА П9] ( СТУДЕНТ ГРУППЫ РЛ-21 ИВАНОВ И. И] COHST V=51;H=10; TYPE STROKAz ARRAY II. . 71) OF CHAR; MASSIVzARRAYIl. . 41] OF REAL; VAR YiMASSIV; CzSTROKA; K, L, И, I, J: INTEGER; А, В, H, YMAX, THIH, X, MY: REAL; BEGIH WRITELHC ВВЕДИТЕ А, В, H') ; READ (А, В, И) ; YMAX: = -HAXIHT; THIH: =HAXIHT; H: = (B-A)/H; (ЗАПОЛНЕНИЕ МАССИВА С ПРОБЕЛАМИ! FOR 1: = 1 то 71 DO C[I]:=' '; X: =A; FOR I:=1 TO И DO BEGIH Y[l]:sl/(X«X-X+l); IF YII)>YMAX THEH YMAX:=Y£I); IF YIIJCYMIH THEH YMIH:=Y[I); X:=X*H EHD; 282
(ОПРЕДЕЛЕНИЕ МАСШТАБА) MY:=(YMAX-YMIH)/ (W-l); I:-ROUHD(ABS(YHIH)/MY); CtI]: = 'I'J WRITELK ('ГРАФИК ФУНКЦИИ YsF(X)*); WRITELH( ’------------------------• ) ; FOR I:=1 TO И DO BEGIH L: =ROUND( (YU)-YMIH)/HY) +M; C(L] FOR J:=l TO 71 DO WRITE(C[J)) ; WRITELH(* *); C[L):=’ IF K=L THEH C£L) EHD ; EHD. Контрольные вопросы 1. Указать, с помощью каких операторов можно заре- зервировать память под символьный массив С, состоящий из 100 элементов. 2. Какие операции можно выполнять над символьными переменными? 3. Как организовать ввод-вывод символьных пере- менных? 4. С помощью каких операторов языка инициализируют- ся начальные значения символьным переменным? 5. Как выбрать масштабы вычерчиваемого графика по осям х и у? 6. Почему необходимо затереть символ графика в сим- вольном массиве при переходе к следующей строке графика? 7. Как видоизменить программу, чтобы вычерчивалась сетка графика, подобно крупной сетке на миллиметровой бумаге? 8. Как видоизменить программу, чтобы выполнялось надписывание осей х, у и значений аргумента х около соответ- ствующей строки графика? 9. Как вывести на печать график двух функций от одного аргумента в одинаковых масштабах? в различных масштабах? ЛАБОРАТОРНАЯ РАБОТА № 10 ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ ПОДПРОГРАММ ПОЛЬЗОВАТЕЛЯ Цель работы — овладение навыками алгоритмизации и программирования задач с использованием подпрограмм пользователя различных видов, овладение навыками написа- 283
ния подпрограмм и обращения к ним, выбора параметров подпрограмм. Задания для самостоятельной подготовки 1. Изучить: — правила записи подпрограмм различных видов и способов обращений к ним; — способы передачи параметров в подпрограмму; — правила записи программ, использующих подпрог- раммы различных видов; — порядок выполнения программ, использующих под- программы. 2. Разработать алгоритм решения в соответствии с за- данием. 3. Составить программу решения задачи. 4. Подготовить тестовый вариант программы и исходных данных. Задание к работе Задание А. 1. Выполнить на ЭВМ программу, использующую под- программу-функцию, в соответствии с номером параметра, указанным в табл. 5.12. Таблица 5.12 Вариант задания Условия задачи Примечания 1 Вычислить большие корни квадрат- ных уравнений х2 — ах + Ь=0 cy2—dx—f=O Все корни дейст- вительные 2 Подсчитать число точек, находящих- ся внутри круга радиусом г с центром в начале координат; координаты за- даны массивами Х(100), Y (100) Расстояние точ- ки от начала коор- динат вычислять в подпрограмме 3 Определить периметры треугольни- ков, заданных координатами их вершин ХА (5), ХВ (5), ХС (5) YA (5), YB (J), YC (5) Длину стороны треугольников вы- числять в подпро- грамме 4 Подсчитать число точек, находящих- ся внутри круга радиусом г с центром в точке с координатами (1, 1); коорди- наты заданы массивами X (80), Y (80) Расстояние точ- ки от центра круга определять в под- программе 284
Продолжение табл. 5.12 Вариант задания Условия задачи Примечания 5 Вычислить z = х . где vi, о V2, из— объемы шаров с радиусами и, Г2» гз соответственно vt вычислять в подпрограмме 6 Вычислить суммы положительных элементов массивов X (N), Y (М), Z(K) N^60 M<g60 К<70 7 Вычислить среднее арифметическое положительных элементов для масси- вов A (N1), В (N2), С (N3) NlsSlOO N2==S100 N3<100 8 Подсчитать количество элементов матриц X (10, 15) и Y (20, 12), удовлетво- ряющих условиям О^х,,^ 1 и О^у,/^ 1 9 Вычислить суммы положительных элементов каждой строки для матриц А (10, 12) и В (15, 10) 10 г, Xml -}-Хт2 Вычислить z = - , где хт1 и Хт2 — наименьшие элементы массивов XI (70), Х2 (80) 11 Вычислить суммы элементов главных диагоналей матриц A (N, N) В (М, М) ss V/V/ < z 12 4" <$2 Вычислить z = — , где si — сум- ма положительных элементов массива X (50); si — сумма отрицательных эле- ментов массива Y (60) Обе суммы вы- числять в одной подпрограмме 13 Подсчитать число нулевых элемен- тов для матриц A (N, М) и В (М, N) ° ° V/V/ s z 14 Вычислить суммы элементов ннжних треугольных матриц для матриц А (15, 15) и В (20, 20) 15 Определить число положительных элементов до первого отрицательного в массивах X (40), V (50), Z (N) N<50 285
2. Проверить правильность выполнения программы с по- мощью тестового варианта. Задание Б. 1. Выполнить иа ЭВМ программу, использующую под- программу-процедуру в соответствии с номером, указанным в табл. 5.13. Таблица 5.13 Вариант задания Условие задачи Примечания 1 Вычислить Z = - ' ^752 , где si и kt — «1«2 сумма и количество положительных элементов массива X (N); S2 и Лг — сум- ма и количество положительных эле- ментов массива Y (М) М<100 N<100 2 4-^2 Вычислить z = —j-- , где s i и k i — «1«2 сумма и количество положительных элементов массива Х(100); sz и — сумма и количество отрицательных эле- ментов массива Y (80) Обе суммы вы- числять в одной подпрограмме 3 Вычислить и запомнить суммы поло- жительных элементов каждой строки матрицы А (10, 20), В (15, 10) 4 Вычислить z = (xi 4-1/1 )/(%2 — уг), где Xi их2 — корни уравнения 2х24-х —4 = = 0, 1/1 и 1/2 — корни уравнения ау2-\- 4-2j/—1=0 Все корни дейст- вительные 5 Найти наибольшие элементы и их по- рядковые номера массивов X (N) и Y (М) ° 2 оо V V/ z £ 6 Переписать положительные элементы массива Х(100) и Y (80) в массив Z подряд Запись в массив Z осуществлять в подпрограмме 7 Найти наименьшие элементы и номера строк и столбцов, в которых они расположены, для матриц А (10, 15) и В (15, 12) 8 Вывести на печать элементы цело- численных матриц N (5, 8) и М(10, 6), кратные трем 286
Продолжение табл. 5.13 Вариант задания Условие задачи Примечания 9 40 50 £ sin Xi4- £ cos у. Вычислить z = „ 1=1 , 40 1 Ix.l 4=1 где x, и yt заданы массивами Все суммы вы- числять в одной подпрограмме 10 _ *max #min Вычислить z = - , где Xmax — максимальный элемент мас- сива X (50); ymn — минимальный эле- мент массива Y (40) Хтах и £faiin вЫ" числять в одной подпрограмме 11 Вычислить и запомнить количество отрицательных элементов каждого столбца для матриц А (10, 10), В (15, 20) 12 Вычислить суммы элементов верхней треугольной матрицы для матриц А (10, 10), В (15, 15) 13 Найти средние значения и стандарт- ные отклонения для элементов массивов X (N), Y (М) NCI0O м-gioo 14 Вычислить суммы и количества эле- ментов, находящихся в интервале от а до b для матриц Х(10, 8) и Y(10, 12) 15 Преобразовать массивы X (50) и Y (60), расположив в них подряд толь- ко положительные элементы. Вместо остальных элементов записать нули 2. Проверить правильность выполнения программы с по- мощью тестового варианта. Пример выполнения работы Задание А 1. Выполнить иа ЭВМ решение задачи. Определить бли- жайшую к началу координат точку, находящуюся в верхней полуплоскости, и наиболее удаленную точку, лежащую в ни- жней полуплоскости. Координаты точек, находящихся в верх- ней полуплоскости, заданы массивами XI (N) и Yl (N), а ле- жащие в иижней полуплоскости,— массивами Х2 (М) и Y2(M), где N<40, М<60. 287
Для каждой точки верхней полуплоскости следует опре- делить расстояние от начала координат. Из этих расстояний необходимо найти наименьшее. Такие же действия выполнить для точек, находящихся в нижней полуплоскости, однако найти наибольшее расстояние от начала координат. Вычисление расстояний от начала координат и нахожде- ние наименьшего или наибольшего из них выполним в под- программе-функции. Использование одной подпрограммы для нахождения наибольшего и наименьшего значений потребует введения дополнительного параметра, который необходим для провер- ки условия K*R>K*RM. Если К = 1, то условие R>RM ис- пользуется для нахождения наибольшего; если К= — 1, то условие R<RM используется для нахождения наименьшего. В подпрограмму необходимо передать массивы коорди- нат точек, их размер, а также параметр К, который может принимать значения +1 или —1. Результат, полученный в подпрограмме-функции, присваивается ее имени. Схема алгоритма решения задачи представлена на рис. 5.12. Программы, реализующие алгоритм решения задачи, имеют вид: а) на языке БЕЙСИК 5 иен работа юа 10 DIM XI(60),Y1(60) 20 IHPUT И, М 30 FOR 1 = 1 ТО И: IHPUT Xl(I), Y1(I):НЕХТ I 40 Г=-1:GOSUB ЮО 50 S1 = R1 60 FOR 1=1 ТО M:IHPUT X1(I),Y1(I):HEXT I 70 K=1:H=M: GOSUB ЮО 80 PRIHT •S1=";S1;’S2=’;R1 90 STOP 1OO REH ПОДПРОГРАММА 110 R1 = -1E+2O»K 120 FOR 1=1 TO H 130 R=SQR(Xl(I)*X1(I)+Y1(I)*Y1(I)) 140 IF K«R>K»R1 THEH R1=R 150 HEXT I 160 RETURH 170 EHD Подпрограмма на языке БЕЙСИК не имеет формальных параметров, поэтому перед каждым обращением к подпро- грамме необходимо формальным параметром присваивать зна- чения соответствующих фактических параметров. По этой причине схема алгоритма основной программы несколько отличается от схемы, представленной на рис. 5.12. Для уменьшения объема программы и экономии памяти для хранения координат точек верхней и иижней полуплоско- 288
F(xt,YI,N,-l) Lzcz 5,= F r5-LZ_ F(X2,YZ,M,f) F = RM S2= F Рис. 5.12 сти используются одни и те же массивы XI и Y1, значения в которые вводятся по очереди. В отличие от схемы алгоритма в программе RMAX заменено Л1; б) на языке ФОРТРАН С лабораторная to DIHEHSIOH Xi (40) , Y1 (40) . X2 (40) . Y2 (40) READ(5, 1) H,H. (Xl(I).Y1(I).1 = 1. N) , (X2(I),Y2(I) 1 = 1. H) 1 FORMAT(212/(2OF4. 1)) Si=F(Xi, Yl. H. -1) S2=F(X2, Y2, H, 1) WRITE (6, 2) S1.S2 2 FORMAT(' S1 = *,F4. 1/ S2=*.F4. 1) STOP EHD FUNCTION F(X. Y. N, K) DIHEHSIOH X(N). Y(H) RM--1E2O 10 В. E. Алексеев и др. 289
DO 1 1 = 1, H R=SORT(X»X*Y»Y) 1 IF (K«R. GT. K»RH> RH=F F=RH RETURH END в) на языке ПАСКАЛЬ PROGRAM COORD(IHPUT,OUTPUT); COHST H=40; TYPE MAS =ARRAY£1..HJ OF REAL; VAR I,HR,MR:IHTEGER; S1,SE:REAL; X1,Y1,XE,YE:MAS; FUHCTIOH VEC (X,Y:MAS;XX,H:IHTEGER):REAL; VAR J’.IHTEGER; R,RM:REAL; BEGIH RM:=-1EEO; FOR J:=l TO H DO BEGIH R:=SQRT(X£I)»X[I]+Y[I}«Y[ID; IF(KX*R>XX«RM)THEH RH:=R; EHD; VEC:=RM EHD; BEGIH VRITECBBEHMTE ЗНАЧЕНИЯ HR И MR'); READ(HR,HR); WRITEfBBEHHTE ЗНАЧЕНИЯ МАССИВОВ XI И Y1')J FOR I:=l TO HR DO READ(X1£I},X1£I}); WRITECBBEflHTE ЗНАЧЕНИЯ МАССИВОВ ХЕ И YE*); FOR I:=i TO MR DO READ(XE[I],YE[I)); S1:=VEC(X1,Y1.HR,-1); SE:=VEC(XE,YE,MR,1); WRITE('S1=',S1,' *:4,'SE=*,SE); EHD. 2. Проверить правильность выполнения программы для массивов, заданных значениями XI ={—4,0,3}; Yl={0, 5, 4); Х2={—4,0,2}; Y2 = {—2, -5, -1}, для которых наименьшее расстояние от начала координат в верхней полуплоскости Si=4, а наибольшее—в нижней полуплоскости s2=5. Задание Б. 1. Решить на ЭВМ задачу. Переписать положительные элементы массивов X (N), Y (М) в массив Z подряд. Запись положительных элементов в массив осуществить в подпрог- рамме. Принять ограничения: N^lOO и М^ЮО. В подпрограмме должна осуществляться запись положи- тельных элементов исходного массива в массив результатов. 290
Для этого в подпрограмму необходимо передать следующие параметры: нмя и количество элементов исходного массива, имя и количество элементов результирующего массива. По- скольку в массив результатов Z записываются подряд поло- жительные элементы из нескольких массивов, в списке пара- метров должны фигурировать также: входной параметр L — номер ячейки, начиная с которой необходимо осуществлять запись в массив результатов; выходной параметр К — номер ячейки, в которую записан последний положительный элемент исходного массива при предыдущем обращении к подпрог- рамме. После окончания записи элементов в массив результа- тов этот параметр определяет количество элементов, записан- ных в массив результатов. При первом обращении к подпрограмме в иее необходимо передать нмя массива X. Количество его элементов N; вход- ной параметр L=l, если запись осуществляется в массив Z, начиная с элемента с индексом 1, имя выходного массива Z, количество его элементов N-f-M и получать в подпрограмме выходной параметр К, определяющий количество элементов, записанных в массив Z. 10* 291
При втором обращении необходимо передать соответ- ственно Y, М, L=K+1, Z, N + M, К. После второго обраще- ния к подпрограмме К—суммарное количество элементов, записанных в массив Z после двух выполнений подпрограммы. Схема алгоритма решений этой задачи имеет вид, пред- ставленный на рис. 5.13. В схеме алгоритма при первом обращении к подпрограм- ме параметр L задан равным нулю, так как в подпрограмме перед записью элемента в массив Z индекс К увеличивается на 1. По этой же причине при втором обращении параметру L присваивается значеие К, т. е. меньшее на 1. Программы, реализующие алгоритм, представленный на рис. 5.13, имеют вид: а) на языке БЕЙСИК 5 НЕН РАБОТА 1ОЪ 10 DIM Х(1ОО), Y(100) , Z(200) 20 IHPUT И, И 30 FOR 1 = 1 ТО И:IHPUT Х(1):НЕХТ I 40 К=0 :GOSUB 1О0 50 FOR 1=1 ТО М:IHPUT Y(I):X(I)= Y(I):HEXT I TO K=M:GOSUB 1OO 60 FOR 1 = 1 TO I:PRIHT Z(I);:HEXT I 90 STOP 100 REH ПОДПРОГРАММА 110 FOR 1 = 1 TO И 120 IF X(I)< = 0 THEH 140 130 X=K*1:Z(K)=X(I) 140 HEXT I 150 RETURH 160 EHD б) на языке ФОРТРАН С лабораторная 1ОБ DIMEHSI0H Х(100), Y( ЮО) , Z (200) READ (5, 1) И, М, (X ( I ) , 1= 1, И) , (Y (I ) , 1= 1, И) 1 FORMAT(2I2/(20F4. 1)) CALL F(X, И, О, Z, H+M, К) CALL F(Y, М, К, Z, И+М.К) WRITE(6,2) (Z(I),I=1,K) 2 FORMAT(2OF6. 1) STOP EHD SUBROUTIHE F(X, И, L, Z, M, K) DIMEHSIOK X(K),Z(M) I=L DO 1 1=1, И IF (X(I). LE. O) GOTO 1 X=K*1 Z(X)=X(I) 1 COHTIHUE RETURK EHD 292
в) на языке ПАСКАЛЬ PROGRAM SORT (IHPUT,OUTPUT); COHST N = 2OO; TYPE HAS*.ARRAY[i..N] OF REAL; VAR I.HR.HR :INTEGER; X,Y,Z:HAS; PROCEDURE ST (VAR A,C:HAS;H,LIK:INTEGER; VAR J:INTEGER; BEGIN K:=L; FOR J:=l TO И DO IF A[I}>0 THEH BEGIN K:=K+1; C[X]:=A[J] END END; BEGIN WRITEf'BBERNTE ЗНАЧЕНИЯ HR И MR'); READ(NR.MR); WRITEl'BBEflHTE ЗНАЧЕНИЯ МАССИВА X'); FOR I:=l TO HR DO READ(X[I}); WRITE('BBERHTE ЗНАЧЕНИЯ МАССИВА Y'); FOR I:=l TO MR DO READ(Y[I}); ST(X,NR,O,Z,HR+HR,X); ST(Y,MR,1,Z,NR+MR,K); FOR I:=l TO К DO WRITE(Z[I}) END. Данная конкретная программа в тестировании не нужда- ется, так как выведенные на печать результаты прзволяют однозначно судить о правильности выполнения программы. Контрольные вопросы 1. Указать, при каких условиях целесообразно использо- вание подпрограмм, какие выгоды они предоставляют пользо- вателю. 2. Указать, в чем отличие различных видов подпрограмм пользователя. 3. Указать способы обращения к подпрограммам пользо- вателя. 4. Указать способы передачи параметров в подпрог- рамму. 5. Указать, как организовать подпрограмму без пара- метров. 6. Перечислить, как согласуются формальные и фактиче- ские параметры. 7. Указать конструкции, которые могут быть формальны- ми и фактическими параметрами. 8. Пояснить, как и куда осуществляется выход из под- программы. 293
ЛАБОРАТОРНАЯ РАБОТА № 11 ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ БИБЛИОТЕЧНЫХ ПОДПРОГРАММ Цель работы — овладение навыками алгоритмизации и программирования задач с использованием библиотеки научных подпрограмм, выбора необходимых подпрограмм и обращения к ним. Задание для самостоятельной подготовки 1. Изучить: — описание библиотечных подпрограмм и используе- мых в них численных методов; — способы вызова библиотечных подпрограмм и под- готовку входных и выходных параметров; — способы анализа результатов, полученных при вы- полнении подпрограмм, и сообщения подпрограммы. 2. Разработать алгоритм решения задачи в соответствии с заданием. 3. Составить программу решения задачи. 4. Подготовить тестовый вариант программы и исходных данных. Задания к работе Задание А. 1. Выполнить на ЭВМ программу, использующую библи- отечные подпрограммы обработки матриц и вывода результа- тов в соответствии с вариантом задания, указанным в табл. 5.14. Таблица 5.14 Вариант задания Условие задачи Используемые подпрограммы и ограничения 1 Сложить две матрицы A (N, М), В (N, М). В полученной матрице вычис- лить сумму элементов каждой строки. Вывести результаты в виде гисто- граммы GMADD, ARRAY, RSUM, HIST N<10, МСЮ 2 Для матриц A (N, N) и В (N, N) вы- числить значения матриц С=(А-В)-1, D = A_|-B“’. Напечатать полученные матрицы в общепринятом виде M1NV, MPRD, ARRAY N^IO 294
Продолжение табл. 5.14 Вариант задания Условие задачи Используемые подпрограммы и ограничения 3 Для матрицы A (N, N) вычислить матрицы В = А2 и С = А\ для получен- ных матриц вычислить сумму элементов каждой строки. Результаты вывести в виде гистрограммы ARRAY. MPRD, RSUM, HIST NC8 4 Сложить матрицы A (N, N) и В (N, N), для результирующей матрицы найти обратную матрицу. Вывести на печать элементы главной диагонали GMADD, ARRAY, MINV. LOC N<6 5 Перемножить симметричные матри- цы A (N, N) и В (N, N). Для результи- рующей матрицы вывести на печать нижнюю треугольную матрицу в обще- принятом виде ARRAY, MPRD, LOC N^6 6 Сложить матрицы A (N, М) и В (N, М). Для верхней треугольной матрицы вы- числить сумму элементов каждой стро- ки. Вывести результаты в виде гисто- граммы ARRAY, GMADD, RSUM, HIST N<g8. M<8 7 Перемножить матрицы A (N, N) и В (N, N). Для результирующей матрицы найти обратную и вывести ее на печать в общепринятом виде ARRAY, MPRD, MINV N^IO 8 Для матрицы A (N, N) найти обрат- ную матрицу. Вывести на печать ниж- нюю треугольную матрицу в общепри- нятом виде ARRAY, MINV. LOC NsS8 9 Перемножить матрицы А (К, К) и В (К, К). Вывести на печать результи- рующую матрицу в общепринятом виде и вычислить для нее сумму элементов каждой строки ARRAY, MPRD, RSUM, LOC K<6 10 Для матриц А (К, К) и В (К, К) вы- числить С1=А-В! и С2 = А— 1 «В. Напечатать матрицы в общепринятом виде ARRAY, MPRD, MINV K<5 11 Для матриц А (К, К) и В (К, К) вы- числить С1 =А В1 и С2 = А ’-В и их сумму. Напечатать результирующую матрицу в общепринятом виде ARRAY, MPRD. MINV, GMADD K^6 295
Продолжение табл. 5.14 Вариант задания Условие задачи Используемые подпрограммы и ограничения 12 Для матрицы A (N, М) вычислить сумму элементов каждой строки матри- цы. Результаты расположить в порядке убывания и напечатать в виде гисто- граммы ARRAY, RSUM, HIST N<8, М<6 13 Дана матрица A (N, N). Найти обрат- ную матрицу, вычислить для нее суммы элементов, находящихся над главной диагональю и под ней. Вывести на пе- чать треугольную матрицу, имеющую большую сумму ARRAY, MINV N<8 14 Сложить матрицы A (N.M) и В (N.M). Для суммарной матрицы найти обрат- ную. Вывести на печать полученную матрицу в общепринятом виде ARRAY, GMADD, MINV N<8, M<C6 15 Для матриц А (К, К) и В (К, К) вы- числить С = А-В_|. Для результирую- щей матрицы вычислить сумму элемен- тов каждой строки. Результаты вывести в виде гистограммы ARRAY, MPRD, MINV, RSUN, HIST K<6 2. Проверить правильность выполнения программы с по- мощью тестового варианта. Задание Б. 1. Выполнить программу на ЭВМ, использующую библи- отечные подпрограммы решения задач численными методами и вывода результатов, в соответствии с вариантом, указан- ным в табл. 5.15. Таблица 5.15 Вариант задания Условие задачи Используемые подпрограммы и ограничения 1 Вычислить значения функции RTMI, PLOT F(X) 'g6x 6(2х+1) при 0<х< 1. Построить график функ- ции. Определить корень уравнения F (х) = 0 с точностью до е=10-4. Ко- рень находится в интервале [0,5; 0,6]. - 296
Продолжение табл. 5.15 Вариант задания Условие задачи Используемые подпрограммы и ограничения 2 Вычислить значение корня уравнения / 0.7854-xJl-x2 \ х — cos 1 1хг' )+ 0,3 = 0 с точностью до е = 10-4. Корень нахо- дится в интервале (0,5; 0.6]. Определить грубое значение корня, построив гра- фик функции в интервале (0,1 0,9] RTMl, PLOT 3 Составить программу для решения системы линейных уравнений. Прове- рить работу программы на системе: ( 3X1 —5x2 = 5; < —2Х1+х2 + х3 = 0; [ 2xi—х2-|-4хз=15 GELG, ARRAY М^Ю 4 Проверить на ЭВМ, что при |а] ^0,9 выполняется равенство л 1 sin х dx 0J д/1 — 2а cos х + а2 Равенство проверить с точностью до е = 10~4 в точках а, =—0,9-|-0,3i, i = 0, 1, 2, . .. 6. Построить график подынтегральной функции QATR, PLOT 5 Проверить на ЭВМ равенство а а2 ^х3 sin2 dx=-i- ^xsinxdx 0 0 при 1 Да = 0,2. Интеграл вычис- лить с точностью до е=0,2-10~’. По- строить графики подынтегральных фун- кций при изменении аргумента 0^х<( 1 QATR, PLOT 6 Найти решение системы уравнений [ 3,8x14- 4,2x2— 1,6хз = 0,3; ( 0,9X1-7,3X24-2,1X3=4,3; 1 1,1X14-2,5X24-3,3X3=8,4 Найденные корни расположить в по- рядке убывания. Вывести на печать матрицу коэффициентов, вектор сво- бодных членов и упорядоченные зна- чения корней с их наименованием GELG 297
Продолжение табл. 5.15 Вариант задания Условие задачи Используемые подпрограммы и ограничения 7 Вычислить корни полинома z = 2x8 —4,3х64-х5— 1,7х34-х4-1. Построить график функции при — 1,5<х<1,5, Дх = 0,05 POLRT, PLOT 8 Вычислить корни полинома z = 2x5 —4х* + 1,Зх3 —8х24-х— 1. Построить график функции при — 1<х<1, Дх = 0,01 POLRT, PLOT 9 Решить систему дифференциальных уравнений , sin л !/i=—У1У2-1——; 1/2— 2 1 4-х на отрезке [а, Ь] с шагом h при у\ (х0)= =ую, уг(хо)=у2о с точностью до е = 10-3. Начальное значение пара- метра печати ТР, а шаг его изменения HP HPCG 10 Решить систему дифференциальных уравнений f И-У2+14-х5; . . COS X УТ- на отрезке [а, 6| с шагом h при yi (х0)=у\о, уг (хо)=уго, с точностью до е = 0,5- Ю-3, начальное значение пара- метра печати ТР, а шаг его изменения HP RKGS 11 Результаты испытаний помещены в матрицу X (N, М). Вычислить средние значения переменных, их стандартные значения и коэффициенты корреля- ции. Матрицу коэффициентов корреля- ции распечатать в виде треугольной матрицы CORRE. ARRAY N^50 M<5 298
Продолжение табл. 5.15 Вариант задания Условие задачи Используемые подпрограммы и ограничения 12 Результаты испытаний помещены в матрицу A (N, М). Вычислить средние значения переменных, нх стандартные отклонения и коэффициенты корреля- ции. При выводе матрицы коэффициен- тов корреляции использовать подпро- грамму LOC CORRE, ARRAY, LOC N с 50 М<5 13 Построить график функции у = = е—* + 1 —х2при изменении аргумента 0< х<: 2 с шагом 0,1. По графику опре- делить грубое значение корня. Уточнить значения корня с точностью до е = 10-4 PLOT, RTMI 14 Результаты измерений помещены в матрицу A (N, 2). Определить сред- ние значения и стандартные отклонения для каждой переменной. Построить гистограммы частот относительно ин- тервалов. Число интервалов 10, ширина интервала (AmaK — Amin)/10 CORRE, ARRAY, HIST N^40 15 Построить график функции у = — Зе -Л +2х—х2 при — 2<xjg2 с ша- гом 0,1. Определить грубые значения Л2 корней xi и №. Вычислить ^у dx с точ- xi ностью до е = 10-4 PLOT, QATR 2. Проверить правильность выполнения программы с по- мощью тестового варианта. Пример выполнения работы Задание А. 1. Выполнить на ЭВМ программу решения следующей задачи. Для матриц A (N, М) и В (М, L) вычислить произве- дение C(N, L). Для результирующей матрицы вычислить сумму элементов каждой строки и вывести на печать резуль- таты в виде гистограммы. При этом N^IO, М^8, 5^6. Матрицу С напечатать в общепринятом виде. Алгоритм решения следующий. Ввести N, М, L и исход- 299
ные значения матриц А и В. Обратиться два раза к подпрог- рамме ARRAY для преобразования матриц А и В в векторный способ хранения, обратиться к подпрограмме MPRD для перемножения матриц А и В; обратиться к подпрограмме RSUM для вычисления суммы элементов каждой строки ре- зультирующей матрицы С; обратиться к подпрограмме HIST для вывода результатов в виде гистограммы; вывести матри- цу С в общепринятом виде. Схема алгоритма представлена на рис. 5.14. Блоки 3, 4, 5, 6, 7 выполняют обращение к соответствующим подпрограм- мам. Перед печатью матрицы С осуществляется обращение к подпрограмме ARRAY для преобразования вектора в мат- рицу (блок 8), а затем в цикле — вывод матрицы С в общеп- ринятом виде (блоки 9 и 10). Программа на языке ФОРТРАН имеет вид С лабораторная 11А DIMENSION А ( 10, 6) , В (6, 6) , С ( 10, 6) , R(1О) READ (5, 1) N, М, L, ( (A(I. J). J=i.M), 1 = 1. N), ( (В ( I. J) , 1. L) , I = 1. M) 1 FORMAT(312/(2OF4. 1)) CALL ARRAY(2, N. M. IO. 6, A. A) CALL ARRAY (2, M. L, В, 6, В, B) CALL MPRD (А, В. C, N. M. О, O, L) CALL RSUM(C, R, N, L, O) CALL HIST(1.R. N) CALL ARRAY( 1. N. L. IO, б. С, C) DO 2 1=1, N 2 WRITE(6,3) (C(I, J), J=l, L) 3 FORMAT(6E12. 4) STOP END 2. Проверить правильность выполнения программы для тестового варианта А (2X2) и В (2X2). Задание Б. 1. Решить на ЭВМ задачу. Построить график функции у=(х2— 2)-2х при изменении —2^х<2 с шагом 0,1. Уточ- нить значения корней уравнений, приняв границы нахожде- ния их в интервалах [—2, 0] и [0, 2]. Корни вычислять с точно- стью до е= 10-3. Число шагов итерации принять равным 100. Для решения необходимо сначала вычислить и записать в матрицу Y значения аргумента х (в первый столбец) и фун- кции у (во второй столбец), затем обратиться к подпрограм- ме PLOT и вывести результаты в виде графика. Затем обра- титься к подпрограмме RTMI для уточнения сначала отрица- тельного корня уравнения у(х) = 0, а затем — положительного корня. Вычисленные значения корней вы- вести на печать, если корни получены или сообщения об ошибке в противном случае. Схема алгоритма представлена на рис. 5.15. Блок 2 за- дает начальное значение аргумента х, блок 3 организует 300
цикл, блок 4 записывает в матрицу ¥ зна- чения аргумента и функции, блок 5 вычис- ляет текущее значение аргумента х. Блок 6 осуществляет обращение к подпрограмме печати графика функции PLOT, блок 7 — к подпрограмме RTMI для уточнения отри- цательного значения корня уравнения. Блок 8 проверяет значение кода ошибки. Если IER = O, то выводятся на печать значения корня XI и функции Y1 при XI (блок 9), в противном случае выводится значение ко- да ошибки IER. Блоки 11, 12, 13, 14 вы- полняют те же действия для положитель- ного корня уравнения. Подпрограмма поль- зователя с именем F задает вид решаемого уравнения (блоки 16, 17, 18). 2. Сравнивая уточненные значения кор- ней уравнения с приближенными значения- ми, полученными из графика, проверить правильность выполнения программы. Программа, реализующая алгоритм, представленный на рис. 5.15, и записанная на языке ФОРТРАН, имеет вид С лабораторная 11В EXTERNAL F DIHEHSIOH Y(41,2) Х=-2. DO 1 1=1,41 Y(I, i)=X Y(I,2)=(X«X-2. )«2««X 1 X = X+O. 1 CALL PLOT( 1, Y, 41, 2, 41, O) CALL RTMI (X. Y. F, -2. , O. , 1Б-3. 1OO, IER) IF (IER) 2, 3. 2 2 WRITE(6, 4) IER 4 FORMAT (' IER=',I2) GOTO 6 3 WRITE(b, 5) X, Y 5 FORMAT (' X=',F4. 1, * Y=',E12. 5) 6 CALL RTMI (X, Y, F, O. ,2. , IE-3, 1OO, IER) IF (IER) 7.0,7 7 WRITE (6, 4) IER STOP 6 WRITE(6, 5) X, Y STOP EHD FUNCTION F(X) F= (X»X-2. ) «2. ««X RETURH EHD Рис. 5.14 301
Так как в подпрограмму RTMI передается имя подпрог- раммы-функции, составленной пользователем, F, то оно до- лжно быть обязательно описано в основной программе в опе- раторе EXTERNAL. 302
Контрольные вопросы 1. Указать структуру описания подпрограммы БСП язы- ка ФОРТРАН. 2. Указать преимущества, получаемые пользователем, от использования БСП. 3. Перечислить способы хранения матриц, используемые в БСП. 4. Указать особенности использования матриц в БСП и способы их хранения в памяти машины. 5. Указать, как передаются выражения в подпрограм- ме БСП. 6. Указать, как согласуются формальные и фактические параметры подпрограмм БСП. ЛАБОРАТОРНАЯ РАБОТА № 12 ОБРАБОТКА СИМВОЛЬНЫХ ДАННЫХ Цель работы — овладение навыками алгоритмизации и программирования задач, обрабатывающих символьные данные; ввода и вывода символьных данных, их обработки; использования функций обработки символьных данных. Задания для самостоятельной подготовки 1 . Изучить: — правила записи символьных данных (констант, пере- менных, массивов) и их описание; — способы ввода и вывода символьных данных; — способы обработки символьных данных; — использование функций обработки символьных дан- ных; — правила составления программ с использованием символьных данных. 2 . Разработать алгоритм решения в соответствии с за- данием. 3 Составить программу решения задачи. 4 Подготовить тестовый вариант исходных данных. Задание к работе 1. Выполнить на ЭВМ программу обработки символьных данных в соответствии с вариантом, указанным в табл. 5.16. 2. Проверить правильность выполнения программы с по- мощью тестового варианта. 303
Таблица 5.16 Вариант задания Условие задачи 1 Проверить, имеется ли в заданном тексте баланс откры- вающих и закрывающих скобок 2 Для встречающихся в заданном тексте пар рядом распо- ложенных символов указать, сколько раз встречается каж- дое из таких двухбуквенных сочетаний 3 Отредактировать предложение, удаляя из него лишние пробелы, оставляя только по одному пробелу между сло- вами 4 В заданном предложении указать слово, в котором доля гласных (А, Е, I, О) максимальна 5 Для каждого символа заданного текста указать, сколько раз он встречается в тексте. Сообщение об одном символе должно печататься не более одного раза 6 Для каждого слова заданного предложения указать долю согласных. Определить слово, в котором доля согласных максимальна 7 Найти самое длинное симметричное слово заданного пред- ложения, например АККА 8 Отредактировать заданное предложение, заменяя много- точия точкой 9 В заданном предложении найти самое короткое и самое длинное слова 10 Из заданного текста предложения выбрать и напечатать только те символы, которые встречаются в нем только один раз (в том порядке, в котором оии встречаются в тексте) 11 В заданном тексте заменить последовательность симво- лов X (I) иа А (I) и подсчитать число произведенных замен 12 В заданном тексте удалить символ «,» и подсчитать число удаленных символов 13 Из текста выбрать числа и записать в массив N. Количе- ство чисел не более 10 14 Удалить из текста символы «I 1» и подсчитать длину сфор- мированного текста 15 В тексте предложения заменить символ «1_» на сим- волы «,». Конечные символы удалить, не заменяя на запятые. Определить длину предложения. Если в тексте встречается несколько символов «I 1» подряд, то вместо них поставить одну запятую 304
Пример выполнения работы 1. Выполнить на ЭВМ программу, удаляющую из текста пробелы между словами и записывающую в массив N длину (число символов) каждого слова. Длина текста составляет не более 80 символов, число слов — не более 10. Наличие более одного символа «lj» подряд свидетельствует о конце строки. Алгоритм решения следующий. Ввести исходный текст в символьной форме. Организовать цикл для перебора симво- лов текста. Внутри цикла проверить, является ли текущий символ символом Если ДА, то записать в ячейку масси- ва N число символов в слове, далее проверить, не является ли следующий символ также пробелом. Если условие выпол- няется, то строка заканчивается и прекращаются вычисле- ния. В противном случае перемещаются все последующие символы текста на одну позицию влево и продолжается про- смотр текста. Так как текст содержит менее 80 символов, то перед циклом следует определить либо длину текста (строки), ис- пользуя специальную функцию (если таковая имеется), либо организовать цикл и проверить наличие двух символов расположенных подряд, как было показано выше. Если в строке содержится 80 символов, то выход из цикла осуще- ствляется соответствующим образом и в очередную ячейку массива N записывается длина последнего слова. Если 80-й символ является пробелом, то проверить следующий символ нельзя (его не существует) и необходимо сразу вы- ходить из цикла. Схема алгоритма представлена на рис. 5.16. Блок 2 осу- ществляет ввод символьных данных. Блок 3 задает начальные значения (k — количество символов в слове и I — порядко- вый номер слова), которые равны нулю. Блок 4 организует цикл, перебирающий символы текста. Если длина текста определяется до цикла с помощью специальной функции, то конечное значение параметра цикла равно длине текста, а не 80, как указано на схеме. Блок 5 проверяет, является ли текущий символ пробелом. Если НЕТ, то длина слова k увели- чивается на 1 (блок 6) и осуществляется переход к началу цикла для анализа следующего символа. Если текущий сим- вол является пробелом, то блок 7 вычисляет значение /, за- писывает в l-ю ячейку массива N длину слова k. Блок 8 проверяет, не является ли текущий символ «i_j» последним. Если он последний, то осуществляется выход из цикла к блоку 14. В противном случае выполняется блок 9, проверяющий значение следующего символа. Если следую- 305
щий символ является также пробелом, то это означает при- знак конца строки, а следовательно, необходимо выходить из цикла (к блоку 14). Иначе осуществляется переход к блоку 10, который организует цикл для перемещения всех следую- щих символов текста на одну позицию влево (блок 11). После перемещения символов осуществляется переход к началу цикла для его повторения и анализа следующего символа. Блок 13 выполняется при естественном выходе из цикла и записывает длину последнего слова в массив N. Блок 14 вы- водит результаты на печать: преобразованный текст и мас- сив N, содержащий длины слов. 306
2. Проверить правильность выполнения программы для текста ’АВ CDE FGHI В результате должен быть полу- чен текст ABCDEFGHI и значения элементов массива N = = {2, 3, 4). Программы имеют вид: а) на языке БЕЙСИК 5 REH РАБОТА 12 10 DIM НПО), Alt (80) 20 PRIHT "AS=“: IHPUT AS 30 K=O:L=O:H=LEH(AS):PRIHT H 40 FOR 1 = 1 TO H:A1S(I)=HID4(AS, I. 1):HEXT I 45 FOR 1=1 TO M 50 IF A1$(I) = " " THEH 70 60 K=K+1: GOTO 150 70 L=L+1:H(L)=K 80 IF I=H THEH 170 90 IF A1S(I+1)=" “THEM 170 100 FOR J=1 TO H-l 110 AIS(J)-AIS(J+l) 120 HEXT J 130 A1S(H)=* -:K=1 150 HEXT I 160 H(L)=K 165 A1S(H-L)=" • 170 FOR 1=1 TO M :PRIHT AIS (I) ; HEXT IcPRIHT 1BO FOR 1=1 TO L :PRIHT H(I);:HEXT I 190 EHD б) на языке ФОРТРАН С лабораторная 12 DIHEHSIOH Н(1О) CHARACTER«80 А READ (5, 1) А 1 FORMAT (А80) К=О L=0 DO 2 1 = 1, 60 IF(A(I: I). EG. ’) THEH L>=L>+1 H(L)=K IF(I. EQ. 60) GOTO 4 IF(A(I + 1, IM). EQ. • ') GOTO 4 DO 3 J=I, 79 3 A(J, J)=A(J+1, Jfl) K=1 e1.SE K=K+1 EHD IF 2 COHTIHUE H(Ltl)=K 4 WRITE(5. 5) A. H 5 FORMAT (А80/1013) STOP EHD 307
в) на языке ПАСКАЛЬ PROGRAM LR12 (IHPUT,OUTPUT); LABEL 4; COHST ИА=ВО; VAR H:ARRAT[1..1O) OF INTEGER; I, J,K,L:IHTEGER; A:STRIHG[HA]; BEGIH READLH(A); K:=O; L:=O; FOR I:=l TO HA DO IF (A[IJ=’ ') THEH BEGIH L:=L*1; H[L]:=K; IF(I=HA) THEH GOTO 4; IF(A[IM]=' ’) THEH GOTO 4; FOR J:=I TO HA-1 DO AIJ]:=A(J*1]; K:=l EHD ELSE K:=K«1; H[L*1]:=K; 4:WRITELH(A); FOR l:zi TO L DO WRITELH (H[I]:5); READLH (I) EHD. В программах после перемещения символов на одну позицию влево осуществляется запись в последнюю позицию строки символа «1_I», чтобы исключить повторение послед- него символа, если он не является символом Контрольные вопросы 1. Указать области применения символьных данных. 2. Указать способы записи символьных констант. 3. Указать, какие операции можно выполнять над сим- вольными данными. 4. Указать способ описания символьных данных. 5. Назвать специальные функции, используемые для об- работки символьных данных. ЛАБОРАТОРНАЯ РАБОТА № «3 ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ ДАТЧИКОВ СЛУЧАЙНЫХ ЧИСЕЛ Цель работы — овладение навыками алгоритмизации и программирования задач с использованием датчиков слу- чайных чисел, способами получения случайных чисел с раз- 308
личными законами распределения, навыками оценки качества псевдослучайных чисел и их соответствия заданному закону распределения. Задания для самостоятельной подготовки 1. Изучить: — способы получения случайных чисел с различными законами распределения; — способы использования в программах обращений к функциям или подпрограммам для получения псев- дослучайных чисел с различными законами распреде- ления; — способами использования случайных чисел для мо- делирования. 2. Разработать алгоритм решения в соответствии с за- данием. 3. Составить программу решения задачи. 4. Подготовить тестовый вариант программы и исходных данных. Задание к работе 1. Выполнить на ЭВМ программу в соответствии с вари- антом, указанным в табл. 5.17. Таблица 5.17 Вариант задания Условие задачи 1 Сгенерировать последовательность случайных целых чи- сел, равномерно распределенных в диапазоне [0, 10]. После- довательность состоит из 100 чисел. Вычислить их среднее значение, дисперсию. Построить гистограмму полученного распределения, разбив диапазон на десять интервалов 2 Сгенерировать последовательность 100 случайных чисел с нормальным законом распределения (mx = 5, dx = 4). Вы- числить их средине значения и дисперсии. Построить гисто- грамму для полученного распределения, разбив числа на десять интервалов 3 Сгенерировать последовательность 100 случайных чисел с экспоненциальным законом распределения с парамет- ром Х = 2. Вычислить среднее значение и дисперсию. По- строить гистограмму для полученного распределения, раз- бив числа на десять интервалов 309
Продолжение табл. 5.17 Вариант задания Условие задачи 4 Сгенерировать две последовательности по 50 случайных чисел с равномерным распределением в диапазоне [1,6]. Полученные последовательности расположить в одном мас- сиве по возрастанию. Вычислить среднее значение и диспер- сию для полученной последовательности и вывести на печать в виде гистограммы, разделив диапазон на десять интер- валов 5 Сгенерировать последовательность 100 случайных чисел с равномерным законом распределения в диапазоне [0, 100]. Упорядочить полученную последовательность по возраста- нию. Образовать новую последовательность, состоящую из разности соседних элементов последовательности (х, — х,_|). Для полученной последовательности определить среднее значение, дисперсию и вывести на печать гистограмму рас- пределения, разделив диапазон на десять интервалов 6 Сгенерировать последовательность 100 случайных чисел с нормальным законом распределения (тЛ = 1, d,= l). Упорядочить полученную последовательность, расположив элементы по возрастанию. Образовать новую последова- тельность, состоящую из разности соседних элементов (х, — х,1). Для полученной последовательности вычислить среднее значение, дисперсию и вывести ее на печать в виде гистограммы, разбив диапазон на десять интервалов 7 Сгенерировать последовательность 100 случайных чи- сел х, с экспоненциальным законом распределения с пара- метром Х = 0,1. Сформировать новую последовательность, состоящую из элементов у, = у,_|-|-х, (yi=Xi). Для получен- ной последовательности вычислить среднее значение, дис- персию и вывести ее иа печать в виде гистограммы, разделив диапазон на десять интервалов 8 Сгенерировать последовательность 100 случайных чисел х, с равномерным законом распределения в диапазоне [1, 10]. Сформировать новую последовательность, состоящую из элементов у, = у, ,+х, (i/i=xi). Для полученной последова- тельности вычислить среднее значение, дисперсию, вывести ее на печать в виде гистограммы, разделив диапазон на десять интервалов 310
Продолжение табл. 5.17 Вариант задания Услоаие задачи 9 Сгенерировать последовательность 100 случайных чисел х, с нормальным законом распределения (m, = 5, d„ = 2). Сформировать новую последовательность, состоящую из элементов у,=у,- । + х, (i/i=Xi). Для полученной последова- тельности вычислить среднее значение, дисперсию и вывести ее на печать в виде гистограммы, разбив диапазон на десять интервалов 10 Сгенерировать последовательность 100 случайных чисел с экспоненциальным законом распределения с параметром к = 0,5. Упорядочить полученную последовательность, рас- положив элементы по возрастанию. Образовать новую после- довательность, состоящую из разности соседних элементов (х,—Для полученной последовательности вычислить среднее зиачеиие, дисперсию и вывести ее на печать в виде гистограммы, разбив диапазон на десять интервалов 11 Сгенерировать три последовательности по 30 случайных чисел каждая. Числа в каждой последовательности равно- мерно распределены в диапазонах |0, 5], [2, 8], [4, 10|. Свести их в одни массив, расположив по возрастанию. Для сфор- мированного массива вычислить среднее зиачеиие, диспер- сию и вывести результаты на печать в виде гистограммы, разбив диапазон [0, 10] на десять интервалов 12 Сгенерировать три последовательности по 30 случайных чисел. Числа в каждой последовательности распределены по нормальному закону с параметрами (mx = 2, Фх=4), (mx=3, dc = 3), (mx—4, dx = 4). Свести все числа в один мас- сив, упорядочив по возрастанию. Для сформированного массива вычислить среднее значение, дисперсию и вывести иа печать результаты в виде гистограммы, разбив диапазон на десять интервалов 13 Сгенерировать три последовательности по 30 случайных чисел. В каждой последовательности числа распределены по экспоненциальному закону с параметрами 1=2, 1=3, 1 = 4. Свести числа в один массив, упорядочив их по воз- растанию. Для сформированного массива вычислить сред- нее значение, дисперсию и вывести результаты на печать в виде гистограммы, разбив диапазон чисел на десять интервалов 311
Продолжение табл. 5.17 Вариант задания Условие задачи 14 15 Сгенерировать последовательность из 50 случайных чисел с равномерным законом распределения в диапазоие [0, 10] и 50 случайных чисел с нормальным законом распределения (mx = 5, d«=4). Все числа свести в массив, расположив их по возрастанию. Вычислить среднее значение, дисперсию и вывести результаты на печать в виде гистограммы, разбив последовательность чисел на десять интервалов Сгенерировать последовательность из 50 случайных чисел с нормальным законом распределения (mx = 5, dx = 4) и по- следовательность из 50 случайных чисел с экспоненциаль- ным законом распределения с параметром Х = 5. Все числа свести в массив, расположив их по возрастанию. Вычислить среднее значение, дисперсию и вывести результаты на пе- чать в виде гистограммы, разбив последовательность чисел на десять интервалов 2. Проверить правильность выполнения программы с по- мощью тестового варианта. Пример выполнения работы 1. Выполнить на ЭВМ программу для решения следую- щей задачи. Сгенерировать последовательность чисел, полу- ченную в результате соединения шести последовательностей по 30 случайных чисел в одну с экспоненциальным законом распределения с параметрами Х, = 1; Хг=1,5; Хз=1,8; 14 = 2; 15 = 2,3, Хб = 3. Полученную последовательность упорядочить по возрастанию, вычислить среднее значение, дисперсию и вывести на печать в виде гистограммы, разбив диапазон на десять интервалов. Для получения последовательности из 30 случайных чи- сел с экспоненциальным законом распределения с парамет- ром 1, необходимо организовать цикл, который должен выпол- няться 30 раз. Внутри цикла необходимо обращаться к под- программе получения равномерно распределенного случайно- го числа хь из диапазона [0,1], вычислять по формуле Zk = — 1/1* In Xk случайное число с экспоненциальным законом распределения с параметром 1,. Полученное число следует записать в массив R. Если этот цикл поместить внутри друго- го цикла, который выполняется 6 раз и перебирает параметры 312
то после окончания внешнего цикла в массиве R будет размещено 180 чисел. Далее необходимо организовать двойной цикл, в котором следует упорядочить элементы массива R по возрастанию. Во внешнем цикле следует накапливать сумму элементов масси- ва R и сумму их квадратов. После окончания цикла необходи- мо вычислить среднее значение и дисперсию по формулам: 1 п 1 9 — тг. где п = 180. Для построения гистограммы необходимо определить ди- апазон представления чисел как Rmax — Rrnin- Так как в масси- ве R элементы расположены по возрастанию, то Дгаах = Д180, /?п11п = /?1. Затем необходимо выбрать ширину интервала Л = (Дтах — Rmin)/10 и в двойном цикле подсчитать, сколько чисел входит в интервалы Ят1п + Л), (Дга1п+Л, Дт!п + 2Л) и т. д. Количества чисел, входящие в каждый из интервалов, записать в массив N. При этом первый элемент массива N равен количеству чисел в первом интервале, второй эле- мент — количество чисел во втором интервале и т. д. Для вывода на печать гистограммы организуем цикл, который выполняется 10 раз. При каждом выполнении цикла необходимо выводить на печать символы (например, симво- лов «*») в количестве, равном значению элемента массива N. При этом в каждой строке отпечатается столько символов «*», сколько чисел было в соответствующем интервале, а ко- личество строк, занимаемых гистограммой, станет равным 10. Может оказаться, что количество чисел, попавших в некото- рые интервалы, будет больше количества позиций в строке печатающего устройства (или экрана дисплея). В этом случае необходимо прибегнуть к масштабированию. Для этого в цик- ле, где подсчитывалось количество чисел в каждом интерва- ле, необходимо найти максимальное значение из этих коли- честв nmax. Тогда, если ширина поля, отведенного под гистог- рамму, равна L, то масштаб выбирается из формулы Л} = £/птах. При построении гистограммы количество симво- лов «*» определяется из выражения nzL/nmax. Схема алгоритма решения задачи представлена на рис. 5.17. Блок 2 осуществляет ввод L — числа позиций, отводимых под гистограмму, и массива А, состоящего из шести элементов. Внутренний цикл, который открывается блоком 5, организует вычисление последовательности из 313
Рис. 5.17
Рис. 5.17 (продолжение)
30 чисел. Блок 6 организует обращение к подпрограмме получения случайного, равномерно распределенного числа. Блок 7 вычисляет число с экспоненциальным законом распре- деления. Блок 8 вычисляет текущий номер (индекс) N0M элемента, необходимый для записи в массив R (блок 9). Начальное значение NOM задается перед внешним циклом (блок 3). Блок 10 вычисляет сумму элементов экспоненциаль- ной последовательности и сумму их квадратов, начальные значения этих сумм заданы перед циклом блоком 3. После окончания внутреннего цикла осуществляется переход к на- чалу внешнего цикла (к блоку 4), который задает новое значение индекса i и тем самым обеспечивает выбор нового значения X,- при следующем выполнении внутреннего цикла. После окончания внешнего цикла в массиве R записано 180 случайных чисел, а блок 11 вычисляет их среднее значе- ние и дисперсию. В следующем вложенном цикле производится упорядочи- вание элементов массива R по возрастанию. Для этого во внутреннем цикле (блоки 14. 15, 16) находится наименьший элемент массива и его номер, а во внешнем цикле переставля- ется первый из рассматриваемых элементов массива R и наи- меньший (блок 17). После окончания внешнего цикла эле- менты в массиве R будут упорядочены по возрастанию. В следующем двойном цикле подсчитывается число эле- ментов и,-, попадающих в каждый из десяти интервалов, на которые разбит весь диапазон чисел [/?,, R|80] или [Rrnin, Rmax], а также наибольшее значение из и,-. Для этого перед циклом вычисляется ширина интервала Н (блок 18), задается начальное значение NMAX = 0 (блок 19), начальное значение левой границы интервала RN (блок 20) и начальное значение переменной k (блок 21), назначение которое рассматривается далее. Внешний цикл выполняется 10 раз (на столько интерва- лов разбит весь диапазон чисел) и задает номер интервала I (блок 22). Блок 23 перед внутренним циклом задает на- чальное значение количества элементов п„ попадающих в i-й интервал. Во внутреннем цикле, который открывается блоком 24, подсчитывается количество чисел, попадающих в i-й интервал. Для этого блок 25 проверяет выполнение условия попадания числа в очередной (i-й) интервал. Если это условие выполняется, то блок 26 увеличивает значение п,- на 1; также на 1 увеличивается и значение k и далее осуще- ствляется возврат к началу цикла и очередное его выпол- нение. Так как числа в массиве R упорядочены по возраста- нию, то невыполнение этого условия свидетельствует о том, 316
что необходимо прекращать выполнение внутреннего цикла и выходить из него к блоку 27, который изменяет (увеличива- ет) левую границу интервала на величину Н. Далее в блоках 28 и 29 находится наибольшее из всех ранее вычисленных значений п,- и осуществляется переход к началу внешнего цикла (к блоку 22) и выполнения описанных действий для следующего интервала. При следующем выполнении внутрен- него цикла (блоки 24, 25, 26) не имеет смысла просматривать элементы массива R, начиная с первого, так как элементы массива упорядочены по возрастанию Поэтому в цикле под- считывается значение переменной k, равное количеству эле- ментов массива R, просмотренному при предыдущем выпол- нении цикла, увеличенному на 1. С этого значения и начинает изменяться параметр внутреннего цикла. После окончания внешнего цикла в массиве N располага- ется число элементов, попавших в каждый из интервалов, т. е. их частоты. Следующий вложенный цикл используется для вывода на печать результатов в виде гистограммы. Внеш- ний цикл, который открывается блоком 30, задает номер строки i печатающего устройства. Блок 31 вычисляет количе- ство позиций KOL, которое должен занимать столбец гистог- раммы, выводимый в данной строке. Значение KOL определя- ется с учетом масштаба L/NMAX. Во внутреннем цикле (блоки 32, 33) осуществляется вывод в данной строке симво- лов «*» в количестве, определенном значением переменной KOL. Для того чтобы все эти символы печатались в одной строке, необходимо предусмотреть блокировку перехода на новую строку при выполнении блока печати 33. После оконча- ния внутреннего цикла перед следующим его выполнением необходимо осуществить переход на следующую строку, что выполняется блоком 34, который выводит значение N,, а далее осуществляет переход на новую строку. Блок 35 выводит на печать среднее значение, дисперсию и массив, содержащий количества элементов, попавших в каждый интервал гисто- граммы. В языке программирования ФОРТРАН для вывода ре- зультатов в виде гистограмм можно использовать специаль- ную библиотечную подпрограмму HIST. Программа, реализующая алгоритм, схема которого представлена на рис. 5.17, имеет вид: а) на языке БЕЙСИК 5 RKM РАБОТА 13 10 DIM В(1О).К(1вО),Ы(6) 20 PRIHT "Lz" 30 IHPUT L 40 H1=O:S=O:S1=O 317
50 FOR 1 = 1 TO 6 50 PRIHT -LAMBDA=- 70 IHPUT Li(I) 60 FOR K=1 TO 30 90 Z=-1/L1(I)»LOG(RHD(X)):Hl=H1+1:R(Hl)=Z:S=S+Z:Si=S1+Z«Z 100 HEXT X 110 HEXT I 120 H=S/18O:FOR 1=1 TO 180:S1=S1♦(R(I)-M)*2:HEXT I:D=Si/180 130 FOR 1=1 TO 179 140 R1=R(K):11=Г 150 FOR I=K*1 TO 180 150 IF R(I)>=R1 THEH 180 170 R1=R(I):I1=I 180 HEXT I 190 R(I1)=R(K):R(K)=R1 200 HEXT X 210 H=(R(180)-R(1))/10:H2=0:R2=R(1):X=1 220 FOR 1=1 TO 10 230 H(I)=O 240 FOR J=X TO 180 250 IF R(J)>R2+H THEH 290 260 IF R(J)<R2 THEH 290 270 H(I)= H(I)+1:K=K+1:HEXT J 280 GOTO 300 290 R2=R2iH 300 IF H(I)>H2 THEH H2=H(I) 310 HEXT I 320 FOR 1=1 TO 10 330 X3=H(I)«L/H2 340 FOR J=1 TO X3:PRIHT "*";:HEXT J 350 PRIHT H(I) 360 HEXT I 370 PRIHT M.D 360 EHD б) на языке ФОРТРАН С лабораторная 13 DIHEHSIOH Н(1О) REAL LAMBDA (6). R( 160). MX READ (5.1) L, LAMBDA 1 FORMAT(12/6F4. 1) HOM=O s=o. S1=O. DO 2 1=1. 6 DO 2 K=l, 30 CALL RAHDU (121. IY. X) Z=-l. /LAMBDA(I)*ALOG(X) HOM=HOM*1 R(HOM)=Z 2 S = S+Z MX=S/16O DO 14 1=1. 160 14 SI=S1+(R(I)-MX)*»2 DX=S1/16O DO 3 K=l. 79 RMIH=R(K) IMIH=K K1=K+1 DO 4 I=K1,160 IF(R(I) . GE. RMIH) GOTO 4 RMIH=R(I) 318
4 COHTIHUE R(IHIH)=R(K) 3 R(K)=RHIH HMAX=O H= (R (160) -R ( i ) )/1О. K=1 RHxR(l) DO 5 1 = 1, IO H(I)-O DO 6 J=K,180 IF(R(J). LT. RH. OR. R(J). GT. RH+H) GOTO 7 H(I)=H(I)+1 K=K+1 6 COHTIHUE GOTO 5 7 RN-RN+H 5 IF (H (I) . GT. HMAX) HMAX=H(I) DO 8 1=1, IO KOL=H (I ) «L/HMAX+O. 5 DO 9 «1=1, KOL 9 WRITE(8, IO) IO FORMAT('+','*') WRITE(8, 11) H(I) 11 FORMAT('♦' , 13) 6 WRITE( 6, 12) 12 FORMAT(' ') WRITE(8. 13) MX, DX 13 FORMAT(2E12. 4) STOP EHD в) на языке ПАСКАЛЬ PROGRAM LR1 3( IKPUT, OUTPUT) ; LABEL 10, 15; CONST HL=6; HH=10; HK=30; HR=180; VAR I.J.K,KI,KOL, 1И1Н, UMAX, L, HOM:IHTEGER; S, SI, MX, DX. RMIN, RMAX, Z, H, X, RN: REAL; H: ARRAY!1. . HN] OF INTEGER; LAMBDA: ARRAY [ 1. . HL] OF REAL; R; ARRAY[1.. HR] OF REAL; BEGIH WRITELH ( ' ВВЕДИТЕ ЗНАЧЕНИЕ L' ) ; READ(L); WRITELH('ВВЕДИТЕ ЗНАЧЕНИЯ LAMBDA'); FOR I:=l TO HL DO READ(LAMBDA!I]) ; HOM:=0; S:=0; SI: =O; FOR I:=1 TO HL DO FOR K: =1 TO HK DO BEGIH X: = RANDOM; Z: =-1/LAMBDA(I]»LH(X); NOH:=HOM>1; R [HOM]: =Z; S: = S+Z; END; MX: хБ/180; FOR I: = 1 TO HR DO SI :=S1+SOR(R[I] -MX); DX:=S1/18O; FOR K:=l TO HR-1 DO BEGIH 319
RHIH: =R[K] ; IHIH: =K; Kl:sK+l; FOR I:=K1 TO HR DO IF R[I]<RMIH THEH RMIH:=R[I]; R[IMIH]:=R[K]; R[K]:= RMIH EHD; NMAX: =0; И: = (R[HR]-R [ 1 ] )/1О; K: =1; RN: =R[1]; FOR I:si TO HH DO BEGIH H[I]:=O; FOR J: =K TO HR DO BEGIH IF (R[J]<RH) OR (R[J}> (RH+H| ) THEH GOTO 1O ; H[I]:=H[I1+1; K:=K+1; EHD; GOTO 15; 10:RH:-RE+H; 15:IF H[I]>NMAX THEH NHAX:-H[I]; EHD; FOR I:al TO HH DO BEGIH KOL:=(H[I]*L) DIV NMAX; FOR J:=l TO KOL DO WRITE ('»'); WRITE (H[I):4); WRITELH; EHD; WRITELH ГИХ=*.МХ. ' ' : 4, ' DX= *, DX) EHD. В отличие от схемы алгоритма в программе на языке ФОРТРАН для блока 25 проверяется обратное условие (усло- вие непопадания элемента в интервал). Оператор печати с меткой 9, находящийся во внутреннем цикле, осуществляет печать строки символов «*». Блокировку перехода на новую строку осуществляет управляющий сим- вол « + », указанный в операторе 10 FORMAT. Оператор печати с меткой 8 осуществляет переход на новую строку. Вместо последнего двойного цикла можно было записать оператор CALL HIST (1, N, 10), осуществляющий обращение к подпрограмме печати гистограммы. Однако в этом случае массив N должен быть действительного типа. В программе на языке БЕЙСИК по сравнению со схемой алгоритма произведена следующая замена переменных: LAMBDA на Ll, NOM на Nl, MX на М, DX на D, RMIN на Rl, IMIN на II, NMAX на N2, RN на R2. В программе блок 25 реализован с помощью двух условных операторов (строки 320 и 330), проверяющих противоположные условия. 2. Оценить правильность выполнения программы и ее качество, сравнив полученные при выполнении программы 320
значения среднего и дисперсии с рассчитанными по формулам значениями. Контрольные вопросы 1. Указать способы получения псевдослучайных чисел с различными законами распределения. 2. Указать примеры задач, при решении которых удобно использовать датчики псевдослучайных чисел. 3. Оценить качество последовательностей псевдослучай- ных чисел по средним значениям и дисперсиям по сравнению с аналитическими их значениями. ЛАБОРАТОРНАЯ РАБОТА № 14 РАЗРАБОТКА ДИАЛОГОВЫХ ПРОГРАММ Цель работы — овладение навыками алгоритмизации и программирования задач диалогового типа; знакомство с особенностями организации ввода и вывода в диалоговых программах; овладение способами анализа сообщения пользо- вателя в диалоговой программе и способами принятия реше- ния в диалоговых программах. Задание для самостоятельной подготовки 1. Изучить: — виды диалоговых программ; — способы анализа ответов пользователя; — способы сравнения символьных строк, выделения из них подстрок; — способы преобразования символьной информации; — способы реализации алгоритмов принятия решений и обработки статистики. 2. Разработать алгоритм решения в соответствии с за- данием. 3. Составить программу решения задачи. 4. Подготовить тестовый вариант программы и исходных Данных. Задание к работе 1. Выполнить иа ЭВМ программу в соответствии с вари- антом, указанным в табл. 5.18. 11 В. Е. Алексеев и др. 321
Таблица 5.18 Вариант задания Условие задачи I Составить программу для проверки знания учащимся таб- лицы умножения целых чисел NX.M, где N и М — числа из диапазона (0,20). Количество вопросов равно 10. Про- грамма должна проверять правильность ответа. Если он правильный, то вывести сообщение «Правильно» и выдать следующий вопрос. Если ои неправильный, то вывести сооб- щение «Неправильно», снова ответить иа вопрос и вернуть- ся к тому же вопросу. По результатам контроля определить оценку учащегося следующим образом: «5» — если правильных ответов с первой попытки не ме- нее 10; *4» — если правильных ответов с первой попытки не ме- нее 8; «3» — если правильных ответов с первой попытки не ме- нее 6; «2» — в остальных случаях. Следующий вопрос может быть предложен учащемуся только в случае правильного ответа на предыдущий вопрос 2 Составить программу, проверяющую правильность вы- числения площади треугольника по заданным сторонам (по формуле Героиа). Обучаемому предлагается шесть задач. Обучаемому предлагается вопрос и три числа а, Ь, с, решив задачу он должен ввести ответ. Если ответ правильный, то обучаемому предлагается следующий вопрос и сообщение «Правильно». В противном случае обучаемому предлагается снова ответить на вопрос. Если повторный ответ также не- правильный, то предложить вычислить сначала р = = (а + Ь + с)/2, затем xi=p(p— a), X2 = xi (р — Ь), далее хз = х2 (р — с) и s = t/xY. После трех неудачных попыток отве- тить на вопрос, выдать обучаемому правильный ответ и предложить следующий. Переход к следующей задаче воз- можен только после правильного решения предыдущей. Подсчитать число правильных ответов на задачи с первой попытки. Программа должна анализировать достоверность исходных данных Составить программу, проверяющую правильность записи оператора ввода двух переменных (простых или индексных). При анализе правильности ответа учитывать все синтакси- ческие возможные последовательности символов в ответе. Если ответ неправильный, то указать место ошибки (номер недопустимого символа в ответе) и причину ошибки. Про- грамму проверить для случая ввода: 1) простых перемен- ных; 2) простой переменной и индексной переменной; 322
Продолжение табл. 5.18 Условие задачи Вариант задания 3) индексной переменной и простой; 4) двух индексных пере- менных. Выбор варианта переменных осуществлять с по- мощью датчика случайных чисел. Задавать десять вопросов. Переход к следующему вопросу возможен только после пра- вильного ответа иа предыдущий. Подсчитать число правиль- ных ответов с первой попытки 4 Составить программу, проверяющую правильность записи оператора вывода. Пояснения см. в варианте 3 5 Составить программу анализа правильности записи опе- ратора цикла типа FOR или DO. Обучаемому задается имя параметра цикла, начальное и конечное значения параметра цикла и шаг его изменения, которые представляются слу- чайными числами или переменными. Программа должна признавать правильными все синтаксически правильные от- веты. Если ответ правильный, то можно предлагать следую- щий вопрос. Если ответ неправильный, то указывать место ошибки (номер недопустимого символа в ответе) и причину ошибки. Выбор параметров осуществлять с помощью дат- чика случайных чисел. Число вопросов равно 5. Переход к следующему вопросу возможен только после правильного ответа на предыдущий. Подсчитать число правильных отве- тов с первой попытки 6 Составить программу, проверяющую правильность орга- низации цикла, используемого для нахождения наибольшего элемента массива. Правильными следует считать любые синтаксически допустимые операторы и их последователь- ности. Анализ операторов осуществлять по очереди. Пере- ход к анализу следующего оператора возможен только в случае правильно записанного предыдущего. Размер мас- сива задать датчиком случайных чисел. Подсчитать общее число ошибок, допущенных при записи фрагмента про- граммы 7 Составить программу для контроля усвоения раздела последовательного и параллельного соединения п сопротив- лений, при этом п — случайное число из диапазона (1, 10). Обучаемому задать три вопроса: 1) чему равно сопротивление цепи, состоящей из п после- довательно соединенных резисторов? 2) чему равно сопротивление цепи, состоящей из п па- раллельно соединенных резисторов? 11* 323
Продолжение табл. 5.18 Вариант задания Условие задачи 3) чему равно сопротивление цепи, состоящее из двух последовательно соединенных цепочек, содержащих по п/2 резисторов? Если ответ правильный, то пред- лагается следующий вопрос. Если ответ неправиль- ный, то предложить ответить на тот же вопрос при но- вом значении п. После трех неудачных попыток выдать правильное решение и перейти к следующему вопросу. Обучаемому поставить зачет, если были получены пра- вильные ответы на все три вопроса. Подсчитать общее количество попыток ответить на каждый вопрос 8 Составить программу, выдающую справку о номерах рейсов самолетов до указанного города, число городов — 10, общее число рейсов — 20. Кроме номера рейса по допол- нительному запросу выдается время вылета самолета, его тип и наличие свободных мест. После каждого запроса о данном рейсе количество свободных мест уменьшается иа 1. Пользователь вводит название города. В ответ иа это выводятся номера рейсов самолетов. Для получения допол- нительных сведений о рейсах вводится его иомер. Если поль- зователь сразу вводит номер рейса, то получает дополни- тельные сведения об рейсе. Вывести на печать сведения о за- просах иа каждый из имеющихся рейсов. Если города или рейса, введенного пользователем, нет, то выдается соответ- ствующее сообщение 9 Составить программу, выдающую справку о номере квар- тиры, в которой проживает жилец. В доме имеется 10 квар- тир и проживает 25 человек. Пользователь вводит фамилию жильца. Если в доме проживает несколько жильцов с такой фамилией, то выдается сообщение о необходимости ввести инициалы. Если инициалы у нескольких жильцов совпадают, то необходимо ввести дополнительно год рождения. Если с такими данными найден один жилец (несколько), то вы- вести иомер (номера) квартиры, где он (они) живет и все введенные о нем (них) сведения. Если жильца с такой фами- лией нет, то вывести сообщение об этом 10 Составить программу, позволяющую производить коррек- тировку программы пользователя путем удаления заданного символа или последовательности символов. Программа вво- дится в память машины и размещается в символьном мас- сиве. Пользователь вводит символ или их последователь- ность, которую надо удалить. Просмотр программы произво- дится пооператорно. Оператор, содержащий заданный сим- 324
Продолжение табл. 5.18 ВаРиаи] Условие задачи вол, выводится на экран. Так как в операторе может быть несколько таких символов или их последовательностей, то пользователь должен дополнительно ввести иомер позиции в операторе, в которой находится удаляемый символ или с которого начинается удаляемая последовательность. После удаления осуществляется сдвиг влево всех символов, сле- дующих за удаленными. После этого скорректированный оператор выводится на экран и осуществляется просмотр следующих операторов программы. Процесс корректировки прекращается по достижении оператора END и выводится иа экран вся программа полностью 11 Составить программу, позволяшую производить коррек- тировку программы пользователя путем замены последова- тельности, состоящей из m символов, иа последователь- ность, состоящую из ns символов. Программа вводится в память машины и размещается в символьном массиве. Пользователь вводит две последовательности, состоящие из П1 и ns символов, в ответ на запрос: I) «введите символы, которые следует заменить»; 2) «введите символы, на кото- рые следует заменить». Программа просматривается по- операторно. Оператор, содержащий заменяемую последо- вательность символов, выводится на экран. Так как в опе- раторе может быть несколько таких последовательностей, то необходимо ввести дополнительно номер позиции, на- чиная с которой осуществляется замена. После этого, если «|>П2, то осуществляется замена п, на пг + й символов, где k — число пробелов, равное «1 — пг- После корректи- ровки следует осуществить сдвиг оставшихся символов опе- ратора на k позиций влево. Если шСпг, то осуществляется сдвиг вправо символов, начиная с указанной позиции, на иг — «1 позиций, а затем замена п2 символов. После этого осуществляется просмотр следующих операторов. Процесс корректировки следует прекратить по достижении опера- тора END и вывести на экран всю программу 12 Составить программу, позволяющую корректировать про- грамму пользователя путем добавления в оператор задан- ной последовательности, состоящей из п< символов. Про- грамма вводится в оперативную память и размещается в символьном массиве. Пользователь вводит последова- тельность символов, после которой необходимо вставить в оператор дополнительные символы. Просмотр программы осуществляется пооператорно. Оператор, в котором найдена указанная последовательность символов, выводится на экран. 325
Продолжение табл. 5.18 Вариант задания Условие задачи 13 14 Поскольку в операторе может быть несколько таких после- довательностей, на запрос программы необходимо ввести номер позиции k, после которой необходимо осуществить вставку и добавляемую последовательность символов. Перед добавлением символов необходимо осуществить сдвиг вправо на m позицию всех символов, начиная с позиции с номером fe-|-1. После этого осуществляется переход к сле- дующему оператору. Процесс корректировки прекращается по достижении оператора END и иа печать выводится вся программа полностью Составить программу, позволящую корректировать про- грамму пользователя путем удаления из иее отдельных опе- раторов (или строк). Программа вводится в память ма- шины и размещается в символьном массиве. Пользователь вводит оператор, подлежащий удалению, или номер строки, в которой он расположен. Для поиска нужного оператора в программе из сравниваемых операторов необходимо уда- лить пробелы, так как при различном их количестве срав- нения не произойдет. Если удаляемый оператор не найден, то следует выдать сообщение об этом и ожидать ввода но- вого оператора, который необходимо удалить. Поскольку в программе может быть несколько одинаковых операторов, перед удалением оператора следует вывести на экран дан- ный оператор и предшествующий ему. а также следующие за ним операторы. Удаление осуществлять в ответ на запрос «Удалить? (ДА, НЕТ)». После удаления оператора необхо- димо все следующие за ним операторы переместить на одну строку вверх и выдать сообщение о том, что удаление за- кончено. Процесс корректировки прекратить, если пользо- ватель введет END, и вывести иа экран всю программу. Оператор END из программы удалять нельзя Составить программу, позволящую корректировать про- грамму пользователя путем добавления в нее одного или нескольких операторов. Программа пользователя вводится в память машины и располагается в символьном массиве. Пользователь вводит номер оператора или оператор, после которого необходимо осуществить добавление одного или нескольких операторов. (О порядке нахождения нужного оператора в программе пользователя см. вариант 13.) Подтверждение о вставке оператора осуществляется в ответ иа запрос «Вставить? (ДА, НЕТ)». После этого в ответ на за- прос «Сколько операторов необходимо вставить? (Введите число) * осуществляется сдвиг последующих операторов про- 326
Продолжение табл. 5.18 Условие задачи Вариант задания граммы на введенное число строк. Затем вставляемые опера- торы записываются вслед за указанной строкой. Процесс корректировки заканчивается в ответ на запрос «Корректи- ровка закончена? (ДА, НЕТ)». Если введено НЕТ, то про- цесс начинается сначала. После окончания вывести иа пе- чать программу полностью 15 Составить программу редактирования программы поль- зователя путем перемещения одного или нескольких опе- раторов и размещения их после указанного оператора. Программа пользователя вводится в оперативную память и размещается в символьном массиве. Пользователь вводит в ответ на запросы системы: 1) гц — порядковый номер оператора (строки), начиная с которого необходимо пере- местить последовательность операторов; 2) гц — порядко- вый номер оператора (строки), кончая которым необходимо осуществить перемещение; 3) пз — порядковый номер опе- ратора (строки), после которой необходимо разместить перемещаемые операторы. Перемещение последователь- ности операторов сводится к удалению (гц—-т + 1)-го оператора (см. вариант 13) и вставке (гц— ni-|-l)-ro опе- ратора (см. вариант 14). Процесс закончить так же, как и в варианте 14 2. Проверить правильность выполнения диалоговой про- граммы с помощью тестового варианта исходных данных. Примечание. В языке ПАСКАЛЬ признаком окончания процесса корректировки является достижение оператора END. (от- нести это к вариантам 10, 11, 12). Примеры выполнения работы 1. Выполнить на ЭВМ диалоговую программу, проверяю- щую знание обучаемым теоремы Виета, Обучаемому выдает- ся основное задание: написать квадратное уравнение, если его корнями являются xl = (число) и х2= (число). Значе- ния корней — случайные числа из диапазона [—9,9]. Если ответ правильный, то можно переходить к следующему за- данию, приняв новые значения корней xl, х2. Если ответ неправильный, то предложить снова ответить на то же за- дание. Если после второй попытки ответ опять не совпал с эталоном, то предложить новые дополнительные вопросы: 327
1) ввести коэффициент перед х в первой степени со знаком; 2) ввести свободный член со знаком. Если оба этих ответа правильные, то признать ответ правильным, вывести его и пе- рейти к следующему заданию. Если ответ на какой-либо из этих заданий неправильный, то можно судить о причине ошибки. Выполнение программы закончить, если подряд три отве- та на вопросы были правильными с первой попытки или общее число вопросов равно 10. В программе предусмотреть помощь обучаемому, подсчитать число основных заданий п, число правильных ответов с первой попытки по, общее число ответов пь По результатам контроля определить оценку: «5», если пв = п; «4», если п — По^.2; «3», если п — п0^4; «2», если п—По>4 или п^К). Алгоритм решения может быть следующим. Организуем цикл по числу основных вопросов I от 1 до 10. Для каждого основного вопроса с помощью датчика равномерно распреде- ленных случайных чисел получим два случайных числа — yt и «/2 из диапазона [0, 1]. Затем вычислим два случайных числа Xi и Хг из диапазона [—9, 9], которые являются корнями квадратного уравнения. Обучаемому выведем сообщение: «Определите квадратное уравнение, если его корни равны х1 = (число), х2 = (число) и введите ответ», где х1 = (чис- ло 1 ) и х2 = (число 2) —значения корней Xi и х2. Сформируем эталон правильного ответа. Для этого в начале программы в массив или строковую переменную W (где размещается эталонный ответ) введем следующую информацию: Х»Х *Х =0 Так как результатом решения задачи является квадратное уравнение вида х2—(Xi 4-х2) х+(Х1Х2)=0 или х2 — Ьх-\-с = = 0. Для простоты потребуем от обучаемого вводить первый член квадратного трехчлена в виде Х*Х. В различных вари- антах задачи значения элементов I, 2, 3, 7, 8. 12, 13 постоян- ны, а значения элементов 5, 6, 10, 11 изменяются и равны значениям бис, как и элементов 4 и 9, являющиеся знаками чисел b и с. В условиях задачи значения b и с могут быть одно- или двухразрядными целыми числами, поэтому каждо- му из этих чисел отводится по два элемента. После вычисления Ь=—(xi+^2) и с = (Х1Х2) необходи- мо элементам W 4, 5, 6 и 9, 10, 11 присвоить значения соответ- ственно b и с вместе с их знаками. Если б>0, то элементу 4 строки присвоим символ « + », в противном случае — сим- вол « — », а элементам 5 и 6 — значение переменной Ь. Анало- 328
гично поступить со знаком с, присвоив его элементу 9 пере- менной W, а элементам 10, 11 — значение с. Если Ь или с являются одноразрядными числами, то в эталоне содержатся пробелы, что может привести к несо- впадению его с правильным ответом, поэтому необходимо удалить пробелы из эталона. Поскольку и ответ может со- держать пробелы, их также необходимо удалить. Чтобы не описывать процедуру удаления пробелов дважды, вынесем ее в подпрограмму. После удаления пробелов из ответа и эталона осуще- ствляется их сравнение. Если ответ и эталон представлены строковыми переменными, то они сравниваются целиком. Ес- ли же они хранятся в массивах А и W, то необходимо органи- зовать цикл, внутри которого ответ и эталон сравниваются поэлементно (последовательно, так как каждый символ явля- ется отдельным элементом массива). Посимвольное сравне- ние приведет к увеличению объема программы и усложнению схемы алгоритма, однако оно позволит установить позицию несовпадения ответа с эталоном и тем самым даст информа- цию о причине ошибки. Рассмотрим случай сравнения ответа с эталоном, пред- ставленным строковыми переменными. Если совпадения не происходит, то увеличи- вается на единицу количество попыток ответить на данный вопрос I. Количество неправильных ответов на данный вопрос и2, общее количество ответов tit, а количество правильных ответов k, данных подряд, считается равным нулю. Затем проверяется условие П2<2, при выполнении которого обучае- мому выдается сообщение об ошибке и предлагается снова ответить на этот же вопрос. Если Иг^2, то осуществляется анализ ответа обучаемого по частям. Если ответ и эталон совпали, то проверяется условие / = 0 (т. е. правильный ответ дан с первой попытки), т. е. на единицу увеличиваются количество правильных отве- тов «о, данных с первой попытки, и количество правильных ответов k, данных с первой попытки подряд. В противном случае значения По и k не изменяются. Затем проверяется условие k<3, если оно выполняется, то выдается сообщение о правильности ответа, изменяется на единицу общее количе- ство ответов «1 и осуществляется переход к новому заданию. Если k^3, то общее количество заданий п принимает значе- ние I и осуществляется выход из цикла Анализ ответа обучаемого по частям осуществляется следующим образом. Обучаемому предлагается первый до- полнительный вопрос: «Введите коэффициент при X в первой 329
степени В». После этого значение В сравнивается со значени- ем Ь, вычисленным в программе (сравнение удобнее вести в числовой форме). Если ответ и эталон совпадают, то пред- лагается второй дополнительный вопрос, в противном случае выясняется, что ошибка вызвана неправильным вычислением значения коэффициента b (о чем дается сообщение обучаемо- му), при этом изменяются значения ni и п2 на единицу и пред- лагается исправить ошибку и снова ответить на этот же вопрос. Цикл повторяется до тех пор, пока не будет получен правильный ответ или обучаемый не попросит помощи. Аналогично анализируется ответ на второй дополнитель- ный вопрос. После получения правильных ответов на оба дополнительных вопроса обучаемому выдается сообщение о правильности, изменяется на единицу значение п, и осуще- ствляется переход к следующему основному заданию. Алгоритм решения задачи должен предоставлять обучае- мому возможность потребовать помощи в любой момент, когда диалоговая программа ожидает ввода отчета обучаемо- го. Для вызова помощи обучаемому необходимо ввести букву «П». Анализ ответа обучаемого в алгоритме осуществляется сравнением с символом «П». Если совпадения не происходит, то продолжается анализ ответа обучаемого описанным выше способом. Если совпадение происходит, то обучаемому выво- дится информация, которую автор программы определил как помощь обучаемому. Например, если обучаемый потребует помощи в ответ на основной вопрос, то в качестве сообщения можно выдать информацию о том, как, зная корни уравнения, определить коэффициент b и свободный член с квадратного уравнения. Если же он потребует помощи при ответе на первый дополнительный вопрос, то сообщение может содер- жать информацию о том, что коэффициент b равен сумме корней уравнения, взятой с обратным знаком, а при ответе на второй дополнительный вопрос — что свободный член равен произведению корней уравнения. Выход из цикла, определяющего номер основного вопро- са, возможен двумя способами: 1) при получении подряд трех правильных вопросов (fe^3), в этом случае n = i, где i — номер последнего вопроса, на который отвечал обучаемый; 2) естественным образом, после того как цикл будет выполнен 10 раз, в это случае п= 10. Обработка статистических данных в этом примере со- стоит в накоплении значений переменных п, п0, «I и определе- нии оценки обучаемого по результатам контроля. Определе- ние значений п, п0 и п\ приводилось выше. При определении оценки необходимо организовать разветвляющийся алгоритм, 330
в ветвях которого проверяется выполнение условий: п = по, п — я0^2; я —я0^4. В конце цикла работы обучаемому можно вывести со- общение о числе вопросов, на которые он отвечал, о числе правильных ответов с первой попытки, о числе попыток отве- тить на вопросы. Подпрограмма, предназначенная для удаления пробелов из ответа и эталона, может быть построена по следующему алгоритму. Организуем цикл по I, который должен выполняться 15 раз (выбрано по количеству символов в ответе или эталоне плюс два пробела). Этот цикл просматривает все символы ответа или эталона и сравнивает их с символом пробела. Если происходит совпадение для /г-го элемента, то элементы, на- чиная с (^ + 1)-го до последнего, переписываются на место элементов, начиная с k-ro. Если эталон и ответ обучаемого хранятся в символьном массиве, то необходимости в подпрограмме, предназначенной для удаления пробелов, нет, так как анализ ответа и эталона осуществляется посимвольно и каждый раз, когда в них будут появляться символы «ш», необходимо их удалять, как это делалось в подпрограмме, либо игнорировать и брать для анализа следующий символ. Схема алгоритма решения представлена на рис. 5.18. Блок 2 задает начальные значения я, Яо, Я1 и k, равные нулю. Блок 4 задает начальное значение строковой переменной W, предназначенной для хранения эталона. Блок 3 организует цикл по номеру вопроса 1, блок 5 задает начальные значения / и я2, равные нулю. Блоки 6 и 8 осуществляют обращение к подпрограмме для получения равномерно распределенных случайных чисел yt и у% в диапазоне [0, 1], а блоки 7 и 9 вы- числяют значения случайных чисел xt и хг в диапазоне [ — 9,9]. Блок 10 вычисляет значение коэффициента Ь при * в первой степени и свободного члена с. Блок 11 проверяет знак переменной Ь и записывает в 4-ю позицию эталона Символы « + » или «—» (блоки 12, 13), а блок 14 записывает в позиции 5 и 6 число, соответствующее Ь, в символьной форме. Блоки 15, 16, 17, 18 выполняют те же действия, что и блоки 11, 12, 13, 14, но только для переменной с. Блок 19 осуществляет обращение к подпрограмме для удаления пробелов из эталона, блок 23 — из ответа обучаемого, кото- рый перед этим вводится с помощью блока 22. Блок 24 про- веряет, не является ли ответ обучаемого обращением за помощью: если «да», то ему выдается сообщение 2 (блок 25), содержащее помощь, и далее осуществляется переход к блоку 331
Ill
Рис. 5.18 (продолжение)
Рис. 5.18 (продолжение) 28, в противном случае с помощью блока 26 производится анализ ответа обучаемого. Если ответ не совпадает с этало- ном, то увеличиваются на единицу значения ni и пч, при- сваивается k значение ноль (блок 28), проверяется с по- мощью блока 30 условие, что данный ответ является первым неправильным ответом на данный вопрос. Если это условие выполняется, то выводится сообщение 4 (блок 36) и осуще- ствляется возврат к тому же заданию (к блоку 21), а в про- тивном случае — переход к анализу ответа по частям, кото- рый начинается с блока 32. Если условие A = W (блок 26) выполняется, т. е. ответ правильный, то с помощью блока 27 проверяется условие 1 = О (ответ правильный с первой попытки). Если это условие выполняется, то п0 и k увеличиваются на единицу (блок 29) и далее осуществляется переход к блоку 31. Если условие не выполняется, то сразу осуществляется переход к блоку 31, который проверяет условие /г^З (было получено подряд три 334
правильных ответа). При выполнении условия п получает значение «-го номера текущего основного вопроса (блок 35) и осуществляется переход к обработке статистических дан- ных (к блоку 47). Если условие k^3 не выполняется, то обучаемому выдается сообщение 3, подтверждающее пра- вильность ответа (блок 33), осуществляется переход к блоку 34, увеличивающий значение nt на единицу, и далее переход к блоку 3 для выполнения действий над следующим основным заданием. Обработка ответа по частям начинается с выдачи со- общения 5 (текста первого дополнительного вопроса) с по- мощью блока 32. Блок 37 осуществляет ввод ответа на этот вопрос. Блок 38 осуществляет анализ правильности ответа. Если ответ правильный, то осуществляется переход к следую- щему дополнительному вопросу (блок 39). В противном слу- 335
Рис. 5.18 (продолжение) чае выдается сообщение 7, указы- вающее причину ошибки, изменяют- ся значения п\ и пг на единицу и осуществляется переход к блоку 32 (возврат к тому же вопросу). Аналогично с помощью блоков 39, 41, 43, 44, 45 производится ана- лиз ответа на второй дополнитель- ный вопрос. Блоки 47, 48, 49, 50, 51, 52, 53 определяют оценку обучаемого, по- лученную по результатам контроля, и выводят сообщение о ней. Блок 54 выводит заключительное сообщение, в котором указывается: число вопро- сов, на которые отвечал обучаемый п; число вопросов, иа которые он ответил правильно с первой попытки п0; число сделанных попыток отве- тить на вопросы ль На этом цикл работы с диалоговой программой заканчивается. Далее приведена схема алгорит- ма, реализованного в подпрограмме, предназначенной для удаления про- белов из ответа обучаемого и эта- лона. Программы, реализующие алгоритм, представленный на рис. 5.18, имеют вид: а) на языке БЕЙСИК 5 REH РАБОТА 14 Ю Н=О:И1=0:НО=О:К-О 20 FOR 1=1 ТО 1О 30 Ь=О:И2=О 40 Xl = IKT(16*RKD (1)-9):Х2=IKT(16hRKD(1)-9) 50 В=-(Х1«Х2):C=Xl*X2:F$="X*X":G$=-»Xe:E$=STR$(В):H$=STR$(C) 60 IF В<0 ТНЕН ЮО 65 В1$-ети$(в) 70 IF LEH(Bi$)=3 ТНЕН E*=MID$ (В1$, 2, 2) 60 IF LEH(B1$)=2 ТНЕН E$=MID$ (Bl$, 2, 1) 90 Ff="X*X+" ЮО IF C<0 THEH 140 105 C1$=STR*(C) 110 IF LEH(C1$)=3 THEH H$=HID$(Cl$. 2, 2) 120 IF LEH(C1$)=2 THEH H$ = HID> (Cl$, 2, 1) 130 G$=-*X+- 140 V6=F$+E6+G$+H$+e=O“:PRIKT W» 150 PRIKT -ВВЕДИТЕ КВАДРАТНОЕ УРАВНЕНИЕ, ЕСЛИ ЕГО КОРНИ РАВНЫ" 160 PRIKT Х1=-:Х1:"Х2=":Х2 165 A16(H-L)=" 170 IHPUT А* 160 IF А$о-П- THEH 230 190 PRIKT -КОЭФФИЦИЕНТ ПРИ X В ПЕРВОЙ СТЕПЕНИ РАВЕН СУННЕ КОРНЕИ" 200 PRIKT -С ОБРАТНЫЙ ЗНАКОМ, А СВОБОДНЫЙ ЧЛВ1 РАВЕН ИХ ПРОИЗВЕДЕНИЮ- 210 PRIHT “СНОВА ОТВЕТЬТЕ НА ВОПРОС- 336
его goto eso гзо if a*=v* ТНЕИ гео ____ 240 PRIHT "НЕВЕРНО. ПРОВЕРЬТЕ ВЫЧИСЛЫШЯ И СНОВА ВВЕДИТЕ ОТВЕТ" 250 Н1-Н14-1:Н2=Н2М:КзО 260 if иг«г тнен iso 270 GOTO 330 260 IF LOO THEH 300 290 KO=HO*l:K=K*i 300 IF K>3 THEH 450 310 PRIHT "ПРАВИЛЬНО. ОТВЕТЬТЕ НА СЛЕДУКЖИИ ВОПРОС" 320 Hl =!«-!: GOTO 430 _____ 330 PRIHT "ВВЕДИТЕ КОЭФФИЦИЕНТ ПРИ X В ПЕРВОЙ СТЕПЕНИ" 340 IHPUT ВО 350 IF В=В0 ТНЕН 390 360 PRIHT "НЕВЕРНО. КОЭФФИЦИЕНТ РАВЫ! СУННЕ КОРНЕИ С ОБРАТНЫЙ ЗНАКОМ" 370 PR1HT -ИСПРАВЬТЕ ОИИБКУ И СНОВА ОТВЕТЬТЕ НА ВОПРОС" 360 Н1-Н1 + 1: И2 = И24-1: GOTO 330 390 PRIHT "ВВЕДИТЕ ЗНАЧЫШЕ СВОБОДНОГО ЧЛЕНА" 400 IHPUT СО 410 IF С=С0 ТНЕН 310 415 FBI КТ -НЕВЕРНО. СВОБОДНЫЙ ЧЛЕН УРАВНЕНИЯ РАВЫ! ПРОИЗВЕДЕНИЮ КОРНЕИ" 420 Н1 =Н14-1: Н2=Н2 4-1: GOTO 390 430 HEXT I 440 H-1O:GOTO 460 450 H=I 460 IF H=HO THEH PRIHT "ОТЛИЧНО-:GOTO 500 470 IF H-HO<=2 THEH PRIHT "XOPOHO":GOTO 500 460 IF H-H0<x4 THEH PRIHT "УДОВЛЕТВОРИТЕЛЬНО": GOTO 500 490 IF И-И0>4 THEH PRIKT "НЕУДОВЛЕТВОРИТЕЛЬНО- 500 EHD В программе эталон формируется внутри цикла не за- сылкой необходимых символов в нужные позиции, а путем объединения констант, переменных и функций в одну строко- вую переменную. Поэтому в переменной W нет лишних про- белов, если засылать целую константу без знака, и нет надо- бности в подпрограмме для их удаления. Правда, чтобы исключить их нежелательное появление в ответе обучаемого, необходимо после текста вопроса дать указание о недопусти- мости пробелов в ответе. 6) на языке ФОРТРАН-77 CHARACTER *15 A.W IHTEGER Xl.X2»Yi.Y2,B1Bi.C1Ct.B2,C21B0,C0 Н=О Н0=О Н1=О К=0 DO 1О 1-1.10 W-’X*X »Х =0' L=0 нг=о CALL RAHDU(l.IY.Tl) Х1=16»Т1-9 CALL RAHDU(1.IY.Y2) X2=16»Y2-9 В--(Х1*Х2) C=X1«X2 IFW.GT.OJTHEH V(4:4)x'+* ELSE V(4:4)='-’ EHDIF B1=ABS(B)/1O ва»в-в14гю W(5:5)=CHAR(Bi) W(6:6)=CHAR(B2) IF (Bl.EQ.O) W(5:6)=' IF (C.GT.O) ТНЕИ W(9:9)='V ELSE W(9:9)-'-’ 12 B. E. Алексеев и др. 337
EHDIF С1=АВБ(С)/10 C2=C-C1»1O V(1O:1O)=CHAR(C1) W(il:ll)-SHAR(C2) IF (Cl.EQ.О) W(1O:1O)=’ CALL PP(V) 20 A=' VRITE(a.l) X1.X2 1 FORMAT!' ВВЕДИТЕ КВАДРАТНОЕ УРАВНЕНИЕ, ЕСЛИ ЕГО КОРНИ РАВНЫ'/ * *xi='.iarx2='.i2j READ!5,6) А б FORMATIA15) CALL РР(А) IF (А-НЕ.'П') GOTO 2 WRITE{6,7) 7 FORMАТ(' КОЭФФИЦИЕНТ ПРИ X В ПЕРВОМ СТЕПЕНИ РАВЕН СУННЕ КОРНЕИ'/ С ОБРАТНЫМ ЗНАКОМ.А СВОБОДНЫМ ЧЛЕН -ПРОИЗВЕДЕНИЮ КОРНЕИ'/ * ИСПРАВЬТЕ ОНИБКУ И СНОВА ОТВЕТЬТЕ НА ВОПРОС') GOTO 3 г IF (A.HE.W) GOTO 3 IF (L.EQ.0) THEH HO=HO+1 K=K+L EHDIF IF (K.GE.3) GOTO 17 16 WRITE!6.6) в FORMAT!' ПРАВИЛЬНО.ОТВЕТЬТЕ НА СЛЕДУЮЖНИ ВОПРОС') Н1=Н1+1 GOTO 10 3 Н1Н1+1 нг=иг+1 к=о IF (H2.GE2) GOTO 4 WRITE(6,9) 9 FORMAT!' НЕВЕРНО.ПРОВЕРЬТЕ ВЫЧИСЛЕНИЯ И СНОВА ОТВЕТЬТЕ НА ВОПРОС') goto го 4 WRITE(6,11) 11 FORMAT!' ВВЕДИТЕ КОЭФФИЦИЕНТ ПРИ X В ПЕРВОЙ СТЕПЕНИ') READ{5.12)BO 12 FORMATII3) IF (BO.EQ.B) GOTO 5 WRITE!6,13) 13 FORMATCHEBEPHO. ПРОВЕРЬТЕ ВЫЧИСЛЕНИЯ И СНОВА ОТВЕТЬТЕ НА ВОПРОС') Н1=И1+1 нг=И2+1 GOTO 4 5 WRITE(6,14) 14 FORMAT!' ВВЕДИТЕ ЗНАЧЕНИЕ СВОБОДНОГО ЧЛЕНА') READ!5.151 СО 5 FORMAT(I3) IF (CO.EQ.C) GOTO 16 WRITE(6.16) IB FORMATCHEBEPHO.nPOBEPbTE ВЫЧИСЛЕНИЯ И СНОВА ВВЕДИТЕ ОТВЕТ') И1=Н1+1 H2-H2«l GOTO 5 Ю COHTIHUE И=1О GOTO 19 17 H=I 19 IF (H.EQ.MO) THEH WRITE(6.22) GOTO 40 EHDIF 22 FORMAT!' ОТЛИЧНО') IF !H-HO.LE.2) THEH WRITE(6,21) GOTO 40 EHDIF 21 FORMAT('XOPOHO') IF (H-H0.LE.4) THEH WRITE!6,23) GOTO 40 EHDIF 23 FORMAT!' УДОВЛЕТВОРИТЕЛЬНО') IF (H-HO.GT.4) WRITEI6 24) 24 FORMAT!' НЕУДОВЛЕТВОРИТЕЛЬНО') 338
втор EHD SUBROUTIHE PP(V) CHARACTERS V DO 11=1,15 IF(V(I:i)JIE.' ') GOTO 1 DO 2 K=I.i4 V(K:K)=V(K*1:K*1) V (15:15)-’ ’ COHTIHUE RETURH EHD В программе обозначения ВО и СО — ответы обучаемого иа первый и второй дополнительные вопросы. В отличие от схемы алгоритма запись цифр коэффици- ента b в позициях 5 и 6 и свободного члена в позиции 11 и 12 осуществлена посимвольно. Для этого пришлось вычислить В1 и С1 — старшие цифры чисел b и с, а также В2 и С2 — младшие цифры чисел b и с и перед записью в строку W преобразовать их в символьную форму, используя функцию CHAR; в) на языке ПАСКАЛЬ PROGRAM LR14(IHPUT,OUTPUT); LABEL 5.10,15.20,25,30.35,45,50; COHST HV=1O;HA-15; TYPE ST=STRIHGIHA); VAR B,BO,Bl,B2.C,CO.Ci,C2,Xi,X2:IHTEGER; Y1.Y2:REAL; W4.W5.V8.W9,W1O,VU:STRIHG[1); M,N1,I,J,K.L,H,HO,H1,H2:IHTEGER*. A,W:ST; PROCEDURE PP(VAR V-ST); LABEL 1; VAR I,K:IHTEGER; BEGIH M-HA; FOR I.-=i TO MA DO BEGIH IF W[I]<>' ' THEH GOTO 1; H:-H-l; FOR Kssl TO HA-4 DO WIHA*=' 1: EHD; EHD; BEGIH H^0;HO;z0;Hl"O;K:rO; FOR 1=1 TO HV DO BEGIH L=O;H2:-O; Y1:-RAHDOM; Xl=TRUHC(16»Yi-9); Y2:=RAHDOM; X2:-TRUHC(15*Y2-9); B:=-(X1+X2fc C-X1»X2; IF B>O THEH W4:-*V ELSE V4s=*-*; В1:=АВБ(В) DIV IO; B2=ABS(B) MOD IO; STR(B1,V5); STR(B2,V8); IF B1=O THEM ¥5-=' •; IF OO THEE ELSE V9='-'J 12* 339
C1:=ABS(C) DIV 10; C2:=ABS(C) MOD IO; BTR(CI.WIO); STR(C2,WH); IF C1=O THEM WIO:^ W:='X»X'>W4*W5*W6*'«X'+W9+W1O*W11*'=O'; PP(W);M1:=H; 35: A:=' WRITELH ('ВВЕДИТЕ КВАДРАТНОЕ УРАВНЕНИЕ.ЕСЛИ КОРНИ РАВНЫ '.'Х1= ',Х1, • Х2='.Х2); READLH(A); РР(А); IF АО'П* THEH GOTO 5; WRITELM (' КОЭФФИЦИЕНТ ПРИ X В ПЕРВОЙ СТЕПЕНИ РАВЕН СУННЕ КОРНЕИ '); WRITELH (' С ОБРАТНЫМ ЗНАКОМ,А СВОБОДНЫЙ ЧЛЕН ПРОИЗВЕДЕНИЮ КОРНЕИ.'); WRITELH (' ИСПРАВЬТЕ ОН ИВКУ И СНОВА ВВЕДИТЕ ОТВЕТ НА ВОПРОС'); 5: FOR J:=l ТО Ml DO BEGIH IF A[J]OW[J] THEH GOTO 1O;EHD; IF L-O THEH BEGIH HO:-HO*1; EHD; IF K>=3 THEH GOTO 30; 25: WRITELH ('ПРАВНЛЬНО.ОТВЕТЬТЕ НА СЛЕДУЮЦНИ ВОПРОС/); Hi:=Hl*l; GOTO 50; IO: H1“H1*1; Н2*.тН2И; K:=O; IF И2>-2 THEH GOTO 15; WRITELHf ' НЕВЕРНО.ПРОВЕРЬТЕ ВЫЧИСЛЕНИИ H ОТВЕТЬТЕ НА ВОПРОС'); GOTO 35; 15: WRITELHCBBEflHTE КОЭФФИЦИЕНТ HPH X В ПЕРВОЙ СТЕПЕНИ'); READLH(BO); IF BO =B THEH GOTO 20; WRITELH ('НЕВЕРНО.ПРОВЕРЬТЕ ВЫЧИСЛЕНИЕ И СНОВА ВВЕДИТЕ ОТВЕТ'); HlssM*»!; нг^нг+1; GOTO 15: 20: WRITELH ('ВВЕДИТЕ ЗНАЧЕНИЕ СВОБОДНОГО ЧЛЕНА'); READLN (СО); IF СО=С THEM GOTO 25; WRITELH ('НЕВЕРНО.ПРОВЕРЬТЕ ВЫЧИСЛЕНИЯ И СНОВА ВВЕДИТЕ ОТВЕТ'); И1:гИ1«1; Н2:=Н2М; GOTO 20; 50: EHD; И:=1О; GOTO 45; 30: Н;:1; 45: IF И=НО THEM WRITELH ('ОТЛИЧНО') ELBE IF (H-H0)<=2 THEM WRITELM ('XOPOMO') ELBE IF (H—HO)<=4 THEH WRITELH ('УДОВЛЕТВОРИТЕЛЬНО') ELBE WRITELH ('НЕУДОВЛЕТВОРИТЕЛЬНО'); EHD. В подпрограмме после перемещения символов строки влево производится запись в 15-ю позицию символа чтобы избежать дублирования последнего символа строки. ЛАБОРАТОРНАЯ РАБОТА № 15 ОБРАБОТКА ФАЙЛОВЫХ СТРУКТУР ДАННЫХ Цель работы — овладение навыками алгоритмизации и программирования файловых структур данных; проектиро- вание структуры файла, вывод данных в файл, чтение данных нз файла. 340
Задания для самостоятельной подготовки 1. Изучить: — основную терминологию, связанную с файловыми структурами данных: файл и его структура, физиче- ская и логическая записи, методы доступа, формат- ные и бесформатные записи, запись конца файла для файлов с последовательным доступом; — возможности языка программирования по обработке файла с последовательной организацией: запись дан- ных в файл, чтение из файла, добавление записей в файл, корректировка записей и т. п. 2. Разработать алгоритм решения в соответствии с за- данием. 3. Составить программу решения задачи. 4. Подготовить тестовый вариант программы и исходных данных. Задание к работе Задание А. Выполнить на ЭВМ программу со- здания файла в соответствии с вариантом задания, ука- занным в табл. 5.19 (пп. А). Прочитать и напечатать созданный файл. Таблица 5.19 Вариант задания Условие задачи А Создать файл, содержащий сведеиня о месячной зара- ботной плате рабочих завода. Каждая запись содержит поля — фамилия рабочего, наименование цеха, размер заработной платы за месяц. Количество записей — произвольное. Б. Вычислить общую сумму выплат за месяц по цеху X, а также среднемесячный заработок рабочего этого цеха. Напечатать для бухгалтерии ведомость для начисления заработной платы рабочим этого цеха 2 А. Создать файл, содержащий сведения о количестве из- делий, собранных сборщиками цеха за неделю. Каждая запись содержит поля: фамилия сборщика, количество изделий, собранных им ежедневно в течение шестиднев- ной недели, т. е. раздельно — в понедельник, вторник и т. д. Количество записей — произвольное. Б. Написать программу, выдающую на печать следующую
Продолжение табл. 5.19 Вариант задания Условие задачи информацию: фамилию сборщика и общее количество деталей, собранное им за неделю; фамилию сборщика, собравшего наибольшее число изделий, и день, когда он достиг наивысшей производительности труда 3 А. Создать файл, содержащий сведения о количестве изде- лий категорий А, В, С, собранных рабочим за месяц. Структура записи имеет поля: фамилия сборщика, наиме- нование цеха, количество изделий по категориям, собран- ных рабочим за месяц. Количество записей — произволь- ное. Б. Считая заданными значения расценок S^, SB, Sc за вы- полненную работу по сборке единицы изделия категорий А, В, С соответственно, выдать на печать следующую информацию: — общее количество изделий категорий А, В, С, собран- ных рабочим цеха X; — ведомость заработной платы рабочих цеха X; — средний размер заработной платы работников этого цеха А. Создать файл, содержащий сведения о телефонах або- нентов. Каждая запись имеет поля: фамилия абонентов, год установки телефона, номер телефона. Количество записей произвольное. Б. Написать программу, выдающую информацию следую- щего вида: — по вводимой фамилии абонента выдается номер телефона; — определяется количество установленных телефонов с ХХХХ года. Номер года вводится с терминала 5 А. Создать файл, содержащий сведения об ассортименте игрушек в магазине. Структура записи: название игруш- ки, цена, количество, возрастные границы, например 2—5, т. е. от 2 до 5 лет. Количество записей произвольно. Б. Написать программу, в результате выполнения которой выдаются следующие сведения: — названия игрушек, которые подходят детям от 1 до 3 лет; — стоимость самой дорогой игрушки и ее наименование; — название игрушки, которая по стоимости не превы- шает х руб. и подходит ребенку в возрасте от а до b лет. Значения х, а, Ь ввести с терминала 342
Продолжение табл. 5.19 Вариант задания Условие задачи 6 А. Создать файл, содержащий сведения о сдаче студентами 1 курса кафедры «ЭВМ» сессии. Структура записи: индекс группы, фамилия студента, оценки по пяти экза- менам, признак участия в общественной работе: «1» — активное участие, «О» — неучастие. Количество запи- сей — 30. Б. Написать программу зачисления студентов группы X на стипендию. Студент, получивший все оценки «5» и ак- тивно участвующий в общественной работе, зачисляется иа повышенную стипендию (доплата 50 %), не активно участвует — доплата 25 %. Студенты, получившие «4» и «5», зачисляются иа обычную стипендию. Студент, полу- чивший одну оценку «3», но активно занимающийся об- щественной работой, также зачисляется на стипендию, в противном случае зачисление не производится. Индекс группы вводится с терминала А. Создать файл, содержащий сведения о сдаче студентами сессии. Структура записи: индекс группы, фамилия сту- дента, оценки по пяти экзаменам и пяти зачетам («з» означает зачет, «и» — незачет). Количество записей — 25. Б. Написать программу, выдающую следующую инфор- мацию: — фамилии неуспевающих студентов с указанием индек- сов групп н количества задолженностей; — средний балл, полученный каждым студентом груп- пы X, и всей группой в целом 8 А. Создать файл, содержащий сведения о личной коллекции книголюба. Структура записи: шифр книги, автор, название, год издания, местоположение (номер стел- лажа, шкафа и т. п.). Количество записей произвольное. Б. Написать программу, выдающую следующую инфор- мацию: — местонахождение книги автора X названия Y. Значе- ния X, Y ввести с терминала; — список книг автора Z, находящихся в коллекции; — число книг издания XX года, имеющееся в библиотеке 9 А. Создать файл, содержащий сведения о наличии билетов и рейсах Аэрофлота. Структура записи: номер рейса, пункт назначения, время вылета, время прибытия, коли- чество свободных мест в салоне. Количество записей произвольное 343
Продолжение табл. 5.19 Вариант задания Условие задачи Б. Написать программу, выдающую информацию следую- щего вида: — время отправления самолетов в город X; — наличие свободных мест на рейс в город X с време- нем отправления Y. Значения X, Y вводятся по запросу с терминала 10 А. Создать файл, содержащий сведения об ассортименте обуви в магазине фирмы. Структура записи: артикул, наименование, количество, стоимость одной пары. Коли- чество записей произвольное. Артикул начинается с бук- вы Д для дамской обуви, М для мужской, П для детской. Б. Написать программу, выдающую следующую инфор- мацию: — о наличии и стоимости обуви артикула X; — ассортиментный список дамской обуви с указанием наименования и имеющегося в наличии числа пар каждой модели 11 А. Создать два файла, содержащих сведения о десяти на- падающих хоккейных команд «Динамо» и «Спартак» соответственно: имена нападающих, число заброшенных ими шайб, сделанных голевых передач, заработанное штрафное время. Б. Написать программу, которая по данным, извлеченным из этих файлов, создает новый третий файл, содержащий имя, команду, сумму очков (голы-Ь передачи) для шести лучших игроков обеих команд. Имена и показатели ре- зультативности хоккеистов вывести на экран 12 А. Создать файл, содержащий сведения о том. какие из пяти предлагаемых дисциплин по выбору желает слушать студент. Структура записи: фамилия студента, индекс группы, 5 дисциплин, средний балл успеваемости. Выби- раемая дисциплина отмечается символом 1, иначе — пробел. Количество записей — 25. Б. Написать программу, которая печатает список студентов, желающих прослушать дисциплину X. Если число же- лающих превысит 8 человек, то отобрать студентов, имею- щих более высокий средний балл успеваемости 13 А. Создать файл, содержащий сведения об отправлении поездов дальнего следования с Казанского вокзала. Структура записи: номер поезда, станция назначения, время отправления, время в пути, наличие билетов. Ко- личество записей произвольное. 344
П родолжение табл. 5.19 Вариант задания Условие задачи Б. Написать программу, которая позволяет получить сле- дующую справочную информацию: — время отправления поездов в город X во временном интервале от А до В часов, — наличие билетов на поезд с номером XXX 14 А. Создать файл, содержащий сведения о сотрудниках института. Структура записи: фамилия работающего, название отдела, год рождения, стаж работы, должность, оклад. Количество записей произвольное. Б. Написать программу, которая позволяет получить сле- дующую информацию: — список сотрудников пенсионного возраста на сего- дняшний день с указанием стажа работы, — средний стаж работающих в отделе X 15 А. Создать файл, содержащий сведения о пациентах глаз- ной клиники. Структура записи: фамилия пациента, пол, возраст, место проживания (город), диагноз. Количество записей произвольное. Б. Написать программу, выдающую следующую инфор- мацию: — количество иногородних, прибывших в клинику, — список пациентов старше X лет с диагнозом У. Значе- ния X и У ввести с терминала Задание Б. Выполнить на ЭВМ программу обработки файла, созданного в п. 1, в соответствии с заданием, указан- ным в пп. Б табл. 5.19 для заданного варианта. Проверить правильность выполнения обеих программ с помощью тестового варианта исходных данных. Пример выполнения работы Задание А. Выполнить на ЭВМ программу созда- ния файла, содержащего сведения о сдаче студентами сессии. Структура записи содержит поля: индекс группы, фамилию студента, оценки по пяти экзаменам. Количество записей в файле произвольное. Так как по условию не требуется выполнять арифметиче- ских операций над данными полей записи, то все поля запи- сей файла целесообразно определить как поля символьного типа. Идентификаторы и длины полей приведены в табл. 5.20. 345
Таблица 5.20 Описание поля Имя переменной Тип данных Пример Индекс группы Фамилия Оценки по пяти экзаменам INDEX FAM Массив MARKER (5) 6 символов 20 символов Каждый элемент односимвольный ИУ2-11 ИВАНОВ П. В. 54323 Для получения текущей записи организуем в программе запрос на ввод очередной порции информации с терминала в оперативную память ЭВМ, для чего воспользуемся обычны- ми операторами языка для ввода данных. Полученную строку данных запишем в первую запись файла (предварительно открытого оператором OPEN для программ на языках БЕЙ- СИК и ФОРТРАН-77). Для этого используем оператор за- писи данных в файл, после чего запросим ввод второй строки данных с терминала в оперативную память ЭВМ. Организуем ее запись в файл. Этот процесс ввода с терминала и записи в файл будем продолжать до тех пор, пока не будет получен с терминала признак окончания ввода данных. Для подсчета количества записей в файле введем счетчик К, значение которого будем увеличивать на I при каждой операции за- писи строки в файл. Для контроля после создания файла организуем чтение записей файла и их вывод на экран. Программы создания файла с именем SESSYA име- ют вид: а) на языке БЕЙСИК 10 'ЛАБОРАТОРНАЯ РАБОТА П15А 15 'СТУДЕНТ ГРУППЫ РЛ-21 ИВАНОВ И. Н. 20 DIM HARKER* (5) 'МАССИВ ОЦЕНОК 25 ОРЕН G: SESSYA" FOR OUTPUT AS *2 26 D*=", * 'ЗНАК РАЗДЕЛИТЕЛЯ ПОЛЕЙ ЗАПИСИ 30 К=0 'СЧЕТЧИК ЗАПИСЕЙ 36 PRIHT -ВВЕДИТЕ ТЕКУЧУЮ ЗАПИСЬ- 40 PRINT -ДЛЯ ОКОНЧАНИЯ РАБОТЫ ВВЕДИТЕ ВМЕСТО" 45 PRIHT -ИНДЕКСА ГРУППЫ СИМВОЛЫ 41IIIIII Ittt * 50 IHPUT -ИНДЕКС ГРУППЫ- ; IHDEX* 60 IF INDEX* --lllltflHHf THEH 160 70 IHPUT "ФАМИЛИЯ*; FAM* BO FOR 1=1 TO 5 90 PRIHT -ОЦЕНКИ 3A-;I;" ЭКЗАМЕН- loo IHPUT HARKER* (I) : HEXT I 110 ' ЗАПИСЬ В ФАЛЛ ВСЕЙ ЗАПИСИ. 120 PRINT #2, INDEX*. D*. FAM*, D*, HARKER* (1) , D*. MARKER* (2), D*, HARKER* (3) , D*, HARKER* (4) , D*, HARKER* (5) 130 K=K*1 : GOTO 35 140 'КОНТРОЛЬНОЕ СЧИТЫВАНИЕ ФАЙЛА 160 PRIHT : PRIHT • В ФАИЛЕ ЗАПИСАНО*; К ;- ЗАПИСЕЙ" 170 CLOSE #2 160 PRIHT -КОНТРОЛЬНОЕ СЧИТЫВАНИЕ ФАЙЛА* 190 ОРЕН "G: SESSYA" FOR IHPUT AS #2 200 IF EOF(2) THEH CLOSE #2 : PRIHT -КОНЕЦ РАБОТЫ’ : END 346
210 IHPUT #2. INDEXS.FAMS. HARTER* (1), MARKERS (2) .MARKERS(3), MARKERS (4) , MARKERS (5) 220 PRINT INDEXS;FAMS; 230 FOR 1=1 TO 5 : PRIHT MARKERS(I); : HEXT I 240 PRINT : GOTO 200 б) иа языке ФОРТРАН-77 с ЛАБОРАТОРНАЯ РАБОТА П15А с СТУДЕНТ ИВАНОВ И. И. с СОЗДАНИЕ ФАЙЛА SESSYA CHARACTER INDEX*6. FAM»20. MARKER(5)м1 С ОТКРЫТИЕ ФАЙЛА OPEN (2.FILE='SESSYA' , STATUS='NEW' , • ACCESS^'SEQUENTIAL’, FORM-'FORMATTED') K=O PRINT*. 'ВВЕДИТЕ ТЕКУЩУЮ ЗАПИСЬ' PRINT*. 'ИНДЕКС ГРУППЫ, ФАМИЛИЮ .ОЦЕНКИ' PRINT*. 'ДЛЯ ОКОНЧАНИЯ ВВОДА ВВЕСТИ ИНДЕКС П1ИП1НЙ С ВВОД ЗАПИСИ С ЭКРАНА 40 READ(5. 100)INDEX. FAM. MARKER 1OO FORMAT(A6. A2O. 5A1) IF (INDEX. EQ. 'W####') GOTO 50 WRITE(2. 1OO)INDEX, FAM. MARKER K=K+1 GOTO 40 С ЗАПИСЬ МЕТКИ КОНЦА ФАЙЛА 50 ENDFILE 2 PRINT*. 'В ФАИЛЕ '.К,' ЗАПИСЕЙ' С КОНТРОЛЬНОЕ СЧИТЫВАНИЕ СОЗДАННОГО ФАЙЛА С ПЕРЕМЕЩЕНИЕ УКАЗАТЕЛЯ НА НАЧАЛО ФАЙЛА REWIND 2 DO ВО 1 = 1, К READ(2, 1ОО)INDEX, FAM, MARKER WRITE(6. 200)IHDEX. FAM, MARKER 200 FORMAT (IX. A6, 2X, A2O. 2X. 5 (Al, IX) ) — 60 CONTINUE PRINT», 'КОНЕЦ ФАЙЛА' END в) на языке ПАСКАДЬ— PROGRAM LR15A[IHPUT.OUTPUTjr~ TYPE ZAP=RECORD IHDEX:STRIHG[6]; FAM :STRIHG[2O]; MARKER:PACKED ARRAY[1..5] OF CHAR END; VAR SESSYA:FILE OF ZAP; KtlHTEGER; FLAG .:BOOLEAN; X:ZAP; BEGIH I:=O;FLAG:=TRUE; R EWRI TE(SESS Y A); REPEAT WRITELH! 'ВВЕДИТЕ ТЕКУЩУЮ ЗАПНСЬхЯНДЕКС ГРУППЫ.фАМНЛНЮ Н'); WRITELH!' 5 ОЦЕНОК ЗА ЭКЗАМЕНЫ'); WRITELH! 'ДЛЯ ОКОНЧАНИЯ РАБОТЫ ВВЕДИТЕ ВМЕСТО ИНДЕКСА'); WRITELH!' ГРУППЫ СИМВОЛЫ ##*#*#'); 347
READ[X.IHDEX,X.FAH.X.MARKER[1],X.MARKER[2].X.MARZER[3], X.MARKER[4],X.MARXER[5]); IF X.IHDEXO'######.' ТНЕЯ BEGIH X:=I+1; WRITE(SESSYA.X) EHD ELSE FLAG:=FALSE UHTIL FLAG; WRITELH ('В ФАИЛЕ ЗАПИСЕЙ'); ASSIGH(SESSYA.'SESSYA'); RESET(SESSYA); WHILE HOT EOF(SESSYA) DO BEGIH READ(SESSYA.X); WRITELH(X.IHDEX.X.FAH.X.HARXER[1],X.HARKER[2L X.MARXER[3],X.HABKER[4],X.HARKER[51); EHD; WRITELHCXOHEU ФАЙЛА') EHD. Тестовый вариант исходных данных для создания файла Р Кб-21 СИДОРОВ В. Г. 44323 РК4-21 НИКИФОРОВ П. Д. 55343 РК4-22 ФЕДОРОВ С. Г. 44444 РК7-23 ФОКИН П. А. 55555 РК4-22 ПОДГОРНЫЙ А. А. 55232 РК4-22 СИЛАЕВ Ф. Г. 55555 РК4-22 БЕЛОВ И. Ф. 55455 РК4-22 АНИСОВ Д. Ф. 42323 РК4-22 ЛУКИН В. Д. 33433 РК4-22 ДЕДОВ П. Л. 33333 В качестве индекса группы X ввести значение РК4-22. Задание Б. Написать программу зачисления на сти- пендию студентов группы X. Размер обычной стипендии 70 руб. Студенту, получившему все пять оценок «5», назнача- ется стипендия, повышенная на 50 %; получившему оценки «4» и «5» — повышенная на 25 %; студенту, получившему хотя бы одну оценку «2», стипендия не назначается. В осталь- ных случаях назначается обычный размер стипендии. Для выполнения задания Б необходимо: ввести с терми- нала индекс группы X, для которой печатается ведомость зачисления на стипендию; организовать в цикле чтение теку- щей записи файла, проверять совпадение значения поля «ин- декс группы» со значением переменной X. Если индексы не совпадают, то переходить к чтению следующей записи файла. Если индексы совпадают, то проводить зачисление на стипен- дию по следующему алгоритму: ввести счетчики количества отличных и хороших оценок К5 и К4, задав их начальное значение 0; организовать цикл на пять повторений для про- верки каждой оценки студента. Если текущая оценка «2», то выходить из цикла, зачисления на стипендию не будет и пе- реходить к чтению следующей записи файла; если оценка «5»,
то увеличить счетчик К.5 иа 1 и продолжить цикл просмотра оценок; если оценка «не 5», то проверить ее на значение «4>. Если оценка «4», то счетчик К4 увеличить иа 1 и продолжить цикл. После просмотра всех оценок проверить значение счет- чика К5 — равно лн пяти? При положительном ответе на- значить стипендию 704-0,5-70=105 руб. Выдать иа печать фамилию студента, размер стипендии и перейти к чтению следующей записи; если К5 не равно пяти, то проверить равенство пяти суммы значений К5 и К4. При ответе ДА на- значить стипендию 704-0,25-70 = 87,5 руб., в противном слу- чае — стипендию 70 руб. и перейти к печати строки доку- мента о зачислении на стипендию, а затем — к чтению новой записи. При обнаружении конца файла завершить решение задачи. Программы имеют вид; а) иа языке БЕЙСИК Ю 'ЛАБОРАТОРНАЯ РАБОТА П15Б 15 СТУДЕНТ ГРУППЫ РЛ-21 ИВАНОВ И. И. го DIM HARKER» (5) 'МАССИВ ОЦЕНОК 25 ОРЕН -G:SESSYA- FOR- IHPUT AS #2 30 IHPUT -ВВЕДИТЕ ИНДЕКС ГРУППЫ -; X» 40 PRIHT -ВЕДОМОСТЬ ЗАЧИСЛЕНИЯ НА СТИПБНДИЮ- БО PRIHT СТУДЕНТОВ ГРУППЫ *;Х» 60 Н=О ' ПОРЯДКОВЫЙ номер в СПИСКЕ ТО 'ЧТЕНИЕ ЗАПИСЕЙ.ИЗ ФАЛЛА 75 IF EOF(2) THEH PRIHT -КОНЕЦ ФАЙЛА- : CLOSE #2 : EHD 60 IHPUT #2, IHDEX», РАН». HARKER» ( 1), HARKER» (2) , HARKER» ( 3) , MARKER» (4) , HARKER» (5) 90 IF LEFT» (IHDEX», 6) ОХ» THEH 75 1OO K5 = O : K4=O 'СЧЕТЧИКИ ОЦЕНОК 110 FOR 1 = 1 TO 5 120 IF LEFT» (MARKER» (I) , 1 ) ="2* THEH 75 130 IF LEFT» (HARKER» (I), l>=-5- THEH K5=K5+1 140 IF LEFT» (HARKER» ( I ). 1 > =-4- THEH K4=K4»1 150 HEXT I ____ 150 Б=7О! ' ОБЫЧНЫЙ РАЗМЕР СТИПЕНДИИ 170 IF K5 = 5 THEH S=1O5! : GOTO 190 160 IF K5»K4=5 THEH S=67; 5 190 H=H»1 -ПОРЯДКОВЫЙ НОМЕР СТУДЕНТА 200 PRIHT H; FAM», Б; - РУБ. • 210 GOTO 75 б) на языке ФОРТРАН-77 С ЛАБОРАТОРНАЯ РАБОТА П15Б С СТУДЕНТ ИВАНОВ И. И. CHARACTER IHDEX«6, FAM»20, HARKER (5>»1. X»5 С ОТКРЫТИЕ СУЩЕСТВУЮЩЕГО ФАЙЛА ОРЕН (г, FILE= ' SESSYA' , STATUS = 'OLD' ) PRIHT», 'ИНДЕКС ГРУППЫ' READ (5. 1OO)X 1OO FORHAT(A6) PRINT», 'ВЕДОМОСТЬ ЗАЧИСЛЕНИЯ НА СТИПЕНДИЮ' PRIHT», -СТУДЕНТОВ ГРУППЫ ',Х 349
С Н-ПОРЯДКОВЫЙ НОМЕР СТУДЕНТА В СПИСКЕ N = O С ЧТЕНИЕ ЗАПИСЕЙ ИЗ ФАЙЛА 40 READ (2. 200. ЕИЮ-5ОО)INDEX, FAM. MARKER 200 FORMAT(A6. A2O, 5A1) IF (INDEX. HE. X) GOTO 40 С ЗАЧИСЛЕНИЕ НА СТИПЕНДИЮ K5 = O K4 = O DO 3 1=1.5 IF (MARKER(I). EQ. '2')GOTO 40 IF (MARKER ( I ) . EQ. ' 5')K5=K5 +1 IF (MARKER(I) . EQ. '4')K4=K4*1 3 CONTINUE S=7O. О IF (K5. EQ. 5) THEH S=1O5. О ELSE IF(K5*K4. EQ. 5)THEN S=67. 5 EHD IF N = N+i WRITE (5, 300) N. FAM. S 300 FORMAT (IX. 12, 2X. AZO, 2X, F7. 2, 9 РУБ. * ) GOTO 40 500 PRINT*. 9КОНЕЦ ФАЙЛА' EHD в) на языке ПАСКАЛЬ PROGRAM LR15B(IHPUT.OUTPUT.SESSTA); LABEL 2*. TYPE ZAP=RECORD IHDEX:STRIHG[6]; FAM:STRIHG(2O]; M ARKER: ARR AY[1..5] OF CHAR; END; VAR SESSYAiFILE OF ZAP; Y:ZAP; X:STRING[6]; I.K.E4,K5.N:IHTEGER- S:REAL; BEGIN ASSIGN (SESSYA.’SESSYA'); RESET(SESSYA); WRITELHCBBEflHTE ИНДЕКС ГРУППЫ'); READLN(X); WRITELH('BEflOMOCTb ЗАЧИСЛЕНИЯ НА СТИПЕНДИЮ')*. WRlTELH('CTVflEHTOB ГРУППЫ'ЛИ WRITELHC'I I WRITELHCI П/Ц I ФАМИЛИЯ WRITELH('I I H:=O; 2.WHILE HOT EOF(SESSYA) DO BEGIH READ(SESSYA.Y); IF Y.INDEX=X THEH BEGIH K4:=0; FOR I:=i BEGIH I I ' ); I PVB I'); I I ' ) ; K5:=0; TO 5 DO 350
IF T.HABKER[№'£ "ГНЕВ GOTO S; IF T.MARXER[I]=’5' THEH X5:=X5+i; IF T.HARXER[I)='4' THEH X4::X4H; EHD; EHD; s:=7O.O; H:=H+i; IF X5=5 THEH S:=iO5.0 ELSE IF(X5+I4)-5 THEH S-B7.5; EHD; VRITELHCKOHEK ФАЙЛА') EHD. Контрольные вопросы 1. Объяснить, что означают следующие термины: файл, запись, метод доступа, структура записи? 2. Каково назначение операторов открытия и закрытия файлов на языках программирования БЕЙСИК и ФОРТРАН? 3. Допустимы ли различные типы данных для элементов одной записи? 4. Указать, с помощью каких операторов выполняется запись данных в файл последовательного доступа, чтение из файла? 5. Привести примеры использования файлов последова- тельного доступа. 6. Как распознать конец файла данных? Как распознать файл на диске? ЛАБОРАТОРНАЯ РАБОТА № 16 ПРОГРАММИРОВАНИЕ С ВЫВОДОМ РЕЗУЛЬТАТОВ В ВИДЕ ГРАФИКОВ НА ЭКРАН ГРАФИЧЕСКОГО ДИСПЛЕЯ Цель работы — овладение средствами машинной графи- ки БЕЙСИК-системы для вывода результатов вычислений в виде графиков, практическими навыками по использованию графических средств. Задания для самостоятельной подготовки 1. Изучить: — возможности Бейсик-системы по графической обра- ботке данных; — режимы работы графического дисплея и управление ими; — управление цветностью изображений; — отображение точки, отрезка, ломаной линии; — вывод текстовых данных в графическом режиме; — метод построения точечных и кусочно-линейных гра- фиков. 351
2. Разработать алгоритм решения. 3. Составить программу решения задачи. 4. Подготовить тестовый набор данных для контроля правильности функционирования программы. Задание к работе Задание А. Построить на экране графического дис- плея точечный график функции у={ (х) (в соответствии с вариантом задания, указанным в табл. 5.11) в заданном диапазоне изменения аргумента х от а до b с числом точек графика п^50. Предусмотреть вычерчивание осей координат х, у с нанесением шкал делений, вывести значения масштабов по осям координат х, у. Задание Б. Построить на экране дисплея кусочно- линейный график функции, указанной в задании А Пример выполнения работы Задание А. Построить на экране графического дисп- лея точечный график функции у= 1/(х2 —х+1) при изме- нении аргумента х от — I до 3. Количество точек графи- ка 40. Предусмотреть вычерчивание осей координат X, Y с на- несением шкал делений. Ось X направим вдоль строки экрана, ось Y — в направ- лении перемещения строк. Выберем режим графического вы- вода со средним разрешением (формат экрана — 200 точек по вертикали и 320 по горизонтали). На экране необходимо разместить информацию о масштабах по осям X и У, для чего выделим 23-ю и 24-ю строки экрана. Тогда собственно под график можно занять 168 точек по вертикали и 320 точек по горизонтали. Диапазон изменения аргумента х известен. Выберем аб- сциссу Хо начала системы координат в точке 80. Масштабный коэффициент Мх по оси X определяется как Л4х = 320/(й— — а)=320/4 = 80, т. е. 80 точек на единичное значение аргумента. Деления на горизонтальной шкале нанесем через каждые 16 точек, всего на оси X будет нанесено 20 делений. Цена одного деления по шкале X равна 16/80=0,2. Диапазон изменения аргумента у неизвестен. Поэтому в программе необходимо определить наибольшее утах и наи- меньшее ymin значения среди вычисляемых значений yt (*=1, 40). Выбор ординаты Уо начала системы координат 352
произведем из условия максимального использования поля, выделенного под график: — если г/тах>0 и «/min>0, то Уо=168 —это номер са- мой нижней точки по вертикали, выделенной под график; — если утах< 0 и t/min < 0, то Уо=О — это номер верхней точки по вертикали; еСЛ И (/тах О И £/min <Z О, ТО Уу = J168/(^max I/min)*^max ~Ь +0,5[. Масштабный коэффициент Му вертикальной оси Y равен Му=168/(1/П1ах—утш). Нанесем деления на вертикальной шкале через каждые десять точек от начала ординаты Уо- Цена деления вертикальной шкалы равна 10/Mj,. Всего будет нанесено 16 делений. Для построения графика необходимо выполнить пре- образование координат точки (х, у) выбранной системы ко- ординат с центром (Х01 Уо) в координаты экрана (хе, уе): Хе = 1хМх + О,5[+Хо; уе=]-1/М9 + О,5[+Уо. Значение 0,5 взято для округления. Знак « —» при вы- числении у? означает изменение направления оси ординат. Программа имеет вид В 'ЛАБОРАТОРНАЯ РАБОТА П16А 6 'СТУДЕНТ ГРУППЫ РК6-21 ИВАНОВ И. И. IO DEFIHT I.C го '•«•»» график функции y=i/(x«x-x-i) «•«•»«» 30 DIH Y(41) 40 А=-1 : В=3 : Н=40 : НХ=(В-А)/Н 50 PRINT « ОБЛАСТЬ ИЗМЕНЕНИЯ X" 60 PRINT "А=«; А; «В=«;В, «ЖАГ НХ=";НХ 70 'ВЫЧИСЛЕНИЕ ОБЛАСТИ ЗНАЧЕНИИ Y ( I ), УМАХ. YMIN 60 YMAX=-1E+1O : YMIN=1E+1O : 1=0 90 FOR X=A TO В STEP HX 1OO Iil + l I1O Y(I)=1/(X«X-X+l) 120 IF Y(I)>YMAX THEH YMAX=Y(I) 130 IF Y(I)<YMIH THEH YMIH=Y(I) 13Б PRINT X. I, YU) 140 HEXT X 145 PRIHT "YMIH=«; YMIH, «ymax=«; YMAX 150 'ВЫЧИСЛЕНИЕ МАСШТАБОВ HX. MY, КООРДИНАТЫ YO 160 MX=32O/(B—A) 180 HYx 17 6/ABS (YMAX-YMIH) 190 IF (YMAXxO) AND (YMIH>=O) THEH YO=176 aoo IF (YMAX = O) AHD (YMIHCO) THEH YO=0 210 IF (YMAX>O) AHD (YMIHKO) THEH YO=IHT (MY*YHAX«-. 5 ) 220 PRIHT «ПОСТРОЕНИЕ ГРАФИКА" еез cls ' очистка экрана 225 SCREEN 1 'РЕЖИМ СРЕДНЕГО РАЗРЕШЕНИЯ 226 ' ДЛИНА СТРОКИ 60 230 KEY OFF 'ОТМЕНА ОТОБРАЖЕНИЯ КЛАВИШ 240 COLOR 2, О ' ЦВЕТ ФОНА ЗЕЛЕНЫЙ. ПАЛИТРА О 353
250 ' РАЗМЕТКА ИКАЛ X, Y 260 LIKE (О, YO)-(319. YO) ' ГОРИЗОНТАЛЬНАЯ ОСЬ 255 ХО-ЪО 270 FOR 1 = 0 ТО 319 STEP 16 'НАНЕСЕНИЕ ДЕЛЕНИИ 280 ЫНЕ (I, YO-3)-(I, YO+3) : NEXT I 290 ЫНЕ (ХО, О)-(ХО, 175) 'ВЕРТИКАЛЬНАЯ ОСЬ 300 FOR I=YO-1O ТО О ВТЕР -10 310 ЫНЕ (ХО-3, I)-(X0 + 3, I) 'НАНЕСЕНИЕ ДЕЛЕНИИ 320 HEXT I 'НА ОСЬ +Y 330 FOR 1=70+10 ТО 176 STEP 10 340 ЫНЕ (ХО-3, I)-(ХО+3, I) -НА ОСЬ -Y 350 HEXT I 355 1=0 360 'ПОСТРОЕНИЕ ТОЧЕЧНОГО ГРАФИКА 370 COL=2 -ЦВЕТ ТОЧКИ КРАСНЫЙ 380 РОЙ Х=А ТО В STEP ИХ \ 390 1=1+1 400 ХЕ=1НТ(Х»НХ+. 5)+ХО 'ПРЕОБРАЗОВАНИЕ (X, Y) 410 YE=YO-IHT(Y(I)*MY+. 5) 'В КООРДИНАТЫ ЭКРАНА 420 PSET (ХЕ, YE) , COL ' ОТОБРАЖЕНИЕ ТОЧКИ 430 HEXT X 436 A»=IHPUT»(1) 'ПРИОСТАНОВКА ВЫПОЛНЕНИЯ ПРОГРАММЫ 437 'ДО НАЖАТИЯ ЛЮБОЙ КЛАВИШИ 440 'ВЫВОД ТЕКСТА О ЦЕНЕ ДЕЛЕНИИ ПО ШКАЛАМ X. Y 510 LOCATE 24, 1 'УСТАНОВКА КУРСОРА В 24 СТРОКЕ 520 PRIHT • ЦЕНА ДЕЛЕНИЯ ШКАЛЫ ПО ВЕРТИКАЛИ’; 1O/MY 530 PRINT ’ ЦЕНА ДЕЛЕНИЯ ШКАЛЫ ПО ГОРИЗОНТАЛИ’; 5/НХ 540 END В строках 90—150 вычисляются и запоминаются в массиве Y значения функции и одновременно ведется поиск наименьшего и наи- большего из вычисленных значений функции. В строках 170—210 вы- числяются масштабы Мх, Му по осям X н Y н значение ординаты Уо центра координат. В строках 220—240 устанавливается графический режим со средним разрешением, цвет фона — белый и палитра 0. В строках 260—350 наносятся оси X и У, выполняется разметка их с нанесением делений. На оси X размещается 20 делений через каждые 16 точек; на оси Y — 16 делений через каждые 10 точек от центра координат. В строке 370 задается цвет отображаемых точек графика — красный. В строках 380—430 выполняется печать точечного графика. Для вывода текстовой информации о цене деления по осям X и У курсор перемещается на 22-ю строку н осуществляется печать. Тестовый набор данных: при х= —1 значение функции у = 1/(х2 —х-у 1)= 1/3 = 0,33333; при х = 0 значение функции у=1. Задание Б. Построить на экране дисплея кусочно- линейный график функции, указанной в задании А. Для построения кусочно-линейного графика заменим операторы (360—430) программы задания А, вычерчиваю- щие точечный график, операторами, обеспечивающими по- строение отрезка между двумя соседними точками графика. 354
Программа имеет вид 5 'ЛАБОРАТОРНАЯ РАБОТА П16Б 6 'СТУДЕНТ ГРУППЫ РК6-21 ИВАНОВ И. И. 10 DEFINT I.C ао '••«*• ГРАФИК ФУНКЦИИ Y=1/(X«X-X-1) 30 DIM Т(41) 40 А=-1 : в-з : Н=4О : НХ=(В-А)/И 50 PRIHT • ОБЛАСТЬ ИЗМЕНЕНИЯ X" 50 priht •А?"; А; -в="; в. -шаг нх=-;нх 70 ' ВЫЧИСЛЕНИЕ ОБЛАСТИ ЗНАЧЕНИИ Y (I ) , УМАХ, YMIH 50 YMAX=—1Е+1О : YHIH=1E+1O : 1=0 90 FOR X=A TO В STEP HX 1OO 1=1+1 11O Y(I)=1/(X+X-X+l) 120 IF Y(I)>YMAX THEH YMAX=Y(I) 130 IF Y(I)<YMIH THEH YMIH=Y(I) 135 PRIHT X, I, Y(I) 140 HEXT X 145 PRIHT "ТН1И = "; YMIN. "ymax="; YMAX 150 -ВЫЧИСЛЕНИЕ МАСШТАБОВ MX, MY, КООРДИНАТЫ TO 150 HX=320/(B-A) 150 MY= 176/ABS (YHAX-YMIN) 190 IF (YMAX»O) AHD (YMIH>=O) THEH YO=176 200 IF (YHAX=O) AHD (YMIH<0) THEH Y0=O 210 IF (YMAX>O) AHD (YMIH<O) THEH YO= IHT(MY*YMAX+. 5) 220 PRIHT "ПОСТРОЕНИЕ ГРАФИКА" 223 CLS ' ОЧИСТКА ЭКРАНА 225 SCREEN 1 'РЕКИН СРЕДНЕГО РАЗРЕШЕНИЯ 226 ' ДЛИНА СТРОКИ 60 230 KEY OFF 'ОТМЕНА ОТОБРАЖЕНИЯ КЛАВИН 240 COLOR 2,0 ’ ЦВЕТ ФОНА ЗЕЛЕНЫЙ ПАЛИТРА О 250 ' РАЗМЕТКА «КАЛ X, Y 260 LIKE (О, Y0)-(319, Y0) 'ГОРИЗОНТАЛЬНАЯ ОСЬ 255 ХО=5О 270 FOR 1=0 ТО 319 STEP 16 'НАНЕСЕНИЕ ДЕЛЕНИИ 260 LIKE (I, YO-3) —(I, YO+3) : HEXT I 290 ЫНЕ (ХО, О)-(ХО, 176) * ВЕРТИКАЛЬНАЯ ОСЬ 300 FOR I=YO-1O ТО О STEP -10 310 ЫНЕ (ХО-3, I)-(ХО+3, I) 'НАНЕСЕНИЕ ДЕЛЕНИИ 320 HEXT I 'НА ОСЬ +Y 330 FOR I=Y0+10 ТО 176 STEP IO 340 LIHE (XO-3, I)-(XO+3, I) 'НА ОСЬ -Y 350 HEXT I 355 1 = 0 350 'ПОСТРОЕНИЕ КУСОЧНОГО ГРАФИКА 370 COL=2 'ЦВЕТ ТОЧКИ КРАСНЫЙ 374 * ОТОБРАЖЕНИЕ ПЕРВОЙ ТОЧКИ 375 PSET (IHT ( А»МХ+. 5)+ХО, YO-IHT ( Y ( 1) »MY+. 5)) 376 'ЦИКЛ НА ПОСТРОЕНИЕ КУСОЧНО-ЛИНЕЙНОГО ГРАФИКА 350 FOR Х=А+НХ ТО В STEP НХ 390 1=1+1 400 ХЕ=1НТ(Х*МХ+. 5)+Х0 'ПРЕОБРАЗОВАНИЕ (X, Y) 410 YE=YO-INT(Y(I)»HY+. 5) 'В КООРДИНАТЫ ЭКРАНА 420 ЫНЕ -(ХЕ, YE) , COL 'ОТОБРАЖЕНИЕ ТОЧКИ 430 HEXT X 436 A»=INPUT»(i) 'ПРИОСТАНОВКА ВЫПОЛНЕНИЯ ПРОГРАММЫ 437 -ДО НАЖАТИЯ ЛЮБОЙ КЛАВИШИ 440 'ВЫВОД ТЕКСТА О ЦЕНЕ ДЕЛЕНИИ ПО ШКАЛАМ X. Y 510 LOCATE 24, 1 'УСТАНОВКА КУРСОРА В 24 СТРОКЕ 520 PRINT " ЦЕНА ДЕЛЕНИЯ ШКАЛЫ ПО ВЕРТИКАЛИ"; 1O/MY 355
530 PRIHT * ЦЕНА ДЕЛЕНИЯ ЖКАЛЫ ПО ГОРИЗОНТАЛИ*; 5/НХ 540 END Контрольные вопросы I. Указать, с помощью каких операторов можно управ- лять режимами работы дисплея, цветом отображаемой ин- формации? 2. Как задать координаты отображаемой точки? 3. Как отобразить на экране точку, отрезок прямой, ломаную линию? 4. Как выбрать масштабы по осям X и У при построении графика? 5. Чем отличается построение кусочно-линейного графи- ка от точечного? 6. Как видоизменить программу, чтобы вычерчивалась сетка графика? 7. Как построить график двух функций от одного аргумента: а) при одинаковых масштабах; б) при разных масштабах.
ПРИЛОЖЕНИЕ 1. ПЕРЕЧЕНЬ СООБЩЕНИЙ ОБ ОШИБКАХ ИНТЕРПРЕТАТОРА ЯЗЫКА БЕЙСИК Возникновение ошибки в программе, выполняемой под управле- нием интерпретатора, приводит к останову ее выполнения и выводу на экран сообщения об ошибке. Сообщения, выдаваемые интерпрета- тором, следующие: 73 ADVANCED FEATURE (расширение характеристики). Про- грамма работает под управлением дискового интерпретатора, а со- держит оператор расширенного интерпретатора. 54 BAD FILE MODE (неправильный формат файлов). Воз- никает при попытке использовать операторы PUT и GET для по- следовательного или закрытого файла или использовать оператор OPEN для файла, который не определен как INPUT, OUTPUT, APPEND, RANDOM. 64 BAD FILE NAME (неправильное имя файла). Использована неправильная спецификация файла в операторах BLOAD, BSAVE, KILL, NAME, OPEN, FILES. 52 BAD FILE NUMBER (неправильный номер файла). Исполь- зование некоторого файла или номера файла вне множества допусти- мых номеров, определенных прн инициализации. 63 BAD RECORD NUMBER (неправильный номер записи). Возникает при использовании в операторах PUT н GET номера за- писи, большего 32767 или равного 0. 17 CAN’T CONTINUE (продолжение невозможно). Сообщение выводится прн использовании команды CONT в следующих случаях: — программа остановлена из-за ошибки; — программа изменяется во время прерывания ее выполнения; — выполнение программы не было прервано. Необходимо ис- пользовать команду RUN. 69 COMMUNICATION BUFFER OVERFLOW (переполнение коммуникационного буфера). Возникает при попытке ввести данные через коммуникационное устройство в момент, когда соответствую- щий буфер полон. 25 DEVICE FAULT (устройство неисправно). Индикация об ошибке, возникшей при обмене с периферийными устройствами или коммуникационным устройством. 57 DEVICE I/O ERROR (ошибка ввода-вывода). При операторе ввода-вывода обнаружена ошибка. 24 DEVICE TIMEOUT (тайм-аут). Интерпретатор не получил информацию от печатающего устройства в определенный момент времени. Операция выполняется повторно. 68 DEVICE UNAVAILABLE (устройство недоступно). Возника- ет прн попытке открыть файл иа несуществующем устройстве. 357
66 DIRECT STATEMENT IN FILE (прямой оператор в файле). Прямой оператор (оператор без номера строки) обнаружен при выполнения команд LOAD и CHAIN файла в формате КОИ-8. Ошиб- ка возникает и при обнаружении символа «новая строка» во входном потоке данных. 61 DISK FULL (дискета заполнена). При возникновении этой ошибки все открытые файлы закрываются. 72 DISK MEDIA ERROR (ошибка в дискете). Необходимо скопировать все файлы с данного носителя на другой. 71 DISK NOT READY (НГМД не готов к работе). В НГМД не вставлена дискета или не закрыта дверца. 70 DISK WRITE PROTECT (дискета защищена от записи). Попытка произвести запись на защищенной дискете. 11 DIVISION BY ZERO (деление на ноль). Сделана попытка разделить иа ноль нли возвести ноль в отрицательную степень. 10 DUPLICATE DEFINITION (повторное определение). Обна- ружено повторное определение размера массива. 50 FIELD OVERFLOW (переполнение поля). В операторе FIELD сделана попытка распределить больше байтов, чем в операторе OPEN для файла с прямым доступом. Такое же сообщение выво- дится, если исчерпан буфер, заданный оператором FIELD при вводе- выводе для файла с прямым доступом. 55 FILE ALREADY OPEN (файл открыт). Возникает при по- пытке повторно открыть файл для последовательного доступа, при добавлении записей или выдаче команды KILL для открытого файла. 58 FILE ALREADY EXISTS (файл существует). Использованное новое имя файла в операторе NAME уже существует на дискете. Необходимо в операторе NAME заменить имя файла. 53 FILE NOT FOUND (файл не обнаружен). При использова- нии операторов LOAD, KILL, NAME, FILES, OPEN файл с указан- ным именем не существует на указанном устройстве. 26 FOR WITHOUT NEXT (неправильный оператор FOR). Обна- ружен оператор FOR без соответствующего оператора NEXT. 12 ILLEGAL DIRECT (неправильно задана команда в прямом режиме). Попытка ввода оператора, недействительного для прямого режима. 5 ILLEGAL FUNCTION CALL (недействительный вызов фун- кции). Причиной для вывода этого сообщения может быть: — отрицательный или неправильно выбранный индекс массиве; — попытка возведения в степень отрицательного числа, когда степень не является целым числом; — вызов функции USR до определения ее стартового адреса в DEFUSR; — неправильно задан аргумент функции нли оператора. 62 INPUT PAST END (ввод после конца файла). Возникает прн выполнении входного оператора для пустого файла или после вывода целон информации в последовательный файл. Ошибка возникает и при попытке считывания файлов OUTPUT или APPEND. В таких случаях рекомендуется закрыть файл, после чего открыть как INPUT. Во избежание этой ошибки рекомендуется использовать функцию EOF. 358
51 INTERNAL ERROR (внутренняя ошибка). Проверить диске- ту и повторить операцию. 23 LINE BUFFER OVERFLOW (переполнение буфера про- граммной строки). Выводится при попытке ввести длинную строку (содержащую более 255 символов). Разделить оператор на несколь- ко строк. 22 MISSING OPERAND (нет операнда). Выводится, когда в данной программной строке оператор не имеет операнда, следующе- го за ним. I NEXT WITHOUT FOR (NEXT без FOR). Для оператора NEXT нет соответствующего оператора FOR. 19 NO RESUME (нет возврата). Выводится при переходе к ак- тивной подпрограмме для обработки ошибок, в которой не предус- мотрен возврат к основной программе (не обнаружен оператор RESUME). 4 OUT OF DATA (нет данных). Оператор READ делает попытку считать из оператора DATA больше данных, чем их число в операто- ре DATA. 7 OUT OF MEMORY (не хватает памяти). Программа очень большая, много циклов FOR — NEXT или COSUB — RETURN. В на- чале программы необходимо выдать команду CLEAR или зарезерви- ровать большую область памяти. 27 OUT OF PAPER (бумага кончилась). На печатающем устройстве кончилась бумага или устройство выключено. 14 OUT OF STRING SPACE (нехватка памяти для символьных переменных). Символьная переменная имеет длину, превышающую определенный для нее размер памяти. 6 OVERFLOW (переполнение). При переполнении рекомендует- ся работа с меньшими числами и изменение заданной точности от единичной в двойную. Если число очень маленькое, то при его пред- ставлении исчезает порядок и возникает ситуация ’UNDERFLOW’ — результат принимается равным нулю, а выполнение программы про- должается без вывода сообщения об ошибке. 75 PATH FILE ACCESS ERROR (ошибка доступа к прямому файлу). Во время выполнения операций OPEN, MKDIR, CHDIR, RENAME, RMDIR обнаружена попытка использовать недействитель- ный путь в каталоге. 76 PATH NOT FOUND (путь не найден). Во время выполнения операций OPEN, MKDIR, CHDIR, RMDIR операционная система не может найти каталог способом, которым задан путь к нему. 74 RENAME ACCROSS DISKS (переименование файла). Пере- именование осуществляется на диске с неправильно заданным логи- ческим номером. 20 RESUME WITHOUT ERROR (возврат без обработки ошиб- ки). Обнаружен оператор RESUME, причем не производилась обра- ботка ошибки. Необходимо ограничить нежелательный вход в под- программу для обработки ошибок. 3 RETURN WITHOUT GOSUB (возврат без вызова подпрог- раммы). Обнаружен оператор RETURN, но до этого не было операто- ра GOSUB. 359
16 STRING FORMULA TOO COMPLEX (набор очень слож- ный). Созданный набор очень длинный или очень сложный. Разде- лить набор на два простых. 15 STRING ТОО LONG (набор очень длинный). Попытка со- здать символьный набор длиннее 255 символов. Разделить набор на две части. 9 SUBSCRIPT OUT OF RANGE (неправильный индекс масси- ва). Использован очень большой или неправильный индекс элемента массива. Возможно, что использована индексная переменная, кото- рая не определена как массив. 2 SINTAX ERROR (синтаксическая ошибка). Использованы неправильная последовательность данных, несоответствующие левые и правые скобки, несуществующие команды или неправильный син- таксис. Причиной может быть несоответствие данных для операторов READ и DATA. Редактор автоматически выводит на экран ошибоч- ную строку программы, которую необходимо скорректировать. 67 ТОО MANY FILES (количество файлов превышает допусти- мое). Сделана попытка создать новый файл (с помощью команды SAVE или оператора OPEN), однако все элементы справочника заняты или использовано неправильное имя файла. Если имя файла задано правильно, то процедура создания файла повторяется с новым форматированным дискетом. 13 TYPE MISMATCH (неправильный тип). Использование сим- вольной величины, когда требуется числовая, и наоборот. Ошибка возникает, когда в операторе SWAP встречаются переменные различ- ных типов (числовые и символьные) или единичной или двойной точности. 8 UNDEFINED LINE NUMBER (несуществующий номер стро- ки). Попытка обращения к несуществующей в программе строке. 18 UNDEFINED USER FUNCTION (неправильное определение функции). Попытка выполнить функцию, прежде чем она определена с помощью оператора DEFl_jFN. Необходимо поместить DEFi_iFN на место до использования функции. 30 WEND WITHOUT WHILE (неправильный оператор WEND). Обнаружен оператор WEND перед выполнением соответствующего оператора WHILE. 29 WHILE WITHOUT WEND (неправильный оператор WHILE). Выводится при обнаружении оператора WHILE без соответствующе- го оператора WEND. ПРИЛОЖЕНИЕ 2. ПЕРЕЧЕНЬ ОСНОВНЫХ ДИАГНОСТИЧЕСКИХ СООБЩЕНИЙ НА ЭТАПЕ ТРАНСЛЯЦИИ ПРОГРАММЫ НА ЯЗЫКЕ ПАСКАЛЬ ЕС Каждое диагностическое сообщение об ошибке, обнаруженной на этапе трансляции Паскаль-программы, имеет внд: номер ошибки: пояснение 360
Например, возможно сообщение 3: ’PROGRAM’ EXPECTED означающее, что в заголовке программы должно быть слово PROGRAM. Предусмотрено 120 различных видов сообщений, часть из которых приводится ниже: 1 Ошибка в скалярном типе 2 Должно быть имя 3 Должно быть слово ’PROGRAM’ 4 Должен быть символ ’)’ 5 Должен быть символ 6 Недопустимый символ 7 Ошибка в списке параметров 8 Должно быть слово ’OF’ 9 Должен быть символ ’(’ 10 Ошибка в типе 11 Должен быть символ ’(.’ или ’[’ 12 Должен быть символ ’.)’ или ’]’ 13 Должно быть слово ’END’ 14 Должен быть символ ’;’ 15 Должно быть целое число 16 Должен быть символ ’ = ’ 17 Должно быть слово ’BEGIN’ 18 Ошибка в разделе описаний 19 Ошибка в списке полей 20 Должен быть символ ’.’ 21 Должен быть символ ’*’ 50 Ошибка в константе 51 Должен быть символ ’: = ’ 52 Должно быть слово ’THEN’ 53 Должно быть слово ’UNTIL’ 54 Должно быть слово ’DO’ 55 Должно быть слово ’ТО’ или ’DOWNTO’ 56 Должно быть слово ’IF’ 57 Должно быть слово ’FILE’ 58 Ошибка в множителе 59 Ошибка в переменной 60 Должно быть слово ’IN’ 101 Имя описано дважды 102 Нижняя граница превышает верхнюю 103 Идентификатор не принадлежит соответствующему классу 104 Имя не описано 105 Знак использовать нельзя 106 Должно быть число 107 Несовместимые отрезки типов 108 Здесь не может быть тнп-файлов 109 Тип должен быть вещественным ПО Ожидается отрезок типа или тип, заданный перечислением имен-констант 361
Ill 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 362 Несовместимость с типом поля признака Тип индекса не должен быть вещественным Тип индекса должен быть скалярным или отрезком типа Тип базы не должен быть вещественным Тип базы должен быть скалярным или отрезком типа Ошибка в типе параметра стандартной процедуры Неразрешенная ссылка для типа, процедуры или функции Ошибка в операторе РАСК и UNPACK Повторение списка параметров в описании процедуры или функций Тип результата функции должен быть скалярным типом, отрез- ком или указателем типа Параметр — значение не может быть файлом Нельзя указывать тип результата в повторном описании функ- ции (повторять тип результата нельзя) В описании функции не указан тип результата F-формат допустим для вывода значений вещественного типа Ошибка в типе параметра стандартной функции Число параметров не соответствует описанию Недопустимая подстановка параметров Тип результата параметра-функции не соответствует описанию Конфликт между типами операндов Тип выражения не относится к типу множеств Допустима проверка только на равенство Проверка на строгое включение не допускается Сравнение файлов не допускается Недопустимый тип операндов Тип операнда должен быть логическим Тип элемента множества должен быть скалярным или отрезком типа Типы элементов множеств не согласуются Переменная не имеет тип-масснвов Тип индекса не соответствует описанию Переменная не имеет тип-запнеей Переменная должна иметь тип-файлов или тип-указателей Конфликт типов в параметрах Недопустимый тип параметра цикла Недопустимый тип выражения Конфликт типов в параметре циклов Присваивание файлам не допускается Тип метки не соответствует типу выбирающего выражения Границы отрезка должны быть константами Целый тнп не может быть типом индекса Присваивание имени стандартной функции не допускается Присваивание формальному параметру-функции не допускается В этой записи нет такого поля Ошибочный тип в обращении к процедуре ввода READ Фактический параметр должен быть переменной Формальный параметр используется как параметр цикла
156 Одна и та же константа входит несколько раз в альтернативы оператора-выбора 157 Повторное определение метки в операторе CASE 158 Пропущено описание соответствующего варианта 159 Недопустимый тип поля признака 160 Ошибка при использовании оператора FORWARD 161 Повторное использование оператора FORWARD 162 Для внешней процедуры нельзя указывать описание FORWARD 163 В описании пропущен вариант 164 Подстановка стандартной процедуры или функции не допуска- ется 165 Повторное определение метки 166 Повторное описание метки 167 Неописанная метка 168 Метка не используется 169 Ошибка в базисном типе 170 Параметр процедуры-функции должен быть параметром-значе- нием 172 Неописанный внешний файл 175 В заголовке программы пропущен файл ’INPUT’ 176 В заголовке программы пропущен файл ’OUTPUT’ 180 Слишком длинная входная строка 181 Значение признака выходит за диапазон 182 Присваивание вложенной функции не допускается 184 Слишком длинный компонент файла 201 Ошибка в константе — должна быть цифра 202 Константа типа строки не должна превышать длину входной строки (записи) 203 Целая константа лежит вне допустимого диапазона 220 Инициализация переменных допускается только в главной про- цедуре 221 Конфликт типов при инициализации переменной 222 Число компонентов структурной константы не соответствует опи- санию 223 Тип компонентов структурной константы не соответствует опи- санию 224 Недопустимый формат структурной константы 225 Должен быть символ ’*’ 226 Недопустимый тип в структурной константе 227 Запись с вариантами нельзя использовать в структурной кон- станте 250 Слишком много сложенных областей действия имен 251 Слишком много вложенных процедур-функций 252 Слишком много опережающих ссылок на подпрограммы 253 Слишком большая подпрограмма 254 В данной подпрограмме слишком много констант 255 В данной строке подпрограммного текста слишком много оши- бок 256 Слишком много внешних ссылок 302 Индексное выражение выходит за границу 363
304 Выражение для элемента множества выходит за границу 305 Значение ’NIL’ можно присваивать только указателям 380 Внешнему модулю нельзя передавать процедуры-функции 381 Недопустимый тип результата для внешней функции 399 Не реализовано 400 Ошибка компилятора. Программа закончена, конец файла 1N PUT ПРИЛОЖЕНИЕ 3. ПЕРЕЧЕНЬ ВОЗМОЖНЫХ СООБЩЕНИЙ ОБ ОШИБКАХ НА ЭТАПЕ ВЫПОЛНЕНИЯ ПРОГРАММЫ НА ЯЗЫКЕ ПАСКАЛЬ ЕС При возникновении аварийных ситуаций в процессе выполнения Паскаль-программы (таких, как неправильное программирование ввода-вывода н др.) после сообщения "PASCAL TERMINATION- LOG” печатается сообщение об ошибке, начинающееся с ”*** ER- ROR **♦”, н текст сообщения. Ниже приведена часть сообщений: OBJECT FILE ERROR COMPILE TIME ERROR UNSUFFICIENT STORAGE AVARIABLE TIME LIMIT EXCEEDED UNDIFINED CASE LABEL VALUE OUT OF RANGE POINTER VALUE INVALID STACK OVERFLOW LOCAL FILE DD STATEMENT HALT INSTRUCTION — ошибка в объектном файле — программа содержит неисправ- ленную ошибку, обнаруженную компилятором — недоступна требуемая память — превышен лимит времени, опре- деленный параметром — неопределенная метка в опера- торе — значение выходит за границу — неправильное значение указа- теля — переполнение стека, необходи- мо увеличить значение парамет- ра REGION в операторе ЕХЕС — ошибочен или отсутствует DD — оператор LOCAL — остановка по оператору ’HALT’ XXX IS EXPONENT OF INTEGER — ошибка в степени выражения ти- EXPRN па INTEGER FILE ххх, OPENFALED — ошибка при открытии файла ххх FILE хххх, RECFM MUST BE F — параметр RECFM для файла OR FB хххх должен быть F или FB FILE ххххх, RECORD LENGTH — для файла ххххх не указан па- MUSMATCH раметр LRECL FILE ххххх, I/O ERROR — ошибка ввода-вывода для фай- FILE ххххх, GET OR READ ла ххххх — выполнение GET или READ для файла ххххх после окончания данных 364
FILE ххххх, GET OR READ WAS — для файла ххххх GET или READ NOT PRECEDED BY RESET не предшествует оператор RESET FILE ххххх, PUT OR WRITE — для файла ххххх PUT или WAS NOT PRECEDED BY WRITE не предшествует опера- REWRITE тор REWRITE FILE ххххх, READ FORMAT — ошибка в операторе READ для ERROR — DIGIT EXPECTED файла ххххх, должна быть цифра RESET OR REWRITE WAS — RESET или REWRITE исполь- USED FOR STD FILE зуются для стандартного файла ARGUMENT OUT OF RANGE — значение аргумента функции FOR FUNCTION ххххх ххххх выходит за границы LOCAL FILE ALLOCATION — ошибка при распределении ло- FAILED — SVC32 кального файла SCRATCH OF LOCAL FILE — ошибка прн удалении локально- FAILED — SCRATCH го файла В случае программного прерывания (например, деление на О и др.) печатается старое слово состояния программы ХХХХ.XX, восьмой символ которого указывает на причину прерывания и текст, поясняющий причину прерывания: PRIVILEGED OPERATION EXECUTE PROTECTION ADRESSING SPECIFICATION DATA FIXED — PT OVERFLOW DECIMAL OVERFLOW DECIMAL DIVIDE EXPONENT OVERFLOW EXPONENT UNDERFLOW SIGNIFICANCE FLOATING — PT DIVIDE FIXED — PT DIVIDE — привилегированная команда — некорректность команды — нарушение защиты памяти — неправильная адресация — неправильная спецификация — неправильные данные — переполнение с фиксированной точкой — десятичное переполнение — некорректность десятичного де- ления — переполнение порядка — исчезновение порядка — потеря значимости — некорректность деления с пла- вающей точкой — некорректность деления с фикси- рованной точкой ПРИЛОЖЕНИЕ 4. ПЕРЕЧЕНЬ ОСНОВНЫХ ДИАГНОСТИЧЕСКИХ СООБЩЕНИЙ НА ЭТАПЕ ТРАНСЛЯЦИИ ПРОГРАММЫ НА ЯЗЫКЕ ФОРТРАН ЕС Диагностическое сообщение об ошибке, обнаруженной на этапе трансляции Фортран-программы, имеет вид: IEY {номер ошибки) I {текст сообщения) 365
Например, возможно сообщение IEY013I SYNTAX указывающее на наличие ошибки в записи оператора. Ниже при- ведены номера ошибок и смысл сообщений: 001 Недопустимый тип константы, переменной или выражения 002 Отсутствует метка у оператора, следующего за оператором передачи управления 003 Имя содержит больше шести символов 004 Пропущена запятая 005 Недопустимое использование метки 006 Метка оператора уже встречалась как метка другого оператора 007 Одно и то же имя использовано для обозначения различных объектов программного модуля 008 Нельзя распределить память из-за неправильного использова- ния имени 009 Неправильный порядок расположения операторов 010 Неправильный размер (длина) поля памяти, числа или метки 011 Используются элементы неописанного массива 012 Количество индексов переменной не соответствует размерности массива 013 Неправильная запись оператора. Синтаксическая ошибка 014 В операторе явного описания типа или операторе DATA тип константы не соответствует типу переменной, которой константа должна быть присвоена 015 Отсутствует оператор END в модуле 016 Недопустимое применение оператора 017 Недопустимое применение оператора RETURN 018 Неправильная длина списка (количество) фактических пара- метров 019 В подпрограмме функции нет нн одного присваивания с именем функции в левой части 020 Объектам общего блока ххх не может быть распределена па- мять из-за несоблюдения правил использования оператора COMMON и, возможно, оператора EQUIVALENCE 021 Отсутствует оператор, помеченный меткой, на которую указыва- ет оператор DO; напечатан список таких меток 022 Отсутствует оператор, помеченный меткой, на которую указыва- ет другой оператор. Напечатан список таких меток 023 Для переменных, указанных в операторе EQUIVALENCE, не- льзя распределить память из-за противоречий между элемента- ми этого оператора или из-за несоблюдения правил переменных 024 Элемент массива, указанный в операторе EQUIVALENCE, на- ходится вне массива 025 Неправильное использование массива с переменными верхними границами индексов. Напечатаны имена таких массивов 026 В модуле BLOCK DATA включены переменные, не указанные в операторе COMMON. Напечатан список таких переменных 027 Оператор имеет более 19 строк продолжения 366
030 Ошибка в модуле, полученном в результате трансляции 032 Отсутствует текст Фортран-программы. Оператор /» предше- ствует первому оператору исходного модуля 033 Между двумя последовательными операторами обнаружено бо- лее 30 строк комментариев 034 Ошибка ввода-вывода 036 Данный оператор не может иметь метки 037 Размерность массива определена дважды 038 Размер константы, указанной в операторе явного описания типа или в операторе DATA в качестве начального значения пере- менной, превышает длину отведенного для переменной поля памяти 039 Пропущен оператор RETURN 040 Ошибка при использовании общего блока в блоке данных ПРИЛОЖЕНИЕ 5. ПЕРЕЧЕНЬ ОСНОВНЫХ ДИАГНОСТИЧЕСКИХ СООБЩЕНИЙ НА ЭТАПЕ ВЫПОЛНЕНИЯ ПРОГРАММЫ НА ЯЗЫКЕ ФОРТРАН В СРЕДЕ ОС ЕС Каждое диагностическое сообщение об ошибке, обнаруженное на этапе выполнения программы пользователя на языке ФОРТРАН в операционной среде ОС ЕС, имеет вид IHC {номер ошибки) I {текст сообщения) Например, возможно сообщение 1HC209I IBCOM — PROGRAM INTERRUPT (Р) — DEVIDE CHECK означающее, что произошло программное прерывание из-за попытки деления на нуль. Ниже для основных диагностических сообщений приводятся номера ошибок и дается разъяснение их смысла. 207 Программное прерывание из-за переполнения порядка. Ре- зультат — максимально допустимое число 208 Программное прерывание из-за исчезновения порядка. Ре- зультат — нуль 209 Программное прерывание из-за попытки деления на нуль. Деление не производится 210 Программное прерывание. Напечатано старое слово состоя- ния программы ххх, восьмой символ которого является кодом прерывания и указывает причину прерывания 211 Неправильный символ в операторе FORMAT. Напечатан символ ххх, ошибочный описатель поля воспринят как конец специ- фикации формата 215 При форматном вводе чисел по коду I, Е, F или D обнаружен недопустимый символ. Символ ххх напечатан 367
217 218 219 220 225 230 241 242 243 244 245 246 247 251 252 253 254 255 256 257 258 259 261 262 263 264 265 266 267 368 Обнаружен конец набора данных, а список ввода еще не исчер- пан. Напечатан ссылочный номер набора данных ххх Ошибка ввода-вывода Загрузочный модуль содержит ссылку на несуществующий на- бор данных. Напечатано dd-имя ххх или ссылочный номер набора ууу Ссылочный номер набора данных выходит за пределы номеров, установленных при генерации. Напечатан номер ххх При форматном вводе по коду Z обнаружен недопустимый символ ххх. Напечатана запись, содержащая символ При выполнении подпрограммы ууу обнаружена ошибка в опе- раторе с номером ххх Операция возведения целого основания в целую степень при нулевом основании и отрицательном или нулевом показателе степени См. 241, при вещественном основании См. 241, при основании двойной точности Возведение вещественного основания в вещественную степень при нулевом основании и отрицательном или нулевом показа- теле степени См. 244, при основании двойной точности См. 244, при комплексном основании длиной 8 байт См. 244, при комплексном основании длиной 16 байт Извлечение квадратного корня из вещественного отрицатель- ного числа Вычисление экспоненты вещественного числа, превышающе- го 174,673 Вычисление логарифма вещественного числа, равного или меньшего нуля, или возведение отрицательного числа в ве- щественную степень Вычисление синуса (косинуса) вещественного числа, модуль которого больше или равен л-2'8 Вычисление арктангенса частного двух вещественных чисел, равных нулю Вычисление гиперболического синуса (косинуса) веществен- ного числа, модуль которого больше или равен 174,673 Вычисление арксинуса (арккосинуса) вещественного числа, модуль которого больше 1 Вычисление тангенса (котангенса) вещественного числа, модуль которого больше или равен л-2'8 Вычисление тангенса (котангенса) вещественного числа, модуль которого находится вблизи особой точки См. 251, отрицательного числа двойной точности См. 252, числа двойной точности См. 253, числа двойной точности См. 254, числа двойной точности, модуль которого больше или равен л-2'8 См. 255, числа двойной точности См. 256, числа двойной точности См. 257, числа двойной точности
268 См. 258, числа двойной точности, модуль которого больше или равен л-218 269 См. 259, числа двойной точности 271 Вычисление экспоненты комплексного числа длиной 8 байт, вещественная часть которого превышает 174,673 272 Вычисление экспоненты комплексного числа длиной 8 байт с мнимой частью, модуль которой больше или равен л-218 273 Вычисление логарифма комплексного числа длиной 8 байт, вещественная и мнимая части которого равны нулю 274 Вычисление синуса (косинуса) комплексного числа длиной 8 байт с вещественной частью, модуль которой больше или равен л-2‘8 275 Вычисление синуса (косинуса) комплексного числа длиной 8 байт с мнимой частью, модуль которой больше 174,673 281 См. 271, комплексного числа длиной 16 байт 282 См. 272, комплексного числа длиной 16 байт с мнимой частью, модуль которой больше или равен л-250 283 См. 273, комплексного числа длиной 16 байт с модулем вещест- венной части большим или равным л-250 284 См. 274, комплексного числа длиной 16 байт и с модулем вещественной части, большим или равным л-250 290 Количество ошибок с номером ххх достигло предельно допусти- мого значения. Выполнение прекращено ПРИЛОЖЕНИЕ 6. СИСТЕМНЫЕ КОДЫ ЗАВЕРШЕНИЯ В ОС ЕС При прохождении задания в операционной системе на раз- ных этапах могут быть обнаружены различные ошибочные ситуа- ции, по которым выдаются диагностические сообщения (см. при- ложения 4, 5). В некоторых случаях система выдает общее сообщение вида COMPLETION CODE — SYSTEM=xxx USER={/j/t/t/ Если в этом сообщении системный код ххх=000, а пользователь- ский код уууу 0000, то этому сообщению предшествует диагностиче- ское сообщение программы обработки ошибок. Если же уууу=0000, а ххх =#000, то объяснение создавшейся ситуации можно найти в [13] по системному коду завершения. Наиболее часто встречающиеся системные коды завершения ОС4 — прерывание по защите памяти, т. е. адрес выходит за пре- делы области, отведенной программе (может возникнуть при выходе значения индекса за границу) ОС5 — прерывание по неправильной адресации, т. е. адрес выхо- дит за пределы памяти ЭВМ (может возникнуть при выхо- де значения индекса за границы массива) ОС7 — прерывание из-за неправильных данных 13 В. Е. Алексеев и др. 369
ОС8 — прерывание по переполнению при выполнении операции над числами с фиксированной точкой ОС9 — прерывание по некорректному делению с фиксированной точкой (деление на нуль) ОСА — прерывание по переполнению при выполнении операций десятичной арифметики ОСВ — прерывание по некорректности десятичного деления ОСС — прерывание по переполнению порядка при сложении, вы- читании, умножении или делении с плавающей запятой OCD — прерывание по исчезновению порядка при выполнении арифметической операции над числами с плавающей запя- той (порядок меньше допустимого, а мантисса ненулевая) OCF — прерывание при потере значимости при выполнении опера- ции над числами с плавающей запятой OCF — прерывание при попытке деления с плавающей запятой на число с нулевой мантиссой 322 — время выполнения шага задания превысило выделенный лимит времени ПРИЛОЖЕНИЕ 7. ИНСТРУКЦИЯ ПО РАБОТЕ НА ПЭВМ ЕС С СИСТЕМОЙ ПРОГРАММИРОВАНИЯ БЕЙСИК Система программирования Бейсик ПЭВМ ЕС включает в себя интерпретатор и компилятор с общим входным языком. Для разра- ботки и отладки программ, как правило, используется интерпретатор, имеющий встроенный экранный редактор текста. Работа с интерпретатором ведется в режиме диалога под управ- лением операционной системы MS — DOS. Последовательность работы пользователя с интерпретатором Бейсика включает в себя несколько этапов: 1. Подготовка ЭВМ к работе. 2. Загрузка (вызов) интерпретатора. 3. Ввод программы в оперативную память. 4. Редактирование программы. 5. Запуск программы на исполнение. 6. Запись программы на магнитный диск (дискету и ее со- хранение). 7. Вывод программы из оперативной памяти. 8. Завершение работы с интерпретатором. 1. Подготовка ЭВМ к работе. Этот этап состоит из включения ЭВМ и дисплея, установки дисков с операционной систе- мой и интерпретатором, загрузки операционной системы и подготовки ее к работе. О готовности операционной системы к работе свидетель- ствует появление на экране системной подсказки (иногда ее называют приглашением к работе). Подсказка представляет собой логический номер текущего накопителя на магнитных дисках, за которым следует 370
знак «>». Логический номер представляется либо цифрой 1, 2, 3_ , либо буквой А, В, С, ... . 2. Загрузка (вызов) интерпретатора. После по- явления на экране символа А:\>, свидетельствующего о готовности операционной системы к работе, следует выдать команду BASICA. Появление на экране сообщения ОК означает готовность интерпрета- тора к работе, т. е. к вводу операторов и команд интерпретатора Бейсик. В этом состоянии интерпретатор может либо непосредственно выполнять команды и операторы Бейсика сразу после их ввода (ре- жим прямой интерпретации), либо включать их в программу. По- ведение интерпретатора зависит от того, в какой форме вводятся команды и операторы. Если введенная строка начинается с номера строки, то интерпре- татор считает ее частью программы. Такие строки сохраняются в па- мяти, образуя программу, которая впоследствии может быть выпол- нена или сохранена на диске. Если номер во введенной строке отсутствует, то интерпретатор выполняет команды и операторы в режиме прямой интерпретации, т. е. сразу после ввода строки. Режим прямой интерпретации по- зволяет непосредственно наблюдать результат выполнения команды или оператора. 3. Ввод программы в оперативную память. Перед созданием новой программы выдать команду NEW. Она вы- зывает удаление размещенной в основной памяти программы и за- крытие всех связанных с ней файлов. Ввод исходного текста про- граммы осуществляется построчно, последовательным нажатием со- ответствующих алфавитно-цифровых клавиш и клавиши ВВОД. 4. Редактирование программы. Язык БЕЙСИК рас- полагает большими возможностями по редактированию текстов про- грамм в диалоговом режиме. С помощью команд этого языка можно осуществлять редактирование в любом месте программы. Замена символа. Если в строке обнаружен ошибочный символ, то для его замены необходимо переместить курсор в позицию, со- держащую ошибочный символ, и ввести правильный. Удаление символа. Если в строке обнаружен лишний символ, то для его удаления необходимо переместить курсор в позицию, содер- жащую этот символ, и нажать клавишу УДЛ. Вставка символа. Если обнаружено, что в строке пропущен символ, то для его вставки необходимо переместить курсор в ту по- зицию, в которую символ должен быть вставлен, и нажать клавишу ВСТ для перехода в режим вставки. После этого следует вводить нужный символ. Для отмены режима вставки необходимо повторно нажать эту клавишу или любую клавишу управления курсором. Усечение строки (удаление из нее группы конечных символов). Выполняется с помощью управляющих клавиш УПР—КОН. На- жатие комбинации этих клавиш вызывает удаление части строки, начиная с позиции курсора, и до конца строки. Стирание строки. Нажатие клавиши КЛЮЧ вызывает удаление всей строки, на которую в текущий момент указывает курсор. На- жат не клавиши КОН позволяет переместить курсор в конец строки. 13* 371
Введенные после этого символы добавляются в конец строки. Добавление строки. Для этого необходимо ввести строку текста с номером и нажать ВВОД. Введенная строка сохраняется в памяти ЭВМ как часть программы на языке БЕЙСИК. Для изменения со- держимого введенной строки необходимо набрать номер исправляе- мой строки и ее новое содержание, при этом новая строка, заменив- шая старую, будет иметь тот же номер. Если при вводе ошибочно был пропущен какой-то оператор, то его можно ввести позднее, так как операторы располагаются в памя- ти в порядке номеров строк. Удаление строки (уже введенной). Для этого достаточно ввести только иомер нужной строки. Удаление группы строк осуществляется командой DELETE (описание команд редактирования приведено ни- же). Для удаления всей расположенной в памяти программы необхо- димо ввести команду NEW. Корректировка строки. Для корректировки строки, расположен- ной в любом месте экрана, необходимо подвести курсор к нужной строке, затем, используя технику удаления, замены и добавления символов, изменить строку и нажать клавишу ВВОД. Если нужной строки нет на экране, то эту строку или группу строк можно отобразить на экран с помощью команды LIST. Необхо- димо помнить, что в процессе редактирования изменения вносятся только в программу, размещенную в основной памяти. Для сохране- ния скорректированной программы на диске необходимо выполнить команду SAVE. Команды редактирования. Редактирование программы осуще- ствляется также с помощью команд редактирования LIST, DELETE, EDIT, AUTO, RENUM. Команда LIST предназначена для вывода всей или части про- граммы, находящейся в оперативной памяти, на экран дисплея. Формат команды: LIST LIST пс LIST пс,—пс? вывод всей программы вывод строки с номером пс вывод группы строк, начиная со строки пс\ и включая строку пс^ LIST пс — вывод от указанной строки пс и до конца про- граммы LIST—пс вывод с начала до указанного номера пс Команда DELETE исключает (стирает) одну или несколько строк программы. Способы использования команды DELETE аналогичны способам команды LIST. Так, по команде DELETE уничтожаются все строки текущей программы; по команде DELETE 25 уничтожается 25-я стро- ка; по команде DELETE-30 исключаются строки от начала програм- мы до ЗО-й строки; по команде DELETE 30—55 стираются все строки, номера которых находятся в пределах от 30-й до 55-й; по команде DELETE 55— уничтожаются строки с 55-й до последней. 372
Команда EDIT предназначена для вывода на экран строки с целью последующего редактирования. Формат команды: EDIT номер строки Команда AUTO устанавливает режим автоматической нумера- ции строк и используется обычно для сокращения объема данных, набираемых на клавиатуре при вводе программы (и тем самым исключить набор номеров строк). Формат команды: AUTO начальный номер, приращение Например, AUTO 10, 10 приведет к нумерации вводимых строк, начиная с номера 10 с шагом 10. Для отмены режима автоматической нумерации строк использу- ется комбинация клавиш УПР — СТОП. Команда RENUM позволяет изменить нумерацию строк. Формат команды: RENUM nci, пс2, шаг где ПС| — первый номер перенумерованных строк; лс2 — старый но- мер строки, указывающий на начало перенумеруемого участка; шаг — шаг приращения номеров, перенумерованных строк. Например, команда RENUM 100, 200, 10 позволяет изменить нумерацию для строк с 200-й и до конца программы, причем строка с номером 200 после нумерации будет иметь номер 100, а все по- следующие номера будут увеличиваться на 10 (100, ПО, 120...). Если не указан шаг, то нумерация проводится с шагом 10. Если не указан старый начальный номер, то нумерация проводится с начала программы. Вместе с перенумерацией строк программы команда RENUM из- меняет и операнды в операторах, передающих управление: GOTO, GOSUB, ON, IF и т. д. Команда NEW выполняется, как правило, перед созданием но- вой программы. Она не имеет параметров и вызывает удаление разме- щенной в основной памяти программы, а также закрытие всех связан- ных с ней файлов. 5. Запуск программы на исполнение. Осуще- ствляется командой RUN. Она имеет два формата: RUN [номер строки] RUN спецификация файла [,R] Первый формат служит для выполнения программы, находящей- ся в основной памяти. Если в команде задан номер строки, то выпол- нение начинается с указанной строки программы, по умолчанию — начиная с первой строки. Второй формат используется для программы, предварительно записанной на диск. По команде RUN программа с именем, указан- ным в спецификации файла, загружается в оперативную память, замещая находящуюся там программу, а затем начинает выпол- няться. Если при этом задан режим R, то файлы данных, открытые предыдущей программой, не закрываются и остаются доступными исполняемой программе. 373
Если в процессе выполнения программы интерпретатор обнару- жил ошибку, то на экран выводится диагностическое сообщение в виде текста на английском языке. Перечень сообщений приведен в приложении 1. Ошибки, обнаруживаемые интерпретатором, могут быть двух типов: фатальные, при которых программа останавливается, нефа- тальные, прн которых программа не останавливается, но результат ее выполнения может быть неправильным. Можно прервать в этом случае выполнение прораммы нажатием одновременно клавиш УПР — СТОП. Печатается сообщение с номером последней выпол- няемой строки. После выполнения отладочных действий программа возобновляется командой RUN номер строки. При нормальном завершении программы выводится сообще- ние ОК- 6. Запись программы на магнитный диск. Мно- гократное использование программ или работа с несколькими про- граммами требует их сохранения путем записи на диск. Формат команды SAVE ’’спецификация файла” Программный файл должен иметь спецификацию: [имя устройства:} имя файла [.BAS] где имя устройства есть А, В, С... или 1, 2, 3... при выводе на диск. Имя устройства можно не упоминать, если вывод осуществляется на диск, откуда вводился интерпретатор; имя файла— имя, присваивае- мое программному файлу, содержащее ие более восьми символов. Программа записывается на диск в виде файла с указанным именем. Если тип файла не указан, то по умолчанию предполагается тип BAS. Если на диске уже существует файл с таким именем, то он будет удален. Например, SAVE ”B:MAINLIB” запишет на диск В программу с именем MAINLIB. По умолчанию програм- мному файлу присваивается тип BAS. На диске будет имя файла MAINLIB.BAS. 7. Вывод программы из оперативной памяти на печатающее устройство. Этот этап выполняется командой LLIST, аналогичной команде LIST для вывода на экран, и имеет такой же формат. 8. Завершение работы с интерпретатором Бейсик и возврат управления операционной системе. Этот этап осуществляется командой SYSTEM, после ввода которой на экране появится А:\> или 1 > Команды интерпретатора для работы с файлами. Интерпретатор Бейсика позволяет работать с файлами программ и файлами данных. Файлы данных открываются, обрабатываются и закрываются опера- торами языка БЕЙСИК- Файлы программ открываются и создаются командами интерпретатора в режиме редактирования. Все команды, предназначенные для работы с дисковыми файла ми, требуют указания в качестве параметров спецификации файла. 374
Спецификация файла задается строковым выражением и в общем случае состоит из трех частей: имени устройства, имени файла и ти- па файла. Просмотр оглавления файлов, записанных на диск. Если при работе с дисками необходимо ознакомиться с именами файлов, размещенных на них, то необходимо выдать команду получе- ния оглавления диска FILES. Формат команды: FILES [спецификация файлов] На экране дисплея будут перечислены все находящиеся на указанном диске файлы, имена которых соответствуют заданной спе- цификации. Если параметр опущен, то выдается полный список всех файлов на текущем диске. Команда NAME служит для переименования дисковых файлов. Формат команды: NAME "старое имя" AS "новое имя" Старое имя задается в полном соответствии со спецификацией файла. Новое имя не должно включать имя устройства, так как файл остается на том же диске. Например: NAME ”B:PROG1.BAS” AS ’’PROGON.BAS" Удаление файла с диска выполняется командой KILL (удалить), имеющей формат: KILL "спецификация файла" Если файл удаляется с системного диска, то имя устройства в спецификации файла можно не указывать. Например, команда KILL "A3.BAS” удаляет с системного диска файл с именем АЗ. Загрузка программы с диска в оперативную память выполняется командой LOAD, имеющей формат LOAD "спецификация файла" [,R] По команде LOAD программа, находящаяся в указанном файле, загружается в оперативную память и замещает размещенную там программу. Если указан параметр R, то загруженная программа начинает выполняться. Запуск программы на выполнение с диска. Команда RUN спецификация файла считывает программу с диска в оперативную память и запускает ее на выполнение. Здесь имя программы в специ- фикации файла является обязательным. Если устройство является си- стемным диском, то его можно не указывать. Например, RUN C:PR.BAS или RUN PR.BAS. Объединение предварительно записанной программы в файл на диске с программой, находящейся в оперативной памяти, выпол- няется командой MERGE (объединить), имеющей формат: MERGE "спецификация файла" В соответствии с командой указанный файл считывается в па- мять и сливается с программой, содержащейся в ней в данный мо- мент. Если у двух программ имеются одинаковые номера строк, то 375
сохраняется строка считываемой из файла программы. Полученная в результате объединения строк программа остается в основной памяти. Признаком выполнения всех указанных в этом разделе команд интерпретатора является сообщение ОК. Работа с файлами данных. Программные файлы представляют собой текст программы и вводятся в оперативную память (или из нее) целиком. Файлы данных содержат числа или строки символов и вво- дятся (выводятся) из оперативной памяти порциями (записями) опе- раторами ввода (вывода), включенными в программу пользователя. Файлы данных, как и программные файлы, должны специфици- роваться. Спецификация файла также состоит их трех составляю- щих: имени устройства, имени файла и типа файла. Именами устрой- ства являются: А, В, С... или 1, 2, 3, если файл данных размещается или будет размещен на диске; LPT1 — при выводе на печатающее устройство. Имя устройства можно не указывать, если оно является системным. Возможно следующее описание типа файла: .DAT — для файлов входных и выходных данных (постоянных); .ТМР — для рабочих файлов данных (временных). По умолчанию — тип файла .DAT Например: В:SPISOK.DAT ,C:PROG1.TMP Работа с файлами последовательного досту- па. В этих файлах данные записываются по очередности их поступле- ния и считываются в том же порядке. С файлами последовательного доступа используются следующие операторы и функции: CLOSE, INPUT#, LINE INPUT#, OPEN, PRINT# USING, WRITE#, EOF, LOC Для создания файла с последовательным доступом или добавле- ния к нему новых записей необходимо произвести следующие шаги: — оператором OPEN открывается файл; — операторами PRINT#, WRITE# или PRINT# USING данные записываются в файл; — оператором CLOSE файл закрывается. Для считывания данных из файла необходимы следующие шаги: — оператором OPEN открывается файл для считывания; — операторами INPUT#, LINE INPUT# считываются дан- ные из файла; — оператором CLOSE файл закрывается. Работа с файлами прямого доступа. Файлы пря- мого доступа занимают больше места на носителе, но доступ к ним осуществляется быстрее. Информация запоминается в виде отдель- ных единиц, называемых записями, которые пронумерованы, и доступ к ним осуществляется по номеру записи. Записи могут иметь про- извольную длину, но не более 32767 байтов. С файлами прямого доступа используются следующие операторы и функции: CLOSE, FIELD, GET, LSET, RSET, OPEN, PUT, CVD, CVI, CVS, LOC, MKI$, MKS$, MKD$ Для создания файла с прямым доступом необходимы следую- щие шаги: 376
— оператором OPEN файл открывается в режиме непосред- ственного ввода-вывода; — оператором FIELD осуществляется распределение простран- ства в буфере данных для переменных, которые будут за- писываться в соответствии со структурой записи; — операторами LSET и RSET осуществляется пересылка дан- ных в буфер. При помощи функций MKI$, MKS$, MKD$ все числовые величины преобразуются в символьные переменные перед пересылкой в буфер; — оператором PUT осуществляется запись данных на дискету с буфера; — оператором CLOSE файл закрывается. Для считывания данных с файла прямого доступа необходимы следующие шаги: — оператором OPEN файл открывается в режиме непосред- ственного ввода-вывода; — оператором FIELD осуществляется распределение буфера файла для переменных, которые будут считаны с файла, в соответствии со структурой записи; — оператором GET осуществляется пересылка данных из файла в буфер. Программа имеет доступ к данным в буфере, а чис- ловые величины необходимо снова преобразовать из символь- ных в числовые при помощи функций CVI, CVD и CVS; — оператором CLOSE файл закрывается. Работа с файлами последовательного и прямого доступа про- иллюстрирована в примерах § 2.12 и лабораторной работе № 15. ПРИЛОЖЕНИЕ 8. ИНСТРУКЦИЯ ПО РАБОТЕ С СВМ ЕС ЭВМ Состав СВМ. В СВМ может быть реализовано множество вирту- альных машин (ВМ), каждая из которых является эквивалентом реальной машины, управляемой собственной операционной системой. В состав виртуальных машин входят терминал пользователя (дис- плей), выделенная ей часть оперативной памяти, внешняя память на магнитных дисках (мини-диски); кроме того, ВМ выделяется квант машинного времени центрального процессора и по мере надобности могут подключаться необходимые периферийные устройства. Ввод информации пользователя в ВМ осуществляется с по- мощью клавиатуры дисплея, а вывод информации из ВМ осуществля- ется на экран дисплея. Клавиатура дисплея. Клавиатура дисплея состоит из информа- ционных и управляющих клавиш. Информационные клавиши используются для ввода операторов программы и команд операционной системы.
Управляющие клавиши используются для ввода информации в ВМ, перемещения курсора, ввода пробела, изменения регистра (верхнего или нижнего) и т. д. Кроме перечисленных имеются функциональные клавиши, кото- рые используются для облегчения работы пользователя, так как каждой из них можно подставить в соответствие целую последова- тельность символов или команд операционной системы. Назначение функций, выполняемых этими клавишами, различно и изменяется с помощью специальной команды. Порядок работы в СВМ 1. Для того чтобы начать работу на ВМ, пользователь должен ввести команду LOGON, имеющую структуру L [OGON] {имя ВМ) [(пароль)] где {имя ВМ) — имя виртуальной машины, которое зарегистрирова- но в системе; {пароль) — пароль, которым защищена ВМ. В прямоугольных скобках указана информация, которая может быть опушена. Если в команде опущен пароль, то машина выдает сообщение, требующее его ввода. При вводе пароля он иа экране дисплея не высвечивается. После ввода команды LOGON ВМ находится в среде монитора виртуальных машин (МВМ) и можно вводить команды МВМ. Для загрузки подсистемы диалоговой обработки (ПДО) используется команда IPL, после выполнения которой ВМ переходит в среду ПДО. Чаще всего команда IPL включается в описание ВМ, поэтому загрузка ПДО осуществляется автоматически. Некоторые команды МВМ и их назначение приведены ниже: LOGON Начало сеанса работы на ВМ LINK Включение в конфигурацию ВМ минн-диска другой ВМ QUERY Получение справочной информации по ВМ и системе SET Назначение функций для клавиш программного функ- ционирования ПФ LOGOFF Завершение сеанса работы на ВМ IPL Начальная загрузка ПДО на ВМ ATTN Приостановка обработки 2. После перехода в среду ПДО можно осуществить ввод про- граммы, вызвав редактор текстов с помощью команды ПДО, в кото- рой указываются имя программного файла и его тип. В этом же режиме осуществляется редактирование (корректирование) ранее введенной программы, а также создание файлов данных. 3. После ввода или корректировки программы осуществляется ее трансляция путем вызова специальной командой транслятора с одно- го из языков, входящих в состав операционной системы. При трансля- ции программы автоматически создаются файл объектных модулей и файл листинга программы, который содержит ошибки, обнаружен- ные при трансляции. 4. После трансляции программы выполняется переход в режим 378
редактора текстов, просматривается листинг программы и осуще- ствляется устранение ошибок, если таковые имеются. 5. После устранения ошибок осуществляется повторная трансля- ция программы и ее редактирование до тех пор, пока не будут устра- нены все ошибки. 6. После этого с помощью команды LOAD осуществляется ре- дактирование и загрузка объектного модуля, в результате чего со- здается абсолютный модуль. 1. Запуск на выполнение программы осуществляется командой START. 8. Для просмотра результатов на экране используется команда BROWSE. 9. При необходимости осуществляется вывод на печать текста программы и результатов ее выполнения 10. Окончание работы с системой осуществляется командой LOG [OFF], Состояние пульта ВМ. Состояние пульта ВМ высвечивает в по- следних позициях нижней строки экрана дисплея и имеет следующие значения: СР READ VM READ RUNNING MORE HOLDING NOT ACCEPTED — состояние МВМ, можно вводить команды МВМ — состояние пульта МВМ, можно вво- дить команды МВМ и ВМ — состояние ПДО, можно вводить команды МВМ, ВМ и ПДО — переполнение буфера экрана — задержка вывода информации — состояние недоступности ВМ, ВМ не выполнила предыдущую команду, не- обходимо повторить ее ввод Переход из одного состояния пульта в другое осуществляется в соответствии с диаграммой (рис. П.8). Рнс. П.8 379
Организации дисковых файлов. Дисковые файлы содержат ис- ходные тексты программ, объектные и абсолютные модули, листинги программ, результаты выполнения программ, процедуры и т. д. Каж- дый дисковый файл описывается следующим образом: {имя файла) {тип файла) {режим файла) где {имя файла) — имя, содержащее от одного до восьми символов, назначается пользователем; {тип файла) — содержит от одного до восьми символов, для некото- рых файлов используются стандартные имена: FORTRAN — исходный модуль на языке ФОРТ- РАН; PLI — исходный модуль иа языке ПЛ/1; PASCAL — исходный модуль на языке ПАС- КАЛЬ; ASSEMBLE — исходный модуль на языке Ассемб- лера; BASIC — исходный модуль на языке БЕЙСИК; GPSS — исходный модуль на языке GPSS; TEXT — объектный модуль, полученный после трансляции; LISTING — распечатка программы, полученная после трансляции; MAP — абсолютный модуль; EXEC — модуль организации процедур, со- держащий команды МВМ и ПДО. {режим файла) — буквы и цифры, указывающие имя ми- ни-диска. Технология подготовки и выполнения программ в среде ПДО. Исходный текст программы вводится в ЭВМ с помощью программы редактора текстов. При этом пользователь создает программный файл, используя команду вызова редактора текстов, например, ХЕ- D1T. После набора программа заносится в дисковый файл с помощью команды FILE. Затем подготовленная программа транслируется с со- ответствующего языка программирования. Для вызова трансляторов используются команды, имеющие структуру: {имя команды) {имя файла) [{режимы трансляции)] Имена команд следующие: FORTSE — ФОРТРАН стандартный расширен- ный; FORTOE — ФОРТРАН стандартный оптимизи- рующий; FORTVS — ФОРТРАН-77; PLIOPT — ПЛ/1 оптимизирующий; PLIC — ПЛ/1 отладочный; PASCAL — ПАСКАЛЬ; 380
BASIC ASSEMBLE ASMH — БЕЙСИК; — Ассемблер E; — Ассемблер H. В результате трансляции создаются два новых файла: 1 — файл типа LISTING, содержащий текст программы на исходном языке и сообщения об ошибках, обнаруженные при трансляции; * 2 — файл типа TEXT, содержащий программу на машинном языке (объектный модуль). Анализ ошибок, обнаруженных при трансляции, выполняется при просмотре файла {имя файла} LISTING {режим файла} с помощью команды FLIST, а их исправление—в исходном тексте программы с помощью редактора текстов. После корректировки про- грамму следует занести либо в старый, либо в новый файл с помощью команды FILE. Затем необходимо выполнить повторную трансляцию, при этом файлы объектного модуля и листинга обновляются автома- тически. Если программа после трансляции не содержит ошибок, то с помощью команды LOAD осуществляются ее редактирование и за- грузка. В процессе редактирования из библиотеки объектных моду- лей стандартных подпрограмм вызываются необходимые подпрограм- мы и также загружаются в оперативную память ВМ. Соответствую- щие библиотеки должны быть предварительно описаны в команде определения библиотек GLOBAL. В результате редактирования в памяти ВМ создается абсолют- ный модуль программы, готовый к выполнению. План абсолютного модуля и диагностические сообщения помещаются в файл, имеющий тип МАР. По желанию пользователя абсолютный модуль может быть записан в файле типа MODULE с помощью команды GENMOD. Перед выполнением программы необходимо указать местона- хождение исходных данных и результатов выполнения, для чего можно использовать файлы на мини-дисках или пульт ВМ. Если исходные данные вводятся из файла, то его предварительно необходи- мо описать с помощью команды FI (LEDEFJ и создать с помощью редактора текстов. Например, описание входного и выходного файлов для языка ФОРТРАН осуществляется следующими командами: FI 05 DISK FILE FT05F001 (PERM FI 06 DISK (PERM По последней команде на мини-диске создается файл с именем FILE FT06F001. При вводе и выводе данных с пульта ВМ исполь- зовать команду FILE DEF нет необходимости. Запуск программы на выполнение осуществляется командой START. Результаты выполнения программы в соответствии с предвари- тельным заказом либо выводятся на пульт ВМ, либо записываются 3«1
в указанный файл на мини-диске. Для просмотра результатов в по- следнем случае используются команды FLIST и BROWSE, а для вывода результатов на печать — команда PRINT с указанием имени файла результатов. Для указанного выше примера описания файла результатов команда имеет вид PRINT FILE FT 06 F 001. Некоторые команды ПДО (имена и назначения) приведены ниже: ACCESS, RELEASE Открытие и закрытие доступа к мини- диску ПДО FORMAT XED1T Начальная разметка диска ПДО Вызов программы редактора текстов для ввода и корректировки программ и исходных данных FLIST Просмотр каталога файлов на мини- диске ERASE BROWSE PRINT FORTSE, FORTOE, FORTVS, PLIOPT, PLIC, PASCAL, BASIC, ASMH, ASSEMPLE GLOBAL Удаление файлов на мини-диске Просмотр файла Печать файла Вызов трансляторов с языков програм- мирования Определение макробиблиотек и библио- тек объектных модулей LOAD Загрузка-редактирование объектных модулей INCLUDE Загрузка-редактирование дополнитель- ных объектных модулей GENMOD Создание абсолютного модуля и запись его на мини-диск ПДО LOADMOD FILEDEF Загрузка абсолютного модуля Описание файлов ПДО и наборов дан- ных START COPYFILE RENAME HX Пуск загруженной программы Копирование файлов Переименование файлов Прекращение выполнения команд ПДО и программы пользователя FILE Подкоманда XEDIT для записи файла программы или данных на миии-диск Пример сеанса работы с ВМ. Пример работы с ВМ при под- готовке и выполнении программ на языке ФОРТРАН приведен в табл. П. 8. Таблица П.8 Состояние системы Команда Примечание ВМ Нажать клавишу «Ввод» — 382
Продолжение табл. П.8 Состояние системы Команда Примечание СР READ СР READ L ( имя BM > [ ( пароль ) | (пароль) Начало сеанса работы RUNNING X {имя файла) FORTRAN Вызов редактора текста и файла программы XEDIT 1 Вызов режима ввода INPUT (ввод программы) ’’Ввод” Ввод текста программы XEDIT FILE Запись программного файла на МД RUNNING FI 05 DISK FILE FI 05 F 001 (PERM FI 06 DISK (PERM Описание файлов ввода и печати RUNNING FLIST Просмотр каталога файлов PDO ( Набрать X рядом с именем файла) Просмотр содержимого файла XEDIT (Редактирование файла) FILE Корректировка и запись от- редактированного файла на МД RUNNING XEDIT INPUT XEDIT X FILE FT05F001 1 (ввод данных) "Ввод” FILE Создание файла данных и запись его на МД RUNNING GLOBAL TXTLIB THOFORT SSPLIB1 SSPLIB2 SSPLIB3 Подключение библиотеки RUNNING FORTSE {имя файла) Трансляция исходного файла RUNNING FLIST Просмотр каталога ПДО (набрать X рядом с именем файла типа LISTING) Просмотр ошибок XEDIT XEDIT ( корректировка программы ) FILE Исправление программно- го файла и запись на МД RUNNING FORTSE {имя файла) Повторная трансляция ис- ходного файла 383
Продолжение табл. П.8 Состояние системы Команда Примечание RUNNING LOAD {имя файла) Редактирование и загрузка файла в ОП RUNNING START Выполнение программы RUNNING BROWSE FILE FT06F001 Просмотр результатов на экране BROWSE «Ввод» Продолжение просмотра BROWE RUNNING QQ PRINT {имя файла) LISTING Выход из редактора текста Печать текста программы RUNNING PRINT FILE FT06F001 Печать результатов RUNNING LOGOFF Конец сеанса работы Примечание. Для выхода из программы редактора текстов и перехода в состояние ПДО RUNNING может использоваться ко- манда QQ или одна из функциональных клавиш, которые в табл. П. 8 не указаны. Однако при этом запись файла на мини-диск не происходит. Работа с редактором текстов. Вызов программы редактора тек- стов осуществляется с помощью команды X [EDIT] {имя файла} {тип файла) {режим файла) Если файл с указанным именем не существует, то появляется строка разметки, командная строка, в которой указываются под- команды редактора и другая информация. Если файл с указанным именем существует, то выводится текст файла. Подкоманда ввода, используемая для ввода информации в файл, имеет вид I[NPUT], После выполнения команды можно вводить текст в поле ввода, расположенное между разметкой и ко- мандной (последней) строкой. После набора строки необходимо на- жать клавишу «Ввод». Для выхода из режима ввода необходимо дважды нажать клавишу «Ввод». Подкоманды перелистывания файла используются для переме- щения текста файлов, чтобы получить доступ к строкам текста, не разместившимся на экране (на экране 20 строк текста файла). К ним относятся: FO [RWARD] BA [CKWARD] +пп — пп — отобразить последующий фрагмент файла — отобразить предыдущий фрагмент файла — переместить файл на пп строк вперед — переместить файл иа пп строк назад 384
TOP В [ОТТОМ] — отобразить начало файла — отобразить конец файла Все подкоманды не имеют операндов. При работе подкоманд перелистывания текстовый редактор про- водит отсчет от текущей строки (строки повышенной яркости). Добавление, удаление, копирование и перемещение записей фай- лов осуществляются с помощью префиксных подкоманд, расположен- ных в префиксной области в левом краю символьной строки и по- меченных символами = = = = =. Префиксные подкоманды выпол- няются после нажатия клавиши «Ввод>, а их место расположения локализует область действия: 1. Добавить п строк после строки, в префиксной области которой указана подкоманда Ап или лА. 2. Удалить и строк, начиная со строки, в префиксной области которой указана подкоманда Dn или nD. 3. Переместить п строк, начиная со строки, в префиксной об- ласти которой указана подкоманда Мп или лМ. В префиксной об- ласти строки, после которой необходимо поместить перемещаемые строки, следует указать подкоманду F. 4. Скопировать п строк, начиная со строки, в префиксной об- ласти которой указана подкоманда Сп или пС. В префиксной области строки, после которой необходимо разместить скопированные строки, следует указать подкоманду F. 5. Групповые префиксные подкоманды требуют указания под- команд удаления (DD), перемещения (ММ) и копирования (СС) в первой и последней строках обрабатываемой группы. При этом подкоманда используется так же, как было показано выше. Во всех подкомандах по умолчанию п=1. Для поиска строки по образцу используется подкоманда /{строка символов) Подкоманда предназначена для поиска строки, содержащей указанную последовательность символов, просматривает файл от текущей строки до конца файла. Строка, содержащая эталонную подстроку, устанавливается в положение текущей строки. Подкоманда завершения работы с текстовым редактором осу- ществляет запись файла иа мини-диск и выход из программы ре- дактора текста. FILE (имя файла) (тип файла) (режим файла) Если имя файла не указано, то осуществляется запись в тот же файл, который указывался при вызове редактора. Выйти из программы редактора текста можно, осуществив команду QQ или нажав одну из функциональных клавиш, но при этом запись файла на мини-днске не выполняется.
ПРИЛОЖЕНИЕ 9. ПЕРЕЧЕНЬ БИБЛИОТЕЧНЫХ ПОДПРОГРАММ НА ЯЗЫКЕ ФОРТРАН На практике часто возникает необходимость в использовании решения типовых задач. Программы решения таких задач включают- ся в библиотеку научных (стандартных) подпрограмм (БСП) и могут использоваться пользователем при решении конкретной задачи. Ис- пользование библиотеки научных подпрограмм позволяет существен- но уменьшить затраты времени на программирование, так как задачей пользователя прн этом является лишь правильный выбор необходи- мой подпрограммы и запись в своей программе обращения к ней. Одним из основных достоинств языка ФОРТРАН является на- личие обширной библиотеки научных подпрограмм. Ниже будут рас- смотрены некоторые подпрограммы этой библиотеки, которые необхо- димы для выполнения конкретной лабораторной работы. Подпрограммы БСП строятся по принципу подпрограмм общего вида, обращение к которым осуществляется с помощью оператора CALL. В этих подпрограммах, как правило, нет операторов ввода и вывода, максимальные размеры массивов не фиксированы и указы- ваются в списках формальных параметров. Описание библиотечных подпрограмм кроме текстов подпрог- рамм содержит следующие сведения: имя подпрограммы, ее назначе- ние, обращение к подпрограмме, описание формальных параметров, перечень внешних подпрограмм, используемых данной подпрограм- мой. Среди параметров перечисляются не только входные, необходи- мые для выполнения подпрограммы, но и выходные, обозначающие результаты ее выполнения, а также вспомогательные, характеризую- щие входные данные и результаты. Описание подпрограммы может сопровождаться замечаниями и пояснениями. Для обращения к подпрограмме БСП используется оператор вызова CALL, который размещается в программе пользователя в том месте, где необходимо выполнить подпрограмму. При этом в операто- ре CALL указываются соответствующие фактические параметры. Входные параметры к моменту обращения к подпрограмме должны быть определены. Формальные и фактические параметры должны быть согласованы по количеству, порядку следования, типу и длине. Подпрограммы обработки матриц. В БСП имеется множество подпрограмм, предназначенных для обработки матриц. Все матрицы основной программы, которые в дальнейшем используются в под- программах в качестве фактических параметров, должны быть описа- ны в операторах описания размера массива. Матрицы, передаваемые в подпрограмму, должны храниться в памяти машины в виде вектора памяти, в котором каждый столбец матрицы без пропусков следует за предыдущим. Как при векторном, так н при матричном способе элементы матрицы размещаются в па- мяти по столбцам. Пусть матрица описана с помощью оператора DIMENSION 386
A (4, 4), а обрабатываемый массив имеет размер 3X3. В этом случае информация хранится в памяти следующим образом: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Для работы с подпрограммами матрица должна быть преобра- зована в вектор памяти, в котором элементы располагаются без пропусков: О11а2|аз1а|2О22аз2а|зО2зазз- Очевидно, что если матрица вводится полностью, то матричный и векторный способы хранения совпадают. Подпрограмма ARRAY используется для преобразования матрицы одного способа хранения в другой и обратно. Обращение к подпрограмме CALL ARRAY (MODE, I, J N, M, S, D) Описание формальных параметров: MODE — код, указывающий тнп преобразования (1 — из одно- мерного массива в двумерный, 2 — из двумерного в одномерный); I, J — соответственно реальное число строк и столбцов мат- рицы D; N, М — соответственно число строк и столбцов матрицы D, указанных в операторе DIMENSION; S — одномерный массив (вектор памяти); при MODE=1 этот вектор является входным и содержит элементы матрицы IXJ, пре- образуемые в матрицу D; при MODE = 2 этот вектор является вы- ходным, содержащим IX J элементов матрицы; D — двумерный массив D (матрица) размером NXM при MO- DE =1 является матрицей, преобразованной из вектора памяти S; при MODE = 2 является вводимой матрицей, содержащей элементы в первых I строках и J столбцах, которая преобразуется в вектор. В подпрограмме массива S и D могут занимать одну и ту же область памяти, в этом случае в списке параметров они обозначаются одним и тем же именем. Требуемые подпрограммы: нет Подпрограмма RSUM предназначена для определения суммы элементов каждой строки матрицы. Обращение к подпрограмме CALL RSUM (А, В, N, М, MS) Описание формальных параметров: А — имя входной матрицы; В — имя выходного одномерного массива (вектора) размера N, N и М — число строк и столбцов матрицы А; MS — код хранения матрицы: {О — прямоугольная матрица; 1 — симметричная (треугольная) матрица; 2 — диагональная матрица. 387
Требуемые подпрограммы: используется подпрограмма с име- нем LOC. Подпрограмма LOC предназначена для определения но- мера элемента в векторе памяти, если заданы номера строки и столб- ца матрицы. Обращение к подпрограмме CALL LOC (I, J, К, N, M, MS) Описание формальных параметров: 1, J — индексы строки и столбца элемента матрицы соответ- ственно; К — индекс элемента вектора, соответствующего элементу мат- рицы с индексами I и J; MS — код хранения матрицы. Пояснения. Если MS=O, то вычисляется индекс для матри- цы размера NXM. Если MS=I, то вычисляется индекс для верхней треугольной матрицы, при этом для элемента, расположенного в ни- жней части матрицы, вычисляется индекс, относящийся к верхней части матрицы. Если MS = 2, то определяется индекс матрицы, со- стоящей из N диагональных элементов. Если элемент не принадлежит диагонали, то К = 0. Требуемые подпрограммы: нет Подпрограмма GMADD предназначена для сложения двух матриц. Обращение к подпрограмме: CALL GMADD (А, В, R, N, М). Описание формальных параметров: А и В — имя первой и второй матриц; R — имя выходной результирующей матрицы; N и М — число строк и столбцов матриц. Требуемые подпрограммы: иет. Подпрограмма MPRD предназначена для умножения двух матриц с образованием матрицы результатов. Обращение к подпрограмме CALL MPRD (А, В, R, N, М, MSA, MSB, L) Описание параметров: А и В — имя первой и второй вводимой матриц; R — имя выво- димой матрицы; N — число строк в матрицах А н R М — число столбцов в матрице А и строк в матрице В; MSA — код хранения матрицы А: {О — прямоугольная матрица; 1 — симметричная матрица; 2 — диагональная матрица; MSB — код хранения матрицы В; L — число столбцов в матрицах В и R. 388
Примечание. Матрица R не должна помещаться в тех же ячейках, что и матрица А или В. Число столбцов матрицы А должно быть равно числу строк матрицы В. Требуемые подпрограммы: нет. Метод. Матрица В размера MXL перемножается с матрицей А размера NXM и результат помещается в матрицу R размера NX L. Матрица R всегда прямоугольная, за исключением случая, когда MSA=2 и MSB = 2. В этом случае матрица R — диагональная. Подпрограмма MINV предназначена для обращения матриц. Обращение к подпрограмме CALL MINV (A, N, D, L. М) Описание параметров: А — вводимая матрица, разрушаемая в процессе вычислений и замещаемая результатом инверсии; N — порядок матрицы А D — определитель результата; L, М — рабочие вектора размера N. Примечание. Матрица А должна храниться в общем виде (квадратная матрица). Требуемые подпрограммы: нет. Метод. Применяется стандартный метод Гаусса—Жордана, од- новременно подсчитывающий определитель. Определитель, равный нулю, указывает, что матрица особая (вырожденная). Подпрограммы для решения задач численными методами. К ним относятся подпрограммы вычисления корней многочленов и нелиней- ных уравнений, решения систем линейных уравнений, вычисления определенных интегралов, решения систем дифференциальных урав- нений, нахождения экстремумов функций и др. Описания некоторых из них приводятся ниже. Подпрограмма POLRT предназначена для вычисления действительных и мнимых корней действительного полинома Обращение к подпрограмме: CALL POLRT (XCOF, COF, M, ROOTR, ROOTI, IER) Описание параметров: XCOF — одномерный массив (вектор) из М-|-1 коэффициентов, упорядоченных в порядке возрастания степеней членов полинома; COF — рабочий вектор размера M-J-I; М — степень многочлена; ROOTR и ROOTR1 — векторы размера М, содержащие действи- тельные и мнимые части корней; IER — код ошибки: ' 0 — нет ошибки; 1 — при М< 1; JEP__ 2 — при М>36; 3 — невозможно определить корень после 500 итераций; 4 — коэффициент при наибольшей степени равен нулю. 389
Требуемые подпрограммы: нет. Использование вспомогательного выходного параметра позволя- ет установить причину ошибки в том случае, если решение задачи получить не удалось. Подпрограмма GELG предназначена для решения систе- мы совместных линейных уравнений общего вида. Обращение к подпрограмме CALL GELG (R, А, М, N, EPS, IER) Описание формальных параметров: R—матрица размера MXN, в которой размещаются правые части уравнений системы, при выходе из подпрограммы содержит решение системы; А — матрица коэффициентов уравнений размера МХМ (разру- шается подпрограммой); М — число уравнений в системе; EPS — константа, применяемая как относительный допуск при проверке на потерю значимости (EPS>IE — 8); 1ER — код ошибки: О — нет ошибки; 1 — нет ответа (либо М<1, либо ведущий элемент равен 0); 2 — предупреждение о потере значимости, указываю- щее на (К+1)-й шаг исключения, когда ведущий эле- мент меньше или равен внутреннему допуску EPS, умно- женному иа абсолютную величину элемента матрицы А. Требуемые подпрограммы: нет. При решении одной системы уравнений матрица R превращает- ся в вектор размера М. 1ER = Подпрограмма RTM1 предназначена для вычисления кор- ней нелинейного уравнения FCT (Х) = 0. Обращение к подпрограмме CALL RTMI (X, F, FCT, XLT, XRT, EPS, IEND, IER) Описание параметров: X — вычисленный корень уравнения; F — значения функции в корне X; FCT — имя используемой внешней подпрограммы-функции; XLT и XRT — входное начальное значение левой и правой гра- ниц корня X; EPS — входное значение верхней границы ошибки X; 1END — максимальное число заданных итераций; IER — код ошибки: IER = 0 — нет ошибки; 1 — нетсходимостиза1ЕКОитерационныхшаговприпо- следовательном делении интервала пополам; 2 — основное условие FCT (XLT)*FCT (XRT)^O не выпол- няется. 390
Используемые подпрограммы: внешняя подпрограмма-функция FCT (X), составленная пользователем, содержащая решаемые нели- нейные уравнения. Замечания. Параметр FCT в вызывающей программе до- лжен быть описан в операторе EXTERNAL. Подпрограммы RKGS и HPCG предназначены для реше- ния системы дифференциальных уравнений первого порядка методом Рунге—Кутта (PKGS) и методом Хемминга (HPCG). Обращение к подпрограммам: CALL RKGS (PRMT, Y, DERY, NDIM, IHLE, FCT, OUT, AUX) CALL HPCG (PRMT, Y, DERY, NDIM, IHLE, FCT, OUT, AUX) Обращение параметров: PRMT — вектор входных и выходных данных размера 5; PRMT(l), PR NT (2)—нижняя и верхняя границы интервала интегрирования соответствен ио; PRMT (3) — начальный шаг независимой переменной; PRMT (4) — верхняя граница погрешности. Если абсолютная погрешность больше погрешности PRMT (4), то шаг интегрирования делится пополам. Шаг интегрирования удваивается, если ои стано- вится меньше шага PRMT (3) и абсолютная погрешность меньше PRMT (4)/50. Пользователь может изменить значение PRMT (4) с помощью подпрограммы вывода. Параметры PRMT(l), PRMT (2), PRMT(3), PRMT (4) являются входными; PRMT (5) ие является входным. Подпрограммы полагают, что PRMT (5) =0. Если пользователю необходимо закончить работу программы в любой точке из интервала иитегрироваиия, то он может изменить PRMT (5) на ненулевое значение с помощью подпрограм- мы OUT; Y — входной вектор начальных условий размера NDIM (при работе не сохраняется); после выполнения подпрограммы вектор Y становится результирующим вектором зависимых переменных, вы- численных в промежуточных точках X; DERY — входной вектор размера NDIM весовых коэффициентов погрешности (при работе ие сохраняется). Сумма его коэффициентов должна быть равна единице. Далее DERY становится вектором про- изводных функций Y в точке X; NDIM — входное значение, определяющее число уравнений системы; IHLE — результирующее значение, определяющее число деле- ний начального шага пополам. Если IHLE становится больше 10, то подпрограмма передает управление в основную программу с сообще- нием об ошибке IHLE=II. Сообщение об ошибке IHLE = 12 или IHLE = 13 возникает соответственно в тех случаях, когда PRMT(3)=0 или sign (PRMT (3))=/= sign (PRMT (2) — PRMT (1)); FCT — имя внешней подпрограммы пользователя, в которой вычисляются производные системы для данных X и Y. В список ее параметров входят X, Y, DERY. Подпрограмма FCT должна сохра- нять X и Y; 391
OUT — имя внешней подпрограммы вывода, составляемой поль- зователем. В список ее параметров входят X, Y, DERY, IHLE, ND1M, PRMT. Ни одни из этих параметров, за исключением PRMT (4) и PRMT (5), не должен изменяться подпрограммой; AUX — вспомогательный массив размера 8XNDIM для под- программы RKGS и 16XND1M для подпрограммы 4PCG. Используемые подпрограммы: внешние подпрограммы FCT (X, Y, DERY) и OUT(X, Y, DERY, IHLE, NDIM, PRMT), составляемые пользователем. Имена FCT и OUT описываются в операторе EXTER- NAL основной программы. Замечания. Выполнение программы прекращается и управ- ление передается в основную программу, если: — требуется более десяти делений начального шага пополам, для того чтобы достичь достаточную точность (сообщения об ошибке 1HLE=I1); — начальный шаг равен нулю или имеет неверный знак (со- общения об ошибке IHLE=12 или IHLE=13); — интегрирование выполнено на всем интервале; — подпрограмма OUT изменила PRMT (5) на ненулевое значение. Подпрограмма QATR предназначена для вычисления оп- ределенного интеграла. Обращение к подпрограмме CALL QATR (XL, XU, EPS, NDIM, FCT, Y, IER, AUX) Описание параметров: XL и XU — нижний и верхний пределы интегрирования; EPS — верхняя граница абсолютной ошибки; NDIM—размер рабочего массива памяти AUX; (NDIM—1)—максимальное число делений пополам интервала (XL, XU); FCT — имя внешней подпрограммы-функции, составляемой пользователем; Y — вычисленное значение интеграла; IER — код ошибки: ' 0 — ошибки нет, требуемая точность достигается; 1 — требуемая точность не достигается из-за ошибок округления; 2 — невозможно проверить точность, так как NDIM<5 или требуемая точность не достигается за (NDIM—1) шагов. Следует увеличить NDIM. AUX — рабочий массив памяти размера NDIM. Требуемые подпрограммы: внешняя подпрограмма функция FCT должна быть составлена пользователем, ее аргумент X должен быть сохранен. Параметр FCT описывается в операторе EXTERNAL. Метод. Интегрирование функции по методу трапеций с экстрапо- ляцией по методу Ромберга. Подпрограммы вывода результатов, обработки статистических данных, генерировании случайных чисел. Ниже рассматриваются подпрограммы вывода результатов в виде графиков и гистограмм, а также подпрограмма обработки статистических данных. IER = 392
Подпрограмма PLOT предназначена для печати на АЦ- ПУ графиков не более девяти функций, заданных в табличном виде относительно одного и того же (для всех функций) аргумента. Обращение к подпрограмме: CALL PLOT (NO, A, N, М, NL, NS) Описание параметров: NO — номер графика (чертежа), т. е. целое число, содержащее ие более трех цифр; А — матрица вычерчиваемых данных. Первый столбец — значе- ния аргумента, а последующие — значения функций (не более девяти); N и М — число строк и столбцов в матрице А; NL — число строк в чертеже. Если N = 0, то используется 50 строк; NS — код упорядочивания аргумента; {1 — необходимо произвести упорядочивание строк матрицы по возрастанию аргумента; О — в упорядочивании нет необходимости (матрица подготовлена в порядке возрастания аргумента). Требуемые подпрограммы: нет. Подпрограмма HIST предназначена для распечатки гистограммы частот относительно интервалов. Обращение к подпрограмме: CALL HIST (NU, FREQ, IN) Описание параметров: NU — номер гистограммы; FREQ — вектор частот; IN — число интервалов и размер вектора FREQ (IN^20); эле- мент вектора FREQ(l) содержит частоту тех значений, которые меньше нижней границы, a FREQ (IN) содержит частоту тех значе- ний, которые больше верхней границы. Требуемые подпрограммы: нет. Примечание. Частоты должны быть положительными. Оп- ределяется наибольшая частота и при необходимости применяется масштабирование. Подпрограмма CORRE предназначена для вычисления средних значений, стандартных отклонений, суммы взаимных про- изведений от среднего и коэффициентов корреляции. Обращение к подпрограмме CALL CORRE (N, М, IO, X, XBAR, STD, RX, R, B, D, T) Описание параметров: N н M — число наблюдений и число переменных; IO—код выбора для вводимых данных; 10 = 0, если данные считываются с устройства ввода специальной подпрограммой DATA, 10=1, если данные находятся в оперативной памяти машины. Если 10 = 0, то Х = 0; если 10=1, то X — вводимая матрица; XBAR и STD — выводимые векторы размера М, содержащие средние значения и стандартные отклонения соответственно; 393
RX — выводимая матрица размера МХМ, содержащая суммы взаимных произведений от среднего; R — выводимая матрица размера МХМ, записанная в симмет- ричной форме и содержащая коэффициенты корреляции; В — вводимый вектор размера М, содержащий диагональные элементы матрицы RX; D, Т — рабочие векторы размера М. Используемые подпрограммы: подпрограмма DATA (М, D), со- ставляемая пользователем. Если данные находятся в оперативной памяти машины, то пользователь должен упоминать о ней в виде: SUBROUTINE DATA RETURN END Подпрограмма RANDU вычисляет равномерно распреде- ленные случайные действительные числа на интервале (О, I) и слу- чайные целые числа на интервале (0, 231). При каждом обращении к подпрограмме задается целое случайное число, выдаются новое целое и действительное числа. Обращение к подпрограмме CALL RANDU (IX, IY, YFL) Описание параметров: IX — при первом обращении к подпрограмме этот параметр должен содержать некоторое целое нечетное число с девятью цифра- ми или меньшим числом цифр. При последующих обращениях к под- программе параметр IX должен быть равен предшествующему значе- нию IY, вычисленному этой подпрограммой; IY — вычисленное целое случайное число для следующего обращения к подпрограмме. Все числа находятся в интервале (0, 231). YFL — вычисленное равномерно распределенное с плавающей запятой случайное число на интервале (0, 1). Используемые подпрограммы: нет. Подпрограмма GAUSS вычисляет нормально распреде- ленное случайное число с заданными средним и среднеквадратиче- ским отклонением. Обращение к подпрограмме CALL GAUSS (IX, S, AM, V) Описание параметров: IX — при первом обращении к подпрограмме параметр IX до- лжен содержать некоторое нечетное целое число с девятью цифрами или меньшим числом цифр. После этого IX будет содержать равномерно распределенное случайное число, полученное в ходе вы- полнения подпрограммы и необходимое для следующего обращения; S — задаваемое средиеквадратическое отклонение нормального распределения; AM — задаваемое среднее нормального распределения; V — вычисленное зиачеиие случайной нормально распределен- ной переменной. Используемые подпрограммы: RANDY. 394
ОТВЕТЫ К главе 2 2.1. 1) LN(X) + YAK*X + 5*A»A 2) A«SQR(SIN(2*X)4-COS(X)A2)-LN(B*X)A 2/SQR (ААЗ + ВАЗ+САЗ)*1Е-3 3) EXP (SIN (X)) + SIN (X) A(1 /3)/(1 +LN (SQR (X*X - A) —0.82) 4) (P*P) A(1/3) +LN (ABS (S A3 — 1)) —SQR (ABS (S A 3-1)) 5) I+X + X*X/2 2.2. a) XA5*YA3<>0; 6) B*B-4*A*C> =0; в) X(I, J)> >0; г) X>0; д) Y>0i_i ANDljX —Y< >0. 2.5. а) переменные в списке вывода записать через запятую; 6) переменные в списке вывода записать через точку с запятой. 2.11. См. пример 2.18. 2.13. См. примеры 2.20 и 2.21. г 2.14. а) Номер строки I изменяется от 1 до 10, номер столбца от 1 до I; б) Номер строки I изменяется от 1 до 10, номер столбца — от I до 10; в) Вывод номеров строк осуществить во внешнем цикле, а вывод номеров столбцов перед циклом. 2.18. См. пример 2.42. 2.20. См. пример 2.42. 2.24. См. пример 2.44. 2.25. См. пример 2.45. 2.26 — 2.30. См. пример 2.46. 2.31 — 2.34. См. пример 2.48. 2.35. См. примеры 2.56 и 2.57. 2.36. См. пример 2.58. 2.38. См. примеры 2.65 н 2.66. 2.40. См. пример 2.68. 2.41 —2.42. См. пример 2.71. 2.43 — 2.47. См. примеры 2.73 и 2.74. 2.48. См. пример 2.76. 2.49. См. пример 2.78. К главе 3 3.1. 1) INTEGER Z, Q, S*2(10) REAL*8 X, Y (50) 2) INTEGER*2 I, K, N*4(10) LOGICAL C 3) REAL К COMPLEX* 16 Z (40) 3.2. 1) INTEGER*2 I, J, K, L, KOL*4 (15) REAL*8 А, В, C, D, E, F 2) IMPLICIT INTEGER*2 (A-K) REAL*8 DI (20) 3) REAL X(30), Y (30), XSO*8 395
3.4. 1) X/(l +X*X/(2*Y)) 2) (A+B*X)/(C*D) 3) EXP (X) —SIN (X)**2 4) 1+ATAN (X/(l +SQRT(X))) 5) X**Y**Z 6) A*SQRT (X) - B*B*X*»(1 ./3)/(X+0.5) 7) A*X»*3—B*X*X+ABS (A)*COS (ABS (X))**2 8) (SIN (X**3) —COS (X**3))/(2*X) 9) (X**M—A**M)/SQRT (A*X) 10) EXP(—A*X)*SIN (OMEGA*T-)-Fl) 11) ALOG (ABS (X- A))/(X**X-A*X+A*A) 12) X**( 1 ./3.)—2*(Y*Y)**( 1 ./5.) + EPS 3.5. 1. a) X*Y.NE.O; 6) Y.LE.O; в) X.GE.O. AND.Y.GT.O, r) B*B-4*A*C.GE.O; д) Y.GT.O.AND.X—Y.NE.O 2. N/3*3.EQ.N 3. A/3*3.EQ.A.AND.B/3*3.EQ.B 3.6. 1) READ (5, 1) NAME. COL, A 1 FORMAT (II, 13, F7.2) WRITE (6, 2) NAME, COL, A 2 FORMAT (12, 14, F8.2) 2) READ (5, 1) X, Y, Z 1 FORMAT (2F.7.3, E7.2) WRITE (6, 2) X, Y, Z 2 FORMAT (2 F8.3, El0.2) 3) READ (5, 1) А, В, C 1 FORMAT (3F4.1) WRITE (6, 2) А, В, C 2 FORMAT ('lj A=', F4.1'i_iB', F4.1, 'l_jC=', F4.1) 4) READ (5, 1) E, F, D, А, В, C WRITE (6,2)('ИСХОДНЫЕ ДАННЫЕ'/Е! 1.3, D12.3, DH.3, F4.0, F4.1, E7.0); 3.7. 1) READ (5. 1) X, Y 1 FORMAT (E9.4, E7.0) 2) READ (5.1) Z, W 1 FORMAT (El 0.5, D9.5) 3) READ (5, 1) K, N, X 1 FORMAT (13, 12, E6.2) 4) WRITE (6, 1) 1 FORMAT ('i_i РЕЗУЛЬТАТЫ СЧЕТА') 5) WRITE (6, 1)X1, X2 1 FORMAT (' i_i КОРНИ УРАВНЕ НИЯ'/' о X1 =', F7.5, 'i_iX2=', F8.5) 6) WRITE (6.1) 1 FORMAT ('АРГУМЕНТ', 3X,'X', 6X, 'ФУНКЦИЯ', 3X, 'Y 3.8. — 3.10. В списке ввода перечисляются все указанные в усло- вии переменные и имена массивов. При выборе ко- эффициентов повторения спецификаций необходимо следить за тем, что суммарное число позиций не пре- вышало 80. 396
3.11. — 3.16. При вводе массивов использовать автоматические индексации. 3.17. — 3.18. Количество чисел в строке определяется коэффици- ентом повторения спецификаций. 3.19. Вывод элементов массивов определять в цикле. 3.20. После печати значения переменной т переход на следую- щую строку осуществлять, используя символ «/» 3.21. Печать осуществлять в цикле, выводя номер элементов и по одному элементу массивов А, В, С 3.22. При выводе матрицы использовать автоматические индек- сации. Вывод осуществлять по строкам, число элементов, выводимых в строку, равно 8. 3.23. При выводе матрицы использовать автоматические индек- сации. 3.24. Печать осуществлять в цикле, в котором выводится номер строки и все ее элементы. 3.25. Для вывода номеров столбцов использовать отдельный оператор WRITE 3.26. DO 2 1 = 1, 10 2 WRITE(6, 3) (X (I, J), J=l, I) 3 FORMAT (10 F8.2) 3.27. DO 2 1 = 1, 10 2 WRITE (6, 3) (X (I, J), J = I, 10) 3 FORMAT (10 F8.2) 3.28. Элементы главной диагонали матрицы имеют одинаковые индексы. 3.29. Заголовок вывести отдельным оператором WRITE. При выводе матрицы использовать автоматические индексации. 3.30 — 3.32. См. пример 3.24. 3.33. См. пример 3.24. Перед обращением к оператору функции вычислять начальное значение функции. 3.34. См. пример 3.25. В подпрограмме сначала проверять значе- ние п. 3.35. См. пример 3.25. 3.36. См. пример 3.30. 3.37. См. пример 3.28. 3.38. См. пример 3.25. В подпрограмму MIN передавать массив и его размер, а получать из подпрограммы результат. 3.41. В подпрограмму передавать матрицу: ее размеры и массив, в который должны быть помещены результаты. 3.45. См. пример 3.28 и 3.29. К главе 4 4.1. 1) (A+B*X)/C/D t 2) X/(1+X*X/(2.Y)) 3) EXP (X)*SQR (SIN (X)) 4) 1+ ARCTAN (X/(l + SQRT (X)) 5) EXP( — A»X)*SIN(OMEGA*T+FI) 6) LN (ABS (X—A)/(X*X — A*X + A*A) 397
7) A*SQRT(X)4-B*B*EXP (1/3*LN (X)) 8) A*X*X»X— B*X*X + A*SQR (COS (ABS (X))) 9) X/(Y*X/P/R) + Z/(I.6 + (X-Y)/EXP (P)) 10) 2.64 + (SIN (X*X))+ SQR (COS (Y)))/SQRT (ABS (X + + Y)) 4 2 — 4.4. См. пример 4.26. 4.5 — 4.9. См. примеры 4.27 и 4.28. 4.10 . См. примеры 4.26 и 4.28. 4.11 . См. пример 4.29. 4.12 , 4.13. См. пример 4.30. СПИСОК ЛИТЕРАТУРЫ 1. Абрамов С. А„ Зима Е. В. Начала программирования на языке Паскаль.— М.: Наука, 1987.— 112 с. 2. Абрамов С- А., Зима Е. В. Основы информатики.— М.: Нау- ка, 1989.— 256 с. 3. Алексеев В. Е„ Ваулин А. С., Петрова Г. Б. Вычислительная техника в инженерных и экономических расчетах: Сборник задач и упражнений / Под ред. А. В. Петрова,— М.: Вы- сшая школа, 1984,— 136 с. 4. Браух В. Программирование на Фортране для инженеров: Пер. с нем.— М.: Мир, 1987.— 200 с. 5. Вычислительная техника в инженерных и экономических рас- четах / А. В. Петров, В. Е. Алексеев, М. А. Титов и др.. Под ред. А. В. Петрова.— М.: Высшая школа, 1984.— 320 с. 6. Дьяконов В. П. Справочник по алгоритмам и программам на языке Бейсик для персональных ЭВМ.— М.: Наука, 1987.— 240 с. 7. Катцан Г. Язык Фортран-77: Пер. с англ.— М.: Мир, 1982.— 208 с. 8. Кучура Н. А.. Ходом М. В., Цагельский В. И. Персональ- ные ЭВМ Единой системы: Бейсик.— М.: Финансы и стати- стика, 1988.— 207 с. 9. Моррил Г. Бейсик для ПК ИБМ: Пер. с англ.— М.: Финансы и статистика, 1987.— 207 с. 10. Перминов О. И. Программирование на языке Паскаль.— М.: Радио и связь, 1988.— 224 с. И. Светозарова Г. И., Мельников А. А., Козловский А. В. Прак- тикум по программированию на языке Бейсик.— М.: Нау- ка, 1988.— 368 с. 12. Семашко Г. Л„ Салтыков А. И. Программирование на языке Паскаль,— М.: Наука, 1988.— 128 с. 13. Фортран ЕС ЭВМ / 3. С. Брич, Д. В. Капилевич, С. Ю. Котик, В. И. Цагельский.— М.: Статистика, 1984.— 264 с. 398
ОГЛАВЛЕНИЕ Предисловие.................................................... 3 Введение.................... ...... .... 5 Глава 1- Разработка алгоритма решения задачи 7 1.1. Алгоритм линейной структуры............4 . » . 7 1.2. Алгоритмы разветвляющейся структуры .... 10 1.3. Алгоритмы циклической структуры . . ......... 15 1.4. Приемы алгоритмизации.............................. 19 1.5. Алгоритмы со структурой вложенных циклов............. 39 1.6. Разработка алгоритмов решения задач смешанной струк- туры ................................................. 46 Глава 2. Программирование иа языке БЕЙСИК . 63 2.1. Простейшие конструкции языка.................... ... 63 2.2. Программирование ввода-вывода данных ...... 68 2.3. Программирование алгоритмов линейной структуры 72 2.4. Программирование алгоритмов разветвляющейся струк- туры ................................................. 74 2.5. Программирование алгоритмов циклической структу- ры 78 2.6. Организация ввода-вывода массивов. Обработка мас- сивов ........................... .... ... 82 2.7. Приемы программирования.............................. 85 2.8. Программирование алгоритмов со структурой вложен- ных циклов........................................... 94 2.9. Обработка символьных данных . . . . 97 2.10. Организация подпрограмм............................ 102 2.11. Решение прикладных научно-технических задач . . . 107 2.12. Работа с файлами последовательного и прямого доступа 130 Глава 3. Программирование иа языке ФОРТРАН . 140 3.1. Простейшие конструкции языка........................ 140 3.2. Ввод н вывод данных................................. 146 3.3. Программирование алгоритмов линейной структуры 151 3.4. Программирование алгоритмов разветвляющейся струк- туры ..................................................... 153 3.5. Программирование алгоритмов циклической структуры 156 3.6. Приемы программирования................... 158 3.7. Программирование алгоритмов со структурой вложен- ных циклов...................................... 165 3.8. Программирование с использованием подпрограмм 168 3.9. Программирование алгоритмов смешанной структуры 182 Глава 4. Программирование иа языке ПАСКАЛЬ . 188 4.1. Простейшие конструкции языка . .... 188 4.2. Ввод и вывод данных................................. 191 4.3. Программирование алгоритмов линейной структуры 193 4.4. Программирование алгоритмов разветвляющейся струк- туры ................................................ 195 4.5. Программирование алгоритмов циклической структуры 199 4.6. Приемы программирования........................ 202 4.7. Программирование алгоритмов соструктурой вложенных циклов......................................... 210 4.8. Программирование с использованием подпрограмм 214 4.9. Программирование алгоритмов смешанной структуры с использованием структурированных типов данных 220 399
Глава 5. Лабораторный практикум...................... .... 225 Лабораторная работа № 1. Организация работы пользова- теля с ЭВМ............................................ 229 Лабораторная работа № 2. Программирование алгоритмов линейной структуры.................................... 230 Лабораторная работа № 3. Программирование алгоритмов разветвляющейся и циклической структуры............... 235 Лабораторная работа № 4. Программирование алгоритмов итерационной циклической структуры.................... 243 Лабораторная работа № 5. Программирование алгоритмов циклической структуры с заданным числом повторений ... 251 Лабораторная работа № 6. Обработка одномерных массивов 257 Лабораторная работа № 7. Программирование алгоритмов со структурой вложенных циклов........................ 261 Лабораторная работа № 8. Обработка матриц............. 270 Лабораторная работа № 9. Программирование с выводом результатов в виде графиков на экран алфавитно-цифрового дисплея............................................... 277 Лабораторная работа № 10. Программирование с исполь- зованием подпрограмм пользователя..................... 283 Лабораторная работа № 11. Программирование с исполь- зованием библиотечных подпрограмм..................... 294 Лабораторная работа № 12. Обработка символьных дан- ных .................................................. 303 Лабораторная работа № 13. Программирование с исполь- зованием датчиков случайных чисел..................... 308 Лабораторная работа № 14. Разработка диалоговых про- грамм ................................................ 321 Лабораторная работа № 15. Обработка файловых струк- тур данных............................................ 340 Лабораторная работа № 16. Программирование с выводом результатов в виде графиков на экран графического дис- плея ................................................. 351 Приложение 1. Перечень сообщений об ошибках интерпретато- ра языка БЕЙСИК ............................................ 357 Приложение 2. Перечень основных диагностических сообщений на этапе трансляции программы на языке ПАСКАЛЬ ЕС.................................................. 360 Приложение 3. Перечень возможных сообщений об ошибках на этапе выполнения программы на языке ПАСКАЛЬ ЕС.................................................. 364 Пр иложение 4 Перечень основных диагностических сообщений на этапе трансляции программы на языке ФОРТРАН ЕС.................................................. 365 Приложение 5. Перечень основных диагностическнхсообщений на этапе выполнения программы на языке ФОРТРАН в среде ОС ЕС....................................... 367 Пр иложение 6. Системные коды завершения в ОС ЕС .... 369 Пр иложение 7. Инструкция по работе на ПЭВМ ЕС с системой программирования БЕЙСИК ...... 370 Прил о ж е н н е 8. Инструкция по работе с СВМ ЕС ЭВМ .... 377 Приложение 9. Перечень библиотечных подпрограмм на языке ФОРТРАН..................................................... 386 Ответы............... ... 395 Список литературы . . .... 398