Фортран – Обзор
Фортран, как это происходит от 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
Простая программа на фортране
Давайте напишем программу, которая добавляет два числа и печатает результат –
Live Demo
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 предоставляет пять внутренних типов данных, однако вы также можете получить свои собственные типы данных. Пять внутренних типов –
- Целочисленный тип
- Реальный тип
- Сложный тип
- Логический тип
- Тип персонажа
Целочисленный тип
Целочисленные типы могут содержать только целочисленные значения. В следующем примере извлекается наибольшее значение, которое может содержаться в обычном четырехбайтовом целом числе:
Live Demo
program testingInt implicit none integer :: largeval print *, huge(largeval) end program testingInt
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат –
2147483647
Обратите внимание, что функция large () выдает наибольшее число, которое может содержаться конкретным целочисленным типом данных. Вы также можете указать количество байтов, используя спецификатор вида . Следующий пример демонстрирует это –
Live Demo
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 обеспечивает больший контроль над точностью реальных и целочисленных типов данных с помощью спецификатора вида , который мы изучим в главе о числах.
В следующем примере показано использование реального типа данных –
Live Demo
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
пример
В следующем примере демонстрируется объявление, назначение и отображение переменной на экране –
Live Demo
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
пример
Следующая программа рассчитывает смещение из-за вертикального движения под действием силы тяжести.
Live Demo
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.
Если выполняется цикл, программа продолжается в начале следующей итерации.
Если вы хотите, чтобы выполнение вашей программы остановилось, вы можете вставить оператор остановки
Фортран – Номера
Числа в Фортране представлены тремя внутренними типами данных –
- Целочисленный тип
- Реальный тип
- Сложный тип
Целочисленный тип
Целочисленные типы могут содержать только целочисленные значения. В следующем примере извлекается наибольшее значение, которое может храниться в обычном четырехбайтовом целом числе:
Live Demo
program testingInt implicit none integer :: largeval print *, huge(largeval) end program testingInt
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат –
2147483647
Обратите внимание, что функция large () дает наибольшее число, которое может содержаться конкретным целочисленным типом данных. Вы также можете указать количество байтов, используя спецификатор вида . Следующий пример демонстрирует это –
Live Demo
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 обеспечивает больший контроль над точностью реальных и целочисленных типов данных с помощью спецификатора вида , который мы вскоре рассмотрим.
В следующем примере показано использование реального типа данных –
Live Demo
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 () создает комплексное число. Это приводит к тому, что действительная и мнимая части имеют одинаковую точность, независимо от типа входных аргументов.
Live Demo
program createComplex implicit none integer :: i = 10 real :: x = 5.17 print *, cmplx(i, x) end program createComplex
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат –
(10.0000000, 5.17000008)
Следующая программа демонстрирует арифметику комплексных чисел –
Live Demo
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 |
Следующие примеры демонстрируют это –
Live Demo
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)
Теперь давайте использовать меньшее число –
Live Demo
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
Теперь давайте посмотрим, как опустится
Live Demo
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 () позволяет вам запрашивать детали представления данных оборудования перед запуском программы.
Live Demo
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
Вы также можете проверить вид всех типов данных –
Live Demo
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’
В следующем примере демонстрируется объявление и использование символьного типа данных –
Live Demo
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
Конкатенация персонажей
Оператор конкатенации //, объединяет символы.
Следующий пример демонстрирует это –
Live Demo
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
В этом примере показано использование функции индекса –
Live Demo
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
Этот пример демонстрирует использование функции обрезки –
Live Demo
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
Этот пример демонстрирует использование функции ачар –
Live Demo
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
Следующая функция демонстрирует использование –
Live Demo
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”
В следующем примере демонстрируется объявление и использование символьного типа данных –
Live Demo
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
Конкатенация строк
Оператор конкатенации //, объединяет строки.
Следующий пример демонстрирует это –
Live Demo
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» –
Live Demo
program subString character(len = 11)::hello hello = "Hello World" print*, hello(7:11) end program subString
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат –
World
пример
В следующем примере функция date_and_time используется для указания строки даты и времени. Мы используем спецификаторы экстентов для извлечения года, даты, месяца, часа, минут и второй информации отдельно.
Live Demo
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 принимает строку и возвращает входную строку после удаления всех завершающих пробелов.
пример
Live Demo
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 берет строку и возвращает ее, удаляя начальные пробелы и добавляя их в качестве конечных пробелов.
Функция регулятор берет строку и возвращает ее, удаляя конечные пробелы и добавляя их в качестве ведущих пробелов.
пример
Live Demo
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 берет две строки и проверяет, является ли вторая строка подстрокой первой строки. Если второй аргумент является подстрокой первого аргумента, он возвращает целое число, которое является начальным индексом второй строки в первой строке, иначе он возвращает ноль.
пример
Live Demo
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 /)
обратите внимание, что между скобками не должно быть пробелов ‘(‘ и обратной косой черты ‘/’
пример
Следующий пример демонстрирует концепции, обсужденные выше.
Live Demo
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. |
Передача массивов в процедуры
Вы можете передать массив процедуре в качестве аргумента. Следующий пример демонстрирует концепцию –
Live Demo
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. Однако для записи подпрограмм, которые можно использовать для массивов любого размера, вы можете переписать их, используя следующую технику:
Live Demo
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.
Следующий пример демонстрирует концепцию –
Live Demo
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 / ...
пример
Следующий пример демонстрирует концепцию –
Live Demo
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 позволяет использовать некоторые элементы массива в выражении в зависимости от результата какого-либо логического условия. Это позволяет выполнять выражение элемента, если данное условие истинно.
пример
Следующий пример демонстрирует концепцию –
Live Demo
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
Обратите внимание, что до и после символа% нет пробелов.
пример
Следующая программа иллюстрирует вышеуказанные понятия –
Live Demo
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
Следующая программа иллюстрирует концепцию –
Live Demo
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 позволяет вам выделить место для объекта указателя. Например –
Live Demo
program pointerExample implicit none integer, pointer :: p1 allocate(p1) p1 = 1 Print *, p1 p1 = p1 + 4 Print *, p1 end program pointerExample
Когда приведенный выше код компилируется и выполняется, он дает следующий результат –
1 5
Вы должны очистить выделенное пространство памяти с помощью оператора deallocate, когда оно больше не требуется, и избегать накопления неиспользуемого и неиспользуемого пространства памяти.
Цели и Ассоциация
Цель – это еще одна нормальная переменная, для которой выделено пространство. Целевая переменная должна быть объявлена с целевым атрибутом.
Вы связываете переменную-указатель с целевой переменной, используя оператор связи (=>).
Давайте перепишем предыдущий пример, чтобы продемонстрировать концепцию –
Live Demo
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
Следующий пример демонстрирует понятия –
Live Demo
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
Live Demo
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
Live Demo
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
Live Demo
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 = *******
Заявление о формате
Оператор формата позволяет смешивать и сопоставлять символьные, целые и реальные выходные данные в одном операторе. Следующий пример демонстрирует это –
Live Demo
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, и отображаем его на экране.
Live Demo
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.
Live Demo
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]
Вызов подпрограммы
Вам необходимо вызвать подпрограмму, используя оператор вызова .
В следующем примере демонстрируется определение и использование подпрограммы подкачки, которая изменяет значения своих аргументов.
Live Demo
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) | Аргументы используются и перезаписываются |
Следующий пример демонстрирует концепцию –
Live Demo
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
Следующий пример демонстрирует концепцию –
Live Demo
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
Обратите внимание, что
-
Вы можете добавить столько модулей, сколько нужно, каждый будет в отдельных файлах и скомпилирован отдельно.
-
Модуль может использоваться в различных программах.
-
Модуль может использоваться много раз в одной и той же программе.
-
Переменные, объявленные в части спецификации модуля, являются глобальными для модуля.
-
Переменные, объявленные в модуле, становятся глобальными переменными в любой программе или подпрограмме, где используется модуль.
-
Оператор использования может появляться в основной программе или в любой другой подпрограмме или модуле, который использует процедуры или переменные, объявленные в определенном модуле.
Вы можете добавить столько модулей, сколько нужно, каждый будет в отдельных файлах и скомпилирован отдельно.
Модуль может использоваться в различных программах.
Модуль может использоваться много раз в одной и той же программе.
Переменные, объявленные в части спецификации модуля, являются глобальными для модуля.
Переменные, объявленные в модуле, становятся глобальными переменными в любой программе или подпрограмме, где используется модуль.
Оператор использования может появляться в основной программе или в любой другой подпрограмме или модуле, который использует процедуры или переменные, объявленные в определенном модуле.
пример
Следующий пример демонстрирует концепцию –
Live Demo
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. Давайте сделаем их приватными и посмотрим на результат –
Live Demo
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 больше не может обращаться к этим переменным.
Однако другие подпрограммы модуля могут получить к ним доступ –
Live Demo
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.
пример
Live Demo
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
Live Demo
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. Хотя это зависит от машины.
пример
Live Demo
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) возвращает десятичный диапазон показателя степени.
пример
Live Demo
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.
пример
Live Demo
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 –
Download Article
Download Article
Many people perceive Fortran as an archaic and «dead» programming language. However, most scientific and engineering code is written in Fortran. As such, programming in F77 and F90 remains a necessary skill for most technical programmers. Moreover, the latest Fortran standards (2003, 2008, 2015) allow the programmer to write highly efficient code with minimum effort, while utilizing all of the modern language features, such as OOP (object-oriented programming).
FORTRAN is an acronym for «FORmula TRANslation», and is best suited for mathematical and numerical applications rather than graphics or database applications. Most fortran codes take text input from a file or command-line rather than from a menu or GUI interface.
-
1
Write a «Hello World» program. This is usually the first program to write in any language, and it just prints «Hello world» to the screen. Write the following code in any text editor and save it as helloworld.f. Pay attention that there must be exactly 6 spaces in front of every line.
program helloworld implicit none character*13 hello_string hello_string = "Hello, world!" write (*,*) hello_string end program helloworld
Tip: The spaces are only necessary in versions of Fortran up to FORTRAN 77. If you’re using a newer version, you can drop the spaces. Compile programs from newer version with f95, not f77; use .f95 as the file extension instead of just .f.
-
2
Compile the program. To do this, type f77 helloworld.f into the command line. If this gives an error, you probably haven’t installed a Fortran compiler like for example gfortran yet.
Advertisement
-
3
Run your program. The compiler has produced a file called a.out. Run this file by typing ./a.out.
-
4
Understand what you just wrote.
-
program helloworld
indicates the start of the program «helloworld». Similarly,end program helloworld
indicates its end. - By default, if you don’t declare a variable type, Fortran treats a variable with a name that begins with a letter from i to n as integer, and all others as a real number. It is recommended to use
implicit none
if you don’t need that behaviour. -
character*13 hello_string
declares an array of characters which is called hello_string. -
hello_string = "Hello, world!"
assigns the value «Hello, world!» to the declared array. Unlike in other languages like C, this can’t be done on the same line as declaring the array. -
write (*,*) hello_string
prints the value of hello_string to the standard output. The first * means to write to standard output, as opposed to some file. The second * means not to use any special formatting.
-
-
5
Add a comment. This isn’t necessary in such a simple program, but it will be useful when you write something more complex, so you should know how to add them. There are two ways to add a comment.
- To add a comment that has an entire line on its own, write a c directly into a new line, without the 6 spaces. After that, write your comment. You should leave a space between the c and your comment for better readability, but this isn’t required. Note that you have to use a ! instead of a c in Fortran 95 and newer.
- To add a comment in the same line as code, add a ! where you want your comment to begin. Again, a space isn’t required, but improves readability.
Advertisement
-
1
Understand different data types.
- INTEGER is used for whole numbers, like 1, 3, or -3.
- REAL can also contain a number that isn’t whole, like 2.5.
- COMPLEX is used to store complex numbers. The first number is the real and the second the imaginary part.
- CHARACTER is used for characters, like letters or punctuation.
- LOGICAL can be either .true. or .false.. This is like the boolean type in other programming languages.
-
2
Get the user’s input. In the «Hello world» program that you wrote before, getting user input would be useless. So open a new file and name it compnum.f. When you’ve finished it, it will tell the user whether the number they entered is positive, negative or equal to zero.
- Enter the lines program compnum and end program compnum.
- Then, declare a variable of the type REAL. Make sure that your declaration is between the beginning and the end of the program.
- Explain the user what they’re supposed to do. Write some text with the write function.
- Read the user’s input into the variable you declared with the read function.
program compnum real r write (*,*) "Enter a real number:" read (*,*) r end program
-
3
Process the user’s input with an if-construction. Put it between the
read (*,*) r
and theend program
.- Comparison is done with .gt. (greater than), .lt. (less than) and .eq. (equals) in Fortran.
- Fortran supports if, else if, and else
- A Fortran if-construction always ends with end if.
if (r .gt. 0) then write (*,*) "That number is positive." else if (r .lt. 0) then write (*,*) "That number is negative." else write (*,*) "That number is 0." end if
Tip: You don’t have to indent code inside of if-constructions with more spaces, but it improves readability.
-
4
Compile and run your program. Input some numbers to test it. If you enter a letter, it will raise an error, but that’s okay because the program doesn’t check whether the input is a letter, a number, or something else.
Advertisement
-
1
Open a new file. Since this concept is different, you’ll have to write a new program again. Name the file addmany.f. Insert the corresponding program and end program statements, as well as an implicit none. When you’re finished, this program will read 10 numbers and print their sum.
-
2
Declare an array of length 10. This is where you will store the numbers. Since you probably want a sum of real numbers, you should declare the array as real. You declare such an array with
(numbers is the name of the array, not an expression).
-
3
Declare some variables. Declare numSum as a real number. You will use it to store the sum later, but since sum is already taken by a Fortran expression, you have to use a name like numSum. Set it to 0. Declare i as an integer and don’t assign it any value yet. That will be done in the do-loop.
-
4
Create a do-loop. The equivalent of that in other programming languages would be a for-loop.
- A do-loop always starts with do.
- On the same line as the do, separated from it by a space, is the label to which the program will go when it’s finished. For now, just write a 1, you’ll set the label later.
- After that, again only separated by a space, type . This will make the variable i, which you had declared before the loop, go from 1 to 10 in steps of 1. The steps aren’t mentioned in this expression, so Fortran uses the default value of 1. You could also have written
- Put some code inside the loop (indent with spaces for better readability). For this program, you should increase the variable numSum with the i-th element of the array numbers. This is done with the expression
numSum = numSum + number(i)
- End the loop with a continue statement that has a label. Type only 4 spaces. After that, type a 1. That’s the label which you told the do-loop to go to after it finishes. Then, type a space and continue. The continue expression does nothing, but it gives a good spot to place a label, as well as showing that the do-loop ended.
Your do loop should now look like this:
do 1 i = 1, 10 numSum = numSum + numbers(i) 1 continue
Tip: In Fortran 95 and newer, you don’t need to use labels. Just don’t put one into the do statement and end the loop with «end do» instead of «continue».
-
5
Print numSum. Also, it would make sense to give some context, for example «The sum of your numbers is:». Use the write function for both. Your entire code should now look as follows:
program addmany implicit none real numbers(10) real numSum integer i numSum = 0 write (*,*) "Enter 10 numbers:" read (*,*) numbers do 1 i = 1, 10 numSum = numSum + numbers(i) 1 continue write (*,*) "Their sum is:" write (*,*) numSum end program addmany
-
6
Compile and run your code. Don’t forget to test it. You can either press ↵ Enter after each number you enter or enter many numbers on the same line and separate them with a space.
Advertisement
-
1
Have a good idea of what your program will do. Think about what sort of data is needed as input, how to structure the output, and include some intermediate output so you can monitor the progress of your calculation. This will be very useful if you know your calculation will run for a long time or involves multiple complicated steps.
-
2
Find a good Fortran reference. Fortran has many more functions than explained in this article, and they might be useful for the program you want to write. A reference lists all functions a programming language has. This is one for Fortran 77 and this is one for Fortran 90/95.
-
3
Learn about subroutines and functions.
-
4
Learn how to read and write from/to files. Also learn how to format your input/output.
-
5
Learn about the new features of Fortran 90/95 and newer. Skip this step if you know that you’ll only be writing/maintaining Fortran 77 code.
- Remember that Fortran 90 introduced the «Free Form» source code, allowing code to be written without the spaces and without the 72 character limit.
-
6
Read or look up some books on Scientific Programming. For example, the book «Numerical Recipes in Fortran» is both a good text on scientific programming algorithms and a good introduction to how to put together codes. More recent editions include chapters on how to program in a mixed-language environment and parallel programming. Another example is «Modern Fortran in Practice» written by Arjen Markus. The book gives an insight into how to write Fortran programs in twenty-first-century style in accordance with the latest Fortran standards.
-
7
Learn how to compile a program spread across multiple files. Let’s assume that your Fortran program is spread across the files main.f and morestuff.f, and that you want the resulting binary to be named allstuff. Then you’ll have to write following commands into the command line:
f77 -c morestuff.f f77 -c main.f f77 -c morestuff.f f77 -o allstuff main.o morestuff.f
Then run the file by typing ./allstuff.
Tip: This works the same way with newer versions of Fortran. Just replace .f with the correct extension and f77 with the correct compiler version.
-
8
Use the optimization your compiler provides. Most compilers include optimization algorithms that improve the efficiency of your code. These are typically turned on by including a -O , -O2, or -O3 flag when compiling (again depending upon your version of fortran).
- Generally, the lowest level -O or -O2 level is best. Be aware that using the more aggressive optimization option can introduce errors in complex codes and may even slow things down! Test your code.
Advertisement
Add New Question
-
Question
How can I run the program?
You will have to run it through a compiler to create an executable file.
Ask a Question
200 characters left
Include your email address to get a message when this question is answered.
Submit
Advertisement
-
You might find it easier to use an online IDE (integrated development environment) at first. A good option is Coding Ground.[1]
You will find a multitude of programming languages there, including Fortran-95. Another option is Ideone. -
Start with small programs. When you are making your own code, try to identify the most essential part of the problem — is it the data input or the calling of the functions, the structure of the loop (these are some very elementary examples) and start from there. Then build upon that in small increments.
-
Fortran is not case-sensitive. You could, for example, declare a variable «real Num» and write «num = 1» in the next line to assign a value to it. But that’s a bad style, so avoid it. More importantly, Fortran doesn’t care about the case of functions and statements either. It’s quite common to write functions and statements in UPPERCASE and variables in lowercase.
Show More Tips
Thanks for submitting a tip for review!
Advertisement
Things You’ll Need
- A FORTRAN compiler. There are FORTRAN compilers for Windows, Mac OS, and Linux.
- A text editor. Most (All?) operating systems come with text editors; however, you may prefer some other text editor over the default.
References
- ↑ tutorialspoint.com/codingground.htm
About This Article
Thanks to all authors for creating a page that has been read 106,209 times.
Is this article up to date?
Download Article
Download Article
Many people perceive Fortran as an archaic and «dead» programming language. However, most scientific and engineering code is written in Fortran. As such, programming in F77 and F90 remains a necessary skill for most technical programmers. Moreover, the latest Fortran standards (2003, 2008, 2015) allow the programmer to write highly efficient code with minimum effort, while utilizing all of the modern language features, such as OOP (object-oriented programming).
FORTRAN is an acronym for «FORmula TRANslation», and is best suited for mathematical and numerical applications rather than graphics or database applications. Most fortran codes take text input from a file or command-line rather than from a menu or GUI interface.
-
1
Write a «Hello World» program. This is usually the first program to write in any language, and it just prints «Hello world» to the screen. Write the following code in any text editor and save it as helloworld.f. Pay attention that there must be exactly 6 spaces in front of every line.
program helloworld implicit none character*13 hello_string hello_string = "Hello, world!" write (*,*) hello_string end program helloworld
Tip: The spaces are only necessary in versions of Fortran up to FORTRAN 77. If you’re using a newer version, you can drop the spaces. Compile programs from newer version with f95, not f77; use .f95 as the file extension instead of just .f.
-
2
Compile the program. To do this, type f77 helloworld.f into the command line. If this gives an error, you probably haven’t installed a Fortran compiler like for example gfortran yet.
Advertisement
-
3
Run your program. The compiler has produced a file called a.out. Run this file by typing ./a.out.
-
4
Understand what you just wrote.
-
program helloworld
indicates the start of the program «helloworld». Similarly,end program helloworld
indicates its end. - By default, if you don’t declare a variable type, Fortran treats a variable with a name that begins with a letter from i to n as integer, and all others as a real number. It is recommended to use
implicit none
if you don’t need that behaviour. -
character*13 hello_string
declares an array of characters which is called hello_string. -
hello_string = "Hello, world!"
assigns the value «Hello, world!» to the declared array. Unlike in other languages like C, this can’t be done on the same line as declaring the array. -
write (*,*) hello_string
prints the value of hello_string to the standard output. The first * means to write to standard output, as opposed to some file. The second * means not to use any special formatting.
-
-
5
Add a comment. This isn’t necessary in such a simple program, but it will be useful when you write something more complex, so you should know how to add them. There are two ways to add a comment.
- To add a comment that has an entire line on its own, write a c directly into a new line, without the 6 spaces. After that, write your comment. You should leave a space between the c and your comment for better readability, but this isn’t required. Note that you have to use a ! instead of a c in Fortran 95 and newer.
- To add a comment in the same line as code, add a ! where you want your comment to begin. Again, a space isn’t required, but improves readability.
Advertisement
-
1
Understand different data types.
- INTEGER is used for whole numbers, like 1, 3, or -3.
- REAL can also contain a number that isn’t whole, like 2.5.
- COMPLEX is used to store complex numbers. The first number is the real and the second the imaginary part.
- CHARACTER is used for characters, like letters or punctuation.
- LOGICAL can be either .true. or .false.. This is like the boolean type in other programming languages.
-
2
Get the user’s input. In the «Hello world» program that you wrote before, getting user input would be useless. So open a new file and name it compnum.f. When you’ve finished it, it will tell the user whether the number they entered is positive, negative or equal to zero.
- Enter the lines program compnum and end program compnum.
- Then, declare a variable of the type REAL. Make sure that your declaration is between the beginning and the end of the program.
- Explain the user what they’re supposed to do. Write some text with the write function.
- Read the user’s input into the variable you declared with the read function.
program compnum real r write (*,*) "Enter a real number:" read (*,*) r end program
-
3
Process the user’s input with an if-construction. Put it between the
read (*,*) r
and theend program
.- Comparison is done with .gt. (greater than), .lt. (less than) and .eq. (equals) in Fortran.
- Fortran supports if, else if, and else
- A Fortran if-construction always ends with end if.
if (r .gt. 0) then write (*,*) "That number is positive." else if (r .lt. 0) then write (*,*) "That number is negative." else write (*,*) "That number is 0." end if
Tip: You don’t have to indent code inside of if-constructions with more spaces, but it improves readability.
-
4
Compile and run your program. Input some numbers to test it. If you enter a letter, it will raise an error, but that’s okay because the program doesn’t check whether the input is a letter, a number, or something else.
Advertisement
-
1
Open a new file. Since this concept is different, you’ll have to write a new program again. Name the file addmany.f. Insert the corresponding program and end program statements, as well as an implicit none. When you’re finished, this program will read 10 numbers and print their sum.
-
2
Declare an array of length 10. This is where you will store the numbers. Since you probably want a sum of real numbers, you should declare the array as real. You declare such an array with
(numbers is the name of the array, not an expression).
-
3
Declare some variables. Declare numSum as a real number. You will use it to store the sum later, but since sum is already taken by a Fortran expression, you have to use a name like numSum. Set it to 0. Declare i as an integer and don’t assign it any value yet. That will be done in the do-loop.
-
4
Create a do-loop. The equivalent of that in other programming languages would be a for-loop.
- A do-loop always starts with do.
- On the same line as the do, separated from it by a space, is the label to which the program will go when it’s finished. For now, just write a 1, you’ll set the label later.
- After that, again only separated by a space, type . This will make the variable i, which you had declared before the loop, go from 1 to 10 in steps of 1. The steps aren’t mentioned in this expression, so Fortran uses the default value of 1. You could also have written
- Put some code inside the loop (indent with spaces for better readability). For this program, you should increase the variable numSum with the i-th element of the array numbers. This is done with the expression
numSum = numSum + number(i)
- End the loop with a continue statement that has a label. Type only 4 spaces. After that, type a 1. That’s the label which you told the do-loop to go to after it finishes. Then, type a space and continue. The continue expression does nothing, but it gives a good spot to place a label, as well as showing that the do-loop ended.
Your do loop should now look like this:
do 1 i = 1, 10 numSum = numSum + numbers(i) 1 continue
Tip: In Fortran 95 and newer, you don’t need to use labels. Just don’t put one into the do statement and end the loop with «end do» instead of «continue».
-
5
Print numSum. Also, it would make sense to give some context, for example «The sum of your numbers is:». Use the write function for both. Your entire code should now look as follows:
program addmany implicit none real numbers(10) real numSum integer i numSum = 0 write (*,*) "Enter 10 numbers:" read (*,*) numbers do 1 i = 1, 10 numSum = numSum + numbers(i) 1 continue write (*,*) "Their sum is:" write (*,*) numSum end program addmany
-
6
Compile and run your code. Don’t forget to test it. You can either press ↵ Enter after each number you enter or enter many numbers on the same line and separate them with a space.
Advertisement
-
1
Have a good idea of what your program will do. Think about what sort of data is needed as input, how to structure the output, and include some intermediate output so you can monitor the progress of your calculation. This will be very useful if you know your calculation will run for a long time or involves multiple complicated steps.
-
2
Find a good Fortran reference. Fortran has many more functions than explained in this article, and they might be useful for the program you want to write. A reference lists all functions a programming language has. This is one for Fortran 77 and this is one for Fortran 90/95.
-
3
Learn about subroutines and functions.
-
4
Learn how to read and write from/to files. Also learn how to format your input/output.
-
5
Learn about the new features of Fortran 90/95 and newer. Skip this step if you know that you’ll only be writing/maintaining Fortran 77 code.
- Remember that Fortran 90 introduced the «Free Form» source code, allowing code to be written without the spaces and without the 72 character limit.
-
6
Read or look up some books on Scientific Programming. For example, the book «Numerical Recipes in Fortran» is both a good text on scientific programming algorithms and a good introduction to how to put together codes. More recent editions include chapters on how to program in a mixed-language environment and parallel programming. Another example is «Modern Fortran in Practice» written by Arjen Markus. The book gives an insight into how to write Fortran programs in twenty-first-century style in accordance with the latest Fortran standards.
-
7
Learn how to compile a program spread across multiple files. Let’s assume that your Fortran program is spread across the files main.f and morestuff.f, and that you want the resulting binary to be named allstuff. Then you’ll have to write following commands into the command line:
f77 -c morestuff.f f77 -c main.f f77 -c morestuff.f f77 -o allstuff main.o morestuff.f
Then run the file by typing ./allstuff.
Tip: This works the same way with newer versions of Fortran. Just replace .f with the correct extension and f77 with the correct compiler version.
-
8
Use the optimization your compiler provides. Most compilers include optimization algorithms that improve the efficiency of your code. These are typically turned on by including a -O , -O2, or -O3 flag when compiling (again depending upon your version of fortran).
- Generally, the lowest level -O or -O2 level is best. Be aware that using the more aggressive optimization option can introduce errors in complex codes and may even slow things down! Test your code.
Advertisement
Add New Question
-
Question
How can I run the program?
You will have to run it through a compiler to create an executable file.
Ask a Question
200 characters left
Include your email address to get a message when this question is answered.
Submit
Advertisement
-
You might find it easier to use an online IDE (integrated development environment) at first. A good option is Coding Ground.[1]
You will find a multitude of programming languages there, including Fortran-95. Another option is Ideone. -
Start with small programs. When you are making your own code, try to identify the most essential part of the problem — is it the data input or the calling of the functions, the structure of the loop (these are some very elementary examples) and start from there. Then build upon that in small increments.
-
Fortran is not case-sensitive. You could, for example, declare a variable «real Num» and write «num = 1» in the next line to assign a value to it. But that’s a bad style, so avoid it. More importantly, Fortran doesn’t care about the case of functions and statements either. It’s quite common to write functions and statements in UPPERCASE and variables in lowercase.
Show More Tips
Thanks for submitting a tip for review!
Advertisement
Things You’ll Need
- A FORTRAN compiler. There are FORTRAN compilers for Windows, Mac OS, and Linux.
- A text editor. Most (All?) operating systems come with text editors; however, you may prefer some other text editor over the default.
References
- ↑ tutorialspoint.com/codingground.htm
About This Article
Thanks to all authors for creating a page that has been read 106,209 times.
Is this article up to date?
30 апреля, 2017 11:52 дп
5 491 views
| Комментариев нет
Ubuntu
Программирование на языке Fortran (FORmula TRANslation) широко используется для научных и инженерных вычислений.
Язык Fortran был создан в 1950-х для программирования на IBM. Fortran широко применяется и сегодня, поскольку он позволяет выполнять сложные вычисления.
Данное руководство поможет установить Fortran и научит разрабатывать простые программы.
Требования
- Сервер Ubuntu 16.04.
- Пользователь с доступом к sudo.
- Брандмауэр (все необходимые рекомендации можно найти здесь).
- Базовые навыки работы с терминалом (больше информации можно найти в статье Основы работы с терминалом Linux).
Установка Fortran
Обновите индекс пакетов:
sudo apt-get update
Затем нужно установить компилятор gfortran, который работает с Fortran 95, Fortran 2003, Fortran 2008.
sudo apt-get install gfortran
Терминал запросит подтверждения. Чтобы продолжить, введите y.
После этого введите команду:
gfortran
Поскольку в команде не указан файл Fortran, она выдаст ошибку:
gfortran: fatal error: no input files
compilation terminated.
Однако это предсказуемое поведение, ошибка исчезнет, если указать в команде файл. Теперь вы знаете, что установка прошла успешно.
Создание программы «O, World!»
Теперь попробуйте написать простую программу. Создайте новый файл в текстовом редакторе nano для программы под названием OWorld (при желании вы можете выбрать другое имя). Последней версией языка Fortran является Fortran 2008, её нужно указать в расширении:
nano OWorld.f08
Добавьте в файл ключевое слово program и укажите затем имя программы. Имя, указанное в ключевом слове program, и имя файла программы не должны обязательно совпадать. Например, несмотря на то, что файл называется OWorld, в ключевом слове program можно указать o_world.
program o_world
После этого добавьте в программу строку implicit none, чтобы компилятор мог проверять типы переменных.
program o_world
implicit none
После этого можно добавить в файл строку, которая будет отображать фразу O, world!:
program o_world
implicit none
print *, "Good morrow, and well met, O world!"
Оператор print считывает параметры и передаёт их в вывод. Символ звёздочки (*) в команде будет подбирать наиболее удобный способ отображения передаваемых данных (в данном случае они будут передаваться в виде строки).
В конце программы нужно поместить оператор end, указать ключевое слово program и имя программы:
program o_world
implicit none
print *, "Good morrow, and well met, O world!"
end program o_world
Компилирование программы
Теперь программу OWorld.f08 нужно скомпилировать.
Для этого введите:
gfortran OWorld.f08
В этой команде указан исполняемый файл. Чтобы просмотреть содержимое, введите:
ls
a.out OWorld.f08
Запустите файл a.out:
./a.out
На экране появится фраза:
Good morrow, and well met, O world!
Программа работает правильно.
Вы можете переименовать a.out и выбрать более описательное имя файла:
gfortran OWorld.f08 -o OWorld
Снова запустите программу:
./OWorld
Команда выведет:
Good morrow, and well met, O world!
Рекомендации
При написании программ на Fortran помните:
- Комментарии в Fortran начинаются с восклицательного знака (!).
- Чтобы сделать код удобочитаемым, используйте отступы.
- Язык Fortran не учитывает регистра; Fortran допускает как прописные, так и строчные буквы, но строковые литералы остаются чувствительными к регистру.
Tags: Fortran, Ubuntu 16.04
Раздел: Статьи /
Фортран /
|
Фортран в задачах и примерах
Лучшая теория — это практика. Если необходимо быстро освоить новый язык программирования, то |
Ну что же, начнём знакомство с “мёртвым” языком программирования Фортран. Хотя на самом деле он не такой уж и мёртвый — он до сих пор поддерживается, развивается и используется. Особенно в научной среде непрограммистов. Для чего, в общем-то, изначально он и был создан.
Первый вопрос у начинающего программиста — как писать программы на каком-либо языке (в нашем случае на Фортране).
Второй вопрос — где писать программы.
Начну со второго вопроса. Компиляторов Фортрана существует довольно много, как бесплатных, так и платных.
Но для ознакомления с языком я советую воспользоваться онлайн-интерпретатором. Их тоже существует немало.
Например, можно использовать этот.
И теперь напишем нашу первую программу на Фортране:
PROGRAM Hello PRINT *, "Hello World" END PROGRAM Hello
Если вы написали эту программу в онлайн-компиляторе, ссылка на который приведена выше, то теперь щёлкните по зелёной кнопочке RUN, которая находится над редактором исходного кода:
Если вы не допустили ошибок, то в нижней части окна появится результат работы программы. В нашем случае это
будет строка "Hello World"
.
Ну а теперь давайте разберем программу.
Программа начинается с ключевого слова PROGRAM
. Затем пишем имя программы. Имя может быть любым допустимым с точки зрения синтаксиса.
Заканчивается программа словами END PROGRAM
, за которыми также надо написать имя программы (оно должно быть таким же, как и в начале программы).
Фортран не чувствителен к регистру. То есть вам необязательно писать ключевые слова большими буквами.
Вы можете написать PROGRAM
, Program
или program
. Всё это будет работать точно также.
Ну а теперь сама программа:
PRINT *, "Hello World"
Во-первых, обратите внимание на отступ. В данном случае он необязателен, но вообще отступы в Фортране играют
такую же важную роль, как и в Python (теперь, думаю, вы понимаете, какой язык вдохновил разработчика Python на его создание).
PRINT
— это оператор вывода. С его помощью выполняется вывод на экран. После имени оператора ОБЯЗАТЕЛЬНО требуется спецификатор формата. В нашем случае это звёздочка, что означает произвольный формат (то есть без форматирования — просто вывод данных).
Затем можно через запятую перечислить выражения, которые надо вывести на экран. В нашем случае это всего одна строковая константа, которая и будет выведена на экран:
Hello World
Строки в Фортране заключаются в двойные кавычки. Но можно использовать и одинарные (хотя точно не знаю, может это допускается не во всех реализациях языка).
Если же вместо константы вы укажете, например, имя переменной, то будет выведено значение этой переменной.
Ну вот и всё. Ваша первая программа на загадочном и забытом Фортране готова и даже работает. С чем вас и поздравляю.
На самом деле Фортран забыт совершенно незаслуженно. Он такой же простой, как и Python (а в чём-то может даже и проще). И его вполне можно использовать для решения повседневных задач, для каких-то экспериментов и т.п.
|
Помощь в технических вопросах
Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение — ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. |
|
Современный Фортран — самоучитель
Многие уже давно похоронили Фортран, как и Паскаль и другие языки старой школы. Однако, как говорится, «не дождётесь». |
замечания
Фортран — это язык, широко используемый в научном сообществе из-за его пригодности для численного расчета. Особенно привлекательной является его интуитивная запись в виде массива, которая упрощает запись быстрых векторизованных вычислений.
Несмотря на свой возраст, Fortran по-прежнему активно развивается с многочисленными реализациями, включая GNU, Intel, PGI и Cray.
Версии
Версия | Заметка | Релиз |
---|---|---|
ФОРТРАН 66 | Первая стандартизация ASA (теперь ANSI) | 1966-03-07 |
ФОРТРАН 77 | Фиксированная форма, историческая | 1978-04-15 |
Фортран 90 | Бесплатная форма, стандарт ISO, операции с массивом | 1991-06-15 |
Фортран 95 | Чистые и элементарные процедуры | 1997-06-15 |
Fortran 2003 | Объектно-ориентированное программирование | 2004-04-04 |
Fortran 2008 | Co-Массивы | 2010-09-10 |
Установка или настройка
Fortran — это язык, который может быть скомпилирован с использованием компиляторов, поставляемых многими поставщиками. Различные компиляторы доступны для разных аппаратных платформ и операционных систем. Некоторые компиляторы являются свободным программным обеспечением, некоторые могут использоваться бесплатно, а некоторые требуют покупки лицензии.
Наиболее распространенным свободным компилятором Fortran является GNU Fortran или gfortran. Исходный код доступен из GNU в составе GCC, сборника компиляторов GNU. Бинарные файлы для многих операционных систем доступны по адресу https://gcc.gnu.org/wiki/GFortranBinaries . Распределения Linux часто содержат gfortran в своем диспетчере пакетов.
Другие компиляторы доступны, например:
- EKOPath by PathScale
- LLVM (бэкэнд через DragonEgg)
- Oracle Developer Studio
- Компилятор Absoft Fortran
- Компилятор Intel Fortran
- Компилятор Fortran NAG
- Компиляторы PGI
В HPC-системах часто доступны специализированные компиляторы, доступные системному провайдеру, например, компиляторы IBM или Cray .
Все эти компиляторы поддерживают стандарт Fortran 95. Обзор состояния Fortran 2003 и статуса Fortran 2008 различными компиляторами предлагается Форумом ACM Fortran и доступен в Вики-версии Fortran.
Привет, мир
Любая программа Fortran должна включать end
качестве последнего оператора. Поэтому простейшая программа Fortran выглядит так:
end
Вот несколько примеров программ «привет, мир»:
print *, "Hello, world"
end
С помощью оператора write
:
write(*,*) "Hello, world"
end
Для ясности теперь принято использовать инструкцию program
для запуска программы и присвоения ей имени. Затем оператор end
может ссылаться на это имя, чтобы сделать его очевидным, о чем идет речь, и дать компилятору проверить правильность кода. Кроме того, все программы Fortran должны содержать implicit none
оператор. Таким образом, минимальная программа Fortran должна выглядеть следующим образом:
program hello
implicit none
write(*,*) 'Hello world!'
end program hello
Следующий логический шаг от этого момента — это увидеть результат приветственной мировой программы. В этом разделе показано, как добиться этого в среде Linux. Мы предполагаем, что у вас есть некоторые основные понятия команд оболочки , в основном вы знаете, как добраться до терминала оболочки. Мы также предполагаем, что вы уже настроили среду fortran
. Используя предпочтительный текстовый редактор (блокнот, блокнот ++, vi, vim, emacs, gedit, kate и т. Д.), Сохраните программу приветствия выше (скопируйте и вставьте) в файл с именем hello.f90
в вашем домашнем каталоге. hello.f90
— ваш исходный файл. Затем перейдите в командную строку и перейдите в каталог (домашний каталог?), Где вы сохранили исходный файл, затем введите следующую команду:
>gfortran -o hello hello.f90
Вы только что создали свою исполняемую программу hello world. В техническом плане вы просто скомпилировали свою программу. Чтобы запустить его, введите следующую команду:
>./hello
На вашем терминале оболочки вы должны увидеть следующую строку.
> Hello world!
Поздравляем, вы только что написали, скомпилировали и запустили программу Hello World.
Квадратное уравнение
Сегодня Fortran в основном используется для численного расчета. Этот очень простой пример иллюстрирует основную программную структуру для решения квадратичных уравнений:
program quadratic
!a comment
!should be present in every separate program unit
implicit none
real :: a, b, c
real :: discriminant
real :: x1, x2
print *, "Enter the quadratic equation coefficients a, b and c:"
read *, a, b, c
discriminant = b**2 - 4*a*c
if ( discriminant>0 ) then
x1 = ( -b + sqrt(discriminant)) / (2 * a)
x2 = ( -b - sqrt(discriminant)) / (2 * a)
print *, "Real roots:"
print *, x1, x2
! Comparison of floating point numbers for equality is often not recommended.
! Here, it serves the purpose of illustrating the "else if" construct.
else if ( discriminant==0 ) then
x1 = - b / (2 * a)
print *, "Real root:"
print *, x1
else
print *, "No real roots."
end if
end program quadratic
Нечувствительность к регистру
Прописные и строчные буквы алфавита эквивалентны в наборе символов Fortran. Другими словами, Fortran нечувствителен к регистру . Такое поведение контрастирует с чувствительными к регистру языками, такими как C ++ и многие другие.
Как следствие, переменные a
и A
являются a
и той же переменной. В принципе можно написать программу следующим образом
pROgrAm MYproGRaM
..
enD mYPrOgrAM
Это хороший программист, чтобы избежать таких уродливых выборов.