]]> ]]>

g95 0.93

Версия реализации G95 языка программирования FORTRAN

Последняя версия компилятора g95, выпущенная в 2008 году.

Примеры:

Hello, World! - FORTRAN (94):

Этот пример написан в свободном формате, поддерживаемом Fortran 90 и последующими стандартами, а также диалектом F.

! Fortran 90-style comment
program HelloWorld
  print *, "Hello, World!"
end program HelloWorld

Факториал - FORTRAN (95):

Используется итеративное определение факториала и свободный формат программы. Спецификации формата I и A используются для вывода чисел в десятичном формате и строк, соответственно. При вычислении факториалов 13-16 возникает арифметическое переполнение, не вызывающее ошибку, поэтому выводятся неправильные значения:

13! = 1932053504
14! = 1278945280
15! = 2004310016
16! = 2004189184

program Factorial

  integer :: f,n
  f = 1
  n = 0
  do
    print "(I2, A, I10)", n, "! = ", f
    n = n + 1
    f = f * n
    if (n == 17) then
      exit
    end if
  end do

end program Factorial

Числа Фибоначчи - FORTRAN (96):

Используется итеративное определение чисел Фибоначчи. Самое сложное в этом примере — вывод вычисленных значений в нужном формате, в одну строку и без лишних пробелов. Спецификация формата (I3, A, $) означает, что вначале выводится целое число в десятичном формате, шириной ровно три символа, затем выводится строка, и наконец, $ подавляет перевод строки, используемый командой print по умолчанию, так что все выводится в одну строку. Отметим, что в диалекте F спецификатор формата $ не является стандартным; программа работает, но при компиляции выводит предупреждение об этом.

program Fibonacci

  integer :: f1,f2,f3,i
  i = 1
  f1 = 0
  f2 = 1
  do
    f3 = f2 + f1
    f1 = f2
    f2 = f3
    i = i + 1
    if (f1 < 10) then
      print "(I1, A, $)", f1, ", "
    elseif (f1 < 100) then
      print "(I2, A, $)", f1, ", "
    else
      print "(I3, A, $)", f1, ", "
    end if
    if (i == 17) then
      exit
    end if
  end do
  print *, "..."

end program Fibonacci

Квадратное уравнение - FORTRAN (522):

В примере используется встроенный тип данных complex. // — оператор конкатенации строк. Число перед скобками в описании формата означает количество раз, которые повторяется формат в скобках (в данном случае дважды — для первого и второго корней).

program Quadratic
  integer :: a, b, c
  real :: d, p1, p2
  complex :: cp2

  read (*, *), a
  if (a == 0) then
    write (*, *) "Not a quadratic equation"
    stop
  end if
  read (*, *) b
  read (*, *) c
  d = b * b - 4 * a * c
  p1 = - b / 2.0 / a
  if (abs(d) < 1.0e-9) then
    write (*, "(A, F8.3)") "x = ", p1
  elseif (d > 0) then
    p2 = sqrt(d) / 2.0 / a
    write (*, "(2(A, F8.3))") "x1 = ", p1 + p2, char(13) // char(10) // "x2 = ", p1 - p2
  else
    cp2 = sqrt(cmplx(d)) / 2.0 / a
    write (*, "(2(A, F8.3, F8.3), A)") "x1 = (", p1 + cp2, ")" // char(13) // char(10) // "x2 = (", p1 - cp2, ")"
  end if
end

Hello, World! - FORTRAN (530):

Этот пример написан в фиксированном формате (стиль FORTRAN 77); первые шесть символов каждой строки зарезервированы под служебную информацию — отметки о том, что строка является комментарием или продолжением предыдущей, метки и номера строк. Стандартный набор символов Fortran не содержит символов нижнего регистра, поэтому все программы пишутся в верхнем регистре. Исключением из этого правила являются символьные константы — они могут содержать любые символы, которые поддерживаются системой.

Первая строка дает этому фрагменту кода имя HELLO и указывает на то, что он является основной программой. Имя программы подчиняется тем же правилам, что и любые имена идентификаторов, т.е. должно начинаться с буквы и содержать не более 6 символов.

Команда WRITE реализует вывод на печать. В скобках передается список управляющих параметров, настраивающих вывод: UNIT выбирает файл вывода (по умолчанию — консоль), FMT — формат вывода. Звездочки означают параметры по умолчанию. Имена параметров передавать не обязательно, сокращенно эта же команда выглядела бы как WRITE (*, *) ....

В большинстве реализаций строковая константа может заключаться как в одинарные кавычки, так и в двойные.

! A simple Hello, World! program
      PROGRAM HELLO
        WRITE (UNIT=*, FMT=*) 'Hello, World!'
      END

Факториал - FORTRAN (531):

Этот пример написан в фиксированном формате (стиль FORTRAN 77) и использует итеративное вычисление факториала.

Fortran позволяет пропускать объявления переменных; в таком случае он выводит их типы сам, но, в отличие от более поздних языков, не по контексту использования переменной, а по ее имени — если первая буква названия I..N, выбирается тип INTEGER, иначе — REAL. В данном случае обе переменные целые.

Цикл DO в данном случае соответствует циклу FOR более поздних языков: счетчик цикла N последовательно пробегает все значения от 0 до 16. Тело цикла заканчивается на строке с меткой 1, которая указана в заголовке цикла.

Команда PRINT использует формат вывода по умолчанию, который варьируется в зависимости от используемого компилятора.

      PROGRAM FACTOR
        NF = 1
        DO 1,N = 0,16
          PRINT *, N, "! =", NF
1         NF = NF * (N + 1)
      END

Числа Фибоначчи - FORTRAN (532):

Этот пример демонстрирует использование массивов в Fortran. Индексация элементов начинается с 1.

      PROGRAM FIBONACCI
        INTEGER FIB(20)
        FIB(1) = 0
        FIB(2) = 1
        DO 1,N = 2,17
          PRINT "(I3, A, $)", FIB(N), ", "
1         FIB(N + 1) = FIB(N) + FIB(N - 1)
        PRINT *, "..."
      END

CamelCase - FORTRAN (533):

Строки в Fortran имеют фиксированную длину, задаваемую при объявлении строки. Если длина фактического содержимого строки меньше, чем размер строки, ее остаток дополняется пробелами или “мусорными” символами. Кроме того, в Fortran нет символа “конца строки”, как в C. Из-за этого после посимвольного заполнения строки CC, содержащей результат, остаток строки приходится заполнять пробелами вручную.

Проверка того, что очередной символ исходной строки является буквой, слишком длинна, чтобы поместиться в одну строку (все символы строки программы, начиная с 73-ей позиции, игнорируются), поэтому ее приходится разбивать на две строки и отмечать вторую как продолжение первой (любым символом в 6 позиции).

Операторы сравнения в FORTRAN 77 записываются как .LE., .GE. и т.д. из-за того, что символы > и < не входят в набор символов языка; они были добавлены только в Fortran 90.

      PROGRAM CAMELC
        CHARACTER TEXT*30, CC*30
        LOGICAL LSPACE
        READ (*, '(A)') TEXT
        NCC = 0
        LSPACE = .TRUE.
        DO 1, I = 1,LEN(TEXT)
          NC = ICHAR(TEXT(I:I))
          IF (NC .GE. 65 .AND. NC .LE. 90 .OR.
     >        NC .GE. 97 .AND. NC .LE. 122) THEN
            IF (LSPACE) THEN
              IF (NC .GE. 97 .AND. NC .LE. 122) THEN
                NC = NC - 32
              END IF
            ELSE
              IF (NC .GE. 65 .AND. NC .LE. 90) THEN
                NC = NC + 32
              END IF
            END IF
            NCC = NCC + 1
            CC(NCC:NCC) = CHAR(NC)
            LSPACE = .FALSE.
          ELSE
            LSPACE = .TRUE.
          END IF
1       CONTINUE
        DO 2, I = NCC + 1,LEN(CC)
2         CC(I:I) = " "
        WRITE (*, *) CC
      END

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам