Цикл довузовской подготовки кафедры ЭФУ

ЛАБОРАТОРНЫЙ ПРАКТИКУМ:
«ПРОГРАММИРОВАНИЕ НА ФОРТРАНЕ»

СТРУКТУРА ПРАКТИКУМА

ВВЕДЕНИЕ

ВАЖНАЯ ИНФОРМАЦИЯ

1. ПРАВИЛА ЗАПИСИ ПРОГРАММЫ

1. Набор символов Фортрана

2. Форматы записи программы

3. Фиксированный формат

4. Свободный формат

2. ТРАНСЛЯЦИЯ ПРОГРАММЫ

1. Программа в одном исходном файле

2. Трансляция исходного файла

3. Трансляция нескольких исходных файлов

4. Трансляция модулей

3. КОНЦЕПЦИЯ ДАННЫХ ЯЗЫКА ФОРТРАН

1. Имена (идентификаторы)

2. Понятие типа

3. Буквальные константы

4. Разновидности типов и диапазоны значений

5. Скалярные переменные и константы

6. Массивы

7. Производные типы данных

4. ВЫРАЖЕНИЯ И ПРЕОБРАЗОВАНИЕ ТИПОВ

1. Скалярное присваивание

2. Арифметика Фортрана

3. Логические выражения

4. Работа с текстовыми строками

5. Операции с массивами

5. УПРАВЛЯЮЩИЕ ОПЕРАТОРЫ

1. Условный оператор и конструкция IF

2. Оператор варианта – конструкция CASE

3. Циклы – разновидности конструкции DO

4. Оператор GO TO

6. ВВОД/ВЫВОД ДАННЫХ

1. Простейшие операции ввода/вывода

2. Форматный ввод/вывод данных

3. Ввод/вывод массивов в неявных циклах

4. Файловый ввод/вывод

7. ПРОГРАММНЫЕ КОМПОНЕНТЫ И ЭЛЕМЕНТЫ ООП

1. Структура программных компонентов

2. Внешние подпрограммы

3. Внутренние подпрограммы

4. Модули как библиотеки производных типов

5. Встроенные функции Фортрана

ЗАДАЧИ ДЛЯ ПРОГРАММИРОВАНИЯ

6.2. Форматный ввод/вывод данных

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


Таблица 6.2. Варианты операторов форматного ввода/вывода

Оператор Действие
READ (*, ‘(fmt)’ ) список ввода Ввод с клавиатуры
READ (*, метка) список ввода Ввод с клавиатуры
READ ‘(fmt)’, список ввода Ввод с клавиатуры
READ метка, список ввода Ввод с клавиатуры
WRITE (*,‘(fmt)’ ) список вывода Вывод на экран
WRITE (*, метка ) список вывода Вывод на экран
PRINT ‘(fmt)’, список вывода Вывод на экран
PRINT метка, список вывода Вывод на экран
метка FORMAT(fmt) Контейнер спецификаций

Операторы форматного ввода/вывода (Таблица 6.2) точно такие же как и предыдущем параграфе (Таблица 6.1) за исключением спецификации формата fmt, или ссылки на нее через метку оператора FORTMAT – контейнера форматных спецификаций.

Спецификация формата fmt (см. примеры ниже) представляет собой список дескрипторов формата данных (Таблица 6.3).

Дескрипторы, используемые для описания формата данных (Таблица 6.3) позволяют задавать символьную длину поля w для размещения объекта данных при вводе выводе и учитывать особенности числовых и нечисловых типов данных Фортрана.


Таблица 6.3. Дескрипторы формата данных

Дескриптор Тип данных Внешнее представление
Iw[.m] Целый тип Десятичное представление целого числа в поле шириной w символов. Величина m определяет минимальное число цифр при выводе – недостающие позиции заполняются нулями слева
Bw[.m]
Ow[.m]
Zw[.m]
Целый тип Двоичное, восьмеричное и шестнадцатеричное представление целого числа, выводится аналогично Iw[.m]
Fw.d Вещественный тип Представление вещественных чисел без десятичной экспоненты (степени числа десять). Задается ширина поля w и количество цифр d после десятичной точки.
Ew.d[Ee] Вещественный тип Представление вещественного числа с десятичной экспонентой. Обязательно задается ширина поля w и количество цифр d после десятичной точки. Дополнительно можно задать e – ширину поля порядка десятичной экспоненты.
EN.d Вещественный тип Аналогичен E. Десятичный порядок кратен трем. Целая часть числа в диапазоне от 1 до 1000
ES.d Вещественный тип Аналогичен E. Целая часть числа в диапазоне от 1 до 10. Масштабный множитель не действует.
Комплексный тип Задается парой дескрипторов F, E, EN или ES
Lw Логический тип Представление логических данных. Задается ширина поля w для вывода в минимальном варианте T и F, а в максимальном варианте .TRUE. и .FALSE.
A[w] Текстовый тип Можно задавать символьную ширину поля w. Если ширина поля не указана, то определяется фактическим количеством символов в тексте.
Gw.d[Ee] Все встроенные типы Универсальный дескриптор. Применяется для вещественных чисел порядок величины которых заранее не известен: работает как F или E. Для целого, логического и текстового типа работает как Iw, Lw и Aw.
Производные типы Задаются дескрипторами в соответствии с встроенными типами элементов структуры производного типа.

При использовании непосредственно в операторах ввода/вывода ссылка на формат представляется как текстовая константа: ‘(fmt)’ или «(fmt)», содержащая спецификацию формата fmt, заключенную в круглые скобки. Такой подход рекомендуется, если список дескрипторов в спецификации формата достаточно короткий

Если же список дескрипторов в спецификации формата имеет большую длину, сложную структуру, а так же содержит текстовые константы с внутренними апострофами или кавычками (Буквальные константы текстового или символьного типа – п. 3.3), то целесообразно использовать меточную ссылку на оператор FORMAT.

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

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


Пример 6.3. Неправильный формат при вводе.

program FMT1
read‘(i1, i2, i3)’,K,L,M !Предлагается ввести через пробел 1^23^456
print ‘(i1, i2, i3)’, K, L, M
end
	


При вводе с клавиатуры форматный ввод используется редко, поскольку требует крайней аккуратности (Пример 6.3) – сравнение ввода и вывода требует пояснения:

Ввод: 1^23^456
Вывод: 1^2^34

По спецификации «I1» считывается одна символьная позиция – первая единица, как целое число, соответственно переменная «K» получает значение «1», далее по спецификации «I2» считывается два символа «^2», в предположении, что это целое число и переменной «L» присвоится значение «2». И, наконец, по спецификации «I3» будут считаны еще три позиции: «3^4» – компилятор Gfortran исключает все пробелы, и переменная «L» инициализируется как «34», но возможна ситуация, когда будут считаны символы только до пробела и тогда в «L» запишется целое значение, равное трем.

При выводе также нужно считать символьные позиции, чтобы получить приемлемый результат (Пример 6.4). Первый PRINT выведет «1234» без пробелов.


Пример 6.4. Расстановка пробелов при выводе.

program FMT2
K=1; L=2; M=3; N=4 
print ‘(4i1)’, K, L, M, N
print ‘(4i2)’, K, L, M, N
print 10, K, L, M, N
10  format(4(1x,i1))
end
	

Второй и третий PRINT дадут одинаковый результат «1^2^3^4». Во втором PRINT это происходит за счет избыточной ширины поля и смещения выводимого результата к правой границе. Третий PRINT по метке «10» ссылается на оператор FORMAT. В спецификации, описанной оператором FORMAT, между целыми числами введен отступ в один пробел: «1X». В обоих случаях использован коэффициент повторения: «4I2» и «4(1X,I1)» вместо «I2, I2, I2, I2» и еще более длинной записи: «1X, I1, 1X, I1, 1X, I1, 1X, I1,».

Принципы формирования спецификаций формата с использованием коэффициентов повторения, разделения пробелами и оператора FORMAT универсальны для всех дескрипторов (Таблица 6.3). Далее приводятся некоторые особенности спецификаций формата для различных дескрипторов.


Пример 6.5. Вывод одного и того же числа в разных форматах.

program FMT3
X=12345
print '(f6.0)', X		! 12345.
print '(g10.5)', X	! 12345.
print '(f7.1)', X		! 12345.0
print '(e10.5)', X	! .12345E+05
print '(e11.5)', X	! 0.12345E+05
print '(e11.5e3)', X	! .12345E+005
print '(en10.3)', X	! 12.345E+03
print '(es10.4)', X	! 1.2345E+04
end
	

При использовании дескриптора F одна позиция в поле вывода должна быть зарезервирована под десятичную точку, а применение дескриптора E, помимо этого требует четыре позиции под экспоненциальную часть – если число позиций под степень десятичной экспоненты не задано явно (Пример 6.5).

Целая часть числа при выводе под управлением дескриптора E равна нулю, что не всегда удобно. Сдвинуть десятичную точку на k порядков вправо, уменьшив настолько же показатель десятичной экспоненты, позволяет масштабный множитель kP (Пример 6.6).


Пример 6.6. Использование масштабирующего множителя.

program FMT4
X=0.76543E+12; Y=0.34567E+21
print '(e11.5)', X		! 0.76543E+12
print '(2p, e11.5)', X		! 76.543E+10
print '(2p, 2(2x,e11.5))', X, Y	! 76.543E+10^^34.567E+19
end
	

Масштабный множитель является элементом списка спецификации формата и отделяется от последующих дескрипторов запятой. При этом он действует на все последующие дескрипторы E, F и G, до появления в списке следующего масштабного множителя. Действие масштабного множителя не распространяется на дескрипторы EN и ES.

При выводе данных непосредственно в спецификацию формата может включаться текст, в виде буквальных констант (Пример 6.7) что в ряде случаев позволяет разгрузить оператор вывода данных, используя оператор FORMAT.


Пример 6.7. Дескрипторы текстовых строк в спецификации формата.

program FMT5
integer :: X=1, Y=2, Z=3 
print '(1x, "X=", i1, 1x, "Y=", i1, 1x, "Z=", i1)', X, Y, Z
print 10, X, Y, Z
print 20, X, Y, Z
10  format(1x, "X=", i1, 1x, "Y=", i1, 1x, "Z=", i1)
20  format(1x, "X=", i1/ 1x, "Y=", i1/ 1x, "Z=", i1)
end
	

Появление в спецификации формата прямого слеша «/» (оператор FORMAT с меткой «20» в предыдущем примере) приводит к переводу строки – несколько слешей подряд инициируют соответствующее количество переводов строки

Необходимо заметить, что после выполнения операторы вывода данных WRITE и PRINT сразу же происходит перевод строки. Для предотвращения этого в конце спецификации формата необходимо поставить символ $ (знак денежной единицы), не отделяя его запятой от предыдущего списка спецификации формата. Это может потребоваться, если после вывода на экран требования ввода данных, курсор оставался на месте (Пример 6.8).


Пример 6.8. Исключение перевода строки.

program FMT6
print'("X="$)'
read *, X
print'("X=", g12.7)', X
end
	

Форматный ввод/вывод логических и текстовых данных полностью аналогичен выше изложенным правилам и примерам, поэтому не должен вызывать затруднений.