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

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

varname = выражение

В результате присваивания переменная varname получает новое значение, которое возвращается в результате вычисления выражения.

Знак равенства оператора присваивания трактуется иначе, чем знак равенства в математике. Так, в математике запись k = 2 * k + 1 означает запись уравнения, решением которого является k = -1, а уравнение k = k + 1 вообще не имеет решения. В то же время в программе

integer :: k = 4

! После присваивания k равно пяти

k = k + 1

k = 2 * k + 1

! После присваивания k равно 11

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

Если тип переменной varname отличается от типа выражения, то результат выражения преобразовывается в тип varname. Поскольку в результате преобразований возможна потеря точности, то необходимо следить, чтобы эта потеря не привела к серьезному искажению результата, например:

integer n

 

real x, y

! После присваивания n равно четырем

n = 9.0 / 2

x = 9.0 / 2

! После присваивания x равно 4.5

y = n * 5

! Возвращает 20 - потеря точности

y = x * 5

! Возвращает 22.5 - вычисления без потери точности

1.8. Простой ввод/вывод

При вводе с клавиатуры данные из текстового представления преобразовываются во внутреннее. При выводе на экран данные из внутреннего представления преобразовываются во внешнее (текстовое). Преобразования ввода/вывода (В/В) можно задать дескрипторами преобразований. Можно также использовать В/В, в котором преобразования выполняются в соответствии с установленными по умолчанию правилами. Такого рода преобразования обеспечиваются управляемым списком В/В, который мы и будем преимущественно использовать в поясняющих примерах. Управляемые списком операторы ввода с клавиатуры и вывода на экран выглядят так:

READ(*, *) список ввода

! Ввод с клавиатуры

READ *, список ввода

! Ввод с клавиатуры

WRITE(*, *) список вывода

! Вывод на экран

16

1. Элементы языка

PRINT *, список вывода

! Вывод на экран

Список ввода - часть оператора ввода, устанавливающая величины, которые надо ввести.

Список вывода устанавливает величины, которые надо вывести. Список вывода может содержать произвольные выражения; список

ввода - только переменные.

Последняя или единственная звездочка приведенных операторов означает, что В/В управляется списком. В операторах, содержащих две заключенные в скобки и разделенные запятой звездочки, первая - задает устройство В/В (клавиатуру и экран).

Пример:

integer n

 

 

real a(500)

 

! На экране появится сообщение: Введите n

print *, 'Введите n '

read *, n

 

! Используем для В/В циклический список

read *, (a(i), i = 1, n)

! Потребуется ввести с клавиатуры n значений

print *, (a(i), i = 1, n)

! Контрольный вывод на экран

Выполним ввод:

 

3

 

(После ввода значения для n нажимаем Enter)

1 2 3

 

(Отдельные значения разделяются пробелом)

Результат вывода:

1.00000

2.000000

3.000000

Замечания:

1. В качестве разделителя задаваемых при вводе значений можно использовать и запятые или запятые вместе с пробелами, например:

1, 2, 3

2. В вышеприведенном операторе PRINT указан русский текст. Однако если не принять специальных мер, то в DOS-окне, в которое этот текст направляется при работе с консоль-проектами, будут выведены совсем другие символы:

-тхфшЄх n

Чтобы избежать таких искажений, необходимо в программе, выводящей русский текст в DOS-окно, выполнить ссылку

use TextTransfer

обеспечить доступ к модулю TextTransfer и выполнить перекодировку текста, применив, имеющуюся в модуле TextTransfer функцию RuDosWin, записав вместо

print *, 'Введите n '

17

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

оператор

print *, trim(RuDosWin('Введите n ', .false.))

Текст модуля TextTransfer и правила его употребления приведены в прил. 1. В дальнейшем, однако, при использовании русского текста в операторе вывода обращение к RuDosWin явно выполняться не будет, но всегда будет подразумеваться.

1.8.1. Некоторые правила ввода

Для рассмотрения правил ввода введем ряд понятий.

Запись текстового последовательного файла - строка символов,

завершаемая символом новой строки.

Поле записи файла - часть записи, содержащая данные, которые могут быть использованы оператором ввода.

Файл состоит из записей и завершается специальной записью "конец файла". При вводе с клавиатуры при необходимости можно проставить запись "конец файла", нажав Сtrl + Z, например:

integer ios

 

real x

 

do

! Цикл продолжается до нажатия Сtrl + Z

print '(1x, a, $)', 'Enter x '

! Вывод подсказки; выполняется без продвижения

read(*, *, iostat = ios) x

! После Сtrl + Z будет введена запись "конец файла",

if(ios == -1) exit

! ios примет значение -1 и произойдет выход из цикла

print *, 'x = ', x

 

end do

 

Ввод под управлением списка выполняется по правилам:

поля записи могут разделяться пробелами и запятой;

если между полями записи присутствует слеш (/), то ввод прекращается;

каждый оператор ввода (если не задан спецификатор ADVANCE = 'NO') выполняет ввод с начала новой записи. Например, при вводе

read *, x, y, z

можно обойтись одной записью, например:

1.1 2.2 3.3

тогда как при вводе

read *, x read *, y read *, z

уже потребуется 3 записи, например:

18

1. Элементы языка

1.1

2.2

3.3

Причем если создать, например, в первой строке больше полей ввода:

1.1 4.4 5.5

2.2

3.3

то поля с символами 4.4 и 5.5 будут в последней версии ввода проигнорированы и по-прежнему после ввода: x = 1.1, y = 2.2, z = 3.3;

если число элементов списка ввода больше числа полей записи, то для ввода недостающих значений оператор ввода перейдет к следующей записи;

для ввода значения логической переменной достаточно набрать T илиF. Ошибки ввода возникают:

если число элементов списка ввода больше числа доступных для чтения полей записи (т. е. если выполняется попытка чтения записи "конец файла" и за пределами файла);

если размещенные на читаемом поле символы не могут быть приведены к типу соответствующего элемента списка ввода.

Пример: read *, k

Ошибка ввода последует, если, например, ввести k = 2

Правильный ввод:

2

1.8.2. Ввод из текстового файла

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

Пусть надо определить вещественные переменные x, y и z, задав им при вводе значения 1.1, 2.2 и 3.3. Создадим файл a.txt в том же месте, откуда выполняется запуск программы, и занесем в него строку

1.1 2.2 3.3

Программа ввода из файла:

real x, y, z

 

open(2, file = 'a.txt')

! 2 - номер устройства В/В

19