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

2. Элементы программирования

2.1. Алгоритм и программа

Программа выполняет на ЭВМ некоторую последовательность действий, в результате чего должны получаться необходимые результаты. Для составления программы прежде необходимо уяснить суть задачи, а затем уже описать действия, после выполнения которых будут получены сформулированные в задаче цели. Иными словами, необходимо составить алгоритм решения задачи.

Рассмотрим простой пример. Пусть надо составить таблицу значений функции y = x*sinx на отрезке [a, b] с шагом dx. Для решения задачи необходимо выполнить следующие действия:

1°. Начало.

2°. Ввести значения a и b границ отрезка и шаг dx.

3°. Задать x - начальную точку вычислений, приняв x = a. 4°. Пока x b, выполнять:

вычислить значение функции y в точке x: y = x*sinx; вывести значения x и y;

перейти к следующей точке отрезка: x = x + dx. конец цикла 4:

5°. Конец.

Четвертый пункт алгоритма предусматривает повторное выполнение вычислений y для разных значений аргумента x. Такое повторное выполнение однотипных действий называется циклом. Приведенный цикл завершится, когда значение x превысит b - правую границу отрезка.

Для составления программы, выполняющей предусмотренные алгоритмом действия, надо перевести отдельные шаги алгоритма на язык программирования. Если буквально следовать приведенному алгоритму, то мы получим программу:

read *, a, b, dx

! Выполняем 2-й шаг алгоритма

x = a

! Выполняем 3-й шаг алгоритма

do while(x <= b)

! Выполняем 4-й шаг алгоритма

y = x*sin(x)

! Вывод x и y

print *, x, y

x = x + dx

 

end do

! Конец цикла

end

! Завершаем программу

Однако, хотя программа записана правильно, работать с ней практически невозможно. Предположим, что вы все же запустили программу для вычислений. Тогда перед вами окажется черный экран, глядя на который вам придется догадаться, что нужно ввести 3 числа. Предположим, что вы догадались и, угадав затем порядок ввода, набрали 0,

26

2. Элементы программирования

1, 0.1. Тогда после нажатия на Enter перед вами появятся два столбика с цифрами и опять придется угадывать, что за числа в них расположены. Запустив эту программу через неделю, вы, конечно, уже ничего не вспомните.

Поэтому нам следует придать программе некоторые иные, не предусмотренные первоначальным алгоритмом свойства. Так, нужно создать диалог для ввода данных, нужно пояснить, каким объектам принадлежат выводимые на экран значения. Иными словами, нужно создать некоторый интерфейс между пользователем и программой. Нужно также проверить правильность ввода данных: левая граница должна быть меньше правой, а шаг dx должен быть больше нуля (в противном случае мы можем получить бесконечный цикл, например если a < b и dx 0). Вводя подобные проверки, мы повышаем надежность программы. Можно предусмотреть и другие повышающие качество программы мероприятия.

Помимо добавлений таких рабочих характеристик полезно увеличить и требования к оформлению программы: дать программе имя, объявить типы применяемых в вычислениях переменных, привести исчерпывающий комментарий. Можно выполнить запись операторов, имен встроенных процедур и других элементов Фортрана прописными буквами, а запись введенных пользователем имен - строчными. При записи фрагментов программы, например управляющей конструкции DO WHILE ... END DO, следует использовать правило рельефа, состоящее в том, что операторы DO WHILE и END DO начинаются с одной позиции, а расположенные внутри этой конструкции операторы смещаются на одну-две позиции вправо по отношению к начальной позиции записи DO WHILE и END DO. Еще одно полезное правило: после запятой или иного разделителя в тексте программы следует проставлять пробел, т. е. поступать так же, как и при записи текста на родном языке. После ряда дополнений мы можем получить программу:

program txy

! Заголовок программы

real a, b, dx, x, y

! Объявление имен и типов переменных

real :: dxmin = 1.0e-4

 

print *, 'Ввод границ отрезка и шага вычислений'

print *, 'Левая граница: '

! Выводим подсказку для пользователя

read *, a

! Вводим с клавиатуры значение a и

print *, 'Правая граница: '

! нажимаем на Enter. Так же вводятся

read *, b

! другие данные

print *, 'Шаг вычислений: '

 

read *, dx

 

if(dx < dxmin) stop 'Ошибка при задании шага'

x = a

! Выполняем 3-й шаг алгоритма

do while(x <= b)

! Выполняем 4-й шаг алгоритма

y = x*sin(x)

! При записи цикла используем правило рельефа

print *, 'x = ', x, ' y = ', y

 

27

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

x = x + dx

 

end do

! Завершаем программу txy

end program txy

Замечание. CVF и FPS обладают специальной библиотекой процедур DIALOGM, предназначенных для создания диалоговых окон В/В данных. Технология создания диалогов средствами DIALOGM рассмотрена в [1].

Предположим, однако, что после ввода a = 0, b = 1 и dx = 0.1. Тогда для значений x, равных, например, 0.3, 0.4 и 0.5, будет выведен результат:

x =

3.000000E-01

y =

8.865607E-02

x =

4.000000E-01

y =

1.557673E-01

x =

5.000000E-01

y =

2.397128E-01

Каждая выводимая на экран строка является в нашем примере отдельной записью.

Результат вывода понятен, но не очень нагляден. Форму его представления можно улучшить, применив форматный вывод, т. е. задав некоторые правила преобразования выводимых данных. Такие правила задаются дескрипторами преобразований (ДП). Для вывода заключенной в кавычки последовательности символов используем дескриптор A, а вывод значения x выполним на поле длиной в 5 позиций, располагая после десятичной точки две цифры. Для этого нам понадобится дескриптор F5.2. При выводе y используем дескриптор F6.4. Тогда оператор вывода x и y примет вид:

print '(1x, a, f5.2, a, f6.4)', 'x = ', x, ' y = ', y

Результат для тех же значений x будет выглядеть уже более наглядно:

x = .30

y = .0887

x =

.40

y =

.1558

x =

.50

y =

.2397

Заметим сразу, что список ДП открывает дескриптор 1X, который означает задание одного пробела, предваряющего выводимый текст. В FPS при форматном выводе это необходимо, поскольку первый символ каждой записи не печатается и рассматривается как символ управления кареткой. В CVF такой интерпретации первого символа не выполняется и дескриптор 1X можно опустить.

Можно также улучшить и фрагмент программы, предназначенный для ввода данных. Если вы запустите программу, то обнаружите, что после вывода каждой подсказки курсор смещается на начало новой строки. Иными словами, выполняется переход на начало следующей записи. Такого перехода можно избежать, если использовать при выводе подсказки форматный вывод и применить в нем для вывода строки дескриптор A, а вслед за ним дескриптор $ или \ или спецификатор ADVANCE = 'NO'. Правда, последняя опция применима лишь в операторе вывода WRITE.

28