Томский государственный университет систем управления и радиоэлектроники
Опубликован: 01.11.2012 | Доступ: свободный | Студентов: 651 / 76 | Длительность: 06:01:00
Лекция 2:

Типы данных

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >

Ввод/вывод

Дескрипторы данных

Дескриптор Тип Представление
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

Ввод/вывод

Дескрипторы управления:

nXвывод n пробелов;

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).
  • Вычислить:
    1. площадь;
    2. периметр.
  • Проверить:
    1. сумму углов треугольника;
    2. неравенство треугольника;
    3. теорему синусов.

* Случай, когда точки лежат на одной прямой не рассматриваем.


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
Для продолжения нажмите любую клавишу . . .
< Лекция 1 || Лекция 2: 1234 || Лекция 3 >