Переменные#
Переменные хранят информацию, которая может быть использована программой. Fortran – строго типизированный язык программирования, то есть каждая переменная должна быть определённого типа.
В Fortran существует 5 встроенных типов данных:
integer
– (целый) для данных, которые представляют собой целые числа, положительные или отрицательныеreal
– (вещественный) для данных в виде чисел с плавающей точкой (но не целых чисел)complex
– (комплексный) пара чисел, определяющих вещественную и мнимую частьcharacter
– (символьный) для текстовых данныхlogical
– (логический) для данных, которые представляют логические величины (true или false, т.е. истина или ложь)
Прежде чем использовать переменную, мы должны объявить её; объявление переменной сообщит компилятору тип переменной и её другие атрибуты.
Fortran – статически типизированный язык программирования, что означает, что тип каждой переменной фиксируется в момент компиляции программы — тип переменной не может быть изменён во время выполнения программы.
Объявление переменных#
Синтаксис объявления переменных:
<variable_type> :: <variable_name>, <variable_name>, ...
где <variable_type>
– один из встроенных типов данных, описанных выше и <variable_name>
– имя переменной, которым вы хотите обозначить переменную.
Имена переменных должны начинаться с буквы и могут состоять из букв, цифр и символа нижнего подчёркивания. В следующем примере мы объявим переменную для каждого из встроенного типа данных.
Пример: объявление переменной
program variables
implicit none
integer :: amount
real :: pi, e ! two `real` variables declared
complex :: frequency
character :: initial
logical :: isOkay
end program variables
Fortran – нечувствителен к регистру; вы можете не беспокоиться о том, названы переменные с использованием заглавных букв или нет, но хорошей практикой будет сохранение постоянства их написания внутри текста программы.
Обратите внимание на дополнительный оператор в начале программы: implicit none
. Этот оператор сообщает компилятору, что все переменные будут объявлены явно; без этого оператора переменным будет неявно присвоен тип в зависимости от буквы с которой начинается их имя.
Всегда используйте оператор
implicit none
в начале каждой программы и подпрограммы (процедуры или функции). Неявное присвоение типа считается плохой практикой в современном программировании, так как скрывает информацию, что в итоге приводит к большему числу программных ошибок.
После объявления переменной, мы можем присваивать ей значения и переприсваивать значение, используя оператор присваивания =
.
Пример: присваивание значения переменной
amount = 10
pi = 3.1415927
frequency = (1.0, -0.5)
initial = 'A'
isOkay = .false.
Символьные значения обрамляются одиночными ('
) или двойными кавычками (\"
).
Логические или булевы величины могут быть равны .true.
(истина) или .false.
(ложь).
Важно
Watch out for assignment at declaration:
integer :: amount = 1
This is NOT a normal initialisation; it implies the save
attribute, which means that the variable retains
its value between procedure calls. Good practice is to initialise your variables separately to their declaration.
Стандартный ввод / вывод#
В нашем примере программы Hello World, мы вывели текст в окно команд. Обычно такой вывод называется standard output
(стандартным выводом) или stdout
.
Мы можем использовать оператор print
, представленный ранее, для печати значений переменных в stdout
:
print *, 'The value of amount (integer) is: ', amount
print *, 'The value of pi (real) is: ', pi
print *, 'The value of frequency (complex) is: ', frequency
print *, 'The value of initial (character) is: ', initial
print *, 'The value of isOkay (logical) is: ', isOkay
Аналогичным образом мы можем считывать значения из окна команд, используя оператор read
:
program read_values
implicit none
real :: x, y
print *, 'Please enter two numbers. '
read(*,*) x, y
print *, 'The sum and product of the numbers are ', x+y, x*y
end program read_values
Такой ввод обычно называется standard input
(стандартный ввод) или stdin
.
Выражения#
В языке Fortran доступен обычный набор арифметических операторов, перечисленный ниже в порядке приоритета:
Оператор |
Описание |
---|---|
|
Возведение в степень |
|
Умножение |
|
Деление |
|
Сложение |
|
Вычитание |
Пример:
program arithmetic
implicit none
real :: pi, radius, height, area, volume
pi = 3.1415927
print *, 'Enter cylinder base radius:'
read(*,*) radius
print *, 'Enter cylinder height:'
read(*,*) height
area = pi * radius**2
volume = area * height
print *, 'Cylinder radius is: ', radius
print *, 'Cylinder height is: ', height
print *, 'Cylinder base area is: ', area
print *, 'Cylinder volume is: ', volume
end program arithmetic
Точность чисел с плавающей точкой#
Желаемая точность (вещественных) чисел с плавающей точкой может быть явно указана с помощью параметра kind
. Встроенный модуль iso_fortran_env
предоставляет параметры kind
для распространённых 32-битных (одинарная точность) и 64-битных (двойная точность) типов чисел с плавающей точкой.
Пример: явное указание вещественного типа с помощью параметра kind
program float
use, intrinsic :: iso_fortran_env, only: sp=>real32, dp=>real64
implicit none
real(sp) :: float32
real(dp) :: float64
float32 = 1.0_sp ! Explicit suffix for literal constants
float64 = 1.0_dp
print*, float32, float64
end program float
Всегда используйте суффикс (в примере выше:
_sp
– для одинарной,_dp
– для двойной точности) параметраkind
для литеральных констант представленных в виде числа с плавающей точкой.
Пример: C-интерпорабельный параметр kind
(функционально совместимый с типом языка C)
program float
use, intrinsic :: iso_c_binding, only: sp=>c_float, dp=>c_double
implicit none
real(sp) :: float32
real(dp) :: float64
end program float
В следующей части мы узнаем как использовать массивы для хранения более одного значения в переменной.
Local scope variables with block
construct#
The 2008 Fortran standard introduced the notion of block
which enables using local scope variables within a program or procedure.
Пример:
module your_module
implicit none
integer :: n = 2
end module
program main
implicit none
real :: x
block
use your_module, only: n ! you can import modules within blocks
real :: y ! local scope variable
y = 2.0
x = y ** n
print *, y
end block
! print *, y ! this is not allowed as y only exists during the block's scope
print *, x ! prints 4.00000000
end program