Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
современный фортран , Бортеньев.pdf
Скачиваний:
242
Добавлен:
26.03.2015
Размер:
2.34 Mб
Скачать

О. В. Бартеньев. Современный ФОРТРАН

do 24, while(k .le. 100)

! После метки можно поставить запятую

if(a(k) .lt. 0) sa = sa + a(k)

 

k = k + 1

! Конструкцию завершает метка END DO

24 end do

! Вариант 5

 

k = 1

 

sa = 0

 

do 25 while(k .le. 100)

 

if(a(k) .lt. 0) sa = sa + a(k)

 

k = k + 1

! Конструкцию завершает метка CONTINUE

25 continue

!Вариант 6 k = 1

sa = 0

do 26 while(k .le. 100) if(a(k) .lt. 0) sa = sa + a(k)

!Конструкцию завершает метка исполняемый оператор

26 k = k + 1

Замечания:

1.После метки в предложении DO и DO WHILE может стоять запятая, что проиллюстрировано первым и четвертым циклами.

2.Оператор CONTINUE является пустым, ничего не выполняющим оператором и может появляться где угодно среди исполняемых операторов.

3.В случае вложенных DOили DO WHILE-циклов два или более DOили DO WHILE-цикла могут иметь общую завершающую метку. Правда, END DO может завершать только один DOили DO WHILE-цикл.

7.5. Возможные замены циклов

Фортран 90 позволяет в задачах с массивами, где ранее использовались циклы, применять более лаконичные и эффективные средства. К ним относятся:

встроенные функции для работы с массивами;

операторы и конструкции WHERE и FORALL (разд. 4.7);

сечения массивов.

Проиллюстрируем сказанное примерами.

Пример 1. Найти строку матрицы с максимальной суммой элементов.

integer, parameter :: m = 10, n = 20

 

integer kmax(1)

! Номер искомой строки матрицы

real a(m, n)

 

<Ввод матрицы a>

 

kmax = maxloc(sum(a, dim = 2))

! Функция возвращает массив

print *, kmax

 

212

! Переносим в c отрицательные элементы a

7. Управляющие операторы и конструкции

Пример 2. Заменить в векторе b все отрицательные элементы нулями.

integer, parameter :: n = 100 real b(n)

<Ввод вектора b>

 

where(b < 0) b = 0

! Замена отрицательных элементов нулями

Пример 3. Поменять местами в матрице a первую и последнюю строки.

integer, parameter :: m = 10, n = 20 real, allocatable :: temp(:)

real a(m, n)

<Ввод матрицы a> allocate(temp(1:n)) temp = a(1, 1:n) a(1, 1:n) = a(m, 1:n) a(m, 1:n) = temp deallocate(temp)

!Выделяем память под temp

!Запомним строку 1 в массиве temp

!Пишем в строку 1 строку m

!Пишем в строку m из temp

!Освобождаем память

Пример 4. Сформировать вектор c из отрицательных элементов матрицы a.

integer, parameter :: m = 5, n = 4 integer k

real, allocatable :: c(:) real a(m, n)

<Ввод матрицы a>

k = count(a < 0) ! Число отрицательных элементов в a if( k == 0 ) stop 'В матрице a нет отрицательных элементов' allocate( c(k) )

c = pack(a, a < 0)

Пример 5. Вывести построчно двумерный массив. integer, parameter :: m = 5, n = 3

integer i

! Элементы матрицы размещены в памяти по столбцам

integer a(m, n) / 1, 2, 3, 4, 5,

&

1, 2, 3, 4, 5,

&

1, 2, 3, 4, 5 /

 

do i = 1, m

! Помещаем в список вывода сечение массива

print '(100i3)', a(i, 1:n)

 

end do

 

В последнем примере вместо неявного цикла (a(i, j), j = 1, n) в списке вывода присутствует сечение массива, которое так же, как и неявный цикл, задает отдельную строку массива. Аналогичным образом сечение массива можно использовать и при вводе.

Однако замены циклов сечениями не всегда возможны. Это прежде всего касается циклов, в которых результат итерации зависит от результата предыдущей итерации. Так, цикл

213

О. В. Бартеньев. Современный ФОРТРАН

do i = 2, n

a(i) = a(i - 1) + 5.0 end do

нельзя заменить присваиванием a(2:n) = a(1:n - 1) + 5.0

или конструкцией

forall(i = 2:n) a(i) = a(i - 1) + 5.0

7.6. Оператор STOP

Оператор прекращает выполнение программы. Имеет синтаксис: STOP [сообщение]

Сообщение - символьная или целочисленная константа в диапазоне от 0 до 99999. Если сообщение отсутствует, то после выполнения оператора выводится строка

STOP - Program terminated.

Если сообщение является символьной константой, то:

выводится сообщение;

программа возвращает 0 в операционную систему. Если сообщение является числом, то:

выводится предложение Return code число. Например, если применен оператор STOP 0400, после завершения программы будет выведено предложение Return code 0400;

программа возвращает в операционную систему последний значащий байт целого числа (значения от 0 до 255) для использования программой, проверяющей значения статусов выполняемых процессов.

Пример:

open(2, file = 'b.txt', status = 'old', iostat = icheck) if(icheck .ne. 0) then

stop 'File access denied.' end if

7.7. Оператор PAUSE

Оператор временно приостанавливает выполнение программы и позволяет пользователю выполнить команды операционной системы. Имеет синтаксис:

PAUSE [сообщение]

Сообщение - символьная или целочисленная константа в диапазоне от 0 до 99999. Если сообщение отсутствует, то после выполнения оператора выводится строка

Please enter a blank line (to continue) or a system command.

214

7. Управляющие операторы и конструкции

После выполнения оператора PAUSE возможны следующие действия:

если пользователь вводит пробел, то управление возвращается программе;

если пользователь вводит команду, то выполняется команда и управление возвращается программе. Максимальный размер задаваемой на одной строке команды составляет 128 байт;

если введено слово COMMAND или command, то пользователь может выполнить последовательность команд операционной системы. Для возврата в программу потребуется ввести EXIT (прописными или строчными буквами).

Пример:

character(30) filename

pause 'Enter DIR or press Enter to return.' read(*, '(a)') filename

open(1, file = filename)

Замечание. Стандартом 1995 г. оператор PAUSE исключен из Фортрана. Однако он по-прежнему поддерживается и CVF и FPS.

215