5 ОЧ1 Министерство образования Республики Беларусь БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Кафедра «Строительная механика» В.М. Трепачко КРАТКИЙ КУРС ПРОГРАММИРОВАНИЯ НА АЛГОРИТМИЧЕСКОМ ЯЗЫКЕ FORTRAN POWER STATION Методическое пособие по дисциплине «Информатика» М и н с к 2 0 0 6 Министерство образования Республики Беларусь БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Кафедра «Строительная механика» В.М. Трепачко КРАТКИЙ КУРС ПРОГРАММИРОВАНИЯ НА АЛГОРИТМИЧЕСКОМ ЯЗЫКЕ FORTRAN POWER STATION Методическое пособие по дисциплине «Информатика» для студентов специальности 1-70 02 01 «Промышленное и гражданское строительство» М и н с к 2 0 0 6 УДК 004.438 (075.8) -ББК 22.18 - Т66 Рецензенты: Н.А. Пашина, В.В. Саяпин Трепачко, В.М. Т 66 Краткий курс программирования на алгоритмическом языке Fortran Power Station: методическое пособие по дисциплине «Информатика» для студентов специальности 1-70 02 01 «Про- мышленное и гражданское строительство» / В.М. Трепачко. - Мн.: БИТУ, 2006. - 110 с. ISBN 985-479-518-7. Пособие представляет собой справочное руководство по составлению программ на алгоритмическом языке Fortran, которые являются необходи- мой составной частью контрольных и курсовой работ по дисциплине «Ин- форматика», содержит описание основных средств алгоритмического язы- ка, а также сведения по работе в среде Fortran Power Station. Пособие может также использоваться в качестве справочника по языку Fortran. УДК 004.438(075.8) ББК 22.18 ISBN 985-479-518-7 © Трепачко В.М., 2006 © БИТУ, 2006 В в е д е н и е Это пособие адресовано главным образом пользователям персо- нальных компьютеров, желающим изучить алгоритмический язык Фортран и вычислительные методы для своей работы или учебы. Для понимания материала данного пособия не требуется обладать знаниями в области программирования, а минимальный уровень математической подготовки может быть в пределах средней школы или, в крайнем случае, первого курса технического вуза. В пособии излагаются алгоритмический язык Фортран и особенности его при- менения для персональных компьютеров. Изложение сопровожда- ется примерами, иллюстрирующими особенности применения кон- струкций языка. В последнем разделе приводятся некоторые задачи по языку Фортран с решениями, которые дополняют основной текст и помогают в изучении алгоритмического языка, а также могут служить примерами выполнения контрольных работ. Автор надеется, что после изучения этого пособия читатель сможет самостоятельно составлять программы на Фортране для ре- шения прикладных задач. Часто приходится слышать от студентов вопрос: «Почему стоит использовать ФОРТРАН?». Даже при наличии огромного количества программ для персо- нальных компьютеров многим пользователям необходимо само- стоятельно составлять программы - для решения инженерных, на- учно-технических, экономических и других задач. Для этого необ- ходимо использовать языки программирования высокого уровня, поскольку написание программ непосредственно на машинном язы- ке или близких к нему языках чрезвычайно непроизводительно. Язык программирования Фортран (FORTRAN - FORmula TRANslator) появился в числе первых языков программирования в 1956 году. С тех пор он остается основным языком программирова- ния при решении инженерных, научно-технических и других задач. Появлялась и проходила мода на другие языки. За прошедшие годы были разработаны языки программирования, которые, казалось, мог- ли заставить уйти Фортран с арены программирования - в 1960-е го- ды это был язык Алгол, в 1970-е годы PL-1, в 1980-е годы Паскаль и Си. Тем не менее Алгол и PL-1 в настоящее время практически не используются, а языки Паскаль и Си не нашли широкого примене- ния при решении инженерных задач. Такое долголетие Фортрана объясняется следующими причинами: 3 - постоянным развитием, т.е. появлением все более совершен- ных версий языка, которые включают предыдущие версии как свои подмножества, что делает возможным использовать старые Фор- тран-программы; — эффективной трансляцией текста Фортран-программы в ма- шинный язык, что обеспечивает высокую скорость обработки дан- ных, которая имеет большое значение при решении вычислитель- ных задач. В процессе развития языка Фортран было разработано много различных версий, но наиболее популярным и широко распростра- ненным был и остается Fortran-11, разработанный в 1977 году. К настоящему времени сформировался и обретает все большую попу- лярность Fortran Power Station. 1. ЭТАПЫ РЕАЛИЗАЦИИ ИНЖЕНЕРНЫХ ЗАДАЧ НА КОМПЬЮТЕРЕ При решении задачи на компьютере основная роль принадлежит человеку. Ни один опытный программист не станет составлять программу решения инженерной задачи сидя за компьютером. Написанию программы предшествует множество стадий, которые необходимо выполнять, чтобы до конца быть уверенным, что напи- санная программа верна. Процесс составления программ можно представить в виде последовательности описанных ниже стадий. 1. Постановка задачи. Суть этой стадии заключается в содер- жательной формулировке задачи и определении конечных целей решения. 2. Построение математической модели. Здесь предполагается математическая формулировка задачи, которую необходимо решить численно. Данный этап предусматривает глубокое понимание проблемы и знание соответствующих разделов математики. На данном этапе решения задачи необходимо: уяснить и четко из- ложить условие задачи; выбрать исходные переменные; выбрать переменные, подлежащие определению; записать ограничения переменных; записать связи между переменными в виде уравнений, неравенств, таблиц и т.д. 3. Выбор метода решения. На этой стадии выполняются два этапа анализа: 4 математический анализ. Он включает в себя: подтверждение существования решения; подтверждение единственности решения; определение теоретических методов, которые будут использованы при решении задачи; > численный анализ. При выполнении данного этапа произ- водят: выбор наиболее приемлемого метода численного решения задачи с учетом особенностей математической модели решения задачи; оценку возможности реализации выбранного численного метода на принятом алгоритмическом языке, типе персонального компьютера, операционной системе и т.д. Если не удается найти хороший метод решения, необходим возврат к предыдущим этапам, т.е. требуется построить новую модель или иначе сформулировать задачу. 4. Разработка принципиальной схемы алгоритма. В прин- ципиальной схеме алгоритма, реализующего выбранный чис- ленный метод решения задачи, с максимальной лаконичностью должны быть отражены основные (без ненужной деталировки) блоки алгоритма. Они должны быть представлены в той пос- ледовательности действий, которая необходима для решения определенной задачи. Алгоритмы описываются разными спосо- бами. Удачной формой является словесная запись. В практике программирования применяется общая методика построения принципиальной схемы алгоритма - метод пошаговой детализации («нисходящее программирование»), заключающийся в том, чтобы решение какой-либо сложной задачи свести к решению некоторого ряда более простых задач. Сначала в решаемой задаче выделяется небольшое число более простых задач (подзадач), а в проектируемой программе намечается соответствующее число блоков (частей программы), каждый из которых предназначен для решения одной из выделенных подзадач, определяются назначение каждого из них, порядок выполнения этих блоков и их связи между собой по обрабатываемым данным. На данном этапе важно определить лишь функциональное назначение каждого блока - что он должен делать, т.е. какие данные являются исходными для блока и что является результатом его работы. Вопрос о механизме реализации, т.е. как будут выполняться возложенные на блок функции, пока можно не рассматривать. 5 После определения порядка выполнения выделенных блоков и построения общей схемы алгоритма необходимо проверить его правильность. С этой целью программист, прослеживая логику выпол- нения алгоритма, должен убедиться в том, что к началу выполнения каждого блока все его исходные данные и все результаты на выходе из блока будут действительно определены, а на выходе из программы будут получены требуемые результаты - в предположении, что каждый блок правильно выполняет свои функции. 5. Построение блок-схемы алгоритма. На этой стадии сложные первоначально выделенные подзадачи необходимо повторно раз- бить на более простые блоки (второй шаг детализации). Этот про- цесс может продолжаться до тех пор, пока реализация блока не вызовет трудностей. Затем блок представляется графически в виде блок-схемы с подробной деталировкой. В блок-схеме все действия алгоритма изображаются геометрическими фигурами - прямо- угольниками, трапециями, ромбами и т.д. (основные элементы блок-схем, требования к блок-схемам приведены в прил. 1, 2). Меж- ду фигурами восстанавливаются связи, показывающие последо- вательность выполнения действий. Блок-схема составляется так, чтобы каждому блоку соответствовала часть программы. Работа над блок-схемой позволяет обнаружить ошибки, допущенные при раз- работке принципиальной схемы алгоритма. Именно на этом этапе определяется сущность окончательного алгоритма, который будет реализован. 6. Составление программы. Программа - это последовательность команд, понятных компьютеру. Эта стадия состоит из двух этапов: 1) написание текста программы (конструирование программы); 2) набор текста программы на компьютере. Конструирование программы производится с помощью алго- ритмического языка, а ее перевод на язык компьютера (трансляция) осуществляется самой вычислительной машиной. При наборе текста программы на компьютере необходимо стре- миться к тому, чтобы программа была наглядной и удобочитаемой. Для этого можно: 1) сдвигать внутренние операторы («тело») цикла и условия на 3-4 позиции вправо; 2) давать необходимые комментарии; 3) размещать метки в возрастающем порядке от начала к концу программы; 4) группировать операторы формата. Кроме того, необ- ходимо по возможности избегать операторов перехода и учитывать, 6 что операторы, имена переменных, констант, подпрограмм и т.д. не должны содержать русских символов. 7. Отладка программы. Цель данного этапа - выявление име- ющихся в программе ошибок, определение и устранение причин, их вызвавших. При отладке программ разработчик сталкивается с двумя видами ошибок: • синтаксические ошибки. Это ошибки в записи конструкций языка программирования (чисел, переменных, выражений, меток, операторов, подпрограмм и т.п.). Данные ошибки обнаруживаются на этапе компиляции. Исключение составляют ошибки в операторах формата, которые компилятором не фиксируются, а обнаруживаются только на этапе выполнения программы; • семантические (смысловые, ошибки выполнения) ошибки. Они связаны с неправильным содержанием действий или использо- ванием недопустимых значений величин. Данные ошибки при- водят: к прекращению выполнения программы и выдаче пре- дупреждений; отсутствию признаков выполнения программы из-за ее «зацикливания»; появлению непредусмотренной формы или содержания печати результатов; потере точности вычислений; большому времени выполнения вычислений или других операций. 8. Решение контрольного (тестового) примера. На данной стадии, используя принятые математическую модель и численный метод решения задачи, вычисления выполняют вручную по заданным величинам исходных данных, определяя при этом промежуточные и конечные результаты, которые будут контролироваться при расчете по программе. Рекомендуется приготовить несколько контрольных примеров, что позволит с большей достоверностью оценить в даль- нейшем эффективность разработанной программы (особенно для алгоритмов разветвленного типа). 9. Расчет задачи на компьютере. На данной стадии необходимо: спланировать и подготовить данные для отладки, разработать исходные данные тестов, испытать программу в условиях ее использования, приближенных к реальным (на различных ОС, аппа- ратных системах и т.д.). Следует протестировать все возможные варианты прохождения программы. Следует отметить, что при получении нелепых промежуточных либо окончательных результатов возможен возврат к любому предшествующему этапу. Для проверки достоверности результатов программа испытывается при решении контрольных задач. 7 10. Разработка пояснительной записки. Цель стадии - разработка детального описания принципов функционирования, используемых численных методов, ограничений на входные и выходные данные, требуемых затрат времени и других ресурсов на выполнение прог- раммы. В пояснительной записке могут указываться: область при- менения программы, ее возможности, сведения о затратах памяти, требуемые технические средства, сведения о надежности и т.д. Следует отметить, что при решении какой-то задачи не обязательно будут задействованы все этапы представленной последовательности. В зависимости от сложности конкретной задачи некоторые пункты могут быть не использованы. 2. АЛГОРИТМИЧЕСКИЙ ЯЗЫК ФОРТРАН 2.1. Структура программы Текст Фортран-программы представляет собой запись на языке программирования алгоритма решения поставленной задачи. При записи текста используются следующие символы: 1. Прописные или строчные буквы латинского алфавита от А до Z; 2. Цифры от 0 до 9; 3. Специальные символы (знаки арифметических операций, опе- рации отношения, знаки пунктуации и др.). Буквы русского алфавита и другие символы могут использовать- ся только в комментариях, операторах ввода и вывода Фортран- программы. Любая программа состоит из операторов (предложений) языка, которые располагаются в строках. Положение символа в строке ну- меруется слева направо, начиная с 1-й позиции. В языке Фортран имеются определённые правила, которых сле- дует придерживаться при наборе программы на компьютере. Записать программу в Fortran Power Station можно двумя спосо- бами. Первый способ - классический (характерен для версии Fortran-П). Согласно ему, текст программы записывается с 7-й по 72-ю позиции строки (поле текста программы, рис. 2.1), причем в этих пределах рас- положение текста произвольное. 8 1 2 3 4 5 6 7 Н h- 72(2049) ПОЛЕ МЕТОК (с 1 по 5 позицию) ПОЛЕ текста программы ПОЛЕ ПЕРЕНОСА (6-я позиция) Рис. 2.1. Структура программы Любой оператор может быть помечен меткой - целым десятич- ным числом (не более 5 цифр), метка располагается в позициях 1 -5 строки (поле меток, см. рис. 2.1). Метки ставят не на все операторы, а только на те, на которые будут ссылки в программе. Назначение меток: метки дают возможность обращаться к нужной строке про- граммы из любого места этой программы. При использовании меток в программе необходимо учитывать следующее: S в одной программе не может быть двух одинаковых меток; •S номера меток ставятся в произвольном порядке. В строке программы должен размещаться только один оператор, однако если оператор не помещается в позициях 7-72 или желате- лен его перенос на следующую строку, то в каждой строке продол- жения в 6-й позиции (поле переноса, см. рис. 2.1) печатается символ звездочка «*» либо любой другой символ, отличный от нуля. Если в первой позиции любой строки программы напечатан «!» (восклица- тельный знак), то такая строка рассматривается как комментарий 9 текста программы и транслятором игнорируется. Для записи текста комментария могут использоваться любые символы, а сам текст комментария располагается в позициях 2-72 строки. При сохране- нии программы, написанной таким способом, необходимо присваи- вать ей расширение FOR. В качестве поясняющего текста может быть любая информация (она транслятором не воспринимается, а служит для читаемости программы при последующих просмотрах её текста). Второй способ - универсальный. При реализации программы этим способом можно располагать операторы с 1-й позиции по 2049-ю, не соблюдая поле меток. В случае когда какой-то строке необходимо присвоить метку, ее располагают в самом начале стро- ки, а затем не менее чем через пробел располагают оператор. При сохранении программы, написанной таким образом, можно при- сваивать ей расширение F90. 2.2. Типы данных Каждая величина, используемая в тексте программы, может быть либо константой, либо переменной. Константа - это величина, значение которой задается в тексте программы в явном виде и в дальнейшем не изменяется. Переменная - это величина, значение которой может изменяться в процессе исполнения программы. Обращение к константам и переменным осуществляется по имени. Каждая величина, будь то константа или переменная, должна от- носиться к одному из типов данных. Для вычислительных задач ос- новными являются следующие типы данных: - целый; - вещественный; - вещественный с двойной точностью; - комплексный; - комплексный с двойной точностью; - логический; - текстовый. 10 Целые константы представляют собой последовательность цифр без десятичной точки. Перед отрицательным числом должен стоять знак «минус», а перед положительным знак «плюс» может отсутствовать. Пример 2.1. Примеры целых констант 12 -1979 318 +5678 В памяти компьютера целая константа занимает 4 байта памяти и может иметь значение от -2147483648 до 2147483647. Вещественная константа может быть представлена одним из следующих двух способов: 1) вещественная константа с фиксированной точкой. Сначала за- писывается знак числа «-» или «+» (знак «+» можно опускать), це- лая часть числа, а затем десятичная точка и дробная часть числа. Пример 2.2. Примеры вещественных констант с фиксированной точкой 23.45 -654.321 .3 +5. 2) вещественная константа с плавающей точкой, которая запи- сывается в виде пЕт Здесь п - мантисса (представляется как вещественная константа), т порядок (однозначное или двузначное целое число со знаком или без знака). Пример 2.3. Примеры вещественных констант с плавающей точкой -0.00001 Е2 (в математике -O^OOOOI • 102); 7.342Е+11 (в математике 7,342 • 1011); 0.03Е-7 (в математике 0,03 • 10"7). 11 В памяти компьютера вещественная константа занимает 4 байта памяти и имеет внутреннее представление как вещественная кон- станта с порядком. Диапазон изменения - от -8,43Е-37 до 3,37Е+38, количество цифр в мантиссе — не более семи. Вещественная константа двойной точности записывается только в виде вещественной константы с порядком. Для указания порядка вместо Е используется D. В памяти компьютера эта кон- станта занимает 8 байт памяти. Диапазон изменения - от -10D-64 до +9,99D+62, количество цифр в мантиссе - не более 14. Пример 2.4. Примеры записи вещественных констант двойной точности 724D2 6 .194D-14 Комплексная константа записывается в виде двух вещественных чисел, заключённых в круглые скобки и разделённых запятой, т.е. (Xr.Xi) где Хг и Xi - вещественные константы; Хг - действительная часть комплексного числа; Х| - мнимая часть. Пример 2.5. Примеры комплексных констант (12.35,-1.129) (-3.94.2.0Е-13), которые в обычной математической записи имеют вид 12,35 -1,129/ > -3,94 +2-10"13/ В памяти компьютера комплексная константа занимает 8 байт памяти. Комплексная константа двойной точности состоит из пары ве- щественных констант двойной точности. В памяти компьютера эта константа занимает 16 байт памяти. 12 Пример 2.6. Примеры комплексных констант двойной точности (2.1D0.-3.12D-2) Логическая константа может принимать только два значения: TRUE, (истина), .FALSE, (ложь). Точки в записи являются обязательными. В памяти компьютера логическая константа занимает 4 байта. Текстовая константа может быть представлена в 2 формах: 1) холлеритовская строка. Представляет собой число выводимых символов п (делая беззнаковая константа в диапазоне от 1 до 255), признак константы - буква Н (латинская) и сами символы: пН <набор символое> Пример 2.7. Пример холлеритовской строки ЭНстроитель 2) строка символов, заключённая между двумя апострофами. Пример 2.8. Пример строки символов ' Строительный факультет' ' Специальность " ПГС"' Примечание: символ «апостроф» внутри текста отображает- ся 2 апострофами, идущими подряд. Переменные и константы в программе различаются по именам. Имя (идентификатор) может содержать от 1 до 1320 символов. При- чём первый символ - буква (строчная или прописная). Тип перемен- ной или константы должен быть определен в программе и не может изменяться в процессе ее исполнения. Если никаких указаний о типе переменной или константы в программе нет, то переменная относит- ся к одному из двух типов (целому или вещественному) по следую- щему правилу: если переменная начинается с букв I, J, К, L, М, N, то она считается переменной целого типа, а если переменная начинается с любой другой буквы латинского алфавита, то она считается пере- менной вещественного типа. Такое описание типа называется описа- нием типа по умолчанию. Во всех других случаях типы переменных задаются с помощью операторов описания. 13 Следует избегать имен (идентификаторов), совпадающих с операторами языка, например REAL, READ, а также с именами встроенных функций. 2.3. Операторы описания типов данных 2.3.1. Оператор описания переменных целого типа Для описания переменных и массивов целого типа используется оператор INTEGER. Этот оператор также можно использовать для преобразования переменной или массива вещественного типа в пе- ременную или массив целого типа. Будем рассматривать числовые величины только десятичной системы исчисления. Данные целого типа делятся на две группы: S обычной точности (описываются как INTEGER или INTEGER*2) - числа в диапазоне от -32767 до 32767; S двойной точности (INTEGER*4) - числа от -2147483647 до 2147463647. Примечание: 1) целые константы не должны выходить из диа- пазона; 2) десятичная точка недопустима в целой константе. Пример 2.9. Примеры целых констант 123 +123 О 00000123 32767 -32767 Переменные или массивы, имена которых начинаются с I, J, К, L, М, N, по умолчанию относятся к целому типу (т.е. их не обязатель- но описывать оператором INTEGER). Пример 2.10. Пример использования оператора описания INTEGER DELTA, В(10) DELTA = 4 В(1) = 132 1 = 1 В(2) = В(1) + DELTA 14 2.3.2. Оператор описания переменных вещественного типа Для описания переменных и массивов вещественного типа ис- пользуется оператор REAL. Если имеется переменная или массив целого типа (когда имя начи- нается на любую букву из I, J, К, L, М, N), то с помощью оператора REAL можно преобразовать её в переменную вещественного типа. Основная действительная константа содержит: 1. Необязательный знак («+» или «-»). 2. Целую часть. 3. Десятичную точку (.). 4. Дробную часть. 5. Необязательный показатель экспоненты (Е или D). Целая и дробная части содержат по одной или больше десятич- ных цифр, а десятичная точка является разделителем. Как целая часть, так и дробная могут отсутствовать, но не обе. Пример 2.11. Примеры вещественных констант -123 456 +123.456 123.456 -123. +123. 123. -.456 +.456 456 Экспоненциальная часть содержит букву «Е» или «£>», за кото- рой следует (необязательно) целая константа со знаком из одной или двух цифр. Экспонента показывает, что предшествующую ве- личину нужно умножить на десять в степени целой константы. Пример 2.12. Примеры простых экспоненциальных частей Е12 Е-12 D+12 ЕО Действительная константа может быть представлена как с экс- поненциальной частью, так и без нее. Пример 2.13 +1.000Е-2 1.Е-2 1Е-2 Все это - одно и то +0.01 100.0D-4 0.0001 D+2 же число: 0,01. 15 Если число не содержит экспсэненху5 то е г о называют числом с фик- сированной точкой, а если содержит _ числом с плавающей точкой. Данные вещественного типа делятся на две группы: 1) обычной точности (описываются как REALM или REAL) - числа в диапазоне от 8,4310" д о З,37-Ю38 (положительные числа), от -3,37-1038 до -8,43 10"37 (отрицательные числа), 0 (нуль) - для этих чисел экспонента Е\ 2) двойной точности (REAL_*8 или DOUBLE PRECISION) - в диапазоне от 4,19-Ю"307 до 1,<67 Ю308 (положительные числа), от -1,67-Ю308 до -4,19-Ю"307 (отрицательные числа), 0 (нуль) - для этих чисел экспонента D > Пример 2.14. Пример использования оператора описания. REAL К LAM (5) Переменная К и элементы массива ^ _ 2 5 LAM мо,гу-г принимать в программе зна- чения тО)ЛЬко вещественного типа. 2.3.3. Оператор описания беременных комплексного типа Комплексная константа в Фортране состоит из необязательного знака, левой скобки, двух цель,1Х или действительных чисел, разде- ленных запятой, и правой cko6jkh. Для описания переменных комплексного типа используется опе- ратор COMPLEX (для чисел «обычной точности - COMPLEX или COMPLEX*8, для чисел двойкой точности - COMPLEX*16). Каж- дая компонента (действителыная и мнимая) COMPLEX*8 - это REAL*4. Каждая компонента 12 может содержать до 15 символов текста. 23.5. Оператор описания переменных логического типа Логический тип данных содержит две логических величины: .TRUE, и .FALSE. Описание переменных логического типа осуще- ствляется оператором LOGICAL. При описании могут применяться следующие формы оператора: LOGICAL*2 занимает в памяти компьютера два байта (одно сло- во), причем младший значащий (первый) байт - либо 0 (.FALSE.), либо 1 (.TRUE.); старший значащий байт не определен; LOGICAL*4 занимает в памяти четыре байта (два слова), млад- шее значащее (первое) из которых содержит величину LOGICAL*2. Старшее значащее слово не определено. Пример 2.17. LOGICAL Т1,Т2 17 2.3.6. Оператор описания массивов Другой разновидностью переменных являются так называемые индексированные переменные или массивы. Массив - это совокупность данных одного типа, объединённых одним именем (массив может состоять из одного элемента). Всякий массив обязательно имеет размерность. Массивы бывают: S одномерными (другое их название - вектор-столбец)-, S двумерными (другое название - матрица); S трехмерными и т.д. Максимальная размерность массива равна 7. Одномерный массив - это последовательность ячеек, располо- женных в одну линию. На рис. 2.2 приведен пример такого массива. Индекс i 1 2 3 4 5 6 7 8 Значение элемента qt = 2,3 -6 0 4,4 -3 0 8,2 4,7 Рис. 2.2. Одномерный массив q Массив имеет имя q. Для того чтобы можно было отличить одну ячейку массива от другой ячейки этого же массива, их нумеруют. Ну- мерация ячеек обычно начинается с 1. Номер ячейки массива называ- ется его индексом, а константа в ячейке - элементом массива. Теперь становится возможной работа с отдельной ячейкой такого массива. Например, команда q7 = 8,2 означает, что 7-й элемент массива q равен 8,2. Команда r41 = q2 + qs означает, что 41-му элементу массива г при- сваивается значение суммы 2-го и 5-го элементов массива q. Двумерный массив по расположению ячеек напоминает матема- тическую матрицу (рис. 2.3). Элемент такого массива характеризу- ется двумя индексами: первый показывает строку, второй - столбец. Например, команда 5 = 43 означает, что элемент со значением 43 размещается на пересечении 2-й строки и 5-го столбца двумерного массива d. 18 1 2 3 4 5 6 1 -2 4 6 -8 -3 1 2 14 7 -10 43 3 3 0 -5 -9 12 6 0 4 16 14 12 11 5 9 Рис. 2.3. Двумерный массив d Аналогично устроена структура массивов трех и большей раз- мерности. Массивы должны быть описаны в программе одним из операто- ров описания, приведенных выше (см. п. 2.3.1...2.3.5), в зависимо- сти от типа элементов массива. Кроме того, существует специаль- ный оператор для их описания: DIMENSION <имя массива> (<размерность>) Пример 2.18. DIMENSION А(10),В(8),С(3,4),К(15) Оператор не выполняет никаких действий в программе и служит лишь для отведения места в памяти компьютера на размещение массивов. Изначально всем элементам массива присваиваются зна- чения, равные нулю. Пример 2.19. DIMENSION А(10), С(4,6) К=4 М=3 19 А(1)=2.5 А(3)=1.7Е-7 A(K+M)=D+A(1) А(4)=А(М)+А(К+1) ! Эта строка аналогична А (4) =А (3) +А (4+1). При выполнении программы транслятор анализирует, не превы- шает ли значение вызываемого индекса массива его предельного значения, описанного в операторе DIMENSION (т.е. проверяется случай когда вызываемый индекс массива не существует - массив имеет меньшие размеры). Если, например, для массива С, приве- денного выше, производится обращение к элементу С(5,1), то про- грамма выдаст сообщение об ошибке. Как указано ранее, массивы можно описать ещё и с помощью операторов описания типов переменных. Пример 2.20. REAL С(4,6) ! Вещественный массив С из 24 элементов, расположенных в 4 строках и 6 столбцах. INTEGER К(15) !Целочисленный массив К из 15 элементов, расположенных в одну строку. Примечание: повторное описание массивов не допускается. 2.4. Арифметические выражения Арифметическое выражение - это запись математической фор- мулы с использованием констант, переменных, функций, знаков арифметических операций и круглых скобок. Знаки арифметических операций: + (сложение), - (вычитание), * (умножение), / (деление), ** (возведение в степень). Скобки в арифметических выражениях имеют обычный матема- тический смысл. При написании арифметических выражений следует соблюдать определенные правила. Так, два знака операции не могут стоять ря- дом, а если это необходимо, то они должны быть разделены скоб- ками. Например, запись вида X/-Y неверна, а запись Х/(-Y) верна. Если в арифметическом выражении отсутствуют круглые скоб- ки, то порядок выполнения операций будет следующим: 20 а) вычисление функций; б) возведение в степень; в) умножение и деление; г) сложение и вычитание. Операции одного ранга выполняются последовательно слева на- право, за исключением операции возведения в степень, которая вы- полняется справа налево. Например: А=В**С**2 будет выполняться как А=В**(С**2). При написании арифметических выражений во избежание оши- бок, а также для задания очерёдности выполнения арифметических операций, целесообразно использовать скобки, причем количество открытых скобок должно быть равно количеству закрытых скобок. Пример 2.21. Записать на алгоритмическом языке Фортран арифметическое выражение х-у 1- cos х • х2 + 7,5 Решение: X * Y / ( X ** 2 + 7.5 ) + COS (X ) В приведенном примере происходит обращение к библиотечной функции Фортрана COS, полный список которых содержится в прил. 3. При обращении к библиотечным функциям необходимо указать имя функции, а после имени в скобках - аргументы. При этом аргументы могут быть арифметическими выражениями. При использовании библиотечных функций необходимо учиты- вать следующее: 1 отрицательное число не может быть возведено в веществен- ную степень; 1 для тригонометрических функций аргумент указывается в ра- дианах. 21 2.5. Учет типов величин при записи арифметических выражений Величины разных типов (целые, вещественные и т.д.) в памяти компьютера кодируются по-разному, и, следовательно, арифмети- ческие операции над ними выполняются, вообще говоря, также по- разному. Для целых величин определены все операции, однако результат не должен выходить из множества целых чисел. Поэтому результа- том деления двух целых величин будет целая часть полученного частного. Например, если J = 9, I = 4, то J / I = 2. Любая вещественная величина может быть возведена в целую степень. Операция возведения вещественных величин в веществен- ную степень вида А**В выполняется только в том случае, если А>0. Для комплексных величин определены операции сложения, вы- читания, умножения и деления. Операция возведения в степень для комплексной величины выполняется только в том случае, если по- казатель степени - целая величина. Когда в арифметическом выражении все операнды (переменные и константы) одного типа, то величина, являющаяся результатом выполнения этого выражения, того же типа. Когда операнды имеют разный тип, то тип результата, как правило, определяется типом операнда максимального ранга. Ранг операнда зависит от его типа (табл. 2.1). Таблица 2.1 Ранг операнда Тип параметра 1 INTEGER 2 REAL 3 REAL*8 4 COMPLEX 5 COMPLEX*16 22 Например, результатом арифметического выражения с операн- дами INTEGER (ранг = 1) и REAL (ранг = 2) будет величина, отно- сящаяся к типу REAL. Особый случай: операции над операндами REAL*8 и COMPLEX породят величину COMPLEX*16, а не COMPLEX. В любой Фортран-программе должен присутствовать по крайней мере один выполняемый оператор. Простейшим выполняемым опе- ратором является арифметический оператор присваивания, который имеет следующий вид: V = А. Здесь V - имя переменной, а А - арифметическое выражение. Правило выполнения: переменной с именем V присваивается значение арифметического выражения А. Если переменная V - целая, а тип А - вещественный, то V будет присвоено значение целой части результата А, а при комплексном типе А переменной V будет присвоено значение целой части от дей- ствительной части результата А. Если переменная V - вещественная, а тип А - комплексный, то V будет присвоено значение действительной части результата А. Пример 2.22. Примеры результатов арифметических операций над различными типами величин (табл. 2.2). Таблица 2.2 Запись опера- ции на языке Фортран Значение пе ременной Примечание при математиче- ских вычислениях в результате выполнения операции А = 1/3 0,33333(3) А = 0 Результат арифмети- ческой операции над целыми числами - целое число, над ве- щественными - вещественное А = 1./3. 0,33333(3) А = 0.33333(3) I = 199/100 1,99 1 = 1 J = 1./3 0,33333(3) J = 0 Y = Х**(1/3) О^.ЗЗЗЗЗ(З) Y = Хи = 1 Y = Х**(1./3.) -^ 0.33333(3) Y _ ^о.ззззз(з) 23 Замечания: 1. Следует строго отслеживать запись арифметических вы- ражений и анализировать тип и величину результата. Наибольшее количество ошибок возникает при операциях с различными типами параметров. 2. Все переменные, находящиеся справа от знака равенства в операторе присваивания, должны иметь конкретные значения, ко- торые задаются в предыдущей части программы либо с помощью других операторов присваивания, либо при задании исходных дан- ных с помощью операторов ввода. Если значение переменной ранее в программе не задано, то ее значение равно нулю^ 2.6. Последовательность создания Фортран-программ После написания текста программы на языке Фортран возникает необходимость ее запуска для проверки ее работоспособности. Как и на других языках высокого уровня, на Фортране возможно вы- полнение файла, имеющего расширение .ЕХЕ. Для запуска про- граммы необходимо выполнить следующую последовательность действий: 1. Сохранение исходного текста программы. Исходный текст программы создается любым текстовым редак- тором или непосредственно в оболочке Fortran PS и сохраняется с именем (желательно не более 8 символов) и расширением .FOR или .F90 (см. п. 2.1). Например, TEXT1.FOR. Для сохранения файла в Fortran PS необходимо нажать клавишу F12. 2. Компиляция программы (исправление ошибок). Составленная программа на Фортране может содержать ошибки. Существуют два основных вида ошибок - синтаксические и семан- тические. Синтаксические ошибки обусловлены неправильным использо- ванием конструкции алгоритмического языка (ошибки в названиях операторов, пропуск знаков и пр.). Эти ошибки указываются после трансляции программы. Исправление этих ошибок, как правило, не вызывает трудностей даже для начинающих пользователей. Семантические ошибки обусловлены неверным алгоритмом ре- 24 шения или неправильным размещением обрабатываемых данных в памяти. Эти ошибки (деление на ноль, использование неопределен- ных величин, недопустимое значение индекса массива) проявляют- ся в том, что при запуске программы на выполнение на экране ком- пьютера может появиться сообщение о переполнении разрядной сетки в какой-то ячейке памяти. Для компиляции программы в Fortran PS необходимо нажать со- четание клавиш CTRL+F8. Затем в нижней части экрана будет выве- дено количество ошибок (error) и, если они присутствуют, в скобках будут указаны номера строк, в которых они содержатся. Для быстро- го перехода к строке с ошибкой, необходимо дважды нажать левой кнопкой мыши на запись, указывающую на ошибку. После исправ- ления ошибки программу снова запускают на компиляцию. Только после устранения всех ошибок переходят к следующему этапу. 3. Трансляция программы (создание файла для запуска или ЕХЕ-файла). Для трансляции программы в Fortran PS необходимо нажать со- четание клавиш SHIFT+F8. Затем в нижней части экрана будет вы- ведено сообщение о наличии ошибок. Как правило, ошибки на этом этапе связаны с переполнением ячеек памяти и неверным использо- вание внешних процедур. При отсутствии ошибок выполняется следующая операция. 4. Запуск программы на выполнение. Для запуска готовой программы в Fortran PS необходимо нажать сочетание клавиш CTRL+F5. В появившемся окне следует ввести требуемые данные и просмотреть полученные результаты. Иногда возникает необходимость экстренного прерывания вы- полнения программы. Для этого необходимо нажать сочетание кла- виш CTRL+Break или создания искусственной сбойной ситуации, например, путем ввода текстовой информации вместо числовой. 25 2.7. Операторы ввода/вывода 2.7.1. Оператор ввода DATA Оператор DATA служит для задания значений переменным или массивам на этапе трансляции программы. Общая форма записи оператора DATA <список переменных> / <список значений>/ В списке имён указываются имена переменных, имена и элемен- ты массивов, которым перед началом выполнения программы должны быть присвоены некоторые значения. Примечание: список переменных должен соответствовать спи- ску значений по очередности следования и по типу данных; количе- ство переменных не должно превышать количество значений. Пример 2.23. DIMENSION С(10) DATA А , В , К , N / 2.3 , -1.6Е-4 , 1 3 , 9 / DATA С / 4.1 , 5.5 , 6*0. , -12.7 , 14. / В результате выполнения этой части программы переменные по- лучат следующие значения: А = 2,3, В = -1,6-10"4, К= 13, N=9. Заполнение массива С, состоящего из 10 элементов, происходит следующим образом: С(1) = 4,1; С(2) = 5,5; затем следует групповой множитель 6*0., который означает - шесть раз повторить число 0., т.е. С(3) = С(4) = С(5) = С(6) = С(7) = С(8) = 0; далее С(9) = -12,7; С(10)= 14. Пример 2.24. DATA С(1) , С(2) , С(8) / 3*7. / Элементам массива С с индексами 1, 2 и 8 будет присвоено зна- чение 7. В операторе DATA могут присутствовать данные как целого и веще- ственного типа, так и комплексного, текстового и логического типов. 26 Пример 2.25. COMPLEX D1,D2 CHARACTER*6 E1, E2, E3*12 DATA D1, E1 /(-3.6 , 15.7E3) , 'ОСЕНЬЮ / Примечания: 1) оператор DATA действует в программе один раз во время трансля- ции программы и не может изменить значения переменных при повтор- ном его выполнении; 2) операторов DATA в программе может быть сколько угодно; 3) операторы DATA могут располагаться в любом месте программы. 2.7.2. Оператор ввода READ Этот оператор позволяет осуществлять ввод данных с клавиату- ры или другого устройства (например, внешнего файла) в процессе выполнения программы. Общий вид оператора READ (п ,т) <список ввода>, где пит- натуральные числа; п - номер устройства, с которого производится считывание информации (если вместо п указывается * или цифра 5, то считывание данных производится с клавиатуры); т - номер метки, после которой следует оператор формата записи считываемых величин (если вместо т указывается *, то ввод значе- ний производится в произвольной форме - бесформатный ввод). Пример 2.26. READ(V) А READ (5,*) В READ (1 ,*) С Считывание значений переменных А и В производится с клавиату- ры, а переменной С - с внешнего устройства 1. Значения этих пере- менных могут задаваться в произвольной форме (бесформатный ввод). Пример ввода данных по формату будет приведен ниже (см. п. 2.8). 27 2.7.3. Оператор вывода WRITE Этот оператор позволяет осуществлять вывод данных на экран или другое устройство (например, внешний файл) в процессе вы- полнения программы. Общий вид оператора WRITE (и , т) <список вывода>, где п - номер устройства, на которое производится вывод информа- ции (п - целое число; если вместо п указывается * или цифра 5, то вывод производится на экран); т - номер метки, после которой следует оператор формата. Пример 2.27. WRITE (V) D WRITE (5,*) Е WRITE (2,*) F WRITE (*,*) D+E Вывод значений переменных D и Е производится на экран, а пере- менной F - на внешнее устройство 2. Результат суммы переменных D и Е также будет выведен на экран. Значения всех переменных будут выводиться в произвольной форме (бесформатный вывод). Примеры вывода данных по формату будут приведены ниже (см. п. 2.8). 2.7.4. Оператор вывода на экран PRINT Этот оператор позволяет осуществлять вывод данных в процессе выполнения программы только на экран. Общий вид оператора PRINT т , <список вывода>, где т - номер метки, после которой следует оператор формата (если вместо т указывается *, то вывод значений производится в произ- вольной форме). 28 Пример 2.28. PRINT*, К Вывод значения переменной К производится на экран (бесфор- матный вывод). Пример вывода данных по формату будет приведен ниже (п. 2.8). 2.8. Оператор задания формата ввода - вывода (FORMAT) Оператор FORMAT является невыполняемым оператором. Он всегда имеет метку, но на эту метку нельзя передавать управление. Он может находиться в любом месте программы и используется для ввода и вывода информации в сочетании с операторами ввода - вы- вода READ и WRITE. В общем виде оператор формата можно записать т FORMAT ( <список спецификаций1> ). Здесь т - номер метки. Пример 2.29. READ ( 5 , 3 ) I , К 3 FORMAT (14 , 15 ) Оператор ввода READ означает: читать с устройства 5 по фор- мату 3 значения переменных I и К. Оператор FORMAT указывает, каким образом будут считывать- ся данные с носителя информации (строка экрана, строка текстово- го файла или устройство передачи данных) или выводиться на но- ситель информации. В списке спецификаций указывается, по какой форме будет про- изведено считывание значений для переменных. Спецификации бы- вают следующих типов: I, F, Е, G, Х,Т, А. 29 2.8.1. Спецификации X, Т Спецификация X служит дня отступа (пропуска) указанного числа пробелов. В общем виде записывается - пХ. При вводе информации обозначает «пропустить, не читая, п позиций». При выводе инфор- мации обозначает «пропустить п позиций (вывести п пробелов)». Для вывода информации в конкретное место строки использует- ся спецификация Тп, где П - номер позиции, начиная с которой бу- дет вводиться или выводиться информация. Спецификации X и Т по своей сути одинаковы. Отличие заклю- чается в том, что при использовании спецификации Т на экране бу- дет отступ на п-1 позицию, а для X - п позиций. 2.8.2. Спецификация I В общем виде iw, где w - количество позиций для записи числа. Спецификация I используется для ввода - вывода информации только целого типа. Поэтому переменная, которой присваивается считанная величина, обязательно должна быть целого типа (начи- наться с букв I, J, К, L, М, N или должна быть описана при помощи оператора INTEGER). В противном случае при трансляции будет обнаружена ошибка. Пример. 2.30. Пример ввода данных по спецификации I. READ (5, 3)11, К 3 FORMAT (14, 15 ) Если ввести подряд 9 цифр, то переменной И присвоятся числа из первых 4 позиций, а переменной К присвоятся числа из следую- щих 5 позиций. Если при вводе цифр будет больше чем 9, то лиш- ние символы будут проигнорированы. Пример. 2.31. Пример вывода по спецификации I. WRITE (5, 4 ) И, К 4 FORMAT (1Х , 'Переменная 11=' , 14 , 2Х , 'Переменная K = ' , I 5 ) 30 При выполнении данного блока в строке отступается один про- бел (спецификация 1Х), выводится на экран текст: «Переменная 11=», следом числовое значение переменной II будет выведено в четырех позициях, через два пробела после этого выводится текст: «Переменная К=», и в следующих пяти позициях выводится число- вое значение переменной К. Если 11=123, Л=10005, то на экране будет представлена следую- щая информация: •—.Переменная 11=1_Л231_1_|Переменная К=10005 Примечания: 1) при форматном выводе в начале каждой новой строки целе- сообразно отступить хотя бы на один пробел, т.к. первая позиция строки служит для управления режимом вывода информации; 2) если количество символов в переменной меньше, чем количе- ство позиций для записи числа, то сначала отступается несколько пробелов, а затем выводится само число. Если же количество сим- волов больше количества позиций, то на экран выводятся символы « *» (звездочка). Пример 2.32. Примеры вывода чисел по спецификации I Тип переменной Значение переменной Вывод переменной по спецификации 12 13 14 Integer 23 23 ._i23 1 • .23 Integer 127 * * 127 i_il27 Real 10.25 * * * * * * * * * Примечание: число 10,25 является вещественным и по формату I выведено не будет. 2.8.3. Разделители Разделителем оператора FORMAT может быть запятая («,») или символ «слэш» («/»). Символ «слэш», расположенный в тексте опе- ратора FORMAT, означает переход на новую строку или новую за- пись. Для продолжения вывода информации в текущей строке ис- пользуется символ «обратный слэш» («\»), 31 Первая позиция каждой строки при выводе информации служит для управления печатью. Если в первой позиции стоит символ i_i (пробел) или текстовый символ, то вывод осуществляется в текущей строке. При этом информация, попадающая в первую позицию, теря- ется. Если в первую позицию заносится «О» (ноль), то информация выводится через одну строку. Одна страница при выводе на печа- тающее устройство содержит 63 строки, а при выводе на экран - 25. Пример 2.33. 11 = 123 К=10005 PRINT 6, И, К 6 FORMAT ( 2Х , 13 / 4Х , 15 ) После выполнения оператора FORMAT на одной строке экрана будет выведен 1 пробел (1 пробел теряется) и значение Л , на сле- дующей строке - 3 пробела (1 пробел теряется) и значение К, т.е. на экране будет выведено 1__)123 i_I_I_J1 0005 Пример 2.34 WRITE (5,10) 10 FORMAT (1Х,' Введите значение х= ' \) READ (5,*) х Данный блок сработает следующим образом: появится надпись «Введите значение х=». Вводимое число будет отображаться сразу после знака «равно» (из-за знака «обратный слэш»). Если не ис- пользовать «обратный слэш», то вводимое число будет отображать- ся на следующей строке, что менее наглядно. ' 32 2.8.4. Спецификация F Используется для ввода-вывода данных только вещественного типа. Позволяет вводить и выводить информацию с фиксированной десятичной точкой. Общая запись спецификации F где w - количество позиций, отведенных под число, включая знак и десятичную точку; d - количество позиций из w, в которых размещается дробная часть числа. Пример 2.35. Пример ввода информации по спецификации F. Информация для ввода по спецификации F может быть пред- ставлена в 2 формах: без десятичной точки и с десятичной точкой. Пример 2.36. Пример ввода информации без десятичной точки. Предположим, что на экране дисплея мы набрали следующую ин- формацию: Ввод значения переменной А производится по формату F6.2 (см. пример 2.35). Это значит, что первое число будет читаться из первых 6 (w = 6) позиций, из которых 2 последние позиции id = 2) будут счи- таться дробной частью вводимого числа. Переменной А присвоится значение 123,45. Затем будут пропущены два символа 6 и 7 (так как используется пропуск символов по формату 2Х) и произведётся счи- Fw.d READ (5,11) А,В 11 FORMAT ( F6.2 , 2Х , F8.4 ) n i 2 3 4 5 A 7 K Q n i 2 3 4 5 6 7 8 9 -у Г~ w=6 2Х w=8 33 тывание значения переменной В по формату F8.4, т.е. её значение составит 8901,234000. Последние цифры 5, 6, 7, 8, 9 не входят в пере- чень описанных в операторе FORMAT полей и считыватъся и обра- батываться не будут. Пример 2.37. Пример ввода информации с десятичной точкой. В этом случае параметр d не играет никакой роли, а число читается из отведенного для числа количества позиций w. Для спецификации F6.2 можно задавать численные данные -123.5 99999. .10005 При вводе данных с десятичной точкой в виде w=6 2Х w=8 получим значения переменных А = 1,2345, В = 890123,4. Цифры 6 и 7 будут пропущены по спецификации 2Х. Последние цифры (5, 6, 7, 8, 9) не прочитаются, так как выходят за пределы обрабатываемых полей. Пример 2.38. Пример вывода информации по спецификации F Тип перемен- ной Значение переменной Вывод переменной по спецификации F6.2 О F5.2 О F7.3 О Real 12,3456 • 1 1 2 . 3 5 1 2 . 3 5 U-.1 2 . 3 4 6 Real -98,76 - 9 8 . 7 6 * * * * * - 9 8 . 7 6 0 Real -0,100056 i 1 1 - . 1 0 L J - . 1 0 U U - . 1 0 0 Integer 123 * * * * * * * * * * * $ 4 е • • • % • Примечание: число 123 является целым и по формату F выведено не будет. 34 При выводе по формату F5.2 максимальное число, которое можно вывести, - числа из интервала [ -9,99 ; 99.994(9)]. Для примера: А = 99,989 - выведет по этому формату; А = 99,999 - не выведет по этому формату, так как d = 2, то оставшуюся дробную часть округлит и все число округлится до 100, а число 100 вывести по этому формату нельзя). Примечание: если выводимое число не может быть выведено по указанному формату (например, число 100 по F5.2), то вместо числа в отведенных позициях напечатаются символы «* »" (для числа 100 выведет ******). 2.8.5. Использование повторителей в операторе FORMAT Повторители рекомендуется использовать, когда по формату вводится/выводится несколько переменных. С их использованием строка с оператором FORMAT получается короче и нагляднее. Ра- боту с использованием повторителей рассмотрим на примере. Пример 2.39. READ (5,8) А, В, X, V 8 FORMAT ( F4.2, 3F5.3 ) В этом примере переменная А будет читаться по формату F4.2, а переменные В, X, V будут считываться по формату F5.3, который из-за повторителя (цифра 3) сработает, как сработала бы следующая строка: 8 FORMAT ( F4.2, F5.3, F5.3, F5.3) То есть в данном примере повторитель (цифра 3) заменил три F5.3. Кроме того, повторители могут использоваться для группы форматов: READ (5,9) X, В, С, К, D1, D2, М 9 FORMAT ( F6.2, 2 ( 2F4.2, 13 ) ) 35 2 — повторитель, который обозначает, что группа форматов по- вторяется два раза. Порядок считывания по форматам: X - по F6.2; В и С - по F4.2; К - по 13; D1 и D2 - по F4.2; М - по 13. Примечание: если группа форматов заключена в скобки и число повторителей перед скобкой не указано, то группа форматов бу- дет повторяться бесконечное число раз до тех пор, пока не будет исчерпан список оператора ввода/вывода. Все данные должны быть расположены в одной строке. Для пере- хода на другую строку при вводе (выводе) информации в операторе FORMAT в качестве разделителя используется символ «/» - «слэш». 2.8.6. Спецификация Е Спецификация Е используется для ввода - вывода данных веще- ственного типа и позволяет вводить и выводить информацию с фиксированной десятичной точкой. Общая запись спецификации Е - 0 . x x x . . . x E ± 0 Y ^ ) > w где w - количество позиций, отведенных под число, включая знак, десятичную точку, показатель экспоненты и степень; d - количество позиций из w, в которых размещается дробная часть числа. При выводе по спецификации Е обязательно должно выполнять- ся условие w-d 2> 7. Это происходит из-за того, что 3 позиции в начале выводимой строки и 4 позиции в конце строки отводятся под вывод служебной информации. Если на компьютере установлено гашение незначаще- го нуля, то w-d S 6. 36 Необходимо предусматривать достаточное количество цифр после запятой (параметр d), иначе при выводе будет происходить округле- ние отбрасываемой части и результат может сильно измениться. Данные по спецификации Е12.5 выводятся в не совсем обычном виде: 0 выводится как 0.00000Е+00 1 выводится как 0.10000Е+01 101 выводится как 0.10100Е+03 0.0012 выводится как 0.12000Е-02 Пример 2.40. Примеры вывода числа 1,4878960 по различным форматам Е Формат вывода Результат Погрешность Е9.1 0.1Е+01 49% Е9.2 0.15Е+01 1 % Е10.3 0.149Е+01 0,01 % Примечание: при бесформатном выводе данные автоматически выводятся по спецификации Е15.7. 2.8.7. Спецификация Gw.d Спецификация G является универсальной и может применяться как для ввода и вывода переменных целого типа, так и веществен- ного. Для переменных целого типа формат Gw.d соответствует и ра- ботает как формат lw. Для переменных вещественного типа при вводе информации она может быть представлена как по формату Fw.d, так и по формату Ew.d. То есть если информацию вводить без десятичной или с деся- тичной точкой, то спецификация G будет полностью работать как формат F. Если информацию вводить с плавающей запятой, то спе- цификация G будет работать как формат Е. 37 Пример 2.41. Пример вывода различных значений переменной Z по формату G8.2 WRITE (*,10)Z 10 FORMAT ( 1Х, G8.2 ) Тип перемен- ной Значение переменной Z G8.2 1 L-L..I 1—L. Л „1 1 Примечание INTEGER 1235 1 • 1 1 11 2 3 5 аналогично формату 18 REAL -98,762 ы ш - 9 8 . 7 6 аналогично формату F8.2 То же -12345,67890 - . 1 2 Е + 0 5 аналогично формату Е8.2 (если установлено гашение нуля) -12345,67890 * * * * * * * * не установлено гашение нуля Предыдущий пример может быть переписан проще и короче без использования оператора FORMAT: WRITE ( V ( 1Х , G8.2 ) " ) М или PRINT ' (1Х , G8.2 ) ' , М Запись операторов ввода - вывода с оператором FORMAT длин- нее, но позволяет несколько раз использовать один и тот же опера- тор FORMAT, обращаясь к нему из разных мест программы. 2.9. Операторы условия Оператор условия служит для изменения порядка выполнения операторов в зависимости от какого-либо условия. Этот оператор используется для организации циклов, выбора и разветвлений. В Фортране существуют два вида операторов условия: логический и арифметический. 2.9.1. Логический оператор условия Общая форма логического оператора условия имеет следующий вид: 38 IF ( <условие> ) THEN <операторы 1> ELSE <операторы 2> END IF Действие оператора условия заключается в следующем: ЕСЛИ условие удовлетворяется, ТО действие программы передается груп- пе операторов, следующих после THEN, в противном случае (ИНАЧЕ) выполняются операторы, следующие за ELSE. Условие всегда заключается в скобки. В программах может использоваться сокращенная конструкция (без использования блока ELSE, также может отсутствовать THEN). Если в сокращенной конструкции условие не удовлетворя- ется, то действие программы передается оператору, следующему за блоком оператора условия, т.е. все операторы, следующие после THEN, игнорируются. В условиях, следующих за оператором IF, происходит сравнение значений двух выражений или переменных. Эти выражения разде- ляются операцией отношения (табл. 2.3). Таблица 2.3 Математическая операция Запись на Фортране > .GT. > .GE. = .EQ. Ф .NE. < .LE. < .LT. 39 Пример 2.42. IF (A .GT. В ) Y = SIN(X) В этом примере используется сокращенная конструкция (без ис- пользования THEN). Если А больше В, то Y присваивается значение sin(x). Затем после этого оператора будет выполняться следующий за ним. Если А меньше или равно В, то оператор присваивания Y= игнорируется и выполняется оператор, следующий после IF. Пример 2.43. IF (z .EQ. 0. ) THEN PRINT V Z равно 0 ' ELSE PRINT V Z не равно 0 '. END IF В этой записи при z - 0 на экран будет выведено сообщение 'Z равно 0', во всех остальных случаях - сообщение 'Z не равно 0'. Кроме операций отношения используют и логические операто- ры, с помощью которых можно организовать более сложные усло- вия (табл. 2.4). Таблица 2.4 Логическая операция Запись на Фортране 'И' .AND. 'ИЛИ' .OR. 'НЕТ' .NOT. Пример 2.44. IF ( х .GE. 1.0 .AND. х .LE. 3.0) THEN PRINT *,' X принадлежит отрезку ' ELSE PRINT V X не принадлежит отрезку ' END IF 40 В этой записи при одновременном выполнении условий х ^ 1 и х<3 (т.е. л;е[1,3]) на экран будет выведено сообщение 'X при- надлежит отрезку', во всех остальных случаях - сообщение 'X не принадлежит отрезку'. Пример 2.45. Показать решение примера 2.44, используя сокра- щенную форму оператора условия. Решение. IF (x.GE.1.0 .AND. x.LE.3.0) PRINT *,'Х принадлежит отрезку' IF (x.LT.1.0 .OR. x.GT.3.0) PRINT *,'X не принадлежит отрезку' Пример 2.46. Записать условие, согласно которому если а + b < с < 5 COS(JC) , то на экран выводятся значения а, Ь, х. IF (А+В .LE. С .AND. С .LT. 5.*COS(X)) PRINT *, А, В, X В этом примере сначала определяется истинность логического выражения, стоящего в скобках (а + Ь< с < 5COS(JC)). Если условия в скобках соблюдаются, то на экран выводятся значения а, Ь, х. Ес- ли условия в скобках не соблюдаются, то действие передается на оператор, следующий за оператором условия. Пример 2.47. Составить программу для вычисления площади тре- угольника по формуле Герона S = -Jр • (р - а) • (р - Ь) • ( р — с) , где а + Ь + с Р — 2 — Алгоритм При выполнении программы предусмотрим: 1. Ввод исходных данных (значения сторон треугольника а, Ъ, с). 2. Вычисление полупериметра р и площади S 3. Вывод значения площади на экран. Программа на языке Фортран (с пояснениями) ! Программа вычисления площади треугольника 41 REAL a, b, c, p, S В этом месте программы типы переменных определяются как вещественные. WRITE (5,*)' Введите стороны треугольника А, В, С ' На экран (цифра 5) выводится текст-подсказка 'Введшие сто- роны треугольника А, В, С'. Символ * означает, что вывод бес- форматный (произвольный). READ (5,*) а, Ь, с Данная строка расшифровывается так: ввести с клавиатуры числовые данные для переменных а, Ь, с. Символ * — бесформатный упрощенный ввод. Вычисляется значение полупериметра: р=(а+Ь+с)/2 Вычисляется значение площади треугольника: S=SQRT (p*(p-a)*(p-b)*(p-c)) WRITE (5,1) a, b, с, S На экран (цифра 5) по формату (оператор формата находится после метки 1) выводится информация, находящаяся в списке вы- вода за скобками оператора WRITE. 1 FORMAT ( l x , ' Площадь треугольника со сторонами Л, 3F5.2, ' равна', F6.3) При использовании этого оператора на экране появится текст Площадь треугольника со сторонами, затем - численные значе- ния переменных а, Ь, с, значения которых выводятся по формату F5.2, затем текст равна, и численное значение переменной S вы- водится по формату F6.3. END 42 2.9.2. Арифметический оператор условия Общая форма арифметического оператора условия имеет сле- дующий вид: IF ( <арифметическое выражение> ) ГТН, m2, ГП3 > где гг>1, т 2 , т з - метки операторов, на которые будет передаваться управление программой. Арифметический оператор условия работает следующим образом: 1) вычисляется арифметическое выражение в скобках; 2) вычисленное значение сравнивается с нулём: если оно меньше нуля, то управление передаётся на метку Шь если значение равно нулю, то управление передаётся на метку ш2, если значение больше нуля - на метку т 3 . С помощью IF арифметического, к примеру, можно проверять подкорневое выражение, и если оно окажется отрицательным (по законам математики нельзя извлечь корень квадратный из отрица- тельного числа), то управление передастся на нужную метку и пре- рывания выполнения программы при попытке вычисления корня из отрицательного числа не произойдёт. Примечания: 1. В арифметическом операторе условия всегда должны быть три метки, две из них могут быть одинаковыми. 2. Метки могут быть расположены в любом месте программы (выше или ниже оператора IF). 3. Рекомендуется ставить метку перед оператором, следую- щим после IF арифметического. 4. IF арифметический не может быть последним оператором в цикле DO. 5. Если в качестве условия имеется неравенство, то его необхо- димо привести к виду, при котором происходит сравнивание вы- ражения с нулём. Например, выражение a2 + b2 > г следует при- ••у л вести к виду а +ЬГ>®- 43 Пример 2.48. IF ( z ) 10, 20, 10 10 WRITE (*,*) ' Z не равно 0 ' GOTO 30 20 WRITE (V) ' Z равно 0 ' . 30 ... В этой записи при z = 0 программа перейдет к метке 20 и на эк- ран будет выведено сообщение 'Z равно 0', во всех остальных слу- чаях ( z < 0 или z > 0 ) программа перейдет к метке 10 и выведет сообщение 'Z не равно 0'. Следует обратить внимание на оператор GOTO (особенности его работы рассмотрены в п. 2.11.1). В этом фрагменте программы он используется для пропуска группы опера- торов, стоящих после метки 20. Если не использовать этот опера- тор, то на экране будут выведены два сообщения одновременно. Пример.2.49. Доработаем программу примера 2.47, предусмотрев проверку исходных данных на корректность (если значения длин сторон треугольника меньше или равны нулю или если самая длин- ная сторона больше, чем полупериметр, то треугольник не сущест- вует) при помощи арифметического оператора условия. В п. 1 алгоритма примера 2.47 после ввода исходных данных предусмотрим их проверку на корректность. Программа на языке Фортран (с пояснениями) ! Программа вычисления площади треугольника REAL а, Ь, с, р, S ! Ввод исходных данных 10 WRITE (**)' Введите стороны треугольника а, Ь, с ' READ (*,*) а, Ь, с ! Проверка исходных данных на корректность IF (а) 10, 10, 11 44 Проверка введенных исходных данных: сторона треугольника не может быть отрицательной или равна нулю. 11 IF (Ь) 10, 10,12 12 IF (с) 10, 10, 13 Вместо этих трех операторов можно использовать один: IF ( AMIN1(a,b,c)) 10, 10,13 ! Вычисление полупериметра 13 р=(а+Ь+с)/2 ! Проверка условия существования треугольника, вычисление площади и вывод результата IF (АМАХ1 (a,b,c)-p ) 6, 8,9 Встроенные функции AMIN1, АМАХ1 из списка переменных, пе- речисленных в скобках, выбирают минимальное (максимальное) число. Последний оператор обозначает: если максимальная из сто- рон равна полу периметру, то управление передается на метку 8. Если максимальная из сторон меньше полупериметра, то идем на метку 6 и вычисляем площадь, иначе — идем на метку 9. 6 S=SQRT (p*(p-a)*(p-b)*(p-c)) WRITE (*,7) S 7 FORMAT (1x,' Площадь треугольника равна', F6.3) GO ТО 14 8 WRITE (*,*)' Площадь треугольника равна нулю ' GO ТО 14 9 WRITE (*,*)' Такой треугольник не существует' 14 END 2.10. Операторы цикла Цикл является типичной структурой алгоритмов, реализуемых на компьютере. Для организации циклов в алгоритмических языках предусмотрены специальные операторы. 45 2.10.1. Оператор цикла DO Оператор цикла DO может быть представлен в одной из сле- дующих форм: 1-я форма ie кош значение ' значение ^ ^ начальное ^ „ нечное ^ ^ DO <переменная>=< > , < > , <игаг> г ъипиоипо ' •зипио-ино ' <операторы> END DO 2-я форма ^^ ^ ^ ^ начальное ^ ^ конечное ^ DO <метка> <переменная>=<знтент >, < значение> > <шаг> <операторы> <метка> CONTINUE или <оператор> Если шаг равен 1, то <шаг> можно опустить. Операторы, распо- ложенные между операторами DO и END DO, образуют тело цикла и выполняются многократно. DO является оператором начала цик- ла, END DO (CONTINUE) - оператор конца цикла. Выполнение цикла, образованного оператором DO, заключается в следующем: переменной присваивается начальное значение, и она сравнивается с конечным значением. Если значение переменной при положительном шаге не больше (или при отрицательном шаге не меньше) конечного значения, то выполняются операторы тела цикла и по последнему оператору цикла (например, END DO, CONTINUE) осуществляется возврат к началу цикла. К текущему значению переменной прибавляется шаг (со своим знаком), и снова проверяется условие. Если условие удовлетворяется, то тело цикла выполняется повторно. В противном случае происходит выход из цикла и переход к оператору, следующему за последним операто- ром цикла. Так как первая проверка условия выхода из цикла осу- ществляется до первого выполнения тела цикла, то возможна си- туация, когда тело цикла не будет выполнено ни разу. Примечания: 1) после окончания цикла переменная цикла всегда сохраняет значение большее, чем конечное значение цикла; 46 2) в случае выхода из цикла до его завершения переменная сохра- нит свое текущее значение. Пример 2.50. DO J = 2 , 20 , 2 В приведенном примере переменная J PRINT *, J, J*J принимает значения 2, 4, 6, 8, ..., 20. В ре- END DO зультате выполнения цикла на экран будут выведены значения J v i f . Используя вторую форму, этот цикл можно записать еще двумя способами: DO 10 J = 2 , 20 , 2 DO 10 J = 2 , 2 0 , 2 PRINT*, J, J*J 10 PRINT*, J, J* J 10 CONTINUE Цикл можно организовать также с помощью оператора условия (см. пример 2.55). 2.10.2. Оператор цикла DO WHILE Наряду с циклом DO может использоваться оператор цикла DO WHILE. Он также может быть записан двумя способами: 1-й способ 2-й способ DO WHILE (<условия>) DO <метка> WHILE (<условия>) <операторы> <операторы> END DO <метка> <оператор> Условия в операторе DO WHILE записываются так же, как и в логическом операторе условия IF. Следует обратить внимание на то, что при написании программ следует избегать зацикливания (бесконечного цикла). Для этого не- обходимо организовывать цикл так, чтобы переменная, входящая в условие цикла, изменяла в нем свое значение. 47 Пример 2.51. Организовать цикл, приведенный в примере 2.50, с помощью оператора DO WHILE. 1-й способ 2-й способ J=2 DO WHILE ( J .LE. 20) WRITE (V) J, J \J J=J+2 END DO J=2 DO 20 WHILE ( J .LE. 20) WRITE (V) J, J*J 20 J=J+2 2.10.3. Оператор выхода из цикла Для прекращения выполнения некоторого блока цикла програм- мы или экстренного выхода из него служит оператор EXIT. Пример 2.52. 2.11.1. Оператор безусловного перехода GOTO Операторы безусловного перевода используются для быстрого пе- рехода к другим операторам программы. Общий вид оператора GOTO < метка > Этот оператор передает управление первому оператору после указанной метки. INTEGER i REAL А(ЮО), pr В приведенном фрагменте про- граммы вычисляется произведение элементов массива (ввод элементов массива опущен). Если хотя бы один элемент равен нулю, то проис- ходит выход из цикла. рг= 1.0 DO i = 1 , 100 IF(A(i).EQ. 0 .0) EXIT pr = pr * A(i) END DO 2.11. Операторы перехода 48 Пример 2.53, В результате выполнения про- грамма сначала затребует ввод значе- ния х, затем выведет значения х и sin(x) на экран и после этого вновь вернется к запросу ввода значения х. 2.11.2. Вычисляемый оператор перехода GOTO Общий вид вычисляемого оператора GOTO GOTO (mi , m2 , ГП3,..., mn) <арифметическое выражение> > где m-i, m2, m3,..., mn - метки операторов, на которые будет пере- даваться управление программой; значение арифметического выра- жения - целое число. При выполнении оператора сначала вычисляется значение арифметического выражения. Если полученное значение равно 1, осуществляется переход к метке т\, если 2 - то к метке Щи т. д. Если значение выражения меньше 1 или больше числа указанных меток, то управление передается оператору, следующему за опера- тором GOTO. Пример. 2.54. GOTO (4,5,6) К Если значение К равно 2, то управ- 7 PRINT К ление будет передано метке 5 (будет выведено значение К2). Если значение 5 PRINT К**2 выражения меньше 1 или больше 3, то следующим будет выполняться опера- тор после метки 7 (будет выведено значение К). 2.11.3. Оператор условного перехода Для передачи в зависимости от условия используется оператор перехода IF-GOTO, который образуется комбинацией двух опера- торов - оператора условия IF и оператора безусловного перехода GOTO. Общая форма записи этого оператора 2 READ (V) х PRINT *, х, SIN(x) GOTO 2 49 IF ( <условие> ) GOTO < метка > Действие оператора условия заключается в следующем: если ус- ловие удовлетворяется, то действие программы передается группе операторов, стоящих после указанной метки. Пример.2.55. Цикл, приведенный в примере 2.50, эквивалентен следующему: J = 2 30 PRINT *, J, J*J J=J+2 IF ( J <= 20 ) GOTO 30 2.12. Работа с массивами Перед обработкой массивов их следует описать (см. п. 2.3.6): 2.12.1. Ввод массивов Предположим, что в программе описаны массивы DIMENSION А(10), В(8), С(5,6), D(4,3) Существуют 4 способа ввода массивов. Первый способ ввода массивов READ(V) А означает «ввести все числовые значения массива А в том количест- ве, сколько их описано в операторе DIMENSION ». 50 Недостатки Достоинства необходимо вводить числа до тех пор, пока массив не заполнится самый простой способ записи ввода массивов если вводится несколько массивов, то сначала полностью заполнится первый массив, затем без преду- преждения будут заполняться ос- тальные числа с клавиатуры можно вводить: S в строчку - через пробел или запятую; •S нажимая «Enter» после каждого введённого числа программа не начнёт выполняться, пока не будут введены все элемен- ты массивов Если имеется массив из 10 элементов, а при вводе в строке будет введено больше 10 элементов, то компьютер проигнорирует все лишние числа. Если же, наоборот, будет введено меньше 10 элемен- тов, то он будет ожидать ввода остальных чисел. Второй способ мода массивов В этом способе можно использовать внешний цикл DO: для одномерных массивов для двумерных массивов DO 18 1=1,10 DO 18 1=1,5 18 READ (*,*) A(l) ' DO 18 J=1,6 18 READ ( V ) C(I,J) или неявный цикл DO, где I изменяется от 1 до 10 с шагом 1: для одномерных массивов READ (*,*) (А(1), 1=1,10) для двумерных массивов READ (*,*) ( ( C(I.J), J=1,6), 1=1,5) В последней записи ввод элементов будет осуществляться по строкам. Для ввода элементов массива по столбцам можно поме- нять циклы для переменных, т.е. записать так: READ (*,*) ( ( C(I,J), 1=1,5), J=1,6) 51 Недостаток Достоинство нет возможности задавать количе- ство вводимых элементов (т.к. это количество указывается в програм- ме как постоянная величина), и для того,чтобы можно было ввести лю- бое их количество, необходимо делать изменения в программе таким способом можно вве- сти весь массив целиком или часть этого массива, что весьма удобно использовать в программе, когда массив не- обходимо заполнить не пол- ностью, а частично Третий способ ввода массивов для одномерных массивов READ ( V ) N READ (*,*) (A(l), 1=1 ,N) или аналогично READ ( У ) N, (A(l), 1=1 ,N ) Сначала вводится размер массива N, а затем вводятся N элемен- тов массива. Для двумерных массивов READ ( У ) М, N READ ( У ) ( ( C(I,J), J=1,N), 1=1,М) Здесь сначала вводится количество строк М массива, затем коли- чество столбцов N, и, наконец, вводятся MxN элементов массива. Достоинства: S используя такой ввод массивов, можно создать программы не для конкретных случаев, а для разных, когда количество данных и сами данные задаёт пользователь; S данный способ позволяет ввести только необходимое количе- ство элементов при любых размерах массивов. 52 2.12.2. Вывод массивов При выводе массивов можно использовать 4 способа ( Первый способ вывода массива WRITE (*,*) В При бесформатном выводе массива В на экран в строку будут выведены значения всех элементов массива, количество которых было описано в операторе DIMENSION. В каждой строке печата- ются по 4 числа вида (при соответствующей настройке - 5 чисел) -0.1000567Е-01 т.е. с точностью до 7 знаков после запятой. Недостаток этого способа заключается в плохой наглядности. Второй способ вывода массива Для одномерных массивов с использованием внешнего цикла DO: DO 11 1=1, N При такой записи все числа будут 11 WRITE (*,*) B(l) выведены в столбец (по 1 числу в строке). или неявного цикла DO WRITE (V)(B( I ) , 1=1,N) Для этой записи все числа будут выведены в строку (по 4 числа в строке). Для двумерных массивов с использованием неявного цикла WRITE (V)( (D( I ,J ) , J=1,N), 1=1,М) Здесь также все числа будут выведены в строку (по 4 числа в строке). Достоинства: S позволяет вывести только часть массива; S количество выводимых элементов задаётся пользователем. 53 Недостаток - элементы выводятся на экран по 5 чисел в каж- дую строку. Третий способ вывода массива WRITE ( У ) ( Г В ( \ I , ' )= ' , В(1), 1=1,N) Здесь используется неявный цикл типа DO, по которому проис- ходит вывод имени массива с помощью текстовой константы, а за ним в скобках указывается номер выведенного элемента и через знак '=' само численное значение элемента массива: А(1) = число А(2) = число и т.д. Недостаток - весь массив будет разбросан по экрану дисплея. Достоинство - имеется возможность вывода каких-либо пояс- нений. Четвертый способ вывода массива Самый удобный способ вывода массива - использовать вывод по формату с повторителем: WRITE (*,12) ( A(l), 1=1,10) 12 FORMAT (10 (2х, F5.2)) В результате выполнения этой записи на экран будут выведены 10 чисел по формату F5.2 через 2 пробела. WRITE (M3)((D(I,J), J=1,3), 1=1,4) 13 FORMAT ( 3 (2х, F5.2)) В результате выполнения этой записи на экран будет выведен массив, причем в 4 строках по формату F5.2, будет выведено по 3 числа, расположенных через 2 пробела. 2.12.3. Примеры обработки массивов Пример 2.56. Составить программу вывода значений массивов А и В размерностью 10 и массива С, каждый элемент которого является результатом сложения элементов массивов А и В, в виде таблицы | N | Массив А | Массив В | Массив С | 54 Программа на языке Фортран (с пояснениями) ! Программа вывода массивов в виде таблицы DIMENSION А(10), В(10), С(10) READ(*,*) А DO 1 1=1, 10 WRITE (*,2) I 2 FORMAT (1Х , ' Введите элемент В ( ' , 12 , ' )= ' \ ) Символ «\» (обратный слэш) отменяет переход на новую строку. 1 READ (*,*) B(l) DO 3 1=1, 10 3 C(I)=A(I)+B(I) ! Вывод шапки таблицы WRITE(*,4) 4 FORMAT (1Х , 34 (' = ')) WRITE(*,5) 5 FORMAT(1X, N | МАССИВ А | МАССИВ В | МАССИВ С Г) DO 6 1=1, 10 6 WRITE(*,7) l,A(l),B(l),C(l) 7 FORMAT (1Х, 38 ('-') / 1Х , ' | 1 2 | 3 ( F9.3 | ' ) ) Выводится линия из символов «-», затем осуществляется пере- ход на другую строку, печатается номер и по одному значению элементов трех массивов А, В, С. WRITE (*,4) Снизу таблицу подчеркнули двойной чертой END Пример 2.57. Составить программу вычисления произведения элементов массива Д20) , стоящих на нечётных местах. Программа на языке Фортран REAL D(20) READ (*,*) D p=1. DO 8 1=1, 20, 2 55 8 P=P*D(I) WRITE (*,9) p 9 FORMAT (2x, 'Произведение элементов равно', F7.3) END Программа будет по циклу брать только нечётные элементы (1, 3, 5...) и перемножать их друг с другом. Вычисление произведётся до 19 элемента и остановится, т.к. 19 - последний нечётный элемент этого массива. При / = 19 завершится последний цикл. Но затем к переменной I будет добавлена величина шага, равная 2, и новое значение I = 21 будет сравниваться с конечным значением 20. Поскольку I будет больше конечного значения, то осуществляется выход из цикла и управление будет передано оператору, следующему после ч последнего в области цикла, т.е. оператору WRITE. Следует обратить внимание, что после окон- чания цикла переменная цикла имеет значение большее, чем конечное значение в операторе цикла DO. Пример. 2.58. Составить программу нахождения наибольшего элемента массива 5(10,20) и его индексов. Программа на языке Фортран REAL В (10,20), maxb READ (*,*) ( ( B(I,J), J=1,20), 1=1,10) maxb=B(1,1) m=1 n=1 DO 1=1,10 DO J=1,20 IF(B(l,J).GT.maxb) THEN maxb = B(I,J) m = i n = j END IF END DO END DO WRITE (*, 13) maxb, m, n 13 FORMAT (2x,'Наибольший элемент массива равен', F7.3/ 'его индексы (' , 12 , ' , ' , 12 , ' ) ' ) END 56 2.13. Подпрограммы При написании программы возникают случаи, когда некоторая одинаковая совокупность действий должна выполняться в нескольких различных местах программы. Повторение каждый раз группы опера- торов, реализующих эти действия, приводит к увеличению объема программы. Чтобы избежать повторений и уменьшить объем про- граммы, указанную группу операторов можно записать в программе один раз и обращаться к ней, когда в этом возникает необходимость. Обособленную группу операторов, которую можно выполнять многократно, обращаясь к ней из различных мест программы, назы- вают подпрограммой. Чтобы подпрограмма при обращении к ней выполнялась каждый раз с новыми данными, ее нужно составить в общем виде, а исходные данные для работы передавать в перемен- ные подпрограммы (они называются формальными переменными) перед обращением к ней. Если, например, в программе требуется решить три квадратных уравнения с различными коэффициентами, то алгоритм нахождения корней квадратного уравнения целесообразно оформить в виде под- программы, используя для обозначения коэффициентов переменные. Перед каждым обращением к подпрограмме нужно задать этим пере- менным числовые значения, соответствующие коэффициентам решае- мых уравнений. Таким образом, использование подпрограмм приводит к уменьшению общего количества операторов в программе, и, следова- тельно, для размещения программы требуется меньше памяти. Подпрограммы обладают также некоторыми другими преимуще- ствами. Использование подпрограмм оптимизирует структуру про- граммы. Кроме того, облегчается отладка программы, так как рабо- та каждой подпрограммы может быть проверена по отдельности. Многие подпрограммы имеют дополнительную ценность, посколь- ку ими может воспользоваться не только тот, кто написал подпро- грамму, но и другие лица. В Фортране подпрограмма оформляется как группа операторов, которая должна выполняться при обращении к ней, и может запи- сываться несколькими способами: S непосредственно в основной (головной) программе; S в виде отдельного блока после головной программы; S в виде отдельного файла. 57 Общая структура программы может быть представлена, как на рис. 2.4. Program CALL END SUBROUTINE END Основная (головная) программа Подпрограмма 1 > Подпрограммы Подпрограмма п Рис. 2.4. Структура программы В Фортране к подпрограммам можно отнести: S оператор-функцию, задаваемую пользователем (результатом ее выполнения является имя функции); S подпрограмму-функцию FUNCTION (результатом ее выпол- нения является имя подпрограммы); •S подпрограмму-процедуру SUBROUTINE (результатом ее вы- полнения являются некоторые переменные, определяемые пользо- вателем). В результате выполнения подпрограмма-процедура может воз- вращать от 0 до сколь угодно большого количества значений, а подпрограмма-функция - только одно. 2.13.1. Оператор-функция Помимо стандартных функций (см. прил. 3) в программе можно определить и далее использовать другие (нестандартные) функции 58 (оператор-функции). Они используются в тех случаях, когда по од- ной и той же формуле необходимо производить большое количест- во вычислений с различными данными. Оператор-функция записы- вается в самом начале программы до первого выполняемого опера- тора. Общий вид записи оператор-функции <имя> ( <список параметров>) = <арифметическое выражение> Арифметическое выражение в правой части должно обязательно содержать хотя бы один из формальных параметров, указанных в скобках, но может содержать также и другие переменные, общие для всей программы. Значения этих переменных будут определять- ся при выполнении программы. Пример 2.59. Z (X,Y) = SQRT(X+Y) + ABS(Y)*2.*D Задавая различные значения X и Y, эта оператор-функция всегда будет вычислять арифметическое выражение по заданной формуле. Обращение к оператор-функции осуществляется путём указания имени функции и записи в скобках фактических параметров. Пример. 2.60. Вычислить с использованием оператор-функции арифметическое выражение Q=2.*SIN(X)+Z(A,B)+Z(3.2, COS(C))**2 При обращении к оператор-функции Z фактические параметры А и В будут подставляться вместо формальных параметров X и Y, за- тем будет осуществляться вычисление арифметического выражения оператор-функции. Результатом вычисления будет являться одно число, и это одно число возвращается на то место в программе, от- куда осуществляется обращение к оператор-функции. Затем идёт повторное обращение к оператор-функции Z. Во вто- ром случае фактическими параметрами являются константа (3,2) и выражение (COS(C)). Константа подставится вместо X, а вычислен- ное значение выражения будет подставляться вместо Y. Произво- 59 дится новое вычисление арифметического выражения оператор- функции. В результате получают новое число, которое возвращает- ся в программу на то место, откуда оператор-функция вызывалась второй раз. Переменная Z вычислится как 2*SIN(X) + результат Z1+ резуль- тат Z2. В одной программной единице может быть большое количество оператор-функций. Формальными параметрами могут быть только переменные. Фактическими параметрами могут быть переменные, константы, выражения и элементы массивов. Примечание: список формальных параметров оператор- функции должен соответствовать списку фактических парамет- ров при обращении к ней по очерёдности следования и типу данных. Имя оператор-функции должно соответствовать правилам фор- мирования имён языка Фортран, то есть все оператор-функции счи- таются вещественного типа, за исключением тех, имя которых на- чинается на буквы I, J, К, L, М, N. Пример 2.61. Составить программу для вычисления следующих выражений: d = yla2+b2 , е = л1а2 + d2 +2Jd2+b2 , f = ^a2+(3,5^e2+d2)2 , q = -\lf2+ sin2 x + cos2 у . Как можно заметить, во всех выражениях можно выделить об- V2 2 z +t . Эту общую часть можно записать в виде оператор-функции, к которой часто обращаются при вычислениях. Это избавляет нас от необходимости громоздкой записи для вычисления каждой формулы. 60 Программа на языке Фортран (с пояснениями) ! Программа № 3 - Вычисление выражений REAL a, b, d, х, у, z, t, е, f, q ! Описываем оператор-функцию FUN(z,t) = SQRT( z*z+t*t) ! Ввод исходных данных RITE (*,*)' Введите исходные данные' EAD (V ) а, Ь, х, у d = FUN(a,b) Обращаемся к оператор-функции FUN. Фактические параметры А и В при обращении подставляются вместо формальных Z и Т, и по ним производится вычисление. Результат вычислений в виде вещественного числа возвращается на место обращения к оператор- функции и затем присваивается переменной D. е = FUN(a,d) + FUN(d,b)*2. f = FUN(a,3.5*FUN(e,d)) q = FUN(f,FUN(SIN(x),COS(y))) При первом обращении к оператор-функции фактическими параметрами являются выражения SIN(X) и COS(Y). При втором обращении фактическими параметрами будут F и результат первого обращения к оператор-функции. WRITE ( M ) d , e , f, q 1 FORMAT(2X, 'D=\ F6.3,' E=\ F6.3,' F=\ F6.3,' Q=\ F6.3) END 2.13.2. Подпрограмма-функция FUNCTION В общем виде подпрограмма-функция записывается FUNCTION <имя> (<список формальных параметров>) <операторы> <имя> = <выражение> RETURN END 61 В качестве типа функции могут использоваться REAL, INTEGER, COMPLEX, CHARACTER. Список формальных параметров может состоять из имён пере- менных, имён массивов и символов «*» (для передачи метки в вы- зываемую подпрограмму-функцию). Внутри подпрограммы- функции могут быть любые операторы языка Фортран (операторы описания типов, ввода-вывода данных, циклов, условия и др.). Под- программа-функция может содержать свои операторные функции или обращаться к другим подпрограммам. Примечание: особенностью работы подпрограммы-функции яв- ляется то, что результатом вычисления является одно число, и этот результат должен быть присвоен имени функции. Оператор RETURN служит для выхода из подпрограммы FUNCTION и передачи результата вычисления в головную про- грамму на то место, откуда произошло обращение к подпрограмме- функции. Чтобы обратиться к подпрограмме-функции, необходимо (как и в случае с оператор-функцией) указать имя подпрограммы-функции и список фактических параметров. Список фактических параметров должен соответствовать списку формальных параметров по количе- ству, очерёдности следования, типу данных и размерности массивов (размерность массива в подпрограмме-функции не должна превы- шать размерности соответствующего массива головной програм- мы). Результатом работы подпрограммы-функции является одно число, и это число возвращается в программу на то место, откуда осуществляется вызов. Пример 2.62. Составить программу для вычисления выражений примера 2.61, используя подпрограмму-функцию. Программа на языке Фортран (с пояснениями) ! Программа № 3 - Вычисление выражений REAL a, b, d, х, у, z, t, е, f, q ! Ввод исходных данных WRITE (*,*)' Введите исходные данные ' READ ( У ) а, Ь, х, у d = FUN(a,b) 62 е = FUN(a,d) + FUN(d,b)*2. f = FUN(a,3.5*FUN(e,d)) q = FUN(f,FUN(SIN(x),COS(y))) WRITE ( M ) d , e, f, q 1 F0RMAT(2X, 'О^.Рб.З,' E=\F6.3,' F=\F6.3,' Q=',F6.3) END ! Подпрограмма-функция REAL FUNCTION FUN (Z,T) REAL z, t FUN = SQRT( Z*Z+T*T ) RETURN END 2.13.3. Подпрограмма-процедура SUBROUTINE Подпрограмма-процедура - основной объект программирования на языке Фортран. Любая большая задача разбивается на подпро- граммы, эти программы отлаживаются и тестируются по отдельно- сти. Головная программа служит лишь для ввода исходных данных, поочерёдного обращения к различным подпрограммам, записи и обработки полученных результатов. В программировании признан рациональным модульный принцип построения программ (разбие- нием на подпрограммы). Общий вид записи подпрограммы-процедуры: SUBROUTINE <имя> (<список формальных параметров>) <операторы> RETURN END Обращение к подпрограммам осуществляется с помощью опера- тора CALL <имя подпрограммы> (<список фактических парамет- ров>) Оператор CALL вызывает только одну подпрограмму. Обраще- ние с помощью оператора CALL сразу к нескольким подпрограм- 63 мам недопустимо. При выполнении этого оператора управление из головной программы передаётся в подпрограмму, где происходят все вычислительные действия. При достижении оператора RETURN осуществляется возврат в то место основной программы, из которого произошло обращение к подпрограмме, а именно к оператору, следующему за оператором CALL. Подпрограммы могут содержать обращения к другим подпрограммам. Отличия подпрограммы-процедуры от подпрограммы-функции: S имя подпрограммы-процедуры не имеет значения типа; •S результатом работы подпрограммы-процедуры могут быть од- но или несколько чисел, массив, несколько массивов. Эти результаты могут передаваться или не передаваться в головную программу; S список формальных параметров в подпрограмме-процедуре может отсутствовать. Правила соответствия формальных и фактических параметров те же, что и для подпрограмм-функций. Примечания: ^ списки имён переменных и имена меток каждой подпрограм- мы независимы друг от друга и могут повторяться; S вычислительный процесс каждой подпрограммы также неза- висим от головной программы; •S одна подпрограмма может обращаться к нескольким другим подпрограммам и может содержать оператор-функции; S стыковка между подпрограммами осуществляется только через список формальных - фактических параметров или посред- ством оператора COMMON. В предлагаемом пособии способ передачи данных в подпро- грамму с помощью оператора COMMON не рассматривается. 2.14. Работа с внешними файлами При работе с программой возникает необходимость многократно использовать одни и те же исходные данные. Для того чтобы дан- ные каждый раз не вводить с клавиатуры, гораздо удобнее получать их из внешних файлов. Кроме того, во внешних файлах очень удоб- но сохранять промежуточные результаты для их последующего ис- пользования. Имя файла данных складывается из названия (не более 8 симво- 64 лов) и расширения (не более трех), разделенных точкой. Как прави- ло, название файла и его расширение выбираются таким образом, чтобы они свидетельствовали о хранящейся информации. Файлам исходных данных обычно присваивают расширения ТХТ и DAT, а файлам результатов - ТХТ и REZ. При формировании файлов до- пускается не указывать расширение, тогда имя файла состоит из названия. Последовательность работы с внешними файлами такова: 1. Открыть внешний файл. 2. Прочитать данные из файла или записать данные в файл. 3. Закрыть внешний файл. Пример. 2.63. Примеры имен файлов исходных данных DATA.TXT MASSIV.DAT INDAT Пример 2.64. Примеры имен файлов результатов REZULT.TXT MASSIV.REZ ITOG 2.14.1. Оператор открытия файла OPEN Открытие файла данных осуществляется при помощи оператора имя OPEN („, FILE='< j - > A C C E S S = Direct ACTION= файла'' A V - u c o ° - [ Sequential Read f Write где n - номер канала связи (целое число большее 0); ACCESS - вид доступа к файлу (Direct указывается для файлов прямого доступа, Sequential (указывается по умолчанию) - для файлов последовательного доступа); ACTION — вид действия над файлом (READ - файл для считыва- ния информации, WRITE - для записи информации, READWRITE 65 (указывается по умолчанию) - для считывания и для записи). В операторе открытия файла могут использоваться и другие оп- ции (BLANK, BLOCKSIZE, CARRIAGECONTROL, DELIM, ERR, FORM, IOFOCUS, IOSTAT, PAD, POSITION, RECL, SHARE, STATUS). В связи с простотой рассматриваемых задач эти опции в пособии не описываются. Например, запись OPEN (1, File=' DATA.TXT') означает, что файл DATA.TXT открыт как файл последовательного доступа (не указана опция ACCESS) и может использоваться как для считыва- ния, так и для записи (не указана опция ACTION). Примечание: канал связи может быть открыт только для од- ного файла. 2.14.2. Оператор закрытия файла CLOSE Закрытие файла данных должно осуществляться после оконча- ния работы с ним при помощи оператора CLOSE (и), где п - номер канала связи, использованный для обмена информа- цией (тот же, что и в операторе OPEN). Например, запись CLOSE (1) означает, что канал номер 1 закры- вается для передачи данных (т.е. доступ к открытому внешнему файлу закрывается). 2.14.3. Примеры работы с файлами В Фортране имеется возможность работать с файлами данных последовательного и прямого доступа. Файл прямого доступа характеризуется тем, что доступ к нужной информации можно получить непосредственно, зная только ее рас- положение в файле. Это делает файлы прямого доступа сложными для использования. Файл последовательного доступа характеризуется тем, что поря- док следования данных в нем определяется последовательностью, в которой данные записываются на диск. Считывание из файла по- следовательного доступа возможно только в том же порядке, в ко- 66 тором данные хранятся в этом файле. Пересылка данных в файл по- следовательного доступа осуществляется при помощи оператора WRITE, считывание из файла - при помощи READ. Данные, передаваемые в файл при помощи одного оператора WRITE, называются записью. Таким образом, сформированный файл состоит из последовательности записей. Считывание из файла также осуществляется записями, т.е. при пересылке данных в сле- дующий элемент списка оператора READ выбирается следующая запись. Это необходимо учитывать при формировании файла. После окончания пересылки данных в файл последовательного доступа и выполнения оператора CLOSE на диске формируется признак конца файла. Пример 2.65. Составить программу для формирования файла по- следовательного доступа с именем DATA. В файл DATA должны быть переданы десять чисел, вводимых с клавиатуры. При форми- ровании файла будем нумеровать каждую строку. Real х OPEN (2, File= 'DATA', ACTION='Write') DO 1=1, 10 PRINT * , ' введите', I , '-e число' READ (*,*) x WRITE (2,*) x END DO CLOSE (2) END Пояснения к примеру. Оператором OPEN открывается файл DATA для записи и определяется канал с номером 2 для передачи данных. Далее в цикле по I последовательно вводятся числа и при- сваиваются переменной л. Каждое число сразу после ввода переда- ется в файл DATA по каналу с номером 2. Оператор CLOSE закры- вает файл. Пример 2.66. Составить программу, которая формирует массив В из данных, содержащихся в файле DATA. 67 DIMENSION B(10) OPEN (4, File= 'DATA', ACTION='Read') DO 1=1, 10 READ (4,*) B(l) PRINT *, B(l) END DO CLOSE (4) END Пояснения к примеру. В 1-й строке описывается массив В, со- стоящий из 10 элементов. Оператор OPEN открывает файл DATA для чтения и определяет канал с номером 4 для передачи данных. Далее в цикле для каждого значения / последовательно считывают- ся числа и присваиваются соответствующим элементам массива В{Г). Каждое число сразу после считывания выводится в столбец на экран. Оператор CLOSE закрывает файл. 3. ПРИМЕРЫ ВЫПОЛНЕНИЯ КОНТРОЛЬНЫХ ЗАДАНИЙ Задача 1 Уравнение деформированной оси гибкой нити на интервале (a, b) описывается уравнением q{x) = 5,91 sin(l,2 -х) + 2,69 cos (х +1,1). Требуется разработать программу вычисления координат точек нити в т промежуточных равноотстоящих точках интервала {а, Ь). При работе над задачей необходимо выполнить следующие этапы: 1. Описать математическую модель задачи и привести ее графи- ческую интерпретацию. 2. Начертить блок-схему алгоритма задачи. 3. Выбрать форму и формат печати исходных данных и резуль- татов выполнения программы на экран. Предусмотреть при этом вывод фамилии, имени, отчества студента, номера группы и шифра задания. 68 4. Написать текст программы на алгоритмическом языке Фортран. 5. Выполнить тестовый расчет по исходным данным. При решении задачи примем следующие значения исходных данных: интервал (4,0; 9,0), количество промежуточных точек т = 4. Р е ш е н и е 1. Математическая модель и графическая интерпретация задачи Изобразим графическую интерпретацию задачи. Для этого про- ведем оси координат хОу, нанесем точку А с координатами (а,0), точку В (6,0) и изобразим абстрактно функцию у = q(x) (рис. 3.1). Рис. 3.1. Графическая интерпретация задачи 1 Учитывая, что значения функции будут вычисляться в 4 проме- жуточных равноотстоящих точках интервала, вычислим расстояния между точками (шаг разбиения интервала): 69 h_Xb-Xa_9,0-4,0_1 m +1 5 (3-1) Разбив интервал (4,0; 9,0) на равные отрезки длиной h , находим абсциссы точек х\, ... , х4, в которых мы должны найти ординаты провисания. Графически легко определить, что координаты всех точек дго= 4,0, х\ = jco + h = 5,0, X2 = X0 + 2h = 6,0, ... , xs = х0 + 5h = 9,0, т.е., зная величину шага и координату начальной точки хо> в об- щем виде их можно записать xt — xо + i-h , где i = 1,4. (3.2) Вычисляя значения функции у = q(x) во всех промежуточных точках Xj(формула (3.2)), получим координаты соответствующих им точек Mj (/ = 1,4). Учитывая вышеизложенное, запишем математическую модель задачи в следующем виде: Вычислить q ( x i ) = 5,91sin(l,2 - Xj) + 2,69 cos (хг + Ц ) Дл я в с е х x, = ха + i-h = 4,0+1 > где xa=xo= 4,0 (по условию),h = 1,0 (формула (3.1)), i = M . 2. Блок-схема алгоритма задачи Предусмотрим в программе: - ввод исходных данных; - вычисление шага разбиения h ; - вывод исходных данных и значение шага для контроля на печать; - вычисление абсцисс х промежуточных точек и значений функции у = q(x)\ - вывод результатов расчета на экран. Блок-схема алгоритма представлена на рис. 3.2. 70 НАЧАЛО ^ / ввод a,b,m / — П — I" h=(b-a) / (m+l ) Г £ Вывод a,b,m,h i = l ,m [ x=a+i- |"y=5.91-sin(1.2-x)+2.69-cos(x-l.l) ^ Вывод i , X , y J С КОНЕЦ J Рис. 3.2. Блок-схема алгоритма задачи 1 Приведем краткое описание блок-схемы. В блоке 2 головной программы производится ввод исходных данных (концов интервала а и Ъ, числа промежуточных точек т). В блоке 3 вычисляется шаг разбиения. В блоке 4 исходные данные выводятся на печать для контроля. Затем в цикле, образованном блоками 5-8, где его счетчик i будет изменяться от 1 до т с шагом 1, последовательно произво- дится вычисление абсциссы х и соответствующей ей ординаты у, выводится на экран номер точки, ее абсцисса и ордината. В блоке 9 программа завершает свою работу. 71 3. Форма и формат печати исходных данных и результатов выполнения программы Контрольная работа по информатике Задача 1 студент группы 312514 Сергеев С.С. шифр ООО Исходные данные: интервал (04.0, 09.0) количество точек т-04 шаг разбиения h=1.00 Результаты: № X У 01 04.00 11.111 и т.д. 4. Программа на алгоритмическом языке Фортран REAL a, b, h, х, у PRINT *, 'Введите интервал (а, Ь)' READ (У ) a, b PRINT *,'Введите количество промежуточных точек т ' READ(У) т h = ( b - a ) / ( m + 1) WRITE ( * , 5 ) 'Контрольная работа по информатике' 5 FORMAT ( 5х , аЗЗ ) WRITE ( * , 6 ) 'Задача 1" 6 FORMAT (10х , а11) WRITE ( * , 7 ) 'студент группы 312514' 7 FORMAT (10х , а21) WRITE ( * , 8 ) 'Сергеев С.С.', 'шифр ООО' 8 FORMAT ( 5х, a 1 2 . 6 x . a 8 ) WRITE ( * , 9 ) 'Исходные данные:' 9 FORMAT ( 5 x , a 1 6 ) WRITE ( * , 10) 'интервал', a , b Ю FORMAT (1x , a8 , 4x , '( ' , f4.1 , ' ; ' , f4.1 ,')') WRITE ( * , 11) 'количество точек', m 11 FORMAT (1x , a30 , 1x , 'm = ' , i2) WRITE ( * , 12 ) 'Шаг разбиения', h 12 FORMAT ( 1 x , a 1 6 , 1 x , ' h = ' , f 4 . 2 ) WRITE ( * , 6 ) 'Результаты:' WRITE ( M 3 ) 13 FORMAT ( 7x , '№', 6x , 'x' , 6x, 'y') DO i = 1 , m x = a + i * h у = 5.91 * sin (1.2-x) +2.69* cos (x+1.1 ) WRITE ( * , 14) i , x , y END DO 14 FORMAT ( 6x , 12 , 4x , F5.2 , 4x, F6.3 ) END 5. Тестовый расчет Сведем вычисления координат точек нити в табл. 3.1. Значения уJ3 будем округлять до трех цифр после десятичной точки. Таблица 3.1 № точек (0 Результаты ручного счета Результаты расчета на компьютере к До- Погрешность, % XI 1 5,0 6,261 выполняется на лаборатор- ных занятиях Определяется на лаборатор- ных занятиях 2 6,0 7,729 3 7,0 2,091 4 8,0 -5,470 73 Примечание: погрешность определяется по формуле е,- = к р У1~Уг •100%. y t Задача 2 Составить программу вычисления значения функции У = х<5, х л/18-х , х > 5 . (3.3) При работе над задачей выполнить следующие этапы: 1. Описать математическую модель задачи. 2. Начертить блок-схему алгоритма задачи. 3. Выбрать форму и формат печати исходных данных и результа- тов вывода программы на экран. Предусмотреть при этом вывод фа- милии, имени, отчества студента, номера группы и шифра задания. 4. Написать текст программы на алгоритмическом языке Фортран. 5. Выполнить тестовый расчет по исходным данным. Р е ш е н и е 1. Математическая модель задачи Фактически математическая модель задачи описывается форму- лой (3.3). Проведем исследование области определения функции. При х < 5 функция — определена для всех х, кроме х = 0. По- х \ этому при х < 5 и х = 0 функция у не имеет значений, а при х <5 и х Ф 0 принимает значение у = —. 74 При х > 5 функция л / 1 8 - х определена для всех х < 18. По- этому при х> 5 и х > 18 функция у не имеет значений, а при 5 < х < 1 8 - y = J 1 8 - Х . Таким образом, при составлении программы будем учитывать область определения функции. 2. Блок-схема алгоритма задачи Предусмотрим в программе: - ввод значения х ; - вычисление значения у (с учетом области определения); - вывод результатов расчета на экран. Одна из возможных блок-схем алгоритма изображена на рис. 3.3. Рис. 3.3. Блок-схема алгоритма задачи 2 75 Приведем краткое описание блок-схемы. В блоке 2 головной программы производится ввод значения х . В блоке 3 определяется, по какой из функций производить расчет. Если х < 5 , то по функ- ции у = — и переходим к блоку 4, в противном случае ( х > 5) - по х функции у = Л/18-JC и переходим к блоку 5. Блоки 4 и 5 проверя- ют, удовлетворяет ли заданное значение х области определения. Если удовлетворяет, то вычисляется и выводится на экран значение функции (блоки 9-10), иначе выдается сообщение «функция не име- ет значений (блок 7)». В блоке 11 программа завершает свою рабо- ту. 3. Форма и формат печати исходных данных и результатов выполнения программы <а S >ч ю >я се О. X « са <и Контрольная работа по информатике Задача 2 студент группы 312514 Сергеев С. С. шифр ООО Результат : Прих - 11.00значение функции = 11.200 или При х = 11.00 функция не имеет значений 4. Программа на алгоритмическом языке Фортран REAL х, у PRINT *, 'Введите значение х ' READ ( * , * ) х WRITE (* ,5) 'Контрольная работа по информатике' FORMAT ( 5х , аЗЗ ) WRITE ( * , 6 ) 'Задача 2' FORMAT (10х,а11) WRITE ( * , 7 ) 'студент группы 312514' FORMAT (1 Ох, а21) 76 8 FORMAT ( 5x, a 1 2 , 6 x , a 8 ) WRITE ( * , 6 ) 'Результат :' IF ( x .GT. 5.) THEN IF ( x .LE. 18.) THEN у = SQRT( 1 8 - x ) WRITE ( * , 9 ) x, у ELSE WRITE ( * , 10) x END IF ELSE IF ( x .NE. 0.) THEN Y = 1 /X WRITE ( * , 9 ) x, у ELSE WRITE ( * , 10) x END IF END IF 9 FORMAT (1x, 'При x =', F5.2,' значение функции =', F6.3) 10 FORMAT (1x, 'При x =', F5.2,' функция не имеет значений') END 5. Тестовый расчет Выполним тестовые расчеты для нескольких значений х и зане- сем результаты расчета в табл. 3.2. Таблица 3.2 Значе- Результаты Результаты ние ручного счета расчета на компьютере - У У -10 -од 5 0,2 Выполняется на лабора- торных работах 0 Функцш не имеет значений 14 2,0 20 Функция не имеет значений 77 Задача 3 Составить программу вычисления произведения всех положи- тельных элементов 3-й строки массива А (т , п). Работа над задачей выполнить следующие этапы: 1. Описать математическую модель задачи. 2. Начертить блок-схему алгоритма задачи. 3. Выбрать форму и формат печати исходных данных и резуль- татов выполнения программы на экран. Предусмотреть при этом вывод фамилии, имени, отчества студента, номера группы и шифра задания. 4. Написать текст программы на алгоритмическом языке Фортран. 5. Выполнить тестовый расчет для массива Л (4, 5). 1. Математическая модель и графическая интерпретация задачи В соответствии с условием задан массив А, состоящий из т строк и п столбцов. Общий элемент массива обозначим через а^ (т.е. элемент, стоящий на пересечении i-Vi строки и у'-го столбца), тогда массив А предстанет в следующем виде: Р е ш е н и е an an an а\п а 21 an an a in А тхп ~ а31 а32 аъъ аъп ат 1 ат2 атз ••• атп Произведение элементов 3-й строки можно записать как п Я31 • «32 • Язз • • • ' • Язи - П аз j • у=1 78 С учетом того, что по условию необходимо вычислить произве- дение положительных элементов, перед перемножением следует определить, является ли элемент положительным. Таким образом, математическая модель задачи запишется так: в двумерном массиве Атх„ вычислить f [ a i д л я в с е х j > ® • м 3 2. Блок-схема алгоритма задачи Предусмотрим в программе: - ввод элементов массива Л и вывод их для контроля на печать; -вычисление произведения положительных элементов третьей строки; - вывод массива А и результата перемножения на печать. При составлении блок-схемы (рис. 3.4) ввод и вывод значений массива А предусмотрен без детализации. Рис. 3.4. Блок-схема алгоритма задачи 3 79 Приведем краткое описание блок-схемы. В блоке 2 головной программы производится ввод исходных данных (значений элемен- тов массива А). В блоке 3 осуществляется печать элементов массива А на печать. В блоке 4 счетчику произведения Р присваивается зна- чение 1, а счетчик положительных чисел L обнуляется. Затем дейст- вие передается циклу, образованному блоками 5... 7, где его счетчик j будет изменяться от 1 до 5 (количество столбцов массива). В блоке 6 производится сравнение элемента третьей строки массива с ну- лем. Если элемент больше нуля, то в блоке 7 счетчик произведения Р умножается на этот элемент, величина L увеличивается на 1 и за- тем происходит возврат к блоку 5 (если элемент меньше или равен нулю, то программа минует блок 6 и переходит к блоку 5), где но- мер столбца увеличивается на 1. После выполнения внутреннего цикла в блоке 8 определяется, есть ли положительные элементы в строке, и если есть (L > 0), то печатается результат произведения положительных элементов 3-й строки и программа завершает свою работу. Если положительных элементов нет (L = 0), то программа выдает соответствующее сообщение и завершает свою работу. 3. Форма и формат печати исходных данных и результатов выполнения программы Контрольная работа по информатике Задача 3 студент группы 312514 Сергеев С. С. шифр ООО Исходные данные: МАССИВ А -5.00__ 4.50__-6.00__ 6.50 -4.00 и т.д. Результат : Произведение равно 1111.11 Количество равно 11 или Положительных чисел нет к U ев S ю « ев О. * «В са <и 80 4. Программа на алгоритмическом языке Фортран DIMENSION А (4,5) REAL Р I ввод элементов массива DO i = 1 , 4 DO j = 1 , 5 PRINT 1 , i , j READ ( * , * ) A ( i , j ) END DO END DO 1 FORMAT ( 2x, 'Введите значение a ( ' , 12 , ' ; ' , 12 , ')=' \ ) PRINT 5 , 'Контрольная работа по информатике' 5 FORMAT ( 5х , аЗЗ ) PRINT 6 , 'Задача 3' 6 FORMAT (10х , а11) PRINT 7 , 'студент группы 312514' 7 FORMAT (10х , а16) PRINT 8 , 'Сергеев С.С.', 'шифр ООО' 8 FORMAT ( 5 х , а 1 2 , 6 х , а 8 ) PRINT * , ' Исходные данные: МАССИВ А' ! вывод элементов массива PRINT 2 , ((A(I,J), J=1,5), 1=1,4) 2 FORMAT ( 5 (2x, F5.2)) PRINT 6 , 'Результат :' P = 1. L = 0 DO j = 1 , 5 IF ( A ( 3 , j ) .GT. 0.) THEN P = P * A ( 3 , j ) L = L + 1 END IF END DO IF ( L GT. 0) THEN PRINT 3 , P , L ELSE PRINT * , ' Положительных чисел нет' END IF 81 3 FORMAT ( Зх, ' Произведение равно ' , F7.2 , / Зх, 'Коли- чество равно', 12) END 5. Тестовый расчет Примем для тестового расчета следующий массив: Произведение положительных элементов третьей строки равно На отрезке [а, Ъ\ задана функция / ( х ) = 1п(3х + 4) + sin(3 - х) . Требуется разработать программу вычисления при разбиении отрезка на п равных частей. Исходные данные: п = 36, [4,10]. При работе над задачей необходимо выполнить следующие этапы: 1. Описать математическую модель задачи и привести ее графи- ческую интерпретацию. 2. Начертить блок-схему алгоритма задачи. 3. Выбрать форму и формат печати исходных данных и резуль- татов выполнения программы на экран (предусмотреть вывод фа- милии, инициалов студента, номера группы и шифра задания). 4. Написать текст программы на алгоритмическом языке Фор- тран (предусмотреть ввод данных как из внешнего файла, так и с клавиатуры; вывод результата по формату как на экран, так и во внешний" файл). 5. Выполнить тестовый расчет по исходным данным (при п = 6). Л а * 5 -1,0 2,0 3,2 -1,3 1,5 0,3 2,1 0,8 3,4 -1,3 -1,2 1,4 5,6 -7,8 9,1 2,3 1,6 4,1 -1,7 4,3 2,0-3,2-1,5 = 9,6. Задача 4 82 Р е ш е н и е 1. Математическая модель и графическая интерпретация задачи Изобразим графическую интерпретацию задачи (рис. 3.5). * * э | [с * а | Рис. 3.5. Графическая интерпретация задачи 4 Шаг разбиения отрезка вычисляется по формуле п Разбив отрезок [а, 6] на равные отрезки длиной h , находим абсциссы точек, в которых мы должны найти ординаты функции. В общем виде их можно записать Xi=a+i-h ' где i = 0,п. Учитывая вышеизложенное, запишем математическую модель задачи в следующем виде: Для заданного отрезка [а, Щ, количества частей его разбиения П 83 п-1 вычислить S = A - £ /=0 f ( x i ) + ^ [ f ( x f ) где / ( * , ) = 1п(3 х/ + 4) + sin(3 - Х ( ) , Xi=a+i-h - h = i = 0,n-\. Ъ-а 2. Блок-схема алгоритма задачи Предусмотрим в программе: - ввод исходных данных ( а , Ъ , п ); - вычисление длины каждого участка h ; - вывод исходных данных для контроля на печать; - вычисление значений S i Д л я каждого значения Xi и и х сум- мирование; - вывод результатов расчета на экран. Блок-схема алгоритма представлена на рис. 3.6. ("начало ) ГЗвод а, Ь, п / Г3 Т , [h:=(b-a)/n: S:=0 л /Вывод a,b,n,h// V* . • v У K n - i V I IT Г* w ) j"f:=ln(3x+4)+sin(3-x) x:=a+i-h и f f yl:=f(x) [jy2:=f(x*x)A0.: E КОНЕЦ ) [S:=S+|yl+y2|*h| S / ( К О Н Е Ц ) 84 Рис. 3.6. Блок-схема алгоритма задачи 4 3. Форма и формат печати исходных данных и результатов выполнения программы Контрольная работа по информатике Задача 4 студент группы 312514 s | Сергеев С.С. шифр ООО Исходные данные: « о. отрезок [04.0, 09.0] 3 количество участков п=36 8 длина участка h=1.00 Результат вычислений 111.111 4. Программа на алгоритмическом языке FORTRAN PROGRAM Integral REAL a , b , h F ( x ) = LOG (3*x + 4) + SIN (3 - x) WRITE (*,*) 'ввод данных из файла ? [да-1, нет-др. цифра]' READ ( * , * ) к IF (k.EQ.1) THEN OPEN ( 1 , file = 'data1.txt') READ ( 1 , * ) a READ ( 1 , * ) b R E A D ( 1 , * ) n CLOSE(1 ) ELSE WRITE ( * , * ) 'введите отрезок [a,b]' READ ( * , * ) a , b WRITE ( * , * ) 'введите количество участков' READ ( * , * ) n END IF h = ( b - a ) / n DO i = 0 , n - 1 85 х = а + i * h s = s + h * ABS ( F(x) + SQRT ( F(X**2))) END DO OPEN ( 2 , file = 'rezultV ) WRITE ( 2 , 5 ) 'Контрольная работа по информатике' WRITE ( * , 5 ) 'Контрольная работа по информатике' 5 FORMAT ( 5х , аЗЗ) WRITE ( 2 , 6 ) 'Задача 4' WRITE ( * , 6 ) 'Задача 4' 6 FORMAT (10х , а11) WRITE ( 2 , 7 ) 'студент группы 312514' WRITE ( * , 7 ) 'студент группы 312514' 7 FORMAT ( 1 Ох, а16) WRITE ( 2 , 8 ) 'Сергеев С.С.' , 'шифр ООО' WRITE ( * , 8 ) 'Сергеев С.С.' , 'шифр ООО' 8 FORMAT ( 5х , а12 , 6х , а8 ) WRITE ( 2 , 9 ) 'Исходные данные:' WRITE ( * , 9 ) 'Исходные данные:' 9 FORMAT ( 5х, а16) WRITE ( 2 , 10)'отрезок', a , b WRITE ( * , 10) 'отрезок', а , Ь 10 FORMAT (1х , а7 , 4х ,'[ ' , f4.1 , ' ; ' , f4.1 , Т) WRITE ( 2 , 1 1 ) 'количество участков', п WRITE ( * , 11 ) 'количество участков', п 11 FORMAT ( 1 x , a 1 9 , 1 x , ' n = ' , i 2 ) WRITE ( 2 , 1 2 ) 'длина участка', h WRITE ( * , 12 ) 'длина участка', h 12 FORMAT ( 1 x , a 1 3 , 3 x , ' h = ' , f 4 . 2 ) WRITE ( 2 , 1 3 ) 'Результат вычислений', s WRITE ( * , 13 ) 'Результат вычислений', s 13 FORMAT (1x , a20 , Зх , f7.3) CLOSE(2 ) END 86 5. Тестовый расчет Выполним ручной счет при п = 6. Отрезок интегрирования [4;10]. Длина каждого участка интегрирования равна 1 0 - 4 h = 1,0. Вычислим значение функции / ( х ) в каждой точ- 6 ке отрезка. Расчет сведем в (табл. 3.3). Таблица 3.3 Xi f ( X i ) 4,0 1,931 1,879 5,0 2,035 2,092 6,0 2,950 1,928 7,0 3,976 2,029 8,0 4,291 2,499 9,0 3,713 2,235 I 18,896 12,662 п-1 i =0 fixd + J f b t j ) = 1 (18,896 + 12,662) = 31,558. Таблица 3.4 Результат ручного сче- та при п = 6 Результаты рас- чета на компью- тере при п = 6 Результаты рас- чета на компью- тере при п = 36 Погрешность расчета при раз- личных значе- ниях п, % 31,558 Выполняется на лабораторных занятиях 87 Задача 5 Отделить корень уравнения g(x) = 3—x2~e* = 0 и разработать программу его уточнения методом перебора с точностью 0,001. При работе над задачей необходимо выполнить следующие этапы: 1. Описать математическую модель задачи и привести ее графи- ческую интерпретацию. 2. Начертить блок-схему алгоритма задачи. 3. Выбрать форму и формат печати исходных данных и резуль- татов вывода программы на экран (предусмотреть вывод фамилии, инициалов студента, номера группы и шифра задания). 4. Написать текст программы на алгоритмическом языке Фор- тран (предусмотреть: ввод данных как из внешнего файла, так и с клавиатуры; вывод результата по формату как на экран, так и во внешний файл). 5. Выполнить тестовый расчет по исходным данным (для первых четырех шагов). Р е ш е н и е 1. Математическая модель и графическая интерпретация Вычисление корней алгебраических и трансцендентных нели- нейных уравнений вида g(x) = 0 с заданной наперед точностью обычно осуществляют путем применения какой-либо итерационной процедуры, состоящей в построении числовых последовательностей Хп , сходящихся к искомому корню х уравнения. Перед примене- нием процедуры отделяют отрезок [я, 6], на котором находится ко- рень уравнения. При решении нелинейного уравнения методом перебора задают- ся начальное значение аргумента х = х0=а и шаг h = е , который при этом определяет и точность нахождения корня. Пока выполня- ется условие g(x) • g(x + h) > 0 , аргумент х увеличиваем на шаг h (х = х + И) (рис. 3.7). Если произведение g(x) • g(x + И) стано- вится отрицательным, то на отрезке [х, x+h] существует решение h уравнения. За корень уравнения принимаем при этом х = х Н—. 88 Ь g(xo) | 1 " g(x l)l g ( * 2 ) l \ | > \ Xn—Xn-\+h хо=а x\—xo+h X2—XI+h v 1 X ^ y=g(x) Рис. 3.7. Графическая интерпретация задачи 5 2. Блок-схема алгоритма задачи Предусмотрим в программе: - ввод отрезка [a, b], на котором находится корень уравнения, и точности е ; - выбор начального значения аргумента ; - уточнение корня методом перебора; - вывод результата на экран и в файл. Блок-схема алгоритма представлена на рис. 3.8. 89 ( ^НАЧАЛО ) V2 1 / / Ввод х, eps / х:=а: h:=eps f Вывод x ! Q'конец ) Рис. 3.8. Блок-схема алгоритма задачи 5 3. Форма и формат печати исходных данных и результатов выполнения программы Контрольная работа по информатике Задача 5 студент группы 312514 Сергеев С. С. шифр ООО Исходные данные: к и св S >> Ю >5 Л >К 3 са 0) отрезок [4.0, 9.0] точность е=0.001 на 111 шаге значение х= 11.1111 Результат : значение корня равно 11.1111 90 4. Программа на алгоритмическом языке Фортран PROGRAM Uravnenie REAL а , b , eps , h, х , у , z INTEGER i , к G ( z ) = 3 - z**2 - EXP ( z ) WRITE (*,*) 'ввод данных из файла ? [да-1, нет-др. цифра]' READ ( * , * ) к IF (k.EQ.1) THEN OPEN ( 3 , file = 'data2.txt') R E A D ( 3 , * ) a R E A D ( 3 , * ) b READ ( 3 , * ) eps CLOSE(3 ) ELSE WRITE ( * , * ) 'введите отрезок [a,b]' READ ( * , * ) a , b WRITE ( * , * ) 'введите точность вычислений e' READ ( * , * ) eps END IF x = a h = eps OPEN ( 4 , file = 'rezult2') WRITE ( 4 , 5 ) 'Контрольная работа по информатике' WRITE ( * , 5 ) 'Контрольная работа по информатике' 5 FORMAT ( 5х , аЗЗ) WRITE ( 4 , 6 ) 'Задача 5' WRITE ( * , 6 ) 'Задача 5' 6 FORMAT ( 1 Ох, а11) WRITE ( 4 , 7 ) 'студент группы 312514' WRITE ( * , 7 ) 'студент группы 312514' 7 FORMAT (10х , а21) WRITE ( 4 , 8 ) 'Сергеев С.С.', 'шифр ООО' WRITE ( * , 8 ) 'Сергеев С.С.', 'шифр ООО' 8 FORMAT ( 5х , а12 , 6х , а8 ) WRITE ( 4 , 9 ) 'Исходные данные:' WRITE ( * , 9 ) 'Исходные данные:' 9 FORMAT ( 5 х , а 1 6 ) 91 WRITE ( 4 , 1 0 ) 'отрезок', a , b WRITE ( * , 10 ) 'отрезок', a , b 10 FORMAT (1x , a7 , 4x , ' [ ' , f4.1 ,'; ' , f4.1 , ']') WRITE ( 4 , 1 1 ) 'точность', eps WRITE ( * , 11 ) 'точность', eps 11 FORMAT (1x , a8 , 1x , 'e = ' , f5.3) 14 у = G (x) * G (x+h) IF (y.GT.O) THEN x = x + h i = i +1 WRITE ( 4 , 12) i , x WRITE ( * , 12) i , x 12 FORMAT (1x , ' на ', i3,' шаге значение x= ' , f6.3) GOTO 14 ELSE x = x + 0.5*h END IF WRITE ( 4 , 6 ) 'Результат:' WRITE ( * , 6 ) 'Результат:' WRITE ( 4 , 1 3 ) 'Значение корня равно', x WRITE ( * , 13) 'Значение корня равно', х 13 FORMAT ( 1 x , a 2 4 , 3 x , f 6 . 3 ) CLOSE(4 ) END 5. Тестовый расчет Отделим корень графически. Для этого в одной системе коорди- нат построим графики функций у = 3 - Х и у = е* (рис. 3.9). 92 Рис. 3.9. Графическое отделение корня уравнения Примем отрезок [0,7; 1] за отрезок, на котором находится корень уравнения. Уточним его методом перебора, выполнив 4 шага расче- та. Сведем вычисления в таблицу (табл. 3.5). Таблица 3.5 Шаг Значе- ние Xi-1 Значение Xi = Xi-1 + h g(Xi-i)-g(Xi) Результаты расчета на ком- пьютере Xi 1 0,7 0,701 0,245 Выполняется на лабораторных занятиях 2 0,701 0,702 0,241 3 0,702 0,703 0,238 4 0,703 0.704 0,235 В результате расчета на компьютере (выполняется на лабора- торных занятиях) корень уравнения х = 0,834. 93 Задача 6 Составить программу вычисления значения р по выражению 8 , 12 S 4 2 I в} P = s i n — + c o s 2 — ^ + Bmin 8 Ю I С? i=l Cn max ' mm " m a x 1 " m m " | ^ m a x При составлении программы требуется: S разработать подпрограмму WOD ввода элементов одномер- ного массива с клавиатуры; S разработать подпрограмму VYVOD вывода одномерного мас- сива по формату во внешний файл; S разработать подпрограмму MAXMIN нахождения наибольше- го и наименьшего элементов массива; S разработать подпрограмму SUMMA вычисления суммы квад- ратов элементов массива; S с помощью разработанных подпрограмм написать головную программу вычисления значения р. При работе над задачей необходимо выполнить следующие этапы: 1. Описать математическую модель задачи. 2. Описать подпрограммы. 3. Начертить блок-схему алгоритма задачи. 4. Выбрать форму и формат печати исходных данных и резуль- татов выполнения программы на экран (предусмотреть вывод фа- милии, инициалов студента, номера группы и шифра задания). 5. Написать текст программы на алгоритмическом языке Фор- тран (предусмотреть ввод данных с клавиатуры и вывод результата по формату во внешний файл). 6. Выполнить тестовый расчет по принятым исходным данным. Р е ш е н и е 1. Математическая модель задачи Для заданных по условию одномерных массивов А (состоит из 8 элементов), В (состоит из 12 элементов) и С (состоит из 10 элемен- тов) требуется вычислить значение 94 8 л 12 , I 4 2 I Bf R = sin +cos2 A — A • R +R л ш а х -^min -"max T -"mm где A max ' В max » C m a x ~ наибольшие элементы массивов А, В и С соответственно; y4min' Вmin ~ наименьшие элементы массивов А и В соответст- венно. 2. Описание подпрограмм Подпрограмма WOD (т ,D) ввода элементов одномерного массива с клавиатуры. Исходные данные: т - количество элементов массива. Результат выполнения подпрограммы - массив D, состоя- щий из т элементов. Подпрограмма VYVOD (т ,D) вывода элементов одномерного массива по формату во внешний файл. Исходные данные: т - коли- чество элементов массива; массив D, состоящий из т элементов. Подпрограмма MAXMIN ( т , D , maxd, mind) нахождения наи- большего и наименьшего элементов массива. Исходные данные: т - количество элементов массива; массив D, состоящий из т эле- ментов. Результаты выполнения подпрограммы: maxd - наиболь- ший элемент массива, mind - наименьший элемент. Подпрограмма SUMMA ( m ,D ,s) вычисления суммы квадратов элементов массива. Исходные данные: т - количество элементов массива; массив D, состоящий из т элементов. Результат выполне- ния подпрограммы - сумма квадратов элементов массива s. 3. Блок-схема алгоритма задачи Предусмотрим в программе: - ввод элементов массивов А, В и С с помощью подпрограммы VVOD; - вычисление сумм квадратов (sa, sb, sc) элементов массивов с помощью подпрограммы SUMMA; - нахождение наибольших (таха, maxb, тахс) и наименьших (mina, tunb, mine) элементов массивов с помощью подпрограммы MAXMIN; 10 9 S O 2 i=l С ^тах 95 - вычисление значения Р ; - вывод массивов А, В и С для контроля с помощью подпро- граммы VYVOD; - вывод результата расчета (Р ) во внешний файл. Блок-схема головной программы представлена на рис. 3.10. С НАЧАЛО [[ Vvod(8,A) I [Jvvod(12,B) [jvvod(10,C) Е П" Summa(8,A,sa) Е [[Summa(12,B,sb) [[summa(10,C,sc) и [[ MaxMin(8,A,maxa,miria) [[MaxMin(12,B,maxb,minb) ± [[ MaxMinClO^maxCjminc) 5 Рис. 3.10. Блок-схема головной программы Блок-схемы подпрограмм представлены на рис. 3.11. 96 Л/vod (m,D)) — /TlaxM1n(m,D, N V maxd.mind) J l - l , m f Ввод Dl / maxd:«Di mlnd:»Di X „ ч (summa(m,D,s)) Г s:=0 | , V С КОНЕЦ ) (Vyvod (M,DJ) „ • Г l - l , m X f Вывод Di J C E 1=1, m 1 S+Di^ ("КОНЕЦ ) I . (~~'кОНЕЦ ) ("КОНЕЦ ) Рис. 3.11. Блок-схемы подпрограмм 4. Форма и формат печати исходных данных и результатов выполнения программы Контрольная работа по информатике Задача 6 Студент группы 312514 I I « се & « 3 вз о 4 Сергеев С.С. шифр ООО Исходные данные: МАССИВ А 11.11 11.11 11.11 11.11 11.11 и т.д. МАССИВ В 11.11 11.11 11.11 11.11 11.11 и т.д. МАССИВ С 11.11 11.11 11.11 11.11 11.11 и т.д. Результат: Значение beta равно 11.111 97 5. Программа на алгоритмическом языке Фортран ! Головная программа DIMENSION А(8), В(12), С(10) REAL sa, sb, sc, maxa, maxb, maxc, mina, minb, mine, beta ! Ввод элементов массивов WRITE ( * , * ) 'Ввод массива А' CALL W O D (8, А) Здесь и далее в подпрограмму WOD посылаем в качестве фак- тических параметров имя массива - А; количество элементов этого массива — 8; обратно получим заполненный массив. WRITE ( * , * ) 'Ввод массива В" CALL W O D (12, В) WRITE ( * , * ) 'Ввод массива С' CALL W O D (10, С) ! Вычисление сумм квадратов элементов массивов CALL SUMMA (8, A, sa) Здесь и далее в подпрограмму SUMMA посылаем в качестве фактических параметров массив — А; количество элементов этого массива — 8; обратно получим сумму квадратов элементов заслан- ного массива - sa. CALL SUMMA (12, В, sb) CALL SUMMA (10, С, sc) ! Нахождение наибольших и наименьших элементов массивов CALL MAXMIN (8, A, maxa, mina) Здесь и далее в подпрограмму MAXMIN посылаем в качестве фактических параметров массив — А; количество элементов этого массива - 8; обратно получим наибольший элемент массива -maxa; наименьший элемент массива — mina. CALL MAXMIN (12, В, maxb, minb) CALL MAXMIN (10, C, maxc, mine) ! Вычисление значения BETA 98 beta = SIN (sa/(maxa-mina)) + COS ( sb/(maxb+minb)) beta = beta - (1/8.)*SQRT ( sc/maxc ) В ы в о д исходных данных и результата расчета OPEN ( 1 , file = 'rezult6') WRITE ( 1 , 5 ) 'Контрольная работа по информатике' 5 FORMAT ( 5х , аЗЗ ) WRITE ( 1 , 6 ) 'Задача 3' 6 FORMAT (10х , а11) WRITE ( 1 , 7 ) 'студент группы 312514' 7 FORMAT (1 Ох, а21) WRITE ( 1 , 8 ) 'Сергеев С.С.", 'шифр ООО' 8 FORMAT ( 5 х , а 1 2 , 6 х , а 8 ) WRITE (1 , 7 ) ' Исходные данные:' WRITE ( 1 , 6 ) ' Массив А ' CALL VYVOD (8, А) WRITE ( 1 , 6 ) ' Массив В ' CALL VYVOD (12, В) WRITE ( 1 , 6 ) ' Массив С ' CALL VYVOD (10, С) WRITE ( 1 , 6 ) ' Результат : ' WRITE ( 1 , 9 ) beta 9 FORMAT ( Зх , 'Значение beta равно ' , F6.3) CLOSE (1) STOP END ! Подпрограмма ввода массива SUBROUTINE W O D ( m , D ) DIMENSION D (*) INTEGER m, i DO i = 1 , m READ ( * ,* ) D ( i ) END DO RETURN END ! Подпрограмма вывода массива SUBROUTINE VYVOD ( m , D ) DIMENSION D (*) INTEGER m, i WRITE ( 1 , 2 ) ( D(l), 1=1,m) 2 FORMAT (12 (2x, F5.2)) RETURN END ! Подпрограмма вычисления суммы квадратов элементов SUBROUTINE SUMMA ( m, D, s ) DIMENSION D (*) INTEGER m, i REAL s S=0 DO i = 1 , m s = s + D ( i )**2 END DO RETURN END ! Подпрограмма нахождения наибольшего ! и наименьшего элементов массива SUBROUTINE MAXMIN (m, D, maxd, mind) DIMENSION D (*) INTEGER m, i REAL maxd, mind maxd = D (1) mind = D (1) DO i = 2, m IF ( D (i) .GT. maxd) maxd = D (i) mind = AMIN1( D (i), mind) END DO RETURN END 100 6. Тестовый расчет Примем в качестве исходных данных массивы: Л = (0,8 0,6 0,4 0,6 0,5 0,7 0,8 0,б); В = (1,1 1,2 1,0 1,4 1,3 1,2 1,1 1,3 1,1 1,5 1,4 1,3); С = (3,6 3,2 3,4 3,3 3,6 3,5 3,7 3,8 3,5 3,4). Определим для каждого массива суммы квадратов их элементов, наибольшие и наименьшие элементы. Для удобства результаты представим в (табл. 3.6). Таблица 3.6 Массив Сумма квадратов элементов масси- ва Наибольший элемент массива Наименьший элемент массива А 3,26 0,8 0,4 В 18,75 1,5 1,0 С 122,80 3,8 3,2 Вычисляем значение Р : „ . 3,26 2 18,75 1 /122,80 р = Sin + COS J = 0 , 8 - 0 , 4 1 + 1,5 8V 3,8 = 0,957 + 0,120-0,711 = 0,366 . В результате расчета на компьютере {выполняется на лабора- торных занятиях), значение (3 = 0,366 (погрешность - 0 %). 101 ЛИТЕРАТУРА 1. ГОСТ 19.701-90. ЕСПД. Схемы алгоритмов, программ, данных и систем. Обозначения условные и правила выполнения. — Введ. 1992-01-01. - М . : Изд-во стандартов, 1991.-26 с. 2. Белецки, Я. Фортран-77 / Пер. с пол. - М.: Высшая школа, 1991.-207 с. 3. Боглаев, Ю.П. Вычислительная техника и программирование. - М.: Высшая школа, 1990 - 543 с. 4. Фурунжиев, Р.И. Вычислительная техника: практикум. - Мн.: Вышэйшая школа, 1985. - 254 с. 5. Программирование на Фортране 77 / Дж. Ашкрофт. [и др.]. - М.: Радио и связь, 1990. - 272 с. 6. Бартеньев, О.В. Фортран для студентов. - М.: Диалог-МИФИ, 1999.-397 с. 7. Рыжиков, Ю.И. Программирование на Fortran Power Station для инженеров: "практическое рук. - СПб.: Корона принт, 1999. - 256 с. 8. Соловьев, П.В. FORTRAN для персонального компьютера: ёправ. пособие. - М.: Arist, 1991. - 223 с. 102 ПРИЛОЖЕНИЯ ПРИЛОЖЕНИЕ 1 Блок-схема алгоритма и ее элементы Блок-схема — это последовательность блоков, предписывающих выполнение определенных операций и связей между этими блока- ми. Внутри блоков указывается информация об операциях, подле- жащих выполнению. Конфигурация и размеры блоков, а также по- рядок графического оформления блок-схем регламентированы [1]. В таблице приведены наиболее часто используемые блоки, изобра- жены элементы связей между ними и дано краткое пояснение к ним. Блоки и элементы связей называют элементами блок-схем. Представленных в таблице элементов вполне достаточно для изо- бражения алгоритмов, которые необходимы при выполнении сту- денческих работ. Название Элемент [ Комментарий Начало, Конец г - 1 - ) Начало, конец, пуск, останов- ка, вход и выход во вспомо- гательных алгоритмах Процесс 1 Вычислительное действие или последовательность вычисли- тельных действий Данные / ' / 1 Ввод/Вывод данных Решение нет — Д А Проверка условия Модификация г < ; ^ Заголовок цикла Предопределен- ный процесс — 1 — Определение вычислений по| подпрограмме или стандарт- ной программе. Обычно обоз- начается вызов подпрограммы 103 Окончание таблицы Название Элемент Комментарий Комментарий Пояснения к схеме алгоритма, формулы Соединитель 1 ? Разрыв линий потока, связыва-ющих блоки алгоритма Горизонтальные и вертикальные потоки "" 1 I I Линии связей между блоками, — — у 1 направление потоков Слияние 4 h Слияние линий потоков Межстраничный соединитель \ m п Т Используется при переносе части схемы на другую стра- ницу. Если блок стоит в конце обрываемой схемы, то т - страница, на которой продол- жится прерванная схема, п — номер следующего блока. Если соединитель стоит в начале прерванной схемы, то \т - номер страницы, на которой схема прервана, а и - номер предыдущего блока При соединении блоков следует использовать только вертикаль- ные и горизонтальные линии потоков. Горизонтальные потоки, имеющие направление справа налево, и вертикальные потоки, имеющие направление снизу вверх, должны быть обязательно по- мечены стрелками. Прочие потоки могут быть помечены или остав- лены непомеченными. Линии потоков должны быть параллельны линиям внешней рамки или границам листа. 104 ПРИЛОЖЕНИЕ 2 Некоторые требования к изображению элементов блок-схем Расстояние между параллельными линиями потоков должно быть не менее 3 мм, между остальными элементами схемы - не ме- нее 5 мм. Горизонтальный и вертикальный размеры блока должны быть кратны 5 мм (делиться на 5 нацело). Отношение горизонтального и вертикального размеров блока, равное 1,5, является основным. При ручном выполнении блока до- пустимо отношение, равное 2. Блоки «Начало», «Конец» и «Соединитель», как правило, имеют высоту вдвое меньшую основной высоты блоков. Для размещения блоков поле листа рекомендуется разбивать на горизонтальные и вертикальные (для разветвляющихся схем) зоны. Для удобства описания блок-схемы каждый ее блок следует про- нумеровать. Удобно использовать сквозную нумерацию блоков. Номер блока располагают в левой части блока либо в разрыве в ле- вой верхней части рамки блока. 105 ПРИЛОЖЕНИЕ 2 Список некоторых библиотечных функций Фортрана Математи- ческая запись Описание Запись на языке Фортран Тип пара- метров Тип функ- ции 1 2 3 4 5 Тригонометрические функции arccos х арккосинус ACOS (х) real real DACOS (х) real* 8 real* 8 arcsin х арксинус ASIN (х) real real DASIN (х) real* 8 real* 8 arctg х арктангенс ATAN (х) real real DAT AN (х) real*8 real* 8 chx гиперболический косинус COSH (х) real real DCOSH (х) real* 8 real* 8 shx гиперболический синус DSINH (х) real* 8 real* 8 SINH (х) real real thx гиперболический тангенс DTANH (х) real* 8 real* 8 TANH (х) real real cosx косинус COS (х) real real DCOS (х) real* 8 real* 8 ctgx котангенс COTAN (х) real real DCOTAN (х) real* 8 real* 8 sin x синус DSIN (х) real* 8 real* 8 SIN (х) real real tgx тангенс DTAN (х) real* 8 real* 8 TAN (х) real real I DABS (х) real* 8 real* 8 IABS (х) integer integerl ABS (х) real real 106 Окончание таблицы - 1 2 | 3 4 5 Алгебраические функции л[х квадратный корень DSQRT (х) real* 8 real* 8 SQRT (х) real real 1пх логарифм на- туральный ALOG (х) real real DLOG (х) real* 8 real* 8 LOG (х) real real \gx логарифм де- сятичный DLOGIO (х) real* 8 real* 8 LOG 10 (х) real real ALOGIO (х) real real max{a,b,.. .} максимум DMAX1 (А, В,...) real* 8 real* 8 МАХ(А, В,...) integer integer АМАХО (А, В, ...) integer real АМАХ1 (А, В,...) real real min {a,b,...} минимум AMINO (А, В,...) integer real AMIN1 (А, В,...) real real DMEN1 (А, В,...) real* 8 real* 8 M1N(A, В,...) integer integer остаток от деления а на b MOD (А, В) integer integer DMOD (А, В) real* 8 real* 8 AMOD (А, В) real real И целая часть числа INT (х) real, integer integer e* экспонента DEXP (х) real* 8 real* 8 ЕХР (х) real real 107 Оглавление В в е д е н и е 3 1. ЭТАПЫ РЕАЛИЗАЦИИ ИНЖЕНЕРНЫХ ЗАДАЧ КОМПЬЮТЕРЕ 4 2. АЛГОРИТМИЧЕСКИЙ ЯЗЫК ФОРТРАН 8 2.1. Структура программы 8 2.2. Типы данных 10 2.3. Операторы описания типов данных 14 2.3.1. Оператор описания переменных целого типа 14 2.3.2. Оператор описания переменных вещественного типа 15 2.3.3. Оператор описания переменных комплексного типа 16 2.3.4. Оператор описания переменных символьного типа. 17 2.3.5. Оператор описания переменных логического типа.. 17 2.3.6. Оператор описания массивов 18 2.4. Арифметические выражения 20 2.5. Учет типов величин при записи арифметических выражений 22 2.6. Последовательность создания Фортран-программ 24 2.7. Операторы ввода/вывода 26 2.7.1. Оператор ввода DATA 26 2.7.2. Оператор ввода READ 27 2.7.3. Оператор вывода WRITE 28 2.7.4. Оператор вывода на экран PRINT 28 2.8. Оператор задания формата ввода-вывода (FORMAT).. 29 2.8.1. Спецификации X, Т 30 2.8.2. Спецификация 1 30 2.8.3. Разделители 31 2.8.4. Спецификация F 33 2.8.5. Использование повторителей в операторе FORMAT 35 2.8.6. Спецификация Е 36 2.8.7. Спецификация Gw.d 37 2.9. Операторы условия 38 2.9.1. Логический оператор условия 38 2.9.2. Арифметический оператор условия 43 2.10. Операторы цикла 45 2.10.1. Оператор цикла DO 46 108 2.10.2. Оператор цикла DO WHILE 47 2.Ю.З. Оператор выхода из цикла 48 2.11. Операторы перехода 48 2.11.1. Оператор безусловного перехода GOTO 48 2.11 -2. Вычисляемый оператор перехода GOTO 49 2.11-3. Оператор условного перехода 49 2.12. Работа с массивами ' 50 2.12.1. Ввод масДшов 50 2.12.2. Вывод массивов 53 2.12.3. Примеры обработки массивов 54 2.13. Подпрограммы 57 2.13.1. Оператор-функция 58 2.13.2. Подпрограмма-функция FUNCTION 61 2.13.3. Подпрограмма-процедура SUBROUTINE 63 2.14. Работа с внешними файлами 64 2.14.1. Оператор открытия файла OPEN 65 2.14.2. Оператор закрытия файла CLOSE 66 2.14.3. Примеры работы с файлами 66 3. ПРИМЕРЫ ВЫПОЛНЕНИЯ КОНТРОЛЬНЫХ ЗАДАНИЙ. 68 ЛИТЕРАТУРА 102 ПРИЛОЖЕНИЯ 103 ПРИЛОЖЕНИЕ 1 103 ПРИЛОЖЕНИЕ 2 105 ПРИЛОЖЕНИЕ 3 106 Учебное издание ТРЕПАЧКО Виктор Михайлович КРАТКИЙ КУРС ПРОГРАММИРОВАНИЯ НА АЛГОРИТМИЧЕСКОМ ЯЗЫКЕ FORTRAN POWER STATION Методическое пособие по дисциплине «Информатика» для студентов специальности 1-70 02 01 «Промышленное и гражданское строительство» Редактор Т.Н. Микулик Компьютерная верстка А.Г. Гармазы Подписано в печать 24.10.2006. Формат 60x84 1/16. Бумага офсетная. Отпечатано на ризографе. Гарнитура Тайме. Усл. печ. л. 6,4. Уч.-изд. л. 5,0.Тираж 300. Заказ 681. Издатель и полиграфическое исполнение: Белорусский национальный технический университет. ЛИ № 02330/0131627 от01.04.2004. 220013, Минск, проспект Независимости, 65.