Главная страница

Курс лекций по дисциплине Программирование на языке Фортран


Скачать 0.98 Mb.
НазваниеКурс лекций по дисциплине Программирование на языке Фортран
Дата02.09.2019
Размер0.98 Mb.
Формат файлаdoc
Имя файлаFortran01.doc
ТипКурс лекций
#85698
страница6 из 15
1   2   3   4   5   6   7   8   9   ...   15
.

SCALE(X,I) – возвращает вещественное значение с параметром типа как у Х, равное Xbi, где b – основание в модели для Х, i – аргумент целого типа.

SET_EXPONENT(X,I) – возвращает вещественное значение с параметром типа, как у Х, дробная часть которого равна дробной части модельного представления Х, а степенная часть равна i, т.е. Xbi-e.

SPACING(X) – возвращает вещественное значение с таким же параметром типа, как у Х, равное абсолютному расстоянию между числами модели в области Х, т.е. be-p.

Процедуры для работы с битами

Целое число содержит S битов Wk, k=0, 1, ...,S-1 считая справа налево. Прообраз этой модели – неотрицательная величина .

BIT_SIZE(I) – сообщает сколько битов требуется для битовой модели целого числа с таким же параметром типа, как у I. Результат – целая величина.

BTEST(I,POS) – возвращает логическое значение .TRUE., если бит с номером POS целого аргумента I имеет значение 1 и .FALSE. в противном случае. POS – целый.

IAND(I,J) – возвращает логическое И между соответствующими битами аргументов I и J согласно таблице:


I

1

1

0

0

IEOR(I,J) – то же по таблице.

IOR(I,J) - то же по таблице.

NOT(I) – возвращает логическое дополнение к битам аргумента I, согласно таблице.


J

1

0

1

0

IAND(I,J)

1

0

0

0

IEOR(I,J)

0

1

1

0

IOR(I,J)

1

1

1

0

NOT(I)

0

0

1

1

Функции для умножения векторов и матриц

DOT_PRODUCT(Vector_A,Vector_B) – воспринимает в качестве аргументов одномерные массивы одинакового размера. Возвращает SUM(Vector_A*Vector_B), если Vector_A относится к целому или вещественному типу, SUM(CONJG(Vector_A)*Vector_B), если Vector_A комплексного типа, и ANY(Vector_A.AND.Vector_B), если Vector_A – логического типа.

MATMUL(Matr_A,Matr_B) – выполняет умножение матриц.

А) Matr_A – (n,m), а Matr_B – (m,k). Тогда результат имеет форму (n,k), а значение элемента (i,j) равно SUM(Matr_A(i,:)*Matr_B(:,j)).

Б) Matr_A – (m), а Matr_B – (m,k). Результат имеет форму (k), а значение элемента (j) равно SUM(Matr_A*Matr_B(:,j)).

В) Matr_A – (n,m), Matr_B – (m). Результат имеет форму (n), а значение элемента (i) равно SUM(Matr_A(i,:)*Matr_B).

В случае логических аргументов формы будут такими же, как и для числовых аргументов, а значения определяются приведенными выше выражениями с заменой в них «SUM» на «ANY» и «*» на «.AND.».

ALL(M) – возвращает логическое значение истина, если все элементы логического массива М истинны или его размер равен нулю, иначе возвращается значение ложь.

ANY(M) – возвращает логическое значение истина, если хотя бы один из элементов логического массива М является истинным, и значение ложь, когда ни один из элементов логического массива М не является истинным или размер массива равен нулю.

COUNT(M) – возвращает целую величину, равную числу элементов логического массива М, имеющих значение истина.

MAXVAL(A) (MINVAL(A)) – возвращает максимальное (минимальное) значение элемента целого или вещественного массива А.

PRODUCT(A) – возвращает произведение элементов целого, действительного или комплексного массива. Если размер массива А ноль, то выдается значение 1.

SUM(A) – возвращает сумму элементов целого, вещественного или комплексного массива. Если размер A=0, то значение равно ноль. П: SUM(A,Mask=A>0) – просуммирует положительные элементы массива А. Mask влияет только на значение функции и не оказывает влияния на вычисление аргументов, представляющих собой выражения-массивы.

Справочные функции для массивов

ALLOCATED(Array) – возвращает значение .TRUE., если выделяемый массив Array в данный момент выделен, и .FALSE. – иначе.

LBOUND(AR[,DIM]) – если DIM отсутствует, то возвращается стандартный целый одномерный массив, содержащий нижние границы. Если аргумент DIM задан, то он должен быть целым скаляром, а результатом будет стандартный целый скаляр, содержащий нижнюю границу индекса DIM.

SHAPE(Source) – возвращает стандартный целый одномерный массив, содержащий форму массива или скаляра Source. В случае скаляра результат равен нулю.

SIZE(Array[,DIM]) – возвращает скалярное стандартное целое, равное размеру массива Array или, если присутствует скалярный целый аргумент DIM, размеру экстента по индексу DIM.

UBOUND(Array[,DIM]) – подобна LBOUND, но возвращает верхние границы.

MERGE(TS,FS,MASK) – аргумент TS может иметь любой тип, при этом FS обязан иметь такой же тип и параметры типа. Аргумент MASK должен быть логического типа. Результат равен TS, если MASK имеет истинное значение, и FS – иначе. Применяется, обычно, для случая 3-х аргументов-массивов, имеющих одну и ту же форму, когда TS и FS сливаются под управлением MASK.

PACK(AR,MASK[,Vector]) – если Vector отсутствует, возвращается одномерный массив, содержащий элементы AR, соответствующие истинным элементам MASK, в порядке их следования. MASK может быть и скаляром со значением истина – тогда будут выбраны все элементы AR. Если Vector задан, то это должен быть одномерный массив того же типа и с такими же параметрами типа, как у Array.

Пропущено. См. конспект2

TRANSPOSE(Matrix) – возвращает массив того же типа и с такими же параметрами типа, как у двумерного массива Matrix. Элемент (i,j) результата равен Matrix(j,i) (т.е. транспонирование матрицы двумерного массива).

MAXLOC(Array[,MASK]) (MAXLOC(Array[,MASK])) – находят положение максимальных и минимальных значений в целом или вещественном массиве.


Пример кода

Пример кода

! Программа перевода целой константы в числа в символьном виде

integer number /3946790/

character*7 string

call numchar(number,7,string)

write(5,*) 'Число в символьном виде ',string

end

subroutine numchar(n,m,c)

integer n ! исходное число

integer m ! количество цифр

character c ! выходная строка

integer i,j,k,l

character*1 c1 ! вспомогательная переменная

k=n ! исходное числовое значение

do i=m,1,-1 ! текущая позиция с конца

l=k/10 ! целое частное

j=k-10*l ! очередная цифра=остатку от деления

k=l ! новое делимое

c1=char(j+48) ! перевод цифры в символ (код 0: 48,1: 49 и т.д.)

c(i:i)=c1 ! включение в ответную строку

end do

end

! Программа подсчета суммы цифр числа

Character*80 num

Integer Length, Sum, i, Code

Write(5,*) 'Введите число'

Read(5,'(\A)') num

Length=Len_trim(num)

Sum=0

do i=1,Length

Code=Ichar(num(i:i))-48

if (Code.Gt.0.and.Code.Le.9) Sum=Sum+Code

end do

Write(5,*) 'Сумма цифр',Sum

End

Примечание. Строчные буквы в таблице ASCII расположены после прописных. Для получения ASCII-кода прописной буквы по известному коду строчной достаточно вычесть из кода строчной буквы dco=ichar(‘z’)-ichar(‘Z’)

Обратный слеш в формате оператора Read – подавление символа начала новой строки, т.е. ввод продолжается в той же строке



implicit none ! Запрещение неявного объявления

! Программа открытия файла и построчного считывания с него текста заданной ширины (20 позиций)

integer out,scr,i

integer n ! Количество строк в файле

integer check ! Контроль открытия файла

parameter(out=3,scr=5)

character*20 id(100) ! Можно использовать оператор allocate

! для динамического задания массива размерностью n

character*1 ch ! Управляющий символ

character*12 fname ! Имя файла

logical existent ! Переменная существования файла
9 write(scr,*)'Данные вводить из файла (Y/N)?'

read(scr,'(a\)')ch

if (ch.eq.'y'.or.ch.eq.'Y') then

10 write(scr,*)'Введите имя файла исходных данных (Ctrl+Break - выход)'

read(scr,'(a\)')fname

inquire(file=fname,exist=existent) ! Запрос о существовании файла

if (.not.existent) then ! Ниже - обрезание хвостовых пробелов

write(scr,*)'Файл ',fname(:len_trim(fname)),' не найден'

goto 10

end if

! Считывание поля шириной 20 символов. Исходные данные считываются

! в символьном виде!

check=0 ! Начальное значение

open(out,file=fname,err=11,iostat=check)

i=0

do while(.not.eof(out))

read(out,*) ! Фиктивное построчное считывание

i=i+1 ! Подсчет количества строк в файле

end do

n=i

write(scr,'(1x,a,i2)')'Количество строк n=',n

rewind(out) ! Репозиционирование считывания

read(out,'(100(a20/))') (id(i),i=1,n-1) ! Считывание в массив

close(out)

! Построчный вывод считанных данных на экран

write(scr,'(100(a/:))') (id(i),i=1,n) ! : - обрыв формата при окончании списка вывода

11 if(check.ne.0) write(scr,*)'Ошибка при открытии файла'

else if (ch.eq.'n'.or.ch.eq.'N') then

write(scr,*)'Ввод с клавиатуры...'

else

write(scr,*)'Неверно введен символ. Повторите ввод...'

goto 9

end if

read*

end

Для того чтобы считать значения вещественного типа, необходим массив id вещественного типа и соответствующая строка формата при считывании:

read(out,'(100(g20.5/))') (id(i),i=1,n-1) ! Считывание в массив

Ограничение ширины поля считывания особенно полезно при считывании значений, т.к. можно добавить необходимые примечания в файл


! File: Triang_.for

! Программа определения площади, статического момента, осевого момента инерции и

! центробежного момента инерции произвольной фигуры (составленной из

! треугольников) относительно произвольных осей

implicit NONE

Integer n

Integer i,j

Real A,Sx,Ix,Ixy

Real tmp

real F [ALLOCATABLE](:) ! Площади треугольника

real x [ALLOCATABLE](:,:)

real y [ALLOCATABLE](:,:)

write(5,*)'Введите количество треугольников'

Read (5,*)n

allocate (F(n),x(n,6),y(n,6))

write(5,*)'Введите координаты углов треугольников (x,y)'

do i=1,n

write(5,'(A,i3)')' Треугольник ',i

do j=1,3

write(5,'(2(A,i1,A))')' x(',j,')','y(',j,')'

read(5,*) x(i,j),y(i,j)

end do

end do

do i=1,n

F(i)=0. ! Обнуление

end do

! Площадь фигуры

A=0.

do i=1,n

F(i)=F(i)+x(i,1)*y(i,2)+x(i,2)*y(i,3)+x(i,3)*y(i,1)-

> x(i,1)*y(i,3)-x(i,2)*y(i,1)-x(i,3)*y(i,2)

F(i)=0.5*F(i)

A=A+F(i)

end do

write(5,*)'Площадь фигуры',abs(A)

do i=1,n

y(i,4)=0.5*(y(i,1)+y(i,2))

y(i,5)=0.5*(y(i,1)+y(i,3))

y(i,6)=0.5*(y(i,2)+y(i,3))

end do

! Статический момент, осевой и центробежный

Sx=0. ! Тестовый пример. начало координат в левом нижнем углу

Ix=0. ! прямоугольника 2х3

Ixy=0. ! Координаты: (2,0) (0,0) (0,3);(0,3) (2,3) (2,0)

do i=1,n ! A=6, Ix=b*h**3/3=18, Sx=1.5*6=9

tmp=abs(F(i)/3.)

Sx=Sx+tmp*(y(i,4)+y(i,5)+y(i,6))

Ix=Ix+tmp*(y(i,4)**2+y(i,5)**2+y(i,6)**2)

Ixy=Ixy+tmp*(x(i,4)*y(i,4)+x(i,5)*y(i,5)+x(i,6)*y(i,6))

end do

write(5,*)'Статический момент',Sx

write(5,*)'Осевой момент',Ix

write(5,*)'Центробежный момент',Ixy

Read*

End
Геометрические характеристики треугольника получены методом численного интегрирования с использованием весовых коэффициентов для точек.

Число точек к=6, степень полинома n=2, весовые коэффициенты: 1=2=3=0, 4=5=6=F/3. , где , , .

,
1   2   3   4   5   6   7   8   9   ...   15


написать администратору сайта