Типы данных
Ввод/вывод
Дескрипторы данных
Дескриптор | Тип | Представление |
---|---|---|
nIw[.m] | Целый | Целое число |
nFw.d | Вещественный | F-форма |
nEw.d | Вещественный | E-форма |
nLw | Логический | T и F, .T и .F, .TRUE. и .FALSE. |
nAw | Символьный | Строка символов |
- n – число повторений;
- w – количество выводимых символов;
- m – число ведущих нулей;
- d – число цифр после десятичной точки.
Примеры вывода данных
integer :: a = 10, b = 20, c = 30 real :: s = 1.237, p = 1.87342E+10 complex :: k = (0.0,1.0) logical :: st = .TRUE. character :: key = 'A' write(*,"(3i4)") a,b,c ! ^^10^^20^^30 ! упр write(*,"(f10.5)") s ! ^^^1.23700 write(*,"(E10.2)") p ! ^^0.19E+11 write(*,"(2f5.1)") k ! ^^0.0^^1.0 write(*,"(L2)") st ! ^T write(*,"(A4)") key ! ^^^A write(*,"(I4)") 1000000 ! **** ошибка write(*,"(F5.4)") 123.456 ! ***** ошибка
Примеры ввода данных
program prog integer X, Y character(100) str write(*,"(A,\)") "Enter coordinates x,y " read(*,"(2I4)") X, Y write(*,"(A,I4)") "Summa = ", X+Y ! 4^^^5 результат 9 ! 4^^^^^^^^^^^5 результат 4 write(*,"(A,\)") "Path..." read(*,"(A)") str write(*,"(A)") str(1:3) ! Path...C:\DOCUM\1.txt ! результат C:\ end
примеры ввода данных
program prog real(4) c1, c2, c3 complex(4) z1 write(*,"(A,\)") "Values c1, c2, c3" read(*,"(3E10.2)") c1, c2, c3 write(*,"(E10.2)") (c1+c2+c3)/2.0 !1.E+0^^^^^2.E+0^^^^^9.E+0 !результат ^^0.60E+01 write(*,"(A,\)") "Complex Z1 = " read(*,"(2f5.2)") Z1 ! мнимая и действительная части write(*,"(A,f5.2)") "Im(z) = ", aimag(Z1) write(*,"(A,f5.2)") "Re(z) = ", real(Z1) !2.0^^3.0 !результат Im(z) =^^3.0 Re(z) =^^2.0 end
Ввод/вывод
Дескрипторы управления:
SP – вывод знака "+" в числовых данных;
SS – не выводить знак "+";
S – восстановление действия дескриптора SS;
Tn – абсолютная табуляция;
TRn – относительная правая табуляция;
TLn – относительная левая табуляция;
BN – игнорировать пробелы;
BZ – интерпретировать пробелы как нули;
/ – переход на следующую строку;
\ – не переходить на следующую строку.
Ввод/вывод бесконечностей
-Inf или –Infinity – отрицательная бесконечность;
Inf, +Inf, Infinity или +Infinity – положительная бесконечность.
program infinity real(4) p write(*,"(A,\)") "p = " ! Inf read(*,*) p write(*,*) -p ! -Infinity end
Обработка ошибок
write(*,*,ERR = целочисленная метка) ...
read (*,*,ERR = целочисленная метка) ...
program check_error integer k read(*,*,ERR = 100) k ! если введен недопустимый символ write(*,*) k*1000 stop 100 stop "ERROR" end
Умолчания о типах данных
По умолчанию все объекты программы, имена которых начинаются с букв i,j,k,l,m,n или I,J,K,L,M,N являются типа integer.
Все остальные объекты имеют тип real.
Оператор implicit изменяет правила умолчания.
implicit integer (A-B), logical (C-D)
implicit none – все имена должны быть объявлены явно.
Перечисления enum
Множество целых констант. Используется для взаимодействия с языком С.
enum, bind(C) enumerator plus enumerator :: minus = 4, div = 9 enumerator equal end enum ! или integer, parameter :: plus = 0, & minus = 4, div = 9, equal = 10
Ссылки и адресаты
Ссылка – переменная, связанная с другой переменной, называемой адресатом.
При обращении к ссылке будет происходить обращение к адресату и наоборот.
integer, pointer :: p ! ссылка integer, target :: a ! адресат
Ссылки позволяют создавать динамические структуры данных - списки, стеки, деревья, очереди.
Операция => прикрепление ссылки к адресату.
program prog integer, pointer :: p integer, target :: a a = 100 p => a ! прикрепили ссылку к адресату write(*,*) p p = 100 ! a = 100 a = 500 ! p = 500 end
Все изменения, происходящие с адресатом, дублируются в ссылке.
Массивные указатели
real, pointer :: a_ptr(:) real, target :: a_trg(5) = [1,2,3,4,5] a_ptr => a_trg print*, a_ptr end
Результат:
1.000000 2.000000 3.000000 4.000000 5.000000
Функция associated(pt, addr) возвращает .TRUE. если ссылка pt прикреплена к адресату addr.
program prog integer, pointer :: p1, p2, p3 integer, target :: a,b a = 100; b = 2; p1 => a; p2 => a write(*,*) associated(p1,p2) ! TRUE write(*,*) associated(p1) write(*,*) associated(p2,a) p1 => b write(*,*) associated(p3) ! FALSE write(*,*) associated(p1,p2) write(*,*) associated(p1,a) end
Оператор nullify - открепление ссылки от адресата.
program prog integer, pointer :: p1, p2 integer, target :: a a = 1000; p1 => a; p2 => a ! если к адресату прикреплены две ссылки, ! то отсоединим последнюю if (associated(p1,p2)) nullify(p2) write(*,*) associated(p1), associated(p2) ! T, F end
Целочисленные указатели
Целочисленный указатель – переменная целого типа, содержащая адрес некоторой переменной, называемой адресной переменной.
real a ! базируемая переменная pointer (p,a) ! p – целочисленный указатель ! на переменную типа real character ch ! ch – базируемая переменная pointer (pc,ch) ! pc – целочисленный указатель ! на тип character
Целочисленный указатель и базируемая переменная используются совместно.
Целочисленный указатель часто используется для обращения к функциям языка С.
Функция LOC вычисляет адрес переменной.
program arrow integer a ! базируемая переменная pointer(p,a) ! указатель на целый тип integer :: b = 100 p = loc(b) ! вычислили адрес переменной b a = 500 ! базируемой переменной поместим в b ! значение 500 write(*,*)"address = ",p, & ! 5038080 " value = ",a, & ! 500 " b = ",b ! 500 end
Конструкция Аssociate
Организует промежуточные расчетные блоки.
program prog ... associate (R => sqrt(x*x+y*y+z*z)) res = (R<10).AND.(R>3) ! R только в правой части end associate associate (ARRAY => AB % D (I, :) % X) ARRAY (3) = ARRAY (1) + ARRAY (2) end associate end
Задание
- Треугольник задан тремя точками на плоскости *
- (x1;y1), (x2;y2), (x3,y3).
- Вычислить:
- площадь;
- периметр.
- Проверить:
- сумму углов треугольника;
- неравенство треугольника;
- теорему синусов.
* Случай, когда точки лежат на одной прямой не рассматриваем.
program prog implicit none real(4), parameter :: eps = 1.0E-5 ! погрешность real(4) x1,y1,x2,y2,x3,y3 ! координаты real(4) a,b,c ! стороны real(4) alfa, betta, gamma ! углы real(4) S, P ! площадь, периметр logical NRV ! проверка неравенства треугольника logical TSIN ! проверка теоремы синусов logical SUM ! проверка суммы углов ! ввод координат write(*,"(A,\)") "1 point...."; read(*,*) x1, y1 write(*,"(A,\)") "2 point...."; read(*,*) x2, y2 write(*,"(A,\)") "3 point...."; read(*,*) x3, y3 ! вычисление площади S=0.5*abs((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1)) ! нахождение сторон a=sqrt((x1-x2)**2+(y1-y2)**2) b=sqrt((x3-x2)**2+(y3-y2)**2) c=sqrt((x1-x3)**2+(y1-y3)**2) ! вычисление периметра P=a+b+c ! проверка неравенства треугольника NRV=(a<b+c).AND.(b<a+c).AND.(c<a+b) ! нахождение углов alfa =acos((a*a-c*c-b*b)/(-2*c*b)) betta=acos((b*b-a*a-c*c)/(-2*a*c)) gamma=acos((c*c-a*a-b*b)/(-2*a*b)) ! проверка суммы углов треугольника SUM=abs(alfa+betta+gamma-2*acos(0.0))<eps ! проверка теоремы синусов TSIN=( (abs(a/sin(alfa )-b/sin(betta))<eps).AND. & (abs(b/sin(betta)-c/sin(gamma))<eps) ) ! вывод результатов write(*,"(A,F10.5)") "Square = ", S write(*,"(A,F10.5)") "Perimeter = ", P write(*,"(A,L)") "Sum of corners = ", SUM write(*,"(A,L)") "Triangle inequality = ", NRV write(*,"(A,L)") "Theorem of sine = ", TSIN end
Результат работы программы.
1 point....2 3 2 point....4 5 3 point....3 7 Square = 3.00000 Perimeter = 9.18760 Sum of corners = T Triangle inequality = T Theorem of sine = T Для продолжения нажмите любую клавишу . . .