Пиши Дома Нужные Работы

Обратная связь

Парафлоид – один оператор вместо двадцати

В этом разделе показан более сложный пример вычисления парафлоида -квадратной матрицы минимальных расстояний между вершинами ориентированного графа с взвешенными дугами. Граф задан квадратной матрицей инцидентности. Строки и столбцы матрицы соответствуют вершинам графа. Инцидентные дуги соответствуют положительным компонентам матрицы. Схематично показано вычисление меры близости вершин графа по методу Флойда.

Таблица 29.

Пример вычисления парафлоида в операторе forall

A J  
i parafloid(i,j) = minval( A(i,:)+A(:,j) ) A(i,:)- строка i
  A(:,j)- столбец j  

С целью упрощения на схеме не показаны условия положительной определенности, дополнительно прописанные в оператореforall.

 

Парафлоид - единственный выполняемый оператор
program parafloida

Implicit none

integer,parameter:: N=10

! A - взвешенная входная матрица инцидентности

integer,dimension(1:n,1:n) :: A=1, parafloid

! парафлоид parafloid - выходная матрица мин. расстояний

integer i,j

forall( i=1:n, j=1:n, i/=j ) &

parafloid(i,j) = minval( A(i,:)+A(:,j), &

mask = A(i,:)>0 .and. A(:,j)>0 )

write(6,1) (parafloid(i,:),i=1,n)

1 format(1x,<n>i3)

end program parafloida

Попробуйте написать программу paraseqva с помощью традиционных конструкций – и Вы увидите, что она будет на порядок сложнее: вместо одного оператора - программа из 20 операторов.


 

program paraseqva ! взвешенная входная матрица инцидентности

Implicit none

integer,parameter:: N=10

integer,dimension(1:n,1:n) :: A=1, parafloid

! парафлоид - выходная матрица мин. расстояний

integer i,j

integer,dimension(1:n) :: str,stlb, summa

integer parafloidMin,i1

open(6,file='parafloid.txt')

do i=1,N

A(i,i)=0

Enddo

do i=1,N

do j=1,N

if(i/=j) then

parafloidMin = huge(0) ! #7fffffff

do i1=1,N

str=A(i,i1); stlb=A(i1,j); summa(i1)=str(i1)+stlb(i1)

Enddo

do i1=1,N

if(str(i1)==0 .or. stlb(i1)==0) cycle

if(summa(i1)<parafloidMin) parafloidMin = summa(i1)



Enddo

parafloid(i,j) = parafloidMin

Else

parafloid(i,j) = 0

Endif

Enddo

Enddo

write(6,1) (parafloid(i,:),i=1,N)

1 format(1x,<N>i3)

end program paraseqva

Пример парафлоида – многогранный:

- A(i,:)- i-ая строка и A(:,j)- j-ый столбец заданы секциями двумерного массива, образующими векторы;

- конформные векторы A(i,:)иA(:,j)- суммируются A(i,:)+A(:,j), образуя новый вектор положительно определенных крестообразных сумм;

- из сумм выбирается минимум при помощи итоговой функции minVal, формируя элемент парафлоида;

- forall задаёт перебор в пространстве секции, совпадающей с положительно определёнными недиагональными элементами матрицы;

- данныйforall имеет объём вычислений, пропорциональный O (N3).

Ввод и вывод в Фортране

Ввод и вывод осуществляется операторами readиwrite (по-русски «читаем/пишем»). После операторов read и write в скобках записываются аргументы. Первый аргумент (целое) – условный номер устройства, с которого/на который осуществляется ввод/вывод. Всегда открыта для ввода/вывода консоль, имеющая номер 0 или обозначаемая символом «*».

Второй аргумент – ссылка на формат ввода/вывода. Символ «*» в качестве второго аргумента означает, что ввод/вывод выполняется без формата. Бесформатную форму чаще всего применяют при вводе и для отладочной печати. Если важны не только сами значения, но и форма их представления, то используют форматный вывод.

Бесформатный ввод/вывод

Бесформатный ввод/вывод выполняется под управлением списка

read(u,*) список_переменных

write(u,*) список_переменных_констант_выражений

Пример: прочитать переменные p и k и вывести их для контроля:

integer k; real p

read(1,*)p, k ; write (2,*)’p=’, p, ’k=’, k

Обмен данными происходит в порядке следования элементов списка. В операторе read с устройства №1 читается сначала p, потом k. В операторе write на устройство №2 в одной строке выводятся последовательно: надпись «p=», значение p, надпись «k=», значение k.

Данные для ввода подготавливают через запятую, пробел или <Enter> – конец строки. Запись одинаковых чисел упрощает повторитель, например 8,8,8,8,8,8,8, легче записать как 7*8 (в данном случае «7*» – это повторить 7 раз следующее число).

Ввод/вывод по списку переменных, с каждой как «p= значение_p»:
Namelist /имя_Namelist / список_переменных ! подробности – в помощи
read
(u,имя_Namelist) или write(u,имя_Namelist)

Форматный вывод

Вывод без формата, применимый при отладке программ, дискомфортен для пользователя. Для создания привлекательного программного продукта требуется максимум внимания уделить оформлению результатов. Сочетая гибкость и математическую строгость, форматный вывод тут незаменим.

Фортран выгодно отличается от других языков тем, что ввод и вывод – операторы языка, и можно выверить форматы еще при компиляции. Концепция форматного вывода Фортрана настолько продуманна, что практически не изменялась с момента его появления. Формат размещают в любом месте программы и пишут следующим образом

m format(СД), где m – метка, по которой один или несколько операторов write ссылаются на оператор format, СД – список дескрипторов.


 

Пример:

real radius = 1

Open (2, file=’Out.txt’)

write(2,55) 2*3.14*radius

55 format(1x,'длина окружности'/2x,'с=',F5.2)

Здесь оператор write, используя оператор format с меткой 55, выводит в файл Out.txt две строки (символ «˜» означает пробел)

длина окружности

˜˜c=˜6.28

Дадим разъяснения:

– «длина окружности» и «с=» – пояснительные надписи;

- символ «/» – признак перехода к новой строке при выводе;

- 2x – 2 пробела,

- F5.2 – поле вещественного числа шириной в пять позиций с двумя цифрами, выводимыми после десятичной точки.

Уникальный СД может быть записан непосредственно внутри оператора write в виде строковой переменной или константы, например,

write(2, "(1x,'c=',F5.2 ) ") c

Внимание!Такой СД не контролируется компилятором, и ошибки выявятся на этапе счета, в отличие от использования оператора format.

Независимо от того, где СД записан – в операторе format или в операторе write, должны соблюдаться следующие правила:

1. СД заключен в скобки, элементы СД разделены запятыми или символом «/» по концу выводимой строки;

2. повторяющуюся последовательность дескрипторов заменяет повторитель, записанный перед дескриптором; например, вместо i4,i4 пишут 2i4;

3. повторяющуюся группу дескрипторов заменяет повторитель, записанный перед скобками, заключающими эту группу; например, вместо 1x,i4,i4,i4, 1x,i4,i4,i4 пишут 2(1x,i4,i4,i4) или, еще короче, 2(1x,3i4).

4. Все повторители, ширины полей – это явные натуральные константы или целочисленное выражение в угловых скобках < >;

5. дескрипторы в Фортране обозначены одной, реже двумя латинскими буквами, и подразделяются на:

- дескрипторы числовых данных I, F, E, D и универсальные G, Z;

- дескрипторы нечисловых данных A, L, и универсальные Z, G;

- оформительские дескрипторы: ”текст”, ’текст’, X, P, SS, SP, T, TR, TL, «:», «\», «/».


 

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

Таблица 30.

Тип Дескрипторы Примеры
integer k iw write(1,"(1x,I5)")k
real x Fw.d - без порядка Ew.d - с порядком Gw.t - с порядком и без write(1,"(1x,F7.2)")x write(1,"(1x,E11.2)")x write(1,"(1x,G11.2)")x
double precision d Dw.d - двойная точность write(1,"(1x,D20.13)")b

Пояснения к форматному выводу чисел:

1. w-общая ширина поля, задаваемая по усмотрению программиста, число будет прижато к правому краю и дополнено слева пробелами, если число не поместится в отведенное поле, то увидим «*****»;

2. для вещественных чисел количество цифр задается параметрами:

d – сколько цифр после десятичной точки в дескрипторах F, E, D;

t – сколько значащих цифр в универсальном дескрипторе Gw.t, компьютер «решит», выводить число с порядком, как E или без как в F;

3. для вывода чисел с большим по модулю или неизвестным порядком рекомендуется применять E, D, G.

Выводимая строка прижимается к левому краю поля.

Таблица 31.

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






ТОП 5 статей:
Экономическая сущность инвестиций - Экономическая сущность инвестиций – долгосрочные вложения экономических ресурсов сроком более 1 года для получения прибыли путем...
Тема: Федеральный закон от 26.07.2006 N 135-ФЗ - На основании изучения ФЗ № 135, дайте максимально короткое определение следующих понятий с указанием статей и пунктов закона...
Сущность, функции и виды управления в телекоммуникациях - Цели достигаются с помощью различных принципов, функций и методов социально-экономического менеджмента...
Схема построения базисных индексов - Индекс (лат. INDEX – указатель, показатель) - относительная величина, показывающая, во сколько раз уровень изучаемого явления...
Тема 11. Международное космическое право - Правовой режим космического пространства и небесных тел. Принципы деятельности государств по исследованию...



©2015- 2024 pdnr.ru Все права принадлежат авторам размещенных материалов.