В программе на языке фортран обязательно должен быть оператор

Любая работающая программа, преобразует исходные данные в конечный результат. Исходные данные считываются из файлов, ассоциированных с внешними устройствами, а затем обрабатываются и записываются в другие внешние файлы. В Фортране каждое устройство и файл, с которым взаимодействует программа, в смысле ввода/вывода, имеет идентификационный номер.

Например, номер стандартного устройство ввода – клавиатуры, обычно «5», а номер стандартного устройства вывода – экрана монитора, обычно «6». Для устройства ввода/вывода «по умолчанию» в качестве номера используется «*» – символ «звездочка». Обычно устройствами ввода/вывода «по умолчанию» являются экран и клавиатура, хотя, в зависимости от настроек вычислительной системы, такими устройствами может оказаться все что угодно – от пылесоса до крылатой ракеты, если они управляются данным компьютером.

Для ввода данных в Фортране предусмотрен оператор READ, а для вывода – оператор WRITE. Для вывода данных на стандартное устройство чаще используется оператор PRINT, поскольку формат его записи предполагает, что устройство вывода предопределено.

Строки переменной длины в Fortran

Входные и выходные данные всегда имеют определенный вид или формат представления. Для правильного восприятия информации, как человеком, так и компьютером, имеет значение, представлены ли целые переменные со значениями «один», «два» и «три» на экран в виде «123» или «1^^2^^3» (через пробелы). Поскольку при написании программы внимание разработчика чаще всего сосредоточено на правильной реализации вычислительного алгоритма, то для ввода/вывода данных предусмотрен формат по умолчанию, обозначаемый «*» (звездочкой).

Таким образом «умолчание «, в отношении ввода/вывода данных, подразумевает соглашение относительно стандартного устройства и формата ввода и вывода данных – именно этот вариант ввода/вывода используется в большинстве примеров программ данного учебного пособия. Соответствующие операторы Фортрана приведены в Таблице 6.1.

Таблица 6.1. Варианты операторов ввода/вывода под управлением списка

Оператор Действие
READ (*,*) список ввода Ввод с клавиатуры
READ *, список ввода Ввод с клавиатуры
WRITE (*,*) список вывода Вывод на экран
PRINT *, список вывода Вывод на экран

В операторах READ(*,*) и WRITE(*,*) в круглых скобках, через запятую записаны две «звездочки» – первая означает выбор устройства по умолчанию. Если не оговорено иное, то для ввода по умолчанию используется клавиатура, а для вывода – экран монитора. Вторая «звездочка» имеет тот же смысл, что и единственная «звездочка» в операторах READ* и WRITE* – она означает выбор правил «по умолчанию» в отношении формата ввода или вывода данных. Это сигнал компилятору, что программисту лень или некогда думать о формате представления результатов, и ему (компилятору Фортрана) придется взять это на себя. Формат ввода/вывода по умолчанию будет зависеть от типа вводимых или выводимых элементов, записанных в виде списка – проще говоря, перечисленных через запятую – поэтому такой вариант ввода/вывода еще называют вводом/ выводом под управлением списка.

Условные операторы в Fortran

Список ввода/вывода начинается сразу после закрытия круглых скобок для READ(*,*) и WRITE(*,*) или через запятую после единственной «звездочки» для READ* и WRITE*. В список могут присутствовать скаляры и массивы всех встроенных и производных типов, включая переменные, буквальные и именованные константы и выражения.

Наиболее распространен вывод данных под управлением списка, когда числовые данные сопровождаются текстом, в виде текстовых буквальных констант (Пример 6.1).

Пример 6.1. Простейший вывод данных под управлением списка.

program DATAOUT integer, parameter :: N=3 real:: X=1., Y=2., Z=3. print*, ″Вывод значений N=″, N, “переменных:” print*, ″X=″, X, ″Y=″, Y, ″Z=″, Z end

Вывод данных под управлением списка визуально понятен, но не слишком презентабелен:

Вывод значений N= 3 переменных:

X= 1.0000000 Y= 2.0000000 Z= 3.0000000

Для управления отступами, пробелами и количеством знаков необходимо использовать форматный вывод данных (п. 6.1).

В отношении рассмотренного примера необходимо сделать несколько замечаний. Начинающие программисты, приступающие к программированию на Фортране, иногда считают, что при выводе переменной X, перед ней нужно обязательно писать «X=«, что здесь есть какая-то связь. Смысловая связь действительно существует, но она в голове программиста, а не в списке оператора PRINT, которому безразлично, будет ли это текст «X=» или «X равно» или же это будет «Hello, World!» или не будет вообще никакого текста. Оператор PRINT просто выводит на экран все элементы, указанные ему в списке вывода, и текстовая буквальная константа «X=» такой же равноценный и независимый элемент этого списка, как имя вещественной переменной X.

Читайте также:
На какой программе варить мясо в мультиварке редмонд

При вводе данных под управлением списка (Пример 6.2) после запуска программы у начинающих программистов порой складывается впечатление, что компьютер «завис» – на темном экране виден только мигающий курсор – но это и есть приглашение к вводу данных. Данные вводятся подряд, в одну строку, через пробел или через запятую. При этом количество вводимых данных в списке ввода должно соответствовать количеству данных введенных с клавиатуры.

Пример 6.2. Простейший ввод данных под управлением списка.

program DATAIN integer:: X integer, dimension (2, 2) :: A read*, X, A print*, ″X=″, X, ″A=″, A end

В представленном примере один оператор READ осуществляет ввод с клавиатуры скалярной переменной X и массива A из четырех элементов. Соответственно, после запуска программы необходимо ввести с клавиатуры 5 целых чисел, через пробел или запятую. Также можно подтверждать ввод каждого числа клавишей «Enter» – при этом для завершения ввода необходимо пять чисел – только тогда оператор READ завершит свою работу.

Объекты производных типов данных вводятся и выводятся как последовательность значений элементов, составляющих структуру объекта. О вводе/выводе массивов речь идет в (п. 6.3).

Источник: www.accel.ru

Operators and flow control#

One of the powerful advantages of computer algorithms, compared to simple mathematical formulae, comes in the form of program branching whereby the program can decide which instructions to execute next based on a logical condition.

There are two main forms of controlling program flow:

  • Conditional (if): choose program path based on a boolean (true or false) value
  • Loop: repeat a portion of code multiple times

Logical operators#

Before we use a conditional branching operator, we need to be able to form a logical expression.

To form a logical expression, the following set of relational operators are available:

Tests for equality of two operands

Test for inequality of two operands

Tests if left operand is strictly greater than right operand

Tests if left operand is strictly less than right operand

Tests if left operand is greater than or equal to right operand

Tests if left operand is less than or equal to right operand

as well as the following logical operators:

TRUE if both left and right operands are TRUE

TRUE if either left or right or both operands are TRUE

TRUE if right operand is FALSE

TRUE if left operand has same logical value as right operand

TRUE if left operand has the opposite logical value as right operand

Conditional construct ( if )#

In the following examples, a conditional if construct is used to print out a message to describe the nature of the angle variable:

Example: single branch if

if (angle 90.0) then print *, ‘Angle is acute’ end if

In this first example, the code within the if construct is only executed if the test expression ( angle < 90.0 ) is true.

It is good practice to indent code within constructs such as if and do to make code more readable.

We can add an alternative branch to the construct using the else keyword:

Example: two-branch if — else

if (angle 90.0) then print *, ‘Angle is acute’ else print *, ‘Angle is obtuse’ end if

Now there are two branches in the if construct, but only one branch is executed depending on the logical expression following the if keyword.

We can actually add any number of branches using else if to specify more conditions:

Example: multi-branch if — else if — else

if (angle 90.0) then print *, ‘Angle is acute’ else if (angle 180.0) then print *, ‘Angle is obtuse’ else print *, ‘Angle is reflex’ end if

When multiple conditional expressions are used, each conditional expression is tested only if none of the previous expressions have evaluated to true.

Loop constructs ( do )#

In the following example, a do loop construct is used to print out the numbers in a sequence. The do loop has an integer counter variable which is used to track which iteration of the loop is currently executing. In this example we use a common name for this counter variable: i .

When we define the start of the do loop, we use our counter variable name followed by an equals ( = ) sign to specify the start value and final value of our counting variable.

Example: do loop

Читайте также:
Установить программу Яндекс:ГОу

integer :: i do i = 1, 10 print *, i end do

Example: do loop with skip

integer :: i do i = 1, 10, 2 print *, i ! Print odd numbers end do

Conditional loop ( do while )#

A condition may be added to a do loop with the while keyword. The loop will be executed while the condition given in while() evaluates to .true. .

Example: do while() loop

integer :: i i = 1 do while (i 11) print *, i i = i + 1 end do ! Here i = 11

Loop control statements ( exit and cycle )#

Most often than not, loops need to be stopped if a condition is met. Fortran provides two executable statements to deal with such cases.

exit is used to quit the loop prematurely. It is usually enclosed inside an if .

Example: loop with exit

integer :: i do i = 1, 100 if (i > 10) then exit ! Stop printing numbers end if print *, i end do ! Here i = 11

On the other hand, cycle skips whatever is left of the loop and goes into the next cycle.

Example: loop with cycle

integer :: i do i = 1, 10 if (mod(i, 2) == 0) then cycle ! Don’t print even numbers end if print *, i end do

When used within nested loops, the cycle and exit statements operate on the innermost loop.

Nested loop control: tags#

A recurring case in any programming language is the use of nested loops. Nested loops refer to loops that exist within another loop. Fortran allows the programmer to tag or name each loop. If loops are tagged, there are two potential benefits:

  1. The readability of the code may be improved (when the naming is meaningful).
  2. exit and cycle may be used with tags, which allows for very fine-grained control of the loops.

Example: tagged nested loops

integer :: i, j outer_loop: do i = 1, 10 inner_loop: do j = 1, 10 if ((j + i) > 10) then ! Print only pairs of i and j that add up to 10 cycle outer_loop ! Go to the next iteration of the outer loop end if print *, ‘I=’, i, ‘ J=’, j, ‘ Sum=’, j + i end do inner_loop end do outer_loop

Parallelizable loop ( do concurrent )#

The do concurrent loop is used to explicitly specify that the inside of the loop has no interdependencies; this informs the compiler that it may use parallelization/SIMD to speed up execution of the loop and conveys programmer intention more clearly. More specifically, this means that any given loop iteration does not depend on the prior execution of other loop iterations. It is also necessary that any state changes that may occur must only happen within each do concurrent loop. These requirements place restrictions on what can be placed within the loop body.

Simply replacing a do loop with a do concurrent does not guarantee parallel execution. The explanation given above does not detail all the requirements that need to be met in order to write a correct do concurrent loop. Compilers are also free to do as they see fit, meaning they may not optimize the loop (e.g., a small number of iterations doing a simple calculation, like the below example). In general, compiler flags are required to activate possible parallelization for do concurrent loops.

Example: do concurrent() loop

real, parameter :: pi = 3.14159265 integer, parameter :: n = 10 real :: result_sin(n) integer :: i do concurrent (i = 1:n) ! Careful, the syntax is slightly different result_sin(i) = sin(i * pi/4.) end do print *, result_sin
so the DOM is not blocked —>

Источник: fortran-lang.org

Фортран 90

Для разработки параллельных программ часто используется язык программирования Фортран . Это одно из наиболее эффективных средств программирования вычислительных задач. Далее приводится краткое описание языка.

Формат записи исходного текста

Для записи исходного текста программы на Фортране могут использоваться фиксированный и свободный форматы.Первый из них характерен для стандарта Фортран 77 , второй применяется в Фортране 90 и более новых версиях . Фортран 90 поддерживает также фиксированный формат, что обеспечивает совместимость со старыми стандартами записи. При записи исходного текста в фиксированном формате строка содержит 72 позиции. Первые пять позиций отведены для меток, а шестая может быть пустой или содержать любой, отличный от пробела символ. В последнем случае строка считается строкой продолжения и при обработке компилятором присоединяется к предыдущей строке программы. Оператор может занимать позиции с 7 по 72.

В свободном формате записи все позиции строки равноправны, ее длина составляет 132 символа.

Структура программы

Программа на Фортране состоит из главной программы и, возможно, некоторого числа подпрограмм.Подпрограммы могут быть функциями или процедурами,внешними, внутренними или модульными. Различные программные компоненты могут компилироваться раздельно.

Читайте также:
Как стать участником программы бонусы спасибо

Первым оператором главной программы является её заголовок PROGRAM . За ним следует имя программы:

Имя программы обязательно начинается с буквы, затем могут идти буквы, цифры и символы подчеркивания, например:

Максимальная длина любого имени в программах на Фортране — 31 символ. Первым оператором подпрограммы может быть только ее заголовок FUNCTION или SUBROUTINE . Последней строкой программного компонента должна быть строка с оператором END . Заключительный оператор главной программы может иметь также следующий вид:

END PROGRAM ИМЯ_ПРОГРАММЫ

ИМЯ_ПРОГРАММЫ является необязательной частью оператора.

После заголовка следуют описания переменных, констант, меток, подпрограмм и других объектов, используемых в программе. Эта ее часть называется разделом описаний.После раздела описаний следует раздел операторов.

Базовые типы данных

Перечень встроенных типов в порядке возрастания их ранга дан ниже.

  • LOGICAL(1) и BYTE
  • LOGICAL(2)
  • LOGICAL(4)
  • INTEGER(1)
  • INTEGER(2)
  • INTEGER(4)
  • REAL(4)
  • REAL(8)
  • COMPLEX(8)
  • COMPLEX(16)

У каждого встроенного типа Фортрана есть несколько разновидностей, которые отличаются друг от друга диапазоном значений и некоторыми другими характеристиками.

Значение символьного типа CHARACTER представляет собой строку символов. Длина строкового значения в Фортране может быть произвольной и задается с помощью параметра LEN в предложении описания строковой переменной, например:

CHARACTER(LEN = 430) :: Shakespeare_sonet

Предложение описания

Предложение описания переменных в Фортране 90 имеет вид:

ТИП[, АТРИБУТЫ] :: СПИСОК_ПЕРЕМЕННЫХ

В списке имена переменных разделяются запятыми, а ТИП задает общий тип переменных, являясь идентификатором типа:

REAL, PARAMETER :: salary = 2000

В Фортране 90 используются следующие атрибуты объектов:

  • PARAMETER — объект является именованной константой ;
  • PUBLIC — объект является доступным за пределами модуля;
  • PRIVATE — объект недоступен за пределами модуля;
  • POINTER — объект является ссылкой (указателем);
  • TARGET — объект можно использовать в качестве адресата в операторах назначения ссылок;
  • ALLOCATABLE — объект является динамическим массивом ;
  • DIMENSION — объект является массивом;
  • INTENT — определяет вид связи для параметра процедуры (т. е., является входным, выходным или и входным и выходным);
  • OPTIONAL — необязательный параметр процедуры;
  • SAVE — сохранять значение локальной переменной подпрограммы в промежутке между ее вызовами;
  • EXTERNAL — для внешней функции ;
  • INTRINSIC — для внутренней функции.

Буквальные константы

Буквальные числовые константы записываются обычным образом. Комплексная буквальная константа записывается в круглых скобках:

  • (0., 1.) — соответствует мнимой единице i ;
  • (2., 1.) — соответствует комплексному числу 2 + i .

Имеются две буквальные логические константы:

  • .TRUE . — «истина»;
  • .FALSE . — «ложь».

Буквальная символьная константа обрамляется апострофами, которые не входят в значение, а являются ограничителями значения. Вместо апострофов могут быть использованы кавычки.

Арифметические и логические операции

Арифметические операции Фортрана (в порядке убывания приоритета):

  • ** — возведение в степень;
  • *, / — умножение, деление;
  • -, + — вычитание, сложение.

Минус (-) и плюс (+) используются также как знаки унарных операций: В Фортране поддерживаются следующие операции отношения :

Знак операции Альтернативное обозначение Название операции сравнения
.LT . меньше
.LE . меньше или равно
.GT . > больше
.GE . >= больше или равно
.EQ . == Равно
.NE . / = не равно

Для значений комплексного типа действительны только операции «равно» ( .EQ .) и «не равно» ( .NE .).

Операция Значение операции
.NOT . Логическое отрицание
.AND . Логическое пересечение (умножение, логическое «И»)
.OR . Логическое объединение (сложение, логическое «ИЛИ»)
. EQV .и .NEQV . Логические эквивалентность и неэквивалентность (логические равенство и неравенство)

Массивы

Массивы описываются с помощью атрибута DIMENSION :

REAL, DIMENSION(1:100) :: C

Параметром этого атрибута должен быть список экстентов (экстент — количество элементов массива для каждого измерения) описываемых массивов в виде

(экстент_1, экстент_2, . экстент_n)

Число экстентов определяет ранг массива. Каждый экстент записывается в виде:

REAL, DIMENSION(0:10, 2, -3:3,11) :: FGRID

Если значение нижней границы опущено, ее значение полагается равным 1. В некоторых случаях, список экстентов сводится к списку разделенных запятыми двоеточий, число которых равно рангу массива. Только число экстентов задается при объявлении динамического массива :

REAL, ALLOCATABLE, DIMENSION(:, 🙂 :: BE_LATER

Динамический массив — это массив, размер которого определяется при выполнении программы, тогда же происходит и выделение памяти под него. Пример:

PROGRAM dyn_array IMPLICIT NONE INTEGER SIZE REAL, ALLOCATABLE, DIMENSION(:) ::array WRITE(*, *) ‘SIZE?’ READ(*, *) SIZE IF(SIZE > 0) ALLOCATE(array(SIZE)) … IF(ALLOCATED(array)) DEALLOCATE(array) END PROGRAM dyn_array

Оператор описания массива может не содержать атрибута DIMENSION , форма массива может быть указана непосредственно после его идентификатора:

REAL X(10, 20, 30), Y(100), Z(2, 300, 2, 4)

Пример программы

Решение нелинейного уравнения методом Ньютона

PROGRAM NEWTON IMPLICIT NONE REAL (8) :: X, DX, F, DF X = 3.3 ! НАЧАЛЬНОЕ ПРИБЛИЖЕНИЕ DO ! НЬЮТОНОВСКИЕ ИТЕРАЦИИ DX = F(X) / DF(X) ! ВЫЧИСЛЕНИЕ ШАГА X = X — DX ! ВЫЧИСЛЕНИЕ ОЧЕРЕДНОГО ПРИБЛИЖЕНИЯ IF(DX

Источник: intuit.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru