Text
                    ?	МАТЕМАТИЧЕСКОЕ
ОБЕСПЕЧЕНИЕ
ЭВМ
В.Браух
ПРОГРАММИРОВАНИЕ
НА ФОРТРАНЕ 77
ДЛЯ ИНЖЕНЕРОВ


ПРОГРАММИРОВАНИЕ НА ФОРТРАНЕ 77 ДЛЯ ИНЖЕНЕРОВ
Teubner Studienskripten PR0GRAMM1EREN MIT FORTRAN 77 FOR INGENIEURE Von Dr. rer. nat. WOLFGANG BRAUCH Professor an der Fachhochschule Ravensburg — Weingarten 2., iiberarbeitete Auflage B. G. TEUBNER STUTTGART 1981
МАТЕМАТИЧЕСКОЕ ОБЕСПЕЧЕНИЕ ЭВМ в. Браух ПРОГРАММИРОВАНИЕ НА ФОРТРАНЕ 77 ДЛЯ ИНЖЕНЕРОВ Перевод с немецкого И. Т. Коробицына под редакцией В. Н. Соболева Москва «Мир» 1987
ББК 32.973 Б 87 УДК 681.3 Браух В. Б 87 Программирование на Фортране 77 для инженеров: Пер. с нем.—М.: Мир, 1987.— 200 с., ил. Небольшая книга известного специалиста (ФРГ), представляющая собой методически отработанное учебное пособие по языку Фортран 77. Этот язык программирования реализован на отечественных ЭВМ, он выгодно отличается от более ранних версий (таких, как Фортран IV, Фортран ЕС ЭВМ). Для всех желающих самостоятельно изучить программирование на Форт- ране 77. 1702070000-096 Б 041 (01 )-87 30—87’ Ч‘ 1 ББК 32.973 Редакция литературы по математическим наукам Учебное пособие Вольфганг Браух ПРОГРАММИРОВАНИЕ НА ФОРТРАНЕ 77 ДЛЯ ИНЖЕНЕРОВ Научный редактор М. В. Хатунцева. Младший научный редактор Р. И. Пят- кина. Художник Н. Я. Вовк. Художественный редактор В. И. Шаповалов. Технический редактор В. П. Сизова. Корректор С. А. Денисова. И Б № 5795 Сдано в набор 27.02.86. Подписано к печати 31.07.86. Формат бОхЭО1/^. Бумага кн.-журнальная. Печать высокая. Гарнитура литературная. Объем 6,25 бум. л. Усл. печ. л. 12,50. Усл. кр.-отт. 13,01. Уч.-изд. л. 11,19. Изд. № 1/4508. Тираж 30 000 экз. Заказ № 2295. Цена 80 коп. ИЗДАТЕЛЬСТВО «МИР». 129820, ГСП, Москва, И-110, 1-й Рижский пер., 2 Ордена Октябрьской Революции и ордена Трудового Красного Знамени МПО «Первая Образцовая типография» имени А. А. Жданова Союзполи- графпрома при Государственном комитете СССР по делам издательств, поли- графии и книжной торговли. 113054, Москва, Валовая, 28 © В. G. Teubner Stuttgart, 1985 © перевод на русский язык, «Мир», 1987
ПРЕДИСЛОВИЕ РЕДАКТОРА ПЕРЕВОДА Фортран является языком программирования высокого уров- ня. Он был предложен более тридцати лет назад. Другие языки возникали и умирали, а Фортран и поныне сохранил свое значе- ние. В мире накоплено колоссальное количество программ на Фортране, суммарная стоимость которых исчисляется миллиона- ми долларов. Несмотря на быстрое развитие языка в первые годы существования (Фортран— 1954 г., Фортран II — 1958 г., Фортран III —1961 г., Фортран IV—1962 г., стандарт Фортрана— 1966 г.), его версия, использующаяся в ЭВМ ЕС и IBM/360, сильно отста- ла от других языков и оказалась неадекватной архитектуре сов- ременных вычислительных машин. Тем не менее Фортран остал- ся весьма привлекательным в силу своей относительной простоты и высокой эффективности создаваемых транслятором объектных модулей. Поэтому разработка версии Фортран 77 знаменует собой значительное явление в жизни этого языка. Она вновь поставила Фортран в ряд современных языков программирования. При этом сохранилась преемственность со старыми версиями, поз- воляющая пользоваться всем накопленным ранее арсеналом программных средств. По сравнению с предшествующими версиями в Фортране 77 существенно увеличены возможности структурирования и обра- ботки текста и данных, развиты возможности ряда операторов (в частности, операторов ввода-вывода, оператора цикла, опера- тора IF), введены другие новшества. Все это повысило гибкость языка и расширило сферу его применения. Отечественных книг по Фортрану 77 практически нет. В от- личие от единственной книги Г. Катцана «Язык Фортран 77», вышедшей в издательстве «Мир» в 1982 г. и предназначенной для специалистов, данная книга ориентирована на начинающих про- граммистов-пользователей. Это методически отработанное учебное пособие для студентов технических вузов и инженеров, желаю- щих самостоятельно изучить программирование на этом языке. Автор пояснил основные понятия вычислительной техники, привел сведения о конструкции и принципе дёйствия вычисли- тельной машины, описал технические и программные средства, рассмотрел этапы разработки программ, изложил методику сос- тавления алгоритмов на уровне логических схем, затронул вопро-
6 Предисловие редактора перевода сы тестирования (способы контроля, стратегию отладки, виды ошибок и способы их локализации), обсудил качественные ха- рактеристики программ. В процессе изложения языка и приемов программирования пояснены все элементы и конструкции Фортра- на 77, подробно рассмотрены операторы и подпрограммы, опи- саны способы обработки числовых и текстовых данных, раскрыта техника обращения с файлами. Достаточно большое внимание уделено специфике Фортрана 77. В частности, подробно поясне- на конструкция IF—THEN—ELSE, позволяющая задавать ус- ловное выполнение группы операторов. Разобран характерный лишь для данной версии языка аппарат описания, выборки, срав- нения и сцепления текстовых подцепочек (подстрок), составляю- щий основу редактирования текстовых данных. Многочисленные иллюстрации и примеры существенно облег- чают усвоение материала. В конце книги приведены решения предлагаемых в тексте задач. Доступная форма изложения соче- тается с полнотой описания языка и приемов программирования. Книга ориентирована на читателя, желающего приобрести под- готовку за относительно короткое время. В, Н. Соболев
ПРЕДИСЛОВИЕ Эта книга написана для студентов технических вузов и инже- неров. Ее цель — обучить основам программирования. Книга начинается с описания структуры вычислительной машины и принципов ее работы. Хотя проблемно-ориентированный язык программирования можно достаточно глубоко изучить и без этих сведений, инженеру все же желательно знать, с какой машиной он работает и каковы принципы ее функционирования. В первых главах книги подробно рассматриваются этапы из- готовления программ и описываются признаки их качества. Ос- новное внимание уделяется логической схеме программы (соглас- но стандарту DIN 66 001) и методам структурного программиро- вания, так как опыт преподавания показывает, что обучить но- вичков этим необходимым основам значительно труднее, чем обу- чить их формальным правилам языка. Сформулированы лишь наиболее важные общепринятые положения. Они позволяют соз- давать добротные программы на любом языке программирования и не меняются в условиях интенсивной эволюции языковых средств. Основная часть книги посвящена описанию языка Фортран 77 в соответствии со стандартом ANSI ХЗ.9-1978. Развитие языка Фортран IV привело к упрощению возможностей структурирова- ния, а также дало возможность обрабатывать тексты и наборы данных. Я сознательно отказался от полного изложения Фортра- на 77 и опустил примерно 10% его описания, благодаря чему повысились наглядность и ясность изложения. В книге не рас- сматриваются все упоминающиеся в стандарте специальные слу- чаи и исключения, которые обусловлены в основном историческим развитием языка. Кроме того, разобраны не все возможности об- работки наборов данных и задания форматов. Эти пропуски ого- ворены в соответствующих местах книги. При необходимости пользователь найдет недостающие сведения в документации, по- ставляемой вместе с вычислительной машиной. В соответствие с дидактической концепцией изложения мате- риала, используемой в данной книге, я избегал двух крайностей: строгого аксиоматически-дедуктивного построения конструкций языка и чисто индуктивного изучения его на примерах. Книга
8 Предисловие ко второму изданию содержит большое количество задач с решениями. Преимущест- венно рассматриваются задачи вычислительной математики, ко- торые возникают в различных технических приложениях. При- водятся также примеры по обработке данных. Уровень изложе- ния предполагает, что читатель имеет математическую подготов- ку в объеме общих курсов высшей школы. Приведенные примеры опробованы на вычислительной машине IBM 4341 с операционной системой CMS. Данная книга возникла в процессе переработки написанной ранее монографии «Программирование на Фортране». В нее были внесены только те изменения, которые обусловлены развитием языка и вычислительной техники. Сердечно благодарю фирму Dornier GmbH (Immenstaad) за великодушное разрешение пользоваться ее вычислительным центром. Дипломированный математик Мааг помогал мне цен- ными указаниями и советами. Я благодарен фирме IBM Deutsch- land GmbH (Stuttgart) за согласие на использование ее литера- туры, а также издательству В. G. Teubner (Stuttgart) за плодот- ворное сотрудничество. ПРЕДИСЛОВИЕ КО ВТОРОМУ ИЗДАНИЮ Первое издание книги было хорошо принято. От многочислен- ных коллег я получил ценные советы и указания, за которые сердечно благодарен. При подготовке второго издания были устра- нены ошибки и улучшена структура ряда программ. Равенсбург, январь, 1985 г, Вольфганг Браух
1. ВВЕДЕНИЕ Слово Фортран образовано из начальных слогов двух англий- ских слов FORmula TRANslation (перевод формул). Этот язык был создан в 1956 г. для программирования технических задач. К настоящему времени язык развит до такой степени, что с его помощью могут решаться также основные задачи обработки ком- мерческой информации. Более подробно о истории развития языка сказано на стр. 63. Фортран возник в те времена, когда исходная информация рас- полагалась преимущественно на перфокартах. В процессе разви- тия вычислительной техники, которое проходит под лозунгом «компьютер — на рабочее место», этот язык стал использоваться как диалоговый. Сейчас инженер имеет на своем рабочем месте дисплей с клавиатурой (тастатурой) или телетайп, посредством которых вводятся в ЭВМ программы и данные и выводятся ре- зультаты вычислений. Эти устройства могут подключаться к вычислительным машинам, имеющим различные технические возможности. Определение'. Под вычислительной машиной (компьютером) будем понимать как настольную (персональную) ЭВМ, так и ЭВМ коллективного пользования, входящую в состав вычислительного центра. Сегодня имеются настольные вычислительные машины стои- мостью приблизительно 2000 марок*. Для этих машин можно писать программы на проблемно-ориентированных языках. Боль- шие вычислительные машины, стоимость которых превышает 100 000 марок, с успехом эксплуатируются в режиме коллектив- ного пользования (см. разд. 2.3). В этом режиме на одной вычис- лительной машине одновременно и независимо друг от друга ра- ботают от 5 до 100 пользователей. На своих рабочих местах они имеют устройства, которые внешне похожи на настольные вы- числительные машины. Эти устройства дают возможность каждо- му пользователю работать с ЭВМ в диалоговом режиме. Такой режим особенно выгоден при написании и отладке программ, а * Здесь и далее автор имеет в виду марки ФРГ.— Прим, перев%
10 1. Введение также при изучении программирования. Конечно, существуют области применения вычислительных машин, для которых целе- сообразно использовать другие способы организации работ. Определим упомянутые выше понятия. Определение: Программа представляет собой полное руко- водство для решения задачи посредством вычислительной машины, написанное на любом языке программирования. Программа состоит из операторов. Понятие данные включа- ет как вводимые в ЭВМ значения величин, так и получаемые машиной результаты. Иод^информацией будем понимать про- грамму и данные. (Синтаксическое определение понятия программа приведено на стр. 78.) Предполагается, что ЭВМ понимает используемый язык, т. е. программа может быть ею выполнена. Программа обычно исполь- зуется многократно, чаще всего с различными исходными дан- ными. Например, при решении квадратного уравнения такими варьируемыми данными являются коэффициенты при степенях неизвестного. Перед обработкой исходных данных программа находится в оперативной памяти (см. стр. 18). В данной книге рассматривают- ся программно-управляемые цифровые вычислительные машины. Идея программного управления была выдвинута американским математиком Джоном фон Нейманом в 1946 г. Программное уп- равление принадлежит к важным понятиям информационной тех- ники. Оно позволяет изменять программу во время обработки информации. Вследствие этого ЭВМ могут работать как «обучаю- щиеся автоматы» или «думающие машины». Будем рассматривать лишь цифровые вычислительные маши- ны, в которых переменные представляются в цифровой форме, в отличие от аналоговых машин, в которых переменные отобража- ются физическими величинами (чаще всего электрическими тока- ми и напряжениями). Простейшей цифровой вычислительной машиной является арифмометр, простейшей аналоговой вычис- лительной машиной — логарифмическая линейка. При записи программы и исходных данных для современной цифровой ЭВМ обычно используют примерно 50 различных сим- волов (10 цифр, 26 букв * и ряд специальных символов, таких, как точка, запятая, наклонная черта и т. д.). Совокупность допус- тимых символов называется алфавитом. Результаты, выводимые из ЭВМ, также представляются эти- ми символами. Однако большинство цифровых вычислительных * Отечественные вычислительные машины допускают также использо- вание букв русского алфавита, отличающихся по написанию от латинских, т, е. количество допустимых символов увеличено.— Прим, перев.
1. Введение 11 машин могут обрабатывать информацию, представленную в виде комбинаций лишь двух различных символов. Это обусловлено исключительно техническими причинами. Два символа могут быть реализованы очень просто. Их применение обеспечивает дешевую и помехоустойчивую схемную реализацию. Они могут быть представлены, например, двумя положениями ключа, дву- мя уровнями электрического напряжения или двумя направле- ниями намагничивания. Определение: Двоичные символы 0 и 1 обозначают ложь (нет) и истину (да). Наименьшую двоичную единицу информа- ции, соответствующую выбору одного из двух упомянутых символов, называют битом. Производными единицами яв- ляются 1 байт=8 бит, 1 Кбайт=10? байт, 1 Мбайт=10в байт. Иногда используют обозначение 1К=210 байт=1024 байт. Любое количество битов, логически связанных друг с другом, называют двоичным представлением. Приведение вводимых символов к двоичному представлению и обратное преобразование называют кодированием. Оно подробно рассмотрено в разд. 5.2. Кодирование требует определенных зат- рат машинного времени. При выполнении простых программ вре- менные затраты на кодирование могут значительно превышать затраты на обработку данных. Уменьшить машинное время, рас- ходуемое на преобразование формы представления информации, можно только за счет наилучшего использования правил ввода- вывода применяемого языка программирования. 2. СТРУКТУРА И ПРИНЦИП ДЕЙСТВИЯ ВЫЧИСЛИТЕЛЬНОЙ МАШИНЫ Для облегчения понимания многих правил языка кратко рас- смотрим принципиальные возможности и границы применения вычислительных машин. Более подробный обзор дан, например, в [2] и [7]. При обработке информации возникают три задачи: обмен, на- копление и преобразование. Настольная вычислительная машина может выполнять функции, соответствующие этим задачам, при- чем основной из них является преобразование информации. В больших вычислительных машинах выполнение этих функций распределено между различными специализированными устрой- ствами. При рассмотрении вычислительных машин принято вы- делять аппаратные и программные средства. Определение: Аппаратные средства представляют собой мно- жество отдельных технических частей вычислительной ма- шины. Программные средства представляют собой множест- во программ, которые требуются при эксплуатации ЭВМ.
12 2. Структура и принцип вычислительной машины Если программное обеспечение записано в постоянной па- мяти (см. рис. 1 на стр. 13), то оно называется встроенным программным обеспечением. Выделить программные и аппаратные средства нельзя, ссы- лаясь на класс задач, решаемых каждой частью машины. Напри- мер, рассмотренная в предыдущем разделе задача кодирования может быть решена посредством электронных схем (аппаратно) или посредством программы (программно). Классификация вычислительных машин В распоряжение пользователя предоставлен ряд вычислитель- ных машин — от карманной, для которой можно писать програм- мы на одном проблемно-ориентированном языке, до большой вы- числительной машины, представляющей широкие возможности выбора языковых средств. Стоимость вычислительной машины связана с количеством периферийных устройств и качеством программного обеспечения. Ежемесячный размер арендной платы составляет приблизительно 1/40 стоимости машины. Основные характеристики ЭВМ представлены в следующей таблице: Тип вычислитель- ной машины Емкость опе- ративной па- мяти, Мбайт Быстродействие, тыс. операций в секунду Стоимость, тыс. марок Карманная 0.001 0.05 0.5 Настольная 0.1 5 5 Малая 1 100 500 Средняя 10 1000 2000 Большая 50 2000 5000 2.1. Аппаратные средства Структура аппаратной части вычислительной машины приве- дена на рис. 1. Такая схема построения характерна как для на- стольных, так и для малых ЭВМ. Вопросы ее расширения и до- ведения до структуры средних и больших машин рассмотрены в п. 2.1.3. 2.1.1. Периферийные устройства Задачами периферии являются накопление и хранение ин- формации (программ и данных) и осуществление связи между центральным процессором и пользователем. Общение с пользова-
2.1. Аппаратные средства 13 телем достигается при помощи устройств ввода-вывода. Послед- ние тесно связаны с оперативной памятью машины, имеющей ог- раниченный объем. Периферийная память организуется на бума- ге, перфокартах, магнитных дисках и магнитных лентах. В этих Рис. 1. Структура аппаратной части вычислительной машины. накопителях может быть размещено практически любое коли- чество информации. Стоимость периферийной памяти составляет около 1% стоимости оперативной памяти. Периферийные уст- ройства могут находиться на значительном удалении от централь- ного процессора, с которым они взаимодействуют в режиме дис- танционной обработки данных. Внешнее устройство, которое со- держит только периферийное устройство, называют термина- лом или оконечным устройством. Дисплей, телетайп, печатающее устройство В качестве устройств ввода-вывода в настольных вычислитель- ных машинах и терминалах часто используются дисплеи. На экране дисплея может высвечиваться около 20 строк, содержащих по 80 символов. В дисплее, как правило, имеется буферная па- мять. Она позволяет путем перемещения изображения высве- чивать около 200 строк. К преимуществам дисплея относятся вы- сокая скорость вывода и возможность проведения диалога, т. е. несложного чередования ввода и вывода информации. Недос- татком дисплея является ограниченная емкость буферной памяти. Чаще всего дисплей работает как телевизионный экран с по- строчным отклонением электронного луча. Кроме символьной информации на экран может выводиться графическая информация (диаграммы, схемы). Если графическая информация преоблада-
14 2. Структура и принцип вычислительной машины ет, то используют векторный экран, в котором электронный луч перемещается непосредственно от одной точки поверхности экра- на к другой. Возможно также многоцветное представление выво- димой информации. Ввод символьной информации производится посредством кла- виатуры. Она содержит клавиши печатных символов, клавиши управления экраном и клавиши наиболее употребительных ко- а а а манд. Последняя вводимая строка символов появля- ’ * . . Ф ется на экране в специально отведенном месте и там . * ’ * ф она может быть легко скорректирована. При на- * . Ф Ф , жатии клавиши управления ENTER (а в некото- « Ф . , . рых машинах RETURN или STORE) строка переда- Ф . . . • ется для дальнейшей обработки вычислительной • ф • • • машиной. Экран снабжен световым указателем — курсором. С помощью клавиатуры курсор можно по- ’ ат- местить в любое место экрана. Тот символ, к кото- рому подведен курсор, может быть скорректирован на экране и в буферной памяти. Эта техника особенно удобна при редактировании программ в процессе их отладки, тестирования и модификации. Для ввода графической информации имеются дис- плеи, в которых рисунки можно заносить на экран с помощью светового пера, на конце которого находится фотоэлемент. Телетайп также предназначен для ввода и вывода информации в диалоговом режиме. Достоинством телетайпа является непре- рывное документирование, а недостатками — отсутствие возмож- ности простого редактирования и низкая скорость вывода (при- близительно 20 символов в секунду). Печатающее устройство предназначено для вывода информа- ции. Настольная вычислительная машина часто содержит встро- енное матричное печатающее устройство. Вывод происходит со скоростью 1 строка в секунду. На рис. 2 видно, что каждый сим- вол вырисовывается точками в матрице размером 5x7. В уст- ройстве термопечати каждому элементу матрицы соответствует электрическое сопротивление, которое при нагревании прожигает точку на специальной бумаге. При механической печати литеры ударяют по красящей ленте. В вычислительных машинах (кроме карманных и настольных) печатающие механизмы выполняют в виде отдельных устройств. Кроме матричных печатающих уст- ройств имеются механические, в которых литеры расположены на постоянно вращающемся валу или цепи. Благодаря этому скорость вывода повышается до 10 строк в секунду. В печатаю- щих устройствах, работающих на оптических или электростати- ческих принципах, скорость вывода достигает нескольких стра- ниц в секунду.
2.1. Аппаратные средства 15 Перфокарты, перфолента Перфокарты долгое время были классическими носителями информации в системах коммерческой обработки. Сейчас их зна- чение непрерывно уменьшается. Перфокарты вытесняются маг- нитными носителями информации. Достоинством перфокарт яв- ляется возможность использования их в качестве элементов кар- тотеки. Большим удобством является простота замены отдельных карт. Недостатки: отсутствие возможности редактирования кар- ты (исправление каждой ошибки и каждое изменение в програм- ме или в исходных данных требует перебивки всей карты), от- носительно высокая цена карт и устройств, предназначенных для работы с ними. Строк» Цифры Буквы Специальные СИМВОЛ* <)1213456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ .<(*-*>/Д‘ & —— —....- IIIIIIIII 1П1 lllllllll III loOOOOOOOOOOODO 0 00000000000 0000II ИНН ООО 00000 oollh 000000008 300000000000600006 вонные отверстия zzlzzzzzzzzzzzlzzizzzzzlzzzzzzzlzzzzzzzzzzzzzzzzzzzzzzzizztiuzzizzzztizttzizzzt 1Л N 33 S Ь S3 S 53 333331J J3333 33113333 331S 53 33 3 ЗЗВ11ЭЗЗЗ3 31з |3333>3 53333 шэззвзаиазз 33 44 44|4444 4Н444*|4444Х4 44|44А4Ш14М4и444|4441444|4|444444444444444«4 <44444+4 г SS5851б$$56555555|$8$EISS51(658(6515S5S55556ls6SlsBS5S5$SS$$S$$$SI$SS$S5865S55S5 3 (6666б1б6б466беб4б|б66 6 666б1б666 66б1бв(6бтб1б(6666666666(Пб(6Иб6С6бввВ6(6бС6 1 77Г77771777777T77r7l77/77777l7777777l77Z777777777777777777Z7777777777777/7777777 j (88688881866888888881888888881(888888118881111811(111188868668686688668886688888 Цифровые отверстия Колонка Рис. 3. Перфокарта. Как следует из рис. 3, перфокарта содержит 80 колонок и 12 строк. Каждый символ помещается в одной колонке и кодирует- ся одним, двумя или тремя отверстиями. Карты перфорируются при помощи специального устройства, называемого перфорато- ром. В верхней части карты печатаются символы, коды которых пробиты в соответствующих колонках. Управление перфорато- ром похоже на управление пишущей машинкой. В устройстве ввода в ЭВМ информация считывается с перфокарты фотоэлек- трическим способом и преобразуется в электрические импульсы, которые передаются в центральный процессор. Перфолента применяется преимущественно для специальных целей, например для управления станками с числовым програм- мным управлением. Принцип ввода информации с перфоленты аналогичен принципу ввода с перфокарт. Часто используется международный телеграфный код CCITT, при котором каждый символ пробивается в 5 строках (дорожках). Однако имеются также шести-, семи- и восьмидорожечные перфоленты.
16 2. Структура и принцип вычислительной машины Магнитные накопители Магнитный накопитель используется преимущественно в ка- честве внешней памяти. Поясним основные понятия техники за- поминающих устройств. Определение: Время доступа к накопителю — это время, необходимое для выполнения приказа: «доставь информацию из накопителя в арифметическое устройство». В запоминаю- щем устройстве с прямым доступом это время не зависит от физического расположения информации в накопителе. В за- поминающем устройстве с последовательным доступом оно зависит от расположения информации, так как должно про- сматриваться содержимое накопителя до тех пор, пока не будут найдены и считаны необходимые данные. Емкость запоминающего устройства выражается в килобайтах или мегабайтах (см. стр. 11). Прямой доступ в полном смысле этого слова возможен только в оперативной и постоянной памяти (см. п. 2.1.2). Однако к па- мяти с прямым доступом причисляют также магнитные диски, так как они имеют малые различия во времени обращения к раз- ным местам магнитного носителя. Среднее значение времени до- ступа в накопителях на магнитных дисках равно примерно 20 мс. Типичными представителями памяти с последовательным досту- пом являются колода перфокарт и магнитная лента. Среднее время доступа у магнитной ленты составляет несколько секунд. Однако в случае расположения искомой информации в конце ленты оно может доходить до минуты вследствие низкой скорос- ти перемотки. Достоинством памяти с последовательным досту- пом является ее малая стоимость. Магнитная лента в ЭВМ функционирует аналогично ленте в бытовой звукозаписывающей аппаратуре. В больших вычисли- тельных машинах используются устройства с лентами, имеющими длину 720 м и емкость от 20 до 100 Мбайт. В настольные вычисли- тельные машины часто монтируют лентопротяжный механизм для одной или двух кассет с лентами по 40 м и емкостью в несколько сотен килобайт. Магнитные ленты служат преимущественно для хранения архива программ и данных. В коммерческих задачах важную роль играет сортировка данных на ленте (например, по клиентам, товарам и т. п.). Магнитные диски имеют преимущества прямого доступа. Та- кой доступ становится возможным благодаря постоянному вра- щению дисков со скоростью 50 об/с. На каждой поверхности диска (см. рис. 4) расположено несколько сотен концентрических окруж- ностей, называемых дорожками. С помощью радиально-подвиж- ного рычажного механизма, на конце которого расположена
2.1. Аппаратные средства 17 головка чтения-записи, можно быстро достичь каждой точки дис- ка. В вычислительных машинах используются пакеты, состоя- щие из 6 или 11 дисков диаметром 40 см. Емкость пакета состав- ляет несколько сотен мегабайт. Различают запоминающие уст- ройства со сменными дисками и запоминающие устройства с по- стоянными дисками. Последние характеризуются малой емкос- тью и низкой стоимостью. В на- стольных вычислительных маши- нах обычно используются гиб- кие диски. Они имеют диаметр около 12 см и емкость несколько сотен килобайт. Магнитные диски по сравне- нию с магнитными лентами по- лучили более широкое распрост- ранение при всех видах работ, так как стоимости этих носите- лей информации отличаются не- значительно, а быстродействие дисков существенно выше. Рис. 4. Пакет магнитных дисков. 2.1.2. Центральный процессор Задачей центрального процессора (ЦП) является преобра- зование информации. Центральный процессор состоит из блоков ввода-вывода, оперативной и постоянной памяти, арифметического блока и блока управления (см. рис. 1 на стр. 13). Для больших вычислительных машин характерна децентра- лизация оборудования. В них, кроме центрального процессора, имеются также процессоры входящие в состав периферийных устройств. Такие процессоры состоят из арифметических блоков и блоков управления. Электронными элементами схем упомяну- тых блоков являются резисторы, диоды и транзисторы. Они из- готовляются с помощью МОП-технологии (металл — окисел — полупроводник) посредством окислительных и диффузионных процессов на пластинке площадью приблизительно 50 мм2. Такое изделие называют чипом. Чип содержит порядка 10е элементов. В одном чипе, предназначенном для запоминания информации, может храниться от 8 до 64К- Каждый бит реализуется в виде триггерной схемы. В одном логическом чипе содержится от 5х
18 2. Структура и принцип вычислительной машины х 103 до 5 404 схем НЕ, И-НЕ и ИЛИ-HE, собираемых в такие функциональные блоки, как регистры сдвига, полусумматоры и т. п. Блоки ввода-вывода координируют обмен информацией между устройствами ввода-вывода и оперативной памятью. Устройства ввода-вывода работают значительно медленнее центрального про- цессора. Поэтому обычно они функционируют одновременно и не- зависимо друг от друга. Если устройство готово к работе, то оно сообщает об этом центральному процессору. На основании тако- го сообщения операционная система принимает решение об ис- пользовании этого устройства. В оперативную память данные и программы помещаются не- посредственно перед их выполнением. Время доступа к оператив- ной памяти равно 10“9 с. Ее емкость рассматривается как один из основных качественных показателей вычислительной машины (см. табл, на стр. 12). Оперативная память позволяет записывать и считывать информацию. Каждый бит реализуется на триггере. Однако аппаратная часть вычислительной машины была бы слишком сложной, если бы позволяла пользователю обращать- ся к каждому биту. Определение: Минимальную единицу памяти, доступную пользователю, называют элементом памяти. Эти элементы нумеруются последовательно. Их порядковые номера назы- вают адресами. Понятие адрес в программировании играет важную роль. К сожалению, величина элемента памяти не нормирована. Раз- личают байтоориентированную память, в которой каждый эле- мент содержит один байт, и словоориентированную память, в которой каждый элемент содержит от 2 до 8 байтов. В данной книге элемент памяти часто называется также ячейкой памяти. I Один символ записывается в одном байте. Одно число за- I нимает от одного до нескольких слов. Из постоянной памяти можно только считывать информацию. Постоянная память обычно используется для хранения основных частей операционной системы. Технически она не отличается от оперативной памяти. Существует большой разрыв по времени доступа между опе- ративной памятью и внешними накопителями. В настоящий мо- мент он составляет несколько порядков, что создает значительные проблемы при организации системы обработки данных. Основные исследования по технологии аппаратной части направлены на совершенствование внешних накопителей для уменьшения этого разрыва.
2.1. Аппаратные средства 19 Ядром арифметического блока является сумматор. Арифме- тические операции с целыми числами сводятся к многократным сложениям и сдвигам. Операции с дробными числами реализу- ются в этом случае программными средствами. Такая организа- ция обработки числовой информации характерна для малых ЭВМ. Большие вычислительные машины содержат несколько арифметических блоков для раздельной обработки целых и дробных чисел, а также символьной информации. Блок управления в простейшем случае должен выполнять те же действия, которые совершает пользователь, работающий с непрограммируемой карманной вычислительной машиной (каль- кулятором). Он управляет процессом вычислений и наблюдает за ходом всех операций. Существует тесная связь между функция- ми блока управления и функциями операционной системы. 2.1.3. Канальный принцип и дистанционная обработка данных К центральным процессорам настольных и малых вычисли- тельных машин можно непосредственно присоединить до пяти периферийных устройств. Большие вычислительные машины могут обслуживать значительно большее количество таких уст- ройств (например, терминалов). Периферийные устройства ра- ботают медленнее центрального процессора. Поэтому между центральным процессором и периферийным устройством распола- гаются каналы и блоки управления. К большим вычислительным машинам может быть подключено до восьми каналов. К каждому каналу может быть подключено до 64 управляющих устройств, к каждому управляющему устройству — до восьми устройств ввода-вывода одинакового типа. Канал представляет собой малую вычислительную машину, специализированную на операциях ввода-вывода. Программа, по которой осуществляется обмен информацией между центральным процессором и устройством ввода-вывода, активизируется командой центрального процессора. Канал имеет буферную па- мять, в которой накапливается поступающая с периферии инфор- мация. Только после окончания операции ввода эта информация с большой скоростью передается в центральный процессор. При выводе упомянутые устройства взаимодействуют аналогично, информация передается в обратном направлении. Управляющие устройства осуществляют механическое и энергетическое управление устройствами ввода-вывода. Кроме того, здесь происходит преобразование различных кодов, полу- чаемых на выходах различных устройств ввода-вывода, в унифи- цированный стандартом DIN 66 003 семиразрядный код ASCII. При дистанционной обработке данных между каналом и уп- равляющим устройством находятся приемопередающие устрой-
20 2. Структура и принцип вычислительной машины ства. В ФРГ они являются монополией германской федеральной почты. В настоящее время используются следующие сети связи, к которым возможно подключение приемопередающих устройств: Сеть связи Скорость передачи инфор- мации в бит/с Сеть телекса 50 Телеграфная сеть 200 Телефонная сеть 2400 Создается европейская сеть для дистанционной обработки дан- ных со скоростью передачи до 104 бит/с. При использовании дис- танционной обработки расходы, связанные с накоплением, обме- ном и преобразованием информации, снижаются примерно на одну треть. 2.2. Программное обеспечение Программное обеспечение подразделяется на системное и при- кладное программное обеспечение. Системное программное обеспечение представляет собой операционную систему, кото- рая будет описана в следующем пункте. Она поставляется изготовителем вычислительной машины. Характер прикладного программного обеспечения зависит от целей применения ЭВМ. Прикладное программное обеспечение создается изготовителем вычислительной машины, отдельными фирмами и владельцем вычислительной техники. Производство прикладного програм- много обеспечения постоянно нарастает. Этот процесс стимули- руется требованиями новых инженерных задач и осуществляет- ся в соответствии с принципами построения вычислительной ма- шины. В момент создания ЭВМ стоимость программного обеспече- ния составляет примерно 80% общей стоимости машины. При серийном производстве доля стоимости программного обеспече- ния снижается до 50%. 2.2.1. Операционная система Операционная система решает задачу оптимального исполь- зования технических средств вычислительной машины.. Особен- но важно распределение оперативной памяти и машинного вре- мени между различными пользователями. Подробнее об этом сказано в разд. 2.3. Изготовление операционной системы для большой ЭВМ требует нескольких сотен человеко-лет. Операцион-
2,2. Программное обеспечение 21 ная система состоит примерно из 107 операторов и занимает при- близительно 20% памяти вычислительной машины. Операцион- ная система записана в постоянной и (или) внешней памяти. Ис- пользуемые части операционной системы загружаются в опера- тивную память. На рис. 5 приведена структура операционной системы. ПРИКЛАДНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ОПЕРАЦИОННАЯ СИСТЕМА Служебные программы (утилиты) Транслятор Программы управления данными Управляющая программа Программа управления заданиями Программа управления задачами (супервизор) Стартовая программа Выбираемые расширения Графические системы Системы банка данных Системы дистанционной обработки Системы связи АППАРАТНОЕ ОБЕСПЕЧЕНИЕ Рис. 5. Структура операционной системы. Управляющая программа образует ядро операционной систе- мы. Она связывает программы пользователя с техническими сред- ствами вычислительной машины. Эта программа выполняет от- части те же функции, что и устройство управления. Она обычно хранится в постоянной памяти. После включения вычислитель- ной машины стартовая программа приводит ЭВМ в рабочее сос- тояние. Программа управления задачами (супервизор) выдает опера- тору вычислительной машины текущий протокол обработки, например перечень длительностей временных интервалов, из- расходованных различными пользователями и устройствами. В случае необходимости выдаются сообщения об ошибках поль- зователей и оператора. Кроме того, эта программа регулирует обмен с каналами (см. п. 2.1.3). В частности, она принимает от канала сообщение об окончании выполнения задания и возбужда- ет его для выполнения нового задания. Кроме того, она координи- рует совместную работу всех программ операционной системы. Программа управлениями заданиями позволяет организовать, например, компиляцию, распечатку и выполнение программы пользователя. В простейшем случае она резервирует место в опе- ративной памяти для очередной программы пользователя и вы- зывает компилятор. Обработка заданий в ЭВМ обычно произво- дится либо в мультипрограммном режиме, либо в режиме разде- ления времени. Сущность этих режимов пояснена в разд. 2.3. В процессе управления данными реализуется концепция вирту-
22 2. Структура и принцип вычислительной машины альной памяти. Согласно этой концепции, программы и данные автоматически перемещаются из оперативной памяти в перифе- рийную и наоборот, однако пользователя это не касается; для него существует единая однородная память. Ее называют вир- туальной. Программы управления данными организуют работу перифе- рийных устройств. Зачастую эти программы выполняются кана- лами. Они формируют физическую структуру наборов данных в соответствии с логической структурой, заданной пользователем. Более подробно об этом сказано в гл. 8. Программы управления данными сглаживают существенное различие скоростей работы центрального процессора и периферийных устройств, а также обрабатывают очереди из записей заявок задач различных поль- зователей на обмен с периферийными накопителями. Для расшифровки программ, написанных на исходном языке (см. п. 2.2.3), служат программы-переводчики, называемые тран- сляторами. Различают следующие виды трансляторов: ассемблер (для машинно-ориентированных языков), компилятор (для проблемно-ориентированных языков), интерпретатор (для диалоговых языков). Как ассемблер, так и компилятор переводят на машинный язык всю программу целиком. В результате получается программа в виде двоичного представления. Достоинство этого метода пере- вода состоит в том, что на этапе выполнения программы нет не- обходимости еще раз обращаться к транслятору. Недостаток — в том, что при каждом изменении программы ее нужно трансли- ровать заново. Интерпретатор транслирует и выполняет после- довательно один оператор за другим. Каждый оператор (или груп- па операторов) транслируется и выполняется независимо от остальных операторов. Такой метод перевода требует значитель- но большего места в оперативной памяти и большего времени центрального процессора. Зато весьма просто вносятся измене- ния в программу. Интерпретатор значительно дешевле компиля- тора. Так как каждый вид преобразования программы имеет преимущества, то на практике используется комбинация обоих методов: во время отладки программа может интерпретировать- ся, а после отладки — компилироваться. Программы на Фортране чаще всего транслируются компилятором. Осталось рассмотреть программы операционной системы, объединенные общим названием утилиты (служебные програм- мы). Перечислим типичные задачи утилит: 1. Управление библиотеками программ и библиотеками на- боров данных (организация банков данных). При обращении к утилите нужно указывать списки с входными адресами и необ- ходимую емкость памяти.
2.2. Программное обеспечение 23 2. Обмен данными между различными периферийными уст- ройствами, например перепись информации из пакета дисков на ленту или выдача на печать в машинных кодах содержимого час- ти оперативной памяти. 3. Редактирование текста. Позволяет организовывать и из- менять наборы данных. Все программы, записанные на внешнем носителе, являются наборами данных. К утилитам, например, относится программа, производящая сортировку и объединение наборов данных. Выбираемые расширения операционной системы не ограниче- ны классификацией, приведенной в правой колонке рис. 5 на стр. 21. Большие вычислительные машины могут иметь собственное сервисное программное обеспечение для поддержания графичес- кой обработки данных, дистанционной обработки информации, управления банками данных. Графическая обработка данных очень важна для инженера. К сожалению, она не стандартизирована в Фортране. Существу- ют многочисленные системы программ, с помощью которых мож- но составлять различные задания. Эти системы написаны на раз- ных языках программирования. Например, есть система для конструирования частей машин (CAD—computer assisted design), система для проектирования интегральных схем, программы для ввода диаграмм и различных надписей. Управление банками данных играет важную роль при обработ- ке нечисловой информации. Главной задачей является поиск нужных сведений по различным критериям. К этому же кругу задач относятся вопросы защиты данных. Когда говорят о дистанционной обработке данных в комму- никационных (взаимодействующих) системах, то имеют в виду объединение нескольких ЭВМ в единую сеть. Связанные с этим проблемы полностью решены только в техническом плане. Со- ответствующее сервисное программное обеспечение находится в стадии разработки. 2.2.2. Язык управления заданиями Программы операционной системы вызываются для выполне- ния нестандартизированными командами. Множество этих ко- манд образует язык управления заданиями (ЯУЗ). Пользователь настольных ЭВМ применяет для управления только эти команды. Для больших вычислительных машин разработаны каталогизи- рованные процедуры, написанные на языке управления зада- ниями. Каждая из этих процедур предназначена для решения определенной задачи управления и по существу является укруп-
24 2. Структура и принцип вычислительной машины ненной командой ЯУЗ. Наличие процедур значительно упрощает процесс оформления заданий. Для реализации процедуры доста- точно сослаться на ее имя. О выполнении заданий см. разд. 3.3. 2.2 3. Языки программирования Машинные языки Операторы языка программирования могут быть выполнены вычислительной машиной только после их представления в дво- ичном коде. Инструкции, полученные таким образом, называют- ся машинными командами. Каждая команда занимает от двух до шести байтов памяти. Она состоит из кода операции и адресной части. Код операции указывает вид выполняемого действия. Адресная часть обычно содержит два адреса. Они соответствуют номерам ячеек памяти, в которых расположены операнды. Ре- зультат выполнения арифметической операции записывается на место первого операнда. Поэтому первый операнд не сохраняет- ся. Машинный язык большой ЭВМ включает около 100 различ- ных операций. Программа, написанная на одном из языков про- граммирования, должна перед выполнением преобразовываться транслятором в машинную программу, т. е. в программу, сос- тоящую из машинных команд. Определение: Программу, написанную на машинно-ориен- тированном или проблемно-ориентированном языке, назы- вают исходной программой. Программу, переведенную на машинный язык, т. е. представленную в кодах ЭВМ, назы- вают объектной программой. Машинно-ориентированные языки Коды операций машинно-ориентированного языка представ- ляются легко запоминаемыми сокращениями. Например, опера- ция суммирования кодируется символом A (addition), операция умножения — символом М (multiplication). Местонахождение операндов указывается при помощи символических адресов. Определение: Символический адрес обозначают именем. Имя связано в программе с ячейкой памяти. Имена выби- раются произвольно в рамках определенных правил. Имя чаще всего состоит из такой комбинации букв, которая имеет для пользователей очевидное значение. Например, имя Т применяют для обозначения времени, имя ХМАХ используют для обозначения величины хтах. Другими словами, имя целесо- образно выбирать так, чтобы оно было связано со смыслом обоз-
2.2. Программное обеспечение 25 качаемого им параметра. Таким образом, имя представляет со- бой символический адрес ячейки памяти, в которой могут нахо- диться различные числа в процессе выполнения программы. Под- робнее об именах переменных см. разд. 5.1. Каждый оператор исходной программы, составленной на ма- шинно-ориентированном языке, соответствует одной машинной команде в объектной программе. Другими словами, ассемблер производит трансляцию «один в один». При этом символические адреса заменяются действительными, а мнемонические коды операций — фактическими. Использование машинно-ориенти- рованного языка по сравнению с проблемно-ориентированным увеличивает затраты времени на программирование примерно в два раза. Однако программы, написанные на машинно-ориенти- рованном языке, примерно во столько же раз эффективнее по затратам памяти и времени счета. Микрокомпьютеры, как прави- ло, программируются на машинно-ориентированном языке. Проблемно-ориентированные языки Эти языки не зависят от свойств конкретной ЭВМ * и обычно просты в изучении. Их структура ориентирована на определен- ный круг задач. В настоящее время имеется свыше 100 проблем- но-ориентированных языков. Рассмотрим краткие характеристи- ки наиболее употребительных из них. Фортран (FORTRAN — FORmula TRANslation) является классическим языком для технических приложений. Он подроб- но рассмотрен в гл. 5. Бейсик (BASIC — Beginner’s All purpose Symbolic Instruction Code) в основных своих частях проще Фортрана и поэтому ис- пользуется во многих настольных вычислительных машинах. Он развивается как диалоговый язык. Паскаль (Pascal — фамилия французского математика) ис- пользуется преимущественно в университетах. Поддерживает методы структурного программирования (см. п. 4.2.1). АПЛ (APL — A Programming Language) представляет собой диалоговый язык для решения сложных задач прикладной мате- матики и выполнения экономических расчетов. Кобол (COBOL — COmmon Business Oriented Language) является языком, предназначенным для обработки коммерческой информации. АПТ (APT— Automatically Programmed Tools) предназначен для станков с числовым программным управлением. Часто ис- пользуют подмножество этого языка ЕХАРТ, в котором можно * Абсолютной независимости достичь невозможно. Любой язык несет от- печаток архитектуры того или иного класса машин.— Прим, перев.
26 2. Структура и принцип вычислительной машины выделить три части — средства управления сверлением, фрезеро- ванием и обточкой. Ввод информации обычно осуществляется с перфоленты или с магнитной ленты. Пеарл (PEARL — Process and Experiment Automation Real- time Language) используется при обработке информации о физи- ческих и технических процессах. Позволяет обрабатывать дан- ные в реальном масштабе времени, т. е. синхронно с протекаю- щим процессом. Кроме того, имеются языки программирования для оформле- ния и ведения документации, для решения задач математической логики, для описания учебных программ и т. п.* 2.3. Режимы обработки заданий Обработка заданий пользователя протекает в тесном взаимо- действии технических и программных средств. Настольные вычислительные машины могут работать только в режиме пакетной обработки. Сущность этого режима заключа- ется в том, что последующая программа может выполняться лишь после завершения выполнения предыдущей программы. Это прос- тейший режим работы. Он получил такое название потому, что раньше каждая программа на внешнем носителе представляла из себя стопку (пакет) перфокарт **. В режиме разделения времени*** работают как бы одновремен- но (а в действительности, поочередно сменяя друг друга) от 5 до 100 различных пользователей. В простейшем случае каждый из них получает в свое распоряжение центральный процессор на время около 0,2 с через равные интервалы порядка 2 с (см. рис. 6). Инструкции, которые набирает пользователь на клавиату- ре терминала, поступают прежде всего в буферную память и пе- реписываются в центральный процессор для выполнения лишь тогда, когда данный абонент оказывается вновь подключенным к центральному процессору. При каждой смене подключенного * Заслуживают внимания также следующие языки программирования: ЛИСП — символьный язык обработки списков, широко применяющийся при проведении работ по искусственному интеллекту; ПЛИ — универсальный язык программирования, широко распространенный в машинах фирмы IBM и в ЕС ЭВМ; Ада — язык программирования для систем реального времени и парал- лельной обработки; Пролог — непроцедурный язык, не имеющий инструкций и предназначенный для установления отношений и получения выводов, осно- ванных на этих отношениях.— Прим. ред. ** Этот режим использования больших ЭВМ сохранился частично и сей- час. В оперативную память машины загружается сразу ряд заданий, подлежа- щих последовательной обработке. Затем все они переписываются на магнит- ные диски и считываются оттуда в оперативную память для выполнения по очереди, одно за другим.— Прим. ред. **♦ Этот режим называется также режимом коллективного пользова- ния.— Прим, перев.
2.3. Режимы обработки заданий абонента операционная система переписывает программы и на- боры данных обрабатываемого задания из периферийного нако- пителя в оперативную память (в начале сеанса связи) и обратно (в конце сеанса). В режиме мультипрограммной обработки как бы одновремен- но выполняются несколько программ. В действительности выпол- нение программ совмещается лишь частично. Отличие режима мульти- программной обработки от ранее рассмотренного режима разделения времени состоит в том, что в рас- сматриваемом режиме устанавлива- ются приоритеты. Если в течение какого-то отрезка времени програм- ма с более высоким приоритетом не использует арифметическое устрой- ство (например, происходит ввод или вывод данных), то могут прово- диться вычисления по программе с меньшим приоритетом. В против- ном случае вторая программа нахо- Рис. 6. Режим разделения вре- ДИТСЯ в состоянии ожидания. На мени- рис. 7 приведены временные диаг- раммы работы двух программ. Первая программа (Пр. 1) име- ет высокий приоритет и интенсивно использует устройства вво- да-вывода. Вторая программа (Пр. 2) имеет низкий приоритет и интенсивно использует арифметическое устройство*. Ввод-вывод Вычисления Ожидание Ввод-вывод Рис. 7. Режим мультипрограммной обработки. 2.4. Задачи На все вопросы следует ответить по памяти. 1. В чем состоит различие между цифровой и аналоговой вы- числительными машинами? 2. Почему цифровая вычислительная машина работает только с двумя символами? * В таком режиме более эффективно используется центральный процес- сор (это видно из рис. 7), однако, для каждой программы может быть отведен меньший объем памяти, чем в любом, рассмотренном ранее режиме.— Прим, ред.
28 3. Разработка программы 3. Что следует понимать под термином «метод прямого досту- па»? Как называется другой способ обращения к памяти? 4. Из каких функциональных блоков состоит центральный процессор? 5. Из каких программ состоит управляющая программа опе- рационной системы? 6. В чем заключается разница между трансляцией программы при помощи компилятора и интерпретатора? 7. К каким элементам операционной системы принадлежат программы, выполняющие следующие функции: а) перепись программы с магнитной ленты в оперативную па- мять, б) установление связи между центральным процессором и уст- ройством печати, в) организацию режима разделения времени? 8. Назовите имена проблемно-ориентированных языков, по- средством которых могут решаться технические задачи. 9. В чем состоит разница между режимом разделения времени и режимом мультипрограммной обработки? 10. Поясните с помощью нескольких слов следующие понятия: а) чип, б) диск, в) встроенное программное обеспечение, г) про- цессор, д) постоянная память, е) символический адрес, ж) канал, з) ячейка памяти, и) язык управления заданиями, к) виртуаль- ная память, л) прикладное программное обеспечение. 3. РАЗРАБОТКА ПРОГРАММЫ 3.1. Анализ задачи Анализ задачи заключается в описании цели, средств, не- обходимых для ее достижения, и принципов обработки ин- формации. Описание цели в простейшем случае состоит из полного пере- числения вида представления (экран дисплея, бумага печатаю- щего устройства) и содержания тех результатов, которые должна выдавать машина по разрабатываемой программе. Требуется большой опыт для умения разумно ограничить возможности про- граммы. Чем универсальнее программа, тем сложнее с ней об- ращаться. Кроме того, универсальная программа более критич- на к исходной информации, т. е. при некоторых значениях ис- ходных данных возможны сбои в ее работе. При описании цели часто возникает так называемый «целевой» конфликт: намечает- ся несколько исключающих друг друга целей, например, низ- кая стоимость и высокое качество. Подробнее см. п. 4.2.2. Составив описание цели, нужно выяснить, какие средства необходимы для ее достижения. В простейшем случае следует
3.2. Этапы изготовления программы 29 уточнить вид и содержание исходных данных. Часто оказывает- ся, что, для того чтобы привести информацию к виду, удобному для ввода в ЭВМ, на предприятии необходимо произвести неко- торые организационные перестройки. Тогда необходимо принять принципиальное решение на основании ответа на вопрос: оправ- дывает ли поставленная цель использование необходимых для ее достижения средств? В заключение должны быть выяснены принципы обработки. Необходимо также получить ответы на следующие вопросы: 1. Целесообразно ли создавать программу силами данного предприятия или выгоднее заказать ее разработку другой орга- низации? 2. Достаточно ли на данном вычислительном центре челове- ческих и материальных ресурсов для решения поставленной за- дачи при помощи имеющихся программ? 3. Какой режим работы вычислительного центра является наиболее выгодным (см. разд. 2.3)? Анализ больших задач проводится группой специалистов. Только после полного выяснения поставленных вопросов может быть дан заказ, понятный программисту. 3.2. Этапы изготовления программы Процесс изготовления программы можно разделить на две фазы: проектирование и реализация. Ниже приведена детализа- ция процесса по этапам. Она может использоваться для контро- ля при фактическом изготовлении программы. Этапы 1—5 со- ответствуют фазе проектирования, этапы 6—9 представляют фазу реализации. В начале каждый этап сформулирован в виде тезиса. Далее даны необходимые пояснения. Осуществление этих этапов в процессе изготовления программы иллюстрируется примером 8, приведенным на стр. 52. Другие весьма ценные указания со- держатся в [21]. Итак, последовательность этапов такова: 1. Приведение технической задачи к математическому виду. Например, если необходимо рассчитать токи, протекающие в ветвях резисторной электрической цепи при известных величи- нах сопротивлений элементов схемы и напряжений источников, то составляется система линейных уравнений. 2. Выбор подходящего численного метода решения. Например, для решения составленной системы уравнений может быть выб- ран метод Гаусса или метод итераций [4], [25], [26]. 3. Решение контрольного примера с помощью микрокальку- лятора. При этом подбирают не слишком простые исходные дан- ные, иначе ошибка в программе может быть не обнаружена. Кро-
30 3. Разработка программы ме того, следует обратить внимание на специальные случаи, на- пример на равенство нулю некоторых коэффициентов матрицы в составленной системе уравнений. 4. Анализ исходных и результирующих данных. 5. Построение логической схемы программы. 6. Написание программы. Этот этап называют программирова- нием. 7. Тестирование (отладка) программы на числовых данных, сформированных на третьем этапе. 8. Составление описания программы. 9. Написание руководства для пользователя. Прежде всего следует подчеркнуть решающее значение пер- вого и второго этапов и их большое влияние на весь процесс раз- работки программы. В дальнейшем будем предполагать, что ма- тематическое описание и выбор численного метода произведены правильно. Если это не удается сделать, то следует еще раз рас- смотреть основные положения, изложенные в данной книге. Приведенные здесь примеры поясняют численные методы, ис- пользующиеся во многих технических задачах. В данной книге не рассматриваются вопросы сходимости приближенных методов и вопросы распространения ошибок при вычислениях. Подробно эти моменты рассмотрены, например, в [31, [25], [26]. Этап 4 является самым трудным для начинающих программис- тов. Соответствующие вопросы обсуждаются подробно лишь в разд. 5.6 и гл. 8. Однако на практике перед тем как писать про- грамму, рекомендуется полностью выяснить картину, связанную с организацией данных. Обычно возникают следующие вопросы: 1. Как лучше организовать ввод исходных данных в процессе выполнения программы: с клавиатуры или после предваритель- ной записи в периферийный накопитель? 2. В какой форме следует осуществить вывод результатов счета: сколько чисел должно печататься в каждой строке, сколь- ко цифр после десятичной точки должно быть сохранено в каж- дом числе? При разработке программ для коммерческих расчетов часто составляется особая схема обработки данных, в которой в соот- ветствии с логической схемой алгоритма посредством стандарти- зированных символов изображаются перемещение и накопление информации в периферийных накопителях. Этапы 5 и 6 соответствуют программированию в прямом смыс- ле этого слова. Их содержание подробно обсуждается в последую- щих главах. Содержание этапа 7 рассмотрено в разд. 4.2 и гл. 9. Здесь же уместно отметить, что тестирование программы требует при- мерно 50% всего времени, необходимого для ее изготовления.
3.3. Выполнение программы 31 Часто недооцениваются затраты времени, которые связаны с осуществлением 8-го этапа. Имеются готовые методы для про- ведения этой работы с использованием вычислительной машины. Описание программы создается с целью быстрого ее понимания при более позднем внесении изменений. Описание дополняет логическую схему программы. Вместе они составляют програм- мную документацию. Содержание описания должно ограничивать- ся программно-техническими вопросами. Оно не должно содер- жать математической аргументации. В нем приводятся эксплуа- тационно-технические данные программы, например фамилия разработчика, необходимое счетное время, внесенные изменения и т. п. К описанию должны прилагаться результаты тестирова- ния. Результаты работ по 8-му и 9-му этапам должны быть четко разграничены. Иному пользователю может не потребоваться чтение и понимание программы, пока он с ней не поработает. В документации по 9-му этапу необходимы особенно точные указания о форме входных данных, командах, используемых под- программах и периферийном накопителе. Такую инструкцию для пользователя можно встроить в программу и вывести, на- пример, на экран дисплея. Однако от этого программа сильно увеличивается в объеме. 3.3. Выполнение программы Ход выполнения программы сильно зависит от вычислитель- ной машины и ее операционной системы. Чем выше их комфорта- бельность, тем ближе характер работы на ЭВМ к простому об- служиванию настольного вычислителя. Настольная ЭВМ готова к работе сразу же после включения. Прежде всего необходимо сообщить ей о своем прибытии. Для этого надо ввести ключ (клю- чевое слово), который удостоверит личность пользователя и его право доступа к машине. В процессе выполнения программы ав- томатически подсчитывается использованное машинное время и регистрируется полученная область памяти. По окончании рабо- ты пользователь должен сообщить вычислительной машине о своем уходе. При работе на большой ЭВМ пользователь прежде всего вво- дит в нее исходную программу, например, посредством клавиа- туры дисплея (см. стр. 13). Во время ввода каждой строки любой символ еще может быть довольно просто скорректирован. Нужно привыкнуть тщательно контролировать каждую набранную стро- ку, прежде чем передать ее Соответствующей клавишей для после- дующей обработки (см. стр. 14). Исходная программа записы- вается в процессе ввода в набор данных, который можно изменять в режиме редактирования. Ниже пояснена сущность трех шагов
32 3. Разработка программы работы вычислительной машины: компиляции, редактирования и выполнения программы. Компиляция. Если программа транслируется компилятором (в Фортране это наиболее частый случай), то создается второй набор данных с объектной программой, который может неодно- кратно вызываться в дальнейшем. В принципе каждая отлажен- ная программа требует только однократной компиляции. При работе интерпретатора процесс трансляции совмещен с процес- сом выполнения. Поэтому объектная программа отсутствует. Редактирование представляет собой процесс соединения не- скольких программ (основной программы и подпрограмм) в од- ну выполняемую программную систему (см. разд. 7.1). Выполнение в узком смысле — это непосредственный расчет.' На этом шаге исходные данные читаются из входного файла (на- бора данных), а полученные результаты выводятся в выходной файл. В простейшем случае все три шага выполняются управляющей программой, которая вызывается по имени RUN или по имени GO. Однако для уменьшения затрат машинного времени новую программу рекомендуется только компилировать, так как в про- цессе компиляции выдаются сообщения об ошибках, по которым исходную программу можно откорректировать. После корректи- ровки можно провести повторную компиляцию. При отсутствии сообщений об ошибках, обнаруженных во время компиляции, оставшиеся ошибки могут выявиться в фазе выполнения. 3.4. Ввод в эксплуатацию и обслуживание Безошибочное прохождение программой заключительного теста программист рассматривает в качестве основания для окон- чания своей работы. Подробнее о тестах см. п. 4.2.3 и гл. 9. Толь- ко после завершения этапа тестирования программы начинается ее настоящая жизнь. Программа поставляется предприятию. Большому кругу пользователей сообщается о ее возможностях. Кроме того, часто проводятся другие организационные мероприя- тия. Каждая готовая программа должна обслуживаться. При этом в нее могут вноситься изменения и в случае необходимости устраняться, возможно, еще имеющиеся ошибки. Стоимость об- служивания программы доходит до 50% общей стоимости, свя- занной с ее возникновением и существованием. Это показывает, как важно с самого начала обращать особое внимание на ясность и обозримость ее структуры.
4,1, Условные изображения элементов схемы. 33 4. ЛОГИЧЕСКАЯ СХЕМА ПРОГРАММЫ Определение: Логическая схема является графическим пред- ставлением структурных признаков программы, выражен- ным при помощи условных обозначений (блоков), содержа- щих некоторый текст, и ориентированных линий. Логическую схему программы иногда называют блок-схемой или структурной схемой. Она составляется перед программиро- ванием задачи. Логическая схема нагляднее самой программы. Поэтому ошибки значительно легче найти на схеме, чем в про- грамме. Другое преимущество логической схемы состоит в том, что она может быть реализована в виде, не зависящем от языка программирования. Однако мы будем строить логические схемы, принимая во внимание некоторые правила Фортрана, которые рассматриваются в гл. 5. 4.1. Условные изображения элементов схемы. Основные структуры 4.1.1. Условные изображения элементов логической схемы Условные изображения элементов (блоков), использующиеся для построения логических схем, представлены на рис. 8 в соот- ветствии со стандартом DIN 66 001. Обычно блоки рисуют от ру- ки. Около каждого блока могут быть помещены пояснения. Со- держание текста в блоке не стандартизировано и зависит, напри- мер, от того, должна ли схема давать только общее представле- ние о программе или подробно описывать ее структуру с ориен- тацией на определенный язык программирования. При решении сложных задач обычно рисуют несколько логических схем с раз- личным уровнем детализации. Каждый оператор будущей про- граммы отражать в схеме не следует. Подробные логические схе- мы рассмотренных в данной книге программ приведены исклю- чительно из дидактических соображений. Рассмотрим функции элементов, изображенных на рис. 8. Понимание сущности оператора присваивания имеет основное значение. Здесь приводится первое объяснение действия этого оператора. Оно будет уточнено в разд. 5.5. Величины, обозначае- мые в операторах своими именами, в проблемно-ориентированных языках программирования называются переменными. Имена служат не только для обозначения переменных. Ими также обоз- начаются различные функции. Имя переменной является неко- торой комбинацией букв и цифр, произвольно выбираемой поль- зователем в рамках некоторых правил. Функции имеют постоян- но закрепленные за ними имена. 2 № 2295
34 4. Логическая схема программы В логической схеме и в программе имя обозначает символи- ческий адрес той ячейки памяти, в которой записано числен- ное значение соответствующей переменной или функции. г С= А + В Оператор Присваивания ! Печать С / Оператор ввода-вывода Решение квадратного уравнения Подпрограмма логическое арифметическое Разветвление Переключатель I (конец Граничная точка v Соединитель Цикл 1 1 = 0,10,2 Объединение Комментарий \Конец цикла 1 J Цикл Рис. 8. Символика логических схем. Следовательно, термин переменная или функция только условно соответствует общепринятым (математическим) понятиям. Что такое символический адрес было объяснено на стр. 24. Числа, представленные на схеме цифрами, называются константами. Константы обозначают сами числа, а не фактические адреса яче- ек памяти. Оператор присваивания, обсуждающийся в этом разделе, ис- пользуется только для выполнения арифметических операций, поэтому он называется арифметическим оператором присваива- ния. В Фортране имеются и другие виды операторов присваива- ния. Арифметический оператор присваивания выполняет следу- ющие действия. Операции, указанные справа от символа ==, вы- полняются над записанными в выражении константами и теми числами, которые хранятся в ячейках памяти, обозначенных встречающимися именами. Результат помещается в ту ячейку памяти, символический адрес которой указан слева отсимвола ==. Говорят, что переменной присваивается значение посредством опе- ратора присваивания. Следовательно, используемый здесь сим- вол = имеет смысл, отличный от принятого в математике.
4.1. Условные изображения элементов схемы. 35 Пример 1. Операторы присваивания. Операторы присваивания Пояснения С = А + В X-X + DX 1 = 1 + 1 Y = SIN (X) X = SIN (X) 5 = 2+3 А + В=С Содержимое ячеек памяти с символическими адресами А и В суммируются. Результат записывается в ячейку с символическим адресом С. Значение выражения в правой части вычисляется анало- гично. Результат записывается в ячейку X, поэтому пре- дыдущее содержимое этой ячейки будет стерто. В ячейке с символическим адресом X после выполнения оператора будет записано новое значение переменной X. К содержимому индексной ячейки I прибавляется 1 и получается новое значение содержимого индексной ячей- ки. Говорят, что значение индекса увеличилось на 1. В ячейке с символическим адресом X записано значение угла, по которому вычисляется значение синуса и ре- зультат записывается в ячейку Y. Правая часть равенства вычисляется аналогично. Значе- ние синуса записывается в ту ячейку, в которой ранее находилось значение угла. Этот оператор является ра- циональным, если значение угла больше не понадобится. Благодаря записи в ту же ячейку экономится память. Естественно, такая запись не означает требования на решение трансцендентного уравнения. Ошибка, так как слева от символа = не может стоять константа. Ошибка, так как слева от символа = может находиться только переменная. Переменным, которые расположены в правой части оператора присваивания, должны быть присвоены определенные значения предшествующими операторами программы. I Определение: Первое присваивание переменной какого-либо I значения называют инициализацией этой переменной. Инициализацию можно осуществить оператором ввода, опера- тором присваивания или оператором DATA. Эти операторы об- суждаются в п. 5.6.1. Многие вычислительные машины присваи- вают всем переменным значение, равное нулю, перед началом вы- полнения программы. Такая возможность стандартом не преду- смотрена, поэтому она здесь не используется. На практике также не рекомендуется надеяться на это обстоятельство. Операторы ввода-вывода: В операторах ввода-вывода записы- ваются имена тех переменных, значения которых должны вво- диться в оперативную память или выводиться из нее. В этих опе- раторах могут также указываться внешние устройства, с которы- ми осуществляется обмен информацией. Числа при вводе запи- сываются в те ячейки памяти, символические адреса которых 2*
36 4. Логическая схема программы указаны в операторе. Возникающие при этом вопросы конца дан- ных и перемещения чисел вдоль экрана дисплея или вдоль листа бумаги рассматриваются соответственно в начале разд. 4.3 и в разд. 5.6. В простейшем случае действует следующее правило: Каждый оператор вывода начинает новую строку. Значения переменных, указанных в операторе вывода, записываются построчно. Вывод пояснительного текста осуществляется с помощью заключения соответствующих печатных символов (пояснительного текста) в апострофы. Для вывода каждой строки используют отдельный оператор. Пример 2. Операторы ввода-вывода. Оператор ввода-вы вода Пояснения Ввод А, В, С Печать* X Y* Печать X, Y Печать’Х = ’,Х Если в программе встречается этот оператор, то машина переходит в режим ожидания до тех пор, пока через клавиатуру дисплея не будут введены три числа, разде- ленные запятыми или пробелами. После ввода третьего (последнего) числа необходимо нажать клавишу ENTER. При вводе данных с перфокарт считываются три числа, находящиеся в момент выполнения этого оператора в устройстве ввода. Затем выполнение программы про- должается. В обоих случаях (при вводе с дисплея и при вводе с перфокарт) числа кодируются, т. е. переводятся из обычного вида во внутренний код ЭВМ. Закодированные числа помещаются в ячейки памяти с символическими адресами А, В и С. Печатаются символы: X Y с расположенными между ними пробелами. Из ячеек с символическими адресами X и Y выбираются числа. Они преобразуются из машинного кода к обычно- му виду (декодируются) и печатаются на листе бумаги в одной строке. Если предыдущий оператор и рассматри- ваемый оператор следуют в программе друг за другом, то в первой строке печатаются буквы X Y, а во вто- рой строке —соответствующие численные значения. Если переменная X имеет значение, равное 5, то на бумаге печатается Х = 5. Подпрограмма (ПП). Группу операторов, которые решают часть задачи, можно объединить в подпрограмму. Алгоритм ре- шения описывается в виде логической схемы. Разделение про- граммы на подпрограммы играет важную роль в структурном программировании (см. разд. 4.2.1). Подпрограммы детально рассматриваются в гл. 7. Разветвление является важным элементом логической схемы. Имеются три различных вида разветвления.
4.1. Условные изображения элементов схемы. 37 1. В блоке стоит логическое выражение, которое принимает значение истина (да) или ложь (нет). В зависимости от значения выражения, дальнейший ход выполнения программы развивает- ся в одном из двух направлений. Говорят, что разветвление име- ет два выхода (см. пример 4 на стр. 47). Простейшим видом ло- гического выражения является отношение между двумя арифме- тическими выражениями. Иначе его называют условием. Возмож- ны следующие знаки отношений: = равно > больше больше или равно =£ неравно < меньше С меньше или равно Примеры: х^хтах и у=0 являются логическими выраже- ниями. Новички иногда ставят знак вопроса после каждого логическо- го выражения. Последовательность символов Y=0 может также означать арифметический оператор присваивания. Что это такое, отношение (условие) или арифметический оператор присваива- ния, определяется местом написания конструкции, т. е. зависит от того, в каком блоке стоит эта последовательность символов. 2. В блоке стоит арифметическое выражение. Его значение может быть положительным, равным нулю или отрицательным. В зависимости от этого дальнейший ход выполнения программы развивается по одной из трех ветвей. Примеры: х—хтах и у — арифметические выражения. 3. В блоке стоит переменная. Эта переменная принимает толь- ко целые положительные значения. Конкретное значение пере- менной определяет номер ветви, по которой будет продолжать выполняться программа. Разветвление, содержащее больше трех выходов, называется переключателем (см. пример 11 на с. 58). Оператор цикла рассматривается в п. 4.1.2. Граничные точки отмечают начало и конец программы. Ти- пичной ошибкой новичка является написание бесконечно рабо- тающей программы. В программе всегда должно указываться условие окончания вычислительного процесса. Соединительные линии и их объединение. Все блоки схемы соединяются посредством линий, которые в сомнительных слу- чаях снабжаются направляющими стрелками. Предпочтитель- ными являются направления сверху вниз и слева направо. При объединении нескольких ветвей в одну ветвь необходимо ставить стрелки в точке объединения. Пересекающиеся линии без стре- лок означают отсутствие соединения. По возможности следует избегать пересечений. Точками связи или соединителями пользуются в том случае, если соединительная линия не может быть доведена до следующе- го блока или до точки объединения. Тогда соединительная ли-
38 4. Логическая схема программы ния оканчивается соединителем, в котором записывается любой символ. Продолжением этой линии считается вторая точка свя- зи, помеченная тем же символом. Переход из многих мест логи- ческой схемы в одно и то же место считается допустимым. Пере- ход из одной точки в разные недопустим (он был бы переходом без условия). Комментарии можно записывать около любого блока. 4.1.2. Структуры Из рассмотренных блоков можно собирать различные структу- ры. Основные понятия и правила построения структур не зави- сят от конкретного содержания программы. Важным этапом при программировании является абстрагирование от содержания со- ответствующей задачи и определение структуры программы. Поэтому прежде всего здесь поясняются основные понятия тео- рии структур независимо от тех или иных примеров. Поясне- ния на конкретных примерах приведены в разд. 4.3. Можно по- казать, что схема любой программы образуется только из трех структур, приведенных на рис. 9. Определение: Если часть программы не содержит развет- влений, то она называется последовательностью операторов. Если после проверки некоторого условия пути расходятся, а затем где-то сходятся, то возникает разветвление. Каждый путь называется веткой. Если некоторая часть программы выполняется многократно и после проверки некоторого ус- ловия осуществляется выход из нее, то такую часть называ- ют циклом. На рис. 9 приведен цикл общего вида. Такой цикл не имеет особого названия. К построению этого цикла на Фортране прибе- гают весьма редко. Обычно составляют программы так, чтобы в теле цикла присутствовала только одна из двух последователь- ностей операторов (либо верхняя, либо нижняя). Если разветвле- ние стоит в конце циклического участка, то говорят об итератив- ном цикле. Операторы, находящиеся в теле такого цикла, повто- ряются по крайней мере один раз. Если отсутствует верхняя груп- па операторов, то говорят о цикле по условию (см. рис. 25 на стр. 95). Имеется еще один тип цикла, которому соответствуют спе- циальные символы логической схемы и специальный оператор Фортрана. Определение: Цикл, в котором число повторений известно до первого прохождения, называется счетным (или индук- тивным).
4.1. Условные изображения элементов схемы. 39 В счетном цикле есть параметр цикла. Начальное и конечное значения параметра, а также величина шага его изменения долж- ны быть известны перед первым прохождением циклического Рис. 9. Основные структуры. участка. На рис. 10 приведена структура такого цикла. Имена I, II, 12 и DI выбираются произвольно. Если 12>П, то шаг D1 должен быть положительным, если 12<П, то шаг DI должен быть отрицательным. Количество повто- рений в цикле может быть вычис- лено по следующей формуле: N=(I2+DI—I1)/DI. Здесь берется целая часть отно- шения. Принцип действия цикла пояс- няется схемой, представленной на рис. 10 слева. Следует обратить вни- мание на тот факт, что после выхода из цикла переменная I имеет зна- чение, отличное от значения, кото- рое она имела при непосредствен- ном прохождении цикла. На рис. 10 справа приведена схема этого же цикла в новых условных обозначе- ниях. Достоинство этих обозначе- Рис. 10. Счетный цикл. ний состоит в том, что схема становится компактной и наглядной при сохранении всех операторов, необходимых для описания по- вторяемого участка программы. Примеры: Если на схеме имеется запись 1 = 1, 7, 2, то цикл выполняется со значениями 1 = 1, 3, 5, 7. Если на схеме имеется запись 1=2.5, 1.0,—0.5, то цикл выполняется со значениями 1 =
40 4. Логическая схема программы = 2.5, 2.0, 1.5, 1.0. Эти значения параметра цикла I могут быть ис- пользованы операторами последовательности, составляющей тело цикла. В обоих случаях число прохождений цикла, рассчитанное по формуле, приведенной на стр. 39, равно 4. РАЗРЕШЕНО ЗАПРЕЩЕНО Вложение Перекрытие Выход из цикла Вход в цикл Рис. 11. Правильно и неправильно организованные циклы. Обычно в программе используется несколько счетных циклов. Наиболее важные структуры представлены на рис. 11. Соответст- вующие правила гласят: 1. Допустимо вложение нескольких циклов друг в друга. Структура вложенных циклов действует так: прежде всего вы- полняется внутренний цикл. Затем изменяется параметр внешне-
4.2. Методика работы 41 го цикла, после чего снова выполняется внутренний цикл, при- чем его параметр изменяется опять от своего начального значе- ния. Большинство вычислительных машин (точнее транслято- ров.— Ред.) допускают вложение по крайней мере 10 циклов. Выявление этих структур представляет одну из основных проб- лем для начинающего. Далее см. пример 7 на стр. 50. 2. Перекрытие циклов запрещено. 3. Выход из цикла по соблюдению некоторого условия допус- тим. После такого выхода из цикла остается сохраненным послед- нее значение параметра I. Оно может использоваться в дальней- ших вычислениях. Например, для подсчета числа повторений можно вначале установить 11=0, DI = 1, а в качестве 12 взять не- достижимо большое значение. Тогда переменная I после выхода из цикла по условию укажет реализованное количество повто- рений в этом цикле. Программисты охотно пользуются таким трюком. 4. Переход внутрь цикла извне запрещен. 4.2. Методика работы. Качественные характеристики программы. Ошибки 4.2.1. Структурное программирование Методика составления логических схем тесно связана с вы- шеописанными структурами. Используются только те структуры (конструкции), которые приведены на рис. 9 стр. 39. Каждая конструкция имеет один вход и один выход и поэтому может рас- сматриваться в качестве макрооператора, который часто назы- вают модулем. Из сказанного следует: Каждый блок логической схемы, кроме блока разветвления, может быть замещен любой основной конструкцией. Следовательно, логическая схема программы состоит только из вложенных друг в друга основных структур, как это, напри- мер, показано на рис. 12 и в примере 8 на с. 52. Переход от вы- хода разветвления в отдельную часть программы нарушает этот принцип. Такой переход может иногда несколько сократить программу. Однако на основании опыта можно утверждать, что при внесении в программу более поздних изменений эти переходы приводят к дополнительной работе по перепрограммированию и к дополнительным ошибкам. За исключением простейших случаев, операторы можно за- писывать не сразу в той последовательности, в которой они в конце концов будут находиться в программе. Стратегия разра- ботки логической схемы может базироваться на одном из двух следующих методов. Метод «сверху вниз» предписывает сначала изображать круп-
42 4. Логическая схема программы ные блоки, а затем детализировать их. Например, вначале мож- но образовать блок ввода, блок обработки и блок вывода. Далее каждый модуль нужно уточнять, подвергая пошаговой более подробной проработке и полу- чая таким образом более мелкие блоки. Рекомендуется, как мож- но дольше обходиться без раз- ветвлений. По возможности бло- ки следует оформлять в виде подпрограмм, которые рассмат- риваются в гл. 7. Существенным является то, что блоки могут обрабатываться и тестироваться независимо друг от друга. Этот метод хорошо зарекомендовал себя при программировании больших задач. В мелких задачах (напри- мер, в задачах, рассматриваемых в данной книге) быстрее приво- дит к цели метод центрального оператора». Логическую схему программы начинают рисовать с изображения математически важного пункта задачи, который называется центральным опера- тором. Затем обдумывают, что нужно сделать раньше и позже этого оператора для того, чтобы Рис. 12. Пример вложения основных он М°г быть выполнен. структур. Описанные методы не явля- ются единственно возможными способами построения логических схем. В программировании, как и в других видах творческой деятельности, часто возникают новые идеи, которые, однако, могут себя и не оправдать. Не сле- дует избегать проверки идей. 4.2.2. Качественные характеристики программы Обычно пользователь доволен, если он вообще решил задачу и программа заработала. Однако на практике к качеству про- граммы предъявляется целый ряд требований. Требования, предъявляемые к качеству программы, яв- ляются частично противоречивыми. Поэтому еще перед на- чалом ее разработки нужно установить четкие приоритеты этих требований.
4,2, Методика работы 43 Согласно [22], хорошая программа обладает следующими свойствами: корректность, достоверность, удобство для поль- зователя, удобство в эксплуатации, переносимость, защищен- ность, эффективность, рентабельность. Корректность программы означает, что она всегда обеспечи- вает получение правильных результатов. Это требование может показаться тривиальным. Однако на практике даже после дол- гой эксплуатации программы нередко выявляются необнару- женные в ней ранее ошибки. Создание методов доказательств корректности программы является трудным моментом в иссле- дованиях по технологии программирования. На практике чаще всего пользуются методами тестирования, рассмотренными в гл. 9. Достоверность программы означает, что даже в исключитель- ных случаях обеспечена рациональность реакций ЭВМ (напри- мер, выдача сообщений об ошибках), не происходит остановки работы, не выдаются бессмысленные результаты. Исключитель- ной ситуацией является, например, ввод неверных данных или появление недопустимых операций (деление на нуль, вычисле- ние tg (л/2)) при определенных сочетаниях допустимых исходных данных. Конечно, невозможно проверить все вводимые данные на возможность возникновения исключительной ситуации. По- могает смысловой контроль. Исходные данные часто заключены в пределы известных интервалов. Введенные значения всегда нужно выводить на печать с целью контроля. Удобной для пользователя является такая программа, кото- рая написана, исходя из нужд пользователя, а не программиста. Например, для каждой операции ввода данных необходимо за- ранее указывать применяемые обозначения величин. Выходная информация должна быть расположена на листинге или на экра- не дисплея так, как этого желает пользователь. Конечно, чем удобнее программа для пользователя, тем она больше и сложнее. Удобство в эксплуатации означает, что внесение поздних из- менений в программу сопровождается малыми затратами труда и времени пользователя. Наглядность и ясность программы, соблюдение принципов структурного программирования и на- личие тщательно разработанной документации в значительной степени гарантируют удобство в эксплуатации. Переменным сле- дует давать содержательные имена, несмотря на то, что они ока- зываются более длинными. Наглядности программы способству- ет также введение промежуточных переменных. Переносимой является программа, которая без изменений мо- жет работать на другой вычислительной машине. Для обеспече- ния переносимости программы нужно придерживаться стандарт- ных правил языка программирования и не использовать спе- циальных эффектов конкретной ЭВМ.
44 4. Логическая схема программы Защищенность означает, что программа и данные должны быть недоступны для использования лицами, не имеющими на это права. В случае необходимости учитывают соответствующее законодательство о защите данных. Средства, обеспечивающие защищенность программы, содержатся в операционной системе. Программа является эффективной, если ресурсы ЭВМ, не- обходимые для ее выполнения, невелики. Наиболее важными ре- сурсами являются емкость оперативной памяти и время счета *. Часто оказывается невозможным одновременное соблюдение тре- бований минимизации обеих этих величин. У настольных вы- числительных машин узким местом является емкость оператив- ной памяти. При использовании больших вычислительных машин чаще всего оплачивается израсходованное время счета. Указа- ния о способах экономии ресурсов ЭВМ приведены в разд. 4.3. Рентабельность означает, что польза от программы нахо- дится в оправданном отношении к ее стоимости. Например, программа, предназначенная только для решения квадратных уравнений на большой вычислительной машине, была бы нерен- табельной. 4,2.3. Ошибки. Ручное тестирование программы Некоторые ошибки не зависят от конкретного языка програм- мирования и могут быть определены уже по логической схеме, другие можно выявить при компиляции, выполнении и тести- ровании программы. Рассмотрим типичные ошибки в програм- мах. Ошибки в написание формул на языке программирования, вызванные нарушением правил этого языка, обычно выявляются при компиляции. Однако часть таких ошибок может быть не оп- ределена вычислительной машиной. К ним относятся ошибки в написании знаков чисел, неверное задание значений констант (например, перепутывание двух соседних цифр), недостающая пара скобок в выражении и т. п. Ошибки инициализации заключаются в том, что программист забыл зарезервировать память для переменной или массива, не присвоил переменной ее начального значения. Ошибки в циклах могут быть различными. Например, про- граммист может не учесть, что после полного прохождения счет- ного цикла его переменный параметр имеет значение, отличное от значения во время последнего прохождения цикла. В итера- тивных циклах может произойти бесконечное зацикливание или * Говорят также о счетном времени, машинном времени, времени цент- рального процессора.— Прим. ред.
4.2. Методика работы 45 ошибочный выход. Последний возникает, например, при требо- вании на обеспечение точности вычислений е<10~6 (при исполь- зовании переменных длиной 4 байта в машинах фирмы IBM и ЕС ЭВМ.—Ред.) или при отрицательном значении задаваемой точ- ности 8. Ясно, что цикл должен закончиться при 8^0, однако он прервется сразу, если задано 8=—5. Эта ошибка возникает тогда, когда забы- вают взять абсолютную величину от 8 (см. пример 10 на стр. 56). Выхода из цикла не будет вовсе, если переменная сравнивается с нулем, который вследствие ошибок округления не может быть достигнут. В этом случае операционная система прекратит выполнение программы после исчер- пания определенного, наперед заданного вре- менного интервала. Вопросы тестирования про- грамм рассмотрены в гл. 9. Ручное тестирование программы производит- ся для контроля логической схемы. При этом шаг за шагом подробно прорабатывается схема вы- числений на простых контрольных величинах. Особое внимание обращают на проверку пра- вильности разветвлений и выходов из циклов. Для контроля циклического участка можно со- ставить таблицу, в которую заносятся все зна- чения переменных при каждом прохождении цик- ла. Особая необходимость в таком контроле воз- никает в том случае, если выполнение последу- ющего цикла зависит от результатов, получен- ская схема прог- раммы для пояс- нения ручного те- стирования. ных в процессе выполнения предыдущего цикла. Методы, рассматриваемые в этой главе, утомительны только в начале работы. Таким способом можно очень быстро приобрес- ти опыт программирования и поиска ошибок, а также хорошо понять принцип действия вычислительной машины. В конечном счете ручное тестирование экономит рабочее время, так как после его проведения получается частично отлаженная программа. Следует всегда помнить, что тестировать программу по логиче- ской схеме значительно проще, чем без схемы. Пример 3. Ручное тестирование программы по логической схеме. С помощью таблицы и схемы, приведенной на рис. 13, вы- ясним, какие значения примет переменная Z и какие значения этой переменной отпечатаются на бумаге. В этом примере речь идет о математическом расчете одной очень простой функции двух независимых переменных X и Y. Для последовательности, в которой рассчитываются значения переменной Z, решающим является то, что вначале выполняется внутренний цикл, а затем
46 4. Логическая схема программы внешний (см. стр. 40). Следовательно, в процессе вычислений построчно получаются значения элементов следующей таблицы: 10 15 1-е прохождение внутреннего цикла 3 8 13 18 2-е прохождение внутреннего цикла 6 11 16 21 3-е прохождение внутреннего цикла 9 14 19 24 Согласно правилу, приведенному на стр. 36, каждое значе- ние переменной Z отпечатается в отдельной строке. Чтобы резуль- таты были расположены на бумаге в виде вышеприведенной таб- лицы, необходимо использовать переменную с индексом (см. разд. 6.1.). 4.3. Примеры Для каждого примера в этом разделе приведена логическая схема и ссылка на более поздний пример, в котором содержится соответствующая программа на Фортране. Примеры расположе- ны в порядке возрастания степени трудности. Прежде всего об- судим общие вопросы. Конец набора данных. Достоинство программы состоит в том, что она может быть написана как для любых значений величин, так и для любого количества исходных данных. Проблема конца набора данных возникает тогда, когда число вводимых данных может быть произвольным. Ниже обсуждаются наиболее рас- пространенные случаи определения конца набора данных. 1. Количество входных данных однозначно определено зада- чей. Например, ими могут являться три коэффициента квадрат- ного уравнения. Решение: оператор ввода содержит имена всех данных (трех коэффициентов). 2. Количество входных данных на каждом этапе выполнения программы различно, однако численные значения его известны. Примеры: п+1 коэффициент уравнения п-й степени; количество строк и столбцов матрицы размером mXn. Решение: определе- ние числа вводимых данных осуществляется счетным циклом (см. пример 31 на стр. 113). 3. Количество вводимых данных любое. Примеры: образова- ние суммы при любом числе слагаемых; нахождение корней лю- бого количества квадратных уравнений. Решение: в программе должен производиться опрос на конец набора данных. Признак
4.3. Примеры 47 окончания набора данных может выражаться различными спо- собами: 3.1. Конец набора данных указывается посредством нестан- дартизированной последовательности символов, называемой записью EOF (end of file record). В той вычислительной машине, на которую ориентировано изложение материала в данной книге, запись EOF формируется путем двукратного нажатия на клави- шу ENTER. При вводе с перфокарт этой записи часто соответст- вует последовательность символов /*. В языке Фортран опрос на конец набора данных может производиться оператором чте- ния. См. пример 6 на стр. 49. 3.2. В качестве конца набора данных задают нереальное чис- ловое значение, например 1010 или 99 999. Так можно поступать только тогда, когда для задачи существуют недопустимые зна- чения исходных величин. В ряде задач ими могут являться, например, отрицательные значения физических величин. Для программы решения квадратных уравнений признаком конца набора данных может служить равенство нулю всех коэффициен- тов уравнения. В этом случае опрос на конец набора данных приведет к выходу по наличию ошибки во вводимых значениях (см. пример 9 на стр. 55). Эти методы рекомендуется использо- вать в том случае, если в программе с одного и того же устройст- ва необходимо считывать несколько наборов исходных данных. Подробнее об этом см. на стр. 87. Пример 4. Упорядочение трех чисел. (Программу на Фортра- не см. в примере 21 на стр. 101.) В ячейках памяти с символи- ческими адресами А, В, и С записаны три числа. Их необходимо упорядочить так, чтобы по окончании работы программы в ячей- ке с символическим адресом А находилось самое маленькое чис- ло, в ячейке с адресом В — среднее, а в ячейке с адресом С — наибольшее. С помощью этого примера еще раз поясняется, что А, В и С — символические адреса чисел, а не сами числа. В даль- нейшем для краткости изложения подчеркивать это больше не будем. Основная идея, отраженная на рис. 14, состоит в том, что вначале сравниваются значения переменных А и В, затем А и С и, наконец, В и С. Если два числа расположены правильно, т. е. удовлетворяют поставленному условию, то проводится сле- дующее сравнение. В противном случае перед следующим срав- нением числа меняются местами. Обмен местами производится специальной подпрограммой. Для лучшего понимания повторим, что старое содержимое ячейки автоматически стирается перед записью в нее нового значения. Для обмена необходима вспомо- гательная ячейка с именем Н. С точки зрения структурного программирования логическая схема данной программы состоит из последовательности пят*й
48 4. Логическая схема программы блоков: блока ввода, трех блоков обмена и блока вывода. Если необходимо упорядочить четыре числа, то необходимо уже шесть перестановок. В общем случае при п числах необходимо (п_1г) перестановок. Поэтому алгоритм, который рассматривается в этом Рис. 14. Логическая схема программы упорядочения трех чисел. примере, не может решить общую задачу упорядочения. Так как сортировкой часто пользуются (например, в статистике), то на стр. 117 приведен пример 33, в котором содержится общая про- грамма упорядочения. Пример 5. Таблица функций. (Программу на Фортране см. в примере 22 на стр. 101.) Пусть нужно рассчитать и отпечатать значения функций У1=х2 и у2==х3 при значениях аргумента х, изменяющегося от 1.0 до 2.0 с шагом 0.1 (короче: для 1.0<х< <2.0; Дх=0.1).
4.3. Примеры 49 В этом примере характерным является то, что расчет значе- ний функций занимает большую часть рабочего времени. Про- грамму решения задачи можно описать небольшим количеством операторов. Здесь необходимо обратить внимание на те обстоя- тельства, которые при непрограммируемых вычислениях явля- ются само собой разумеющимися, например на организацию окончания работы программы. При использовании метода центрального оператора, описан- ного на стр. 42, выделяют основные операторы и составление программы начинают с их записи. В данном примере основными являются операторы расчета значений функций. Следует обратить внимание на то, что значение у2 можно рассчитать, используя значение уь Та- кая взаимосвязь часто существует в сложных вы- ражениях. После выполнения расчетов печата- ются три числа: значение аргумента и значения двух функций. Основная идея состоит в том, что для расчета и печати следующей тройки чи- сел не записывают еще раз аналогичные опера- торы, а организуют многократное повторение уже записанных операторов посредством опера- тора цикла (см. рис. 15). Изучение правил языка программирования следует начинать только после того, как чита- тель научится на этапе анализа задачи без тру- да определять такого рода структуры будущей программы. Пример 7 на стр. 50 и пример 32 на стр. 115 иллюстрируют расчет других таблиц. Пример 6. Сумма произведений. (Программу на Фортране см. в примере 23 на стр. 103.) В за- дачах вычислительной математики часто возни- кает необходимость образования суммы произ- ведений /Печать заголовка I Цикл Х = 1, 2, 0.1 Рис. 15. Логиче- ская схема про- граммы расчета таблицы. п s = а^ -J- a2b2+a3b3 + • • • + anbn = 2 i = 1 при произвольном количестве числовых пар а^ и Ьь Необходимо подсчитать сумму и количество слагаемых, а также отпечатать рассчитанные значения. В отличие от предыдущего примера используем метод «сверху вниз». В простейшем случае он со- стоит в обдумывании процесса вычислений от начала одного шага до начала следующего шага. В простых задачах таким шагом является оператор, в более сложных — блок. Прежде всего необходимо напечатать заголовок. Обозначим для краткости опе- ранды буквами А и В. Под этими буквами должны быть напеча- таны числа, которые будут введены позже. Нужно не забыть ини-
50 4. Логическая схема программы циализировать переменные. При составлении больших программ зачастую трудно учесть с самого начала все используемые вели- чины. В данной программе их немного. Следует приравнять Рис. 16. Логическая схема про- граммы расчета суммы произве- дений. нулю содержимое ячеек памяти, пред- назначенных для подсчета текущего значения суммы SUM и количества N введенных пар чисел. Далее дол- жна быть введена первая пара чисел. Таким образом, инициализируются переменные А и В. Уже к этому мо- менту необходимо ответить на вопрос: нужно ли записывать все вводимые числа в 2п различных ячейках памя- ти? Из постановки задачи следует, что этого делать не нужно. Доста- точно двух ячеек А и В для хране- ния очередной пары. В противном случае мы вынуждены были бы рабо- тать с так называемыми индексиро- ванными переменными, которые рас- сматриваются в гл. 6. Сразу после ввода следует произ- вести опрос на конец набора данных. Если он достигнут, то необходимо отпечатать сумму и количество сла- гаемых. Эти операторы могут быть на- писаны уже сейчас, хотя результирующие значения SUM и N еще не вычислялись. Далее следует выйти на конец программы. Теперь рассмотрим другую ветвь, образующуюся после проверки усло- вия окончания набора данных. Каждая введенная пара чисел должна быть отпечатана для контроля. Только теперь мы дошли до центрального оператора SUM=SUM+A*B. Он прибавляет очередное слагаемое к предыдущему содержимому той ячейки памяти, в которой находится текущая сумма. Необходимо еще увеличить на единицу показание счетчика. Теперь можно вер- нуться к вводу следующей пары чисел. Разработанная логичес- кая схема программы изображена на рис. 16. Речь идет о струк- туре цикла, которая в самом общем виде приведена на рис. 9 (стр. 39). Пример 7. Таблица гиперболических функций. (Программу на Фортране см. в примере 24 на стр. 104.) Следует рассчитать и напечатать таблицу гиперболических функций shx, chx и th х для значений аргумента, лежащих в пределах 0^х^5,0 с шагом Ах=0.01. В Фортране есть гиперболические функции. В этом примере
4.3. Примеры 51 важным является анализ выходных данных и соответствующих операторов Фортрана. Не всегда просто в таких задачах опреде- лить входные данные: начальное и конечное значения, величину шага. В частности, таблица не всегда рассчитывается с постоян- ным шагом. Иногда, например, разрешается применять линей- ную интерполяцию. В этом случае шаг аргумента может быть неравномерным. Для организации вывода необходимо устано- вить, сколько чисел можно печатать на одной странице и как выдаваемой странице придать большую наглядность. Лучше всего изготовить ее эскиз на пишущей машинке. Ниже показаны начало и конец первой страницы. X SINH(X) COSH(X) TANH(X) X 0.00 0.0000 1.0000 0.000000 0.00 0.01 0.0100 1.0000 0.010000 0.01 0.02 0.0200 1.0002 0.019997 0.02 0.03 о.озоо 1.0005 0.029991 0.03 0.04 0.0400 1.0008 0.039979 0.04 0.05 0.0500 1.0013 0.049958 0.05 0.06 0.0600 1.0018 0.059928 0.06 0.07 0.0701 1.0025 0.069886 0.07 0.08 0.0801 1.0032 0.079830 0.08 0.09 0.0901 1.0041 0.089758 0.09 0.10 0.1002 1.0050 0.099668 0.10 0.11 0.1102 1.0061 0.109558 n ' 0.12 0.1203 1.0072 0.1194?"’ 0.13 0.1304 1.0085 0 ' 0.14 0.1405 1.009Я 0.15 0.1506 1 / 0.39 0.16 0.1607 0.17 0 0.379949 0.40 0.18 ..и852 0.388472 0.41 г 1.0895 0.396930 0.42 .-.434 1.0939 0.405321 0.43 0.4543 1.0984 0.413644 0.44 ^.45 0.4653 1.1030 0.421899 0.45 0.46 0.4764 1.1077 0.430084 0.46 0.47 0.4875 1.1125 0.438199 0.47 0.48 0.4986 1.1174 0.446243 0.48 0.49 0.5098 1.1225 0.454216 0.49 X SINH(X) COSH(X) TANH(X) X Из приведенного эскиза следует, что таблица должна печа- таться блоками по 10 строк. Между блоками должна формиро- ваться строка пробелов. В начале и в конце каждой страницы следует напечатать заглавную и конечную строки. Всего нужно вывести 10 страниц. Первый вариант логической схемы не должен быть слишком подробным. Основное внимание нужно обратить на общую струк- туру программы. Используя метод центрального оператора,
52 4. Логическая схема программы вначале изобразим блок расчета значений и блок печати строки. Затем нужно указать блок увеличения значения ар- гумента X. Попытка увеличивать значение переменной X с по- мощью оператора цикла Х=0, 5, 0.01 приведет к трудностям с другими циклами. Поэтому увеличение зна- чения X следует производить с по- мощью оператора присваивания. Са- мый внутренний цикл формирует блок. Если эта структура понятна, то со- ответствующую часть логической схе- мы дорисовать довольно просто (см. рис. 17). Пример 8. Нахождение нуля фун- кции. (Программу на Фортране см. в примере 25 на стр. 104.) Следует най- ти нуль функции у=х2+ех—2, т. е. то значение аргумента х, при котором значение этой функции равно нулю. Ниже следует решение задачи со ссы- лками на этапы, рассмотренные в разд. 3.2. Первый этап не рассматриваем, так как в данном случае речь идет о мате- матической задаче. Второй этап. Имеется несколько методов определения нуля функции. Выбранный метод последовательного деления отрезка пополам имеет то преимущество, что он очень прост. Правда, этот метод для некоторых функций медленно сходится. Если значения функции уг иу2 на границах интервала [хь х2] имеют разные зна- ки и функция в этом интервале не- прерывна, то она содержит здесь по крайней мере один нуль (см. рис. 18). Рассчитывается значение функции у для средней абсциссы х= (xi+x2)/2. В зависимости от его знака нуль функции расположен в левой или правой частях интервала. Далее выбирается та часть интер- вала, на границах которой функция имеет разные знаки. Этот укороченный вдвое интервал снова делится пополам. Описан- ные действия повторяются до тех пор, пока абсолютное значение ординаты не станет меньше наперед заданного значения, которое здесь принято равным 10"в. (начало^ Цикл программы 1=1, 10 Продвижение страницы и печать заголовка 1 Цикл страницы J = 1, 5 Цикл блока К=1, 10 | Расчет ^строки [ j Печать строки / I Увеличение значения X I Конец цикла блока ! Пропуск строки ! Конец цикла страницы Пропуск и печать заключительной строки Коней, цикла программы Рис. 17. Логическая схема про- граммы расчета гиперболиче- ских функций.
4.3. Примеры 53 Третий этап. Для этого простого примера достаточно рас- чета небольшой таблицы, состоящей из двух значений: напри- мер, у=—1 при х=0 и у=1.7183 прих=1. График заданной функции аналогичен левой части рис. 18. Рис. 18. Случаи расположения нуля. Четвертый этап. Решим вопрос о том, какие исходные дан- ные должна получить программа. Могут вводиться границы на- чального интервала. Однако целесообразнее определять эти границы внутри программы. Они могут быть найдены при обра- щении к подпрограмме. Эта возможность поясняется примером 50, приведенным на стр. 148. Значения функции на границах интервала также могут выступать в качестве вводимых данных. (Или рассчитываться внутри подпрограммы.— Перев.) В рас- сматриваемом примере эти значения указаны в самой программе в качестве начальных значений. В более широком смысле в ка- честве входного данного следует рассматривать аналитическое выражение самой анализируемой функции. В примере 50, при- веденном на стр. 148, уравнение оформлено в виде подпрограммы. Поэтому в такой постановке задача может быть решена для лю- бой функции. Из сказанного следует, что в зависимости от фор- мулировки задачи и выбранного способа ее решения в качестве входных данных могут выступать различные объекты. Единст- венным результирующим данным в рассматриваемом примере является значение аргумента функции, при котором она дости- гает нуля. Пятый этап. Логическую схему программы построим мето- дом «сверху вниз». Прежде всего нарисуем последовательность трех блоков: присваивание начальных значений, поиск нуля и печать найденного значения. Это соответствует трем следующим наиболее употребительным фазам функционирования програм- мы: ввод, обработка, вывод. В общем случае необходимо раскры- вать каждый блок. Однако в этом простом примере требуется раскрытие только среднего блока (см. рис. 19). В блоке «выбор нового интервала» было бы неправильно записывать условие у<0, так как в случае убывающей функции это привело бы к
64 4. Логическая схема программы ошибке. В примере, приведенном на рис. 18, значение функции увеличивается при увеличении аргумента, т. е. функция моно- тонно возрастает. Здесь не приводится доказательств того, что Рис. 19. Структурное программирование. операторы, записанные в обеих ветвях блока «выбор нового ин- тервала», обеспечивают правильное решение и при монотонно убывающей функции. На рис. 20 приведена полная логическая схема программы. Следует обратить внимание на то, что в ней отсутствует опера- тор у2=..., а также на то, что установленное перед началом цикла значение yi в дальнейшем не меняется, так как в програм- ме анализируется лишь знак уь а не само значение. Шестой этап. Текст программы приведен в примере 25 на стр. 104. Седьмой этап. Тестирование программы происходит посред- ством сравнения полученных результатов с рассчитанной зара- нее таблицей значений. Восьмой этап. Логическая схема программы приведена на рис. 20, описание работы программы можно составить на осно- вании вышеприведенного материала.
4.3. Примеры 55 Девятый этап. Пользователю нужно указать, что эта про- грамма не предусматривает ввода данных и что она рассчитыва- ет нуль только функции у=х2+ех—2. Рис. 20. Логическая схема программы решения трансцендентного уравнения. Пример 9. Решение квадратного уравнения. (Программу на Фортране см. в примере 26 на стр. 104.) Общая форма уравнения имеет вид ах2+Ьх+с=0. Корни уравнения рассчитываются по формуле xlt 2 = ( — b ± КЬ2 — 4ас)/(2а). Ввод: Любое количество записей данных а, Ь, с. Запись, со- держащая а=Ь=с^0, означает конец вычислений. Вывод: после каждого ввода необходимо напечатать введенные значения и результат решения уравнения. На этом примере показываются возможности Фортрана по применению логических операций и возможности использова- ния комплексных чисел. Комплексное число z=a+jb представ- ляется на Фортране парой чисел (а, Ь). На Фортране можно записывать все арифметические операции с комплексными числа- ми. Ниже приведен перечень всех возможных сочетаний нулевых значений коэффициентов а, b и с. Цифрой 0 в таблице обозна- чено равенство нулю соответствующего коэффициента, а циф- рой 1 — ненулевое значение коэффициента. Справа указана ветвь программы, по которой развивается вычислительный про- цесс.
56 4. Логическая схема программы а b с Ветвь программы О Конец программы О 0 1 Противоречие О О 1 О 1 1 Линейное решение 1 О О 1 0 1 1 1 О 1 1 1 Расчет по вышеприведенной формуле Из этой таблицы вытекает лишь часть логической схемы, при- веденной на рис. 21. Для удобства программирования расчет- ную формулу предлагается преобразовать к следующему виду: _—Ь -|/~Ь2—4ас Х1’2—'2Г± V 4а2 • Оба слагаемых этого выражения рассчитываются в программе отдельно и могут быть использованы как при вещественном, так и при комплексном решении. Это является примером исполь- зования принципа поиска одинаковых выражений в различных ветвях и вынесения таких вычислений в неразветвленную часть программы с целью экономии памяти. Пример 10. Численное дифференцирование. (Программу на Фортране см. в примере 27 на стр. 106.) Первая производная непрерывной дифференцируемой функции f(x) в точке хх вы- числяется следующим образом:
4.3. Примеры 57 Рис. 21. Логическая схема программы решения квадратного уравнения. Численно определяется последовательность разностных от- ношений Ду/Ах, в которой каждое значение Дх/2 образуется путем деления текущего приращения аргумента Ах пополам. Ду В результате образуется последовательность —>0. Последо- вательность разностных отношений, образованная по вышепри- веденной формуле, сходится быстрее, чем аналогичная последо- вательность, сформированная в точках хх и хх+Ах при Ах->0. В логической схеме записью Дх/2 обозначен символический адрес ячейки памяти. Каждое разностное отношение вычисляется по одной и той же формуле. Изменяется лишь значение Ах/2. По-
58 4. Логическая схема программы этому целесообразно производить расчет в цикле. Программо- технической проблемой данного метода является правильный вход в цикл и выход из него, т. е. верная организация начала и конца последовательности вычислений. Основная идея решения состоит в том, что два соседних значения последовательности Устар и У нов сравниваются друг с другом. Если они совпадают в пределах наперед заданного количества значащих цифр, то считается, что решение найдено. При этом образуется контроль- ная величина: g — Унов — Устар Унов Абсолютное значение здесь необходимо, так как иначе цикл может закончиться раньше, чем это нужно. Например, выход из цикла может произойти в том случае, если в результате вы- числений получится 8 =—5, хо- тя очевидно, что он должен про- исходить при 8^0. Нормиро- вать на величину у„Ов необходи- мо, так как любая вычислитель- ная машина работает с ограни- ченным количеством разрядов в числе. В терминах теории оши- бок величина 8 представляет со- бой модуль относительной раз- ности двух последовательных приближенных значений. Нови- чок после расчета величины 8, вероятно, сразу произведет про- верку условия и только после этого запишет операторы у стар = Унов и Дх/2=0.5#Дх/2. В ре- зультате будет образован цикл общего вида, который изображен на рис. 9 стр. 39. Такого цикла в Фортране следует избегать. На рис. 22 изображена логиче- ская схема, содержащая итера- тивный цикл. Для вычисления первой производной по этой схе- Рис. 22. Логическая схема програм- ме нужно задать начальные зна- мы численного дифференцирования. чения величин Дх/2 И Устар ДО входа в цикл. Указанные на схе- ме начальные значения выбраны произвольно. Пример 11. Моменты профилей. (Программу на Фортране см. в примере 28 на стр. 107.) В курсе сопротивления материа-
4.3. Примеры 59 лов имеются следующие формулы расчета величины момента I для различных профилей: Профиль 1-го вида: 1= (ВН3)/12. Профиль 2-го вида: 1=(ВН3—bh3)/12. Профиль 3-го вида: 1= (BH3+bh3)/12. Профиль 4-го вида: 1= (BeJ—bh3+ae*2)/3, где e1=(aH2+bd2)/(2 (aH + bd)), е2-Н—et. Программа должна вводить данные измерений В, b, Н, h, a, d для очередного профиля, выбирать расчетную формулу по вводимому указателю вида профиля К, вычислять момент I по выбранной формуле и пе- чатать рассчитанное значение I вместе с введенными исход- ными данными. Количество обрабатываемых профилей не ограничено. Как показано на схеме, приведенной на рис. 23, фор- мула расчета может быть вы- брана по указателю профиля К при помощи переключате- ля. Операторы, рассчитываю- щие основные выражения ВН3/12 и bh3/l2, целесообраз- но поместить перед переклю- чателем. Это приводит к эко- номии памяти. Полученные значения используются в вет- вях 2 и 3 для дальнейшего расчета, а в ветви 1 предва- рительно рассчитанное значе- ние сохраняется в качестве окончательного результата. Рис. 23. Логическая схема программы расчета моментов профилей. Пример 12. Объединение двух наборов данных. (Про- грамму на Фортране см. в примере 55 на стр. 165.) Эта задача является основной при обработке коммерческой информации. Для инженера она та- кже имеет определенное значение. На магнитной ленте № 1 находится так называемый основной набор данных. Содержа- щаяся в нем информация не меняется в течение длительного времени. Такими данными могут быть, например, имена и адреса клиентов. Данные о каждом клиенте расположены в ос-
60 4. Логическая схема программы С Начало) I |KSTA=0 | / Чтение обновляемой записи У да KSTA * KBEW /Печать обновляемой записи/ Конец данных обновляемого набора ’Коней, обновляемого набора данных’ /чтение основной записи/ да да KSTA< KBEW KSTA> KBEW Печать основной и обновляемой записей /’Основной набор / данных неполный/ да I > Конец основного набора данных г’Основной набор данных неполный или ошибки в упорядочении’ Рис. 24. Логическая схема программы объединения двух наборов данных. новной записи, которая начинается номером клиента KSTA. На магнитной ленте № 2 расположен обновляемый (рабочий) набор данных. Он содержит информацию, которая изменяется при каждой обработке. Такой информацией могут быть, напри- мер, сведения о заказах клиентов. Каждый заказ записывается в обновляемую (рабочую) запись, начинающуюся номером клиен- та KBEW. Обновляемый набор данных может содержать любое число записей о каждом клиенте. Однако записи о некото- рых клиентах в обновляемом наборе отсутствуют, если от этих
4.4. Задачи 61 клиентов не поступали заказы. Оба набора данных упорядочены по номерам клиентов. Объединение этих наборов данных необходимо, например, при выписывании счета. По первой прочитанной обновляемой записи клиента необходимо прежде всего разыскать и прочитать основную запись данного клиента и напечатать ее. После чего нужно напечатать прочитанную обновляемую запись. Далее сле- дует напечатать все остальные обновляемые записи данного кли- ента. После смены номера клиента проделанные операции нуж- но повторить. Наиболее трудным моментом при составлении программы является проблема так называемого чередования групп записей. Заранее неизвестно, сколько обновляемых записей приходится на каждого клиента. Кроме того, очередная основная запись может печататься только после того, как будет прочитана первая обновляемая запись следующего клиента. Однако основная за- пись должна печататься перед обновляемой записью. На рис. 24 приведена логическая схема программы. В верх- нем цикле читаются обновляемые записи. Однако печатаются они только в том случае, если ранее была напечатана соответствую- щая основная запись. В среднем цикле читаются основные за- писи. Если выполняется условие KSTA = KBEW, то это означа- ет начало новой группы записей о клиенте и необходимость пе- чати основной и первой из обновляемых записей, а также необ- ходимость перехода к чтению следующей обновляемой записи. Приведенная схема не соответствует строгим правилам струк- турного программирования. Для того чтобы она им соответство- вала, необходимо ввести специальный блок, включив в него часть условий. Поскольку эта схема небольшая и легко реали- зуется операторами Фортрана, мы этого делать не будем. 4.4. Задачи 11. Наибольший общий делитель. Требуется найти наиболь- ший общий делитель GGT двух натуральных чисел М и N и на- печатать значения М, N и GGT. Расчет наибольшего общего делителя можно произвести по следующим правилам: 1. Если N<M, то значения переменных N и М следует поме- нять друг с другом. 2. Если М=0, то значение GGT равно N, поэтому следует напечатать М, N, GGT и закончить вычисления. 3. Если М=/=0, то следует вычислить R=N mod М, перемен- ной N присвоить значение переменной М, а переменной М при- своить значение переменной R и перейти к выполнению действий, начиная с пункта 1.
62 4. Логическая схема программы Указание: Величина R является остатком от деления N/M. Для вычисления N mod М в Фортране существует стандартная функция. 12. Биномиальный коэффициент Следует рассчитать би- номиальный коэффициент BINO по введенным натуральным чис- лам N и К (l^KXN). Затем необходимо напечатать N, К и BINO. О какой структуре цикла идет речь? Указание: Необходимо использовать следующую рекуррент- ную формулу: / п \ ( n \ n — i + 1 \ i / ~~\i— 1 у * i Необходимо учесть, что при i=0 значение ^^ = 1. Это на- чальное значение нужно задавать в программе. Рекуррентной формулой следует пользоваться, начиная с i=2. 13. Пересчет из прямоугольной системы координат х, у в полярную систему координат ср, г. По введенной паре чисел х, у нужно рассчитать полярные координаты по следующим форму- лам: Ф = arctg (у/х); г = |/"х2 4- у2. Затем следует напечатать значения х, у, ф и г и ввести сле- дующую пару чисел. Обработка должна закончиться, если вве- дена пара х-=у=0. Указание: При вычислении ф необходимо учитывать, что задаваемое значение х может быть равно нулю и что угол ф может находиться в различных квадрантах. В качестве значения рассчитываемой функции должно выдаваться главное значение арктангенса,, т. е. угол ф, лежащий в пределах —л/2<ф<;л;/2. 14. Кусочно-непрерывная функция определена приведенной диаграммой. Нужно обеспечить возможность произвольного задания зна- чений параметров а, b и с. Программа должна для любого коли- чества значений х вычислять соответствующие значения у и печатать пары значений Xi и уР Признаком окончания обработки должно служить задание х=0. Указание: Рассматриваемая функция является периоди-
4.4. Задачи 63 ческой. Прежде всего необходимо привести введенное значение х к соответствующему значению первого периода. 15. Экстремальные значения функции. Пусть функция у определена на интервале [а, Ь] и все ее значения удовлетворяют условию |у1|<1010. Пусть в интервале [а, Ы имеются только одно наибольшее и только одно наименьшее значения функции. Не- обходимо ввести в ЭВМ значения переменных а и Ь, а также зна- чение шага Ах анализа функции. Далее требуется вычислить посредством оператора y=f(x) все значения функции, располо- женные на заданном интервале с шагом Ах, найти наибольшее и наименьшее значения и напечатать их вместе с соответствующи- ми значениями абсцисс: хп ух и х2, у2. 16. Нормальное распределение и интегральная функция. Не- обходимо рассчитать и напечатать таблицу значений этих широ- ко используемых в статистике функций в диапазоне значений аргумента О^х^З с шагом Ах=0.1. Расчет функции нормаль- ного распределения следует организовать по формуле оформив ее в виде оператора. Расчет интегральной функции сле- дует производить в соответствии с формулой ее разложения в ряд р 100 Г х® х5 х7 | f2(x)= 100 J {i(u) du = 'j7^[X—3^2‘^5.22-2!—7.28.3l 0 r Множитель 100 обеспечивает получение численных значений интегрального закона в процентах. Члены ряда следует рассчи- тывать по рекуррентной формуле — х2 (2i—l) ai —ai-i- 2i(2i+l) ’ где а0=х при i=0. Суммирование членов ряда при каждом зна- чении х должно заканчиваться по выполнению условия |aj< <10"в. 5. ЭЛЕМЕНТЫ ФОРТРАНА Первая версия языка Фортран II (FORmula TRANslation) появилась в 1956 году. В последующие годы использовался пре- имущественно Фортран IV. Эта книга основывается на амери- канском стандарте ANSI ХЗ.9-1978, Programming Language FORTRAN, который соответствует немецкому стандарту DIN 66 027, Programmiersprache FORTRAN. Рассматриваемая версия языка кратко называется Фортран 77. Различают два уровня языка: усеченный и полный. Они отличаются друг от друга
64 5. Элементы Фортрана меньше, чем базисный Фортран от Фортрана IV. Наиболее важ- ные преимущества Фортрана 77 состоят в несложном вводе и выводе данных, а также в лучшем согласовании операторов уп- равления с методами структурного программирования. Подго- товленный пользователь оценит также расширенные возможности обработки наборов данных и текстов. Здесь излагаются только основы этих возможностей. К сожалению, и в Фортране 77 все еще не стандартизирован важный для инженеров графический вывод. 5.1. Основные понятия Следует различать два вида правил: 1. Синтаксические правила (синтаксис) относятся к формаль- ной структуре языка. В естественных языках этому типу правил соответствуют, например, правописание и грамматика. 2. Семантические правила (семантика) относятся к содержа- нию и значениям понятий. Изучая иностранный язык, пользу- ются «Учением об отдельных словах», которое является началом семантики. При определении ряда понятий семантика Фортрана учитывалась, начиная с гл. 4 данной книги. Поэтому в центре внимания последующего изложения прежде всего находится синтаксис языка. Когда читаешь программу на Фортране, син- таксис представляется довольно очевидным. Однако, чтобы на- писать программу, которая должна выполняться вычислитель- ной машиной, необходимо точное знание и применение этих правил. Даже отсутствие точки или замена ее на запятую при- водят к прекращению трансляции данного оператора. В этой книге используются следующие правила и понятия'. 1. Несколько связанных друг с другом символов называют строкой символов. 2. Строки символов, состоящие из строчных букв, означают понятия, которые используются для объяснения языка Фортран (так назы- ваемые мета язычные понятия). Они могут быть общепринятыми или специально определенными. Пример: цифра (общепринято), имя (определяется на стр. 65). 3. Строки символов, которые состоят из прописных букв и специ- альных символов, являются частью языка Фортран. Пример: READ*, А, В, С COS (X). 4. Правила 2 и 3 можно комбинировать. Пример: READ*, список переменных COS (выражение). 5. Несколько точек означают пропуск или повторение. Пример: А В С . . .Y Z переменная, переменная, . . . 6. Строки символов, заключенные в квадратные скобки, могут быть опущены (включая скобки). Следовательно, квадратные скобки не являются символами Фортрана. Опуская содержимое скобок, по- лучают другое значение. Пример: PRINT* [, список переменных]. 7. Буквы пь п2 . . . означают метки операторов.
5.1. Основные понятия 65 При записи программ на языке FORTRAN 77 используются следующие символы'. 26 заглавных латинских букв А ВС ... XYZ 10 цифр 0 1 2 ... 7 8 9 13 специальных символов — . , = + — ♦ /():'$ Первый специальный символ — означает пробел. Значения других специальных символов поясняются в соответствующих местах книги. Из этих символов составляются более сложные элементы языка, в частности операторы, рассматриваемые в разд. 5.4. Сейчас рассмотрим наиболее употребительные поня- тия. Имя состоит максимум из шести букв и (или) цифр. Пер- вым символом должна быть буква. Имена служат для обоз- начения переменных, программ и наборов данных. Имя может употребляться внутри программы только в одном значении. Подробности об области действия имен рассмотрены в разд. 7.1. Под переменными пока будем понимать простые пере- менные. Однако все изложенные правила относятся также к пе- ременным с индексами, рассмотренным в разд. 6.1. Как уже объяснялось в разд. 4.1, имя означает символический адрес ячей- ки памяти. Имя выбирается так, чтобы оно указывало на смысл обозначаемого им объекта. Кроме имен, устанавливаемых про- граммистом, имеются строки символов с определенным значе- нием (чаще всего это части операторов). Они называются ключе- выми словами. Нежелательно использовать ключевые слова в качестве имен (хотя стандарт это допускает). Пример: правильные имена: А1 Х’МАХ VEKTOR GAUSS неправильные имена: LOESUNG 1.LOES А-1 А/1 ключевые слова: READ WRITE (7 букв) (первый символ — цифра) (оба имени содержат специаль- ные знаки) GOTO END Многие операторы Фортрана содержат списки. Список следует после ключевого слова. Он содержит любое число элементов списка (например, имен), разделенных запятыми. Некоторые списки нужно заключать в скобки, другие в скобки не заключаются. Эти правила приводятся в соответствующих местах книги. Пример: REAL КАРРА, NENNER, L FORMAT(F10.2, F10.5). Здесь в первом случае после ключевого слова REAL указан спи- сок, не заключенный в скобки; во втором случае после ключево- го слова FORMAT приведен список, заключенный в скобки. 3 № 2295
66 5. Элементы Фортрана 5.2. Типы данных. Константы. Переменные Данные, подлежащие обработке или получающиеся в резуль- тате вычислений, подразделяются на 6 различных типов: INTEGER REAL DOUBLE PRECISION COMPLEX LOGICAL CHARACTER (целый) (вещественный) (с двойной точностью) (комплексный) (логический) (текстовый) В зависимости от вида .представления данные подразделяются на константы и переменные. Определение. Константа представляется или теми символа- ми, из которых она состоит (наиболее частый случай), или именем, которому только один раз в начале программы присваивается значение посредством оператора PARA- METER (см. п. 5.6.1). Переменная представляется именем. В программу входят переменные и константы. Входные и выходные данные являются всегда константами, представляе- мыми своим написанием. 5.2.1, Константы В этом пункте рассматриваются константы, представляемые своим написанием. Константы, представляемые своими именами, рассматриваются в пункте «Переменные» (п. 5.2.2). Арифметические константы Арифметическая константа имеет один из следующих типов: INTEGER, REAL, DOUBLE PRECISION, COMPLEX. Допустимая область значений и количество значащих цифр (точ- ность) не стандартизированы *. Для некоторых типов констант эти характеристики указаны ниже. Для всех типов арифмети- ческих констант существует следующее правило: | Знак положительного числа можно не записывать. Целые числа имеют тип INTEGER. Они представляются внут- ри машины в виде двоичных чисел (по четыре байта каждое). Результаты выполнения арифметических операций над целыми числами являются точными. Допустимая область значений це- * Эти характеристики зависят от типа используемой ЭВМ. Автор здесь и далее ориентируется на машины фирмы IBM. Характеристики этих машин ана- логичны характеристикам машин ЕС,— Прим, перев,
5.2. Типы данных, Константы. Переменные 67 лых чисел определяется неравенством |z|<231«2.1-109. | Целые константы не должны содержать десятичной точки. Пример: 1 —500 0 являются целыми константами. Типом REAL описываются вещественные (приближенные) числа. Они представляются и записываются в ЭВМ в виде г= =шВп. Основание В имеет чаще всего значение, равное 16; внутри машины оно не записывается. Значение ш называют мантиссой. Показатель степени п выбирается таким, чтобы выполнялось условие В-*<ш<В°. Следовательно, мантисса — это правильная дробь, первая цифра которой после запятой не является нулем. Кроме того, к пока- зателю степени добавляется число 64. Эта сумма называется характеристикой. Она всегда является положительным числом. Мантисса и характеристика записываются в двоичном виде в трех байтах и в одном байте соответственно. Допустимая об- ласть значений вещественных чисел определяется неравенст- вом *: |z|<1073. Количество десятичных значащих цифр мантиссы у веществен- ных чисел равно 6. При выполнении арифметических операций с этими числами возникают ошибки округления, которые могут быть значительными в больших программах (см. пример 22 на стр. 101). | Вещественные константы должны содержать десятичную точку. Пример: 1. 3.14159 —0.5 являются вещест- венными константами. Итак, существует принципиальная разница в записи целых и вещественных чисел. Например, единицу можно записать без точки (1) или с точкой (1.). Эти числа по-разному представляют- ся в машине и по-разному обрабатываются. Если вещественные числа очень большие или очень малень- кие, то выбирают экспоненциальную форму представления кон- стант: z=m *10п. Основание 10 обозначается буквой Е. Мантисса гп может иметь целый или вещественный тип, показатель степени п имеет целый тип (часто величина п должна удовлетворять следующему ус- ловию :|п|<75). Перед буквой Е должна стоять по крайней мере * Точнее 0.54• 10“78<|z|<0.724* 1076.— Прим, перев. 3*
68 5. Элементы Фортрана одна цифра. Величину показателя степени выбирают такой, что- бы непосредственно за десятичной точкой стояла отличная от нуля цифра, другими словами, числа представляются в норма- лизованном виде. При вводе числа положение его десятичной точ- ки может быть любым. Вывод чисел в экспоненциальной форме всегда производится в нормализованном виде. Пример: Запись на Фортране Обычная запись ненормализованный вид нормализованный вид —3,75-10« 0,00001 —3.75Е6 1Е —5 1.Е —5 —0.375Е7 0.1Е—4 Ошибочная запись второго числа: Е—5. (Мантиссу опускать нельзя.— Ред.) Вещественные числа можно также представить типом DOUB- LE PRECISION. Тогда мантисса числа записывается в семи бай- тах. Поэтому числа с двойной точностью представляются 15-ю зна- чащими десятичными цифрами. Область значений такая же, как у чисел, имеющих вещественный тип. Константы с двойной точностью можно писать только в экспоненциальной форме, причем вместо буквы Е нужно писать букву D. Типом COMPLEX описываются комплексные числа. Комплекс- ное число записывается в виде упорядоченной пары веществен- ных чисел. Первое число соответствует вещественной части, второе — мнимой. Допустимая область значений и количество значащих цифр каждой части комплексного числа аналогичны соответствующим характеристикам чисел типа REAL. Комплексные константы следует записывать в виде пары чисел, разделенных запятой и заключенных в круглые скобки. Числа могут иметь целый или вещественный тип. Пример: Обычная запись Запись на Фортране 3-|-4j 0,05—10-3j (3,4) (0.05, —1Е — 3)
5.2. Типы данных. Константы. Переменные 69 Неарифметические константы Типом LOGICAL описываются двоичные величины логики вы- сказываний (алгебры переключательных функций). Для пред- ставления логического значения внутри машины в принципе необходим только один бит. Однако в большинстве ЭВМ для ло- гического значения отводится 4 байта. Логические константы следует записывать в виде .TRUE, или .FALSE.. В вычислительных машинах могут быть ис- пользованы символы Тир. Вывод логических констант всегда производится в этом виде. Типом CHARACTER описывается текстовая информация. Символы в вычислительных машинах обычно представляются в коде EBCDIC (см. приложение); иногда используется код ASCII. В обоих кодах на каждый символ приходится один байт. Текстовые константы следует заключать в апострофы. Апостроф, входящий в состав константы, следует запи- сывать в виде двух апострофов. Пример: 'FUNKTIONSTAFEL' '1. 1. 1984" ("1")' яв- ляются текстовыми константами. В состав последней текстовой константы входят апострофы. Такая запись может встречаться в операторах ввода-вывода. Описание представления текстовых констант будет продол- жено в п. 5.6.2 и разд. 6.2. 5.2.2. Переменные Внутреннее представление и допустимая область значений переменных различных типов такие же, как у соответствующих констант. Для распознавания типов используется следующее правило. Тип переменных и констант, представляемых своими именами, следует устанавливать в начале программы посредст- вом операторов описания. Эта часть программы называется раз- делом описаний (см. также разд. 5.4 и 7.4). В соответствии с третьим правилом, приведенным ниже, раздел описаний во мно- гих случаях в программе на Фортране может отсутствовать (в отличие от других языков программирования). Имеется несколь- ко возможностей определения типа. Ниже приведены правила задания типов переменных. Правила расположены в порядке уменьшения их приоритета. 1, тип список имен переменных
70 5. Элементы Фортрана тип=INTEGER или REAL или DOUBLE PRECISION или COMPLEX или LOGICAL или CHARACTER (см. также пра- вило 4). Именам, внесенным в список, присваивается данный тип. Для каждого типа необходим свой оператор. 2. IMPLICIT тип (диапазон букв), тип (диапазон букв)... Значения, которые может принимать тип, приведены в пра- виле 1; Диапазон букв=первая буква [— последняя буква]. Все переменные, у которых первая буква имени находится внутри указанного диапазона (включая его границы), имеют указанный тип. Этот оператор должен быть первым оператором описания. Пример: IMPLICIT REAL (М—N), LOGICAL (L) INTEGER ANZAHL, I, К REAL A, B, KAPPA, XMIN, XMAX, X, Y 3. Типы INTEGER и REAL могут быть определены без приме- нения операторов описания с помощью так называемого неяв- ного задания типа. Неявное задание типа производится по сле- дующему правилу: Переменная имеет целый тип, если первой буквой ее имени является одна из следующих букв: I J KLMN. В противном случае переменная имеет вещественный тип. Это правило не только удобно для программиста (так как боль- шинство величин не нужно описывать), но и увеличивает на- глядность программы. Поэтому в этой книге используется не- явное задание типа. 4. Тип CHARACTER может определяться с помощью следую- щего оператора описания: CHARACTER [* длина [,] ] имя [ * длина ] , имя [ * длина ] ... Длина=положительная целая константа. Она обозначает коли- чество символов в переменной. В качестве длины можно также записать целое положительное выражение, которое следует заключить в скобки. Указатель длины, написанный непосред- ственно за ключевым словом, относится ко всем переменным, указанным в операторе и не имеющим «своей» длины. Если за именем переменной стоит указатель длины, тот этот указатель имеет приоритет. Если все указатели длины отсутствуют, то предполагается, что длина равна 1.
5.3. Операции. Стандартные функции. Выражения 71 Пример: CHARACTERS ZEILE, TEXT, VORN*20, NACHN*20, ORTS Для переменных ZEILE и TEXT резервируется по 80 символов, а для переменных VORN, NACHN и ORT резервируется по 20 символов. 5.3. Операции. Стандартные функции. Выражения Операции над текстовыми величинами рассматриваются в разд. 6.2. 5.3.1. Арифметика Арифметические операции изображаются следующими спе- циальными символами: Математическое наименование Запись на Фортране Сложение Знак положительного числа + Вычитание Знак отрицательного числа — Умножение * Деление / Возведение в степень ** Знаки операций отношений рассматриваются в разд. 5.3.2. В Фортране очень просто использовать большинство элемен- тарных функций. Они называются стандартными функциями и имеют стандартизированные имена * (ключевые слова). Соб- ственно говоря, речь идет уже о вызове подпрограмм (см. раз- дел 7.1). Стандарт Фортрана содержит около 30 функций, од- нако здесь будут рассмотрены только наиболее распространен- ные. Аргумент функций, приведенных в нижеследующей табли- це, обозначен через X. Он может быть арифметическим выраже- нием вещественного типа. Многие функции в качестве аргумен- * В таблице, представленной на стр. 72, приведены только так называемые универсальные имена функций. Для многих функций допустимы еще и другие имена, которые возникли вследствие исторического развития языка,
72 5. Элементы Фортрана та допускают арифметические выражения типа с двойной точ- ностью и комплексного типа. Значение функции формируется того же типа, что и тип зада- ваемого аргумента. Если ожидается результат комплексного типа, то и аргумент должен быть задан комплексным. Пример: SQRT ((— 1., 0.)). Ошибочная запись: SQRT (—1.). Вторая пара скобок необходима потому, что аргумент является комплексной константой. Стандартные функции Математические функции Дополнительные операции Математиче- ская запись Запись на Фортране Математическая запись Запись на Фортране SQRT(X) |x| ABS(X) sin х SIN(X) |x| sgn у SIGN(X,Y) cos х COS(X) m mod n MOD(M.N) tg X TAN(X) Преобразования типа: arcsin x ASIN(X) Целый в вещественный REAL(N) arccos x ACOS(X) Вещественный в целый INT(X) arctg x ATAN(X) Вещественный в двойную точность DBL(X) ex EXP(X) Вещественный в комплекс- ный CMPLX(X.Y) In X LOG(X) Округление до целого числа: sh x SINH(X) Результат целый NINT(X) ch x COSH(X) Результат вещественный ANINT(X) th x TANH(X) Преобразования цифрового типа в текстовый и обратно см. в разд. 6.2. Пояснения: Аргументы тригонометрических функций выражаются в ра- дианах. Модуль значения стандартной функции SIGN (X, Y) равен модулю аргумента X, а знак значения функции совпадает
5.3. Операции. Стандартные функции. Выражения 73 со знаком второго аргумента Y, т. е. производится присваива- ние знака Y величине X. Если положить Х = 1, то стандартная функция будет соответствовать математической записи sgn у. Исключение: SIGN (1 .,0.) = 1. Математическая запись m mod п обозначает выделение остат- ка от деления двух целых чисел m/п. Например, значение выра- жения 10 mod3 равно 1. Следует иметь в виду, что если делимое и делитель имеют целый тип, то и частное также будет иметь це- лый тип, т. е. производится отбрасывание остатка у частного. Например, результат деления 10/3 будет равен 3. Стандартная функция INT производит преобразование ве- щественного типа в целый тип. В результате преобразования от- брасывается дробная часть вещественного числа. Стандартная функция NINT производит округление вещественного числа до ближайшего целого. INT (3.8) = 3 INT (—3.8) = —3) Здесь знак равенства не явля- NINT (3.8) = 4 NINT (—3.8) = —4J ется символом Фортрана Оператором FORMAT производится автоматическое округле- ние до любого разряда после запятой (см. п. 5.6.2.). Определение'. Одна или несколько констант, переменных или функций, объединенных знаками операций и при не- обходимости скобками, образуют арифметическое выра- жение. При использовании знаков операций необходимо руководство- ваться следующими правилами'. 1. Недопустимо следование друг за другом двух знаков опе- раций, при необходимости их нужно разделять скобками. Скоб- ки не выступают в качестве знаков операций и поэтому в ариф- метическом выражении могут быть записаны последовательно несколько раз. Пара символов *», используемых в качестве опе- рации возведения в степень, воспринимается как один символ. 2. Действие скобок в арифметическом выражении совпадает с их действием в математике. 3. Знак операции умножения пропускать нельзя. 4. При делении констант и переменных, имеющих целый тип, остаток от деления отбрасывается. 5. При операциях различного ранга (например, при сложении и умножении) компилятор определяет операцию высшего ранга. Следовательно, операции высшего ранга нецелесообразно зак- лючать в скобки. 6. При операциях одинакового ранга, которые не заключены в скобки, вычисления производятся слева направо. Исключение: возведение в степень производится справа налево.
74 5. Элементы Фортрана 7. Знаки операций и скобки могут отделяться от констант, переменных и указателей функций пробелами. Пример 13. Арифметические выражения. Математическая запись Запись на Фортране ab с а-|-Ь —с А*В/С или А/С*В (А + В)/(-С) /а24-Ь2 е—х2/2 SQRT(A*A + В*В) ЕХР(—0.5*Х*Х) 1п(х+ V 1 4- X2 ) а Ьс х-рМ з/— у х A sin (cot + ср) | sin х | LOG(X+SQRT(1. + X*X)) А/В/С или А/(В*С) Х**(—Р/Q) Х**0.3333333, так как 1/3 будет равно 0 A*SIN(OM*T + PHI) ABS(SIN(X)) Если в арифметическом выражении встречаются операнды различных типов, то говорят о смешанном выражении. В этом случае перед выполнением каждой операции операнд преобра- зуется. В арифметическом выражении преобразуются операн- ды, имеющие высокие приоритеты. В начале разд. 5.2 приведены типы в порядке уменьшения их приоритета. В одном арифмети- ческом выражении не могут встречаться типы двойной точности и комплексный. Рекомендуется избегать смешанных выражений, потому что могут возникнуть непредвиденные эффекты, в част- ности связанные с делением операндов, имеющих целый тип. В этом случае следует использовать функции для преобразова- ния типов операндов. Исключением из этой рекомендации явля- ется использование смешанного выражения при возведении в степень, предпочтительно указание целого показателя при ве- щественном основании. Пример: Значение арифметического выражения I/2+X при 1=3 и Х = 1. равно 2. Вначале выполняется операция деления над целыми операндами, а затем результат деления (1) преобра- зуется к вещественному типу. Если это выражение представить в виде 0.5*1+Х, то уже перед операцией умножения переменная I преобразуется к вещественному типу и в результате значение выражения будет равно 2.5.
5.3. Операции. Стандартные функции. Выражения 75 Не нормирована реакция вычислительной машины в исклю- чительных случаях. Для описания этой реакции служат следую- щие понятия: Определение’. Если абсолютная величина числа так велика, что не помещается в предусмотренную разрядную сетку машины, то имеет место переполнение. Если абсолютная ве- личина числа очень близка к нулю, то возникает машинный нуль. Числа, большие представимых в машине, называют машинной бесконечностью. При делении на нуль, возведении нуля в отрицательную сте- пень (0“п, где n С N) и переполнении дальнейшие расчеты произ- водятся с машинной бесконечностью и (или) выдается сообще- ние об ошибке. Если абсолютная величина близка к нулю, то чаще всего дальнейшие вычисления проводятся с нулем. 5.3.2. Логика Константы и переменные логического типа могут быть объе- динены следующими логическими операциями: Название операции Математическая запись Запись на Фортране Инверсия | .NOT. Конъюнкция Л .AND. Дизъюнкция V .OR. Равнозначность .EQU. Неравнозначность <ч> .NEQU. Результаты этих операций определяются следующей табли- цей: Х1 Х2 -1X1 Х1ЛХ2 X1VX2 Х1 <=> Х2 Х1 •<£> Х2 Р р У Т (Г Р т т т т F Р Т Р Р Т F Т Т Р Несколько последовательно расположенных операций вы- полняются в соответствии с их приоритетами: инверсия (наивыс- ший приоритет), конъюнкция, дизъюнкция (равнозначность и неравнозначность). Эти приоритеты могут быть изменены скоб- ками. Между двумя расположенными рядом знаками операций всегда следует писать скобки.
76 5. Элементы Фортрана Выражения отношения также имеют двоичные результаты. Отношения между двумя арифметическими выражениями (или текстовыми выражениями, см. разд. 6.2) могут быть истинными и ложными. Здесь они называются кратко условиями. В распоря- жении пользователя имеются следующие операции отношения: Математическое обозначение Запись на Фортране Определение .EQ. Равно .GT. Больше .LT. Меньше .NE. Не равно .GE. Больше или равно .LE. Меньше или равно Определение: Логические константы, переменные или выра- жения отношения, которые объединяются логическими операциями и в случае необходимости скобками, образуют логическое выражение. Пример 14. Логические выражения. Обычная запись Запись на Фортране А = 0 (А>0)Л(В>0) “1 (“I x1V-| х2) ”1 XxvX2 A.EQ.О (A.GT.O).AND.(B.GT.O) .NOT.(.NOT.XI.OR.(.NOT.Х2)) .NOT.XI.OR.Х2 Здесь А и В — переменные вещественного типа, XI и Х2 — переменные логического типа. Предпоследнее выражение пред- ставляет подробную запись конъюнкции, последнее выражение соответствует импликации =>, которая в Фортране непосредствен- но не представлена (см. задачу 18 на стр 108). 5.4. Операторы. Программа Ранее обсуждавшиеся выражения образуют значительную часть оператора присваивания, который рассматривается в разд. 5.5. Другие виды операторов рассматриваются в последую- щих разделах. Это разделение соответствует блокам логической схемы программы. Существует и другой принцип разделения опе- раторов: выполняемые и невыполняемые. Выполняемый опера-
5.4. Операторы. Программа 77 тор переводится компилятором в одну или несколько машинных команд. Большинство операторов являются выполняемыми. Кро- ме этих операторов имеются операторы, которые в логической схеме программы не отражаются; им не соответствуют непосред- ственные машинные команды. Такие операторы называются невыполняемыми. Они служат для описания типов данных, а также типов программных единиц и наборов данных. Как уже неоднократно упоминалось, именами обозначаются символические адреса ячеек памяти, в которых располагаются данные. По этим адресам можно находить данные в памяти ма- шины. Для обеспечения возможности ссылок на операторы су- ществует другое правило: Символические адреса операторов указываются посредст- вом меток. Метка представляет собой целую положитель- ную константу, состоящую максимум из пяти цифр. Целе- сообразно помечать только те операторы, на которые ссы- лаются другие операторы программы (например, на кото- рые происходит передача управления). Из меток не обяза- тельно образовывать упорядоченную последовательность. Обычно операторы выполняются в порядке их следования в программе. Операторы перехода предназначены для из- менения этого естественного порядка выполнения опера- торов. Для повышения наглядности программы рекомендуется наз- начать метки в порядке возрастания с шагом 10. Это позволяет назначать метки с промежуточными значениями тем операторам, которые могут быть вставлены в дальнейшем (при отладке или модернизации программы) между уже существующими опера- торами. . При написании операторов необходимо руководствоваться следующими правилами: 1. Каждый оператор начинается с новой строки (перфокарты) и может располагаться в 20 строках (перфокартах). 2. Каждая строка состоит из 72 позиций, которые заполняются следующим образом: 3. Если в первой позиции расположен символ * или символ С, то эта строка воспринимается в качестве строки комментария. В ней может быть написан любой текст, который распечатывает- ся вместе с программой, однако при обработке эта строка во вни- мание не принимается. В простых программах такие строки ком- ментариев могут содержать описание программы. 4. В позициях со второй по пятую (а в случае необходимости и в первой позиции) располагаются метки.
78 5. Элементы Фортрана 5. Если шестая позиция — пустая (т. е. содержит символ пробела), то содержимое данной строки воспринимается как но- вый оператор. Если в шестой позиции содержится другой символ (не пробел), то эта строка воспринимается как продолжение пре- дыдущей строки, а записанная в ней информация — как продол- жение предыдущего оператора. Комментарии не могут содержать строк продолжения. Если необходимо включить длинный ком- ментирующий текст, то следует использовать несколько строк комментариев. 6. Позиции с 7-й по 72-ю предназначены для записи операто- ров. Оператор начинается с любой из этих позиций. Между от- дельными частями оператора могут записываться пробелы. Они не влияют на интерпретацию оператора. Определение: Составленная по определенным правилам пос- ледовательность операторов образует программную едини- цу *. Программные единицы, рассматриваемые в данной главе, называются основными программами. Основная про- грамма с любым количеством подпрограмм (которых может и не быть) составляет выполняемую программу (согласно стандату ANSI ХЗ.9-1978). Подпрограммы рассматриваются в гл. 7. На практике термином программа обозначают как програм- мную единицу, так и систему программных единиц, состоящую из основной программы и принадлежащих ей подпрограмм. Семантическое определение понятия программа приведено на стр. 10. Структура программной единицы в общих чертах должна со- ответствовать следующим правилам, которые в дальнейшем будут дополнены: 1. Первый оператор основной программы должен иметь вид PROGRAM имя программы Имя программы строится по правилу, приведенному на стр. 65. Этот оператор соответствует блоку «начало» на логической схе- ме. В основной программе присутствие этого оператора не явля- ется обязательным, однако подпрограмма (см. гл. 7) всегда долж- на начинаться с соответствующего оператора. 2. Далее при необходимости следуют операторы специфика- ций. Они являются невыполняемыми операторами (см. п. 5.2.2 и разд. 7.4). Эта часть программы называется разделом описаний. * Программную единицу иногда называют также сегментом фортрановской программы.— Прим. ред.
5.6. Операторы ввода и вывода 79 3. Затем располагаются операторы, решающие поставленную задачу. Эту часть программы называют разделом операторов. Она является программой в узком смысле этого слова. 4. Последний оператор каждой программной единицы имеет вид END Он соответствует блоку «конец» на логической схеме. 5.5. Оператор присваивания Оператор присваивания имеет следующий вид: переменная = выражение В процессе выполнения этого оператора вычисляется значе- ние записанного в нем выражения; полученное значение направ- ляется в ячейку памяти, символический адрес которой задается указанной переменной. Если выражение является арифметиче- ским (см. п. 5.3.1), той оператор присваивания называют арифме- тическим. Тогда тип результата автоматически преобразуется к типу переменной. Однако оператор присваивания может содер- жать логическое (см. п. 5.3.2) или текстовое (см. разд. 6.2) выра- жение. В этом случае тип переменной должен совпадать с типом выражения. Примеры операторов присваивания (приведены справа): CHARACTER NAME * 20 LOGICAL XI, Х2, Z Y = А * SIN (OMEGA * T + PHI) NAME = 'HANS MUELLER' Z = .NOT. (XI. AND. X2) 5.6. Операторы ввода и вывода Эти операторы излагаются в данном разделе, чтобы не нару- шать систематику изложения. Новичку рекомендуется прора- ботать сначала только п. 5.6.1. При использовании этих простых операторов может быть запрограммировано большинство при- меров и задач, помещенных в гл. 4 и 5. Пункт 5.6.2 содержит наиболее трудную часть элементарного Фортрана и должен про- рабатываться только после приобретения некоторого опыта про- граммирования.
80 5. Элементы Фортрана 5.6.1. Операторы ввода и вывода, управляемые списком. Присваи- вание начальных значений Для составления простых программ достаточно знать следую- щие операторы ввода-вывода: Ввод данных READ * , список ввода Список ввода = имена простых переменных, имена переменных с индексами, имена массивов. При выполнении этого оператора на экране дисплея высвечи- вается знак вопроса. Тогда необходимо ввести с клавиатуры в виде констант те значения, которые соответствуют элементам спис- ка ввода. Между соседними константами нужно указывать сим- вол пробела или запятую. По окончании ввода последнего зна- чения следует нажать клавишу ENTER. Это нажатие символизи- рует конец записи и обеспечивает передачу данных в память вы- числительной машины, а также передачу управления следующему оператору программы. Если клавиша ENTER будет нажата слишком рано (до ввода последнего значения), то для рассматриваемой здесь вычислитель- ной машины необходимо набрать новые числовые данные. Если перед нажатием клавиши ENTER набрать больше значений, чем указано в списке ввода, то в машину будет введено столько зна- чений, сколько предписывает этот список. Остальные значения будут игнорированы. Другими словами, они не будут введены в память и не будут рассматриваться в качестве начала следующей записи. Указания на ошибку при этом не последует. Оператор ввода, выполняющий дополнительный опрос на конец данных (см. стр. 47), имеет вид READ( * , * , END = п) список ввода Он проверяет, не является ли каждое введенное значение при- знаком конца данных (признаком EOF). Если встречается этот признак, то управление передается оператору, имеющему мет- ку п. В противном случае введенные значения обрабатываются обычным образом. Для рассматриваемой здесь вычислительной машины признак конца данных формируется двукратным нажа- тием клавиши ENTER (см. пример 23 на стр. 103). Вывод данных PRINT * [ , список вывода] Список вывода —имена простых переменных, имена индексированных пере- менных, имена массивов, константы, арифметические выражения.
5.6. Операторы ввода и вывода 81 При помощи заданного операционной системой устройства (например, на экран терминала) выводятся с новой строки кон- станты и значения переменных, имена которых записаны в спис- ке вывода. Так, например, текст может быть выдан посредством указания в списке вывода текстовых констант. В целях повыше- ния наглядности программы не следует включать в список выво- да арифметические выражения. Рекомендуется также делать спи- сок такой длины, чтобы все выводимые величины помещались в одной строке. Количество выводимых цифр числа не стандартизировано. Приведенная ниже таблица иллюстрирует вывод вещественных чисел в рассматриваемой вычислительной машине. Следует учи- тывать возможность автоматического перехода к экспоненциаль- ной форме представления чисел и возможность возникновения ошибок округления. Целые числа выводятся в правую часть де- сятиразрядного поля, комплексные числа отображаются в скоб- ках, текстовая информация располагается в левой части поля без апострофов. Если список вывода отсутствует, то выводится пус- тая строка. 0.999999975Е-005. 0.999999902Е-004 0.999999931Е-003 0.999999791Е-002 0.999999642Е-001 1.000000000000 10.00000000000 100.0000000000 1000.000000000 10000.00000000 100000.0000000 1000000.000000 10000000.00000 100000000.0000 .100000000Е+010 0.999999898Е+010 N = 2 Пример 15. Пусть нужно в диалоговом режиме дать указание пользователю о вводе, ввести значения и вывести их для контро- ля. Это можно запрограммировать следующим образом: PRINT*, 'ВВЕДИТЕ ЗНАЧЕНИЯ ПЕРЕМЕННЫХ А, В, С' PRINT* READ*, А, В, С PRINT*, 'А = ', А, ' В = ', В,' С = ', С Первым оператором здесь выводится текст, вторым — пус- тая строка. Далее (по третьему оператору) вычислительная ма-
82 5. Элементы Фортрана шина переходит в режим ожидания ввода данных с дисплея. Пос- ле набора на клавиатуре трех числовых значений и нажатия кла- виши ENTER эти значения вводятся в память ЭВМ (в поля пере- менных А, В и С). После этого (в процессе выполнения четверто- го оператора) введенные значения выводятся на экран дисплея вместе с именами соответствующих переменных. Присваивание начальных значений Каждую ячейку памяти, отводимую для хранения значения переменной или константы, прежде всего нужно инициализиро- вать (см. стр. 35), т. е. ввести в нее некоторое значение. Инициа- лизацию можно осуществить различными способами: оператором присваивания, оператором READ или рассматриваемыми ниже операторами. Оператор инициализации констант имеет вид: PARAMETER (имя = константа, имя = константа, ...) В ячейки памяти, обозначенные указанными именами, по- сылаются записанные в операторе константы. Содержимое этих ячеек не может изменяться в процессе дальнейшего выполнения программы. Поэтому перечисленные в операторе имена обозна- чают в дальнейшем указанные константы. Рассмотренный опе- ратор относится к операторам спецификаций. Оператор инициализации переменных имеет вид: DATA список переменных / список констант / ... Каждой переменной из списка переменных присваивается соответствующее значение из списка констант. Поскольку между переменными и константами устанавливается взаимно однознач- ное соответствие, то они должны иметь попарно одинаковый тип. Если несколько элементов списка констант должны иметь оди- наковое значение, то это значение можно записать в списке один раз, указав перед ним коэффициент кратности к*. Значение к представляет собой целую положительную константу. В програм- ме может быть несколько операторов DATA. Они являются не- выполняемыми операторами. Их следует помещать в программе после операторов спецификаций. Дальнейшее изложение построено в предположении, что чи- тателю уже известны сведения из разд. 6.1. В списке переменных могут присутствовать имена массивов. Если такое имя записано без индекса, то имеется в виду массив целиком. Если после име-
5.6. Операторы ввода и вывода 83 ни массива указан индекс, то это означает, что имеется в виду элемент массива. В списке переменных может быть указан неявный цикл. Пример: PARAMETER (LEN = 15, М - 10, N = 20, PI = 3.14159) CHARACTER*LEN TEXT REAL MATRIX (M, N) DATA TEXT, MATRIX /'ТАБЛИЦА ФУНКЦИИ', 200*0./ Величины LEN, M и N являются константами в операторах CHARACTER и REAL. При помощи оператора DATA перемен- ной TEXT присваивается текстовая константа ТАБЛИЦА ФУНКЦИИ, а всем элементам матрицы MATRIX присваиваются значения, равные нулю. 5.6.2. Универсальные операторы ввода и вывода При помощи операторов, описанных в данном пункте, можно обратиться к любому устройству ввода-вывода, а также весьма гибко задавать форматы вводимых и выводимых значений. Для того чтобы наиболее полно использовать возможности этих опе- раторов, необходимо перед составлением программы ответить на все вопросы, связанные с организацией данных (см. этап 4 на стр. 30). Сначала поясним некоторые термины. При этом будем опи- раться на материал гл. 2. Дальнейшее изложение затронутых здесь вопросов читатель найдет в гл. 8. Определение: Несколько связанных друг с другом символов образуют поле\ несколько полей образуют запись', несколько записей образуют набор данных (файл)', несколько наборов данных образуют банк данных. Пример: Поле Запись Набор данных Число Имя Строка матрицы Все персональные данные Матрица Все персональные дела Метка одного лица Оператор группы лиц Программа Строго говоря, различают физическую запись на внешнем носи- теле информации и логическую запись в программе. Здесь рассмат- ривается тот простой случай, когда обе разновидности записи сов-
84 5. Элементы Фортрана падают по своей организации. Примерами физических записей являются содержимое строки на экране дисплея, отпечатанная на бумаге строка символов, пробитая перфокарта. О признаках кон- ца записи см. на стр. 80. В Фортране имеются различия между внутренними и внеш- ними наборами данных. Внутренний набор данных находится в оперативной памяти, внешний — расположен в периферийном накопителе. Набор данных, находящийся в оперативной памяти, может быть перенесен при помощи устройства вывода в перифе- рийную память. Также можно переписать внешний набор дан- ных посредством устройства ввода в оперативную память. В рас- сматриваемых далее операторах различные устройства ввода- вывода обозначаются числами. Эти числа называются номерами каналов ввода-вывода. В общем случае пользователь не знает, какие устройства будут использованы при обмене информа- цией (например, на каком алфавитно-цифровом печатающем уст- ройстве будет выводиться информация). Номера устройств сов- падают с номерами наборов данных. Существование такого не очень удачного двойного наименования объясняется историческим развитием Фортрана. Раньше ЭВМ имела небольшое число уст- ройств ввода-вывода. Непосредственно на эти устройства и ссы- лался пользователь в процессе написания программы. Сейчас в центре внимания находится набор данных. Для программиста стало неважно, на каком устройстве этот набор обрабатывается. Существуют два вида доступа к записям набора данных: последовательный и прямой. Последовательный доступ означает, что после переноса оператором ввода-вывода одной записи набо- ра данных им переносится следующая запись этого набора. На- пример, такой записью может быть та перфокарта, которая к моменту выполнения оператора ввода находится в читающем уст- ройстве. После выполнения этого оператора происходит автома- тический переход к следующей записи. В данном пункте обсуж- дается только последовательная обработка записей. При прямом доступе в любой момент времени может обрабатываться любая запись набора (см. гл. 8). Такое деление на последовательный и прямой доступ обусловлено различиями в принципах работы разных внешних устройств (например, накопителей на магнитной ленте и накопителей на магнитных дисках). С помощью специаль- ных средств управления доступом сегодня возможна имитация прямого доступа к ленте и последовательного доступа к дискам. Поэтому в общем случае современный пользователь не знает, как в действительности организованы некоторые наборы данных. В зависимости от вида представления данных различают фор- матированные и неформатированные наборы. В форматированных наборах данные записаны в коде периферийного устройства (ис- пользован EBCDIC-код или ASCII-код). При переписи из пери-
5.6. Операторы ввода и вывода 85 ферийного устройства в центральный процессор данные автомати- чески преобразуются к виду представления, принятому в цент- ральном процессоре (см. п. 5.2.1). В данном пункте рассматрива- ются преимущественно форматированные наборы данных. Не- форматированные данные представлены в периферийном накопи- теле в коде центрального процессора и поэтому при переписи они не подлежат преобразованию. Неформатированные данные при- меняются преимущественно при работе с магнитными накопите- лями. Более подробно они рассмотрены в гл. 8. Общий вид операторов ввода-вывода следующий: WRITE (список управляющей информации) [ список ввода-вывода ] Список ввода-вывода рассмотрен в п. 5.6.1. Если этот список отсутствует, то машиной рассматривается только список управляющей информации. Список управляющей информации в простейшем случае состо- ит из двух элементов: указателя канала и указателя формата. Указатель канала имеет вид: [UNIT- ] и Если [UNIT =] отсутствует, то элемент и должен быть пер- вым элементом списка управляющей информации. Элемент и оп- ределяет внешний или внутренний набор данных. Внешний набор данных обозначается целым положительным выражением или символом *. Целое выражение (чаще всего константа) представля- ет собой номер устройства (номер набора данных). Чаще всего 5 обозначает устройство ввода, а 6 — устройство вывода. Если используется символ *, то подразумевается стандартное устройст- во, упомянутое в п. 5.6.1. Внутренние наборы данных обозначаются посредством тексто- вой переменной. Более подробно это рассмотрено в разд. 6.2. Ячейки памяти, обозначаемые списком ввода-вывода, не обра- зуют внутреннего набора данных. Указатель формата имеет вид [FMT =] [ f ] Если [FMT — ] отсутствует, то элемент f должен быть вторым элементом списка. Если оба элемента этой спецификации отсутст- вуют, то имеет место бесформатный обмен данными. Элемент f может принимать одно из трех следующих значений: 1. Целая положительная константа. Она означает метку опе- ратора формата, рассмотренного ниже.
86 5. Элементы Фортрана 2. Текстовое выражение. Его действие аналогично действию списка в операторе формата. Это выражение должно быть заклю- чено в скобки, как и список в операторе формата. 3. Символ *, при указании которого используется свобод- ный формат, рассмотренный в п. 5.6.1. Указатель формата предписывает деление внешнего набора данных на записи и поля, предопределяя тем самым соответствую- щую перекодировку данных. Говорят, что при наличии этого ука- зателя имеет место форматный обмен данными. Указатель форма- та необходим при выводе информации на экран дисплея или на бумагу при помощи печатающего устройства. Если используется стандартное устройство обмена, то допус- кается следующая сокращенная, форма операторов ввода-вывода: READ f PRINT список ввода-вывода В п. 5.6.1 мы рассмотрели действие такой записи для случая, когда элемент I имел значение *. Такая краткая форма использу- ется в данной книге только при описании обмена информацией с дисплеем. Пример: Два следующих оператора имеют одинаковое дейст- вие: PRINT*, X, Y WRITER, *) X, Y Они осуществляют вывод через стандартное устройство в сво- бодном формате. Назвать это бесформатным выводом нельзя. Все приведенные ниже операторы вывода имеют одинаковое действие. Вывод осуществляется устройством № 6 в формате 5Х, 2F10.5. Действие этого формата объясняется позже. WRITE (UNIT == 6, FMT = 100) X, Y WRITE (6, 100) X, Y 100 FORMAT (5X, 2F10.5) WRITE (6, ' (5X, 2F10.5)') X, Y MASKE = ' (5X, 2F10.5)' WRITE (6, MASKE) X, Y Вариант оператора вывода, в котором используется пере- менная MASKE, иллюстрирует возможность применения пере- менного формата. В разных местах программы переменной MAS- KE могут присваиваться различные значения. Конечно, во время выполнения оператора вывода должен быть известен фактический формат. Список управляющей информации может содержать и другие указатели. Рассмотрим некоторые из них.
5.6. Операторы ввода и вывода 87 Указатель перехода по ошибке имеет вид: [ERR = п]. Здесь п представляет собой целую положительную константу. Она соот^ ветствует метке того оператора, которому передается управление, если в процессе обмена обнаруживается ошибка. Указатель перехода по концу набора данных имеет вид: [END = п]. Здесь п — целая положительная константа, обозна- чающая метку того оператора, которому передается управление при прочтении признака конца данных (символы EOF). По про- чтении признака конца данных перестает действовать устройство ввода. Если в той же самой программе нужно еще раз осущест- вить ввод информации через это же устройство, то это требование необходимо отразить в операторе языка управления заданиями. В таком случае советуем применить метод опроса на конец дан- ных, изложенный в разд. 3.2 на стр. 46. Оператор формата имеет следующий вид: n FORMAT (список формата) Каждый оператор формата должен иметь метку п. Несколько операторов READ и WRITE могут ссылаться на один и тот же оператор FORMAT. Оператор формата может стоять после опе- раторов спецификаций в любом месте программы, что следует рассматривать как исключение в Фортране. Обычно оператор FORMAT записывают рядом с принадлежащим ему оператором READ (или WRITE) или все операторы формата помещают в одном месте программы. Оператор FORMAT является невыпол- няемым. Список формата является основой описания формата. Он задает правило разбиения внешнего набора данных на записи и поля. Список формата обычно содержит элементы двух типов: спецификации управления и спецификации преобразования. Спецификации обоих типов могут фигурировать в списке в любой последовательности. Спецификации управления содержат информацию, определяю- щую действия устройств ввода-вывода. Наиболее важными спе- цификациями управления являются следующие: / разделитель записей, пХ разделитель полей. В последней спецификации п — количество пустых мест (про- белов или пропусков). Дальнейшее описание спецификаций управления помещено на стр. 92. . Спецификации преобразования содержат информацию о виде данных во внешнем наборе (например, тип данных, количество цифр, которые необходимо перенести во внешний набор данных, место запятой в числе и т. п.). Спецификации преобразования и
88 5. Элементы Фортрана элементы списка ввода-вывода обычно связаны попарно. Приводи- мое здесь описание соответствует материалу разд. 5.2. Общая форма спецификаций для числовых величин такова: Bw‘d Здесь: В = постоянно закрепленная буква за определенным типом дан- ных. w = положительная целая константа. Она характеризует общую длину поля и подробно рассматривается при обсуждении кон- кретных спецификаций. d = положительная целая константа. Она задает то количество цифр после десятичной точки, которое нужно перенести при пере- даче данного. Это указание количества цифр в дробной части действует только для ввода-вывода и не имеет отношения к внут- ренней точности вычислений (см. разд. 5.2). | В списке формата не могут использоваться имена констант. Для всех числовых спецификаций действуют следующие пра- вила: При вводе пробелы интерпретируются как нули. При выводе информация располагается в правой части поля, т. е. последняя цифра ставится на последнюю позицию поля. У вещественных чисел происходит округление последней цифры. Незначащие нули и знак плюс при выводе заменяются пробелами. Если выбрать длину поля достаточно большой, то можно создать тем самым про- межуток между двумя числами. Если длину поля выбрали слиш- ком маленькой, так что все число не помещается в поле, то пе- чатается w звездочек. Рассмотрим конкретные виды спецификаций преобразования числовых величин: Для описания формата целых чисел используется специфи- кация Iw При подсчете длины поля (количества позиций) для выводи- мого числа необходимо учитывать как количество значащих цифр, так и знак числа. Вводимое по этой спецификации число необхо- димо располагать в правой части поля. Для ввода-вывода вещественных чисел и чисел с двойной точ- ностью существует несколько спецификаций преобразования. Для передачи чисел в форме с фиксированной точкой обычно
5.6. Операторы ввода и вывода 89 используют спецификацию Fw*d При определении длины поля w, кроме количества цифр, необходимо учитывать позиции для знака и десятичной точки. При вводе положение числа внутри поля может быть произволь- ным. Для передачи чисел в экспоненциальной форме обычно исполь- зуют спецификацию Ew-d При определении длины поля w, кроме количества цифр в мантиссе, десятичной точки и знака числа, необходимо учитывать еще четыре позиции для записи основания и показателя степени. Следовательно, должно соблюдаться следующее условие: w>d+7. При вводе число должно располагаться в правой части поля, так как показатель степени имеет целый тип. Если порядок у данных в наборе колеблется в больших преде- лах, то используют спецификацию Gw • d При вводе эта спецификация действует как спецификация Ew.d. При выводе автоматически выбирается спецификация с форматным кодом F или с форматным кодом Е в зависимости от абсолютного значения числа. Если соблюдается неравенство 0.1<| число |<10d, то выбирается спецификация с форматным кодом F при d (а не w) значащих цифр. Кроме того, в правой час- ти поля выводятся четыре пробела. Пример 16. Вывод вещественных чисел. Пусть действуют следующие операторы: WRITE (6, 100) X I WRITE (6, НО) X I 100 FORMAT (F6.2) | ПО FORMAT (Е12.5) | WRITE (6, 120) X 120 FORMAT (G12.5)
90 5. Элементы Фортрана Тогда вывод будет осуществлен следующим образом: Десятичное содержи- мое ячейки X Вывод Спецификация F6.2 Спецификация Е12.5 Спецификация G12.5 —0.0123456 —12.3456 —1.23456-107 Ш—0.01 —12.35 *#••!:*** —0.12346Е—01 —0.12346Е+02 —0.12346Е + 08 —0.12346Е —01 1_|— 12.346UI—ILJLJ —0.12346Е 4-08 В Фортране 77 имеются еще некоторые спецификации, кото- рые здесь не рассматриваются. Для передачи комплексного числа необходимо использовать две вещественные спецификации. Скобки, необходимые при вводе по свободному формату, при форматном вводе не указывают. Вы- водиться они также не будут. Переходим к рассмотрению спецификаций преобразования для нечисловых величин. Для передачи значений логических переменных используется спецификация Lw Вводимые значения логических переменных могут записы- ваться так: .TRUE, или .FALSE., а также кратко: Т или F. Вы- вод логических значений осуществляется всегда в правую часть поля в краткой форме. Для передачи значений текстовых переменных используется спецификация A[w] Если w отсутствует, то по умолчанию предполагается длина поля, равная длине, указанной в операторе CHARACTER. Этим следует пользоваться, так как иначе при различиях между обеи- ми длинами проявляется весьма сложный эффект. Апострофы, необходимые при вводе по свободному формату, при форматном вводе отсутствуют. Выводиться они также не будут. При организации вывода существует возможность внесения текстовых констант в список формата. В этом случае их действие такое же, как если бы они были элементами списка ввода-вывода. Указанная возможность обусловлена историческим развитием языка.
5.6. Операторы ввода и вывода 91 Пример: Стоящие ниже операторы вывода имеют одинаковое действие: WRITE (♦,'(А9, F8.2)') ' SUMME = SUM TEXT = ' SUMME = ' WRITE (*, 100) TEXT, SUM WRITE (*, 100) ' SUMME = SUM WRITE (♦, 110) SUM 100 FORMAT (A9, F8.2) 110 FORMAT (' SUMME = F8.2) Коэффициент повторения и внутренние скобки Перед каждой спецификацией преобразования может быть за- писан коэффициент повторения к в виде целой положительной константы. Коэффициент повторения имеет такое же действие, как если бы эта спецификация была записана к раз. Часть эле- ментов списка формата можно заключить во внутренние скобки, перед которыми в случае необходимости можно поставить коэф- фициент повторения. Это равносильно тому, что содержимое ско- бок записано многократно. Допускается несколько уровней ско- бок. Если список формата длиннее списка ввода-вывода, то это не оказывает никакого влияния на обмен данными. Если список ввода-вывода длиннее списка формата, то по исчерпании списка формата рассмотрение спецификаций продолжается, начиная с первого элемента во внутренних скобках. При этом осуществля- ется переход к новой записи. Если список формата не содержит внутренних скобок (обычный случай), то по исчерпании этого списка рассмотрение спецификаций продолжается с его начала. Пример 17. Коэффициенты повторения и внутренние скобки. data а, в, с, d, I, J, к 1 /1.,2.,3.,4., 1, 2, 3/ WRITE(*, 100) А, В, С 100 FORMAT(3F10.5) WRITE(*,110) А, В, С 110 FORMAT(F10.5) WRITE(*,120) I, А, В, С, D 120 FORMAT(I5/(2F10.5)) х WRITE(*, 130) I, A, J, В. К С 130 F0RMAT(3(I5, F10.5)) END
92 5. Элементы Фортрана Вывод 1-я позиция I I Lu1.00000 2.00000 3.00000 1.00000 2.00000 3.00000 I I UUU1.00000 2.00000 3.00000 4.00000 1 1.00000 2 2.00000 3 3.00000 Другие спецификации управления Если наклонная черта /, являющаяся символом разделения записей, указана в списке формата п раз подряд, то при вводе пропускается п—1 запись (например, п—1 перфокарта), при вы- воде создается п—1 пустых строк. Между спецификациями преобразования могут находиться следующие спецификации управления пХ и Тп. Их действие рав- носильно действию табулятора на пишущей машинке. Элемент п представляет собой целую положительную константу. При отработке спецификации пХ в процессе ввода пропуска- ется п символов (начиная с текущей позиции), а при выводе фор- мируется п символов пробела. При отработке спецификации Тп происходит переход к п-й позиции текущей записи. Существуют и другие спецификации управления. Управляющие символы печати При выводе на печать первый символ каждой записи автомати- чески рассматривается как управляющий символ и на бумаге не отражается. Действие управляющего символа следующее: Управляющий символ Действие управляющего символа L—I 0 1 + Продвижение бумаги на одну строку Продвижение бумаги на две строки Переход к следующей странице Бумага не продвигается Все управляющие символы, за исключением пробела, должны быть текстового типа. В списке формата их рекомендуется поме-
5.6. Операторы ввода и вывода 93 щать в виде отдельных текстовых констант. При выводе числовых данных обычно достаточно продвижения бумаги на одну строку. Этого можно достичь, помещая дополнительный пробел в поле первого данного каждой записи. Пример 18. Таблица статистики Таблица представляет собой наиболее употребительную фор- му представления результатов статистического учета. Пусть не- обходимо произвести опрос по двум признакам А и В, а также по их отрицаниям А* и В* (например, курильщик — не куриль- щик, спортсмен—не спортсмен). Результаты опроса нужно зафиксировать в четырех полях таблицы в виде количества эле- ментов, в которых имеет место совпадение признаков, указан- ных в соответствующих столбцах и строках. Например, число 722 в нижеприведенной таблице означает количество элементов, об- ладающих признаками В и А* одновременно. В последней колон- ке и в последней строке помещены суммы чисел по соответствую- щим строкам и столбцам. Приведенная ниже программа осуществляет требуемый ста- тистический расчет и печать указанной таблицы. Символы ST в окончаниях имен переменных соответствуют символу * в табли- це. PROGRAM VIERF INTEGER ZSUB, ZSUBST,SSUA, SSUAST, GESU DATA NAB, NASTB, NABST,NASTBS 1 / 110, 722, . 126, 1042/ * РАСЧЕТ ZSUB = NAB + NASTB ZSUBST = NABST + NASTBS SSUA = NAB + NABST SSUAST = NASTB + NASTBS GESU = ZSUB + ZSUBST * * вывод WRITE(*, 110) * ОПЕРАТОРЫ С МЕТКАМИ 110 И 130 * МОЖНО ЗАПИСАТЬ В ОДНУ СТРОКУ 110 FORMAT(15Х, ' ТАБЛИЦА’ // 1 16Х, ’I' , ЗХ, 'А'., 5Х, 'А* I') WRITE (*, 120) 120 FORMATQIX, '------1------------1------’) WRITE(*. 130) NAB,NASTB,ZSUB,NABST,NASTBS,ZSUBST 130 F0RMAT(13X, 'В Г, 15, 16, ' I', 15/ 1 13X, 'В* I', 15, 16, • I', 15) WRITE(*, 120) WRITE(*, 140) SSUA,SSUAST,GESU 140 F0RMAT(16X, ’Г, 15, 16, 1 T, 15) END
94 5. Элементы Фортрана В ы 6 о Э ТАБЛИЦА I А А* I -----!------- -I---- В Г ПО 722 I 832 В* I 126 1042 I 1168 -----т----------j------- I 236 1764 I 2000 Другие программы с оператором FORMAT рассматриваются в гл. 6. 5.7. Операторы управления 5.7.1. Безусловный переход Самый простой оператор управления имеет вид GO ТО п Действие этого оператора заключается в переходе к опера- тору, помеченному меткой п. Обычно оператор QO ТО упот- ребляется совместно с другим оператором управления, так как в Фортране 77 отсутствуют операторы, непосредственно органи- зующие различные виды циклов (см. стр. 38). С целью обеспече- ния требований структурного программирования необходимо, как можно реже использовать этот оператор. 5.7.2. Условный переход С помощью различных видов условного оператора могут быть запрограммированы все виды разветвлений. Самый простой вид имеет логический условный оператор, называемый кратко логи- ческим IF. Он имеет вид IF (логическое выражение) выполняемый оператор следующий оператор Логическое выражение часто представляет собой выражение отношения (см. п. 5.3.2), которое здесь кратко называется ус- ловием. Если условие соблюдается, то выполняется оператор, находящийся в строке IF, после чего выполняется следующий оператор, расположенный за оператором IF. Если условие не соблюдается, то выполняется сразу следующий оператор. Вы- полняемый оператор, расположенный в строке с ключевым сло- вом IF, не может быть оператором IF и оператором DO. Часто
5.7. Операторы управления 95 за ключевым словом IF в качестве выполняемого оператора за- писывают оператор GO ТО п. Это позволяет обойти следующий оператор при значении логического выражения да (условие соб- людается) и в зависимости от места расположения в программе оператора с меткой п организовать или цикл, или разветвление с последовательностью операторов в отрицательной ветви (см. рис. 25). Если положительная ветвь состоит из одного оператора, • Цикл по условию Рис. 25. Примеры использования логического оператора IF. то этот оператор можно записать в операторе IF. Для организации цикла необходим еще один оператор GO ТО. Ниже приведена структура такого цикла: П1 IF (логическое выражение) GO ТО п2 последовательность операторов GO ТО Пх п2 ... Если оператор с меткой гц стоит перед оператором IF, то имеем цикл общего вида, приведенный на рис. 9 (стр. 39). В Фортране 77 введен новый оператор — расширенный логи-
96 5. Элементы Фортрана ческий оператор IF. Он имеет следующий вид: Рис. 26. Структура расширен- ного логического оператора IF. Рис. 27. Вложение расширенного ло- гического оператора IF в IF-блок. Действие оператора поясняет рис. 26. В этом операторе не требуется обязательного использования оператора GO ТО и меток. Не разрешается входить внутрь структуры этого операто- ра, минуя строку с ключевым словом IF. Выход из любого места в этом операторе допустим. При помощи этого оператора можно организовать разветвление, состоящее из двух ветвей. Опера- тор ELSE и else-блок могут отсутствовать. Оба блока (и if-блок, и else-блок) в свою очередь могут содер- жать условные переходы, организованные при помощи расши- ренного логического оператора IF. Если такой переход присутст- вует в if-блоке, то необходимо использовать другой расширен- ный логический оператор IF. В этом случае схема записи опера- торов имеет вид IF (логическое выражение 1) THEN IF (логическое выражение 2) THEN 2-й if-блок ELSE 2-й else-блок END IF
5.7. Операторы управления 97 ELSE 1-й else-блок END IF следующий оператор Вложение расширенного логического оператора IF в if-блок поясняется логической схемой, приведенной на рис. 27. Если условный переход содержится в else-блоке, то необхо- димо использовать оператор ELSE IF. Тогда схема записи опе- раторов имеет вид IF (логическое выражение 1) THEN 1-й if-блок ELSE IF (логическое выражение 2) THEN 2-й if-блок ELSE 2-й else-блок END IF следующий оператор Второй else-блок называется также «блоком иначе — если». Вложение расширенного логического оператора IF в else-блок поясняется логической схемой, приведенной на рис. 28. Два сле- дующих друг за другом разветвления, имеющие по два выхода Рис. 29. Структура арифмети- ческого оператора IF. Рис. 28. Вложение расширенного логиче- ского оператора IF в ELSE-блок. каждое, дают возможность организовать разветвления с тремя выходами. Однако для этой цели удобнее использовать арифме- тический условный оператор, называемый кратко арифметиче- ским IF. Он имеет вид IF (арифметическое выражение) гц, п2, п3 4 № 2295
98 5. Элементы Фортрана Здесь пь п2, п3 — три метки. Этот оператор передает управ- ление на оператор с меткой пъ если значение арифметического выражения меньше нуля, на оператор с меткой п2, если значение арифметического выражения равно нулю, на оператор с меткой п3, если значение арифметического выражения больше нуля. На рис. 29 приведена логическая схема, поясняющая действие ариф- метического IF. Три оператора, помеченные метками пъ п2 и п3, могут быть расположены в любом месте программы. Две метки в арифметическом IF могут совпадать, тогда образуется разветвле- ние с двумя выходами. С помощью этого оператора можно орга- низовать как разветвление, так и цикл. Пример 19. Программирование разветвлений (см. рис. 26 на стр. 96). Три нижеприведенных фрагмента программы имеют одинако- вое действие. Человек, программировавший ранее на языке Бейсик, предпочтет первую версию, программировавший на языке Паскаль — вторую, программировавший на основной версии Фортрана IV — третью. Версия 1 Версия 2 Версия 3 IF(A. LE. В) GO ТО 20 отрицательная ветвь GO ТО 30 20 положительная ветвь 30 следующий оператор IF(A. LE. В) THEN положительная ветвь ELSE отрицательная ветвь END IF следующий оператор IF(B —А) 10, 20, 20 10 отрицательная ветвь GO ТО 30 20 положительная ветвь 30 следующий оператор Частая ошибка в третьей версии заключается в перепутыва- нии положительной и отрицательной ветвей в зависимости от записи (В — А) или (А — B)t а также в ошибочном присоедине- нии нулевой ветви. 5.7.3. Оператор цикла Этот оператор предназначен для организации счетного цикла (см. стр. 38). Он имеет следующий вид: DO п параметр цикла = начальное значение, конечное значение, [, шаг изменения] Здесь: п — метка оператора, который должен находиться ниже опера- тора DO;
5.7. Операторы управления 99 параметр цикла — это переменная одного из следующих типов.- целый, вещественный, с двойной точностью; начальное значение, конечное значение и шаг изменения — это арифметические выражения. Если шаг изменения отсутствует, то предполагается, что его значение равно 1. Действие оператора подробно рассматривалось на стр. 39. Число прохождений циклического участка рассчитывается по формуле, приведенной на той же странице. Оператор цикла работает следующим образом. Циклический участок (включая оператор, помеченный меткой п) выполняется N раз при изменяющемся значении параметра цикла. После каж- дого прохождения циклического участка значение параметра цикла увеличивается на величину, равную шагу изменения. Зна- чение параметра цикла не может изменяться никакими другими операторами, расположенными внутри циклического участка, кроме оператора DO. После выхода из цикла последнее значение параметра цикла сохраняется. Следует принять во внимание, что при нормальном завершении цикла это значение не совпадает со значением при последнем прохождении, так как перед выхо- дом из цикла величина шага еще раз суммируется со значением параметра цикла (см. рис. 10 на стр. 39). В качестве последнего оператора цикла, помеченного меткой и, нельзя использовать следующие операторы: DO, IF, ELSE, END IF, FORMAT, RETURN, STOP, END. В тех случаях, когда необходимо закончить циклический уча- сток одним из этих операторов, используют пустой оператор, который имеет вид n CONTINUE Ради наглядности и из-за установления соответствия с дру- гими языками программирования рекомендуется каждый цикл, организованный оператором DO, заканчивать оператором CONTINUE. Этот оператор не оказывает никакого влияния на ход выполнения программы. Возможные структуры с оператором цикла уже рассматрива- лись в гл. 4. Полное действие оператора цикла рассматривается в разд. 6.1 в связи с индексированными переменными. Там же описывается неявный цикл, предназначенный для ввода-вывода данных. Пример 20. Операторы DO. Логические переменные Посредством приведенной ниже (слева) программы создается таблица, помещенная на стр. 81. Все числа печатаются друг под другом, так как оператор вывода при каждом прохождении 4*
100 5. Элементы Фортрана циклического участка действует как «новый» оператор. Для того чтобы несколько чисел печатались на одной строке, нужно было бы использовать переменные с индексами. D0 20 I = -5, 10 X = PRINT*, X 20 CONTINUE END PROGRAM LOGVAR LOGICAL XI, X2, X3 PRINT*, ’XI X2 X3’ PRINT* DO 10 1=0,1 DO 10 J = 0, 1 DO 10 К = 0, 1 XI = I .EQ. 1 X2 = J .EQ. 1 X3 = К .EQ. 1 WRITE(*,1(3L3)1) XI, X2, X3 10 CONTINUE END Вы вод XI X2 X3 F F F F F T Программа, приведенная справа, показывает возможность вложения циклов на примере создания всех комбинаций значе- ний трех логических переменных. 5.7.4. Оператор переключения Этот оператор имеет вид GO ТО (п1} п2, Oj, ...) целая переменная Здесь пь п2, . . ., rij — любые метки. Перед выполнением этого оператора целой переменной должно быть присвоено положи- тельное значение. Если переменная имеет значение, равное j, то управление передается оператору с меткой гц. Пример: 1-3 GO ТО (100, 50, 70, 100) 1 Управление в этом примере передается оператору с меткой 70. См. также пример 28 на стр. 106. Имеется еще и другой оператор переключения с аналогичным действием.
5.8. Примеры 101 5.7.5. Другие операторы управления Эти операторы соответствуют граничным точкам логической схемы. Пустой оператор CONTINUE не оказывает никакого влия- ния на ход выполнения программы. Он уже использовался в п. 5.7.3. Оператор завершения программы STOP [константа] вызывает окончание выполнения основной программы. Точнее при его выполнении происходит возврат в операционную систе- му. Операторы STOP могут находиться в нескольких местах одной и той же программы. Значение константы свободно выби- рается пользователем. Это значение выводится машиной. По зна- чению константы можно, например, установить, до какого места программы происходило ее выполнение. Последним оператором каждой программной единицы явля- ется оператор END Он должен встречаться только один раз (в качестве последнего оператора). Он имеет такое же действие, как и оператор STOP, и при трансляции программы играет роль дополнительного при- знака ее окончания. 5.8. Примеры Здесь рассматриваются программы на Фортране к примерам,, приведенным в разд. 4.3. При этом поясняются правила Фортра- на. Читателя, желающего знать постановку задачи и структуру программы, отсылаем к разд. 4.3. Результаты приводятся толь- ко в тех случаях, когда при выводе возникают интересные проб- лемы. Пример 21. Упорядочение трех чисел. (Постановка задачи дана в примере 4 на стр. 47.) Подпрограммы впервые рассматри- ваются в гл. 7. Здесь (на стр. 102) приведены программы с раз- ветвлением, в каждой ветви которого записано по три опера- тора присваивания. См. также пример 47 на стр. 143. Пример 22. Таблица функций. (Постановка задачи дана в примере 5 на стр. 48.) В первой программе используется управ- ляемый списком вывод. Во второй программе изменены только
Т. Версия с GOTO 2. Версия с IF THEN 10 PROGRAM SORT 1 READ*, А, В, С IF<A .LE. В) GOTO Н = А А = В В = н IF(A .LE. С) GOTO Н = А 10 20 PROGRAM SORTH READ*, А, В, С IFCA .GT. В> THEN Н = А А = В В = Н END IF IF<A .GT. C> THEN А = С С = Н H = A A = С 20 IF(B .LE. Н = В В = С С) GOTO 30 С = H END IF IF<B .GT. C> THEN с = н H = В 30 PRINT*, А END , В, С В = C C = H END IF PRINT*, Aj END , B, c операторы вывода. Следует обратить внимание на погрешности округления результатов вычислений. PROGRAM FKT1 * PRINT*, ’ TA PRINT* PRINT*, ‘ X PRINT* 00 10 X = 1., 2., 0.1 ‘Yl = X*X Y2 = Y1 * X PRINT*, X, Yl, Y2 10 CONTINUE END 1. OOC 1.09S 1.195 1.29S 1.395 1.495 1.595 1.695 1.795 1.895 1.995 * ФОРМАТНЫЙ ВЫВОД * PROGRAM FKT2 PRINT*, ’ ТАБЛИЦА PRINT* PRINT*, 1 X X**2 PRINT* DO 10 X - 1., "2., 0.1 Yl = X*X Y2 = Yl * X WRITE(*, ’(F5.1, 2F9.3) 10 CONTINUE END БЛИЦА ФУНКЦИЙ' X“2 X**3' ТАБЛИЦА ФУНКЦИЙ X X**2 X**3 ) 0 0000 0 000 1.000000000000 1.000000000000 >999430000 1.209998130000 1.330996510000 >998860000 1.439996720000 1.727993970000 >998280000 1.689994810000 2.196990010000 >997710000 1.959993360000 2.743986130000 >997140000 2.249991420000 3.374979970000 >996570000 2.559988980000 4.095973010000 >995990000 2.889986040000 4.912963870000 >995420000 3.239982600000 5.831953050000 >994850000 3.609979630000 6.858942030000 >994280000 3.999977110000 7.999931340000 ТАБЛИЦА ФУНКЦИЙ v. X X**2 X**3 функции’ 1.0 1.000 1.000 X**!1 1.1 1.210 1.331 1.2 1.440 1.728 1.3 1.690 2.197 1.4 1.960 2.744 1.5 2.250 3.375 ') X, Yl, Y2 1.6 2.560 4.096 1.7 2.890 4.913 1.8 3.240 5.832 1.9 3.610 6.859 2.0 4.000 8.000
5.8. Примеры 103 Пример 23. Сумма произведений. (Постановка задачи дана в примере 6 на стр. 49.) Опрос на конец данных производится оператором READ. Ввод данных осуществляется с дисплея, как это показано в следующей таблице: Отображение на экране дисплея Ввод 3. —2. ENTER 5. 2. ENTER ? ENTER Если ввод осуществляется с перфокарт, то исходные данные должны быть размещены на них следующим образом: №№ перфокарты Содержимое перфокарты 1 3. -2. 2 5. 2. 3 /* * СУММА ПРОИЗВЕДЕНИЙ А PROGRAM SUMI DATA SUM, N /0., 0 / PRINT*, 'СУММА ПРОИЗВЕДЕНИЙ PRINT* PRINT*, 1 A B‘ PRINT* 10 READ(*,*, END=20) A, 8 PRINT*, A, В SUM = SUM + A*B N = N + 1 GOTO 10 20 PRINT* PRINT*, ’ СУММА = *, SUM, ' N = N END ВЫВОД1 СУММА ПРОИЗВЕДЕНИЙ A В 3.000000000000 -2.000000000000 5.000000000000 2.000000000000 СУММА = 4.000000000000 N= 2
104 5. Элементы Фортрана Пример 24. Таблица гиперболических функций. (Постановка задачи дана в примере 7 на стр. 50.) Часть выведенной инфор- мации представлена на стр. 51. PROGRAM HYPFKT * ЦИКЛ ПРОГРАММЫ X = о 00 30 1 = 1, 10 WRIТЕ(*,1(11111)1) WRITE(*, 100) 100 F0RMAT(5X,'X',5Х,'SINH(X)',4Х, 1 'COSH(X)',4Х,'TANH(X)1,4Х,’X'/) » ЦИКЛ СТРАНИЦЫ 00 20 J = 1,5 * ЦИКЛ БЛОКА D0 10 К = 1, 10 Yl = SINH(X) Y2 = COSH(X) Y3 = TANH(X) WRITE(«, 110) X, Yl, Y2, Y3, X 110 F0RMAT(F8.2, 2F10.4, F12.6,F7.2) X = X + 0.01 10 CONTINUE PRINT* 20 CONTINUE WRITE(*,100) 30 CONTINUE ENO Пример 25. Нахождение нуля функции. (Постановка задачи дана в примере 8 на стр. 52.) PROGRAM NU’LL DATA XI, Yl, X2 /0., -1., 1./ * НАЧАЛО ЦИКЛА 10 X =.5*(X1+X2) Y = X*X + EXP(X) - 2. IF(ABS(Y) .LE. IE-6) GOTO 20 IF(SIGN(1.,Y1) .EQ. SIGN(1.,Y)) THEN XI = X ELSE X2 = X ENO IF GOTO 10 A 20 PRINT*, ’НУЛЬ ФУНКЦИИ X END Пример 26. Решение квадратного уравнения. (Постановка за- дачи дана в примере 9 на стр. 55.) Ниже приведены два решения, базирующиеся на одной и той же логической схеме. Не ясно, делает ли широко рекламируемый блок IF программу более на- глядной.
5.8. Примеры 105 * РЕШЕНИЕ’ КВАДРАТНОГО УРАВНЕНИЯ С GOTO- л PROGRAM QUAD1 REAL IMZ COMPLEX Zl. Z2 * ПЕЧАТЬ ЗАГОЛОВКА И ВВОД ДАННЫХ 10 PRINT* PRINT*, 'ВВЕДИТЕ КОЭФФИЦИЕНТЫ А, В, С КВАДРАТНОГО УРАВНЕНИЯ 1 PRINT*, 'А = В = С = О УСЛОВИЕ ОКОНЧАНИЯ ВЫЧИСЛЕНИЙ 1 PRINT* READ*, А, В, С PRINT*, 'А = ', А, ' В = ', В, ' С = ', С * РАЗБОР СЛУЧАЕВ IF((A.EQ.O) .AND. (B.EQ.O) .AND. (C.EQ.O)) GOTO 50 IF((A.EQ.O) .AND. (B.EQ.O) .AND. (C.NE.O)) GOTO 40 IF((A.EQ.O) .AND. (B.NE 0)) GOTO 30 * ВЕЩЕСТВЕННЫЕ КОРНИ REZ = -B/(2*A) RADKND = (B*B-4*A*C)/(4*A*A) IMZ = SQRT(ABS(RADKND)) IF(RADKND .LT. 0) GOTO 20 XI = REZ + IMZ X2 = REZ - IMZ PRINT*, ' ВЕЩЕСТВЕН < КОРНИ XI = ’ ,X1, ' X2 = ', X2 GOTO 10 * КОМПЛЕКСНЫЕ КОРНИ 20 Zl = CMPLX(REZ, IMZ) Z2 = .CMPLX(REZ, -IMZ) PRINT*, 'КОМЛЕКСНЫЕ КОРНИ Zl = Zl, 1 Z2 = ', Z2 GOTO 10 * СОВПАДАЮЩИЕ КОРНИ 30 X = -с/в PRINT*, 'СОВПАДАЮЩ. КОРНИ X « ', X GOTO* 10 * ПРОТИВОРЕЧИЕ 40 PRINT*, ’ПРОТИВОРЕЧИЕ1 GOTO 10 50 PRINT*, ’КОНЕЦ ВЫЧИСЛЕНИЙ1 END ВЫВОД: ВВЕДИТЕ КОЭФФИЦИЕНТЫ А, В, С КВАДРАТНОГО УРАВНЕНИЯ А = В = С. = О УСЛОВИЕ ОКОНЧАНИЯ ВЫЧИСЛЕНИЙ А = 1.000000000000 в « *1.000000000000 С =: -6.000000000000 ВЕЩЕСТВЕН. КОРНИ XI = 3.000000000000 Х2 ~ -2.000000000000 * РЕШЕНИЕ КВАДРАТНОГО УРАВНЕНИЯ С РАСШИРЕННЫМ IF л PROGRAM QUAD2 REAL IMZ COMPLEX Zl, Z2 * ПЕЧАТЬ ЗАГОЛОВКА И ВВОД ДАННЫХ 10 PRINT* PRINT*, ’ВВЕДИТЕ КОЭФФИЦИЕНТЫ А, В, С КВАДРАТНОГО УРАВНЕНИЯ*’ PRINT*, 'А = В - С = О УСЛОВИЕ ОКОНЧАНИЯ ВЫЧИСЛЕНИЙ' PRINT* READ*, А, В, С PRINT*, 'А = ', А, 1 В = ’, В, ’ С = ', С * РАЗБОР СЛУЧАЕВ IF((A.EQ.O) .AND. (B.EQ.O) .AND. (C.EQ.O)) GOTO 20
106 5. Элементы Фортрана * IF((A.EQ.O) .AND. (B.EQ.O) .AND. (C.NE.O)) THEN PRINT*, 'ПРОТИВОРЕЧИЕ' ELSE IF((A.EQ.O) .AND. (B.NE.O)) THEN X = -C/B PRINT*, 'СОВПАДАЮ!!!. КОРНИ X = ', X ELSE REZ = -B/(2*A) RADKND = (B*B-4*A«C)/(4*A*A) IMZ = SQRT(ABS(RADKND)) IF(RADKND .LT. 0) THEN ’ КОМПЛЕКСНЫЕ КОРНИ Z1 = CMPLX(REZ, IMZ) Z2 = CMPLXtREZ. -IMZ) PRINT*, 'КОМПЛЕКСНЫЕ КОРНИ 71 = ’, Zl, ' 72 - ', 72 ELSE * ВЕЩЕСТВЕННЫЕ КОРНИ XI = REZ + IMZ X2 = REZ “ IMZ PRINT*, 'ВЕЩЕСТВЕН. КОРНИ XI - 1,X1, ' X2 = ', X2 END IF END IF GOTO 10 *20 PRINT*, 'КОНЕЦ, ВЫЧИСЛЕНИЙ1 END Пример 27. Численное дифференцирование. (Постановка за- дачи дана в примере 10 на стр. 56.) * ЧИСЛЕННОЕ ДИФФЕРЕНЦИРОВАНИЕ * PROGRAM DIFF DATA DXH.AALT /,1, 1./ READ* XI * НАЧАЛО ЦИКЛА 10 DY = SQRT(X1+DXH)-SQRT(X1-DXH) ANEU = DY/(2.*DXH) EPS = ABS((ANEU-AALT)/ANEU) AALT= ANEU DXH = 0.5 * DXH IF(EPS .GT. l.E-05) GOTO 10 PRINT*, 'XI XI, ' 1-Я ПР0ИЗВ » » ANEU Благодаря использованию методов, изложенных в гл. 7, в операторе, помеченном меткой 10, можно задавать любую функ- цию F (х) (вместо функции SQRT). Аналогичное замечание можно сделать и для примера 25. Пример 28. Моменты профилей. (Постановка задачи дана в примере 11 на стр. 58.) Из-за большого количества значащих
5.9. Задачи 107 цифр в целой части значения величины 1 организовано округле- ние до целой величины. PROGRAM МОМ REAL I, KLB, KLH WRITE(*,100) 100 F0RMAT(22X, ‘МОМЕНТЫ ПРОФИЛЕЙ’// 1 10Х, ‘TYP GRB KLB GRH KLH А’ 2 ' D I1/) 10 REAO(*,*, END=70) К,GRB,KLB,GRH,KLH,А,0 I = 0.0833333 * GRB * GRH**3 S = 0.0833333 * KLB * KLH**3 GOTO (60,30,40,50) К 30 I = I - S GOTO 60. 40 I = I + S GOTO 60 50 El = (A*GRH**2 + KLB*D**2)/(2.*(A*GRH + KLB*D)) E2 = GRH - El I = 0.333333 * (GRB*E1**3 - KLB*KLH**3 + A*E2**3) 60 II = NINT(I) WRITE(*,120) K,GRB,KLB,GRH,KLH,A,D,II 120 F0RMAT(10X, 12, IX, 6F7.2, 110) GOTO 10 70 END ВЫВОД? МОМЕНТЫ ПРОФИЛЕЙ ТУР GRB KLB GRH KLH А 0 1 1 2.00 0.00 5.00 0.00 0.00 0.00 21 1 99.00 0.00 99.00 0.00 0.00 0.00 8004963 3 20.00 10.00 50.00 20.00' 0.00 0,00 215000 4 20.00 10,00 50.00 20.00 10.00 10.00 116960. 5.9. Задачи 17. Записать на Фортране следующие выражения: B>^=v 2+ 3+d v . /1 — г) arctg — д) 0,5.In — ’ 1 — X е) — К5
108 5. Элементы Фортрана 18. Рассчитать значение логического выражения z— (хх —>х2) —> (""] х2 —> ~| Xi) Рис. 30. Схема с разветвле- ниями. К = 5, 0, —1 = К = м + 1 для всех комбинаций значений переменных хх и х2. Указание: см. пример 14 на стр. 76 и пример 20 на стр. 99. 19. Для логической схемы, приведенной на рис. 30, написать соответствующий фрагмент програм- мы, аналогичный фрагменту на стр. 96. 20. Определить, какие значения будут иметь переменные I, J, К, L и М после окончания выполнения сле- дующих операторов: М = 0 DO 10 I = 1, 10 J = I DO 10 L М 10 CONTINUE Для заданий с номерами 11 — 16 из разд. 4.4 написать программы на Фортране. Подробная постановка каждой задачи и необходимые указа- ния находятся в том же разделе. Ниже в скобках указаны номе- ра задач разд. 4.4: 21. Наибольший общий делитель (11). 22. Биномиальный коэффициент (12). 23. Пересчет из прямоугольной системы координат в поляр- ную систему координат (13). 24. Кусочно-непрерывная функция (14). 25. Экстремальные значения функции (15). 26. Нормальное распределение и интегральная функция (16). 27. Для двух нижеследующих операторов FORMAT и задан- ных числовых значений написать оператор WRITE. В какой фор- ме будут выводиться данные? Следует принять во внимание про- белы и возможные ошибки. а) 100 FORMAT (15, 3F10.5/E 10.5) Данные: выводится 6 раз число 100. б) ПО FORMAT (2F10.5, 2Е12.3) Данные: все степени десятки от 10-6 до 106. 28. Написать программу с использованием простых перемен- ных, в которой формируются числа 10, 12, . . ., 36, 38 и выводят- ся по формату, определяемому приведенной ниже таблицей. Ука- зания о позиции печати относятся к позиции первой цифры числа.
6.1. Массивы 109 № позиции при печати 5 10 15 20 25 Первая выводимая строка 10 12 14 16 18 Вторая выводимая строка 20 22 24 26 28 Третья выводимая строка 30 32 34 36 38 6. МАССИВЫ. ОБРАБОТКА ТЕКСТА 6.1. Массивы До сих пор рассматривались простые переменные, которые занимают по одной ячейке памяти и имеют разные уникальные имена. Имеется много задач, которые при использовании только простых переменных решались бы с большим трудом или вообще не были бы решены. К ним относятся, например, задачи линей- ной алгебры, в которых требуется применение индексов, а также задачи, связанные с вводом и выводом больших массивов число- вой информации. Определение: Массив представляет собой множество чисел, которые объединены общим именем, называемым именем массива. Элемент этого множества называется индексиро- ванной переменной (или переменной с индексом). Индек- сированная переменная состоит из имени массива и пары скобок, внутри которых находится одна или несколько раз- деленных запятыми индексных величин. В математике мас- сив с одним индексом часто называют вектором, в коммер- ческой обработке данных — списком', массив с двумя ин- дексами в математике называют матрицей, а в коммерче- ской обработке данных — таблицей. Примеры индексированных переменных: А(1, 2) В(1, К) Массивы должны быть описаны в начале программы операто- ром спецификации, который имеет следующий вид: Ключевое слово Список имен массивов Ключевое слово = DIMENSION или INTEGER или REAL или DOUBLE PRECISION или COMPLEX или CHARACTER или LOGICAL или COMMON Ключевое слово DIMENSION используется в том случае, если применяется неявное задание типа, т. е. когда не исполь- зуются другие ключевые слова. Другие слова, за исключением
по 6. Массивы. Обработка текста COMMON, служат для задания типа (см. разд. 5.2). Ключевое слово COMMON рассматривается в разд. 7.4. Список имен массивов имеет следующий вид: ИМЯ МаССИВа (limin’^max» tjmin*ljmax> • • •)» • • • Имя массива выбирается согласно правилу, приведенному на стр. 65. В пределах одной программы имя массива не может использоваться в качестве имени простой переменной. Элемен- ты i, j, . . . являются целыми константами. Они означают нижние и верхние границы соответствующих индексных величин. Макси- мальное допустимое количество индексных величин равно 7. Если нижняя граница равна 1, то в списке имен ее можно опус- тить. Границы могут принимать как положительные, так и отри- цательные значения, а также значение, равное нулю. В качестве границ массива можно указывать имена констант. Дополнитель- ные правила для подпрограмм приведены в гл. 7. С помощью оператора спецификации резервируется память для массивов. При этом существует известная трудность, заклю- чающаяся в том, что уже при написании программы должны быть известны границы индексных величин. Так как эти границы указываются в качестве констант, то нельзя ввести их значе- ния в начале выполнения программы и тем самым согласовать объем массивов с решаемой задачей. Такое динамическое опреде- ление размеров допускается только в подпрограммах, однако в этом случае соответствующие трудности переносятся в основную программу. Определенный выход из этого положения предостав- ляет оператор PARAMETER (см. стр. 82). Однако при использо- вании этого оператора все равно должны предварительно (при написании программы) оцениваться максимальные границы мас- сивов. В общем случае завышение оцениваемых границ не при- водит к возникновению ошибок (хотя при этом запрашивается лишняя память). Напротив, переход границ массивов во время выполнения программы всегда приводит к ошибкам. На эти ошибки автоматически указывают только некоторые вычисли- тельные машины. Пример: PARAMETER (М = 20, N = 10) REAL VEKTOR(3), MATRIX (М, N) CHARACTER * 20 NAME (0 : 99) В этом примере описываются вектор, состоящий из трех компонент (см. индекс), матрица, состоящая из 20 строк и 10 столбцов, а также массив для 100 имен (по 20 символов на каждое имя). После резервирования памяти в процессе выполнения про- граммы могут считываться фактические границы индексных вели-
6.1. Массивы 111 чин. Эти границы должны лежать внутри зарезервированных гра- ниц. Индексные величины должны быть целыми арифметически- ми выражениями. В эти выражения очень часто входит па- раметр цикла (см. п. 5.7.3). Пример 29. Вычисление суммы произведений с использованием массивов. Программа, приведенная ниже, лишь формально отли- чается от программы, приведенной в примере 23 на стр. 103. Однако здесь перед окончанием работы программы все введенные значения и bk находятся в памяти машины. Эти значения мо- гут быть использованы при дальнейших вычислениях. Следует обратить внимание на оператор с меткой 20. Проанализировав программу, можно сказать, что она допускает ввод максимум 100 пар чисел. PROGRAM SUM2 DIMENSION А(100), В(ЮО) S = 0. DO 10 I = 1, 100 READ(*,*, END = 20) A(I), B(I) S = S + A( I) * B(I) 10 CONTINUE * 20 1=1-1 PRINT*, 'СУММА3 S, » N = ’, I END Расположение элементов массива в памяти Для использования некоторых операторов полезно знать, как располагаются в памяти машины отдельные элементы масси- ва. Элементы каждого многомерного массива размещаются в па- мяти в виде одномерной последовательности так, что вначале пос- ледовательно изменяется от imin до imax значение первой ин- дексной величины, затем значение второй индексной величины возрастает на единицу и опять перебираются значения первой индексной величины от imin до imax. Это продолжается до тех пор, пока все индексные величины не достигнут максимального значения. Следовательно, матрицы располагаются в памяти машины по столбцам. Благодаря заранее установленному по- рядку расположения элементов массива может быть определен индекс L одномерной последовательности В (L) для любого эле- мента многомерного массива по значениям его индексных вели- чин. Например, для матрицы А(1, К) при imin=kmin=l, imax^M (строк), kmax=N (столбцов) формула расчета порядкового но- мера элемента в одномерной последовательности по значениям
112 6. Массивы. Обработка текста индексных величин имеет вид L=I+(K—1)*М Обратите внимание на то, что в этой формуле отсутствует N. Ввод и вывод массивов Существует простое правило: Если в списке ввода-вывода указано только имя массива, то весь массив будет введен или выведен целиком. Однако следует помнить, что элементы массива передаются в той последовательности, которая была описана в предыдущем абзаце. В частности, таким способом нельзя распечатать матри- цу по строкам. Этот способ используется преимущественно при обработке данных, рассматриваемых в гл. 8. Для изменения по- рядка ввода-вывода элементов массива (в частности, для пост- рочной передачи матриц) в операторах ввода-вывода нужно ука- зывать индексы. При этом используется особая форма цикла — неявный цикл. Для одномерного массива неявный цикл органи- зуется следующим образом: (имя массива (параметр цикла), параметр цикла = начальное значение, конечное значение [, величина шага] ) Эта конструкция в операторе ввода-вывода имеет тот же смысл, что и в обычном операторе цикла (см. п. 5.7.3). Иногда ее называют DO-списком. Она может выступать в качестве эле- мента списка операторов ввода-вывода и списка переменных в операторе DATA. Для двумерного массива А DO-список имеет вид ((А(I, К), К = 1, КМАХ), 1 = 1, IMAX) Действие неявного цикла только в первом приближении соот- ветствует действию обычного оператора цикла. Должны быть установлены приоритеты. В рассматриваемой здесь вычисли- тельной машине существует следующий порядок приоритетов формирования новой записи: 1. Начало оператора ввода-вывода (то же при повторении опе- ратора ввода-вывода внутри цикла DO). 2. Список формата. 3. Неявный цикл.
6.1. Массивы 113 Пример 30. Вывод массивов Фрагмент программы Действие DO 101 = 1,5 10 WRITER,'(5F10.5)') A(I) Печатаются друг под другом 5 чисел (правило 1). WRITER,'(3F10.5)') (A(I),I= 1,6) Выводятся 2 строки, по 3 числа в каждой строке (правило 2). WRITER, ,(10F8.2)')(A(I),B(I), 1=1,10) Выводится: А(1)В(1)А(2) В(2)...А(5) В(5) А(6) В(6) А(7) В(7)...А(10) В(10) WRITER,'(10F8.2)') (A(I), I = 1,10), (B(I), 1=1,10) Выводится: А(1) А(2) А(3) А(4)...А(9) А(10) В(1) В(2) В(3) В(4)...В(9) В(10) DO 20 1=1,M DO 20K=l,N WRITER,'(10F8.2)') A(I,K) 20 CONTINUE Все числа выводятся построчно друг под другом (правило 1): А(1,1) А(1,2) WRITER,'(10F8.2)') ((A(I,K), K=1,N), I = 1,M) Выводятся строки, по 10 чисел в каждой строке (правило 2). DO 30 I = 1,M WRITER,'(10F8.2)') (A(I,K), K=1,N) 30 CONTINUE Это желаемое решение. Выво- дится m строк, по п чисел в каждой строке (п< 10). Если п> 10, то начинается но- вая строка. Ниже приведено еще несколько примеров. Целью анализа предлагаемых задач является выработка четкого понимания того, что массивы необходимы, их нужно использовать. Пример 31. Схема Горнера. Требуется рассчитать и напеча- тать таблицу значений рациональной функции y=a0+aix+a2x2+. . .+anxn для п^20 и ее первой производной. В ЭВМ должны вводиться следующие данные: начальное значение аргумента xmin, конечное значение хтах, величина шага Дх, степень полинома п, коэффициенты по- линома aj в порядке возрастания индекса. Требуемая форма вы- вода результирующих данных такова:
114 6. Массивы. Обработка текста ТАБЛИЦА ЦЕЛОЙ РАЦИОНАЛЬНОЙ ФУНКЦИИ КОЭФФИЦИЕНТЫ ПОЛИНОМА 6.00000 -5.00000 -2.00000 1.00000 X Y 1 ПР0ИЗ< -3.00000 -2.50000 -2.00000 -1.500.00 -1.000'00 -0.50000 0.00000 0.50000 1.00000 -24.00000 -9.62500 0.00000 5.62500 8,00000 7.87500 6.00000 3.12500 0.00000 34.00000 23.75000 15.00000 7.75000 2.00000 -2.25000 -5.00000 -6.25000 -6.00000 Схема Горнера для расчета значения функции yi и ее первой производной yi в точке хх имеет следующий вид [4]: ап 1 с с Л5 CL х" ап-2 • • • *1 Рп_-| ... а1 Х1 Рг ао Х1 Р1 Рп Рп-1 Pn-2 Pi Ро =У1 Х1 аЬ1п Х1 аЬ|п-1 •" х1 аЫг аЫп аЬ|п-1 аЬ|п-2 аЫ^ = У1 Под первой чертой приведены вычисляемые значения рь которые, как видно из схемы, рассчитываются по следующей формуле: Pi^ai+xiPi+f для i=n—1, п—2, . . ., 0. На основании изложенного можно заключить, что централь- ным оператором программы (см. стр. 42) является оператор цик- ла DO 10. Первое значение рп=ап должно присваиваться вне этого цикла. Для значений ablb находящихся под первой чертой, можно было бы также предусмотреть массив. Однако тщательный анализ показывает, что этого делать не следует, так как в отличие от значений р, значения ablj больше нигде не используются. Следо- вательно, текущие значения ablj можно последовательно запи- сывать в одну и ту же ячейку памяти ABL. Отсюда вытекает цикл DO 20. Вокруг этого ядра относительно просто записать оставшуюся часть программы. Цикл DO 30 организует вычисления всех зна- чений таблицы. Традиционно первая часть программы осуществ- ляет ввод исходных данных и печать заголовка таблицы. Опера- тором READ считывается значение переменной N, которое за- тем используется этим же оператором в качестве верхней грани- цы неявного цикла.
6.1. Массивы 115 PROGRAM HORN DIMENSION A(0:20), P(0:20) * ПЕЧАТЬ ЗАГОЛОВКА И КОЭФФИЦИЕНТОВ WRITE(*,100) 100 FORMAT('1‘, 12X, 'ТАБЛИЦА ЦЕЛОЙ ’, 1 ’РАЦИОНАЛЬНОЙ ФУНКЦИИ'// 2 22Х,’КОЭФФИЦИЕНТЫ ПОЛИНОМА'/) READ*, N, XMIN, ХМАХ, DX, (A(I), I = 0.N) WRITE(*,120) (A(I), I = 0,N) 120 F0RMAT((7X, 4F12.5)//) WRITE(*>130) 130 FORMAT(20X, 'X', 10X, 'У', 6X, ’1 ПР0И3.7) * СХЕМА ГОРНЕРА Р(Ю = A(N) DO 30 X = XMIN, XMAX, DX DO 10 I = N-l, 0, -1 P(I) = A(I) + X * P(I+1) 10 CONTINUE ABL = A(N) DO 20 J = N-l, 1, -1 ABL = P(J) + X * ABL 20 CONTINUE * ПЕЧАТЬ WRITE(*,140) X, P(0), ABL 140 F0RMAT(15X, 3F10.5) 30 CONTINUE END Инструкция, необходимая для пользователя, в книге опуска- ется по причине экономии места. В следующем примере решается обычная задача расчета и печати значений функции двух независимых переменных. Исполь- зуемый здесь способ предназначен для маленьких таблиц и пред- полагает построчный расчет и печать значений функции. При рас- чете больших таблиц целесообразно вначале вычислить все тре- буемые значения, т. е. сформировать всю таблицу, а затем ее отпечатать (см. задачу 34 на стр. 133). В мультипрограммном ре- жиме (см. разд. 2.3) во время печати этой таблицы может выпол- няться другая программа, т. е. обрабатываться задание другого пользователя. Пример 32. Расчет веса одного метра стальной трубы. Требу- ется определить вес стальной трубы длиной в один метр с помощью следующей формулы: G(s, d)=0.2422 *s • (d—s), если s<d/2. Здесь G — вес в ньютонах, s — толщина стенки в мм, d — на- ружный диаметр в мм. Для области значений 2 mm^s^IO мм с шагом As=2 мм и 10 MM^d^lOO мм с шагом Ad=10 мм следует рассчитать и на- печатать таблицу, имеющую следующий вид:
116 6. Массивы. Обработка текста ВЕС 1 М СТАЛЬНОЙ ТРУБЫ (В НЬЮТОНАХ) S/MM 2.00 4.00 6.00 8.00 10.00 D/MM 10.00 3.88 5.81 20.00 8.72 15.50 20.34 23.25 30.00 13.56 25.19 34.88 42.63 48.44 40.00 18.41 34.88 49.41 62.00 72.66 50.00 23.25 44.56 63.94 81.38 96.88 60.00 28.10 54.25 78.47 100.76 121.10 70.00 32.94 63.94 93.00 120.13 145.32 80.00 37.78 73.63 107.54 139.51 169.54 90.00 42.63 83.32 122.07 158.88 193.76 100.00 47.47 93.00 136.60 178.26 217.98 При составлении программы рекомендуется использовать ме- тод центрального оператора. Центральным является оператор расчета веса по приведенной выше формуле. Программа, решаю- щая поставленную задачу, имеет вид PROGRAM GEW DIMENSION S(5), G(5) * ПЕЧАТЬ ЗАГОЛОВКА 00 10 1=1,5 10 S(I) =2*1 . WRITE(*, 100) (S(I), 1=1,5) 100 FORMATS Г , 18X, ‘ВЕС IM' 1 'СТАЛЬНОЙ ТРУБЫ (В НЬЮТОНАХ)' 1Г 2 7Х, ’S/ММ1, 5F10.2 / 7Х, 'D/MM*) * ЦИКЛ ПРОГРАММЫ 00 40 J = 1, 10 D = 10 * J * ЦИКЛ СТРОКИ DO 20 К = 1, 5 IF(S(K) .GE. .5 * D) GOTO 30 G(K) = 0.2422 * S(K) * (D - S(K)) 20 CONTINUE 30 К = К - 1 WRITE(*. 110) D, (G(I), I = 1, K) 110 FORMAT(1X, 6F10.2) 40 CONTINUE END Все значения Gk одной строки печатаются вместе, поэтому необходимо описать массив G(5). Для значений sk также необхо- дим массив 5(5),так как эти значения используются при расчете веса в каждой строке. Значение d в каждой строке является кон- стантой, поэтому d достаточно представить в виде простой пере- менной. Таким образом, записывают оператор G(K) = . . . . С помощью оператора IF, записанного перед упомянутым опера- тором, проверяется условие окончания формирования строки. Если условие выполняется, то происходит выход из цикла по
6.1. Массивы i 17 столбцам и с помощью неявного цикла печатаются рассчитанные значения G. В начале цикла DO 40 вычисляется значение пере- менной d; при этом используется значение переменного парамет- ра цикла J. В начале программы записывается цикл DO 10 для расчета значений Sj. Пример 33. Упорядочение п чисел. Необходимость упорядоче- ния чисел часто возникает, например, в статистике. Здесь при- водится относительно наглядное решение этой задачи, которое, конечно, не является оптимальным. В задаче 33 на стр. 132 рассматривается другое решение. Логическая схема программы, приведенная в примере 4 на стр. 47, пригодна для сорти- ровки только трех чисел. В случае упорядоче- ния произвольного количества чисел нужно ис- пользовать переменные с индексом. Идея про- граммы аналогична идее примера 4. Она отра- жена в схеме, приведенной на рис. 31. Используемый в этой программе ручной ввод исходных данных с дисплея является не эффективным. На практике упорядочиваемые данные помещают во внешний набор (см. зада- чу 46 на стр. 165). Идея процесса упорядочения иллюстрируется схемой: 1-е прохождение цикла Й1 а2; 2-е прохождение цикла а3 а4 Рис. 31. Логиче- ская схема упо- рядочения п чи- сел. При первоначальном прохождении цикла со- держимое ячейки ai сравнивается с содержимым всех остальных ячеек и при необходимости про- изводится перестановка. Следовательно, после первого прохождения цикла в ячейке at будет находиться самое маленькое число. В процессе второго про- хождения в ячейку а2 будет помещено наименьшее число из оставшихся и т. д. Как показано на схеме, приведенной на рис. 31, эта идея мо- жет быть реализована путем использования двух циклов. Ради на- глядности циклы на схеме представлены условиями. Изменение индексной величины к во внутреннем цикле связано с требованием на сравнение различных чисел в течение одного перебора. Из- менение индексной величины j во внешнем цикле связано с пос- ледовательным повторением переборов. Внутренний цикл рабо- тает по условию «меньше или равно», внешний цикл — по усло- вию «меньше».
118 6. Массивы. Обработка текста * УПОРЯДОЧЕНИЕ ЧИСЕЛ PROGRAM SORT2 INTEGER АГ500) * ЦИКЛ ЧТЕНИЯ DO 10 1 = 1, 500. READ(*,*, END = 20) A(I) 10 CONTINUE 20 N = I - 1 WRITE(*,110) N 110 FORMATQOX, 15, ' НЕУПОРЯДОЧЕННЫХ ЧИСЕЛ1/) WRITE(*,' (1015) ' ) (AU?, I = 1,N) DO 30 J = 1, N’l * DO 30 К = 1, N-J IF(A(J) . LE. A(J+K)) GOTO 30 AA = A(J) A(J) = A(J+K) A(J+K) = AA 30 CONTINUE ft WRITE(*,J20) N 120 FORMAT(// 10X, 15, ‘ УПОРЯДОЧЕННЫХ ЧИСЕЛ'/) WRITE(*,'(10I5)') (A(I), I = 1,N) END В ы 6 о 3 : 5 НЕУПОРЯДОЧЕННЫХ ЧИСЕЛ 2 I 0-1-1 5 УПОРЯДОЧЕННЫХ ЧИСЕЛ -1-1012 Так как из значений at в программе образован массив, то мож- но использовать оператор цикла. Во внешнем цикле индексная величина] пробегает значения otj = 1 до]=п—1. Конечное зна- чение kmax параметра внутреннего цикла к определяется из ус- ловия j+k^n. Отсюда можно найти максимальное значение пе- ременной к следующим образом: ктах=п—j. Пример 34. Перемножение матриц. С—А *В. Матрица-произ- ведение С может быть образована только в том случае, если ко- личество столбцов пА матрицы А равно количеству строк шв мат- рицы В. Это условие в приведенном здесь фрагменте программы не проверяется. Матрица С имеет шА строк и пв столбцов. Эле- мент cik матрицы С равен скалярному произведению i-й строки матрицы А на k-й столбец матрицы В: ПА Чк ~ 2 aijbjk* j= 1
6.2. Обработка текста 119 На основании этого выражения построен приведенный ниже фрагмент программы: DO 10 1 = 1, МА DO 10 к = 1, NB С (I, К) = 0. DO 10 J = 1, NA с (I, К) = С(1, К) + A (I, J) * B(J, К) 10 CONTINUE Во внутреннем цикле с индексом j рассчитывается значение элемента С (I, К) матрицы С. В среднем цикле с индексом к об- разуется строка матрицы-произведения С. Внешний цикл обес- печивает формирование всей матрицы. Если поменять местами средний и внешний операторы DO, то матрица-произведение будет формироваться по столбцам. Полный текст программы приведен в примере 49 на стр. 145. 6.2. Обработка текста Текст состоит из строк символов и его следует описывать ти- пом данных CHARACTER (см. разд. 5.2). В рассматриваемой вычислительной машине представление символов осуществляется в EBCDI-коде (см. приложение). В операторах, осуществляющих управляющий списком ввод, текстовые константы следует за- ключать в апострофы. Апострофы не являются частью констан- ты. Просмотр списка при выводе всегда происходит слева напра- во. Вывод текстовых констант осуществляется без апострофов. Спецификация А, использующаяся при обмене текстовыми кон- стантами, рассмотрена на стр. 90. Текстовыми константами можно манипулировать при помощи рассматриваемых ниже операций и функций. Определение: подстрока — это подмножество последова- тельных символов строки. Подстрока, начинающаяся с ш-го символа и кончающаяся n-м символом (включительно), описывается следующим образом: имя (т : п) После имени текстовой переменной в скобках должны быть указаны целые положительные выражения шип. При ш=п подстрока состоит только из одного символа. Определение: Текстовое выражение состоит из одной или не- скольких объединенных символами // текстовых констант, текстовых переменных, подстрок или обращений к тексто- вым функциям.
120 6. Массивы. Обработка текста При выполнении оператора присваивания значение текстового выражения переписывается в поле текстовой переменной, начиная с его левой позиции. Если длина переменной, указанной в левой части оператора присваивания, меньше длины выражения, то правые символы, не помещающиеся в поле переменной, опускают- ся (см. также стр. 90). При выводе текстовой переменной по сво- бодному формату переносится то количество символов, которое указано в операторе CHARACTER. Пример 35. Текстовые выражения. CHARACTER*10 VORN, NACHN, ТЕХТ*30 VORN = ’WOLFGANG' NACHN = 'MUELLER' TEXT = VORN//NACHN//’ PRINT*, TEXT PRINT*, TEXT(1:4) TEXT(1:8) = 'HANS PRINT*, TEXT ENO 11.12.25» Вывод: WOLFGANG MUELLER 11.12.25 WOLF HANS MUELLER 11.12.25 Если индексированная текстовая переменная представляет подстроку, то вслед за ее именем сначала записываются скобки с индексными величинами, а затем скобки с номерами первого и последнего символа. Пример 36. Анализ текста. Ниже приводится фрагмент про- граммы, производящий посимвольную перепись текста, состояще- го из 20 строк (по 80 символов в каждой), в поля переменных ZEICH(K) для дальнейшей обработки. Например, в дальнейшем можно подсчитать частоту появления отдельных символов. Ука- затель длины может отсутствовать. CHARACTER ZEILE(20)*80, ZEICH(80)*l * ВВОД ДАННЫХ d6’i6”i = i,2o DO 10 К = 1, 80 ZEICH(K) « ZEILE(I)(K:K) * ДАЛЬНЕЙШАЯ ОБРАБОТКА СИМВОЛОВ 10 CONTINUE В Фортране 77 имеются текстовые функции. Функция LEN (текстовое выражение)
6.2. Обработка текста 121 предназначена для подсчета количества символов в текстовом выражении. Если нужно, например, установить, на каком месте содер- жится в текстовой переменной определенный символ или после- довательность символов, то можно воспользоваться следующей функцией: INDEX (выражение 1, выражение 2) Если выражение 2 является подстрокой выражения 1, то с помощью этой функции выясняется на каком месте в выражении 1 стоит выражение 2. В противном случае INDEX=0. Пример: К = INDEX ('URWALD', 'WALD') значение к равно 3. Две следующие функции оперируют с внутренним представле- нием символов в виде кодовых комбинаций. Двоичное представ- ление каждого символа интерпретируется в качестве двоичного числа. Это число определяет позицию символа внутри некоторой последовательности. Номер позиции в десятичной системе свя- зан функциональной зависимостью с кодируемым символом. Пример: В EBCDI-коде символ А представляется как (1100 0001)2 = (193)10 символ 1 представляется как (1111 0001)2 = (241)10 Кратко говоря, символ А представляется как 193, а символ 1 — как 241. Функция ICHAR (текст) где текст = текстовое выражение, состоящее из одного символа, опреде- ляет представление этого символа в виде числа. Функция CHAR (число) где число = числовое выражение, указывающее представление символа, определяет символ, которому соответствует заданное представ- ление (число). При помощи этих двух текстовых функций можно программи- ровать кодовые преобразования. Пример: N-ICHAR(Z)—240 Если текстовая переменная Z представляет цифру в EBCDI- коде, то в ячейке с именем N будет записана эта цифра в виде це- лой константы. Операции отношения, рассмотренные в п. 5.3.2, могут также
122 6. Массивы. Обработка текста применяться и к текстовым выражениям. Каждое текстовое выра- жение в принципе может интерпретироваться как двоичное число. Благодаря этому текстовые выражения можно упорядочивать как числа рассмотренным ранее способом (см. пример 33 на стр. 117). Для этого необходимо, чтобы каждое текстовое выраже- ние записывалось в ячейке памяти обязательно слева направо. Пример: LOGICAL LI, L2 LI = 'ANTON'.LT. 'KARL' L2 = 'ANTON' .LT. '^KARL' В этом примере переменная L1 получит значение Т («истина»), а переменная L2 получит значение F («ложь»), так как во втором выражении перед символами KARL записан символ пробела. Пробел имеет представление 64, а символ А имеет представление 193. Внутренние наборы данных Посредством управляющего параметра UNIT в операторе READ или WRITE можно задавать внутренний набор данных (см. п. 5.6.2). Имя и содержание внутреннего набора данных име- ют тип CHARACTER. Если именем набора данных является имя массива, то каждый элемент массива соответствует записи. Все записи должны быть одинаковой длины. Внутренние наборы дан- ных могут обрабатываться только последовательно и форматно. Указатель формата относится к списку ввода-вывода, который в этом случае принимает на себя функции внешнего набора дан- ных. Эти наборы данных предоставляют дополнительную возмож- ность преобразования кодов. Пример 37. Запись и чтение внутреннего набора данных. Опе- раторы, стоящие слева в двух следующих записях имеют такое же действие как и недопустимые операторы, стоящие справа. CHARACTER STRINGS STRING = N WRITE(STRING, '(16)') N Максимум шестизначное число запи- сывается в правой части набора дан- ных STRING в виде последователь- ности символов CHARACTER STRINGS READ(STRING, '(16)') N N = STRING Последовательность символов, нахо- дящихся в ячейке с именем STRING, записывается в виде целого числа в ячейку с именем N Пример 38. Цветной код для электрических сопротивлений. Численное значение электрического сопротивления, согласно
6.2. Обработка текста 123 стандарту DIN 41 429, может изображаться следующим кодом (в упрощенном виде, без указания допуска). Численное значение должно состоять из двух цифр, за которыми следуют максимум шесть нулей. Каждая из двух цифр и количество нулей изобра- жаются тремя последовательно расположенными цветами. Соот- ветствие между цифрой и цветом отражает следующая таблица: Цифра Цвет О 1 2 3 4 5 6 7 8 9 Черный Коричневый Красный Оранжевый Желтый Зеленый Голубой Фиолетовый Серый Белый Программа формирует по значению введенного сопротивле- ния соответствующие цвета (см. также задачу 37 на стр. 133). PROGRAM FARB1 CHARACTER FARB(0:9)*7, DREI(3)«7, STRING*8, ZEICH(8)*1 INTEGER ZIFF(3), R , • DATA FARB/'ЧЕРНЫЙ','КОРИЧН.', КРАСНЫЙ', ОРАНЖ. 'ЗЕЛЕНЫЙ1, 1 'ГОЛУБОЙ*, 'ФИОЛЕТ.1,' СЕРЫЙ', 'БЕЛЫЙ'/ * PRINT* PRINT*, ’ВВОД ЗНАЧЕНИЯ СОПРОТИВЛЕНИЯ В ВИДЕ1 PRINT*, ’ДВУХ ЦИФР, ЗА КОТОРЫМИ МОЖЕТ БЫТЬ ДО Б НУЛЕЙ1 PRINT* 10 READ(*, *, ENO = 60) R * РАЗЛОЖЕНИЕ ЧИСЛА НА ЦИФРЫ WRTTEfSTRING, ‘(18)') R * R РАСПОЛАГАЕТСЯ В ПРАВОЙ ЧАСТИ ПОЛЯ DO 20 1 = 1, 8 20 ZEICH(I) = STRING(I-.I) DO 30 1=1,8 IF(ZEICH(I) .NE. ' ’) GOTO 40 30 CONTINUE * ПЕРЕКОДИРОВАНИЕ 40 READ(ZEICH(I), 100) ZIFF(l) READ(ZEICH(1+1), 100) ZIFF(2) 100 FORMAT(Il) ZIFFC3) = 8 - (1+1) * ОТОЖДЕСТВЛЕНИЕ DO 50 1=1,3 К = ZIFF(I) DREI(I) = FARB(K) 50 CONTINUE WRITE(*, 110) R, DREI 110 F0RMAT(I8, *0M СООТВЕТСТВУЮТ 3A8) GOTO 10 60 END
124 6. Массивы. Обработка текста Введенное значение записывается во внутренний набор дан- ных STRING. Посредством цикла DO 20 это значение разлага- ется на 8 символов. С помощью цикла DO 30 определяется поло- жение первого символа, отличного от пробела. Далее произво- дится преобразование этого символа в целое число. Цикл DO 50 содержит прием, часто используемый при обработке текстов и наборов данных, который необходимо запомнить. Этот прием за- ключается в том, что цифра используется в качестве индекса того массива, по которому устанавливается соответствие между циф- рой и цветом. Благодаря этому правильно выбирается цвет. Вы- вод имеет следующий вид: ВВОД ЗНАЧЕНИЯ СОПРОТИВЛЕНИЯ В ВИДЕ ДВУХ ЦИФР, ЗА КОТОРЫМИ МОЖЕТ БЫТЬ ДО 6 НУЛЕЙ 2500 ОМ СООТВЕТСТВУЮТ КРАСНЫЙ ЗЕЛЕНЫЙ КРАСНЫЙ 60 ОМ СООТВЕТСТВУЮТ ГОЛУБОЙ ЧЕРНЫЙ ЧЕРНЫЙ 100 ОМ СООТВЕТСТВУЮТ КОРИЧН. ЧЕРНЫЙ КРАСНЫЙ Следующий пример показывает использование внутреннего набора данных в качестве так называемой буферной памяти. Такая необходимость возникает, например, при обработке пос- ледовательности считанных записей, имеющих разные форматы, если данные должны обрабатываться разными участками програм- мы. В общем случае такого рода записи вводятся вручную (с дисплея). Они образуют набор данных на внешнем носителе (см. пример 12 на стр. 59). Формат записи при чтении обычно неиз- вестен, поэтому он рассматривается как текстовая переменная. Первый символ в записи рассматривается как указатель вида дальнейшей обработки. Посредством этого символа выбирается необходимый участок программы. Затем с помощью указателя и переключателя производится соответствующая обработка. Пример 39. Обработка записей различного формата. В при- веденном здесь фрагменте программы показаны только наиболее важные операторы, поясняющие принцип обработки записей различного формата. CHARACTER*80 SATZ, INTERN, TEXT, REST*79, READ(10) SATZ WRITE(INTERN,'(A80)') SATZ READ(INTERN(1:1), '(11)') KENN REST = INTERN(2:80) GOTO(ZO, 30, 40, 50) KENN
6.2. Обработка текста 125 Первый оператор приведенного фрагмента описывает данные. Вторым оператором бесформатно считывается запись из внешнего набора данных. Третий оператор переносит ее во внутренний набор данных с именем INTERN. Следующая пара операторов преобразует первый символ записи (указатель) в целое число, которое запоминается в поле переменной KENN, а остальные символы записи переписывают в поле текстовой переменной REST. С помощью последнего оператора, являющегося пере- ключателем, записи с указателями 1, 2, 3 и 4 передаются на об- работку соответствующей ветвью программы. Графический вывод с помощью печатающего устройства Этот простой вид обработки данных (см. стр. 23) может рассмат- риваться как частный случай текстовой обработки, так как при этом выводятся символы. Ниже рассматривается вывод графика функции. Основным вопросом является выбор масштаба. Этот вопрос не связан с обработкой данных, однако он, как показывает практика, доставляет новичку большие трудности. Величины, которые ниже обозначены черех х и у, изображаются отрезками. Определение: Масштаб =____________Разность отрезков______. Соответствующая разность величин ’ Пример: В соответствии с эскизом о 20 40 60 мм 100 150 200 250 н масштаб равен М = _ 20 мм 50 н = 0.4—. н Сначала целесообразно набросать эскиз желаемого графика. Затем из этого графика следует выбрать область выдаваемых зна- чений переменных и определить масштабы. Далее следует поду- мать над тем, как сориентировать координатные оси на устрой- стве печати. Чаще всего оказывается целесообразным выбрать положительное направление оси у в направлении строки, т. е. слева направо, а положительное направление оси х в направле- нии продвижения строк, т. е. сверху вниз (см. рис. 32 на стр. 126). Теперь можно рассчитать разность величин расстояний между двумя соседними строками и соответственно между двумя соседними символами. Исходя из вышеприведенного равенства
126 6. Массивы. Обработка текста и указанной ориентации осей, получим Ах на строку: DDX = Расстояние между строками Масштаб по оси х Ау на символ: DDY = Расстояние между символами Масштаб по оси у У многих печатающих устройств плотность печати составля- ет 6 строк на дюйм *. Отсюда получаем расстояние между двумя строками, равное 4.2333 мм. Зная плотность печати символов (12 символов на дюйм), получим расстояние между символами, равное 2.1167 мм. Пример 40. Построение графика функции при помощи печа- тающего устройства. Пусть необходимо написать программу, у~> осуществляющую вывод графи- 50 100 150 0.6 |----I------I 1-я строка X । * । 1 1*1 13-я строка 10.7 I----I - Ж - | v I I1 ж I I * I . 0.8 I-----I Ж - - I • i*i । : j|c I | 0.9 I-----I------1 10-я строка I I I * I I I : 1.0 I-----I-----I Рис. 32. Пример графика, построен- ного печатающим устройством. ков при помощи печатающего уст- ройства в виде, показанном на рис. 32. В заданных местах долж- ны печататься линии, параллель- ные оси ординат и оси абсцисс. Каждую линию, параллельную оси ординат, следует снабжать соответствующим значением х. Линии, параллельные оси абс- цисс, нужно надписать соответ- ствующими значениями у только в самой верхней строке. В каждой строке печатается звездочка, соответствующая зна- чению у. Из анализа постановки задачи вытекают следующие входные величины: ХО, YO — координаты верхнего левого угла графика; ХМАХ, YMAX — координаты нижнего правого угла графика; DX, DY — разности между двумя параллельными линиями; XMASS, YMASS — масштабы по координатным осям. На рис. 33 приведена укрупненная логическая схема про- граммы. Вспомогательные величины, которые должны быть рас- считаны по входным данным, получаются только при дальнейшем уточнении. Расчет значения функции производится после подго- товки печати строки, так как благодаря этому символ оси заме- щается символом графика (*). Поэтому условие «Следует ли пе- чатать линию, параллельную оси ординат» должно фигурировать * 1 дюйм равен 25.4 мм.— Прим, перев.
6.2. Обработка текста 127 Рис. 33. Логическая схема программы построения графика при помощи печа- тающего устройства. в логической схеме дважды. Второе условие в приведенной про- грамме реализуется посредством опроса переключателя. При за- мене всегда стирается целая строка, так как это едва ли сложнее, нежели использование двух различных блоков стирания.
128 6. Массивы. Обработка текста PROGRAM DIAPRI * ОПИСАНИЯ CHARACTER*! BLANK, PUNKT, ABSZ, ORD, DRUCK(70) DIMENSION XACHS(20), YACHS(IO) DATA BLANK, PUNKT, ABSZ, ORD/' ', 'I', DATA ZCHAB, ZLAB / 2.1167, 4.2333 / * 12 СИМВОЛОВ НА ДЮЙМ, 6 СТРОК НА ДЮЙМ, ЕДИНИЦА ИЗМЕРЕНИЯ ММ * ВВОД ИСХОДНЫХ ДАННЫХ И РАСЧЕТ ВСПОМОГАТЕЛЬНЫХ ВЕЛИЧИН READ*, ХО, ХМАХ, DX, XMASS, YO, УМАХ, DY, YMASS DDX = ZLAB/XMASS MZOX = DX/DDX +0.5 МРХ = (ХМАХ - XO)/DX + 1.5 DDY = ZCHAB/YMASS NZDY = .OY/DDY + 0.5 NPY - (УМАХ - YO)/DY +1.5 КМАХ = ((УМАХ - YO)/DDY) + 1.5 * НАДПИСЫВАНИЕ ОСЕЙ DO 10 1=1, МРХ 10 XACHS(I) = ХО 1- (I-l) * DX DO 20 I = I, NPY 20 YACHS(I) = YO + (I-l) * DY WRITE(*, 1010) (YACHSU), I = I, NPY) ЗОЮ FORMATS I', 12X, ' ГРАФИК ФУНКЦИИ' ,7X, I ' Y = 2*SIN(X) + SlN(2*X) ‘ 2 // 6X, 10F9.2) I = I * НАЧАЛО ЦИКЛА * ФОРМИРОВАНИЕ ОСЕЙ И СЕТКИ ГРАФИКА 00 150 X = ХО, ХМАХ, DDX IS = -I IF(XACHS(I) .GT. X) GOTO 60 00’50 К = 2, КМАХ 50 DRUCK(K) = ORD IS = +l 60 DO 70 К = I, NPY J = I + (K-l)*NZDY DRUCK(J) = ABSZ 70 CONTINUE •* Y = 2.0 * SIN(X) + SIN(2.О * X) * ОПРЕДЕЛЕНИЕ КООРДИНАТЫ ТОЧКИ IF((Y.LT.YO) .OR. 1 (Y.GT.YMAX)) GOTO 80 J = ((Y - YO)/DDY) + 1.5 DRUCK(J) = PUNKT * ПЕЧАТЬ И СТИРАНИЕ СТРОКИ 80 IF(1S .LT. 0) GOTO 120 WRITE(*. 1020) XACHS(I), (DRUCK(K), К = 1, КМАХ) 1020 F0RMAT(2X, F10.2, 70A1) 1 = 1 + 1 GO TO 130 120 WRITER, 1030) (DRUCK(K), К = 1, КМАХ) 1030 F0RMAT(12X, 70A1) 130 DO 140 К = 1, КМАХ 140 DRUCK(K) = BLANK ’50 CONTINUE END
6.2. Обработка текста 129 Переменные в программе имеют следующий смысл: ZCHAB, ZLAB —расстояние между двумя символами и соот- ветственно между строками; DRUCK (К) —массив печатаемых символов строки; КМАХ —количество печатаемых символов строки; XACHS (I), YACHS (I) — значения переменных х и у; DDX, DDY —разности, соответствующие расстоянию между двумя строками и между символами; MZDX, NZDY —число строк и число символов, которые соот- ветствуют разностям DX и DY. Слагаемое 0.5 необходимо для того, чтобы преобразова- ние к целому типу проводилось с округлением. МРХ, NPY —число линий, параллельных координатным осям. Слагаемое 1 необходимо для того, что- бы включалась дополнительно одна парал- лельная линия. Слагаемое 0.5 учитывает ок- ругление. IS —переключающая переменная (семафор, фла- жок). ГРАФИК ФУНКЦИИ Y = 2*SIN(X) + SIN(2*X) -3.00 п ппт--— -2.00 “1.00 0.00 1.00 2.00 3.00 и . UU1 I I I I *1 I I I I I I I * I I I I I I I I * I I 1 Л ПТ-.--. I I I I I * I 1. UU1““— "а — I j i I Т I 1‘ I I * I I к-20 мм >1 I. I I * I I I 1 I I I *1 I I I i I I I * I I 9 ЛИТ---- ▼ т £. UU1 I I I I * Г I I I I I I * I I I I I I I* I I I I I I * I I I 9 ЛЛТ---. w . UU1 I I I * I I I I I I А I I I I I I * I I I I л ллт---. н. uui I I * I I I I I I * I I I I I I I* I I I I I I * I I I I I I К ЛЛТ—*. О, (JU1 I * I I I I I I I * I I I I I I I * I I I I I I I * I I I I I 6.001—- р-ч. 1—*. —j —“-I—- —“I™ График функции, построенный печатающим устройством. Рис. 34. На рис. 34 представлен построенный машиной график функ- ции у=2 sin x+sin 2х. Он сформирован при следующих введен- ных значениях: 0. 6.2 1. 20. —3. 3. 1. 20. 5 № 2295
130 6. Массивы. Обработка текста С помощью метода, рассмотренного в гл. 7, программа может сформировать график любой функции. Следует обратить внима- ние на то, что вследствие ошибок округления значение функции в некотором интервале значений аргумента (около х=3) не меняется. На графике возникли три черточки абсцисс, расположенные правее у=3.0. Это произошло потому, что в процессе расчетов по программе получено значение DDY=0.105835, NZDY=9, NPY=7, КМАХ=58. Поэтому в цикле DO 70 максимальное значение переменной J равно КМАХ—3=55. Следовало бы про- водить вычисления с NZDY = 10. Тогда максимальное значение равнялось бы КМАХ+3=61. Следующий пример показывает простую возможность изобра- жения функции двух независимых переменных z=f(x, у). С по- мощью графопостроителя можно было бы вычертить линии оди- накового уровня Zk=const на плоскости х, у. Посредством пе- чатающего устройства этого сделать нельзя. Однако для каждой пары чисел (xb yj, которой соответствует позиция печати, мож- но вычислить значение zi5 j. Полученное значение можно затем напечатать на этой позиции при условии, что оно находится в диапазоне от 0 до 9 (см. задачу 38 на стр. 134). Здесь желательно произвести еще одно преобразование. Дело в том, что диаграмма будет нагляднее, если вместо цифр печатать символы, которые определяются на основании следующего соответствия между значениями цифры и символа: Цифра 0 123456789 Символ — — . .-----+ + ** Итак, задачей дополнительного преобразования является замена цифр символами. Здесь рассматривается только та часть программы, которая выполняет эту замену. Не рассматриваются вопросы, связанные с расчетом значения z и с выбором масштаба. Пример 41. Изограмма. Посредством одного оператора DATA в приведенной ниже программе значения Z записываются в мас- сив ZEILE, соответствующий печатаемой строке. Этот оператор заменяет отсутствующую здесь часть программы, в которой долж- ны рассчитываться значения Z при x=const. Посредством друго- го оператора DATA значениям элементов массива ZEICH при- сваиваются вышеупомянутые символы. Наиболее важной частью программы является цикл DO 10. Здесь методами, которые уже были рассмотрены в примере 38 на стр. 122, цифры заменяются соответствующими символами. Точ- нее по последовательности цифр, содержащихся в массиве ZEILE, формируется последовательность символов в массиве DRUCK. Она и подлежит выдаче в качестве строки формируемой изограм- мы. При выводе печатаются также и цифры (исключительно с це- лью контроля).
6.3. Задачи 131 * ИЗОГРАММА й PROGRAM ISO INTEGER ZEILE(ZO) CHARACTER*! DRUCK(2O), ZEICH(0:9) DATA ZEILE /8,8,7,6,5,5,2,2,1,1,1,0,3,5,5,6,6,7,8,8 / DATA ZEICH /' • + ' '+• •*’ / * ПРИСВАИВАНИЕ * ‘ DO 10 I = 1, 20 J = ZEILE(I) DRUCK(I) = ZEICH(J) 10 CONTINUE * ВЫВОД WRITE(*, 100) ZEILE, DRUCK 100 FORMAT(1X, 2011 / IX» 20A1) END Вывод: 38765522111035566788 **++— —+++** 6.3. Задачи При решении приведенных здесь задач необходимо исполь- зовать массивы. К концу данного раздела это станет очевидным. Понимание необходимости использования массивов при реше- нии какой-либо задачи уже является важным шагом на пути ее решения. 29. Задачу 28 следует решить с использованием переменных с индексами. 30. Векторное исчисление. Вводится любое число записей по три числа в каждой. Каждая тройка чисел означает координаты вектора. Выполнение программы заканчивается, если значения всех введенных координат равны нулю. Машина должна рассчи- тывать модуль каждого вектора и три направляющих угла. Вве- денные и вычисленные значения для каждого вектора подлежат выводу в одной строке. Указание: Формулы для расчета модуля а трех направляю- щих углов а, Р и у вектора имеют вид а = Иа* + а* + а*; Зу о 3 чу Q/f а = arccos р = arccosJf, у = arccos—. а ’ а » г q 31. Уравнение Ван-дер-Ваальса для реального газа примени- тельно к одному кмолю NH3 имеет вид /т \7\ R*T а р (Т, V) — уа» где R==8314 дж/к, а=4,23*105 н-м4, Ь=0,0371 м3. Требуется рассчитать и напечатать таблицу функции следую- щего вида: 5*
132 6. Массивы. Обработка текста ТАБЛИЦА ЗНАЧЕНИЙ УРАВНЕНИЯ ВАН-ДЕР-ВААЛЬСА ДЛЯ РЕАЛЬНЫХ ГАЗОВ А = 0.4230Е+06 N*M**4 В = О.3710Е-01 М**3 т/к 360 380 400 420 440 у(литр) ДАВЛЕНИЕ (БАР) 20 0 0 0 0 0 40 0 • 0 0 0 0 60 132 0 0 0 0 80 36 75 114 153 191 100 52 79 105 132 158 120 67 87 107 127 147 140 75 91 107 123 139 160 78 91 105 118 132 180 78 90 102 ИЗ 125 200 77 88 98 108 118 220 76 85 94 103 112 240 74 82 90 98 106 260 71 79 86 94 101 280 69 76 82 89 96 300 66 73 79 85 92 При вычислении нужно учитывать следующее. Если V<b, то получим отрицательное давление (физически бессмысленное значение). При V=b имеем точку разрыва функции (знамена- тель уменьшаемого равен нулю). Следовательно, должны печа- таться только те значения р, которые удовлетворяют условию: 0^р^200 (р измеряется в барах). Если это условие не выполня- ется, то следует печатать р=0. Указание: 1 бар = 105 н/м2. Следует принять во внимание, что в таблице печатаются целые числа. 32. Квадратичная интерполяция. Прежде всего следует в двух массивах X и Y записать значения 20 пар чисел Xj и yt для любой непрерывной функции. Далее вводятся промежуточные значения х. Следует проверять, лежит ли каждое введенное зна- чение х в интервале х^х<х19. Если введенное значение в ука- занном интервале не лежит, то выполнение программы должно закончиться. Если условие соблюдается, то следует найти «пра- вильное» место аргумента х в массиве. _ ।___________1___________। xj х xi+1 xi+2 Далее, согласно интерполяционной формуле Ньютона у=Ь0+Ь: (х—Х1)+Ь2(х—xt) (х—х1+1), где Ьо=Уь bi = ~ Ь9 = [у*+2 У*+1— У1±£~X11 / г х- _____х 1 ° Уь ’ xt + ,-x,’ [xi + ,-xi+f xl+I-XiJ / |х‘ + ’ Х>Ь следует рассчитать соответствующее значение у. 33. Упорядочение при чтении. Нужно прочитать максимум 500 чисел и упорядочить их в процессе ввода. Центральные one-
6.3. Задачи 133 раторы этой программы базируются на предположении, что в ячейках памяти с Z(l) по Z(I—1) уже находятся упорядочен- ные числа. Читаемое число прежде всего записывается в ячейку Z (I) и в случае необходимости путем неоднократных перестановок переписывается на нужное место в числовой последовательности. Идея метода состоит в том, что необходимые в данном случае перестановки осуществляются, начиная с конца массива, т. е. в порядке понижения индекса. Следовательно, вначале сравнива- ется содержимое ячеек Z(I) и Z(I—1), в случае необходимости числа меняются местами. Если произведена такая перестановка, то необходимо сравнить содержимое ячеек Z(I—1) и Z(I—2). Этот процесс следует повторять до тех пор, пока не будет проана- лизирована вся часть уже введенного массива. Таким образом, прочитанное число встанет на «правильное» место и может осу- ществляться ввод следующего числа. По окончании ввода дан- ных необходимо напечатать количество введенных чисел и сами числа. Указание: Первое число Z(l) следует прочитать отдельно. 34. Таблица функции в виде матрицы. Таблицу примера 32 на стр. 116 следует сформировать и выдать таким образом, чтобы вначале вычислялась вся матрица и только после этого происхо- дила ее печать. 35. Транспонирование матрицы. Сначала нужно ввести и от- печатать коэффициенты aik матрицы, содержащей m строк и п столбцов (ш, п^10). Далее следует образовать транспонирован- ную матрицу и отпечатать ее. Указание: Первый столбец исходной матрицы делается первой строкой транспонированной матрицы и т. д. 36. Плохо обусловленная система линейных уравнений. Систе- ма несовместна, если две строки матрицы коэффициентов явля- ются линейно зависимыми. Вследствие этого векторы строк ai и матрицы коэффициентов параллельны, поэтому cos(ab aj) = 1. Система будет плохо обусловленной, если |cos(ab а})| ^0.92. Требуется ввести матрицу размером 6x6 и проверить условие обусловленности. Для этого следует вычислить значение косинуса для всех комбинаций из двух строк. Если вышеприведенное усло- вие выполняется, то нужно напечатать соответствующие но- мера строк и значение косинуса. Указание: cos(ab а^ (а^а^/С^ ||aj|). 37. Цветной код для электрического сопротивления. В допол- нение к примеру 38, приведенному на стр. 122, следует написать программу, которая осуществляет ввод значений трех цветов для каждого сопротивления и определение соответствующего числен- ного значения сопротивления. Машина должна печатать введен- ные и полученные значения.
134 7. Подпрограммы. Операторы спецификаций Указание: Результирующие значения следует образовывать из трех цифр, сформированных в программе, путем суммирования взвешенных ими степеней десятки. 38. Требуется построить изограмму функции. z=0.5-(9+x2—у2)+0.6 согласно образцу, приведенному на рис. 35. ИЗОГРАНГД ФУНКЦИИ Z * * 5 ' ( ? «• V’X - '• *+ 0.6 ОСЬ X НАПРАВЛЕНА ВНИЗ ‘555666777/ 73888889999999999 3999*^9999998888888 71776666555 5:>55бб6б77777738888888888888888888888888777777666655554 -2 5 :^."ээббббб77 777773888888838888888887777777666665555444 334444555566666677777777777777777777777777666665555544433 233344445555566666667777777 77 77 777777666666665555544443 33 -г " 223333444455555566666666666666666666666666555555444433332 222233344444555555566666666666666666666555555544443333222 5 122223333444445555555566666666666666555555554444433332221 1‘1222233334444445555555555555555555555555544444433332221 1 - 1 0 1 1 122223333444444455555555555555555555554444443333322221 1 0111222233333444444555555555555555555544444443333322221 11 011 12222333334444444455555555555555544444444333332222111 1 •0.5 011 1 122223333344444444455555555555544444444433333222211 10 0011122223333334444444445555555555444444444333332222111 10 3.0 001112222333333444444444455555555444444444433333222211110 001112222333333444444444555555555444444444433333222211110 001112222333334444444445555555555544444444433333322221110 0.5 01 11 122223333344444444555555555555554444444433333222211 10 0111222233333444444455555555555555555544444443333322221 1 1 1.0 111222233333444444555555555555555555555444444433332222111 111222333334444455555555555555555555555554444443333222211 1.5 1 12223333444444555555555666666666655555555544444333332221 122233334444455555556666666666666666665555555444443333222 222333444445555556666666666666666666666665555554444333322 2.0 233334444555556666666677777777777777666666665555544443332 333444455556666667777777777777777777777766666655555444433 2.5 344445555666667777777788888888888887777777776666655554443 444555566667777778888888888888888888888887777776666555544- 3.0 4555666677777888888889999999999999'39988888888777766665555 Рис. 35. Изограмма. Размер изограммы должен составлять 120 мм X 120 мм. Пе- чатаемые символы должны являться целыми значениями величи- ны z. Ось х должна быть направлена вниз. 7. ПОДПРОГРАММЫ. ОПЕРАТОРЫ СПЕЦИФИКАЦИЙ 7.1. Общие вопросы Решение большой задачи нецелесообразно оформлять в виде одной основной программы, как это делалось в предыдущих гла- вах. В соответствии с правилами структурного пограммирования (см. разд. 4.2) программу рекомендуется строить по модульному
7.1. Общие вопросы 135 (блочному) принципу из основной программы (ОП) и ряда под- программ (ПП). Такой подход имеет следующие преимущества: простота разделения работы между разными специалистами; лег- кость осуществления контроля ошибок (каждая подпрограмма может тестироваться независимо от других частей общей програм- мы); наглядность документации. Многие стандартные задачи час- то повторяются. Соответствующие им подпрограммы целесообраз- но объединять в библиотеку подпрограмм. Такая библиотека обыч- но составляет значительную часть прикладного программного обеспечения. Определение: Если используется подпрограмма, то говорят о ее вызове. Соответствующий оператор называется операто- ром вызова подпрограммы. Основная программа и подпрограммы должны быть объеди- нены перед их выполнением в одну единую программу. Для этого прежде всего должны быть от- транслированы все программные единицы (см. об этом в разд. 3.3 и на стр. 78). На рис. 36 в качестве приме- ра приведены принципиальные связи между основной програм- мой и подпрограммами. Если вы- зывается подпрограмма, то каж- дый раз происходит переход на другое место оперативной памя- ти, т. е. на то место, где она рас- положена. Подпрограмма может вызвать в свою очередь другую подпрограмму, однако саму се- бя вызвать не может. Последнее Рис. 36. Последовательность выпол- нения программных единиц. не является само собой разуме- ющимся, так как имеются языки программирования, в которых это допускается. Если подпрограм- ма вызывает другую подпрограмму, то действия осуществляются так же, как при вызове подпрограммы из основной программы. На рис. 36 показано, что прежде всего в данном примере из основной программы ОП вызывается подпрограмма ПП1. Далее следует вызов подпрограммы ПП2. Позднее подпрограмма ПП2 вызывается непосредственно из основной программы. И наконец, основная программа вызывает подпрограмму ППЗ, которая затем вызывает подпрограмму ПП1, а та в свою очередь еше раз вызы- вает подпрограмму ПП2. При обращениях имеют место не только переходы, показан- ные на рисунке, но и обмен информацией в обоих направлениях.
136 7. Подпрограммы. Операторы спецификаций Эта так называемая передача параметров составляет сложную проблему при создании выполняемой программы. Многие опреде- ления и правила, которые поясняются ниже, связаны с решением этой проблемы. Введем общие понятия, используемые для всех видов под- программ: Определение'. Локальное имя действует только внутри прог- раммной единицы, в которой оно определено (объявлено и/ил и инициализировано). Глобальное имя действует в не- скольких программных единицах, т. е. во всех этих едини- цах оно означает одну и ту же ячейку оперативной памяти. Следовательно, локальное имя может использоваться в разных программных единицах в различных (или одинаковых) значениях. Оно должно определяться в каждой программной единице. В пер- вом приближении можно сказать: Имена переменных являются локальными. Глобальными именами являются имена подпрограмм и наборов данных. Метки операторов всегда являются локальными. Ниже упо- минаются только исключения из этого правила. Под крат- ким наименованием «переменные» в дальнейшем подразуме- ваются простые переменные, индексированные переменные и массивы. Определение'. Параметры являются величинами, которые передаются из основной программы в подпрограмму и обрат- но. В первом случае говорят о входных параметрах, во вто- ром — о выходных параметрах. Параметры, используемые при написании подпрограммы, называются формальными. Параметры, используемые при вызове подпрограммы, на- зываются фактическими. Оба класса перекрываются. Следовательно, имеются формаль- ные входные и формальные выходные, а также фактические вход- ные и фактические выходные параметры. Вопрос о том, какие ве- личины могут быть использованы в качестве параметров, осве- щается при рассмотрении различных видов подпрограмм. В общем случае действуют следующие правила: 1. Имена формальных и фактических параметров одинаковых величин могут быть различными. 2. Значения и типы формальных и фактических параметров в списках, используемых при написании и при вызове под- программы, должны поэлементно совпадать. Правило 1 гарантирует возможность независимого написания ос- новной программы и каждой из подпрограмм. Вследствие прави- ла 2 необходимо иметь в сопроводительной документации к прог- рамме описания параметров каждой из ее подпрограмм.
7.2. Подпрограммы-функции 137 Кроме этих формальных правил, необходимо знать, как произ- водится обмен параметрами между основной программой и под- программой. При вызове подпрограммы ей передаются адреса ячеек фактических параметров. Этот метод называют «передачей имен». Следовательно, список формальных параметров при вызо- ве подпрограммы становится списком адресов ячеек, от которых или в которые передается информация. Упрощенно можно ска- зать: формальные и фактические параметры занимают одни и те же ячейки памяти. Такое упрощенное понимание вопроса является правильным, если в качестве формальных и фактических параметров исполь- зуются простые переменные. Если фактическим параметром является имя массива, то фор- мальному параметру соответствует адрес первого элемента этого массива. Если в качестве фактического параметра записано выра- жение, то формальным параметром является неизвестный програм- мисту адрес ячейки памяти, в которую записано значение этого выражения. Последствия, которые вытекают из этих правил, поясняются в соответствующих местах книги. 7.2. Подпрограммы-функции Определение'. При использовании подпрограммы-функции, кратко называемой функцией, в подпрограмму могут пере- даваться несколько входных параметров. Однако подпрограм- ма поставляет только одно значение, которое записывается в ячейку памяти, имеющую имя этой функции. Поэтому для имен функций существуют такие же правила, как и для имен переменных. В основной программе имена функций должны быть описаны так, как это изложено в п. 5.2.2. Подпрограммы-функции часто используются для расчета зна- чений функций (в математическом смысле) от нескольких незави- симых переменных. Эти переменные являются входными парамет- рами. Имя, являющееся выходным параметром, поставляет вы- численное значение функции в вызывающую программную едини- цу. Различают три вида функций: стандартные функции, операторы-функции, внешние функции. Стандартные функции являются частью языка Фортран. Они уже рассматривались в п. 5.3.1. Функции других видов должен записывать сам пользователь в виде подпрограмм. Вызов функций 6 № 2295
138 7. Подпрограммы. Операторы спецификаций всех трех видов одинаков и осуществляется следующей конструк- цией: Переменная = ... имя функции (список фактических параметров) ... Здесь многоточие означает, что имя функции с последующим списком в скобках может быть частью выражения. Каждый факти- ческий параметр — это выражение (чаще переменная или конс- танта), имя другой подпрограммы или имя массива. Подробнее об этом см. на стр. 145. Имена других подпрограмм записываются без списка параметров, подробнее об этом сказано в п. 7.4.1. Пример: Y-SIN(SQRT(X)) Здесь параметром списка является выражение (а не имя дру- гой подпрограммы). Обмен параметрами протекает приблизитель- но так: адрес ячейки X передается подпрограмме SQRT, резуль- тат вычисления записывается в ячейку SQRT. Этот адрес передает- ся подпрограмме SIN, результат вычисления по этой подпрограм- ме записывается в ячейку SIN и далее оттуда переписывается в ячейку Y. 7.2.1. Оператор-функция Оператор-функция записывается так: имя функции (список формальных параметров) = выражение Эта простейшая форма подпрограммы используется в том слу- чае, если расчет функции сводится к вычислению одного выраже- ния. В качестве формальных параметров могут выступать только простые переменные. Операторы-функции записываются в основ- ной программе, в которой они используются, непосредственно за операторами спецификаций. Следует заранее согласовать типы имен функций и переменных. Имя функции является локальным, т. е. оно действует только в основной программе. Если в выраже- нии встречаются переменные, которые отсутствуют в списке па- раметров, то они имеют такие же значения, как и переменные та- кого же имени в основной программе. Пример 42. Операторы-функции BETR(X, Y, Z)=SQRT(X*X+Y*Y+Z*Z) Вычисляется модуль вектора по его координатам. RUND(X, N)—ANINT(X*10.**N)/10.**N Вещественное число округляется до п значащих цифр после запя- той. Эта функция полезна, если с округленными числами должны
7.2. Подпрограммы-функции 139 проводиться дальнейшие расчеты. Округление посредством спис- ка формата возможно только при выводе данных. LOGICAL IMPL, XI, Х2 IMPL(X1, Х2) = .NOT.XLOR.Х2 Этот оператор-функция выполняет операцию импликации, кото- рая в Фортране не предусмотрена. Пример 43. Расчет треугольника. Заданы длины трех сторон треугольника. Следует рассчитать углы с использованием теоремы косинусов и вывести заданные длины сторон и рассчитанные значения углов. Эту задачу решает следующая программа. PROGRAM DREI WINKEL(X,Y,Z) х= 57.2958*ACOS((Y*Y+Z*Z-X*X)/(2.*Y*Z)) PRINT*, ‘А В С ALPHA BETA GAMMA* 10 READ(*,*> END=20) А, В, С ALPHA = WINKEL(А,В,С) ВЕТА = WINKEL(B,C,A) ш GAMMA = WINKEL(C,А,В) WRITE(*,1(6F8.2)' ) А,В»С, ALPHA, BETA, GAMMA GOTO 10 20 END Теорема косинусов записана в виде оператора-функции. В программе этот оператор вызывается трижды. Оператор-функ- ция рассчитывает угол, который противоположен стороне, ука- занной в списке параметров на первом месте. 7.2.2. Внешние функции Внешняя функция имеет следующую структуру: [тип] FUNCTION имя ([список формальных параметров]) операторы [имя = выражение] [RETURN] операторы имя — выражение END Здесь: тип — ключевое слово, задающее тип имени функции; при неявном задании типа оно отсутствует; имя — имя функции; формальный параметр —переменная или имя другой подпрограммы. Имя массива следует записывать без индек- сов, имя другой подпрограммы—без списка параметров (см. п. 7.4.2). Если список пустой, что бывает в исключительных случаях, то нужно записывать пустые круглые скобки. 6*
140 7. Подпрограммы. Операторы спецификаций Внешняя функция начинается с операторов спецификаций (если они необходимы), в которых должны быть описаны и элемен- ты списка параметров. Подробнее об описании массивов и величин текстового типа см. на стр. 145. Оператор имя = выражение должен встречаться по крайней мере один раз. Посредством оператора RETURN происходит возврат в основ- ную программу. Этот оператор может встречаться многократно. Оператор END по действию аналогичен оператору RETURN. Он должен быть записан один раз в качестве последнего опера- тора подпрограммы. Параметры рекомендуется использовать только в качестве входных данных и не изменять их значения внутри подпрограммы. В противном случае при передаче параметров могут возникнуть нежелательные эффекты. Изменение параметра в подпрограмме влечет за собой изменение содержимого соответствующей ячейки памяти в основной программе (см. стр. 137). Пример 44. Внешние функции. Ниже приведены две подпрог- раммы-функции FUNCTION SUM(A, В, N) DIMENSION A(N), B(N) SUM = 0. 00 10 I = 1, N SUM = SUM + A(I)*B(I) 10 CONTINUE END .CHARACTER** FUNCTION ANTW(X) IF(X .EQ. 0.) THEN ANTW = 'ДА' ELSE ANTW = ’HET1 END IF END С помощью левой подпрограммы рассчитывается рассмотрен- ная ранее сумма произведений (см. пример 29 на стр. 111). Здесь количество слагаемых п передается посредством входного пара- метра. Во внешней функции недопустимо изменение значения этого параметра. Возможность внесения переменной N в опера- тор DIMENSION объясняется позднее на стр. 145. Правая подпрограмма использует в качестве входного пара- метра вещественное число. Значение функции имеет тип CHARA- CTER. Этот пример показывает возможность любого преобразо- вания (перекодирования) чисел в символы. Пример 45. Сглаживание данных прямой. По заданным п па- рам чисел Xj и У1 необходимо рассчитать методом наименьших квадратов коэффициенты а0 и а! «наилучшей» прямой y=a0+aiX. Коэффициенты а0 и aj могут быть определены из следующей
7.2. Подпрограммы-функции 141 системы линейных уравнений [4]: па„ + ( 2 х?)а!= 2 Уь \i= 1 / i= 1 (2 XiVo + f 2 xAaj= 2 Х1У1- \i= 1 / \i= 1 J i= 1 Система линейных уравнений решается с помощью определи- телей. Чтобы расширить задачу для расчета коэффициентов це- лой рациональной функции m-й степени, вышеприведенные суммы запишем в виде коэффициентов aik системы линейных уравнений: Теперь решение системы линейных уравнений можно записать в следующем виде: а0 = (Ьг • а22 — а12 • Ь2)/знаменатель, = (an-b2 — -а21)/знаменатель, знаменатель = (ап-а22—а12-а21). * ОП СГЛАЖИВАНИЕ ДАННЫХ ПРЯМОЙ PROGRAM AUSGL REAL NENN DIMENSION X(100), Y(100), C(100) * ВВОД ДАННЫХ DO 10 I = 1, 100 READ(*,*, END = 20) X(I)t Y(I) C(I) = 1. 10 CONTINUE ft 20 N = I - 1 All = N A12 = SUM(X, C, N) A21 = A12 A22 = SUM(X, X, N) Bl = SUM(Y, C, N) B2 = SUM(X, Y, N) NENN = A11*A22 - A12*A21 ZAO = B1*A22 - A12*B2 ZA1 = A11*B2 ~ B1*A21 A0 = ZAO/NENN Al = ZA1/NENN WRITE(*,100) A0, Al 100 FORMAT(10X, 'АО = '.E12.5, 9 Al * ‘» E12.5 END
142 7. Подпрограммы. Операторы спецификаций В приведенной программе вычисление различных сумм произведений выполняется с помощью подпрограммы из преды- дущего примера. Оператор С(1) = 1. в цикле DO 10 необходим для того, чтобы расчет коэффициентов а12 и Ьн можно было выразить через сумму произведений. При сглаживании исходных данных функцией более высокой степени коэффициенты aik системы линейных уравнений целесо- образно записывать в виде индексированных переменных и ре- шать систему уравнений посредством подпрограммы другого ви- да. Такие подпрограммы описываются в следующем разделе. 7.3. Подпрограммы общего вида Определение'. При использовании подпрограммы общего вида, кратко называемой SUBROUTINE, можно переда- вать любое количество величин как в подпрограмму, так и из нее. Подпрограммы такого вида используются, например, если выходными параметрами являются массивы. Подпрограммы SUBROUTINE часто применяются для решения задач методами линейной алгебры. Кроме того, подпрограммы этого вида часто используются для ввода-вывода данных или для вывода заранее установленных текстов. В последнем случае нет необходимости указывать параметры, так как подпрограмма не производит вы- числений. Подпрограмма SUBROUTINE начинается с оператора SUBROUTINE имя [(список формальных параметров)] Имя подпрограммы здесь типа не имеет. Формальные парамет- ры аналогичны параметрам внешних функций (см. стр. 139). Если список параметров пустой, то отсутствуют и круглые скобки. Список содержит как входные, так и выходные параметры, расположенные в произвольной последовательности. Формальные параметры должны быть определены при вызове подпрограммы. После выполнения подпрограммы в ячейках памяти, соответ- ствующих выходным параметрам, находятся рассчитанные зна- чения, которые могут использоваться в основной программе. В больших программах рекомендуется всегда предусматривать раздельные ячейки для входных и выходных параметров во избе- жание нежелательных эффектов, которые могут возникнуть при обмене параметрами (см. стр. 137). В остальном остаются в силе все правила, которые были сформулированы для внешних функ-
7.3. Подпрограммы общего вида 143 ций. В частности, внутри подпрограммы должен быть исполь- зован оператор RETURN. Вызов подпрограммы SUBROUTINE осуществляется следую- щим оператором: CALL имя [(список фактических параметров)] Это самостоятельный оператор, действие которого поясняет- ся ниже. Пример 46. Подпрограммы типа SUBROUTINE. Подпрограмма Действие SUBROUTINE PORE(R, PHI, X, Y) X = R*COS(PHI) Y == R*SIN(PHI) END Подпрограмма осуществляет пере* счет координат из полярной си- стемы в прямоугольную. Перемен- ные R и PHI являются входными параметрами, переменные X и Y — выходными параметрами. SUBROUTINE TAUSCH(X,Y) H = X X = Y Y = H END Подпрограмма осуществляет пере- становку содержимого двух ячеек. Здесь переменные X и Y являют- ся как входными, так и выход- ными параметрами. Пример 47. Упорядочение трех чисел (см. пример 21 на стр. 101). С помощью подпрограммы, приведенной в предыдущем при- мере, можно написать программу решения этой задачи в значи- тельно более компактном виде, чем это сделано в примере 21. Основная программа имеет вид: READ*, А, В, С IF(A .LE. В) GOTO 10 CALL TAUSCH(A.B) 10 IF(A .LE. C) GOTO 20 CALL TAUSCH(A,C) 20 IF(B .LE. C) GOTO 30 CALL TAl)SCH(B,C) 30 PRINT*, А, В, C END Пример 48. Генерирование случайных чисел. Случайные числа играют важную роль в статистике и в задачах моделирования. Подлинные случайные числа, удовлетворяющие всем требова-
144 7. Подпрограммы. Операторы спецификаций ниям теории вероятностей, не могут быть созданы при помощи программы на Фортране. Поэтому будем говорить о псевдослу- чайных числах. Существуют многочисленные методы их созда- ния. Во всех методах с помощью соответствующих вычислитель- ных операций из числа получают следующее псевдослучайное число zj+1. Затем иногда выбирают только определенные цифры рассчитанного числа. Здесь рассматривается метод конгруэнции, выгодно отличающийся от остальных методов тем, что в силу сво- ей простоты он обладает более высоким быстродействием. Исполь- зуется следующая формула: zj+1 = (а • Zj + b) mod i, причем а, b и i выбираются такими, чтобы всегда выполнялось неравенство: a *Zj 4" Ь «С Птах» где птах — самое большое целое число для используемой вычис- лительной машины. Ниже приведена подпрограмма, основанная на применении метода, описанного в [16]. В программе принято nmax:=:231. Иногда получаемое значение zj+1 делят на i, что обес- печивает генерацию случайных чисел в интервале между 0 и 1 (см. задачу 45 на стр. 157). С помощью приведенной здесь под- программы создаются случайные целые числа в наперед заданном интервале M^z^N. SUBROUTINE ZUF(Z1, Z, М, N) INTEGER Zl, Z, A, В DATA А, В, I / 3612, 5701, 566927 / * К = A * Zl + В Zl = MOD(K.I) L = N - M + 1 Z = M + MOD(Z1,L) % END Переменные M и N являются входными параметрами. Началь- ное значение Zl следует задавать только перед первым обраще- нием *. При каждом обращении создается новое случайное число Z, передающееся в основную программу. Переменная Z1 также попадает в основную программу и при следующем обращении используется в качестве входного параметра. Поэтому дан- ная подпрограмма построена как SUBROUTINE, а не как FUNCTION. * Часто существует возможность получения значения текущего времени и передачи его в программу. Время в секундах может использоваться в ка- честве начального случайного значения Z1.
7.3. Подпрограммы общего вида 145 Значения переменных М и N для некоторых типов игровых задач приведены в следующей таблице: Игра Двоичные решения Игральная кость Рулетка О 1 1 6 О 36 Использование массивов и величин типа CHARACTER в качестве параметров подпрограммы Границы индексных величин массивов в операторах специфи- каций основной программы должны указываться в виде целых констант. В операторах спецификаций подпрограмм при описании массивов разрешается использовать индексные выражения. Имеет место так называемое динамическое определение размеров. В этом случае при написании подпрограммы нет необходимости узна- вать точные значения максимальных границ индексных величин. Фактические границы индексных величин целесообразно переда- вать в подпрограмму, учитывая особенности расположения эле- ментов массивов в памяти, рассмотренные на стр. 111 и 137, и технику обмена параметрами. Этот метод защищает от ошибок, которые иногда бывает очень трудно найти (см. пример 49, ни- же). При использовании величин типа CHARACTER возникают в принципе те же проблемы, однако имеется простая возможность освободиться от них. Для этого в подпрограмме в качестве ука- зателя длины такой величины следует записать символ *. Тем са- мым длина, указанная в основной программе, переносится в под- программу. Пример: SUBROUTINE TEXT (STRING) CHARACTER STRING^*) операторы Пример 49. Матричное исчисление. Представленная здесь программа считывает две матрицы А и В и проверяет условие возможности их перемножения. Если условие выполняется, то они перемножаются, и печатаются все три матрицы.
146 7. Подпрограммы. Операторы спецификаций ОП•МАТРИЧНОЕ ИСЧИСЛЕНИЕ PROGRAM HPMATR ВВОД, УМНОЖЕНИЕ И ПЕЧАТЬ 1 МАТРИЦ PARAMETER(MMAX = 10, NMAX =10) DIMENSION A(MMAX.NMAX), B(MMAX,NMAX) 1 C(MMAX,NMAX) READ*, MA, NA, MB, NB CALL LIES(A, MMAX,NMAX,MA,NA) CALL LIES(B, MMAX,NMAX,MB,NB) IF(NA .NE. MB) GOTO 10 CALL MATRM(A,В,C,MMAX,NMAX,MA,NA, 1 MMAX,NMAX,MB,NB,MMAX,NMAX,MA,NB) WRITE(*,100) 100 FORMAT( //» МАТРИЦА A ) CALL DRUCK(A, MMAX,NMAX,MA,NA) WRITE(*,110) 110 FORMAT( //' МАТРИЦА В1) CALL DRUCK(B, MMAX,NMAX,MB,NB) WRITE(*,120) 120 FORMAT( //' МАТРИЦА С = A * B') CALL DRUCK(C, MMAX,NMAX,MA,NB) STOP 10 PRINT*, ‘УМНОЖЕНИЕ НЕВОЗМОЖНО1 END ПП ВВОДА, ПЕЧАТИ И УМНОЖЕНИЯ МАТРИЦ ВВОД МАТРИЦЫ SUBROUTINE LIES(A, MMAX, NMAX,M,N) DIMENSION A(MMAX,NMAX) DO 10 I = 1,M 10 READ*, (A(I,К), К = 1, N) END ПЕЧАТЬ МАТРИЦЫ SUBROUTINE DRUCK(A,MMAX,NMAX,M,N) DIMENSION A(MMAX.NMAX) DO 10 I = 1, M 10 WRITE(*, 100) (A(I,K), K= 1, N) 100 FORMAT(5G14.5) END УМНОЖЕНИЕ МАТРИЦ SUBROUTINE MATRM(A.B.C, • 1 МАМАХ,NAMAX,MA,NA,MBMAX,NBMAX, 2 MB,NB,MCMAX,NCMAX,MC,NC) DIMENSION A(МАМАХ,NAMAX), 1 B(MBMAX,NBMAX), C(MCMAX,NCMAX) DO 10 1= 1,MA DO 10 К = 1,NB C(I,K) = 0. DO 10 J = l.NA C(I,K) = C(I,K) + A(I,J) * B(J,K) 10 CONTINUE 1 END 7.4. Операторы спецификаций В подпрограммах могут использоваться несколько новых опе- раторов спецификаций. В таблице, приведенной на стр. 147, пере- числены ключевые слова для всех обсуждающихся в этой книге операторов спецификаций и даны краткие пояснения к этим операторам. Перечисленные операторы являются невыполняемы- ми. Они могут стоять в программе только перед первым выпол- няемым оператором. В каждой конкретной программе некоторые из перечисленных операторов или все они могут отсутствовать. 7.4.1. Операторы INTRINSIC и EXTERNAL Эти операторы следует использовать, если в списке факти- ческих параметров одной подпрограммы встречается имя другой подпрограммы. Благодаря этим операторам имена подпрограмм отличаются от имен переменных. Операторы имеют вид
7.4. Операторы спецификаций 147 INTRINSIC список имен стандартных функций EXTERNAL список имен подпрограмм, написанных пользователем Под стандартными функциями понимают только «математи- ческие» функции, приведенные в левой колонке таблицы, распо- ложенной на стр. 72. В списке оператора EXTERNAL нельзя указывать имена операторов-функций. В остальном оба рассмат- риваемых оператора имеют одинаковые действия. Рассматриваемый случай нельзя путать с частым случаем, когда фактическим параметром является выражение, содержащее вызов функции или являющееся им. Например, имя функции SQRT в операторе Y=SIN (SQRT(X)) не нужно описывать оператором INTRINSIC (см. стр. 138). Ключевые слова Пояснения к операторам INTEGER, REAL, DOUBLE PRECISION, COMPLEX, LOGICAL, CHARACTER Каждый из них содержит списки переменных, которые должны иметь указанный тип. См. разд. 5.2. IMPLICIT Присваивает переменным, начинающимся с ука- занных в списке букв, задаваемый тип. См. разд. 5.2. PARAMETER Присваивает значения константам. См. п. 5.6.1. DIMENSION Содержит список имен с указанием границ индексов. См. разд. 6.1. INTRINSIC Содержит список стандартных функций, кото- рые выступают в качестве фактических пара- метров других подпрограмм. См. п. 7.4.1. EXTERNAL Содержит список написанных пользователем подпрограмм, которые выступают в качестве фактических параметров других подпрограмм. См. п. 7.4.1 COMMON Содержит список переменных, которые должны занимать в различных программных единицах одинаковые ячейки памяти. См. п. 7.4.2. EQUIVALENCE Содержит список переменных, которые должны занимать в данной программной единице одни и те же ячейки памяти. См п. 7.4.2.
148 7. Подпрограммы. Операторы спецификаций Рассмотрим пример, в котором необходимо использовать оператор INTRINSIC. Пусть имеется подпрограмма-функция FUNCTION SIMPS (А, В, FKT) ь для расчета определенного интеграла f (x)dx по формуле Симп- а сона для любой подынтегральной функции f(x). Тогда для рас- л чета интеграла SI = J sinx dx следует в основной программе о записать выполняемый оператор SI=SIMPS (0., PI, SIN) и невыполняемый оператор INTRINSIC SIN Благодаря последнему оператору вычислительная машина уз- нает, что SIN в списке фактических параметров первого из при- веденных операторов является именем функции, а не именем пе- ременной. Затронутый вопрос рассматривается дальше в задаче 43 на стр. 156. Следующий пример иллюстрирует применение рассматривае- мых операторов в уже обсуждавшейся задаче определения нуля функции методОхМ деления отрезка пополам (см. пример 25 на стр, 104). Пример 50. Определение нуля функции. Метод деления от- резка пополам (см. пример 8 на стр. 52) реализован здесь в виде подпрограммы. Вместо него можно было бы использовать метод Ньютона, однако тогда нужно было бы вычислять первую произ- водную функции. В методе, который рассматривается здесь, этого делать не нужно. В приведенной ниже программе значение функ- ции вычисляется отдельной подпрограммой. Вначале в основной программе определяются границы интер- вала, в котором находится корень. Значение одной границы по- лагается равным нулю (х^О). Значение второй границы х2 определяется по признаку противоположности знаков хг и х2. Единственным условием возможности использования метода де- ления отрезка пополам является требование, чтобы функция была всюду определена и непрерывна. Программа составлена в предположении, что при х=0 нуля нет. Поиск нуля прекра- щается, если в интервале — 106^х<306 нуль функции не об- наружен. Программа ищет только один нуль. Поиск всех ну- лей функции (за исключением целых рациональных функций) требует значительного усложнения программы.
7.4. Операторы спецификаций 149 FUNCTION XNULL(X1, Х2, F) Yl = F(X1) 10 X = 0.5 * (XI + X2) Y = F(X) IF( ABS(Y) ,LT. l.E-6) GOTO 20 IF(SIGN(1.,Y1) .EQ. SIGN(1.,Y)) TIEN XI = X ELSE X2 = X END IF GO TO 10 20 XNULL = X END уравнение Функции FUNCTION F(X) F = X*X + EXP(X) >2. END ОП ОПРЕДЕЛЕНИЕ НУЛЯ ФУНКЦИИ PROGRAM NULL2 EXTERNAL F НАЧАЛЫЫЕ ЗНАЧЕНИЯ XI - 0. Yl = F(X1) X2 = 0.1 FAKT = -1.2 ПРИБЛИЖЕНИЕ 10 Y2 = F(X2) IF(SIGN(1., Yl) .NE. SIGN(1.,Y2)) GOTO 40 X2 = FAKT * X2 IF(ABS(X2) .LT, 1.2 E6) GOTO 10 PRINT*, ' НУЛЬ ОТСУТСТВУЕТ* STOP РАСЧЕТ НУЛЯ 40 X2 = XNULL(0., X2, F) PRINT*, ' НУЛЬ = ‘, X2 END Подпрограмма-функция F(X), описывающая анализируемую функцию f(x), вызывается как из основной программы, так и из подпрограммы XNULL. Центральным оператором в основной программе является оператор с меткой 40. 7.4.2. Операторы COMMON и EQUIVALENCE Доступ нескольких программных единиц к одним и тем же данным можно организовать не только посредством списка пара- метров, но и при помощи оператора COMMON. Этот оператор нагляднее длинного списка параметров. За счет аппаратной под- держки он обеспечивает быстрый доступ к данным. Оператором COMMON создается область в оперативной памяти, являющаяся общей для нескольких программных единиц. Наборы данных, рассматриваемые в гл. 8, находятся в этой области, однако они определены только во время выполнения программы. Оператор COMMON имеет два вида: COMMON список COMMON /имя/ список /имя/ список ... Оператор первого вида описывает неименованный список, оператор второго вида — именованные списки. Имена перемен-
150 7. Подпрограммы. Операторы спецификаций ных, указанных в списке, являются локальными. Для массивов, включенных в список, должны быть указаны имена граничных значений индексных величин. Следовательно, оператор COMMON заменяет оператор DIMENSION. Имена блоков COMMON, т. е. имена следующих за ними списков, являются глобальными (см. стр. 136). В программе может быть несколько операторов COMMON. Они действуют как один «длинный» оператор. Оператор COMMON должен присутствовать по крайней мере в двух программных еди- ницах. Элементы списков во всех программных единицах прирав- ниваются поэлементно (разумеется, только в тех программных единицах, в которых присутствуют операторы COMMON с этими списками). Такие элементы будут записаны в одни и те же ячейки памяти. Поэтому соответствующие переменные должны иметь одинаковый тип и иметь равные длины, хотя они и находятся в разных списках. (У этого правила есть исключение, которое здесь не рассматривается.) Не допускается смешение в списке переменных типа CHARACTER с переменными других типов. Другими словами, если в списке есть текстовые переменные, то переменных другого типа в данном списке быть не может. Вели- чины из списков формальных параметров подпрограмм и из списков операторов EQUIVALENCE входить в список оператора COMMON не могут. Пример: Пусть первая программная единица содержит опера- тор COMMON A, N, С(3) Вторая программная единица содержит оператор COMMON ALPHA, М, X, Y, Z Тогда будет установлена эквивалентность между следующими переменными: A=ALPHA, N=M, С(1)=Х, C(2) = Y, C(3)=Z, т. е. им будут отведены одинаковые ячейки памяти. Если третья программная единица содержит только переменную L, которая должна быть приравнена переменным М и N, то соответствующий список оператора COMMON должен содержать 5 элементов, как и списки приведенных ранее операторов. Для оставшихся пере- менных нужно использовать фиктивные имена. Итак, третья программная единица должна содержать в нашем примере такой оператор: COMMON ХАХ, L, YAY(3) Пример 51. Сглаживание измеренных значений. Здесь рас- сматривается простой способ сглаживания измеренных величин
7.4. Операторы спецификаций 151 Yi при помощи формулы ~ У1—1 ~4~ ^У1 ~4~ у 1+1 У1— 4 Первое и последнее значения сглаживанию не подлежат. Сглаживание остальных значений должно производиться в под- программе. В подпрограмму следует передавать только значение индексной величины i. Измеренные значения yj размещаются в матрице, состоящей из двух столбцов. В первом столбце запи- саны значения аргумента х, во втором—значения функции у. В основной программе должно производиться считывание изме- ренных значений, вызываться подпрограмма сглаживания, печа- таться значения х, а также несглаженные и сглаженные значе- ния у. Основная программа и подпрограмма имеют вид * ОП СГЛАЖИВАНИЕ И СПИСОК А PROGRAM HPGL DIMENSION YG(50) COMMON M, XY(50,2) * * ВВОД РЕЗУЛЬТАТОВ ИЗМЕРЕНИЙ В БЛОК COMMON DO 10 I = 1, 50 10 READ (*,*, END = 20) XY(I,1), XY(I,2) 20 M = 1-Г * * ПЕРВОЕ И ПОСЛЕДНЕЕ ЗНАМЕНИЯ YG(1) = XY(1,2) YG(M) = XY(M,2) * СГЛАЖИВАНИЕ ЗНАМЕНИЙ DO 30 I = 2, M-l 30 YG(I) = UPGL(I) WRITE(*, 100) (XY(I,1), 1 XY(I,2), YG(I), I = 1, M) 100 FORMAT(F20.2, 2F10.5) END * ПП СГЛАЖИВАНИЕ л FUNCTION UPGL(I) COMMON'M, XY(50, 2) UPGL = 0.25 * (XY(1-1,2) + 1 2.*XY(J,2) + XY(I+1,2)) END Обратите внимание на то, что в операторе с меткой 30, распо- ложенном в основной программе, переменная I слева от символа присваивания используется в качестве индексной величины, а справа — в качестве фактического параметра. Если в операторе COMMON описываются именованные блоки, то соответствующие списки имеют имена. Этот оператор может использоваться в следующих случаях: 1. В различных программных единицах нужно использовать разные подмножества всех переменных. 2. Для величин типа CHARACTER нужно выделить отдельный блок.
152 7. Подпрограммы. Операторы спецификаций 3. Величинам, находящимся в списке оператора COMMON, начальные значения Рис. 37. Взаимодействие программных единиц с блоками COMMON. нельзя присвоить посредством оператора DATA. Для этих целей имеется подпро- грамма BLOCK DATA, рассматриваемая в разд. 7.5. В этом случае следует использо- вать оператор COMMON, описывающий име- нованный блок. Пример: Три следующих оператора име- ют действие, аналогичное операторам, при- веденным в примере на стр. 150: В первой программной единице COMMON/ BLK1/N/BLK2/A, С(3) Во второй программной единице COMMON/BLK1/M/BLK2/ALPHA, X, Y, Z В третьей программной единице COMMON/ BLK1/L Пример 52. Блоки COMMON. На рис. 37 показано действие следующих операторов COMMON: В основной программе (ОП): CHARACTERS) TEXT COMMON М, N, А (100) COMMON/BLKA/TEXT В первой подпрограмме (ПП1): CHARACTERS LISTE COMMON MUI, NU1, В (100) COMA\ON/BLKA/LISTE/BLKB/X, Y, Z Во второй подпрограмме (ПП2): COMMON MU2, NU2, C(100) COMMON/BLKB/U, V, W Оператор EQUIVALENCE Посредством оператора EQUIVALENCE можно организовать размещение в одной ячейке памяти переменных с различными именами, действующих в одной программной единице. Этот опе- ратор обычно используют тогда, когда в различных частях про- граммной единицы указаны различные массивы, подлежащие совмещению. На этом операторе мы долго останавливаться не будем, так как его применение часто является источником ошибок, тем более что экономия памяти сегодня не столь актуальна, как раньше. Оператор имеет вид EQUIVALENCE (список), (список), ...
7.4. Операторы спецификаций 153 Величины, входящие в список, запоминаются в одних и тех же ячейках памяти. Пример: Если в начале программы некоторая переменная на- зывается именем PHI, а затем она по ошибке многократно назы- вается именем PSI, то такую путаницу в именах можно устра- нить оператором EQUIVALENCE (PHI, PSI) Если нужно совместить массивы, то в список вносятся пере- менные с индексом. Индексные величины представляются в виде констант. Оператор EQUIVALENCE имеет тогда следующее дей- ствие: приравнивает массивы целиком, причем указанные ин- дексированные переменные выступают в качестве координат урав- нивания, т. е. исходя из элементов с такими значениями индекс- ных величин приравниваются все остальные элементы массивов. Пример: Пусть записаны следующие операторы: DIMENSION А(5), В(3), С(2) EQUIVALENCE (А(5), В(3), С(2)) Тогда будет установлено следующее соответствие между эле- массивов: ментами А(1) А(2) А(3) А(4) А(5) = В(1) = В(2)=С(1) = В(3)=С(2) Ячейки, соответствующие элементам А(1) и А(2), разумеется, тоже находятся в распоряжении всех частей данной программной единицы. Оператор EQUIVALENCE (А(1), В(1)), (А(4), С(1)) при том же операторе описания размерностей массивов установит следующее соответствие между элементами массивов: А(1)=В(1) А(2)=В(2) А(3)=В(3) А(4)=С(1) А(5)=С(2) Такое соответствие целесообразно устанавливать в том случае, если массив А используется только в одной части программы, а массивы В и С — только в другой части. Благодаря использо- ванию этого оператора экономится 50% ячеек памяти.
154 7. Подпрограммы. Операторы спецификаций 7.5. Подпрограмма BLOCK DATA Переменным, не упомянутым в именованном блоке, можно присвоить начальные численные значения посредством оператора DATA, рассмотренного в п. 5.6.1. Элементам именованного блока начальные значения могут быть присвоены только с помощью следующей подпрограммы: BLOCK DATA [имя] операторы END Имя подпрограммы необходимо указывать только в том слу- чае, если используется несколько подпрограмм BLOCK DATA. Эта подпрограмма может содержать только следующие опера- торы: оператор задания типа PARAMETER, DIMENSION, име- нованный COMMON, EQUIVALENCE, DATA. В простейшем случае эта подпрограмма содержит именован- ный COMMON и оператор DATA. Пример 53. Сглаживание данных. Измеренные значения здесь не вводятся, как это делается в примере 51 на стр. 150, а при- сваиваются подпрограммой BLOCK DATA. Доглаживание результатов измерений BLOCK DATA COMMON /MESSW/ M, XY(50,2) DATA M, ((XY(I,K), K=l,2), 1=1,5) 1 / 5, 1.1,, 2,, 5., 3., 9., 4., 15., 5., 20. / END PROGRAM HPGL DIMENSION YG(50) COMMON /MESSW/ M, XY(50,2) * * ПЕРВОЕ И ПОСЛЕДНЕЕ ЗНАЧЕНИЯ YG(1) = XY(I,2) YG(M) = XY(M,2) * СГЛАЖЕННЫЕ ЗНАЧЕНИЯ DO 30 1=2, M-l 30 YG(I) = UPGL(I) WRITER, 100) <XY(1,1), 1 XY(I,2), YG(I), I = 1, M) 100 F0RMAT(F20.2, 2F10.5) END 7.6. Задачи 39. Запоминание. Имеются две переменные: одна в основной программе, другая во внешней подпрограмме-функции. При каких предположениях им отводятся одни и те же ячейки памяти?
7.6. Задачи 155 а) Обе переменные имеют одинаковые имена. б) Обе переменные имеют разные имена. 40. Случайные числа. Что делает и какую цель преследует нижеследующая программа? Указание: см. пример 48 на стр. 143. PROGRAM HPZU INTEGER А(0:9), 8(0:9) DATA В, J / 10*0, 17 / * DO 10 I = 0, 9 10 A(I) = I * DO 20 1=1, 1000 CALL ZUF(J, K, 0, 9) B(K) = B(K) + 1 20 CONTINUE WRITE(*, 1(1015)’) A, В END 41. Функция скачков. а) Следует написать подпрограмму, которая для входного значения х определяет значение функции скачков, приведенной на рис. 38. Указание: при х=0, +1, ±2,... значение функции у равно 0. Рис. 38. Функция скачков. б) Следует написать программу, которая вводит значения х и выводит значения х и у. 42. Корень третьей степени из комплексного числа. Выражение на Фортране Z**0.33333 дает для комплексного Z только одно значение (для к=0). Однако известно, что корень n-й степени имеет п различных значений. Нужно составить программу расчета всех корней для п=3. Следует организовать ввод вещественной и мнимой частей (а и Ь) комплексного числа. Сочетание значений исходных данных а=Ь=0 нужно положить в основу прекраще- ния вычислений. После ввода каждой пары а и b программа долж- на рассчитывать и печатать три значения корня в виде их компо- нент. У казание: z= а+jb= г • е^; 1/1= где k = 0, 1, 2.
156 7. Подпрограммы. Операторы спецификаций Преобразование комплексного числа из алгебраической формы в показательную следует производить посредством двух подпро- грамм. См. задачу 23 на стр. 108 и пример 46 на стр. 143. 43. Таблица функции и ее интегральной функции. а) . Следует написать подпрограмму-функцию, которая рас- считывает по формуле Симпсона значение определенного инте- грала для любой интегрируемой функции в интервале значений аргумента [а, Ь]. Функция представляется посредством уравне- ния. Значение определенного интеграла рассчитывается по сле- дующей формуле: ь J f (х) dx = у (у0 + 4У1 + 2у2 + 4у3 Н-Н 4уп_! + уп). а Указание: Интегрирование следует начинать с трех значений ординат при шаге . Затем необходимо последовательно де- лить шаг пополам. При этом следует обратить внимание на то, что рассчитанные один раз значения ординат необходимо сохра- нять. Очевидно, что надо нарисовать схему образования выше- указанной суммы при непрерывном делении шага пополам. Значение интеграла предполагается найденным, если абсолют- ное значение относительной разности двух последовательно рассчитанных значений интеграла удовлетворяет следующему условию: < ю-\ б) С использованием этой подпрограммы следует написать основную программу, с помощью которой для любой интегрируе- мой функции, которая удовлетворяет указанным выше условиям и может быть представлена подпрограммой-функцией, рассчиты- вается и выводится таблица значений исходной функции, а также таблица значений проинтегрированной функции. Подлежат вы- воду границы значений аргумента xmin и хтах, а также величина шага Ах. Указание: Для каждого значения I (xj не нужно непосредст- xi венно рассчитывать значение интеграла I(Xj) = f(x)dx; сле- xmin дует рассчитывать сначала приращение xi AI(xJ = J f(x)dx, xi-i а затем значение I (Xi) = I (Xi_i) + AI (Xi).
7.6. Задачи 157 44. Сумма строк и столбцов матрицы. .а) Пусть в оперативной памяти находится матрица А, имеющая m строк и п столбцов (m, n<10). С помощью подпрограммы не- обходимо создать матрицу В с т+1 строками и п+1 столбцами. Первые шип строк и столбцов матриц А и В совпадают. Элемен- тами (ш+1)-й строки матрицы В являются соответствующие суммы чисел столбцов, а элементами (п+1)-го столбца матрицы В — соответствующие суммы строк матрицы А. б) В основной программе следует прочитать матрицу А и с помощью вышеуказанной подпрограммы образовать матрицу В. Затем необходимо вывести матрицу В. Ввод-вывод можно ор- ганизовать с помощью подпрограммы, рассмотренной в примере 49 на стр. 145. 45. Моделирование очереди. Следующая простая модель опи- сывает, например, очередь лыжников на канатный подъемник. Применительно к средствам связи или к вычислительной технике она описывает обращения к устройству или отказы в работе устройств. Число обращений к устройству в единицу времени является случайной величиной. С помощью распределения Пуассона можно найти вероятность р того, что в единицу времени поступает п за- просов или к очереди добавляется п элементов [4]: р(п, ДТвх)=^е-'1, где р=1/ДТвх. Здесь АТВХ — время, в течение которого добав- ляется в среднем один элемент. В дальнейшем нас интересует вероятность того, что добавится не более п элементов. Эта веро- ятность рассчитывается по формуле F(n, АТВХ)= 2 Р(п, ЛТВХ). 1= о Так, например F(2, 3) означает вероятность того, что в единицу времени добавляется 0, 1 или 2 элемента, если в среднем один элемент прибывает за временной интервал в три единицы. Функцию F (п, АТВХ) следует рассчитывать в подпрограмме. Входным параметром является ДТВХ. Подпрограмма должна вычислять значения функции для n=0, 1, 2, 3, 4, 5. (Этих зна- чений достаточно, так как ДТВХ^1.) Фактическое обращение имитируется в основной программе путем создания случайных чисел. Для этого следует так изме- нить подпрограмму в примере 48 на стр. 143, чтобы случайные числа генерировались в интервале 0^z< 1. Для каждой еди- ницы времени следует вырабатывать случайное число. Если z<F(0, ДТВХ), то не прибывает ни одного элемента. Если zCF(l, ДТВХ), то прибывает один элемент.
158 8. Обработка наборов данных Если z^F(2, ДТВХ), то прибывают два элемента. Если Z>F(5, ДТВХ), то прибывает шесть элементов. Таким образом, организуется очередь. С целью упрощения следует сокращать очередь так, чтобы к концу каждого временного интервала 0<ДТвых=С10 обслуживал- ся ровно один элемент. (Здесь также можно учесть распределение вероятностей.) Требуется вывести таблицу, в которой для времен к-ДТвых (к=1, 2, . . . 100) указывается соответствующая длина очереди. Следует вывести пять двойных строк по 20 значений. В верхней строке должны находиться значения к, а в нижней строке — соответствующие длины очередей. Нужно считать, что входные величины ДТВХ и ДТВЫХ представлены в виде целых чисел. Примечание: Если ДТВХ<ДТВЫХ, то возникает постоянно ра- стущая очередь. Даже в теоретически сложном предельном случае ДТВХ=ДТВЫХ может возникнуть постоянно возрастающая оче- редь, это зависит от значения ДТ. 8. ОБРАБОТКА НАБОРОВ ДАННЫХ Эта глава является продолжением п. 5.6.2. Предполагается, что читателю известен материал, изложенный на стр. 83—85. В данной главе, кроме описания соответствующих операторов Фортрана, приведены только некоторые простые примеры. Воп- росы организации наборов данных рассмотрены в специальной литературе [18, 191. К трем важным характеристикам наборов данных относятся следующие: 1. Метод доступа (последовательный, прямой). 2. Способ внесения изменений (включение и удаление элемен- тов набора). 3. Распределение памяти. Как и для качественных характеристик программы (см. п. 4.2.2), здесь также зачастую исключена одновременная оптимизация по второму и третьему пунктам. В набор данных рекомендуется за- писывать протокол, который содержит, например, такие сведения о наборе, как количество и длина записей. Этот протокол часто помещают в первую запись. Кроме рассмотренных здесь опера- торов Фортрана, в некоторых вычислительных машинах для ор- ганизации и использования наборов данных дополнительно при- меняют команды языка управления заданиями (см. п. 2.2.2).
8.1, Открытие и закрытие наборов данных 159 8.1. Открытие и закрытие наборов данных Перед использованием набора данных его нужно открыть в программе специальным оператором. Этот оператор описывает свойства набора, а также устанавливает связь между именем на- бора, под которым этот набор записан в периферийной памяти, и номером набора, по которому к нему будет организовано об- ращение в программе. Рекомендуется не выбирать в качестве номеров наборов те постоянно установленные номера, которые закреплены за устройствами ввода-вывода. Если это все же будет сделано, то в программе по этому номеру можно будет обратиться только к набору данных и нельзя будет воспользоваться той опе- рацией ввода-вывода, к которой обычно обращаются по этому номеру. Оператор открытия набора данных имеет следующий вид: OPEN (список) Список содержит следующие элементы: [UNIT =] и, где и — целое положительное выражение, обозначающее номер внешнего набора данных. Если [UNIT =] от- сутствует, то первым элементом писка должно быть выражение и. FILE = выражение типа CHARACTER. Это выражение означает имя набора, выбираемое согласно правилам выбора имен, приведенным на стр. 65. Данное имя является глобальным. 'NEW' STATUS =aold, 'SCRATCH' Нижеследующие параметры являются также выражениями типа CHARACTER. Они должны иметь одно из указанных зна- чений. — для набора данных, который в этой программе вновь заводится. Его имени могло ранее не существовать. — для набора данных, который уже нахо- дится в периферийной памяти. — для набора данных, который при за- крытии уничтожается. Он мог не иметь имени, т. е. мог отсутствовать элемент списка FILE =. ['SEQUENTIAL' — для набора с последовательным досту- ACCESS = < пом. ('DIRECT' —для набора с прямым доступом. Вид до- ступа устанавливается при первом об- ращении и больше не может изменяться. FORM _ J 'FORMATTED' —форматированный набор, “‘ ('UNFORMATTED' — неформатированный набор. RECL — положительное целое выражение. Обозначает длину каждой записи в на- боре с прямым доступом (длины всех за-
160 8, Обработка наборов данных писей одинаковы). Для форматирован- ных данных длина указывается в сим- волах (байтах). Для неформатированных данных — в единицах, зависящих от транслятора. Для наборов с последовательным доступом в команде управ- ления можно указать, является ли запись фиксированной длины или она может быть переменной длины. Могут быть указаны и другие элементы списка. Элементы списков могут отсутствовать, за исключением двух первых и последнего из перечисленных выше. Тогда операционная система сама выбирает значения отсутствующих параметров. Пример: OPEN (UNIT = 10, FILE = 'KUNDEN', STATUS = 'OLD', 1 ACCESS = 'DIRECT', FORM ='UNFORMATTED', RECL = 44) Уже сформированному набору данных 'KUNDEN' присваивается номер 10. Набор является неформатированным с прямым досту- пом и имеет длину записи, равную 44 байт. OPEN (UNIT = 20, STATUS ='SCRATCH', 1 ACCESS = 'SEQUENTIAL', FORM ='UNFORMATTED') Набор с номером 20 является временным и неформатированным с последовательным доступом. Закрытие набора данных осуществляется только тогда, когда в программе выполняется одно из следующих действий: 1. Организуется новый набор, из которого затем будет счи- тываться информация. 2. Набор со статусом 'OLD' или 'NEW' должен быть уничто- жен. 3. В программе должно измениться соответствие между номе- ром и именем набора. По окончании работы программы автоматически закрываются все наборы, т. е. отменяется соответствие между их именами и номерами. Если набор имеет статус SCRATCH, то он еще и унич- тожается. Оператор закрытия набора имеет вид CLOSE (список) Список содержит следующие элементы: [UNIT = ] и —этот элемент аналогичен соответствующему элементу в списке оператора OPEN, STATUS — J 'KEEP' —набор сохраняется, 'DELETE' — набор уничтожается.
8.3. Чтение и запись 161 Пример: CLOSE (10, STATUS='DELETE') Набор 'KUNDEN' из предыдущего примера уничтожается. 8.2. Операторы для наборов данных с последовательным доступом Рассматриваемые здесь операторы являются историческими пережитками тех времен, когда использовались в основном маг- нитные ленты. Из-за краткости эти операторы еще и сегодня охотно используются программистами. Действия двух первых операторов пересекаются с действием оператора CLOSE. Эти действия выполняются автоматически по окончании работы про- граммы. Если они выполняются внутри программы, то не упразд- няется соответствие между именем и номером набора. Целое вы- ражение и представляет номер набора, аналогично и в опера- торах OPEN и CLOSE. Оператор ENDFILE и записывает в набор метку EOF. Этот оператор следует применять, например, в том случае, если в той же самой программе органи- зуется новый набор с последовательным доступом и с него не- посредственно после создания должна считываться информация. Оператор REWIND и возвращает набор к началу. Оператор используется в тех же слу- чаях, что и оператор ENDFILE. BACKSPACE u набор возвращается на одну запись назад. Если необходимо воз- вратиться на п записей назад, то следует применить этот опера- тор п раз. Для продвижения набора вперед на одну запись необходимо применить оператор READ без списка ввода-вывода. 8.3. Чтение и запись Для чтения и записи данных применяют операторы READ и WRITE, рассмотренные в п. 5.6.2. В качестве переменной и сле- дует использовать номер набора, определенный оператором OPEN. В набор данных с последовательным доступом записывается «еле-
162 8. Обработка наборов данных дующая» запись. При использовании набора с прямым доступом следует указывать в списке управления элемент REC = целое положительное выражение Указанное выражение означает номер следующей переноси- мой записи. DO 20 I = 1, 10 20 READ (10, REC = 2*1) LISTE (I) Из набора № 10 считываются записи с номерами 2, 4, 6,. . . .. ., 20 и записываются в массив LISTE. Зачастую список в опе- раторах ввода-вывода имеет тип CHARACTER. Перепись осу- ществляется без формата. 8.4. Запрос Нижеследующим оператором могут запрашиваться некоторые данные о наборе. Он может записываться в одном из следующих видов: INQUIRE ([UNIT = J и, список) INQUIRE (FILE = 'имя', список) Оператор первого вида осуществляет запрос номера, оператор второго вида — запрос имени. Элементы списка имеют вид ключевое слово = переменная В переменной записывается та информация, которая была ука- зана в списке оператора OPEN (в соответствующем ключевом слове). Переменная должна иметь тот же тип, что и соответст- вующие данные в операторе OPEN. Ключевые слова ACCESS FORM, RECL имеют то же значение, что и в операторе OPEN. Вместо ключевых слов UNIT, FILE и STATUS нужно указывать следующие ключевые слова: NUMBER = целая переменная —поставляет неиз- вестный номер на- бора; NAME = переменная типа CHARACTER —поставляет неиз- вестное имя набо- ра; EXIST = логическая переменная —отвечает на во- прос: имеется ли набор? Имеются и другие ключевые слова. Пример: LOGICAL STAT CHARACTER * 15 ZUGR, FORMA INQUIRE (FILE = 'KUNDEN', NUMBER = NR,
8.5. Примеры 163 1 EXIST = STAT, ACCESS = ZUGR, FORM = FORMA, 1 RECL = L) Для набора данных KUNDEN, описанного в примере на стр. 160, после выполнения оператора INQUIRE переменным будут присвоены следующие значения: NR = 10 STAT-T ZUGR='DIRECT' FORMA=='UNFORMATTED' L-44 8.5. Примеры При работе с дисплеем или печатающим устройством запись соответствует одной строке. В общем случае при работе с периферийной памятью в целях экономии машинного времени целесообразно объединять несколько строк и обмениваться с внешней памятью посредством одного оператора ввода-вывода. Эта большая единица в Фортране также называется «записью», так как она переносится с помощью одного оператора ввода-вы- вода. Ради ясности^ говорят о «записи на диске» и соответст- венно о «записи на магнитной ленте». Последняя запись в коммер- ческой обработке данных обычно называется «блоком». Пример 54. Структура набора данных с последовательным доступом. * ОРГАНИЗАЦИЯ БЛОКОВ НА ЛЕНТЕ PROGRAM BAND ’ CHARACTER*80 BL0CK(20), LETZT DATA LETZT / 1 ’ / 0PEN(UNIT=10; FILE=1NAMEN1 ,STATUS=1 NEW’ , 1 ACCESS^’SEQUENTIAL1,FORM=* UNFORMATTED’) * DO 20 1=1, 100 DO 10 J = 1, 20 READ(*,*, END = 30) BLOCK(J) 10 CONTINUE WRITE(IO) I, BLOCK 20 CONTINUE * ФОРМИРОВАНИЕ ПОСЛЕДНЕГО БЛОКА 30 DO 40 К = J, 20 BLOCK(K) = LETZT 40 CONTINUE WRITE(IO) I, BLOCK ENDFILE 10 * ЧТЕНИЕ И ПЕЧАТЬ REWIND 10 DO 50. L = 1, I READ(IO) NR, BLOCK WRITER, ’(14 / (2X,A80))‘) NR, BLOCK 50 CONTINUE END
164 8. Обработка наборов данных Рассматриваемый набор состоит максимум из 2000 строк. С помощью цикла DO 10 последовательно считываются со стан- дартного устройства группы в 20 строк. Они помещаются в мас- сив BLOCK. Каждый элемент массива BLOCK содержит 80 сим- волов. Затем оператором WRITE (10) этот массив бесформатно переписывается в виде записи (блока) на магнитную ленту в на- бор № 10. Первым элементом в каждом блоке является его номер (адрес блока), который нужен для многих целей. Для дальнейшего использования набора необходимо знать структуру записей, т. е. понимать, что каждый блок начинается с целого числа, за которым записаны величины типа CHARACTER в формате А80. См. оператор WRITE, расположенный перед оператором, поме- ченным меткой 50. Желательно, чтобы все блоки имели одинаковую длину. Для этого введен цикл DO 40. В данном случае последний блок дополняется символами пробела. В конце программы набор за- * 55, ОБЪЕДИНЕНИЕ ДВУХ НАБОРОВ * CHARACTER*80 STSATZ,BSATZ,KSTA*6,KBEW*6 OPEN(UNIT- 1,FILE='STAMM',STATUS='OLD', 1 ACCESS»'SEQUENTIAL',FORM»'FORMATTED') OPEN(UNIT= 2,FILE='BEW',STATUS»'OLD', 1 ACCESS»'SEQUENTIAL',FORM=ZFORMATTED') REWIND 1 REWIND 2 KSTA = '0' * * ЧТЕНИЕ И ВВОД ОБНОВЛЯЕМОЙ ЗАПИСИ. * ЕСЛИ ОСНОВНАЯ ЗАПИСЬ ПРОЧИТАНА ' 10 READC2, '(А80)< ,END=50) BSATZ KBEW = BSATZ(1:6) I FCKSTA ,NE. KBEW) GOTO 20 WRITEC*,'C6X,A74)') BSATZC7:80) GOTO 10 * * ПОИСК ОСНОВНОЙ ЗАПИСИ 20 READCI, '(A80)', END=40) STSATZ KSTA = STSATZ(1: 6) IFCKSTA .LT. KBEW) GOTO 28 * * ВВОД ОСНОВНОЙ И ПЕРВОЙ ОБНОВЛЯЕМОЙ * ЗАПИСЕЙ НОВОЙ ГРУППЫ IFCKSTA .GT. KBEW) GOTO 30 PRINT*, STSATZ WRITEC*, 'C6X, A74)') BSATZC7j80) GOTO 10 * ВЫХОД ПО ОШИБКЕ 30 WRITEC*, 'C/A2B / A20)z) 1 'ОСНОВНОЙ НАБОР HE ПОЛНЫЙ ИЛИ ОШИБКИ В УПОРЯДОЧЕНИИ' GOTO 60 40 WRITEC*, 'С/А24 )') 'ОСНОВНОЙ НАБОР НЕПОЛНЫЙ" GOTO 60 50 WRITEC*, 'С/ А12 )") "КОНЕЦ ОБНОВЛЯЕМОГО НАБОРА' 60 WRITEC*, '</ А16 )') 'КОНЕЦ ВЫЧИСЛЕНИЙ' END
8.6. Задачи 165 крывается оператором ENDFILE, возвращается к началу опе- ратором REWIND и с целью контроля считывается и выводится. Пример 55. Объединение двух наборов. Постановка задачи приве- дена в примере 12 на стр. 59. Программа приведена на стр. 164. Номера клиентов, записанные как величины типа CHARAC- TER, переносятся в виде подстрок символов в ячейки с именами KBEW и KSTA. Сравнение номеров клиентов может произво- диться и в этой форме. Пример 56. Прямой доступ. * прямой доступ * PROGRAM DIREKT INTEGER SATZNR CHARACTER TEXT*4O OPEN(UNIT=10,FILE='KUNDEN’,STATUS=’NEWr, 1 ACCESS^'DIRECT',RECL=44,FORM='UNFORMATTED’) * DO 10 1=1, 100 READ(*,*, END=20) KDNR, TEXT WRITE(10, REC=I) KDNR, TEXT 10 CONTINUE * 20 I - I -1 WRITER, 100) I 100 FORMAT('НАБОР СОДЕРЖИТ',13,' ЗАПИСЕЙ’) CLOSE(UNIT=EO,STATUS='KEEP') * OPEN(UNIT=10,FILE=‘KUNDEN',STATUS='OLD', 1 ACCESS^'DIRECT',RECL=44,FORM='UNFORMATTED') 30 READ(*,*, END=40) SATZNR IF(SATZNR .GT. I) THEN PRINT*, 'ЭТА ЗАПИСЬ ОТСУТСТВУЕТ1 ELSE READ(10, REC=SATZNR) KDNR, TEXT WRITE(*, '(15, A40)') KDNR, TEXT END IF * GOTO 30 40 END В первой части программы еще раз показана структура набора данных. Каждая запись состоит из целого числа (которое не является адресом записи) и текста, содержащего 40 символов. По- средством чтения набор данных закрывается и затем снова откры- вается. Далее читается запись по произвольно задаваемому адре- су. Эта запись выводится на стандартное устройство вывода. 8.6. Задачи 46. Чтение набора данных. Данные, рассмотренные в примере 33 на стр. 117, находятся в неформатированном последовательном на- боре SORDAT. Он состоит максимум из 5 записей по 100 целых чисел в каждой записи.
166 8. Обработка наборов данных Следует заново составить начало упомянутой программы упорядочения так, чтобы произошел переход к оператору WRITER, 110)N. Если число имеющихся записей и длина последней из них не- известны, то можно поступить следующим образом. При созда- нии набора в конце последней записи (перед символами EOF) записывается определенное число (здесь 10 000), которое является также признаком конца набора. (Это число можно использовать, так как в данном случае имеется только 499 значений данных.) Записи читаются до тех пор, пока не будут обнаружены символы EOF. Теперь нужно определить количество элементов в послед- ней записи. Здесь это достигается путем опроса элементов записи на целое число 10 000. 47. Сложение матриц. Большие матрицы не умещаются в оперативной памяти вычислительной машины. Поэтому каждую строку помещают в набор в виде записи. Пусть в таком виде ме- тодом последовательного доступа бесформатно записаны две матрицы. Первая запись каждого набора содержит число строк и столбцов той матрицы, которая размещена в этом наборе. Обе матрицы нужно считывать по строкам. Из каждой пары строк исходных матриц нужно образовать соответствующую строку матрицы-суммы С=А + В. Эту строку следует поместить в качестве записи в третий набор. 48. Объединение двух наборов. Основной и обновляемый на- боры, рассмотренные в примере 55 на стр. 165 и в примере 12 на стр. 59, нужно объединить в третий набор. Этот набор должен содержать для каждого клиента сначала основную запись, а за- тем все обновляемые записи. 49. Последовательный поиск. Следует: создать набор из 10 за- писей с последовательным доступом. Каждая запись должна состоять из имени (максимум 20 символов) и одного числа, содержащего максимум 10 символов (например, номер телефона). Обе величины должны иметь тип CHARACTER. Они должны быть расположены в левой части полей с форматами А20 и А10. Далее, последовательно вводя произвольные имена, нужно проверять, имеется ли каждое из них в наборе. Для этого необ- ходимо после ввода каждого имени читать все записи (так как весь набор не помещается в оперативной памяти). Если такое имя имеется, то нужно печатать найденное имя и его формат. В противном случае следует печатать фразу «имя отсутствует». 50. Двоичный поиск. Этот метод играет важную роль при поиске нужной информации. Он используется в том случае, если в набо- ре с прямым доступом упорядоченные управляющие элементы не совпадают с текущими цифровыми адресами записей. Здесь для упрощения делается следующее предположение: известны самый маленький и самый большой адреса записей (MIN и МАХ).
9. Тестирование программ 167 Управляющие элементы являются положительными целыми чис- лами. Искомые записи содержатся в наборе. Сущность метода: По адресам MIN и МАХ рассчитывается средний адрес MITTEL как среднее арифметическое, имеющее целый тип. Считывается запись с таким адресом. Находящийся в этой записи управляющий элемент NRDAT сравнивается с управляющим элементом NRSUCH искомой записи. Если NRDATCNRSUCH, то искомая запись расположена в первой части набора. В противном случае она расположена во второй части набора. Выбранная часть снова делится пополам и считы- вается ее средняя запись. От такого деления текущего интервала на две части этот метод получил свое не очень удачное название. Пример: NRSUCH = 215 Адреса записей 12 3 NRDAT 147 188 210 1-й 3-й 2-й шаг поиска i * * 4 5 6 7 8 9 10 211 213 215 220 225 226 228 На первом шаге поиска MITTEL=(l + 10)/2=5 Последняя запись в этом простом методе может быть не най- дена. Поэтому управляющий элемент NRDAT последней записи должен быть больше управляющего элемента NRSUCH любой из исходных записей. Пусть описанный выше набор считывается так же, как и в примере 56 на стр. 165. Нужно написать программу двоичного поиска. 9. ТЕСТИРОВАНИЕ ПРОГРАММ Методы, посредством которых может доказываться коррект- ность программ, называются методами верификации. Они на- ходятся пока в стадии развития. Поэтому сегодня чаще всего пользуются «косвенными доказательствами»: проверяют, содер- жит ли программа ошибки. Не исключено, что при таком «тести- ровании» часть ошибок может быть не обнаружена. Новички часто недооценивают затраты труда и времени на тестирование. Обыч- но тестирование занимает примерно 50% общего времени, затра- чиваемого на разработку программы. Кроме того, начинающий пользователь часто винит в обнаруженной им ошибке вычисли- тельную машину. Обычно это происходит из-за того, что поиск причины ошибки ведется неинтенсивно. Следует учесть, что сбои в работе вычислительной машины как в аппаратной, так и в программной частях крайне редки. Обычно они сказываются и на других программах.
168 9. Тестирование программ Если программа транслируется первый раз, то вычислитель- ной машиной выводится более или менее представительный спи- сок формальных ошибок (см. п. 4.2.3). Однако данный список может не содержать всех ошибок. Часто вызывает ошибку (наве- денная ошибка) многочисленная последовательность других ошибок, исправление которых автоматически приводит к лик- видации наведенной ошибки. В процессе выполнения программы также могут обнаруживаться дополнительные ошибки, которые обычно бывают связаны с неверными исходными данными. Чаще всего это происходит при форматном вводе. При выполнении программы может произойти, например, деление на нуль. Наиболее тяжелая часть тестирования начинается тогда, коь да ни в процессе трансляции, ни в процессе выполнения про- граммы ошибок не обнаруживается. Минимальное требование, предъявляемое в этом случае, состоит в том, чтобы выполняемая программа давала результаты, сравнимые с результатами, полу- ченными на калькуляторе или посредством измерений (см. пункт 3 стр. 29). К полному тестированию предъявляются значительно более строгие требования. В этом случае необходимо столько раз пропускать программу с тестами, сколько требуется для того, чтобы в каждой программной единице работали все ветви. Кроме того, должна испытываться реакция вычислительной ма- шины на критические входные данные (например, на равенство нулю одной или всех входных величин). Часто в результате та- кого испытания формируются указания, нужные для пользова- теля. Составление данных, необходимых для такого тестирова- ния, требует большого труда. В качестве стратегии тестирования могут использоваться методы, описанные в п. 4.2.1: метод «сверху вниз» и метод «центрального оператора». В первом случае прежде всего тестируется основная программа. При этом значения, поставляе- мые подпрограммами, присваиваются, например, операторами DATA. Если первыми тестируются подпрограммы, то для каж- дой из них пишется простая основная программа, которая осу- ществляет вызов проверяемой подпрограммы, передает ей необ- ходимые входные параметры и принимает выходные параметры. Можно также на время тестирования оформить подпрограмму в виде основной программы. В этой связи встает вопрос об опти- мальных размерах программных единиц. С одной стороны, их выбирают так, чтобы ошибку было просто локализовать, а те- стирование занимало мало времени. Для этого программная единица должна быть небольшой. С другой стороны, в этом слу- чае растет вероятность ошибки в интерфейсе (см. ниже) вследст- вие роста числа программных единиц. Практика показывает, что средняя длина программной единицы примерно равна 100 опе- раторам.
9. Тестирование программ 169 Если существует отклонение между контрольными значения- ми и значениями, выданными вычислительной машиной, то это может произойти по следующим причинам: 1. Ошибочными являются контрольные значения. 2. Имеется «математическая» ошибка (см. пункт 1 на стр. 29). 3. В больших программах могут возникать значительные ошибки округления. 4. Существуют ошибки в программе. Ниже рассматривается только четвертый случай. При ошибке или выводятся неверные значения, или прекращаются вычисле- ния (чаще всего с сообщением об ошибке), или задача не доходит до конца (в этом случае она автоматически снимается со счета по достижении заранее установленного времени). В последнем слу- чае ошибка, как правило, кроется в неправильно организован- ных циклах или в плохой сходимости применяемых численных методов. Требуется много опыта и интуиции, чтобы по реакции вычислительной машины сделать правильный вывод о виде и ме- сте ошибки в программе. Виды ошибок В п. 4.2.3 уже обсуждались следующие виды ошибок: 1. Ошибки в написаниях формул. Например, вместо цифры О записана буква О. Во избежание таких ошибок иногда эту цифру записывают как 0. Такое различие между цифрами и буквами не нормировано. 2. Ошибки инициализации. 3. Ошибки в циклах. Это очень распространенный вид ошибок. Он возникает во многих коварных вариантах. К перечисленным видам ошибок можно добавить следующие: 1. Ошибочный ввод данных. Эта ошибка тривиальна, однако часто допускается. 2. Ошибки переполнения и работа с очень малыми числами (см. стр. 75). В связи с этим следует принять во внимание, что один оператор Фортрана выполняется несколькими машинными командами, и все промежуточные результаты играют свою роль. В общем случае переполнение при обработке вещественных чисел указывается машиной, а при обработке целых чисел не указы- вается. 3. Ошибки в индексах. В этом случае текущее значение ин- декса переходит указанные границы. Вследствие этого программа попадает в области памяти, не предназначенные для данного массива. Поэтому ошибка выявляется совсем в другом месте программы. Элементы массива располагаются в памяти не в той последовательности, как это полагал программист (см. стр. 111). 7 № 2295
170 9. Тестирование программ 4. Ошибки в интерфейсе. Неверная последовательность пара- метров при вызове подпрограммы. Ошибка в динамическом рас- пределении памяти (см. стр. 145). Локализация ошибок Прежде всего устанавливается программная единица, в кото- рой находится ошибка. Этой цели служит упоминавшаяся ранее стратегия тестирования. С целью поиска ошибки в программной единице записывают на критических местах (например, в развет- влениях и выходах из циклов) дополнительные операторы STOP с метками или операторы PRINT для вывода значений и сообще- ний. Эти операторы позволяют узнать, до какого места выпол- нение программы протекает нормально и какие значения имеют интересующие величины в контролируемых точках. Для ускорения поиска ошибок во всех вычислительных ма- шинах имеются нестандартизированные операторы. Они поме- щаются в начале программы и приводят, например, к следую- щему: 1. Осуществляется вывод списка значений выбранных пере- менных внутри определенной части программы. Такое тестирова- ние называют трассировкой. Трассировку имеет смысл произ- водить только тогда, когда может быть определено происхож- дение каждого числа. 2. Выводится список меток тех операторов, которые факти- чески достигаются в разветвлениях. 3. Производится проверка соблюдения границ индексов мас- сивов. Этим заканчивается данная книга. Автор ставил своей целью не только помочь успешному решению задач, встречающихся в повседневной практике, но и сделать так, чтобы работа достав- ляла радость творческой деятельности.
ПРИЛОЖЕНИЕ Extended Binary Coded Decimal Interchange Code (EBCDIC) КОДИРОВАНИЕ СИМВОЛОВ Номер ^ита (зонная часть) Номер Зита (цифровая часть) 0 1 2 3 4 5 6 7 8 9 A В c D E F 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 пробел & — { } 0 0 0000 / а j A J 1 1 0001 ь k S в к s 2 2 0010 с I t c L T 3 3 0011 Управляющие символы d m u D M и 4 4 0100 е n V E N V 5 5 otoi f 0 w F 0 w 6 6 0110 9 P X G p X 7 7 0111 h q У H Q Y 8 8 юоо i r z I R z 9 9 1001 [ • А 101 о • $ * В 1011 < * % /а) С 1100 ( ) г D 1101 + 5 > = Е 1110 OR NOT ? // F 1111 Нумерация бит соответствует вычислительным машинам США: 0, 1,2, 3, 4, 5, 6, 7 (в немецком стандарте принята обратная нумерация: 8, 7, 6, 5, 4, 3, 2, 1). Пример кодирования: Символ Представление шестнадцатеричное десятичное двоичное 5 F5 245 ПН 0101 L D3 2Н HOI ООН Пробел 40 64 0100 0000 7*
РЕШЕНИЕ ЗАДАЧ К главе 2 1. В цифровой вычислительной машине числа представляются цифрами, а в аналоговой вычислительной машине — посредством физических величин. 2. Два состояния весьма просто реализуются в технических устройствах. Благодаря этому получаются недорогие и помехо- устойчивые схемы. 3. При методе прямого доступа время доступа не зависит от физического расположения информации в запоминающем уст- ройстве. Другой метод доступа называется последовательным. 4. Центральный процессор состоит из следующих блоков: ввода, вывода, управления, арифметического, а также постоян- ной и оперативной памяти. 5. Управляющая'программа операционной системы состоит из стартовой программы, программы управления задачами и прог- раммы управления заданиями. 6. Компилятор обеспечивает перед выполнением трансляцию всей программы и ее запоминание. Интерпретатор транслирует и затем выполняет каждый оператор в отдельности. 7. а) служебная программа (утилита); б) программа управления данными; в) программное управление заданиями. 8. Фортран, Бейсик, Паскаль. 9. В режиме разделения времени с центральным процессором работают по очереди несколько пользователей. В режиме муль- типрограммной обработки выполняются различные программы, находящиеся в периферийной памяти, согласно установленной последовательности приоритетов. 10. а) микросхема, обычно—это кремниевая миниатюрная пластинка с 106 электронными элементами;
Решение задач 173 б) маленькая магнитная пластинка; в) программное обеспечение, находящееся в постоянной памяти; г) блок управления и арифметический блок; д) память, из которой можно только читать информацию; чаще всего эта память предназначена для операционной системы; е) в программировании это понятие используется для обозначения ячейки памяти; имя переменной; ж) та часть большой вычислительной машины, которая подключена к центральному процессору и управляющим уст- ройствам, служащая для выполнения программ ввода-вывода; з) наименьшая адресуемая часть словоориентированной памяти; и) совокупность операторов (макро-команд) для вызова программ операционной системы; к) концепция программного обеспечения, допускающая коллективное использование оперативной и периферийной памяти; л) программы для решения определенного круга за- дач на ЭВМ. К главе 4 11. 12. Рис. 39. Логическая схема нахождения наибольшего общего делителя, (начало) ] Ввод N, К ] --- | BIN0=11 /Цикл\ 1 = 1,К 1 I ...... Bl NO =BIN0*(N-I+1)/I I ~ Конец I цикла / / Печать N,*K, BIN О J Конец Рис. 40. Логическая схема рас- чета биномиального коэффициен- та (счетный цикл),
174 Решение задач 13. Рис. 41. Логическая схема пересчета координат из прямоугольной системы в полярную,
Решение задач 175 14. Рис. 42. Логическая схема расчета кусочно-непрерывной функции.
176 Решение задач 15. 16. Рис. 43. Логическая схема поиска экстремальных значений функции. Рис. 44. Логическая схема расче- та плотности нормального распре- деления и интегральной функции.
Решение задач 177 К главе 5 18. п. ZA = (B/A)* *SQRT(A*A - В*В) ZB = (А**.5 + В**.333333)/С**.25 ZC = А/(1,+В/(2.+С/(3.+0))) ZD = ATAN(SQRT(1. - Х*Х)/Х) ZE = .5*AL0G((1+Х)/(1-Х)) ZF = (C*C*H)/(L«*5 * (ЕХР(С*Н/(К*Т*1 ZG = A*SQRT((P0*M/V0)*(2.*KA/(KA-l 1 ((Р1/Р0)**(2./КА) - (Р1/Р0)**((КА+ 1 9. IF(l-e лог. выражение) THEN 1 . IF-о л ok END IF IF(2.-e лог. выражение) THEN 2 . IF-^лок ELSE 2. Else-блок. END IF следующий оператор * БИНОМИАЛЬНЫЕ КОЭФФИЦИЕНТЫ PROGRAM BINO INTEGER BIN * READ*, N, К BIN = 1 DO 10 I = 1, К BIN = BIN * (N-I+l)/I 10 CONTINUE PRINT*, 'N =' , N, ' К =’, END | К, 'БИН. К0ЭФ. = ', BIN PROGRAM KONTRA LOGICAL XI, Х2, Yl, Y2, Z PRINT*, 'XI X2 Z‘ DO 10 I = 0, 1 DO 10 J = 0, 1 XI = I .EQ. 1 X2 = J • EQ. 1 Yl = (• NOT. XI) .OR. X2 Y2 = X2 .OR. (.NOT. xi) z = (.NOT. Yl) .OR. Y2 WRITE(* » '(3L3)’) XI , X2, Z 10 CONTINUE END XI X2 Z )) - 1.)) F F F T T T )) * T F T )/KA))) T T T ПРИ ВСЕХ КОМБИНАЦИЯХ ЗНАЧЕНИЙ АРГУМЕНТОВ XI И Х2 ПЕРЕМЕННАЯ Z ПРИНИМАЕТ ЗНАЧЕНИЕ “ИСТИНА ”. 20. 1=11 J = Ю К = -1 L = О М = 60 21 . PROGRAM GGT PRINT*, 'M.N ВВОД1 READ*, M, N Ml = M N1 = N 10 IF(N .GT. M) GOTO 20 H = M M = N N = H 20 IF(M .EQ. 0) GOTO 30 IR = MOD(N,M) N = M M = IR GOTO 10 30 PRINT*, *M =', Ml, ’ N =*, 1 Nl, ' GGT =', N END
178 Решение задач 25. ПЕРЕВОД ИЗ ПРЯМОУГОЛЬНОЙ СИСТЕМЫ КООРДИНАТ В ПОЛЯРНУЮ ПЕРВАЯ ЧАСТЬ ПРОГРАММЫ REPO1 ' ВВЕДИТЕ КООРДИНАТЫ X И У' ' X = Y = О ОЗНАЧАЕТ КОНЕЦ ВЫЧИСЛЕНИЙ1 PROGRAM PRINT*, PRINT*, PRINT* PRINT*, 1 X GRAD = 180./3.14159 ВТОРАЯ ЧАСТЬ ПРОГРАММЫ 10 READ*, X, Y R = SQRT(X*X + Y*Y) IF(X .EQ. 0) THEN IF(Y .EQ. 0) STOP IF(Y .GT. 0) THEN PHI = 90. ELSE PHI = -90. END IF ELSE PHI = GRAD*ATAN(Y/X) I F( X .LT. 0) PHI = 180. + PHI END IF PRINT*, X, Y, PHI, R GOTO 10 END PHI И’ ВЕРСИЯ ВТОРОЙ ЧАСТИ ПРОГРАММЫ с АРИФМЕТИЧЕСКИМ IF 10 READ*, X, Y R = SQRT(X*X + Y*Y) IF(X) 50, 20, 50 20 IF(Y) 30, 80, 40 30 PHI = -90. GOTO 70 40 PHI = 90. GOTO 70 50 PHI = GRAD*ATAN(Y/X) IF(X) 60, 80, 70 60 PHI = 180. + PHI 70 PRINT*,X, Y, PHI, R GOTO 10- 80 END 24. РАСЧЕТ КУСОЧНО-НЕПРЕРЫВНОЙ ФУНКЦИИ PROGRAM KNICK READ*, А, В, C T = 4.*A + 2.*C Al = B/A AO = A1*(2.*A+C) 10 READ*, X IF(X .EQ. 0) STOP IF(X .LT 0) THEN VORZ = -1 ELSE VORZ = 1. END IF ПРИВЕДЕНИЕ ПЕРИОДА XX = ABS(X) N - INI(XX/T) XX = XX - N*T ПРОДОЛЖЕНИЕ IF(XX .GT. (.5*T)) THEN XX = XX - .5*T VORZ = - VORZ END IF IF(XX .GT. (A+O) THEN Y = AO - A1*XX ELSE IF(XX .GT. A) THEN Y = В ELSE Y = A1*XX END IF Y = VORZ*Y PRINT*, X, Y GOTO 10 END
Решение задач 179 25. 26- РАСЧЕТ НОРМАЛЬНОГО РАСПРЕДЕЛЕНИЯ поиск экстремумов Функции PROGRAM EXTREM PRINT*. 'ВВЕДИТЕ ГРАНИЦЫ1, 1 1 И ШАГ1 PRINT* READ*, А, В, DX Yl = 1.Е10 Y2 = -1.Е1О DO 20 X = А, В, ОХ Y = COS(X) IF(Y1 .LE. Y) GOTO 10 XI « X Yl a Y 10 IF(Y2 .GE. Y) GOTO 20 X2 = X- Y2 = Y 20 CONTINUE PRINT*, 'MINIMUM X = ’, XI, 1 1 Y » Yl PRINT*, 'MAXIMUM X = 1, X2, •1 ' Y = ', Y2 END PROGRAM GVERT WRITE(*,100) 100 F0RMAT(///12X, 1 'РАСПРЕДЕЛЕНИЕ ГАУСС A1// 1 16X, 'X', 6X, 'PHI(X)', 6X, 'PSI(X)’/) FAKT = l./SQRT(6.2831853) DO 20 X = 0.,- 3., .1 PHI « FAKT*EXP(-0.5*X*X) I = 1 S = X A = X 10 D = 2*1 A « A*(-X*X*(D~1.))/(D*(D+l.)) S » S + A 1=1 + 1 IF(ABS(A) .GT. .l.E-6) GOTO 10 PSI = 100.*FAKT*S WRITE(*,110) X, PHI, PSI 110 F0RMAT(12X, F5.1, F12.5, F10.2) 20 CONTINUE ENO 27 a) WRITE(*, 100) N, В, C, D, E, I 100 FORMAT(I5, 3F10.5 / E10.5) uulOO 100.00000 100.00000 100.00000 ЛООООЕ+ОЗ 100 27 b) ЭТО ЗАДАНИЕ МОЖНО выполнить ЭЛЕГАНТНЕЕ, ПРИМЕНИВ ИНДЕКСИРОВАННЫЕ ПЕРЕМЕННЫЕ DATA Al,A2,A3,A4,A5,A6,A7,A8, 1 /1.E-6,1.E-5,1.E-4,1.E-3,1.E-2,.1,1.,10. 2 1.E3,l.E4,l.E5,l.Е6/ 28. DO 20 1= 10, 30, 10 ‘ 12 = I + 2 14=1+4 16 = I + 6 18 = I + 8 WRITE(*, 120) I, 12, 14, 16, 18 120 F0RMAT(3X, 515) 20 CONTINUE END A9,A10,А11,A12,A13 100. , WRITE< »,110 > Al,A2,A3,A4,A5,A6,A7,A8,A?,A10,A11 ,Al 2,Al 3 110 FORMATC2F10.5, 2E12.3) FND 0.00000 0.00001 0.100e-03 0.100B-02 0.01000 0.10000 0.100e + 0 1 0.1006 + 02 100.000001000.00000 0»100e+05 0.100e+06 **********
180 Решение задач к главе 6 PROGRAM DRU23 INTEGER А(3,5) DO 10 I = 1,3 DO 10 К = 1, 5 A(I,K) = 10*1 + 2*(K-1) 10 CONTINUE. WRITE(*,'(ЗХ,515)1) 1 ((A(I,К),K=1,5),1=1,3) END 50. РАСЧЕТ НАПРАВЛЯЮЩИХ УГЛОВ ВЕКТОРА, КОНЕЦ ДАННЫХ — ПРИ РАВЕНСТВЕ НУЛЮ ВСЕХ КОМПОНЕНТ PROGRAM VEKT DIMENSION А(З’), ALPHA(3), CS(3) * ПЕЧАТЬ ЗАГОЛОВКА И ВВОД WRITE(*,100) IGO FORHATf/// 15Х, ‘ КОМПОНЕНТЫ И НАПРАВЛЯЮЩИЕ УГЛЫ1. Г ВЕКТОРА’ 2 //НХ.'А(Х) АСУ) A(Z) 3 ' МОДУЛЬ ALPHA BETA GAMMA'/) 10 READ*, (А(I), I = 1,3) * РАСЧЕТ BE7R = SORT(A(])*A(1) + А(2)*А(2) + А(3)*А(3)) IF(BETR .EQ. 0) GOTO 60 DO 50 I = 1,3 CS(I) = A(I)/BETR ALPHA(I) = 57.2958 * ACOS(CS(I)) 50 CONTINUE * ВЫВОД РЕЗУЛЬТАТА WRITE(*,120) (A( I), I = 1,3), BETR, (ALPHA(I), I = 1,3) 120 F0RMAT(5X, 7F10.2) GOTO 10 60 END
31*. РЕШЕНИЕ УРАВНЕНИЯ ВАН-ДЕР-ВААЛЬС*. PROGRAM WAALS INTEGER Т(5), Р(5) DATA R, А, В / 8314., 4.23Е5, 0.0371 / * ПЕЧАТЬ ЗАГОЛОВКА 00 20 I = 1,5 Т(1) = 340 + 20*1 20 CONTINUE WRITE(*,110) А, В, (Т(1), 1=1,5) 110 F0RMAT(3X, 'ТАБЛИЦА ЗНАЧЕНИЙ УРАВНЕНИЯ \ 1 ’ВАН-ДЕР-ВААЛЬСА ДЛЯ РЕАЛЬНЫХ ГАЗОВ'// 2 6Х, 'А =', Е12.4, ' N*M**4', ЗХ, 3 'В =’, Е12.4, ' М**3'//9Х„ ‘Т/К’, 4 15, 416/ 5Х, 'V (ЛИТР)1, 5 10Х, ’ДАВЛЕНИЕ (БАР)’) * ЦИКЛ ПРОГРАММЫ DO 50 J = 20,300,20 V = 0.001 * REAL(J) * ЦИКЛ СТРОКИ * SCHLEIFE FUER EINE ZEILE DO 40 К = 1,5 Р(К) = NINT(1.Е-05 * (R*REAL(T(K))/ 1 (V-B) - A/(V*V))) IF((P(K) .LE. 0) .OR. 1 (P(K) .GT. 200)) P(K)=O 40 CONTINUE WRITE(*,120) J,(P(K), К = 1,5) 120 F0RMAT(5X, 616) 50 CONTINUE END
32. КВАДРАТИЧНАЯ интерполяция PROGRAM QUINT *‘ РАСЧЕТ ФУНКЦИИ DIMENSION Х(20), Y(20) DO 10 К = 1, 20 X(K) = К-10 Y(K) = 0.5*Х(К)*Х(К) - 20. 10 CONTINUE * ввод и поиск 20 READ*, XX IF((XX .LT.X(l)) .OR. 1 (XX.GE.X(19))) STOP DO 30 I = 1, 20 IF(X(I) .GT. XX) GOTO 40 30 CONTINUE 40 1=1-1 * ИНТЕРПОЛЯЦИЯ Bl = (,Y( I+1)-Y(T))/(X( I + 1)-X(I)) 21 = ( Y( I+2)-Y( 1 + 1))/(X( I «-2)-X( 1 + 1)) 22 = (Y(1+1)-Y(I))/(X(1+1)-X(I)) 82 = (Z1 - Z2)/(X(I+2) - X(I)) YY = Y(I) + B1*(XX-X(I)) + 1 B2*(XX-X(I))*(XX-X(I+1)) * ВЫВОД WRITER, '(2Я10.5)') XX, YY GOTO 20 END
182 Решение задач 33_. УПОРЯДОЧЕНИЕ ПРИ ЧТЕНИИ PROGRAM SORT3 INTEGER 2(500) READ*, 2(1) * ЦИКЛ ЧТЕНИЯ DO 40 1=2, 500 READ(*,*, END = 50) 2(1) * ЦИКЛ ПЕРЕСТАНОВКИ К = I 20 IF(Z(K) .GT. 2(К~1)) GOTO 40 30 Н = Z(K-l) Z(K-l) = 2(К) 2(К) = Н к = К - 1 IF(K .GT. 1) GOTO 20 •л 40 CONTINUE 50 I = I - 1 * ПЕЧАТЬ РЕЗУЛЬТАТА WRITE(*,110) I, 110 FORMAT(10X,15 /(1016)) END 35. ТРАНСПОНИРОВАНИЕ МАТРИЦЫ PROGRAM TRANS INTEGER A(10,10), B(10,10) READ*, M, N DO 10 I = 1, M READ*, (A(I,К), К = 1, N) WRITE(*,110) (A(I,K), К = 1, N) 10 CONTINUE DO 20 I = 1, M DO 20 К = 1, N B(К,I) = A(I,K) 20 CONTINUE DO 30 I = 1, N WRITE(*,110) (B(I,K), К = 1, M) 30 CONTINUE 110 FORMAT(10I5) END (2(0), J = 1,1) 34. PROGRAM GEW2 DIMENSION S(5), G(10,5), 0(10) DATA G /50*0. / DO 10 1=1,5 10 S(I) =2*1 * * ЦИКЛ ПРОГРАММЫ DO 40 J = 1, 10 D(J) = 10 * J * ЦИКЛ СТРОКИ DO 20 К « 1, 5 IF(S(K) .GE.’ .5 * D(J)) GOTO 40 G(J,K) = 0.2422 * 5(K) * (D(J) - S(K)) 20 CONTINUE 40 CONTINUE * ПЕЧАТЬ МАТРИЦЫ WRITER, 100) (S(I), 1 = 1,5) 100 FORMAT('1't 18X, ‘ВЕС 1 M ] 'СТАЛЬНОЙ ТРУБЫ (В НЬЮТОНАХ)'// 2 7Х, •’S/MM‘, 5F10.2 / 7Х, 'D/MM1) DO 50 I = 1, 10 50 WRITE(*, 110) D(I), (G(I,K),K=1,5) 110 FORMAT (IX, 6F10.2) A END
Решение задач 183 36. ПЛОХО ОБУСЛОВЛЕННАЯ СИСТЕМА УРАВНЕНИЙ PROGRAM ILL DIMENSION А(б,6), С(6,6), BETR(6) DATA BETR /6*0. / * ВВОД МАТРИЦЫ DO 10 I = 1,6 10 READ*, (A(I,K), K= 1, 6) * РАСЧЕТ МОДУЛЯ DO 30 1=1,6 DO 20 К = 1, 6 BETR(I) = BETR(I) + A(I,K)*A(I,K) 20 CONTINUE BETR(I) = SQRT(BETR(I)) 30 CONTINUE * РАСЧЕТ ЗНАЧЕНИЯ КОСИНУСА DO 50 1=1,5 DO 50 J = 1+1, 6 SUM = 0 * СКАЛЯРНОЕ ПРОИЗВЕДЕНИЕ DO 40 К = 1, 6 SUM = SUM + A(I,K)*A(J,K) 40 CONTINUE C(I,J) = SUM/(BETR(I)*BETR(J)) IF(ABS(C(I,J)) .LT. .92) GOTO 50 WRITE(*, 100) I, J, C(I,J) 100 FORMAT(' I =’, 12, ‘ J =', 12, ' COS =', F6.3) 50 CONTINUE END 37. ЦВЕТНОЙ КОД ДЛЯ ЭЛЕКТРИЧЕСКОГО СОПРОТИВЛЕНИЯ PROGRAM FARB2 CHARACTER FARB(0:9)*7, DREI(3)*7 INTEGER ZIFF(3), R, POT DATA FARB/‘ЧЕРНЫЙ ','КОРИЧН.'/КРАСНЫЙ* 'ОРАНЖ. ‘ЗЕЛЕНЫЙ’, 1 ’ГОЛУБОЙ’,'ФИОЛЕТ.'/СЕРЫЙ \*БЕЛЫЙ 7 10 PRINT* PRINT*, 'ВВЕДИТЕ ТРИ ЦВЕТА В ТРЕХ ЗАПИСЯХ* * ИНФОРМАЦИЯ ЗАПОМИНАЕТСЯ В ЛЕВОЙ ЧАСТИ ПОЛЯ ПО ФОРМАТУ А7 DO 30 1=1,3 READ(*, *, END = 40) DREI(I) DO 20 J = 0, 9 IF(DREI(I) .EQ. FARB(J)) GOTO 25 20 CONTINUE 25 ZIFF(I) = J 30 CONTINUE * РАСЧЕТ СОПРОТИВЛЕНИЯ POT = 10 ** ZIFF(3) R = (1O*ZIFF(1) + ZIFF(2))*P0T WRITE(*, 100) DREI, R 100 F0RMAT(5X, 3A7, ' СООТВЕТСТВУЕТ ’ 18, ’ ОМ*) GOTO 10 ’ ’ 40 END В строке 4 программы FARB2 допущена опечатка. Должно быть DATA FARB / 'ЧЕРНЫЙ 'КОРИЧН.', 'КРАСНЫЙ', 'ОРАНЖ/, 'ЖЕЛТ. ', 'ЗЕЛЕНЫЙ',
184 Решение задач 38. ФОРМИРОВАНИЕ ИЗОГРАММЫ ОБОЗНАЧЕНИЯ СМ. В ПРИМЕРЕ 40 PROGRAM ISO2 INTEGER Z(57) REAL XACHS(13) DATA DDX, DDY / .21167, .10583 / PRINT*, ' ИЗОГРАММА ФУНКЦИИ1, 1 ' Z = =.5 * (9. + X**X - Y**Y) + 0 6‘ PRINT*, 1 ОСЬ X НАПРАВЛЕНА ВНИЗ1 PRINT* A XACHS(l) = -3. DO 10 I = 2, 13 10 XACHS(I) = XACHS(I-l) + .5 J = 1 * ЦИКЛ ПРОГРАММЫ DO 30 X = -3., 3., DDX I = 1 * ЦИКЛ СТРОКИ DO 20 Y = -3., 3., DDY Z(I) = INT(.5 * (9. + X*X - Y*Y) + .6) 1 = 1 + 1 20 CONTINUE * IF(XACHS(J) .GT. (X+.l)) THEN * +.1 ИЗ-ЗА ОШИБОК ОКРУГЛЕНИЯ WRITE(*, '(10X, 5711)') Z ELSE WRITE(*, ’(F8.1, 2X, 5711)’) XACHS(J), Z J = J + 1 END IF * 30 CONTINUE END Пояснение: Для оси у устанавливается: DY=3—(—3)=6; 120мм масштаб -^-у- = 20 мм; расстояние между символами равно 2.1167 мм; DDY = 2:У<67 — = 0.10583; число печатаемых симво- лов — 57. К главе 7 39. Безразлично, какие имена имеют переменные. Им отво- дятся одни и те же ячейки памяти, когда они входят в списки параметров или указаны в операторе COMMON. 40. Это тестовая программа, с помощью которой устанавли- вается, подчиняются ли равномерному закону распределения числа, вырабатываемые подпрограммой ZUF и расположенные в интервале [0,9]. В первой строке печати выводятся числа от 0 до 9. Во второй строке — частота появления соответствующих случайных чисел.
Решение задач. 185 41. а) 41 . ъ) INTEGER FUNCTION SPRUNG<X> INTEGER GER, POS, REST * IF(X .NE. ANINTCX)) GOTO 10 SPRUNG = 0 RETURN * * on * 10 РАСЧЕТ ЗНАЧЕНИЯ ФУНКЦИИ СКАЧКОВ PROGRAM HPSPRU INTEGER SPRUNG, Y READ(*, », END = 20) X Y = SPRUNGCX) PRINT*, X, Y GOTO 10 10 N = INTCABS(X)) REST = M0D(N,2) IF<REST .EQ. 0) THEN GER = 1 ELSE GER = -1 END IF IF(X .GT. 0> THEN POS = 1 ELSE POS = -1 END IF SPRUNG = GER * POS END 20 END 42.* ОП ИЗВЛЕЧЕНИЕ КУБИЧЕСКОГО КОРНЯ ИЗ КОМПЛЕКСНОГО ЧИСЛА PROGRAM WURZ REAL RE(0:2), IM(0:2) PRINT*, ' ВВЕДИТЕ ВЕЩЕСТВЕННУЮ И МНИМУЮ1 PRINT*, ' НАСТИ КОМПЛЕКСНОГО ЧИСЛА,' PRINT*, ' ПРОГРАММА РАССЧИТЫВАЕТ ТРИ КОРНЯ? PRINT*, ' А = В = О КОНЕЦ ВЫЧИСЛЕНИЙ.’ PRINT* * WRITE(*, 100) 100 FORMAT(22X, ‘ТРИ КОРНЯ КОМПЛЕКСНОГО ЧИСЛА1/ 1 5Х, ’К. ЧИСЛО', ИХ, '1.КОРЕНЬ' 9Х, 2 '2. КОРЕНЬ', 9Х, *3.КОРЕНЬ’/) ALPHA = 0.666667 * 3.14159 10 READ*, A, В CALL REPO(A, 8, R, PHI) IF(R .EQ. 0) GOTO 30 R = R *♦ .333333 PO = .333333 « PHI * ЦИКЛ ПО ТРЕМ КОРНЯМ DO 20 I = 0, 2 PHI = PO + I’ALPHA CALL PORE(R, PHI, RE(I), IM(I)) 20 CONTINUE WRITE(«, '(8F9.4)') A, B, (RE(I), jo end° 10 L№ 1 = 0>2) SUBROUTINE REPO(X, Y, R, PHI) PI = 3.14159 R = SQRT(X*X + Y*Y) IF(X) 50, 20, 50 20 IF(Y) 30, 80, 40 30 PHI = -.5 * PI GOTO 70 40 PHI = .5 * PI GOTO 70 * 50 PHI = ATAN(Y/X) IF(X) 60, 80, 70 60 PHI = PHI + PI 70 RETURN 80 PHI = 0.
43. а) ПП РАСЧЕТ ИНТЕГРАЛА ПО ФОРМУЛЕ СИМПСОНА С ПОСЛЕДОВАТЕЛЬНЫМ ДЕЛЕНИЕМ ШАГА ПОПОЛАМ 43. FUNCTION SIMPS(A, В, F) REAL INT * * ВЫЧИСЛЕНИЕ ПЕРВОГО ИНТЕГРАЛА Н = 0.5 * (В - А) N = 1 RAND = F(A) + F(B) Y2 = 0. Y4 = F(A+H). INT = 0.333333*H*(RAND + 4.*Y4) * ПОСЛЕДОВАТЕЛЬНОЕ ДЕЛЕНИЕ 10 H = 0.5 * H N = 2 * N Y2 = Y2 + Y4 Y4 = 0. X = A + H л DO 20 I = 1, N Y4 = Y4 + F(X) X = X + 2. * H 20 CONTINUE SIMPS = 0.33333*H*(RAND + 2.*Y2 + 4.*Y4) * ПРОВЕРКА УСЛОВИЯ ОКОНЧАНИЯ ВЫЧИСЛЕНИЙ EPS= ABS((INT-SIMPS)/SIMPS) INT = SIMPS IFfEPS .GT. l.E-06) GOTO 10 л END * УРАВНЕНИЕ ФУНКЦИИ FUNCTION FKT(X) FKT = .3 * X * X * END Ъ) ОП РАСЧЕТ ИНТЕГРАЛЬНОЙ ФУНКЦИИ I(X) от Функции f(x) PROGRAM HPSIMP REAL I EXTERNAL FKT * READ*, XMIN, XMAX, DX WRITE(*,1IO) 110 FORMATCr, 13X, ‘ТАБЛИЦА ФУНКЦИИ ’ / 1 10X, 1 И ЕЕ ИНТЕГРАЛЬНОЙ ФУНКЦИИ*// 2 14X, 'X', 6X, *F(X)', 7X, 'I(X)'/) ★ * ВЫЧИСЛЕНИЕ ПЕРВОГО ЗНАЧЕНИЯ * ХА = XMIN I = 0. Y = FKT(XA) WRITE(*, 120) XA, Y, I 120 FORMAT(10X, F6.2, 2F10.5) XB = XA + DX * * ЦИКЛ ТАБЛИЦЫ DO 10 XB = XB, XMAX, DX Y = FKT(XB) 1=1+ SIMPSfXA, XB, FKT) WRITE(*,120) XB, Y,1 XA = XB 10 CONTINUE END Решение задач
Решение задач 187 44. а) ЛП РАСЧЕТ СУММЫ СТРОК И СТОЛБЦОВ МАТРИЦЫ SUBROUTINE ZEIL(А,ММАХ,NMAX,М,N,В) DIMENSION A(MMAX,NMAX), B(MMAX,NMAX) * Формирование первой части матрицы в do ю I = 1, м DO 10 К = 1, N 10 В(1,К) = А(1,К) * СУММА СТРОК Ml = М + 1 Nl = N + 1 Л DO 20 I = 1, М B(I, N1) = 0. DO 20 К = 1, N В(I, Nl) = B(I, N1) + А(1, К) 20 CONTINUE 1* * СУММА СТОЛБЦОВ DO 30 К - 1, Nl В(М1, К) = 0. ‘ DO 30 I = 1, М В(М1, К) = В(М1, К) + В(1,К) 30 CONTINUE л END 44. Ъ) ОП РАСЧЕТА СУММЫ СТРОК И СТОЛБЦОВ МАТРИЦЫ PROGRAM HPZEIL PARAMETER(ММАХ = 10, NMAX = 10) DIMENSION A(MMAX,NMAX), B(MMAX,NMAX) READ*, M, N * N И M ДОЛЖНЫ БЫТЬ МЕНЬШЕ 10 CALL LIES(A,MMAX,NMAX,M,N) CALL ZEIL(A,MMAX,NMAX,M,N,B) A Ml = M + 1 Nl = N + 1 CALL DRUCK(B,MMAX,NMAX,M1,N1) END
188 Решение задач 45. ОП МОДЕЛИРОВАНИЕ ОЧЕРЕДИ PROGRAM WARTE INTEGER АВ, DRUCK, Т, TEIN, TAUS, Zl, КК(20), LL(20) REAL F(O:5) DATA L, К, T, Zl / О, О, 1, 23 READ*, TEIN, TAUS WRITE(*, 100) TEIN. TAUS 100 FORMAT(' ОЧЕРЕДЬ TBX * CALL POIS(TEIN, F) * DO 60 1=1,5 DRUCK = 0 DO 50 11=1, 20*TAUS CALL ZUF2(Z1, Z) * ВХОД DO 10 J = 0, 5 IF(Z ,LE. F(J)) THEN L = L + J GOTO 20 END IF 10 CONTINUE L = L + 6 20 AB = MOO(T, TAUS) IF(AB .NE. 0) GOTO 40 * ВЫХОД К = К + 1 DRUCK = DRUCK + 1 KK(DRUCK) = К IF(L .EQ. 0) GOTO 30 L = L - 1 . 30 LL(DRUCK) = L 40 T = T + 1 50 CONTINUE WRITE(*, 110) KK, LL 110 FORMATC’ К ’, 2014 / 1 ' L ' , 2014 /) 60 CONTINUE END = ’ , 13,' ТВЫХ =’, 13/) * ПП ОЧЕРЕДЬ * SUBROUTINE POIS(T, F) INTEGER T REAL MU, F(0:5) MU = l./REAL(T) P = EXP(-MU) F(0) xx P FAK = 1. E = P 10 DO 10 I x= 1, 5 FAK = FAK * I p x e * MU**I/FAK F(D = F(I-l) + p CONTINUE END SUBROUTINE ZUF2(Z1, Z) INTEGER Zl, A, В DATA А, В, I, RI J / 3612, 5701, 566927, 566927. I К = A * 71 + В Zl = MOD(K,I) Z = REAL(Z1)/RI END НЕРЕДЬ TBX = 5 ТВЫХ * 5 К 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 L 0 1 1 1 2 1 2 1 0 0 2 3 3 4 4 4 4 3 4 3 К 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 L 4 3 3 5 5 5 4 6 6 5 5 6 5 5 4 4 4 4 7 9 К 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 I. 8 8 9 10 10 9 10 10 9 9 11 10 9 9 9 8 8 8 8 7 К 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 L 6 5 4 3 2 1 2 1 1 1 1 0 1 0 1 1 2 2 2 1
Решение задач 189 К главе 8 4$. ЧТЕНИЕ НАБОРА ДАННЫХ PROGRAM SORT5 INTEGER А(500), В(100) OPEN(UNIТ=10, FILE=’SORDAT*,STATUS=1 OLD *, ACCESS3'SEQUENTIAL',FORM3'UNFORMATTED') * ЧТЕНИЕ НАБОРА I = 0, 4 READ(10, END =15) В DO 10 J = 1, 100 К = 100*1 + J A(K) 3 B(J) 10 CONTINUE * ПОСЛЕДНЯЯ ЗАПИСЬ 15 DO 20 J = 1, 100 К = 100*1 + J IF(B(J) .EQ. 10000) GOTO 25 A(K) = B(J) 20 CONTINUE 25 N = К - 1 WRITE(*,110) N 47. СЛОЖЕНИЕ МАТРИЦ. PROGRAM MATADD REAL A(100), B(100), C(100) * А, В, С ВЕКТОРЫ-СТРОКИ OPEN(UNIT=10,FILE3'MATA',STATUS='OLD’, 1 ACCESS3'SEQUENTIAL',FORM3'UNFORMATTED') 0PEN(UNIT=20,FILE3'MATB',STATUS='OLD', 1 ACCESS3'SEQUENTIAL',FORM3'UNFORMATTED') OPEN(UNIT=30,FILE='MATC',STATUS='NEW', 1 ACCESS3'SEQUENTIAL',FORM3'UNFORMATTED') * READ(IO) MA, NA READ(20) MB, NB IF((MA .NE. MB) .OR. (NA .NE. NB)) GOTO 30 WRITE(30) MA, NA * ЦИКЛ ПО ВСЕМ СТРОКАМ DO 20 I 3 1, MA READ(IO) (A(K), К 3 1, NA) READ(20) (B(K), К 3 1, NB) * ЦИКЛ ДЛЯ ОДНОЙ СТРОКИ DO 10 К 3 1, NA С(К) 3 А(К) + В(К) 10 CONTINUE WRITE(30) (С(К), К = 1, NA) WRITE(*, '(5G14.5)') (С(К), К 3 1, NA) 20 CONTINUE STOP 30 PRINT*, ’МАТРИЦЫ ИМЕЮТ РАЗНУЮ РАЗМЕРНОСТЬ1 END В строке 7 программы SORT5 допущена опечатка. Должно быть DO 10 1=0, 4
190 Решение задач 48 ОБЪЕДИНЕНИЕ ДВУХ НАБОРОВ PROGRAM MISCH2 СНARACТЕR*80 STSATZ, BSATZ, KSTA*'6, KBEW*6 OPEN(UNIT=10,FILE='STAMMI,STATUS='OLD', 1 ACCESS='SEQUENTIAL*,FORM='UNFORMATTED') OPEN(UNIT=20,FILE=*BEW',STATUS='OLD1, 1 ACCESS='SEQUENTIAL*,FORM=1 UNFORMATTED1) 0PEN(UNIT=30,FILE=*MISCH',STATUS='NEW, 1 ACCESS=1 SEQUENTIAL*,FORM='UNFORMATTED') * ЧТЕНИЕ REAO(IO) STSATZ KSTA = STSATZ(1:6) READ(20) BSATZ KBEW = BSATZ(1:6) * НАЧАЛО ЦИКЛА 10 IFCKSTA .LE. KBEW) THEN WRITE(30) STSATZ REAO(10, END = 20) STSATZ KSTA = STSATZ(1:6) ELSE WRITE(30) BSATZ READ(20, END = 40) BSATZ KBEW = BSATZ(1:6) END IF GOTO 10 * ОСТАТОК ОБНОВЛЯЕМОГО НАБОРА 20 WRITE(30) BSATZ DO 30 I = 1, 1000 READ(20, END = 60) BSATZ WRITE(30) BSATZ 30 CONTINUE * ОСТАТОК ОСНОВНОГО НАБОРА 40 WRITE(30) STSATZ DO 50 1=1, 1000 READ(10, END = 60) STSATZ WRITE(30) STSATZ 50 CONTINUE' 60 ENDFILE 30 REWIND 30 * ПЕЧАТЬ ОБЪЕДИНЕННОГО НАБОРА DO 70 1=1, 1000 READ(30, END = 80) STSATZ PRINT*, STSATZ 70 CONTINUE 80 PRINT*, ’КОНЕЦ1 END
Решение задач 191 49. ПОСЛЕДОВАТЕЛЬНЫЙ ПОИСК ЗАПИСЕЙ PROGRAM SSUCH CHARACTER*20 NAME, SUCH, NR*1O . OPEN(UNIT=10,FILE=* LISTE* ,STATUS=*NEW', 1 ACCESS=*SEQUENTIAL*,FORM=*UNFORMATTED1) * СОЗДАНИЕ НАБОРА * ввод по Форматам А2О и аю DO 10 I = 1, 10 READ*, NAME, NR WRITE(10) NAME, NR 10 CONTINUE ENDFILE 10 PRINT*, 1 ИМЯ ВВОДИТСЯ ПО ФОРМАТУ A20 В ЛЕВУЮ ЧАСТЬ ПОЛЯ1 20 REWIND 10 READ(*, *, END=60) SUCH DO 30 I = 1, 10 READ(10) NAME, NR IF(NAME .EQ. SUCH) GOTO 50 30 CONTINUE 40 PRINT*, ‘ИМЯ ОТСУТСТВУЕТ1 GOTO 20 50 PRINT*, NAME, NR GOTO 20 60 END 50. ДВОИЧНЫЙ ПОИСК ЗАПИСЕЙ PROGRAM BSUCH CHARACTER NAME*40 DATA MIN. MAX /1, 10/ OPEN(UNIT=10,FILE=* KUNDEN 1,STATUS= * OLD1, 1 ACCESS=*DIRECT*,RECL=44,F0RM=*UNFORMATTED’) PRINT*, 'ВВЕДИТЕ НОМЕР1 READ*, NRSUCH * 10 MITTEL = (MIN + MAX)/2 READ(10, REC = MITTEL) NRDAT, NAME IF(NRDAT .EQ. NRSUCH) GOTO 20 IF(NRDAT .LT. NRSUCH) THEN MIN = MITTEL ELSE MAX = MITTEL END IF GOTO 10 * 20 PRINT*, NRDAT, NAME END
ЛИТЕРАТУРА [1] ANSI ХЗ.9-1978 Programming Language FORTRAN. New York 1978. [2] Bauknecht K., Zehnder O. A.: Grundziige der Datenverarbeitung. Stuttgart 1983. [3] Becker J., u. a.: Numerische Mathematik fiir Ingenieure. Stuttgart 1977. [4| Branch W., Dreyer H. J., Haacke W.: Mathematik fiir Ingenieure. Stutt- gart 1985. [5] DIN 66 027, Programmiersprache FORTRAN. Berlin 1980. [6] DIN Taschenbiichner Nr. 25 und 125, Informationsverarbeitung 1 und 2. Berlin 1978. [7] Dworatschek S.: Grundlagen der Datenverarbeitung. Berlin 1977. [8J Hume J., Holt R.: Programming FORTRAN 77. Reston 1979. [9] IBM: Virtual Machine System Product: CMS Primer SC24-5236 New York 1982. [10] IBM: VS FORTRAN Application Programming: Guide SC26-3985 New York 1982. [11] Jordan W., Urban H.: Strukturierte Programmierung. Berlin 1978. [12] Kiebling I., Lowes M.: Programmierung mit FORTRAN 77. Stuttgart 1983. |13] Kimm R., u. a.: Einfiihrung in Software Engeneering. Berlin 1979. [14] Kohler H.: FORTRAN Trainer. Braunschweig 1983. [15] Lutz T.: Grundlagen der Datenverarbeitung. Berlin (IBM) 1980. 116] Meissner L. P., Organick E. L: FORTRAN 77. Reading 1982. [17] Nicolet F. L.: Informatik fiir Ingenieure. Berlin 1980. [18] Niemeyer G.: Dateiorganisation und-verarbeitung. Munchen 1975. [19] Schlageter G., Stucky W.: Datenbanksysteme. Stuttgart 1983. [20] Selder H.: Einfiihrung in die numerische Mathematik. Munchen 1979. [21] Singer F.: Programmieren in der Praxis. Stuttgart 1980. [22] Stetter F.: Softwaretechnologie. Mannheim 1981. [23] Wirth N.: Systematisches Programmieren. Stuttgart 1983. [Имеется перевод английского издания 1973 г.: Вирт Н. Систематическое программирование: Введение.— М.: Мир, 1977.] Литература, добавленная редактором перевода [24] Г. Катцан. Язык Фортран 77.— М.: Мир, 1982. [25] Д. Мак-Кракен, У. Дорн. Численные методы и программирование на Фортране.— М.: Мир, 1977. [26] Б. П. Демидович, И, А. Марон. Основы вычислительной математики.— М.: Наука, 1970. [27J Н. И. Данилина и др. Численные методы.— М.: Высшая школа, 1976.
СПИСОК ПРИМЕРОВ Для каждого примера, приведенного в тексте данной книги и представляющего собой, как правило, законченную программу, здесь по возможности разъяснена сущность задачи и указана поясняемая проблема техники программирования. 1. Операторы присваивания ............................35 2. Операторы ввода-вывода.............................36 3. Ручное тестирование программы по логической схеме. .45 4. Упорядочение трех чисел............................47 Логическая схема программы с разветвлениями 5. Таблица функций....................................48 Логическая схема программы с циклом 6. Сумма произведений.................................49 Конец набора данных 7. Таблица гиперболических функций....................50 Вложенные циклы 8. Нахождение нуля функции............................52 Этапы изготовления программы 9. Решение квадратного уравнения......................55 Логическая схема программы с разветвлениями и циклами 10. Численное дифференцирование.........................56 Итеративный цикл 11. Моменты профилей....................................58 Переключатель 12. Объединение двух наборов данных.....................59 Чередование групп 13. Арифметические выражения ...........................74 14. Логические выражения...............................76 15. Диалоговый режим....................................81 Управляемые списком операторы ввода-вывода 16. Вывод вещественных чисел............................89
194 Список, примеров 17. Коэффициент повторения и внутренние скобки ... 91 18. Таблица статистики ...............................93 Оператор FORMAT 19. Программирование разветвлений.....................98 20. Операторы DO. Логические переменные ..............99 21. Упорядочение трех чисел..........................101 Логический условный оператор 22. Таблица функций .................................101 Оператор DO 23. Сумма произведений...............................103 Конец набора данных 24. Таблица гиперболических функций..................104 Операторы DO и FORMAT 25. Нахождение нуля функции..........................104 Логический условный и расширенный логический опера- торы 26. Решение квадратного уравнения ...................104 Логический условный и расширенный логический опера- торы 27 Численное дифференцирование .....................106 Логический условный оператор 28. Моменты профилей.................................106 Оператор переключения 29. Вычисление суммы произведений....................111 Массивы 30. Вывод массивов...................................113 31. Схема Горнера....................................113 Массивы 32. Расчет веса одного метра стальной трубы..........115 Массивы 33. Упорядочение п чисел.............................117 Вложенные циклы и массивы 34. Перемножение матриц..............................118 Вложенные циклы и массивы 35. Текстовые выражения..............................120 36. Анализ текста . . .............................120 Обработка подстрок 37. Запись и чтение внутреннего набора данных .... 122 38. Цветной код для электрических сопротивлений .... 122 Обработка текста
Список примеров 195 39. Обработка записей различного формата...........124 40. Построение графика функции при помощи печатающего устройства.........................................126 Обработка текста 41. Изограмма.......................................130 Обработка текста 42. Операторы-функции..............................138 43. Расчет треугольника.............................139 Вызов оператора-функции 44. Внешние функции................................140 45. Сглаживание данных прямой.......................140 Вызов внешней функции . 46. Подпрограммы типа SUBROUTINE...................143 47. Упорядочение трех чисел.........................143 Вызов подпрограммы SUBROUTINE 48. Генерирование случайных чисел...................143 Подпрограмма SUBROUTINE 49. Матричное исчисление............................145 Подпрограмма SUBROUTINE с массивами 50. Определение нуля функции........................148 Оператор EXTERNAL 51. Сглаживание измеренных значений.................150 Оператор COMMON 52. Блоки COMMON ..................................152 53. Сглаживание данных..............................154 Подпрограмма BLOCK DATA 54. Структура набора данных с последовательным до- ступом ........................................163 55. Объединение двух наборов........................165 Обработка данных 56. Прямой доступ................................. 165
ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ Адрес 18 — символический 24, 34 Алфавит 10 Анализ задачи 28 Ассемблер 22 Байт 11 Банк данных 83 Бесконечность машинная 75 Бит 11 Блок арифметический 19 — ввода-вывода 18 — именованный 151 — «иначе—если» 97 — управления 19 Ввод данных 80 — массивов 112 Вектор 109 Величины индексные 109 —- логики высказываний 69 Вид представления нормализованный 68 Время доступа 16 Вывод данных 80 — массивов 112 Вызов подпрограммы 135 Выполнение программы 32 Выражение арифметическое 73 — логическое 76 — отношения 76 — смешанное 74 — текстовое 119 «Да» 11 Данные 10 Дизъюнкция 75 Диски магнитные 16 Дисплей 13 Документация программная 31 Доступ к записям последовательный 84 --- — прямой 84 — прямой 16 Единица программная 78 Емкость запоминающего устройства 16 Задание типа неявное 70 Запись 83 — логическая 83 — физическая 83 Запрос имени 162 — номера 162 Знаки отношений 37 Изображения элементов схемы услов- ные 33 Имена функций стандартизированные 71 Имя 24, 65 — глобальное 136 — локальное 136 — набора 159 — переменной 34 Инверсия 75 Инициализация переменной 35 Интерпретатор 22 Информация 10 «Истина» 11 Канал 19 Код 19 Код EBCDIC 171 Кодирование 11 Команда машинная 24 Компилятор 22 Компиляция 32 Компьютер 9 Константа 66 — арифметическая 66 — логическая 69 — текстовая 69 Конъюнкция 75 Коэффициент кратности 82 — повторения 91 Курсор 14 Лента магнитная 16 «Ложь» 11
Предметный указатель 197 Мантисса числа 67 Массив 109 Матрица 109 Машина вычислительная 9 --- аналоговая 10 — — цифровая 10 --------программно-управляемая 10 Метка 77 Метод программирования «сверху вниз» 41 --- «центральный оператор» 42 Методы верификации 167 Набор данных 83 ---внешний 84 --- внутренний 84, 122 --- закрытие 160 ---неформатированный 85 ---открытие 159 ---форматизированный 84 Накопитель магнитный 16 Неравнозначность 75 «Нет» 11 Номер канала 84 — набора 159 Нуль машинный 75 Обеспечение программное 20 ---встроенное 12 ---прикладное 20 ---системное 20 Обмен параметров 137 Обработка данных дистанционная 19 Оператор 10 — арифметический условный 97 — безусловного перехода 94 — ввода 35, 80, 85 — вывода 35, 80, 85 — вызова подпрограммы 143 — выполняемый 77 — завершения программы 101 — закрытия набора 160 — инициализации констант 82 — — переменных 82 — логический расширенный 96 — — условный 94 — невыполняемый 77 — описания 69 — открытия набора данных 159 — переключения 100 — последний 101 — присваивания 34, 79 — пустой 99 — спецификации 109, 146 — функции 138 — формата 87 — цикла 98 Операции арифметические 71 — логические 75 — отношения 76 Определение размеров массивов, ди- намическое ПО, 145 Опрос на конец набора данных 46 Ошибки 44 — в написании формул 44 — в циклах 44 — виды 169 — инициализации 44 — локализации 170 Пакет дисков 17 Память оперативная 18 — постоянная 18 Параметр цикла 39 Параметры 136 — входные 136 — выходные 136 — фактические 136 — формальные 136 Переменная 33 — индексированная 109 Переполнение 75 Перфокарта 15 Перфолента 15 Подпрограмма 36 — общего вида 142 — функция 137 Подстрока 119 Поле 83 Правила написания операторов 77 — семантические 64 — синтаксические 64 Представление двоичное 11 Принцип канальный 19 Присваивание начальных значений 82 Программа 10, 78 — выполняемая 78 — достоверная 43 — защищенная 44 — исходная 24 — корректная 43 — объектная 24 — основная 78 — переносимая 43 — рентабельная 44 — удобная в эксплуатации 43 -для пользователя 43 — управления заданиями 21 — — задачами 21 — управляющая 21 — эффективная 44 Программирование структурное 41 Программы служебные 22 — управления данными 22 проектирование программы 29
198 Предметный указатель Процессор 17 — центральный 17 Равнозначность 75 Раздел операторов 79 — описаний 69, 79 Расположение элементов массива 111 Реализация программы 29 Редактирование 32 Режим мультипрограммной обработ- ки 27 — пакетной обработки 26 — разделения времени 26 Сегмент программы 78 Семантика 64 Символы печати управляющие 92 — Фортрана 65 Синтаксис 64 Система операционная 20 Слова ключевые 65 Спецификации преобразования 87 — — вещественных чисел 89 -----комплексных чисел 90 -----логических переменных 90 -----текстовых переменных 90 — — целых чисел 88 — управления 87 Список 65, 109 — ввода 80 — вывода 80 — именованный 149 — неименованный 149 — управляющей информации 85 — формата 87 Средства аппаратные И — программные 11 Строка комментария 77 — символов 64 Структура программной единицы 78 Структуры 38 Супервизор 21 Схема логическая 33 — обработки данных 30 Таблица 109 Телетайп 14 Терминал 13 Тестирование 45, 168 Типы данных 66 Транслятор 22 Трассировка 170 Указатель канала 85 — перехода по концу набора данных 87 — — — ошибке 87 — формата 85 Условие 76, 94 Устройство ввода-вывода 13 — оконечное 13 — периферийское 13 — печатающее 14 — управляющее 19 Утилиты 22 Файл 23 Функция 137 — внешняя 139 Функции стандартные 71 — текстовые 120 Характеристика числа 67 Характеристики программы качест- венные 42 Цикл 38 — итеративный 38 — неявный 123 — по условию 38 — счетный 38, 98 Числа вещественные 67 — комплексные 68 — с двойной точностью 68 — целые 66 Чип 17 Экран векторный 14 Элемент памяти 18 — списка 65 Язык управления заданиями 23 Языки программирования машинно- ориентированные 24 ---машинные 24 ---проблемно-ориентированные 25 Ячейка памяти 18 DO-список 112 else-блок 96 if-блок 96 ABS — функция 72 ACCESS — ключевое слово 159 . ACOS — функция 72 ANINT — функция 72 ASIN — функция 72 AT AN — функция 72 BACKSPACE — ключевое слово 161 BLOCKDATA — ключевое слово 154 CALL — ключевое слово 143 CHAR — текстовая функция 121
Предметный указатель 199 CHARACTER — ключевое слово 69, 109 — тип данных 66, 69 CLOSE — ключевое слово 160 CMPLX — функция 72 COMMON — ключевое слово 149 COMPLEX — ключевое слово 69, 109 — тип данных 66 CONTINUE — ключевое слово 99 COS — функция 72 COSH — функция 72 DATA — ключевое слово 82 DBL — функция 72 DIMENSION — ключевое слово 109 DIRECT — параметр 159 DO — ключевое слово 98 DOUBLE PRECISION — ключевое слово 69, 109 — тип данных 66 ELSE — ключевое слово 96 ELSE IF — ключевое слово 97 END — ключевое слово 79, 87 END IF — ключевое слово 96 END FILE — ключевое слово 161 ENTER — клавиша управления 14, 80 EOF — признак 47 EQUIVALENCE — ключевое слово 152 ERR — ключевое слово 87 EXIST — ключевое слово 162 ЕХР — функция 72 EXTERNAL — ключевое слово 147 FILE — ключевое слово 159 FMT — ключевое слово 85 FORM — ключевое слово 159 FORMAT — ключевое слово 87 FORMATTED — параметр 159 FUNCTION — ключевое слово 139 GO — имя программы 32 GOTO — ключевое слово 94, 100 ICHAR — текстовая функция 121 IF — ключевое слово 94, 97 IMPLICIT — ключевое слово 70 INT — функция 72 INTRINSIC — ключевое слово 147 INDEX — текстовая функция 121 INTEGER — ключевое слово 69, 109 — тип данных 66 INQUIRE — ключевое слово 162 LEN — текстовая функция 120 LOG — функция 72 LOGICAL — ключевое слово 69, 109 — тип данных 76, 69 MOD — функция 72 NAME — ключевое слово 162 NEW — параметр 159 NINT — функция 72 NUMBER — ключевое слово 162 OLD — параметр 159 OPEN — ключевое слово 159 PARAMETER — ключевое слово 82 PRINT — ключевое слово 86 PROGRAM — ключевое слово 78 READ — ключевое слово 80, 85 REAL — ключевое слово 69, 109 — тип данных 66 — функция 72 REC — ключевое слово 162 RECL — ключевое слово 159 RETURN — клавиша управления 14 — ключевое слово 14Л REWIND — ключевое слово 161 RUN — имя программы 32 SCRATCH — параметр 159 SEQUENTIAL — параметр 159 SIGN — функция 72 SIN — функция 72 SINH — функция 72 SQRT — функция 72 STATUS — ключевое слово 101 STOP — ключевое слово 142 STORE — клавиша управления 14 SUBROUTINE — ключевое слово 142 TAN — функция 72 TANH — функция 72 UNFORMATTED — параметр 159 UNIT — ключевое слово 159 WRITE — ключевое слово 85 .AND. — логическая операция 75 .EQ. — операция 76 .EQU. — логическая операция 75 .FALSE. — логическая константа 69 .GE. — операция отношения 76 .GT. — операция отношения 76 .LE. — операция отношения 76 .LT. — операция отношения 76 .NE. — операция отношения 76 .NEQU. — логическая операция 75 .NOT. — логическая операция 75 .OR. — логическая операция 75 •TRUE. — логическая константа 69
ОГЛАВЛЕНИЕ Предисловие редактора перевода........................................ 5 Предисловие .......................................................... 7 Предисловие ко второму изданию........................... 8 1. Введение........................................................... 9 2. Структура и принцип действия вычислительной машины .............. 11 2.1. Аппаратные средства ......................................... 12 2.2. Программное обеспечение...................................... 20 2.3. Режимы обработки данных...................................... 26 2.4. Задачи....................................................... 27 3. Разработка программы............................................. 28 3.1. Анализ задачи................................................ 28 3.2. Этапы изготовления программы................................. 29 3.3. Выполнение программы......................................... 31 3.4. Ввод в эксплуатацию и обслуживание........................... 32 4. Логическая схема программы....................................... 33 4.1. Условные изображения элементов схемы. Основные структуры 33 4.2. Методика работы. Качественные характеристики программы. Ошибки........................................................ 41 4.3. Примеры.................................................... 46 4.4. Задачи....................................................... 61 5. Элементы Фортрана................................................ 63 5.1. Основные понятия............................................. 64 5.2. Типы данных. Константы. Переменные........................... 66 5.3. Операции. Стандартные функции. Выражения..................... 71 5.4. Операторы. Программа......................................... 76 5.5. Оператор присваивания........................................ 79 5.6. Операторы ввода и вывода..................................... 79 5.7. Операторы управления......................................... 94 5.8. Примеры..................................................... 101 5.9. Задачи...................................................... 107 6. Массивы. Обработка текста....................................... 109 6.1. Массивы..................................................... 109 6.2. Обработка текста............................................ 119 6.3. Задачи...................................................... 131 7. Подпрограммы. Операторы спецификаций ........................... 134 7.1. Общие вопросы............................................... 134 7.2. Подпрограммы-функции........................................ 137 7.3. Подпрограмма общего вида.................................... 142 7.4. Операторы спецификаций...................................... 146 7.5. Подпрограмма BLOCK DATA..................................... 154 7.6. Задачи...................................................... 154 8. Обработка наборов данных........................................ 158 8.1. Открытие и закрытие наборов данных ......................... 159 8.2. Операторы для наборов данных с последовательным доступом . . 161 8.3. Чтение и запись............................................. 161 8.4 Запрос...................................................... 162 8.5. Примеры..................................................... 163 8.6. Задачи...................................................... 165 9. Тестирование программ........................................... 167 Приложение.......................................................... 171 Решение задач....................................................... 172 Литература.......................................................... 192 Список примеров..................................................... 193 Предметный указатель................................................ 196
” e-. .• -wяг» П' .zin .. МАТЕМАТИЧЕСКОЕ ОБЕСПЕЧЕНИЕ ЭВМ