Переменные#

Переменные хранят информацию, которая может быть использована программой. 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