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

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

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

ВВЕДЕНИЕ

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

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. Встроенные функции Фортрана

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

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

Для числовых типов Фортрана (INTEGER, REAL и COMPLEX) всех разновидностей (п. 3.4) определены арифметические операции (Таблица. 4.2) и скобочные конструкции, соответствующие стандартным (математическим) правилам арифметики.

Таблица 4.2. Арифметические операторы Фортрана

Оператор Операция Приоритет
( ) Выражение в скобках 1 – Макс.
**Возведение в степень 2
* Умножение 3
/ Деление 3
+ Сложение или унарный плюс 4 – Мин.
Вычитание или унарный минус4 – Мин.

С помощью арифметических операций со скобочными конструкциями и числовых объектов данных (переменных, а также буквальных и именованных констант) можно программировать арифметические выражения любой сложности.

Операторы «+» и «–», представленные выше могут применяться для унарных операций, например для выражений именованными объектами как: +Z или X**(–Y) или буквальными константами числовых типов: – (–1). Отметим, что в последнем случае унарный минус применяется к буквальной константе «–1», для которой ее знак является неотъемлемой частью.

Вернемся к бинарным операциям (сложению, вычитанию, умножению и делению). Наивысшим приоритетом (в 1-ю очередь), при вычислении арифметических выражений обладают скобочные конструкции. Если имеет место вложенность скобочных конструкций, то сначала будет произведен расчет выражений во внутренних скобках. Между собой скобочные конструкции имеют равный приоритет – т.е вычисляются по мере их появления в выражении.

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

Приоритет арифметических вычислений рассмотрен на примере вычисления арифметического выражения:

A + B / (C / D) – E**F*(G – H*(I+J))

Сначала на печать выводится расчет по единой формуле, а затем разбирается ее пошаговое вычисление (Пример 4.2). Критерием правильности пошаговых вычислений является их совпадение с результатом, полученным по единой формуле.


unix-workdir

Пример 4.2. Приоритет возведения в степень

program STEPCALC
real :: A=9.,  B=8., C = 7., D = 6., E = 5., F = 4., G = 3., H = 2., I = 1. , J = 2.
print*, A + B / (C / D) – E**F*(G – H*(I+J)) ! ОДНОЙ ФОРМУЛОЙ
! A + B / (C / D) – E**F*(G – H*(I+J)) ПО ШАГАМ:
! В выражении три равноценных слагаемых: A, B / (C / D) и – E**F*(G – H*(I+J))
! Вычисление слагаемого B / (C / D) начинается со скобок (C / D), затем деление
STEP1 = C / D; STEP2 = B / STEP1
! Вычисление E**F*(G – H*(I+J)) начинается со скобок (G – H*(I+J))
! Расчет (G – H*(I+J)) начинается со скобок (I+J), далее умножение и вычитание
STEP3 = I+J; STEP4 = H*STEP3; STEP5 = G – STEP4
! Степень E**F вычисляется после скобок, затем производится умножение
STEP6 = E**F; STEP7 = STEP6* STEP5
! Осталось сложить результаты
RESULT = A + STEP2 – STEP7
print*, RESULT
end
	

Необходимо отметить важную особенность операции возведения в степень. Например, вычисление выражения A**B**C (Пример 4.3), так же как вычисление выражения с любым количеством последовательных возведений в степень, всегда выполняется справа налево. Т.е. сначала будет вычислено B**C, а полученный результат послужит степенью, в которую будет возведено A.


Пример 4.3. Приоритет возведения в степень

program POWCALC
real :: A=4.,  B=3., C = 2.
print*, A**B**C !Возведение в степень одним выражением
! Пошаговое вычисление последовательных возведений в степень
STEP1 = B**C; STEP2 = A**STEP1
print*, STEP2
end
	

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

Если же типы (или KIND при совпадении типов) различны, то перед выполнением операции производится сравнение типов операндов. Операнд с более мощным типом никак не преобразуется, а операнд с менее мощным типом преобразуется к более мощному типу, таким же будет и тип результата операции. Мощность числового типа возрастает по цепочке INTEGER–REAL–COMLEX, а в пределах каждого типа растет с увеличением значения параметра разновидности KIND.

Зависимость типа результата арифметической операции, если это сложение, вычитание, умножение или деление, в зависимости от типов операндов представлена в Таблице 4.3, а операции возведения в степень соответствует Таблица 4.4.

Таблица 4.3. Таблица преобразования типов операндов для сложения, вычитания, умножения и деления

Тип A Тип B Преобразование типа для A Преобразование типа для B Тип результата
I I A B I
I R REAL (A, KIND(B)) B R
I C CMPLX (A, 0, KIND(B)) B C
R I A REAL (B, KIND(A)) R
R R A B R
R C CMPLX (A, 0, KIND(B)) B C
C I A CMPLX (B, 0, KIND(A)) C
C R A CMPLX (B, 0, KIND(A)) C
C C A B C

В Таблицах 4.3 и 4.4 в первых двух столбцах жирным шрифтом обозначены исходные типы операндов, а в последнем столбце тип результата операции (I – INTEGER, R – REAL, C – COMPLEX). Операнды арифметической операции обозначены как (A – первый операнд и B – второй операнд).


Таблица 4.4. Таблица преобразования типов операндов для операции возведения в степень

Тип A Тип B Преобразование типа для A Преобразование типа для B Тип результата
I IABI
I RREAL (A, KIND(B)) B R
I CCMPLX (A, 0, KIND(B)) B C
R IABR
R RABR
R CCMPLX (A, 0, KIND(B))BC
C IABC
C RACMPLX (B, 0, KIND(A)) C
C CAB C

Из Таблицы 4.4 видно, что единственный случай, когда не происходит преобразования типов операндов арифметической операции к одному типу – это возведение вещественного или комплексного операнда в целую степень.

Пример 4.4. дает наглядное представление о преобразовании типов операндов в простейших арифметических выражениях.


Пример 4.4. Преобразование типов и тип результата.

program CONVERTYPE
integer :: a=1; real :: b=1.; complex :: c=(1. , 1.)
print*, a*a !Результат  INTEGER
print*, a*b !Переменная A преобразуется в REAL. Результат  REAL
print*, a*с !Переменная A преобразуется в COMPLEX. Результат COMPLEX
print*, b*b ! Результат  REAL 
print*, b*с !Переменная B преобразуется в COMPLEX. Результат COMPLEX
print*, c*с ! Результат COMPLEX
end
	

Интересным разделом компьютерных вычислений является целочисленная арифметика (она соответствует первым строчка Таблиц 4.3 и 4.4) Особенно «парадоксальным» образом это проявляется при операциях целочисленного деления. Казалось бы, простой вопрос – сколько будет один делить на два? Вроде бы очевидно, что ноль целых пять десятых. Но запрограммируйте это действие с целыми числами, и такого результата не будет, а будет ноль.

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


Пример 4.5. Особенности деления целых чисел

program INTDIV
print*,1/2	!Результат=0 (целочисленное деление)
print*,1./2	!Результат=0.5, поскольку 1. – вещественное число
print*,3/2	!Результат=1(целочисленное деление)
print*,3./2	!Результат=1.5, поскольку 3. – вещественное число
print*,3/2*2	!Результат=2 (целочисленное деление)
print*,3./2*2	!Результат=3.
print*,1/2*2	!Результат=0
print*,1./2*2	!Результат=1.
end