Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Современный Фортран_учебник

.pdf
Скачиваний:
31
Добавлен:
23.03.2015
Размер:
1.61 Mб
Скачать

122

 

 

 

 

 

 

 

 

 

 

( , +* (x1,y1) (x2,y2)

 

 

(x x )2

+ (y

2

y )2

 

 

2

1

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

. "

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4 R (x0,y0).

 

(x-x0)2 + (y-y0)2 = R2

R -

 

 

x = x0 + R cos α

(x0,y0). 8 α:

0 α<2π

 

 

 

= y0

+ R sin α

 

 

y

. " , + "

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3 . b

 

( x x0

)2

+

( y y0

)2

= 1

(x0,y0).

 

 

 

a 2

 

b 2

 

 

 

 

 

 

 

 

 

 

 

 

.

 

 

x = x0

+ a cos α

b (x0,y0) 0 α

 

 

 

= y0

+ b sinα

 

 

y

. "

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4 , ! ! 6,

 

 

x =± (y – y0)2 + x0

(x0,y0).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4 , ! ! Y,

 

 

y = ± (x – x0)2 + y0

(x0,y0).

 

 

 

 

 

 

 

 

 

 

 

 

8.2. 1 ' '

% 41. % #

-

&

#

 

 

 

#$

5$

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x**-y

 

 

x –y

x**(-y)

$ . 5

5 !

 

 

 

 

!

! # .

 

 

 

 

.

 

 

 

 

 

 

 

 

 

 

 

 

cos(x)**2

cos**2(x) "-

 

 

cos2x

' -

$ .

 

 

cos -

,

!-

 

 

 

#, -

-

!

 

 

 

 

,

 

 

 

 

 

 

 

 

2x+b

2*x+b

2x+b

!

$ .

!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a/bc

-

 

a

 

 

' * -

 

a/(b*c)

– -

!

 

bc

(+

 

 

# b c !

 

 

 

 

! ).

 

 

 

 

bc

 

 

 

 

 

 

cos(x)**2

 

 

cos x2

cos(x**2)

 

/ x

 

 

 

 

cos2x.

 

 

 

 

 

 

123

 

 

 

 

 

 

 

 

-

&

 

 

#

 

 

 

 

 

 

 

 

 

#$

5$

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a

 

а/(b+c)*d

 

 

 

 

 

 

 

 

 

5 !

(

 

)

а/((b+c)*d)

b + c d

 

a

d

 

! # .

 

 

 

 

 

 

 

 

 

b + c

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x**2*y

 

5 !

 

X2Y

X**(2*y)

 

 

 

 

 

X2Y

 

! # .

( !

4./7. 4./7

4/7

 

(

*-

 

! #

4./7.

& – ,

 

 

 

 

 

4

-

! – !

 

 

 

 

 

7

0.5714

, 4/7 . 0

! *-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-

 

 

 

x**(1./3.)

x**(1/3)

!

1

-

 

 

 

x>0.

3

 

3

 

! 1/3

 

x

 

 

 

 

-

0 *

 

 

 

 

 

 

 

 

 

 

 

!

x0=1.

 

1 ln x

 

 

 

 

 

 

 

 

 

 

 

e3

 

 

 

 

 

 

 

x**(1./3.)

x**1./3. -

5 !

 

 

 

x>0.

 

3

x

 

 

x1

! #

 

 

 

 

 

 

 

 

-

 

3

 

 

 

 

!

 

 

.

 

 

 

 

 

 

 

-27**(1./3.)

(-27)**(1./3.)

 

 

 

 

 

3

− 27

!, - * + !

3 − 27 = − 3

27

 

! -

! ! -

 

 

 

 

 

 

 

 

 

 

 

 

 

!

 

 

 

 

 

8.3. 1

0 # ! !- # , . *! +- * . " –

3, . + 3.

 

% 42.

 

 

 

5 ', $

#$ –

#

статический массив

 

 

 

 

 

Real X(10)

 

Конформные массивы

Real,&

Real,dimension(1:10)::X,Y

дают единым списком

dimension(1:10)::Y

 

 

 

 

 

 

Integer::N=10 !переменная

Integer,parameter::N=10

Размерность статическо-

Real,dimension(1:N)::X

! размерность N – константа

го массива должна быть

4: размерность-переменная

Real,dimension(1:N)::X

константой.

 

 

 

 

 

124

 

 

 

 

Real X(10)

Integer,parameter::N=10

 

Real,dimension(1:10)::Y

Меняем только N –

! размерность N – константа

нехорошо, размерность 10 надо

перекомпилируем

Real,dimension(1:N)::X,Y

менять во многих местах

 

 

 

Real,dimension(1:10)::X

 

не описали y – вос-

 

.. x (i)= Y(i)

Real,dimension(1:10)::X,Y

принимается не как мас-

Ошибка не при компиляции, а

x(i) = y(i)

сив, а как неизвестная

 

при компоновке:

x,Y –

функция от одного аргу-

 

Y – unresolved external

 

мента y(i)

 

 

 

Real,dimension(1:4)::X,Y

Real,dimension(1:4)::X,Y

не описали y – вос-

 

Y(i) = x (i)

i =4; y (i) = x (i)

принимается как ошибка

 

Ошибка при компиляции

x,Y

 

Real,dimension(1:4)::X,Y

Real,dimension(1:4)::X,Y

Ошибка при выполнении:

do i =1,4

защита записи – индекс

x(i)=y(i) ! i = ?

x (i)= y(i)

не определен

 

 

enndo

 

 

 

 

Real,dimension(1:4)::X,Y

Real,dimension(1:4)::X,Y

Ошибка при выполнении:

x(i)=y(i) ! i = ?

X = Y

– индекс i не определен

 

 

 

 

 

 

 

% 43.

 

 

(

 

5 ', $

#$ -динамический массив

Пояснения

 

 

 

Real,dimension(:)::X

 

нужен атрибут

Неправильно – надо

Real,allocatable,&

allocatable

allocatable

размерность свободна

 

Real,allocatable,&

dimension(:)::X

! форма (1:4) – непра-

 

 

 

 

dimension(1:4)::X

 

вильно

 

 

 

Real,dimension(1:4)::X=1

Real,dimension(1:4)::X,Y=1

 

real,allocatable,&

real,allocatable, &

забыли allocate:

 

dimension(:)::Y

dimension(:)::y

 

адрес y не определен

!allocate(y(1:size(x)))

allocate(y(1:size(x)))

 

Y

= X

y = x

 

Real,dimension(1:4)::X=4

real,dimension(1:4)::X=4

 

Real,dimension(1:8)::z=8

Real,dimension(1:8)::Z=8

 

Real,allocatable,&

real, allocatable,&

забыли deallocate

dimension(:)::Y

dimension(:)::y

В результате повтор-

allocate(y(1:size(x)))

allocate(y(1:size(x)))

ный allocate не вы-

Y=X

Y = X

полняется

!

deallocate(y)

deallocate(y)

 

allocate(y(1:size(z)))

allocate(y(1:size(z)))

 

y = z

y = z

 

 

 

 

Real,allocatable,&

 

ошибки нет,

 

dimension(:)::X

Real,dimension(1:8)::X

но нет смысла строить

Integer :: N=8

 

динамический массив

allocate(X(1:N))

 

постоянного объема

125

% 44.

5 ', $

#$

#

 

 

 

Real,dimension(1:4)::P

Real,dimension(1:4)::X,Y

 

Real,dimension(1:8)::Q

Массив = Выражение

X=(/ 3.1, 3.7, -15. /)

P= Q;

Q= P

 

и присваивают, и

 

Y= X**2+3*X+1

плохо: массивы разной длины

строят выражение

 

Real,dimension(1:4)::X

Real:: z=0.72

только из конформных

Real,dimension(1:4,1:3)::M

массивов,

Real,dimension(1:4)::X

 

M= X; X= M

 

исключение – скаляры

 

Real,dimension(1:4,1:3)::M=1

плохо:

массивы с

разным

как sin(z) или 1

X=sin(z) + 1; M(:,1)=X;

числом

измерений

не при-

в выражении

M(:,2)=2

сваивают

 

 

 

 

 

Real,dimension(1:4,1:3) :: M

Real,dimension(1:4,1:3)::M,K

конформные массивы -

это массивы одинако-

Real,dimension(1:3, 1:4)::K

Real,dimension (1:4,-1:1)::R

вой формы [1:4,1:3],

M=K

 

 

K = M ; M= R

 

 

нумерация может быть

!shape(M)≠shape(K)

shape(M)=shape(K)=shape(R)

разная

 

 

 

 

 

 

 

 

 

% 45.

5 ', $

#$

#

 

 

 

 

 

 

 

 

Real,dimension(1:8)::X

Mask – 3-ий аргумент:

Real,dimension(1:8)::X

Print *, sum(X, mask=X>0 )

-надо указать имя mask

Print *, sum(X, X>0 )

Print *, sum(X, 1, X>0 )

-задать после 2-го аргу-

 

 

 

мента

 

 

 

 

 

 

 

Real,dimension(1:8)::X

Real,dimension(1:8)::X

У функции count нет

Print *,count(Array=X,X>0 )

Print *, count( X>0 )

аргумента array

 

 

 

 

 

 

 

 

 

На ошибку

Real,dimension(1:8)::X

Real,dimension(1:8)::X

Size(X(1:4))

Print*,sum(X(1:4),mask=X>0)

Print*,sum(X(1:4),mask=X(1:4)>0)

Size(X)

 

 

 

 

укажет компилятор

 

 

 

 

 

Real,dimension(1:8)::X

Real,dimension(1:8)::X

Size(X(1:N))≠

Size(X)

Real g;

integer N

Real g; integer :: N=4

-

g = sum(X(1:N), mask=X>0 )

g =sum(X(1:N), mask=X(1:N)>0 )

на ошибку

правильно только при N=8

правильно при любом N≤8

N

 

 

 

 

 

 

 

 

 

Integer N

 

Real,dimension(1:8)::A

0 -

 

Integer N

Real,dimension(1:8)::A

! .

N=sum(MinLoc(A))

A.

N= MinLoc(A)

Real,dimension(1:8)::A

 

MinLoc

-

возвращает век-

 

тор, который

не конформен

Integer N; Integer &,

% !:

скаляру N

 

 

dimension(1:1)::Num

N=sum(MinLoc(A))

 

 

Num=MinLoc(A); N=Num(1)

 

 

 

 

126

 

 

 

 

% 46.

 

-

5 ', $

#$

 

Пояснения

 

 

 

 

Real,dimension(1:4,1:3)::M

Integer i

Матрица ошибочно

read(1,*)M

Real,dimension(1:4,1:3)::M

читается по столбцам,

4: читают, как хра-

read(1,*) ( M(i,1:3),i=1,4)

а обычно читают по

нится в памяти – по столбцам

Надо читать по строкам

строкам.

 

 

 

 

 

 

 

 

 

integer i ; Real, &

Матрица

выводится по

Real,dimension(1:4,1:3)::M

dimension(1:4,1:3)::M

столбцам, а надо выво-

write (1,7) M

write (1,7) ( M(i,:),i=1,4)

дить по строкам

 

7 format(3f5.1)

7 format (3 f5.1)

 

 

 

 

 

 

вывод изменен – по строкам

 

 

 

 

 

Real,dimension(1:4,1:3)::M

Real,dimension(1:4,1:3)::M

1-й индекс – строка

write(1,7)(M(i,1:3),i=1,4)

write (1,7) ( M(i,1:3),i=1,4)

2-ой индекс - столбец

7 format (4 f5.1)

7 format ( 3 f5.1)

Перепутали числа: стол-

Ошибочно: 4 –число строк

Надо 3 – число столбцов

бцов 3, а строк 4.

 

 

 

 

 

Real,dimension(1:3,1:3)::K

Real,dimension(1:3,1:3):: K

Матрица K хранится по

read(1,*)K

столбцам. При непра-

read (1,7) (K (i,1:3),i=1,3)

! чтение транспонирует K

вильном вводе и выводе

write (2,7) ( K (i,1:3),i=1,3)

7 format(3 f5.1)

– создается иллюзия

7 format(3f5.1)

write (2,7) K

правильности..

 

 

 

 

 

 

 

 

 

 

+

 

Непра-

 

Правильно

(2 4 )

 

 

+ -

вильно

 

 

 

Real,dimension(1:2,1:4)::A

(2 4 )

левая

 

левая

write(2,7)(A(i,1:2), i=1,2)

Real,dimension(1:2,1:4) :: A

 

4.0

4.0

 

 

4.0

4.0

 

 

 

7 format(‘ ’/2f5.1)

write (2,7)(A(i,1:2), i=1,2)

левая

 

 

4.0

4.0

! перед каждой строкой чи-

7 format(‘ ’/ 2(f5.1) )

4.0

4.0

 

 

4.0

4.0

сел – заголовок

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Вывести левую половину

Вывести левую половину матрицы

Непра-

 

Правильно

матрицы (2 из 4 колонок)

(2 из 4 колонок)

вильно

 

левая

Integer :: N=2

Integer:: N

 

 

 

левая

 

4.0

4.0

Real,dimension(1:2,1:4)::A

Real,dimension(1:2,1:4) ::A

 

4.0

 

 

 

 

4.0

4.0

write(2,7)(A(i,1:2), i=1,2)

N=2;

 

 

 

 

 

4.0

 

 

 

 

7 format(‘левая’/ &

write (2,7)(A(i,1:2), i=1,2)

 

 

 

 

4.0

 

 

 

 

(<N>f5.1))

7 format (‘левая’ / <N>(f5.1) )

 

 

 

 

4.0

 

 

 

 

Ошибка компилятора FPS40

Только так работает в FPS40

 

 

 

 

 

 

 

 

 

127

% 47. & #

5 ', $

#$

#

 

 

 

 

Program

Function (X)

Память под массив-

Real,dimension(:) :: X

real,intent(in),&

аргумент распреде-

Неправильно: в главной: размер-

dimension(:)::X

лена в вызывающей

ность

неизвестна, а надо

Integer N

программе. В проце-

allocatable или константу

N=size(X)

дуре массив не ста-

Function ( N, X )

 

тический, не динами-

Integer,intent(in)::N

В процедуре отложенное (defer-

ческий – он перени-

Real,dimension(1:N) :: X

red) определение размерности.

мает адрес и размер-

нехорошо, размерность N – вели-

N – лучше измерить при помощи

ность у фактического

встроенной функции N=size(X)

аргумента..

 

чина, зависящая от X

 

 

 

 

 

 

Function (X)

Pure Function (X)

 

 

 

 

Real,dimension(:) :: X

 

 

 

 

real,intent(in),&

intent

атрибут

для аргумента X нет

dimension(:)::X

аргумента процедуры

intent(in),

есть pure – будет сообщение

 

 

 

 

но сообщения нет

 

 

 

 

 

 

 

 

 

Program

Function (N)

автоматический

ди-

намический

массив

Integer::N

Integer,intent(in)::N

размещается

авто-

Real,dimension(1:N) :: X

Real,dimension(1:N) :: X

матически при входе,

Размерность статического масси-

Размерность – переменная,

освобождается – при

ва – только константа

только в процедуре

выходе из процедуры

 

 

 

Program unallocated

allocate(y(1:size(x))..

Процедура правиль-

contains

Real,dimension(1:4)::X=1

ная, а в главной за-

subroutine s (x, y)

real,allocatable, &

были allocate

real,intent(in),&

 

dimension(:)::y

В результате видим

 

dimension(:)::X

open(1,file='su.txt')

 

y=

 

 

real,intent(out),&

 

 

 

allocate(y(1:size(x)))

Вместо правильного

dimension(:)::Y

call

s(x,y)

y= 1. 1. 1. 1.

 

y=x

 

write(1,*) 'y=', y

при наличии

 

End subroutine s

 

..

 

allocate

 

 

EndProgram unallocated

 

 

 

 

 

 

 

Program unallocated

allocate(y(1:size(x)))

 

 

 

 

Real,dimension(1:4)::X=1

.. contains

 

 

 

 

real,allocatable, &

subroutine s(x,y)

Процедура правиль-

 

dimension(:)::y

real,intent(in),&

ная, а в главной за-

open(1,file='su.txt')

dimension(:)::X

были allocate.

 

! allocate(y)

real,intent(out), &

В результате массив

call

s(x,y)

dimension(1:size(x))::y

y имеет неопреде-

write(1,*) 'y=',y

Y=X

ленный адрес.

 

contains

End subroutine s

 

 

 

 

..

 

endProgram unallocated

 

 

 

 

 

 

 

 

 

 

Function si(X)

Function si(X)

массивоподобной

 

Real :: si

real,dimension(:) :: si

 

функции забыли дать

real,intent(in),&

real,intent(in),&

атрибут

массива

dimension(:)::X

dimension(:)::X

dimension

 

 

si=sin(X)

si=sin(X)

 

 

 

 

 

 

128

8.4. # " ' ,

Allocatable – ↓ allocate !

deallocate – ! !

Array – , Array(1:7:2) –

Assignment

Associate[F03] - ! ..

BackSpace – 1 !

Call SubrName

Case CaseDefault – .

Select Case

Character – ,

Close – !

Common – * –

Compiling

Complex – ,

Contains

Declarations – 3

Descriptors i f e l a g #

Cycle +* #

Dimension – !

Double Precision - !

DoEndDo 3 : $

Do i =1,9,2 ... End Do i Do While( ) –

Exit #

End – , enddo Enum [F03] – !, ООП Equivalence +

Expression -

Exponentials – !

extends[F03] , ООП

External Intrinsic

Forall [F95] – !

Format - -

Statement Function -

Function – -

GoTo – #,

If( )then 0,1,2..

Else Elseif()then »

End If #- - IF

Implicit None – , !

Initializing- real::x=5.2

Data /.. /– ,

Inquire

Integer – ,

Intent(in)|(out)|(inout) – #|#

Interface – .. Labels - 1:99999 Logical – ,

Module – !

Namelist – -

Nullify – ! !

Open – !

Optional – !

Operator – . ,

Parameter

Pause – –

Pointer – !

Print – ! (.) Procedure

Program

Private – ! 3

Public – 3

Pure

Quadruple – ́ ́

Read

Real – * ,

Return

Rewind

Save – # !

Single Precision – !

Statement

Stop

Subroutine – -

Target pointer

.true. .false. .and. .or.

.not. .eqv. .neqv.

Type .. endType -

Type( ) .. %

Union..endUnion map-

Map - -

Use – ! ! !

Where – ! IF

Write – ! , !

[..] (/ .. /) –

& Continuation Lines

! Comment

«;» <Enter> – Fortran

129

1.5 . ., F ! 0.8., 6 .0. '

. - '.: ' 64 %"&, 2010 - 134 .

2.8 .(., / ! . . ' Visual Fortran – ".: ( ", 2008 - 472 .

3.8 , . . FORTRAN: . - ".: ( ", 2007 - 304 .

4.6 8.". ' . ".: -

, 2006. 352 .

5.G. . . , / , 2004 - 288 .

6.0 + .8., &. . . , 2), 2003

-496 .

7.2 ! &. . & % 80 . ": ( ", 1999 - 400 .

8.6 .0., 5 . ., .8., H G.8., F ! 0.8. ' . -': - - ' # -(% # ), 2001 - 94 .

9.G. . ' Power Station

– , /& &08 , 1999 - 160 .

10.' 77: '. ./ (. 8,.$ , .', 6.4. - ".: !, 1990 - 272 .

11.& % 80 90. " . '. . – ".:

, 1998 - 416 .

12."-/ (., ( 4. -

.– 2- .: '. . – ".: ", 1977 – 584 .