Фортран — Обзор
Фортран, как это происходит от Formula Translating System, является универсальным императивным языком программирования. Он используется для числовых и научных вычислений.
Fortran был изначально разработан IBM в 1950-х годах для научных и инженерных приложений. Фортран долгое время управлял этой областью программирования и стал очень популярен для высокопроизводительных вычислений.
Поддерживает —
- Численный анализ и научные вычисления
- Структурированное программирование
- Программирование массива
- Модульное программирование
- Общее программирование
- Высокопроизводительные вычисления на суперкомпьютерах
- Объектно-ориентированное программирование
- Параллельное программирование
- Разумная степень переносимости между компьютерными системами
Факты о Фортране
-
Fortran был создан командой во главе с Джоном Бэкусом в IBM в 1957 году.
-
Первоначально имя использовалось прописными буквами, но современные стандарты и реализации требуют, чтобы первая буква была заглавной.
-
Фортран расшифровывается как ФОРМУЛА ТРАНСКЛАТОР.
-
Первоначально разработанный для научных расчетов, он имел очень ограниченную поддержку символьных строк и других структур, необходимых для программирования общего назначения.
-
Более поздние расширения и разработки превратили его в язык программирования высокого уровня с хорошей степенью переносимости.
-
Оригинальные версии, Fortran I, II и III, считаются устаревшими.
-
Самая старая версия, которая еще используется, это Fortran IV и Fortran 66.
-
Наиболее часто используемые версии сегодня: Fortran 77, Fortran 90 и Fortran 95.
-
Fortran 77 добавил строки как отдельный тип.
-
В Fortran 90 добавлены различные виды многопоточности и прямой обработки массивов.
Fortran был создан командой во главе с Джоном Бэкусом в IBM в 1957 году.
Первоначально имя использовалось прописными буквами, но современные стандарты и реализации требуют, чтобы первая буква была заглавной.
Фортран расшифровывается как ФОРМУЛА ТРАНСКЛАТОР.
Первоначально разработанный для научных расчетов, он имел очень ограниченную поддержку символьных строк и других структур, необходимых для программирования общего назначения.
Более поздние расширения и разработки превратили его в язык программирования высокого уровня с хорошей степенью переносимости.
Оригинальные версии, Fortran I, II и III, считаются устаревшими.
Самая старая версия, которая еще используется, это Fortran IV и Fortran 66.
Наиболее часто используемые версии сегодня: Fortran 77, Fortran 90 и Fortran 95.
Fortran 77 добавил строки как отдельный тип.
В Fortran 90 добавлены различные виды многопоточности и прямой обработки массивов.
Fortran — Настройка среды
Настройка Фортрана в Windows
G95 — это мультиархитектурный компилятор GNU Fortran, используемый для настройки Fortran в Windows. Версия для Windows эмулирует среду Unix, используя MingW под Windows. Инсталлятор позаботится об этом и автоматически добавит g95 в переменную PATH Windows.
Вы можете получить стабильную версию G95 здесь
Как использовать G95
Во время установки g95 автоматически добавляется в переменную PATH, если вы выбираете опцию «РЕКОМЕНДУЕТСЯ». Это означает, что вы можете просто открыть новое окно командной строки и набрать «g95», чтобы вызвать компилятор. Ниже приведены основные команды, с которых можно начать.
Sr.No | Команда и описание |
---|---|
1 |
g95 –c hello.f90 Компилирует hello.f90 в объектный файл с именем hello.o |
2 |
g95 hello.f90 Компилирует hello.f90 и связывает его для создания исполняемого файла a.out |
3 |
g95 -c h1.f90 h2.f90 h3.f90 Компилирует несколько исходных файлов. Если все идет хорошо, создаются объектные файлы h1.o, h2.o и h3.o |
4 |
g95 -o привет h1.f90 h2.f90 h3.f90 Компилирует несколько исходных файлов и связывает их вместе с исполняемым файлом с именем ‘hello’ |
g95 –c hello.f90
Компилирует hello.f90 в объектный файл с именем hello.o
g95 hello.f90
Компилирует hello.f90 и связывает его для создания исполняемого файла a.out
g95 -c h1.f90 h2.f90 h3.f90
Компилирует несколько исходных файлов. Если все идет хорошо, создаются объектные файлы h1.o, h2.o и h3.o
g95 -o привет h1.f90 h2.f90 h3.f90
Компилирует несколько исходных файлов и связывает их вместе с исполняемым файлом с именем ‘hello’
Параметры командной строки для G95
-c Compile only, do not run the linker. -o Specify the name of the output file, either an object file or the executable.
Несколько исходных и объектных файлов могут быть указаны одновременно. Файлы Fortran обозначаются именами, заканчивающимися на «.f», «.F», «.for», «.FOR», «.f90», «.F90», «.f95», «.F95», «. f03 «и» .F03 «. Можно указать несколько исходных файлов. Объектные файлы также могут быть указаны и будут связаны для формирования исполняемого файла.
Фортран — основной синтаксис
Программа на Фортране состоит из набора программных модулей, таких как основная программа, модули и внешние подпрограммы или процедуры.
Каждая программа содержит одну основную программу и может содержать или не содержать другие программные блоки. Синтаксис основной программы следующий:
program program_name implicit none ! type declaration statements ! executable statements end program program_name
Простая программа на фортране
Давайте напишем программу, которая добавляет два числа и печатает результат —
program addNumbers ! This simple program adds two numbers implicit none ! Type declarations real :: a, b, result ! Executable statements a = 12.0 b = 15.0 result = a + b print *, 'The total is ', result end program addNumbers
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
The total is 27.0000000
Пожалуйста, обратите внимание, что —
-
Все программы на Фортране начинаются с ключевого слова program и заканчиваются ключевым словом end program, за которым следует название программы.
-
Неявный оператор none позволяет компилятору проверить, что все ваши типы переменных объявлены правильно. Вы должны всегда использовать неявное none в начале каждой программы.
-
Комментарии в Фортране начинаются с восклицательного знака (!), Так как все символы после этого (кроме строки символов) игнорируются компилятором.
-
Команда print * отображает данные на экране.
-
Отступы строк кода — хорошая практика для сохранения читабельности программы.
-
Фортран допускает как прописные, так и строчные буквы. Фортран нечувствителен к регистру, за исключением строковых литералов.
Все программы на Фортране начинаются с ключевого слова program и заканчиваются ключевым словом end program, за которым следует название программы.
Неявный оператор none позволяет компилятору проверить, что все ваши типы переменных объявлены правильно. Вы должны всегда использовать неявное none в начале каждой программы.
Комментарии в Фортране начинаются с восклицательного знака (!), Так как все символы после этого (кроме строки символов) игнорируются компилятором.
Команда print * отображает данные на экране.
Отступы строк кода — хорошая практика для сохранения читабельности программы.
Фортран допускает как прописные, так и строчные буквы. Фортран нечувствителен к регистру, за исключением строковых литералов.
основы
Базовый набор символов Фортрана содержит —
- буквы А … Я и А … Я
- цифры 0 … 9
- символ подчеркивания (_)
- специальные символы =: + пробел — * / () [],. $ ‘! «% &; <>?
Жетоны состоят из символов в базовом наборе символов. Токен может быть ключевым словом, идентификатором, константой, строковым литералом или символом.
Заявления программы состоят из токенов.
Идентификатор
Идентификатор — это имя, используемое для идентификации переменной, процедуры или любого другого определенного пользователем элемента. Имя в Фортране должно следовать следующим правилам —
-
Он не может быть длиннее 31 символа.
-
Он должен состоять из буквенно-цифровых символов (все буквы алфавита и цифры от 0 до 9) и подчеркивания (_).
-
Первым символом имени должна быть буква.
-
Имена нечувствительны к регистру
Он не может быть длиннее 31 символа.
Он должен состоять из буквенно-цифровых символов (все буквы алфавита и цифры от 0 до 9) и подчеркивания (_).
Первым символом имени должна быть буква.
Имена нечувствительны к регистру
Ключевые слова
Ключевые слова — это специальные слова, зарезервированные для языка. Эти зарезервированные слова не могут быть использованы в качестве идентификаторов или имен.
В следующей таблице перечислены ключевые слова Fortran —
Ключевые слова не I / O | ||||
---|---|---|---|---|
размещаемый | выделять | назначать | назначение | блокировать данные |
вызов | дело | персонаж | общий | сложный |
содержит | Продолжить | цикл | данные | DEALLOCATE |
дефолт | делать | двойная точность | еще | иначе если |
в другом месте | данные конца блока | конец делать | конечная функция | конец, если |
конечный интерфейс | конечный модуль | конец программы | выбор конца | конец подпрограммы |
тип конца | конец где | запись | эквивалентность | выход |
внешний | функция | идти к | если | неявный |
в | INOUT | целое число | намерение | интерфейс |
свойственный | Добрый | Len | логический | модуль |
список имен | сводить на нет | только | оператор | необязательный |
из | параметр | Пауза | указатель | частный |
программа | общественности | реальный | рекурсивный | результат |
вернуть | спасти | выберите случай | стоп | подпрограмма |
цель | затем | тип | тип() | использование |
куда | В то время как | |||
Ключевые слова, связанные с вводом / выводом | ||||
возврат на одну позицию | близко | ENDFILE | формат | спрашивать |
открыть | Распечатать | читать | перемотка | Написать |
Фортран — Типы данных
Fortran предоставляет пять внутренних типов данных, однако вы также можете получить свои собственные типы данных. Пять внутренних типов —
- Целочисленный тип
- Реальный тип
- Сложный тип
- Логический тип
- Тип персонажа
Целочисленный тип
Целочисленные типы могут содержать только целочисленные значения. В следующем примере извлекается наибольшее значение, которое может содержаться в обычном четырехбайтовом целом числе:
program testingInt implicit none integer :: largeval print *, huge(largeval) end program testingInt
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
2147483647
Обратите внимание, что функция large () выдает наибольшее число, которое может содержаться конкретным целочисленным типом данных. Вы также можете указать количество байтов, используя спецификатор вида . Следующий пример демонстрирует это —
program testingInt implicit none !two byte integer integer(kind = 2) :: shortval !four byte integer integer(kind = 4) :: longval !eight byte integer integer(kind = 8) :: verylongval !sixteen byte integer integer(kind = 16) :: veryverylongval !default integer integer :: defval print *, huge(shortval) print *, huge(longval) print *, huge(verylongval) print *, huge(veryverylongval) print *, huge(defval) end program testingInt
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
32767 2147483647 9223372036854775807 170141183460469231731687303715884105727 2147483647
Реальный тип
Он хранит числа с плавающей запятой, такие как 2.0, 3.1415, -100.876 и т. Д.
Традиционно есть два различных реальных типа, реальный тип по умолчанию и тип двойной точности .
Однако Fortran 90/95 обеспечивает больший контроль над точностью реальных и целочисленных типов данных с помощью спецификатора вида , который мы изучим в главе о числах.
В следующем примере показано использование реального типа данных —
program division implicit none ! Define real variables real :: p, q, realRes ! Define integer variables integer :: i, j, intRes ! Assigning values p = 2.0 q = 3.0 i = 2 j = 3 ! floating point division realRes = p/q intRes = i/j print *, realRes print *, intRes end program division
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
0.666666687 0
Комплексный тип
Это используется для хранения комплексных чисел. Комплексное число состоит из двух частей: действительной части и мнимой части. Два последовательных цифровых запоминающих устройства хранят эти две части.
Например, комплексное число (3,0, -5,0) равно 3,0 — 5,0i
Мы обсудим сложные типы более подробно в главе Numbers.
Логический тип
Есть только два логических значения: .true. и .false.
Тип персонажа
Тип символа хранит символы и строки. Длина строки может быть указана спецификатором len. Если длина не указана, это 1.
Например,
character (len = 40) :: name name = “Zara Ali”
Выражение name (1: 4) даст подстроку «Zara».
Неявная печать
В старых версиях Fortran допускалась функция, называемая неявной типизацией, т. Е. Вам не нужно объявлять переменные перед использованием. Если переменная не объявлена, то первая буква ее имени будет определять ее тип.
Имена переменных, начинающиеся с i, j, k, l, m или n, считаются целочисленными, а другие — действительными переменными. Однако вы должны объявить все переменные, так как это хорошая практика программирования. Для этого вы начинаете свою программу с заявления —
implicit none
Это утверждение отключает неявную типизацию.
Фортран — Переменные
Переменная — это не что иное, как имя, данное области памяти, которой могут манипулировать наши программы. Каждая переменная должна иметь определенный тип, который определяет размер и расположение памяти переменной; диапазон значений, которые могут быть сохранены в этой памяти; и набор операций, которые могут быть применены к переменной.
Имя переменной может состоять из букв, цифр и символа подчеркивания. Имя в Фортране должно следовать следующим правилам —
-
Он не может быть длиннее 31 символа.
-
Он должен состоять из буквенно-цифровых символов (все буквы алфавита и цифры от 0 до 9) и подчеркивания (_).
-
Первым символом имени должна быть буква.
-
Имена чувствительны к регистру.
Он не может быть длиннее 31 символа.
Он должен состоять из буквенно-цифровых символов (все буквы алфавита и цифры от 0 до 9) и подчеркивания (_).
Первым символом имени должна быть буква.
Имена чувствительны к регистру.
Основываясь на базовых типах, описанных в предыдущей главе, ниже приведены типы переменных:
Sr.No | Тип и описание |
---|---|
1 |
целое число Может содержать только целые значения. |
2 |
реальный Он хранит числа с плавающей запятой. |
3 |
Сложный Используется для хранения комплексных чисел. |
4 |
логический Он хранит логические логические значения. |
5 |
символ Он хранит символы или строки. |
целое число
Может содержать только целые значения.
реальный
Он хранит числа с плавающей запятой.
Сложный
Используется для хранения комплексных чисел.
логический
Он хранит логические логические значения.
символ
Он хранит символы или строки.
Объявление переменной
Переменные объявляются в начале программы (или подпрограммы) в операторе объявления типа.
Синтаксис для объявления переменных выглядит следующим образом:
type-specifier :: variable_name
Например
integer :: total real :: average complex :: cx logical :: done character(len = 80) :: message ! a string of 80 characters
Позже вы можете присвоить значения этим переменным, например,
total = 20000 average = 1666.67 done = .true. message = “A big Hello from Tutorials Point” cx = (3.0, 5.0) ! cx = 3.0 + 5.0i
Вы также можете использовать встроенную функцию cmplx, чтобы присвоить значения сложной переменной —
cx = cmplx (1.0/2.0, -7.0) ! cx = 0.5 – 7.0i cx = cmplx (x, y) ! cx = x + yi
пример
В следующем примере демонстрируется объявление, назначение и отображение переменной на экране —
program variableTesting implicit none ! declaring variables integer :: total real :: average complex :: cx logical :: done character(len=80) :: message ! a string of 80 characters !assigning values total = 20000 average = 1666.67 done = .true. message = "A big Hello from Tutorials Point" cx = (3.0, 5.0) ! cx = 3.0 + 5.0i Print *, total Print *, average Print *, cx Print *, done Print *, message end program variableTesting
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
20000 1666.67004 (3.00000000, 5.00000000 ) T A big Hello from Tutorials Point
Фортран — Константы
Константы ссылаются на фиксированные значения, которые программа не может изменить во время выполнения. Эти фиксированные значения также называются литералами .
Константы могут быть любого из основных типов данных, таких как целочисленная константа, плавающая константа, символьная константа, комплексная константа или строковый литерал. Есть только две логические константы: .true. и .false.
Константы обрабатываются как обычные переменные, за исключением того, что их значения не могут быть изменены после их определения.
Именованные константы и литералы
Есть два типа констант —
- Литеральные константы
- Именованные константы
Литеральная константа имеет значение, но не имеет имени.
Например, следующие буквальные константы —
Тип | пример |
---|---|
Целочисленные константы | 0 1 -1 300 123456789 |
Реальные константы | 0,0 1,0 -1,0 123,456 7,1E + 10 -52,715E-30 |
Комплексные константы | (0,0, 0,0) (-123,456E + 30, 987,654E-29) |
Логические константы | .правда. .ложный. |
Символьные константы |
«PQR» «a» «123’abc $% # @!» » цитата «» « ‘PQR’ ‘a’ ‘123 «abc $% # @!’ «апостроф» |
«PQR» «a» «123’abc $% # @!»
» цитата «» «
‘PQR’ ‘a’ ‘123 «abc $% # @!’
«апостроф»
Именованная константа имеет значение, а также имя.
Именованные константы должны быть объявлены в начале программы или процедуры, точно так же, как объявление типа переменной, с указанием ее имени и типа. Именованные константы объявляются с атрибутом параметра. Например,
real, parameter :: pi = 3.1415927
пример
Следующая программа рассчитывает смещение из-за вертикального движения под действием силы тяжести.
program gravitationalDisp ! this program calculates vertical motion under gravity implicit none ! gravitational acceleration real, parameter :: g = 9.81 ! variable declaration real :: s ! displacement real :: t ! time real :: u ! initial speed ! assigning values t = 5.0 u = 50 ! displacement s = u * t - g * (t**2) / 2 ! output print *, "Time = ", t print *, 'Displacement = ',s end program gravitationalDisp
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Time = 5.00000000 Displacement = 127.374992
Фортран — Операторы
Оператор — это символ, который указывает компилятору выполнять определенные математические или логические манипуляции. Fortran предоставляет следующие типы операторов —
- Арифметические Операторы
- Операторы отношений
- Логические Операторы
Давайте посмотрим на все эти типы операторов один за другим.
Арифметические Операторы
Следующая таблица показывает все арифметические операторы, поддерживаемые Fortran. Предположим, что переменная A содержит 5, а переменная B содержит 3, тогда —
оператор | Описание | пример |
---|---|---|
+ | Оператор сложения, добавляет два операнда. | А + Б даст 8 |
— | Оператор вычитания, вычитает второй операнд из первого. | А — Б даст 2 |
* | Оператор умножения, умножает оба операнда. | А * Б даст 15 |
/ | Оператор деления, делитель числителя на числитель. | А / Б даст 1 |
** | Оператор возведения в степень, возводит один операнд в степень другого. | А ** Б даст 125 |
Операторы отношений
Следующая таблица показывает все реляционные операторы, поддерживаемые Fortran. Предположим, что переменная A содержит 10, а переменная B содержит 20, тогда —
оператор | эквивалент | Описание | пример |
---|---|---|---|
== | .eq. | Проверяет, равны ли значения двух операндов или нет, если да, тогда условие становится истинным. | (A == B) не соответствует действительности. |
знак равно | .На. | Проверяет, равны ли значения двух операндов или нет, если значения не равны, тогда условие становится истинным. | (A! = B) верно. |
> | .gt. | Проверяет, больше ли значение левого операнда, чем значение правого операнда, если да, тогда условие становится истинным. | (A> B) не соответствует действительности. |
< | .lt. | Проверяет, меньше ли значение левого операнда, чем значение правого операнда, если да, тогда условие становится истинным. | (A <B) верно. |
> = | .ge. | Проверяет, больше ли значение левого операнда или равно значению правого операнда, если да, тогда условие становится истинным. | (A> = B) не соответствует действительности. |
<= | .LE. | Проверяет, меньше ли значение левого операнда или равно значению правого операнда, если да, тогда условие становится истинным. | (A <= B) верно. |
Логические Операторы
Логические операторы в Фортране работают только с логическими значениями .true. и .false.
В следующей таблице показаны все логические операторы, поддерживаемые Fortran. Предположим, переменная A содержит .true. и переменная B содержит .false. тогда —
оператор | Описание | пример |
---|---|---|
.а также. | Называется логический оператор И. Если оба операнда отличны от нуля, условие становится истинным. | (A. И. B) является ложным. |
.или же. | Вызывается логическим оператором ИЛИ. Если любой из двух операндов отличен от нуля, условие становится истинным. | (A. Или. B) это правда. |
.не. | Вызывается логическим оператором НЕ. Используйте для изменения логического состояния своего операнда. Если условие истинно, то оператор Логический НЕ будет делать ложь. | ! (A. И. B) это правда. |
.eqv. | Называется логический EQUIVALENT Operator. Используется для проверки эквивалентности двух логических значений. | (A .eqv. B) является ложным. |
.neqv. | Называется логическим неэквивалентным оператором. Используется для проверки неэквивалентности двух логических значений. | (A. Neqv. B) верно. |
Приоритет операторов в Фортране
Приоритет оператора определяет группировку терминов в выражении. Это влияет на то, как оценивается выражение. Некоторые операторы имеют более высокий приоритет, чем другие; например, оператор умножения имеет более высокий приоритет, чем оператор сложения.
Например, х = 7 + 3 * 2; здесь x назначено 13, а не 20, потому что оператор * имеет более высокий приоритет, чем +, поэтому он сначала умножается на 3 * 2, а затем прибавляется к 7.
Здесь операторы с самым высоким приоритетом отображаются вверху таблицы, а операторы с самым низким — внизу. Внутри выражения операторы с более высоким приоритетом будут оцениваться первыми.
категория | оператор | Ассоциативность |
---|---|---|
Логическое НЕ и отрицательный знак | .не. (-) | Слева направо |
Возведение | ** | Слева направо |
Multiplicative | * / | Слева направо |
присадка | + — | Слева направо |
реляционный | <<=>> = | Слева направо |
равенство | == / = | Слева направо |
Логическое И | .а также. | Слева направо |
Логическое ИЛИ | .или же. | Слева направо |
присваивание | знак равно | Справа налево |
Фортран — Решения
Структуры принятия решений требуют, чтобы программист указал одно или несколько условий, которые должны быть оценены или протестированы программой, вместе с оператором или инструкциями, которые должны быть выполнены, если условие определено как истинное, и, необязательно, другие операторы, которые должны быть выполнены, если условие определяется как ложное.
Ниже приводится общая форма типичной структуры принятия решений, встречающейся в большинстве языков программирования.
Fortran предоставляет следующие типы конструкций для принятия решений.
Sr.No | Заявление и описание |
---|---|
1 | Если … то построить
Оператор if… then… end if состоит из логического выражения, за которым следует одно или несколько операторов. |
2 | Если … тогда … еще построить
За оператором if… then может следовать необязательный оператор else, который выполняется, когда логическое выражение ложно. |
3 | if … else if … else Заявление
Конструкция оператора if может иметь одну или несколько необязательных конструкций else-if . Когда условие if не выполняется, выполняется немедленно следующее else-if . Когда else-if также терпит неудачу, выполняется его преемник else-if (если есть) и так далее. |
4 | вложенный, если построить
Вы можете использовать один оператор if или else if внутри другого оператора if или else if . |
5 | выберите случай конструкции
Оператор select case позволяет проверять переменную на соответствие списку значений. |
6 | вложенная конструкция выбора случая
Вы можете использовать один оператор выбора case внутри другого оператора (ов) выбора case . |
Оператор if… then… end if состоит из логического выражения, за которым следует одно или несколько операторов.
За оператором if… then может следовать необязательный оператор else, который выполняется, когда логическое выражение ложно.
Конструкция оператора if может иметь одну или несколько необязательных конструкций else-if . Когда условие if не выполняется, выполняется немедленно следующее else-if . Когда else-if также терпит неудачу, выполняется его преемник else-if (если есть) и так далее.
Вы можете использовать один оператор if или else if внутри другого оператора if или else if .
Оператор select case позволяет проверять переменную на соответствие списку значений.
Вы можете использовать один оператор выбора case внутри другого оператора (ов) выбора case .
Фортран — Петли
Может возникнуть ситуация, когда вам нужно выполнить блок кода несколько раз. В общем случае операторы выполняются последовательно: первый оператор в функции выполняется первым, затем второй и так далее.
Языки программирования предоставляют различные управляющие структуры, которые допускают более сложные пути выполнения.
Оператор цикла позволяет нам выполнять оператор или группу операторов несколько раз, и в большинстве языков программирования ниже приводится общая форма инструкции цикла.
Fortran предоставляет следующие типы конструкций цикла для обработки требований цикла. Нажмите на следующие ссылки, чтобы проверить их детали.
Sr.No | Тип и описание петли |
---|---|
1 | сделать цикл
Эта конструкция позволяет выполнять оператор или серию операторов итеративно, в то время как данное условие выполняется. |
2 | сделать пока цикл
Повторяет оператор или группу операторов, пока данное условие выполняется. Он проверяет условие перед выполнением тела цикла. |
3 | вложенные циклы
Вы можете использовать одну или несколько конструкций цикла внутри любой другой конструкции цикла. |
Эта конструкция позволяет выполнять оператор или серию операторов итеративно, в то время как данное условие выполняется.
Повторяет оператор или группу операторов, пока данное условие выполняется. Он проверяет условие перед выполнением тела цикла.
Вы можете использовать одну или несколько конструкций цикла внутри любой другой конструкции цикла.
Заявления о контроле цикла
Операторы управления циклом изменяют выполнение от его нормальной последовательности. Когда выполнение покидает область действия, все автоматические объекты, созданные в этой области, уничтожаются.
Fortran поддерживает следующие операторы управления. Нажмите на следующие ссылки, чтобы проверить их детали.
Sr.No | Контрольное заявление и описание |
---|---|
1 | выход
Если оператор выхода выполнен, цикл завершается, и выполнение программы продолжается с первого исполняемого оператора после оператора конца do. |
2 | цикл
Если выполняется цикл, программа продолжается в начале следующей итерации. |
3 | стоп
Если вы хотите, чтобы выполнение вашей программы остановилось, вы можете вставить оператор остановки |
Если оператор выхода выполнен, цикл завершается, и выполнение программы продолжается с первого исполняемого оператора после оператора конца do.
Если выполняется цикл, программа продолжается в начале следующей итерации.
Если вы хотите, чтобы выполнение вашей программы остановилось, вы можете вставить оператор остановки
Фортран — Номера
Числа в Фортране представлены тремя внутренними типами данных —
- Целочисленный тип
- Реальный тип
- Сложный тип
Целочисленный тип
Целочисленные типы могут содержать только целочисленные значения. В следующем примере извлекается наибольшее значение, которое может храниться в обычном четырехбайтовом целом числе:
program testingInt implicit none integer :: largeval print *, huge(largeval) end program testingInt
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
2147483647
Обратите внимание, что функция large () дает наибольшее число, которое может содержаться конкретным целочисленным типом данных. Вы также можете указать количество байтов, используя спецификатор вида . Следующий пример демонстрирует это —
program testingInt implicit none !two byte integer integer(kind = 2) :: shortval !four byte integer integer(kind = 4) :: longval !eight byte integer integer(kind = 8) :: verylongval !sixteen byte integer integer(kind = 16) :: veryverylongval !default integer integer :: defval print *, huge(shortval) print *, huge(longval) print *, huge(verylongval) print *, huge(veryverylongval) print *, huge(defval) end program testingInt
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
32767 2147483647 9223372036854775807 170141183460469231731687303715884105727 2147483647
Реальный тип
Он хранит числа с плавающей запятой, такие как 2.0, 3.1415, -100.876 и т. Д.
Традиционно существовало два разных реальных типа: реальный тип по умолчанию и тип двойной точности .
Однако Fortran 90/95 обеспечивает больший контроль над точностью реальных и целочисленных типов данных с помощью спецификатора вида , который мы вскоре рассмотрим.
В следующем примере показано использование реального типа данных —
program division implicit none ! Define real variables real :: p, q, realRes ! Define integer variables integer :: i, j, intRes ! Assigning values p = 2.0 q = 3.0 i = 2 j = 3 ! floating point division realRes = p/q intRes = i/j print *, realRes print *, intRes end program division
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
0.666666687 0
Комплексный тип
Это используется для хранения комплексных чисел. Комплексное число состоит из двух частей: действительной части и мнимой части. Два последовательных цифровых запоминающих устройства хранят эти две части.
Например, комплексное число (3,0, -5,0) равно 3,0 — 5,0i
Универсальная функция cmplx () создает комплексное число. Это приводит к тому, что действительная и мнимая части имеют одинаковую точность, независимо от типа входных аргументов.
program createComplex implicit none integer :: i = 10 real :: x = 5.17 print *, cmplx(i, x) end program createComplex
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
(10.0000000, 5.17000008)
Следующая программа демонстрирует арифметику комплексных чисел —
program ComplexArithmatic implicit none complex, parameter :: i = (0, 1) ! sqrt(-1) complex :: x, y, z x = (7, 8); y = (5, -7) write(*,*) i * x * y z = x + y print *, "z = x + y = ", z z = x - y print *, "z = x - y = ", z z = x * y print *, "z = x * y = ", z z = x / y print *, "z = x / y = ", z end program ComplexArithmatic
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
(9.00000000, 91.0000000) z = x + y = (12.0000000, 1.00000000) z = x - y = (2.00000000, 15.0000000) z = x * y = (91.0000000, -9.00000000) z = x / y = (-0.283783793, 1.20270276)
Диапазон, точность и размер чисел
Диапазон целых чисел, точность и размер чисел с плавающей запятой зависит от количества битов, выделенных для конкретного типа данных.
В следующей таблице показано количество битов и диапазон целых чисел —
Количество бит | Максимальное значение | причина |
---|---|---|
64 | 9.223.372.036.854.774.807 | (2 ** 63) -1 |
32 | 2147483647 | (2 ** 31) -1 |
В следующей таблице показано количество бит, наименьшее и наибольшее значение, а также точность для действительных чисел.
Количество бит | Наибольшее значение | Наименьшее значение | точность |
---|---|---|---|
64 | 0.8E + 308 | 0.5E-308 | 15-18 |
32 | 1.7E + 38 | 0.3e-38 | 6-9 |
Следующие примеры демонстрируют это —
program rangePrecision implicit none real:: x, y, z x = 1.5e+40 y = 3.73e+40 z = x * y print *, z end program rangePrecision
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
x = 1.5e+40 1 Error : Real constant overflows its kind at (1) main.f95:5.12: y = 3.73e+40 1 Error : Real constant overflows its kind at (1)
Теперь давайте использовать меньшее число —
program rangePrecision implicit none real:: x, y, z x = 1.5e+20 y = 3.73e+20 z = x * y print *, z z = x/y print *, z end program rangePrecision
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
Infinity 0.402144760
Теперь давайте посмотрим, как опустится
program rangePrecision implicit none real:: x, y, z x = 1.5e-30 y = 3.73e-60 z = x * y print *, z z = x/y print *, z end program rangePrecision
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
y = 3.73e-60 1 Warning : Real constant underflows its kind at (1) Executing the program.... $demo 0.00000000E+00 Infinity
Добрый Спецификатор
В научном программировании часто необходимо знать диапазон и точность данных аппаратной платформы, на которой выполняется работа.
Встроенная функция kind () позволяет вам запрашивать детали представления данных оборудования перед запуском программы.
program kindCheck implicit none integer :: i real :: r complex :: cp print *,' Integer ', kind(i) print *,' Real ', kind(r) print *,' Complex ', kind(cp) end program kindCheck
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
Integer 4 Real 4 Complex 4
Вы также можете проверить вид всех типов данных —
program checkKind implicit none integer :: i real :: r character :: c logical :: lg complex :: cp print *,' Integer ', kind(i) print *,' Real ', kind(r) print *,' Complex ', kind(cp) print *,' Character ', kind(c) print *,' Logical ', kind(lg) end program checkKind
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
Integer 4 Real 4 Complex 4 Character 1 Logical 4
Фортран — Персонажи
Язык Фортрана может обрабатывать символы как отдельные символы или смежные строки.
Символами могут быть любые символы, взятые из базового набора символов, т. Е. Из букв, десятичных цифр, подчеркивания и 21 специального символа.
Символьная константа — это символьная строка с фиксированным значением.
Внутренний символ типа данных хранит символы и строки. Длина строки может быть указана спецификатором len . Если длина не указана, она равна 1. Вы можете ссылаться на отдельные символы в строке, ссылаясь на позицию; самый левый символ находится в позиции 1.
Декларация персонажа
Объявление данных символьного типа аналогично другим переменным —
type-specifier :: variable_name
Например,
character :: reply, sex
Вы можете назначить значение, как,
reply = ‘N’ sex = ‘F’
В следующем примере демонстрируется объявление и использование символьного типа данных —
program hello implicit none character(len = 15) :: surname, firstname character(len = 6) :: title character(len = 25)::greetings title = 'Mr. ' firstname = 'Rowan ' surname = 'Atkinson' greetings = 'A big hello from Mr. Bean' print *, 'Here is ', title, firstname, surname print *, greetings end program hello
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
Here is Mr. Rowan Atkinson A big hello from Mr. Bean
Конкатенация персонажей
Оператор конкатенации //, объединяет символы.
Следующий пример демонстрирует это —
program hello implicit none character(len = 15) :: surname, firstname character(len = 6) :: title character(len = 40):: name character(len = 25)::greetings title = 'Mr. ' firstname = 'Rowan ' surname = 'Atkinson' name = title//firstname//surname greetings = 'A big hello from Mr. Bean' print *, 'Here is ', name print *, greetings end program hello
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
Here is Mr.Rowan Atkinson A big hello from Mr.Bean
Некоторые функции персонажа
В следующей таблице приведены некоторые часто используемые символьные функции вместе с описанием —
Sr.No | Описание функции |
---|---|
1 |
Len (строка) Возвращает длину строки символов |
2 |
Индекс (строка, sustring) Он находит расположение подстроки в другой строке, возвращает 0, если не найден. |
3 |
Ахар (целое) Преобразует целое число в символ |
4 |
iachar (с) Преобразует символ в целое число |
5 |
подрезать (строка) Возвращает строку с удаленными конечными пробелами. |
6 |
сканирование (строка, символы) Он ищет «строку» слева направо (если только не = = .true.) Для первого вхождения любого символа, содержащегося в «символах». Возвращает целое число, указывающее позицию этого символа, или ноль, если ни один из символов в «символах» не был найден. |
7 |
проверить (строка, символы) Он сканирует «строку» слева направо (если только не задано = .true.) Для первого вхождения любого символа, не содержащегося в «символах». Возвращает целое число, указывающее позицию этого символа, или ноль, если были найдены только символы в «символах» |
8 |
adjustl (строка) Выравнивает по левому краю символы, содержащиеся в «строке» |
9 |
adjustr (строка) Правильно оправдывает символы, содержащиеся в «строке» |
10 |
len_trim (строка) Возвращает целое число, равное длине строки (len (string)) минус количество конечных пробелов |
11 |
повтор (строка, ncopy) Он возвращает строку с длиной, равной «ncopy», умноженной на длину «строки», и содержащей «ncopy» сцепленные копии «строки» |
Len (строка)
Возвращает длину строки символов
Индекс (строка, sustring)
Он находит расположение подстроки в другой строке, возвращает 0, если не найден.
Ахар (целое)
Преобразует целое число в символ
iachar (с)
Преобразует символ в целое число
подрезать (строка)
Возвращает строку с удаленными конечными пробелами.
сканирование (строка, символы)
Он ищет «строку» слева направо (если только не = = .true.) Для первого вхождения любого символа, содержащегося в «символах». Возвращает целое число, указывающее позицию этого символа, или ноль, если ни один из символов в «символах» не был найден.
проверить (строка, символы)
Он сканирует «строку» слева направо (если только не задано = .true.) Для первого вхождения любого символа, не содержащегося в «символах». Возвращает целое число, указывающее позицию этого символа, или ноль, если были найдены только символы в «символах»
adjustl (строка)
Выравнивает по левому краю символы, содержащиеся в «строке»
adjustr (строка)
Правильно оправдывает символы, содержащиеся в «строке»
len_trim (строка)
Возвращает целое число, равное длине строки (len (string)) минус количество конечных пробелов
повтор (строка, ncopy)
Он возвращает строку с длиной, равной «ncopy», умноженной на длину «строки», и содержащей «ncopy» сцепленные копии «строки»
Пример 1
В этом примере показано использование функции индекса —
program testingChars implicit none character (80) :: text integer :: i text = 'The intrinsic data type character stores characters and strings.' i=index(text,'character') if (i /= 0) then print *, ' The word character found at position ',i print *, ' in text: ', text end if end program testingChars
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
The word character found at position 25 in text : The intrinsic data type character stores characters and strings.
Пример 2
Этот пример демонстрирует использование функции обрезки —
program hello implicit none character(len = 15) :: surname, firstname character(len = 6) :: title character(len = 25)::greetings title = 'Mr.' firstname = 'Rowan' surname = 'Atkinson' print *, 'Here is', title, firstname, surname print *, 'Here is', trim(title),' ',trim(firstname),' ', trim(surname) end program hello
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
Here isMr. Rowan Atkinson Here isMr. Rowan Atkinson
Пример 3
Этот пример демонстрирует использование функции ачар —
program testingChars implicit none character:: ch integer:: i do i = 65, 90 ch = achar(i) print*, i, ' ', ch end do end program testingChars
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
65 A 66 B 67 C 68 D 69 E 70 F 71 G 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W 88 X 89 Y 90 Z
Проверка лексического порядка символов
Следующие функции определяют лексическую последовательность символов —
Sr.No | Описание функции |
---|---|
1 |
lle (char, char) Сравнивает, является ли первый символ лексически меньше или равен второму |
2 |
lge (char, char) Сравнивает, является ли первый символ лексически большим или равным второму |
3 |
ЛГТ (символ, символ) Сравнивает, является ли первый символ лексически большим, чем второй |
4 |
llt (char, char) Сравнивает, является ли первый символ лексически меньше, чем второй |
lle (char, char)
Сравнивает, является ли первый символ лексически меньше или равен второму
lge (char, char)
Сравнивает, является ли первый символ лексически большим или равным второму
ЛГТ (символ, символ)
Сравнивает, является ли первый символ лексически большим, чем второй
llt (char, char)
Сравнивает, является ли первый символ лексически меньше, чем второй
Пример 4
Следующая функция демонстрирует использование —
program testingChars implicit none character:: a, b, c a = 'A' b = 'a' c = 'B' if(lgt(a,b)) then print *, 'A is lexically greater than a' else print *, 'a is lexically greater than A' end if if(lgt(a,c)) then print *, 'A is lexically greater than B' else print *, 'B is lexically greater than A' end if if(llt(a,b)) then print *, 'A is lexically less than a' end if if(llt(a,c)) then print *, 'A is lexically less than B' end if end program testingChars
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
a is lexically greater than A B is lexically greater than A A is lexically less than a A is lexically less than B
Фортран — Струны
Язык Фортрана может обрабатывать символы как отдельные символы или смежные строки.
Строка символов может иметь длину только один символ или даже нулевую длину. В Фортране символьные константы задаются между парой двойных или одинарных кавычек.
Внутренний символ типа данных хранит символы и строки. Длина строки может быть указана спецификатором len . Если длина не указана, она равна 1. Вы можете ссылаться на отдельные символы в строке, ссылаясь на позицию; самый левый символ находится в позиции 1.
Строковая декларация
Объявление строки совпадает с другими переменными —
type-specifier :: variable_name
Например,
Character(len = 20) :: firstname, surname
Вы можете назначить значение, как,
character (len = 40) :: name name = “Zara Ali”
В следующем примере демонстрируется объявление и использование символьного типа данных —
program hello implicit none character(len = 15) :: surname, firstname character(len = 6) :: title character(len = 25)::greetings title = 'Mr.' firstname = 'Rowan' surname = 'Atkinson' greetings = 'A big hello from Mr. Beans' print *, 'Here is', title, firstname, surname print *, greetings end program hello
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
Here is Mr. Rowan Atkinson A big hello from Mr. Bean
Конкатенация строк
Оператор конкатенации //, объединяет строки.
Следующий пример демонстрирует это —
program hello implicit none character(len = 15) :: surname, firstname character(len = 6) :: title character(len = 40):: name character(len = 25)::greetings title = 'Mr.' firstname = 'Rowan' surname = 'Atkinson' name = title//firstname//surname greetings = 'A big hello from Mr. Beans' print *, 'Here is', name print *, greetings end program hello
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
Here is Mr. Rowan Atkinson A big hello from Mr. Bean
Извлечение подстрок
В Fortran вы можете извлечь подстроку из строки, проиндексировав строку, указав начальный и конечный индексы подстроки в паре скобок. Это называется спецификатором экстента.
В следующем примере показано, как извлечь подстроку «world» из строки «hello world» —
program subString character(len = 11)::hello hello = "Hello World" print*, hello(7:11) end program subString
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
World
пример
В следующем примере функция date_and_time используется для указания строки даты и времени. Мы используем спецификаторы экстентов для извлечения года, даты, месяца, часа, минут и второй информации отдельно.
program datetime implicit none character(len = 8) :: dateinfo ! ccyymmdd character(len = 4) :: year, month*2, day*2 character(len = 10) :: timeinfo ! hhmmss.sss character(len = 2) :: hour, minute, second*6 call date_and_time(dateinfo, timeinfo) ! let’s break dateinfo into year, month and day. ! dateinfo has a form of ccyymmdd, where cc = century, yy = year ! mm = month and dd = day year = dateinfo(1:4) month = dateinfo(5:6) day = dateinfo(7:8) print*, 'Date String:', dateinfo print*, 'Year:', year print *,'Month:', month print *,'Day:', day ! let’s break timeinfo into hour, minute and second. ! timeinfo has a form of hhmmss.sss, where h = hour, m = minute ! and s = second hour = timeinfo(1:2) minute = timeinfo(3:4) second = timeinfo(5:10) print*, 'Time String:', timeinfo print*, 'Hour:', hour print*, 'Minute:', minute print*, 'Second:', second end program datetime
Когда вы компилируете и запускаете вышеуказанную программу, она дает подробную информацию о дате и времени —
Date String: 20140803 Year: 2014 Month: 08 Day: 03 Time String: 075835.466 Hour: 07 Minute: 58 Second: 35.466
Обрезка струн
Функция trim принимает строку и возвращает входную строку после удаления всех завершающих пробелов.
пример
program trimString implicit none character (len = *), parameter :: fname="Susanne", sname="Rizwan" character (len = 20) :: fullname fullname = fname//" "//sname !concatenating the strings print*,fullname,", the beautiful dancer from the east!" print*,trim(fullname),", the beautiful dancer from the east!" end program trimString
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
Susanne Rizwan , the beautiful dancer from the east! Susanne Rizwan, the beautiful dancer from the east!
Левая и правая настройка строк
Функция Adjustl берет строку и возвращает ее, удаляя начальные пробелы и добавляя их в качестве конечных пробелов.
Функция регулятор берет строку и возвращает ее, удаляя конечные пробелы и добавляя их в качестве ведущих пробелов.
пример
program hello implicit none character(len = 15) :: surname, firstname character(len = 6) :: title character(len = 40):: name character(len = 25):: greetings title = 'Mr. ' firstname = 'Rowan' surname = 'Atkinson' greetings = 'A big hello from Mr. Beans' name = adjustl(title)//adjustl(firstname)//adjustl(surname) print *, 'Here is', name print *, greetings name = adjustr(title)//adjustr(firstname)//adjustr(surname) print *, 'Here is', name print *, greetings name = trim(title)//trim(firstname)//trim(surname) print *, 'Here is', name print *, greetings end program hello
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
Here is Mr. Rowan Atkinson A big hello from Mr. Bean Here is Mr. Rowan Atkinson A big hello from Mr. Bean Here is Mr.RowanAtkinson A big hello from Mr. Bean
Поиск подстроки в строке
Функция index берет две строки и проверяет, является ли вторая строка подстрокой первой строки. Если второй аргумент является подстрокой первого аргумента, он возвращает целое число, которое является начальным индексом второй строки в первой строке, иначе он возвращает ноль.
пример
program hello implicit none character(len=30) :: myString character(len=10) :: testString myString = 'This is a test' testString = 'test' if(index(myString, testString) == 0)then print *, 'test is not found' else print *, 'test is found at index: ', index(myString, testString) end if end program hello
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
test is found at index: 11
Фортран — Массивы
Массивы могут хранить последовательную коллекцию элементов одного и того же типа. Массив используется для хранения коллекции данных, но часто более полезно думать о массиве как о коллекции переменных одного типа.
Все массивы состоят из смежных областей памяти. Самый низкий адрес соответствует первому элементу, а самый высокий адрес — последнему.
Числа (1) | Числа (2) | Числа (3) | Числа (4) | … |
Массивы могут быть одномерными (как векторы), двумерными (как матрицы) и Fortran позволяет создавать до 7-мерных массивов.
Объявление массивов
Массивы объявляются с атрибутом измерения .
Например, чтобы объявить одномерный массив с именем number из действительных чисел, содержащий 5 элементов, вы пишете:
real, dimension(5) :: numbers
На отдельные элементы массивов ссылаются путем указания их индексов. Первый элемент массива имеет нижний индекс один. Числа массива содержат пять действительных переменных — числа (1), числа (2), числа (3), числа (4) и числа (5).
Чтобы создать двумерный массив целых чисел 5 x 5 с именем matrix, вы пишете:
integer, dimension (5,5) :: matrix
Вы также можете объявить массив с некоторой явной нижней границей, например —
real, dimension(2:6) :: numbers integer, dimension (-3:2,0:4) :: matrix
Присвоение значений
Вы можете назначить значения отдельным членам, например,
numbers(1) = 2.0
или вы можете использовать цикл,
do i =1,5 numbers(i) = i * 2.0 end do
Одномерным элементам массива могут быть непосредственно присвоены значения с использованием сокращенного символа, называемого конструктором массива, например,
numbers = (/1.5, 3.2,4.5,0.9,7.2 /)
обратите внимание, что между скобками не должно быть пробелов ‘(‘ и обратной косой черты ‘/’
пример
Следующий пример демонстрирует концепции, обсужденные выше.
program arrayProg real :: numbers(5) !one dimensional integer array integer :: matrix(3,3), i , j !two dimensional real array !assigning some values to the array numbers do i=1,5 numbers(i) = i * 2.0 end do !display the values do i = 1, 5 Print *, numbers(i) end do !assigning some values to the array matrix do i=1,3 do j = 1, 3 matrix(i, j) = i+j end do end do !display the values do i=1,3 do j = 1, 3 Print *, matrix(i,j) end do end do !short hand assignment numbers = (/1.5, 3.2,4.5,0.9,7.2 /) !display the values do i = 1, 5 Print *, numbers(i) end do end program arrayProg
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
2.00000000 4.00000000 6.00000000 8.00000000 10.0000000 2 3 4 3 4 5 4 5 6 1.50000000 3.20000005 4.50000000 0.899999976 7.19999981
Некоторые термины, связанные с массивом
В следующей таблице приведены некоторые термины, связанные с массивом:
Срок | Имея в виду |
---|---|
Ранг | Это количество измерений в массиве. Например, для массива с именем matrix ранг равен 2, а для массива с именем numbers ранг равен 1. |
степень | Это количество элементов в измерении. Например, номера массивов имеют экстент 5, а массив с именем matrix имеет экстент 3 в обоих измерениях. |
форма | Форма массива представляет собой одномерный целочисленный массив, содержащий количество элементов (экстент) в каждом измерении. Например, для матрицы массива shape равен (3, 3), а для номеров массива — (5). |
Размер | Это количество элементов в массиве. Для матрицы массива это 9, а для номеров массива это 5. |
Передача массивов в процедуры
Вы можете передать массив процедуре в качестве аргумента. Следующий пример демонстрирует концепцию —
program arrayToProcedure implicit none integer, dimension (5) :: myArray integer :: i call fillArray (myArray) call printArray(myArray) end program arrayToProcedure subroutine fillArray (a) implicit none integer, dimension (5), intent (out) :: a ! local variables integer :: i do i = 1, 5 a(i) = i end do end subroutine fillArray subroutine printArray(a) integer, dimension (5) :: a integer::i do i = 1, 5 Print *, a(i) end do end subroutine printArray
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
1 2 3 4 5
В приведенном выше примере подпрограммы fillArray и printArray могут вызываться только для массивов с измерением 5. Однако для записи подпрограмм, которые можно использовать для массивов любого размера, вы можете переписать их, используя следующую технику:
program arrayToProcedure implicit none integer, dimension (10) :: myArray integer :: i interface subroutine fillArray (a) integer, dimension(:), intent (out) :: a integer :: i end subroutine fillArray subroutine printArray (a) integer, dimension(:) :: a integer :: i end subroutine printArray end interface call fillArray (myArray) call printArray(myArray) end program arrayToProcedure subroutine fillArray (a) implicit none integer,dimension (:), intent (out) :: a ! local variables integer :: i, arraySize arraySize = size(a) do i = 1, arraySize a(i) = i end do end subroutine fillArray subroutine printArray(a) implicit none integer,dimension (:) :: a integer::i, arraySize arraySize = size(a) do i = 1, arraySize Print *, a(i) end do end subroutine printArray
Обратите внимание, что программа использует функцию размера, чтобы получить размер массива.
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
1 2 3 4 5 6 7 8 9 10
Разделы массива
Пока мы ссылались на весь массив, Fortran предоставляет простой способ ссылаться на несколько элементов или часть массива, используя один оператор.
Чтобы получить доступ к разделу массива, вам необходимо указать нижнюю и верхнюю границу раздела, а также шаг (приращение) для всех измерений. Эта нотация называется индексом триплета:
array ([lower]:[upper][:stride], ...)
Когда не упоминаются нижняя и верхняя границы, по умолчанию используются объявленные вами экстенты, а для значения шага по умолчанию используется значение 1.
Следующий пример демонстрирует концепцию —
program arraySubsection real, dimension(10) :: a, b integer:: i, asize, bsize a(1:7) = 5.0 ! a(1) to a(7) assigned 5.0 a(8🙂 = 0.0 ! rest are 0.0 b(2:10:2) = 3.9 b(1:9:2) = 2.5 !display asize = size(a) bsize = size(b) do i = 1, asize Print *, a(i) end do do i = 1, bsize Print *, b(i) end do end program arraySubsection
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
5.00000000 5.00000000 5.00000000 5.00000000 5.00000000 5.00000000 5.00000000 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.50000000 3.90000010 2.50000000 3.90000010 2.50000000 3.90000010 2.50000000 3.90000010 2.50000000 3.90000010
Встроенные функции массива
Fortran 90/95 предоставляет несколько внутренних процедур. Их можно разделить на 7 категорий.
Векторное и матричное умножение
Фортран — динамические массивы
Динамический массив — это массив, размер которого неизвестен во время компиляции, но будет известен во время выполнения.
Динамические массивы объявляются с атрибутом.
Например,
real, dimension (:,:), allocatable :: darray
Ранг массива, т. Е. Размеры должны быть упомянуты, однако, чтобы выделить память для такого массива, вы используете функцию allocate .
allocate ( darray(s1,s2) )
После использования массива в программе созданная память должна быть освобождена с помощью функции deallocate.
deallocate (darray)
пример
Следующий пример демонстрирует концепции, обсужденные выше.
program dynamic_array implicit none !rank is 2, but size not known real, dimension (:,:), allocatable :: darray integer :: s1, s2 integer :: i, j print*, "Enter the size of the array:" read*, s1, s2 ! allocate memory allocate ( darray(s1,s2) ) do i = 1, s1 do j = 1, s2 darray(i,j) = i*j print*, "darray(",i,",",j,") = ", darray(i,j) end do end do deallocate (darray) end program dynamic_array
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Enter the size of the array: 3,4 darray( 1 , 1 ) = 1.00000000 darray( 1 , 2 ) = 2.00000000 darray( 1 , 3 ) = 3.00000000 darray( 1 , 4 ) = 4.00000000 darray( 2 , 1 ) = 2.00000000 darray( 2 , 2 ) = 4.00000000 darray( 2 , 3 ) = 6.00000000 darray( 2 , 4 ) = 8.00000000 darray( 3 , 1 ) = 3.00000000 darray( 3 , 2 ) = 6.00000000 darray( 3 , 3 ) = 9.00000000 darray( 3 , 4 ) = 12.0000000
Использование заявления данных
Оператор данных может использоваться для инициализации более одного массива или для инициализации секции массива.
Синтаксис заявления данных —
data variable / list / ...
пример
Следующий пример демонстрирует концепцию —
program dataStatement implicit none integer :: a(5), b(3,3), c(10),i, j data a /7,8,9,10,11/ data b(1,:) /1,1,1/ data b(2,:)/2,2,2/ data b(3,:)/3,3,3/ data (c(i),i = 1,10,2) /4,5,6,7,8/ data (c(i),i = 2,10,2)/5*2/ Print *, 'The A array:' do j = 1, 5 print*, a(j) end do Print *, 'The B array:' do i = lbound(b,1), ubound(b,1) write(*,*) (b(i,j), j = lbound(b,2), ubound(b,2)) end do Print *, 'The C array:' do j = 1, 10 print*, c(j) end do end program dataStatement
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
The A array: 7 8 9 10 11 The B array: 1 1 1 2 2 2 3 3 3 The C array: 4 2 5 2 6 2 7 2 8 2
Использование оператора Where
Оператор where позволяет использовать некоторые элементы массива в выражении в зависимости от результата какого-либо логического условия. Это позволяет выполнять выражение элемента, если данное условие истинно.
пример
Следующий пример демонстрирует концепцию —
program whereStatement implicit none integer :: a(3,5), i , j do i = 1,3 do j = 1, 5 a(i,j) = j-i end do end do Print *, 'The A array:' do i = lbound(a,1), ubound(a,1) write(*,*) (a(i,j), j = lbound(a,2), ubound(a,2)) end do where( a<0 ) a = 1 elsewhere a = 5 end where Print *, 'The A array:' do i = lbound(a,1), ubound(a,1) write(*,*) (a(i,j), j = lbound(a,2), ubound(a,2)) end do end program whereStatement
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
The A array: 0 1 2 3 4 -1 0 1 2 3 -2 -1 0 1 2 The A array: 5 5 5 5 5 1 5 5 5 5 1 1 5 5 5
Fortran — производные типы данных
Fortran позволяет вам определять производные типы данных. Производный тип данных также называется структурой и может состоять из объектов данных разных типов.
Производные типы данных используются для представления записи. Например, вы хотите отслеживать свои книги в библиотеке, вы можете отслеживать следующие атрибуты для каждой книги —
- заглавие
- автор
- Предмет
- ID книги
Определение производного типа данных
Чтобы определить производный тип данных, используются операторы типа и конечного типа . , Оператор type определяет новый тип данных с более чем одним членом для вашей программы. Формат оператора типа такой:
type type_name declarations end type
Вот как вы бы объявили структуру Книги —
type Books character(len = 50) :: title character(len = 50) :: author character(len = 150) :: subject integer :: book_id end type Books
Доступ к членам структуры
Объект производного типа данных называется структурой.
Структура типа Книги может быть создана в операторе объявления типа как —
type(Books) :: book1
Доступ к компонентам структуры можно получить с помощью символа селектора компонента (%) —
book1%title = "C Programming" book1%author = "Nuha Ali" book1%subject = "C Programming Tutorial" book1%book_id = 6495407
Обратите внимание, что до и после символа% нет пробелов.
пример
Следующая программа иллюстрирует вышеуказанные понятия —
program deriveDataType !type declaration type Books character(len = 50) :: title character(len = 50) :: author character(len = 150) :: subject integer :: book_id end type Books !declaring type variables type(Books) :: book1 type(Books) :: book2 !accessing the components of the structure book1%title = "C Programming" book1%author = "Nuha Ali" book1%subject = "C Programming Tutorial" book1%book_id = 6495407 book2%title = "Telecom Billing" book2%author = "Zara Ali" book2%subject = "Telecom Billing Tutorial" book2%book_id = 6495700 !display book info Print *, book1%title Print *, book1%author Print *, book1%subject Print *, book1%book_id Print *, book2%title Print *, book2%author Print *, book2%subject Print *, book2%book_id end program deriveDataType
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
C Programming Nuha Ali C Programming Tutorial 6495407 Telecom Billing Zara Ali Telecom Billing Tutorial 6495700
Массив структур
Вы также можете создавать массивы производного типа —
type(Books), dimension(2) :: list
Отдельные элементы массива могут быть доступны как —
list(1)%title = "C Programming" list(1)%author = "Nuha Ali" list(1)%subject = "C Programming Tutorial" list(1)%book_id = 6495407
Следующая программа иллюстрирует концепцию —
program deriveDataType !type declaration type Books character(len = 50) :: title character(len = 50) :: author character(len = 150) :: subject integer :: book_id end type Books !declaring array of books type(Books), dimension(2) :: list !accessing the components of the structure list(1)%title = "C Programming" list(1)%author = "Nuha Ali" list(1)%subject = "C Programming Tutorial" list(1)%book_id = 6495407 list(2)%title = "Telecom Billing" list(2)%author = "Zara Ali" list(2)%subject = "Telecom Billing Tutorial" list(2)%book_id = 6495700 !display book info Print *, list(1)%title Print *, list(1)%author Print *, list(1)%subject Print *, list(1)%book_id Print *, list(1)%title Print *, list(2)%author Print *, list(2)%subject Print *, list(2)%book_id end program deriveDataType
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
C Programming Nuha Ali C Programming Tutorial 6495407 C Programming Zara Ali Telecom Billing Tutorial 6495700
Фортран — Указатели
В большинстве языков программирования переменная-указатель хранит адрес памяти объекта. Однако в Fortran указатель — это объект данных, который имеет больше функциональных возможностей, чем просто сохранение адреса памяти. Он содержит больше информации о конкретном объекте, например, тип, ранг, экстенты и адрес памяти.
Указатель связан с целью путем выделения или назначения указателя.
Объявление переменной-указателя
Переменная указателя объявляется с атрибутом указателя.
В следующих примерах показано объявление переменных-указателей —
integer, pointer :: p1 ! pointer to integer real, pointer, dimension (:) :: pra ! pointer to 1-dim real array real, pointer, dimension (:,:) :: pra2 ! pointer to 2-dim real array
Указатель может указывать на —
-
Область динамически выделяемой памяти.
-
Объект данных того же типа, что и указатель, с целевым атрибутом.
Область динамически выделяемой памяти.
Объект данных того же типа, что и указатель, с целевым атрибутом.
Выделение пространства для указателя
Оператор allocate позволяет вам выделить место для объекта указателя. Например —
program pointerExample implicit none integer, pointer :: p1 allocate(p1) p1 = 1 Print *, p1 p1 = p1 + 4 Print *, p1 end program pointerExample
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
1 5
Вы должны очистить выделенное пространство памяти с помощью оператора deallocate, когда оно больше не требуется, и избегать накопления неиспользуемого и неиспользуемого пространства памяти.
Цели и Ассоциация
Цель — это еще одна нормальная переменная, для которой выделено пространство. Целевая переменная должна быть объявлена с целевым атрибутом.
Вы связываете переменную-указатель с целевой переменной, используя оператор связи (=>).
Давайте перепишем предыдущий пример, чтобы продемонстрировать концепцию —
program pointerExample implicit none integer, pointer :: p1 integer, target :: t1 p1=>t1 p1 = 1 Print *, p1 Print *, t1 p1 = p1 + 4 Print *, p1 Print *, t1 t1 = 8 Print *, p1 Print *, t1 end program pointerExample
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
1 1 5 5 8 8
Указатель может быть —
- Неопределенный
- ассоциированный
- диссоциированного
В приведенной выше программе мы связали указатель p1 с целью t1, используя оператор =>. Функция, связанная, проверяет статус ассоциации указателя.
Оператор nullify разъединяет указатель от цели.
Nullify не очищает цели, так как может быть несколько указателей, указывающих на одну и ту же цель. Однако очистка указателя также подразумевает обнуление.
Пример 1
Следующий пример демонстрирует понятия —
program pointerExample implicit none integer, pointer :: p1 integer, target :: t1 integer, target :: t2 p1=>t1 p1 = 1 Print *, p1 Print *, t1 p1 = p1 + 4 Print *, p1 Print *, t1 t1 = 8 Print *, p1 Print *, t1 nullify(p1) Print *, t1 p1=>t2 Print *, associated(p1) Print*, associated(p1, t1) Print*, associated(p1, t2) !what is the value of p1 at present Print *, p1 Print *, t2 p1 = 10 Print *, p1 Print *, t2 end program pointerExample
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
1 1 5 5 8 8 8 T F T 952754640 952754640 10 10
Обратите внимание, что каждый раз, когда вы запускаете код, адреса памяти будут отличаться.
Пример 2
program pointerExample implicit none integer, pointer :: a, b integer, target :: t integer :: n t = 1 a => t t = 2 b => t n = a + b Print *, a, b, t, n end program pointerExample
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
2 2 2 4
Фортран — Базовый ввод-вывод
До сих пор мы видели, что мы можем читать данные с клавиатуры, используя оператор read * , и отображать вывод на экран, используя оператор print * , соответственно. Эта форма ввода-вывода является вводом-выводом произвольного формата и называется направленным на ввод-вывод списком .
Свободный формат простого ввода / вывода имеет вид —
read(*,*) item1, item2, item3... print *, item1, item2, item3 write(*,*) item1, item2, item3...
Однако форматированный ввод / вывод дает вам больше гибкости по сравнению с передачей данных.
Форматированный ввод-вывод
Форматированный ввод-вывод имеет следующий синтаксис:
read fmt, variable_list print fmt, variable_list write fmt, variable_list
Куда,
-
fmt — спецификация формата
-
переменная-список представляет собой список переменных, которые будут считаны с клавиатуры или записаны на экране
fmt — спецификация формата
переменная-список представляет собой список переменных, которые будут считаны с клавиатуры или записаны на экране
Спецификация формата определяет способ отображения форматированных данных. Он состоит из строки, содержащей список дескрипторов редактирования в скобках.
Дескриптор редактирования указывает точный формат, например, ширину, цифры после десятичной точки и т. Д., В которых отображаются символы и цифры.
Например
Print "(f6.3)", pi
Следующая таблица описывает дескрипторы —
дескриптор | Описание | пример |
---|---|---|
я |
Это используется для целочисленного вывода. Это принимает форму «rIw.m», где значения r, w и m приведены в таблице ниже. Целочисленные значения правильно выровнены в своих полях. Если ширина поля не достаточно велика, чтобы вместить целое число, то поле заполняется звездочками. |
печать «(3i5)», i, j, k |
F |
Это используется для вывода действительного числа. Это принимает форму ‘rFw.d’, где значения r, w и d приведены в таблице ниже. Реальные ценности оправданы в своих областях. Если ширина поля недостаточно велика, чтобы вместить действительное число, то поле заполняется звездочками. |
печать «(f12.3)», пи |
Е |
Это используется для реального вывода в экспоненциальной записи. Оператор дескриптора ‘E’ принимает форму ‘rEw.d’, где значения r, w и d приведены в таблице ниже. Реальные ценности оправданы в своих областях. Если ширина поля недостаточно велика, чтобы вместить действительное число, то поле заполняется звездочками. Обратите внимание, что для распечатывания действительного числа с тремя десятичными знаками необходима ширина поля не менее десяти. Один для знака мантиссы, два для нуля, четыре для мантиссы и два для самого показателя. В общем, w ≥ d + 7. |
выведите «(e10.3)», 123456.0 дает «0.123e + 06» |
ES |
Это используется для реального результата (научная запись). Это принимает форму ‘rESw.d’, где значения r, w и d приведены в таблице ниже. Описанный выше «E» дескриптор несколько отличается от традиционного общеизвестного «научного обозначения». Научная нотация имеет мантиссу в диапазоне от 1,0 до 10,0 в отличие от дескриптора E, который имеет мантиссу в диапазоне от 0,1 до 1,0. Реальные ценности оправданы в своих областях. Если ширина поля недостаточно велика, чтобы вместить действительное число, то поле заполняется звездочками. Здесь также поле ширины должно удовлетворять выражению w ≥ d + 7 |
выведите «(es10.3)», 123456.0 дает «1.235e + 05» |
Это используется для вывода символов. Это принимает форму ‘rAw’, где значения r и w приведены в таблице ниже. Типы символов правильны в своих полях. Если ширина поля недостаточно велика, чтобы вместить строку символов, то поле заполняется первыми символами ‘w’ строки. |
печать «(а10)», ул | |
Икс |
Это используется для вывода пространства. Это принимает форму ‘nX’, где ‘n’ — количество желаемых пробелов. |
печать «(5х, а10)», ул |
/ |
Дескриптор косой черты — используется для вставки пустых строк. Это принимает форму ‘/’ и заставляет следующий вывод данных быть в новой строке. |
печать «(/, 5х, а10)», стр |
Это используется для целочисленного вывода. Это принимает форму «rIw.m», где значения r, w и m приведены в таблице ниже. Целочисленные значения правильно выровнены в своих полях. Если ширина поля не достаточно велика, чтобы вместить целое число, то поле заполняется звездочками.
Это используется для вывода действительного числа. Это принимает форму ‘rFw.d’, где значения r, w и d приведены в таблице ниже. Реальные ценности оправданы в своих областях. Если ширина поля недостаточно велика, чтобы вместить действительное число, то поле заполняется звездочками.
Это используется для реального вывода в экспоненциальной записи. Оператор дескриптора ‘E’ принимает форму ‘rEw.d’, где значения r, w и d приведены в таблице ниже. Реальные ценности оправданы в своих областях. Если ширина поля недостаточно велика, чтобы вместить действительное число, то поле заполняется звездочками.
Обратите внимание, что для распечатывания действительного числа с тремя десятичными знаками необходима ширина поля не менее десяти. Один для знака мантиссы, два для нуля, четыре для мантиссы и два для самого показателя. В общем, w ≥ d + 7.
Это используется для реального результата (научная запись). Это принимает форму ‘rESw.d’, где значения r, w и d приведены в таблице ниже. Описанный выше «E» дескриптор несколько отличается от традиционного общеизвестного «научного обозначения». Научная нотация имеет мантиссу в диапазоне от 1,0 до 10,0 в отличие от дескриптора E, который имеет мантиссу в диапазоне от 0,1 до 1,0. Реальные ценности оправданы в своих областях. Если ширина поля недостаточно велика, чтобы вместить действительное число, то поле заполняется звездочками. Здесь также поле ширины должно удовлетворять выражению w ≥ d + 7
Это используется для вывода символов. Это принимает форму ‘rAw’, где значения r и w приведены в таблице ниже. Типы символов правильны в своих полях. Если ширина поля недостаточно велика, чтобы вместить строку символов, то поле заполняется первыми символами ‘w’ строки.
Это используется для вывода пространства. Это принимает форму ‘nX’, где ‘n’ — количество желаемых пробелов.
Дескриптор косой черты — используется для вставки пустых строк. Это принимает форму ‘/’ и заставляет следующий вывод данных быть в новой строке.
Следующие символы используются с дескрипторами формата —
Sr.No | Символ и описание |
---|---|
1 |
с Номер колонки |
2 |
d Количество цифр справа от десятичного разряда для реального ввода или вывода |
3 |
м Минимальное количество отображаемых цифр |
4 |
N Количество пропущенных пробелов |
5 |
р Количество повторов — количество раз, чтобы использовать дескриптор или группу дескрипторов |
6 |
вес Ширина поля — количество символов, используемых для ввода или вывода |
с
Номер колонки
d
Количество цифр справа от десятичного разряда для реального ввода или вывода
м
Минимальное количество отображаемых цифр
N
Количество пропущенных пробелов
р
Количество повторов — количество раз, чтобы использовать дескриптор или группу дескрипторов
вес
Ширина поля — количество символов, используемых для ввода или вывода
Пример 1
program printPi pi = 3.141592653589793238 Print "(f6.3)", pi Print "(f10.7)", pi Print "(f20.15)", pi Print "(e16.4)", pi/100 end program printPi
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
3.142 3.1415927 3.141592741012573 0.3142E-01
Пример 2
program printName implicit none character (len = 15) :: first_name print *,' Enter your first name.' print *,' Up to 20 characters, please' read *,first_name print "(1x,a)",first_name end program printName
Когда приведенный выше код компилируется и выполняется, он дает следующий результат: (предположим, что пользователь вводит имя Zara)
Enter your first name. Up to 20 characters, please Zara
Пример 3
program formattedPrint implicit none real :: c = 1.2786456e-9, d = 0.1234567e3 integer :: n = 300789, k = 45, i = 2 character (len=15) :: str="Tutorials Point" print "(i6)", k print "(i6.3)", k print "(3i10)", n, k, i print "(i10,i3,i5)", n, k, i print "(a15)",str print "(f12.3)", d print "(e12.4)", c print '(/,3x,"n = ",i6, 3x, "d = ",f7.4)', n, d end program formattedPrint
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
45 045 300789 45 2 300789 45 2 Tutorials Point 123.457 0.1279E-08 n = 300789 d = *******
Заявление о формате
Оператор формата позволяет смешивать и сопоставлять символьные, целые и реальные выходные данные в одном операторе. Следующий пример демонстрирует это —
program productDetails implicit none character (len = 15) :: name integer :: id real :: weight name = 'Ardupilot' id = 1 weight = 0.08 print *,' The product details are' print 100 100 format (7x,'Name:', 7x, 'Id:', 1x, 'Weight:') print 200, name, id, weight 200 format(1x, a, 2x, i3, 2x, f5.2) end program productDetails
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
The product details are Name: Id: Weight: Ardupilot 1 0.08
Фортран — Файл ввода-вывода
Fortran позволяет вам читать данные и записывать данные в файлы.
В последней главе вы увидели, как читать данные и записывать данные в терминал. В этой главе вы изучите функции ввода и вывода файлов, предоставляемые Fortran.
Вы можете читать и писать в один или несколько файлов. Операторы OPEN, WRITE, READ и CLOSE позволяют вам достичь этого.
Открытие и закрытие файлов
Перед использованием файла вы должны открыть файл. Команда open используется для открытия файлов для чтения или записи. Самая простая форма команды —
open (unit = number, file = "name").
Тем не менее, открытое заявление может иметь общую форму —
open (list-of-specifiers)
В следующей таблице описаны наиболее часто используемые спецификаторы.
Sr.No | Спецификатор и описание |
---|---|
1 |
[UNIT =] U Номер устройства u может быть любым числом в диапазоне 9-99, и это указывает на файл, вы можете выбрать любое число, но каждый открытый файл в программе должен иметь уникальный номер |
2 |
IOSTAT = IOS Это идентификатор состояния ввода / вывода и должен быть целочисленной переменной. Если оператор open успешен, то возвращаемое значение ios равно нулю, иначе ненулевое значение. |
3 |
ERR = ошибка Это метка, к которой переходит элемент управления в случае любой ошибки. |
4 |
ФАЙЛ = имя Имя файла, строка символов. |
5 |
STATUS = STA Показывает предыдущий статус файла. Символьная строка и может иметь одно из трех значений NEW, OLD или SCRATCH. Скретч-файл создается и удаляется при закрытии или завершении программы. |
6 |
ДОСТУП = акк Это режим доступа к файлу. Может иметь одно из двух значений, SEQUENTIAL или DIRECT. По умолчанию установлено значение SEQUENTIAL. |
7 |
ФОРМА = ФРМ Это дает статус форматирования файла. Может иметь одно из двух значений: FORMATTED или UNFORMATTED. По умолчанию установлено значение UNFORMATTED |
8 |
RECL = RL Он определяет длину каждой записи в файле прямого доступа. |
[UNIT =] U
Номер устройства u может быть любым числом в диапазоне 9-99, и это указывает на файл, вы можете выбрать любое число, но каждый открытый файл в программе должен иметь уникальный номер
IOSTAT = IOS
Это идентификатор состояния ввода / вывода и должен быть целочисленной переменной. Если оператор open успешен, то возвращаемое значение ios равно нулю, иначе ненулевое значение.
ERR = ошибка
Это метка, к которой переходит элемент управления в случае любой ошибки.
ФАЙЛ = имя
Имя файла, строка символов.
STATUS = STA
Показывает предыдущий статус файла. Символьная строка и может иметь одно из трех значений NEW, OLD или SCRATCH. Скретч-файл создается и удаляется при закрытии или завершении программы.
ДОСТУП = акк
Это режим доступа к файлу. Может иметь одно из двух значений, SEQUENTIAL или DIRECT. По умолчанию установлено значение SEQUENTIAL.
ФОРМА = ФРМ
Это дает статус форматирования файла. Может иметь одно из двух значений: FORMATTED или UNFORMATTED. По умолчанию установлено значение UNFORMATTED
RECL = RL
Он определяет длину каждой записи в файле прямого доступа.
После того, как файл был открыт, к нему обращаются операторы чтения и записи. После этого он должен быть закрыт с помощью оператора закрытия .
Оператор close имеет следующий синтаксис:
close ([UNIT = ]u[,IOSTAT = ios,ERR = err,STATUS = sta])
Обратите внимание, что параметры в скобках не являются обязательными.
пример
Этот пример демонстрирует открытие нового файла для записи некоторых данных в файл.
program outputdata implicit none real, dimension(100) :: x, y real, dimension(100) :: p, q integer :: i ! data do i=1,100 x(i) = i * 0.1 y(i) = sin(x(i)) * (1-cos(x(i)/3.0)) end do ! output data into a file open(1, file = 'data1.dat', status = 'new') do i=1,100 write(1,*) x(i), y(i) end do close(1) end program outputdata
Когда приведенный выше код компилируется и выполняется, он создает файл data1.dat и записывает в него значения массива x и y. И затем закрывает файл.
Чтение и запись в файл
Операции чтения и записи соответственно используются для чтения и записи в файл соответственно.
У них есть следующий синтаксис —
read ([UNIT = ]u, [FMT = ]fmt, IOSTAT = ios, ERR = err, END = s) write([UNIT = ]u, [FMT = ]fmt, IOSTAT = ios, ERR = err, END = s)
Большинство спецификаторов уже обсуждались в приведенной выше таблице.
Спецификатор END = s — это метка оператора, куда программа переходит, когда она достигает конца файла.
пример
Этот пример демонстрирует чтение и запись в файл.
В этой программе мы читаем из файла, который мы создали в последнем примере, data1.dat, и отображаем его на экране.
program outputdata implicit none real, dimension(100) :: x, y real, dimension(100) :: p, q integer :: i ! data do i = 1,100 x(i) = i * 0.1 y(i) = sin(x(i)) * (1-cos(x(i)/3.0)) end do ! output data into a file open(1, file = 'data1.dat', status='new') do i = 1,100 write(1,*) x(i), y(i) end do close(1) ! opening the file for reading open (2, file = 'data1.dat', status = 'old') do i = 1,100 read(2,*) p(i), q(i) end do close(2) do i = 1,100 write(*,*) p(i), q(i) end do end program outputdata
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
0.100000001 5.54589933E-05 0.200000003 4.41325130E-04 0.300000012 1.47636665E-03 0.400000006 3.45637114E-03 0.500000000 6.64328877E-03 0.600000024 1.12552457E-02 0.699999988 1.74576249E-02 0.800000012 2.53552198E-02 0.900000036 3.49861123E-02 1.00000000 4.63171229E-02 1.10000002 5.92407547E-02 1.20000005 7.35742599E-02 1.30000007 8.90605897E-02 1.39999998 0.105371222 1.50000000 0.122110792 1.60000002 0.138823599 1.70000005 0.155002072 1.80000007 0.170096487 1.89999998 0.183526158 2.00000000 0.194692180 2.10000014 0.202990443 2.20000005 0.207826138 2.29999995 0.208628103 2.40000010 0.204863414 2.50000000 0.196052119 2.60000014 0.181780845 2.70000005 0.161716297 2.79999995 0.135617107 2.90000010 0.103344671 3.00000000 6.48725405E-02 3.10000014 2.02930309E-02 3.20000005 -3.01767997E-02 3.29999995 -8.61928314E-02 3.40000010 -0.147283033 3.50000000 -0.212848678 3.60000014 -0.282169819 3.70000005 -0.354410470 3.79999995 -0.428629100 3.90000010 -0.503789663 4.00000000 -0.578774154 4.09999990 -0.652400017 4.20000029 -0.723436713 4.30000019 -0.790623367 4.40000010 -0.852691114 4.50000000 -0.908382416 4.59999990 -0.956472993 4.70000029 -0.995793998 4.80000019 -1.02525222 4.90000010 -1.04385209 5.00000000 -1.05071592 5.09999990 -1.04510069 5.20000029 -1.02641726 5.30000019 -0.994243503 5.40000010 -0.948338211 5.50000000 -0.888650239 5.59999990 -0.815326691 5.70000029 -0.728716135 5.80000019 -0.629372001 5.90000010 -0.518047631 6.00000000 -0.395693362 6.09999990 -0.263447165 6.20000029 -0.122622721 6.30000019 2.53026206E-02 6.40000010 0.178709000 6.50000000 0.335851669 6.59999990 0.494883657 6.70000029 0.653881252 6.80000019 0.810866773 6.90000010 0.963840425 7.00000000 1.11080539 7.09999990 1.24979746 7.20000029 1.37891412 7.30000019 1.49633956 7.40000010 1.60037732 7.50000000 1.68947268 7.59999990 1.76223695 7.70000029 1.81747139 7.80000019 1.85418403 7.90000010 1.87160957 8.00000000 1.86922085 8.10000038 1.84674001 8.19999981 1.80414569 8.30000019 1.74167395 8.40000057 1.65982044 8.50000000 1.55933595 8.60000038 1.44121361 8.69999981 1.30668485 8.80000019 1.15719533 8.90000057 0.994394958 9.00000000 0.820112705 9.10000038 0.636327863 9.19999981 0.445154816 9.30000019 0.248800844 9.40000057 4.95488606E-02 9.50000000 -0.150278628 9.60000038 -0.348357052 9.69999981 -0.542378068 9.80000019 -0.730095863 9.90000057 -0.909344316 10.0000000 -1.07807255
Фортран — Процедуры
Процедура — это группа операторов, которые выполняют четко определенную задачу и могут быть вызваны из вашей программы. Информация (или данные) передаются вызывающей программе, процедуре в качестве аргументов.
Есть два типа процедур —
- функции
- подпрограммы
функция
Функция — это процедура, которая возвращает единственное количество. Функция не должна изменять свои аргументы.
Возвращаемое количество называется значением функции и обозначается именем функции.
Синтаксис
Синтаксис для функции выглядит следующим образом —
function name(arg1, arg2, ....) [declarations, including those for the arguments] [executable statements] end function [name]
В следующем примере демонстрируется функция с именем area_of_circle. Вычисляет площадь круга с радиусом r.
program calling_func real :: a a = area_of_circle(2.0) Print *, "The area of a circle with radius 2.0 is" Print *, a end program calling_func ! this function computes the area of a circle with radius r function area_of_circle (r) ! function result implicit none ! dummy arguments real :: area_of_circle ! local variables real :: r real :: pi pi = 4 * atan (1.0) area_of_circle = pi * r**2 end function area_of_circle
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
The area of a circle with radius 2.0 is 12.5663710
Пожалуйста, обратите внимание, что —
-
Вы должны указать неявное none как в основной программе, так и в процедуре.
-
Аргумент r в вызываемой функции называется фиктивным аргументом .
Вы должны указать неявное none как в основной программе, так и в процедуре.
Аргумент r в вызываемой функции называется фиктивным аргументом .
Вариант результата
Если вы хотите, чтобы возвращаемое значение было сохранено под каким-либо другим именем, а не именем функции, вы можете использовать параметр результата .
Вы можете указать имя возвращаемой переменной как —
function name(arg1, arg2, ....) result (return_var_name) [declarations, including those for the arguments] [executable statements] end function [name]
подпрограмма
Подпрограмма не возвращает значение, однако она может изменить свои аргументы.
Синтаксис
subroutine name(arg1, arg2, ....) [declarations, including those for the arguments] [executable statements] end subroutine [name]
Вызов подпрограммы
Вам необходимо вызвать подпрограмму, используя оператор вызова .
В следующем примере демонстрируется определение и использование подпрограммы подкачки, которая изменяет значения своих аргументов.
program calling_func implicit none real :: a, b a = 2.0 b = 3.0 Print *, "Before calling swap" Print *, "a = ", a Print *, "b = ", b call swap(a, b) Print *, "After calling swap" Print *, "a = ", a Print *, "b = ", b end program calling_func subroutine swap(x, y) implicit none real :: x, y, temp temp = x x = y y = temp end subroutine swap
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
Before calling swap a = 2.00000000 b = 3.00000000 After calling swap a = 3.00000000 b = 2.00000000
Указание намерений аргументов
Атрибут intent позволяет указать намерение, с которым аргументы используются в процедуре. В следующей таблице приведены значения атрибута intent —
Значение | Используется в качестве | объяснение |
---|---|---|
в | Намерение (в) | Используется как входные значения, не изменяется в функции |
из | Намерение (уходит) | Используется как выходное значение, они перезаписываются |
INOUT | Намерение (INOUT) | Аргументы используются и перезаписываются |
Следующий пример демонстрирует концепцию —
program calling_func implicit none real :: x, y, z, disc x = 1.0 y = 5.0 z = 2.0 call intent_example(x, y, z, disc) Print *, "The value of the discriminant is" Print *, disc end program calling_func subroutine intent_example (a, b, c, d) implicit none ! dummy arguments real, intent (in) :: a real, intent (in) :: b real, intent (in) :: c real, intent (out) :: d d = b * b - 4.0 * a * c end subroutine intent_example
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
The value of the discriminant is 17.0000000
Рекурсивные процедуры
Рекурсия происходит, когда языки программирования позволяют вызывать функцию внутри одной и той же функции. Это называется рекурсивным вызовом функции.
Когда процедура вызывает себя, прямо или косвенно, называется рекурсивной процедурой. Вы должны объявить этот тип процедур, предшествуя слову recursive перед его объявлением.
Когда функция используется рекурсивно, должна использоваться опция результата .
Ниже приведен пример, который вычисляет факториал для заданного числа с помощью рекурсивной процедуры:
program calling_func implicit none integer :: i, f i = 15 Print *, "The value of factorial 15 is" f = myfactorial(15) Print *, f end program calling_func ! computes the factorial of n (n!) recursive function myfactorial (n) result (fac) ! function result implicit none ! dummy arguments integer :: fac integer, intent (in) :: n select case (n) case (0:1) fac = 1 case default fac = n * myfactorial (n-1) end select end function myfactorial
Внутренние процедуры
Когда процедура содержится в программе, она называется внутренней процедурой программы. Синтаксис для содержания внутренней процедуры выглядит следующим образом:
program program_name implicit none ! type declaration statements ! executable statements . . . contains ! internal procedures . . . end program program_name
Следующий пример демонстрирует концепцию —
program mainprog implicit none real :: a, b a = 2.0 b = 3.0 Print *, "Before calling swap" Print *, "a = ", a Print *, "b = ", b call swap(a, b) Print *, "After calling swap" Print *, "a = ", a Print *, "b = ", b contains subroutine swap(x, y) real :: x, y, temp temp = x x = y y = temp end subroutine swap end program mainprog
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
Before calling swap a = 2.00000000 b = 3.00000000 After calling swap a = 3.00000000 b = 2.00000000
Фортран — Модули
Модуль подобен пакету, в котором вы можете хранить свои функции и подпрограммы, если вы пишете очень большую программу или ваши функции или подпрограммы могут использоваться более чем в одной программе.
Модули предоставляют вам способ разделения ваших программ между несколькими файлами.
Модули используются для —
-
Упаковка подпрограмм, блоков данных и интерфейса.
-
Определение глобальных данных, которые могут использоваться более чем одной подпрограммой.
-
Объявление переменных, которые можно сделать доступными в любых подпрограммах по вашему выбору.
-
Полностью импортировать модуль для использования в другую программу или подпрограмму.
Упаковка подпрограмм, блоков данных и интерфейса.
Определение глобальных данных, которые могут использоваться более чем одной подпрограммой.
Объявление переменных, которые можно сделать доступными в любых подпрограммах по вашему выбору.
Полностью импортировать модуль для использования в другую программу или подпрограмму.
Синтаксис модуля
Модуль состоит из двух частей —
- часть спецификации для декларации операторов
- a содержит часть для определения подпрограммы и функции
Общая форма модуля —
module name [statement declarations] [contains [subroutine and function definitions] ] end module [name]
Использование модуля в вашей программе
Вы можете включить модуль в программу или подпрограмму с помощью оператора use —
use name
Обратите внимание, что
-
Вы можете добавить столько модулей, сколько нужно, каждый будет в отдельных файлах и скомпилирован отдельно.
-
Модуль может использоваться в различных программах.
-
Модуль может использоваться много раз в одной и той же программе.
-
Переменные, объявленные в части спецификации модуля, являются глобальными для модуля.
-
Переменные, объявленные в модуле, становятся глобальными переменными в любой программе или подпрограмме, где используется модуль.
-
Оператор использования может появляться в основной программе или в любой другой подпрограмме или модуле, который использует процедуры или переменные, объявленные в определенном модуле.
Вы можете добавить столько модулей, сколько нужно, каждый будет в отдельных файлах и скомпилирован отдельно.
Модуль может использоваться в различных программах.
Модуль может использоваться много раз в одной и той же программе.
Переменные, объявленные в части спецификации модуля, являются глобальными для модуля.
Переменные, объявленные в модуле, становятся глобальными переменными в любой программе или подпрограмме, где используется модуль.
Оператор использования может появляться в основной программе или в любой другой подпрограмме или модуле, который использует процедуры или переменные, объявленные в определенном модуле.
пример
Следующий пример демонстрирует концепцию —
module constants implicit none real, parameter :: pi = 3.1415926536 real, parameter :: e = 2.7182818285 contains subroutine show_consts() print*, "Pi = ", pi print*, "e = ", e end subroutine show_consts end module constants program module_example use constants implicit none real :: x, ePowerx, area, radius x = 2.0 radius = 7.0 ePowerx = e ** x area = pi * radius**2 call show_consts() print*, "e raised to the power of 2.0 = ", ePowerx print*, "Area of a circle with radius 7.0 = ", area end program module_example
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
Pi = 3.14159274 e = 2.71828175 e raised to the power of 2.0 = 7.38905573 Area of a circle with radius 7.0 = 153.938049
Доступность переменных и подпрограмм в модуле
По умолчанию все переменные и подпрограммы в модуле делаются доступными для программы, использующей код модуля, с помощью оператора использования .
Однако вы можете контролировать доступность кода модуля, используя атрибуты private и public . Когда вы объявляете некоторую переменную или подпрограмму как приватную, она недоступна за пределами модуля.
пример
Следующий пример иллюстрирует концепцию —
В предыдущем примере у нас было две переменные модуля, e и pi. Давайте сделаем их приватными и посмотрим на результат —
module constants implicit none real, parameter,private :: pi = 3.1415926536 real, parameter, private :: e = 2.7182818285 contains subroutine show_consts() print*, "Pi = ", pi print*, "e = ", e end subroutine show_consts end module constants program module_example use constants implicit none real :: x, ePowerx, area, radius x = 2.0 radius = 7.0 ePowerx = e ** x area = pi * radius**2 call show_consts() print*, "e raised to the power of 2.0 = ", ePowerx print*, "Area of a circle with radius 7.0 = ", area end program module_example
Когда вы компилируете и запускаете вышеуказанную программу, она выдает следующее сообщение об ошибке —
ePowerx = e ** x 1 Error: Symbol 'e' at (1) has no IMPLICIT type main.f95:19.13: area = pi * radius**2 1 Error: Symbol 'pi' at (1) has no IMPLICIT type
Так как e и pi оба объявлены как private, программа module_example больше не может обращаться к этим переменным.
Однако другие подпрограммы модуля могут получить к ним доступ —
module constants implicit none real, parameter,private :: pi = 3.1415926536 real, parameter, private :: e = 2.7182818285 contains subroutine show_consts() print*, "Pi = ", pi print*, "e = ", e end subroutine show_consts function ePowerx(x)result(ePx) implicit none real::x real::ePx ePx = e ** x end function ePowerx function areaCircle(r)result(a) implicit none real::r real::a a = pi * r**2 end function areaCircle end module constants program module_example use constants implicit none call show_consts() Print*, "e raised to the power of 2.0 = ", ePowerx(2.0) print*, "Area of a circle with radius 7.0 = ", areaCircle(7.0) end program module_example
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
Pi = 3.14159274 e = 2.71828175 e raised to the power of 2.0 = 7.38905573 Area of a circle with radius 7.0 = 153.938049
Фортран — внутренние функции
Внутренние функции — это некоторые общие и важные функции, которые предоставляются как часть языка Фортран. Мы уже обсуждали некоторые из этих функций в главах «Массивы», «Символы» и «Строки».
Внутренние функции могут быть классифицированы как —
- Числовые функции
- Математические функции
- Числовые функции запроса
- Функции с плавающей запятой
- Функции управления битами
- Функции персонажа
- Добрые функции
- Логические функции
- Функции массива.
Мы обсудили функции массива в главе «Массивы». В следующем разделе мы даем краткое описание всех этих функций из других категорий.
В столбце имени функции
- A представляет любой тип числовой переменной
- R представляет собой вещественную или целочисленную переменную
- X и Y представляют собой реальные переменные
- Z представляет комплексную переменную
- W представляет действительную или комплексную переменную
Числовые функции
Sr.No | Описание функции |
---|---|
1 |
ABS (A) Возвращает абсолютное значение A |
2 |
AIMAG (Z) Возвращает мнимую часть комплексного числа Z |
3 |
AINT (A [, KIND]) Он усекает дробную часть A до нуля, возвращая действительное целое число. |
4 |
ANINT (A [, KIND]) Возвращает реальное значение, ближайшее целое или целое число. |
5 |
ПОТОЛОК (A [, KIND]) Возвращает наименьшее целое число, большее или равное числу А. |
6 |
CMPLX (X [, Y, KIND]) Он преобразует действительные переменные X и Y в комплексное число X + iY; если Y отсутствует, используется 0. |
7 |
CONJG (Z) Возвращает комплексное сопряжение любого комплексного числа Z. |
8 |
DBLE (A) Он преобразует A в вещественное число двойной точности. |
9 |
DIM (X, Y) Возвращает положительную разницу X и Y. |
10 |
DPROD (X, Y) Возвращает реальное произведение двойной точности X и Y. |
11 |
ЭТАЖ (A [, KIND]) Это обеспечивает наибольшее целое число, меньшее или равное числу А. |
12 |
INT (A [, KIND]) Он преобразует число (действительное или целое) в целое число, обрезая действительную часть до нуля. |
13 |
MAX (A1, A2 [, A3, …]) Возвращает максимальное значение из аргументов, все они одного типа. |
14 |
MIN (A1, A2 [, A3, …]) Возвращает минимальное значение из аргументов, все они одного типа. |
15 |
MOD (A, P) Возвращает остаток от A при делении на P, причем оба аргумента имеют одинаковый тип (A-INT (A / P) * P) |
16 |
МОДУЛЬ (A, P) Возвращает по модулю P: (A-FLOOR (A / P) * P) |
17 |
NINT (A [, KIND]) Возвращает ближайшее целое число числа A |
18 |
НАСТОЯЩИЙ (A [, KIND]) Преобразует в реальный тип |
19 |
ЗНАК (A, B) Возвращает абсолютное значение A, умноженное на знак P. В основном, оно передает знак B на A. |
ABS (A)
Возвращает абсолютное значение A
AIMAG (Z)
Возвращает мнимую часть комплексного числа Z
AINT (A [, KIND])
Он усекает дробную часть A до нуля, возвращая действительное целое число.
ANINT (A [, KIND])
Возвращает реальное значение, ближайшее целое или целое число.
ПОТОЛОК (A [, KIND])
Возвращает наименьшее целое число, большее или равное числу А.
CMPLX (X [, Y, KIND])
Он преобразует действительные переменные X и Y в комплексное число X + iY; если Y отсутствует, используется 0.
CONJG (Z)
Возвращает комплексное сопряжение любого комплексного числа Z.
DBLE (A)
Он преобразует A в вещественное число двойной точности.
DIM (X, Y)
Возвращает положительную разницу X и Y.
DPROD (X, Y)
Возвращает реальное произведение двойной точности X и Y.
ЭТАЖ (A [, KIND])
Это обеспечивает наибольшее целое число, меньшее или равное числу А.
INT (A [, KIND])
Он преобразует число (действительное или целое) в целое число, обрезая действительную часть до нуля.
MAX (A1, A2 [, A3, …])
Возвращает максимальное значение из аргументов, все они одного типа.
MIN (A1, A2 [, A3, …])
Возвращает минимальное значение из аргументов, все они одного типа.
MOD (A, P)
Возвращает остаток от A при делении на P, причем оба аргумента имеют одинаковый тип (A-INT (A / P) * P)
МОДУЛЬ (A, P)
Возвращает по модулю P: (A-FLOOR (A / P) * P)
NINT (A [, KIND])
Возвращает ближайшее целое число числа A
НАСТОЯЩИЙ (A [, KIND])
Преобразует в реальный тип
ЗНАК (A, B)
Возвращает абсолютное значение A, умноженное на знак P. В основном, оно передает знак B на A.
пример
program numericFunctions implicit none ! define constants ! define variables real :: a, b complex :: z ! values for a, b a = 15.2345 b = -20.7689 write(*,*) 'abs(a): ',abs(a),' abs(b): ',abs(b) write(*,*) 'aint(a): ',aint(a),' aint(b): ',aint(b) write(*,*) 'ceiling(a): ',ceiling(a),' ceiling(b): ',ceiling(b) write(*,*) 'floor(a): ',floor(a),' floor(b): ',floor(b) z = cmplx(a, b) write(*,*) 'z: ',z end program numericFunctions
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
abs(a): 15.2344999 abs(b): 20.7688999 aint(a): 15.0000000 aint(b): -20.0000000 ceiling(a): 16 ceiling(b): -20 floor(a): 15 floor(b): -21 z: (15.2344999, -20.7688999)
Математические функции
Sr.No | Описание функции |
---|---|
1 |
ACOS (X) Возвращает обратный косинус в диапазоне (0, π) в радианах. |
2 |
ASIN (X) Возвращает обратный синус в диапазоне (-π / 2, π / 2) в радианах. |
3 |
ATAN (X) Возвращает тангенс в диапазоне (-π / 2, π / 2) в радианах. |
4 |
ATAN2 (Y, X) Возвращает обратную касательную в диапазоне (-π, π) в радианах. |
5 |
COS (X) Возвращает косинус аргумента в радианах. |
6 |
КОШ (X) Возвращает гиперболический косинус аргумента в радианах. |
7 |
EXP (X) Возвращает экспоненциальное значение X. |
8 |
LOG (X) Возвращает натуральное логарифмическое значение X. |
9 |
LOG10 (X) Возвращает общее логарифмическое (базовое 10) значение X. |
10 |
ГРЕХ (X) Он возвращает синус аргумента в радианах. |
11 |
Синь (X) Возвращает гиперболический синус аргумента в радианах. |
12 |
SQRT (X) Возвращает квадратный корень из X. |
13 |
Тан (X) Возвращает тангенс аргумента в радианах. |
14 |
Тан (X) Возвращает гиперболический тангенс аргумента в радианах. |
ACOS (X)
Возвращает обратный косинус в диапазоне (0, π) в радианах.
ASIN (X)
Возвращает обратный синус в диапазоне (-π / 2, π / 2) в радианах.
ATAN (X)
Возвращает тангенс в диапазоне (-π / 2, π / 2) в радианах.
ATAN2 (Y, X)
Возвращает обратную касательную в диапазоне (-π, π) в радианах.
COS (X)
Возвращает косинус аргумента в радианах.
КОШ (X)
Возвращает гиперболический косинус аргумента в радианах.
EXP (X)
Возвращает экспоненциальное значение X.
LOG (X)
Возвращает натуральное логарифмическое значение X.
LOG10 (X)
Возвращает общее логарифмическое (базовое 10) значение X.
ГРЕХ (X)
Он возвращает синус аргумента в радианах.
Синь (X)
Возвращает гиперболический синус аргумента в радианах.
SQRT (X)
Возвращает квадратный корень из X.
Тан (X)
Возвращает тангенс аргумента в радианах.
Тан (X)
Возвращает гиперболический тангенс аргумента в радианах.
пример
Следующая программа вычисляет горизонтальное и вертикальное положение x и y снаряда через некоторое время, t —
Где x = ut cos a и y = ut sin a — g t2 / 2
program projectileMotion implicit none ! define constants real, parameter :: g = 9.8 real, parameter :: pi = 3.1415927 !define variables real :: a, t, u, x, y !values for a, t, and u a = 45.0 t = 20.0 u = 10.0 ! convert angle to radians a = a * pi / 180.0 x = u * cos(a) * t y = u * sin(a) * t - 0.5 * g * t * t write(*,*) 'x: ',x,' y: ',y end program projectileMotion
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
x: 141.421356 y: -1818.57861
Числовые функции запроса
Эти функции работают с определенной моделью целочисленной и арифметики с плавающей точкой. Функции возвращают свойства чисел того же вида, что и переменная X, которые могут быть действительными и в некоторых случаях целыми.
Sr.No | Описание функции |
---|---|
1 |
ЦИФРЫ (X) Возвращает количество значащих цифр модели. |
2 |
ЭПСИЛОН (X) Возвращает число, которое практически ничтожно по сравнению с одним. Другими словами, он возвращает наименьшее значение, так что REAL (1.0, KIND (X)) + EPSILON (X) не равен REAL (1.0, KIND (X)). |
3 |
ОГРОМНЫЙ (X) Возвращает наибольшее количество модели |
4 |
МАКСЭКСПОНЕНТ (X) Возвращает максимальный показатель модели |
5 |
MINEXPONENT (X) Возвращает минимальный показатель модели |
6 |
ТОЧНОСТЬ (X) Возвращает десятичную точность |
7 |
RADIX (X) Возвращает базу модели |
8 |
ДИАПАЗОН (X) Возвращает десятичный диапазон экспонент |
9 |
Крошечный (X) Возвращает наименьшее положительное число модели |
ЦИФРЫ (X)
Возвращает количество значащих цифр модели.
ЭПСИЛОН (X)
Возвращает число, которое практически ничтожно по сравнению с одним. Другими словами, он возвращает наименьшее значение, так что REAL (1.0, KIND (X)) + EPSILON (X) не равен REAL (1.0, KIND (X)).
ОГРОМНЫЙ (X)
Возвращает наибольшее количество модели
МАКСЭКСПОНЕНТ (X)
Возвращает максимальный показатель модели
MINEXPONENT (X)
Возвращает минимальный показатель модели
ТОЧНОСТЬ (X)
Возвращает десятичную точность
RADIX (X)
Возвращает базу модели
ДИАПАЗОН (X)
Возвращает десятичный диапазон экспонент
Крошечный (X)
Возвращает наименьшее положительное число модели
Функции с плавающей запятой
Sr.No | Описание функции |
---|---|
1 |
Экспонент (X) Возвращает экспонентную часть номера модели |
2 |
ФРАКЦИЯ (X) Возвращает дробную часть числа |
3 |
БЛИЖАЙШИЙ (X, S) Возвращает ближайший другой номер процессора в заданном направлении |
4 |
RRSPACING (X) Возвращает обратную величину относительного расстояния между номерами моделей вблизи заданного числа. |
5 |
МАСШТАБ (X, I) Он умножает действительное на его основание до целочисленной степени |
6 |
SET_EXPONENT (X, I) возвращает экспонентную часть числа |
7 |
ПРОСТРАНСТВО (X) Возвращает абсолютный интервал номеров моделей рядом с данным номером. |
Экспонент (X)
Возвращает экспонентную часть номера модели
ФРАКЦИЯ (X)
Возвращает дробную часть числа
БЛИЖАЙШИЙ (X, S)
Возвращает ближайший другой номер процессора в заданном направлении
RRSPACING (X)
Возвращает обратную величину относительного расстояния между номерами моделей вблизи заданного числа.
МАСШТАБ (X, I)
Он умножает действительное на его основание до целочисленной степени
SET_EXPONENT (X, I)
возвращает экспонентную часть числа
ПРОСТРАНСТВО (X)
Возвращает абсолютный интервал номеров моделей рядом с данным номером.
Функции управления битами
Sr.No | Описание функции |
---|---|
1 |
BIT_SIZE (I) Возвращает количество бит модели |
2 |
BTEST (I, POS) Битовое тестирование |
3 |
IAND (I, J) Логическое И |
4 |
IBCLR (I, POS) Очистить бит |
5 |
IBITS (I, POS, LEN) Извлечение бит |
6 |
IBSET (I, POS) Установить бит |
7 |
IEOR (I, J) Эксклюзивный или |
8 |
IOR (I, J) Включая ИЛИ |
9 |
ИШФТ (Я, СДВИГ) Логический сдвиг |
10 |
ISHFTC (I, SHIFT [, РАЗМЕР]) Круговой сдвиг |
11 |
НЕ (я) Логическое дополнение |
BIT_SIZE (I)
Возвращает количество бит модели
BTEST (I, POS)
Битовое тестирование
IAND (I, J)
Логическое И
IBCLR (I, POS)
Очистить бит
IBITS (I, POS, LEN)
Извлечение бит
IBSET (I, POS)
Установить бит
IEOR (I, J)
Эксклюзивный или
IOR (I, J)
Включая ИЛИ
ИШФТ (Я, СДВИГ)
Логический сдвиг
ISHFTC (I, SHIFT [, РАЗМЕР])
Круговой сдвиг
НЕ (я)
Логическое дополнение
Функции персонажа
Sr.No | Описание функции |
---|---|
1 |
АХАР (I) Возвращает I-й символ в последовательности сортировки ASCII. |
2 |
ADJUSTL (STRING) Он корректирует строку слева, удаляя все ведущие пробелы и вставляя конечные пробелы |
3 |
ADJUSTR (STRING) Он корректирует строку, удаляя задние пробелы и вставляя ведущие пробелы. |
4 |
ЧАР (Я [, ВИД]] Возвращает I-й символ в определенной последовательности сортировки машины |
5 |
ЯЧАР (С) Возвращает позицию символа в последовательности сортировки ASCII. |
6 |
ИЧАР (С) Возвращает положение символа в определенной последовательности сортировки машины (процессора). |
7 |
INDEX (STRING, SUBSTRING [, BACK]) Он возвращает крайнюю левую (самую правую, если BACK -. TRUE.) Начальную позицию SUBSTRING в пределах STRING. |
8 |
ЛЕН (STRING) Возвращает длину строки. |
9 |
LEN_TRIM (STRING) Возвращает длину строки без конечных пустых символов. |
10 |
LGE (STRING_A, STRING_B) Лексически больше или равно |
11 |
LGT (STRING_A, STRING_B) Лексически больше чем |
12 |
LLE (STRING_A, STRING_B) Лексически меньше или равно |
13 |
LLT (STRING_A, STRING_B) Лексически меньше чем |
14 |
REPEAT (STRING, NCOPIES) Повторная конкатенация |
15 |
SCAN (STRING, SET [, BACK]) Он возвращает индекс самого левого (самого правого, если BACK равен .TRUE.) Символа STRING, принадлежащего SET, или 0, если ни один из них не принадлежит. |
16 |
TRIM (STRING) Удаляет завершающие пробелы |
17 |
VERIFY (STRING, SET [, BACK]) Проверяет набор символов в строке |
АХАР (I)
Возвращает I-й символ в последовательности сортировки ASCII.
ADJUSTL (STRING)
Он корректирует строку слева, удаляя все ведущие пробелы и вставляя конечные пробелы
ADJUSTR (STRING)
Он корректирует строку, удаляя задние пробелы и вставляя ведущие пробелы.
ЧАР (Я [, ВИД]]
Возвращает I-й символ в определенной последовательности сортировки машины
ЯЧАР (С)
Возвращает позицию символа в последовательности сортировки ASCII.
ИЧАР (С)
Возвращает положение символа в определенной последовательности сортировки машины (процессора).
INDEX (STRING, SUBSTRING [, BACK])
Он возвращает крайнюю левую (самую правую, если BACK -. TRUE.) Начальную позицию SUBSTRING в пределах STRING.
ЛЕН (STRING)
Возвращает длину строки.
LEN_TRIM (STRING)
Возвращает длину строки без конечных пустых символов.
LGE (STRING_A, STRING_B)
Лексически больше или равно
LGT (STRING_A, STRING_B)
Лексически больше чем
LLE (STRING_A, STRING_B)
Лексически меньше или равно
LLT (STRING_A, STRING_B)
Лексически меньше чем
REPEAT (STRING, NCOPIES)
Повторная конкатенация
SCAN (STRING, SET [, BACK])
Он возвращает индекс самого левого (самого правого, если BACK равен .TRUE.) Символа STRING, принадлежащего SET, или 0, если ни один из них не принадлежит.
TRIM (STRING)
Удаляет завершающие пробелы
VERIFY (STRING, SET [, BACK])
Проверяет набор символов в строке
Добрые функции
Sr.No | Описание функции |
---|---|
1 |
ВИД (X) Возвращает значение параметра типа type. |
2 |
SELECTED_INT_KIND (R) Возвращает тип параметра типа для указанного диапазона показателей. |
3 |
SELECTED_REAL_KIND ([P, R]) Реальное значение параметра типа типа с учетом точности и диапазона |
ВИД (X)
Возвращает значение параметра типа type.
SELECTED_INT_KIND (R)
Возвращает тип параметра типа для указанного диапазона показателей.
SELECTED_REAL_KIND ([P, R])
Реальное значение параметра типа типа с учетом точности и диапазона
Логическая функция
Sr.No | Описание функции |
---|---|
1 |
ЛОГИЧЕСКИЙ (L [, KIND]) Преобразование между объектами логического типа с различными типами параметров |
ЛОГИЧЕСКИЙ (L [, KIND])
Преобразование между объектами логического типа с различными типами параметров
Фортран — числовая точность
Мы уже обсуждали, что в старых версиях Fortran существовало два реальных типа: реальный тип по умолчанию и тип с двойной точностью .
Тем не менее, Fortran 90/95 обеспечивает больший контроль над точностью реальных и целочисленных типов данных через спецификацию вида .
Добрый атрибут
Различные виды чисел хранятся по-разному в компьютере. Атрибут kind позволяет указать, как число хранится внутри. Например,
real, kind = 2 :: a, b, c real, kind = 4 :: e, f, g integer, kind = 2 :: i, j, k integer, kind = 3 :: l, m, n
В приведенном выше объявлении действительные переменные e, f и g имеют большую точность, чем действительные переменные a, b и c. Целочисленные переменные l, m и n могут хранить большие значения и иметь больше цифр для хранения, чем целочисленные переменные i, j и k. Хотя это зависит от машины.
пример
program kindSpecifier implicit none real(kind = 4) :: a, b, c real(kind = 8) :: e, f, g integer(kind = 2) :: i, j, k integer(kind = 4) :: l, m, n integer :: kind_a, kind_i, kind_e, kind_l kind_a = kind(a) kind_i = kind(i) kind_e = kind(e) kind_l = kind(l) print *,'default kind for real is', kind_a print *,'default kind for int is', kind_i print *,'extended kind for real is', kind_e print *,'default kind for int is', kind_l end program kindSpecifier
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
default kind for real is 4 default kind for int is 2 extended kind for real is 8 default kind for int is 4
Запрос размера переменных
Существует ряд встроенных функций, которые позволяют запрашивать размер чисел.
Например, встроенная функция bit_size (i) определяет количество битов, используемых для хранения. Для действительных чисел встроенная функция precision (x) возвращает число десятичных цифр точности, а встроенная функция range (x) возвращает десятичный диапазон показателя степени.
пример
program getSize implicit none real (kind = 4) :: a real (kind = 8) :: b integer (kind = 2) :: i integer (kind = 4) :: j print *,'precision of real(4) =', precision(a) print *,'precision of real(8) =', precision(b) print *,'range of real(4) =', range(a) print *,'range of real(8) =', range(b) print *,'maximum exponent of real(4) =' , maxexponent(a) print *,'maximum exponent of real(8) =' , maxexponent(b) print *,'minimum exponent of real(4) =' , minexponent(a) print *,'minimum exponent of real(8) =' , minexponent(b) print *,'bits in integer(2) =' , bit_size(i) print *,'bits in integer(4) =' , bit_size(j) end program getSize
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
precision of real(4) = 6 precision of real(8) = 15 range of real(4) = 37 range of real(8) = 307 maximum exponent of real(4) = 128 maximum exponent of real(8) = 1024 minimum exponent of real(4) = -125 minimum exponent of real(8) = -1021 bits in integer(2) = 16 bits in integer(4) = 32
Получение Доброй Ценности
Fortran предоставляет еще две встроенные функции для получения значения типа для требуемой точности целых и вещественных чисел —
- selected_int_kind (r)
- selected_real_kind ([p, r])
Функция selected_real_kind возвращает целое число, которое является значением параметра типа вида, необходимым для заданной десятичной точности p и диапазона десятичных экспонент r. Точность десятичной дроби — это число значащих цифр, а диапазон десятичной экспоненты указывает наименьшее и наибольшее представимое число. Таким образом, диапазон составляет от 10-r до 10 + r.
Например, selected_real_kind (p = 10, r = 99) возвращает значение типа, необходимое для точности до 10 десятичных разрядов, и диапазон от 10-99 до 10 + 99.
пример
program getKind implicit none integer:: i i = selected_real_kind (p = 10, r = 99) print *,'selected_real_kind (p = 10, r = 99)', i end program getKind
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
selected_real_kind (p = 10, r = 99) 8
Фортран — Программные библиотеки
Существуют различные инструменты и библиотеки Fortran. Некоторые из них бесплатные, а некоторые платные.
Ниже приведены некоторые бесплатные библиотеки —
- RANDLIB, генераторы случайных чисел и статистических распределений
- BLAS
- EISPACK
- Руководство GAMS – NIST по доступному математическому программному обеспечению
- Некоторые статистические и другие процедуры из NIST
- LAPACK
- LINPACK
- MINPACK
- косметическая маска
- Математическая библиотека НКАР
- Коллекция математических программ, документов и баз данных Netlib.
- ODEPACK
- ODERPACK, набор процедур для ранжирования и упорядочения.
- Экспокит для вычисления матричных экспонент
- SLATEC
- SPECFUN
- StarPac
- StatLib статистическая библиотека
- TOMS
- Сортировка и объединение строк
Следующие библиотеки не являются бесплатными —
- Числовая библиотека NAG Fortran
- Библиотека Visual Numerics IMSL
- Численные Рецепты
Фортран — Стиль программирования
Стиль программирования заключается в соблюдении некоторых правил при разработке программ. Эти хорошие практики придают вашей программе такие ценности, как читабельность и однозначность.
Хорошая программа должна иметь следующие характеристики —
- читабельность
- Правильная логическая структура
- Не требующие пояснений заметки и комментарии
Например, если вы сделаете комментарий, подобный следующему, это не очень поможет.
! loop from 1 to 10 do i = 1,10
Однако, если вы вычисляете биномиальный коэффициент и вам нужен этот цикл для nCr, вам пригодится такой комментарий:
! loop to calculate nCr do i = 1,10
-
Блоки кода с отступом, чтобы сделать различные уровни кода понятными.
-
Коды самопроверки, чтобы гарантировать, что не будет никаких цифровых ошибок, таких как деление на ноль, квадратный корень из отрицательного действительного числа или логарифм отрицательного действительного числа.
-
Включая коды, которые гарантируют, что переменные не принимают недопустимые значения или значения за пределами диапазона, т. Е. Проверка ввода.
-
Не ставить проверки там, где это было бы ненужным и замедляет выполнение. Например —
Блоки кода с отступом, чтобы сделать различные уровни кода понятными.
Коды самопроверки, чтобы гарантировать, что не будет никаких цифровых ошибок, таких как деление на ноль, квадратный корень из отрицательного действительного числа или логарифм отрицательного действительного числа.
Включая коды, которые гарантируют, что переменные не принимают недопустимые значения или значения за пределами диапазона, т. Е. Проверка ввода.
Не ставить проверки там, где это было бы ненужным и замедляет выполнение. Например —
real :: x x = sin(y) + 1.0 if (x >= 0.0) then z = sqrt(x) end if
- Четко написанный код с использованием соответствующих алгоритмов.
- Разделение длинных выражений с помощью маркера продолжения ‘&’.
- Создание значимых имен переменных.
Фортран — Программа отладки
Инструмент отладчика используется для поиска ошибок в программах.
Программа отладчика проходит по коду и позволяет вам проверять значения переменных и других объектов данных во время выполнения программы.
Он загружает исходный код, и вы должны запустить программу в отладчике. Отладчики отлаживают программу с помощью —
- Установка точек останова,
- Пошагово просматривая исходный код,
- Установка часовых точек.
Точки останова указывают, где программа должна остановиться, особенно после критической строки кода. Выполнение программы после проверки переменных в точке останова.
Программы отладчика также проверяют исходный код построчно.
Точки наблюдения — это точки, где необходимо проверить значения некоторых переменных, особенно после операции чтения или записи.
Отладчик GDB
Отладчик gdb, отладчик GNU поставляется с операционной системой Linux. Для системы X Windows, GDB поставляется с графическим интерфейсом, и программа называется xxgdb.
В следующей таблице приведены некоторые команды в GDB —
команда | Цель |
---|---|
перерыв | Установка точки останова |
бежать | Начинает выполнение |
продолжение | Продолжает исполнение |
следующий | Выполняет только следующую строку исходного кода, не вмешиваясь ни в какой вызов функции |
шаг | Выполните следующую строку исходного кода, войдя в функцию в случае вызова функции. |
Отладчик dbx
Существует еще один отладчик dbx для Linux.
В следующей таблице приведены некоторые команды в dbx —