Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Книга Фортран Павловец 2008

.pdf
Скачиваний:
127
Добавлен:
31.05.2015
Размер:
1.55 Mб
Скачать

1). Определяется логическое выражение, стоящее в скобках. Это логическое выражение может быть истинно и иметь значение .TRUE. или может быть ложным и иметь логическое значение .FALSE.. Если логическое выражение в скобках истинно, то выполняется выполняемый оператор, стоящий за скобками оператора IF. Если логическое выражение в скобках ложно, то выполняемый оператор не выполняется. Как в первом, так и во втором случае после IF логического выполняется следующий за ним по тексту программы оператор, за исключением случая, когда логическое выражение истинно, а выполняемым оператором является GO TO. (Пример: IF(A.GT.0.) GO TO 7).

Задача: Вычислить значение λ в зависимости от данных условий.

 

 

sin x

x > 2b

 

λ

=

 

 

если x = 2b

 

0

 

 

 

 

 

 

x < 2b

 

 

 

cos x

 

 

 

 

Преобразуем вышеприведенные неравенства к виду сравнения с нулем

 

x > 2b

преобразуем к виду

x – 2b > 0

 

x = 2b

преобразуем к виду

x - 2b = 0

 

x < 2b

преобразуем к виду

x - 2b < 0

С

 

 

 

Программа № 3 с IF арифметическим

 

 

 

 

REAL LAM

 

 

 

 

 

В этой строке переменная LAM описывается как переменная вещественного

 

 

 

 

типа. Если не сделать этого описания, а использовать в программе

 

 

 

 

переменную LAM, то из-за несоответствия типов (LAM – целого типа,

 

 

 

 

начинается на букву L, а используется как вещественного типа) будет

 

 

 

 

возникать ошибка. У этой переменной не может быть дробной части.

 

 

 

 

WRITE(6,*)’Введите значения x,b’

 

 

 

 

READ(5,*) X,B

 

 

 

 

 

IF(X-2.*B) 4,7,8 Сравниваем условие и переходим на одну из меток

 

 

8

 

LAM=SIN(X)

 

 

 

 

 

GO TO 10

 

 

 

7

 

LAM=0.

 

 

 

 

 

GO TO 10

 

 

 

4

 

LAM=COS(X)

 

10WRITE(6,*)’Вычисленное значение Лямбда=’,LAM PAUSE

STOP END

70% ошибок у программистов возникает из-за несоответствия типов переменных!!!.

Ошибки вроде и пустяковые, но из-за них может не заработать даже абсолютно правильно составленная программа. И на устранение ошибки может уйти достаточно много времени. Обратите внимание!

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

21

СПрограмма № 4 с использованием IF логического

REAL LAM Вместо описания имени LAM как вещественного типа можно задать другое имя, которое не будет начинаться на буквы I,J,K,L,M,N, например ALAM

WRITE(6,*)’Введите значения x,b’ READ(5,*) X,B

IF(X.GT.2.*B) LAM=SIN(X) IF(X.EQ.2.*B) LAM=0. IF(X.LT.2.*B) LAM=COS(X)

WRITE(6,*)’Вычисленное значение Лямбда=’,LAM PAUSE

STOP END

Лучше ещё ввести новую переменную и присвоить ей выражение 2.*В и далее использовать эту переменную:

……….

A=2.*B

IF(X.GT.A) LAM=SIN(X)

Кстати, вместо первого оператора IF(X.GT.2.*B) LAM=SIN(X) можно просто записать

LAM=SIN(X) . Проанализируйте программу и убедитесь, что она будет работать правильно. Проанализируйте, что произойдет, если таким же образом заменить последний оператор IF.

12. Табулирование функции

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

Задача:

Вычислить и напечатать все значения функции: f=sinx2-excos2x,

если x изменяется в пределах от а до b с шагом dx.

СПрограмма № 5. Циклы с оператором IF.

WRITE(6,*)’Введите Xнач, Xкон, шаг цикла’ READ(5,*) XN,XK,DX

СБлок корректировки шага

N=(XK-XN)/DX+1. определяем количество вычислений на отрезке a ÷ b DX=(XK-XN)/(N-1) уточняем значение шага

C

Переменной цикла присваиваем начальное значение

 

X=XN

C

Вычисляем значение функции

11F=SIN(X*X)–EXP(X)*COS(X)**2

У показателя степени 2 точку ставить нельзя, т.к. нельзя возвести

отрицательное число в вещественную степень.

СВыводим результат вычисления на экран

22

WRITE(6,*)’При Х=’,X,’ значение функции равно’,F Выводим на экран текстовые пояснения, значение аргумента Х и соответствующее ему значение функции F.

CЗадаём приращение аргумента

X=X+DX

СПроверяем условие повторения цикла

IF(X.LE.XK) GO TO 11 PAUSE

STOP END

Для организации цикла с помощью оператора IF мы сделали:

1). Переменной Х присвоили начальное значение XN: X=XN

2). Сделали вычисление значения F в области цикла: F=SIN(X*X)–EXP(X)*COS(X)**2 и напечатали результат посредством WRITE;

3). Увеличили значение аргумента на величину шага цикла: X=X+DX

4). С помощью IF логического проверили условие повторения цикла: IF(X.LE.XK) GO TO 11

При вычислении значений этой функции, например, при Х, изменяющемся от 1 до 10 с шагом 2, текущее значение Х будет равно 1,3,5,7,9. Т.е. не будет получено последнее значение функции на заданном отрезке. Поэтому в программе и применяется блок корректировки шага. Количество вычислений на отрезке будет N=(10-1)/2+1=5 (целое число). Новое, уточненное значение DX будет равно (10-1)/(5-1)=2.25

Обратите внимание, что при определении количества вычислений N=(XK-XN)/DX+1. после цифры 1 желательно ставить символ «точка». В правой части выражения идут вычисления с величинами вещественного типа, затем целая часть результата присваивается переменной N, а дробная часть результата отбрасывается. Если «точку» не ставить, то транслятор должен перевести «единицу» целого типа к виду «вещественный», а затем произвести вычисления. При вычислении DX=(XK-XN)/(N-1) N и «единица» оба целого типа. Поэтому «точку» у «единицы» ставить не нужно. Указанные выше особенности на результат вычислений в данном случае не влияют. Но свидетельствуют о грамотности программиста.

13. Оператор цикла DO

Оператор DO предназначен для создания циклов, обеспечивающих многократное выполнение группы операторов в программе.

Оператор DO по сравнению c IF является более мощным инструментом для организации циклов. Форма записи следующая:

DO m i=i1 , i2 , i3

где m – метка оператора, являющегося последним в области цикла DO;

i – переменная цикла, изменяющаяся от начального значения i1 до конечного значения i2 с шагом i3.

Пример:

DO 8 I=1,13,2

M=I*I область цикла

8 WRITE(6,*) I,M

23

Оператор цикла DO работает следующим образом:

Переменной цикла i присваивается начальное значение i1, затем выполняются все операторы в области цикла, включая и последний с меткой m. Затем к величине переменной i прибавляется величина шага i3 и полученное новое значение переменной цикла сравнивается с конечным значением i2. Если новое значение переменной цикла i меньше либо равно конечному значению i2, то повторяются расчеты в области цикла, начиная с оператора, следующего после DO. Если новое значение переменной цикла больше чем значение i2, то осуществляется выход из цикла и выполнение передаётся оператору, следующему после метки m. При этом вычисления в области цикла не выполняются.

Если величина шага i3 равна единице, то ее можно не записывать.

ВНИМАНИЕ:

После окончания цикла переменная цикла сохраняет всегда значение большее, чем конечное значение цикла i2. В случае выхода из цикла до его завершения переменная сохранит свое текущее значение.

Начиная с Fortran-4 переменная цикла, начальное и конечное значения, величина шага могут быть величинами вещественного типа.

В качестве оператора, являющегося последним в цикле DO, предпочтительнее ставить оператор CONTINUE, который не выполняет никаких действий, а просто показывает, что это последний оператор в области цикла.

Оператор CONTINUE чаще всего является последним оператором цикла DO в тех случаях, когда последним оператором цикла DO может оказаться один из операторов:

IF(арифметический), PAUSE, STOP или другой оператор управления.

Пример:

. . .

DO 4 I=1,9,2 X=X+2.

. . .

IF(X) 4,2,3

Так как последним оператором цикла DO не может быть арифметический оператор IF

4 CONTINUE

. . .

Шаг цикла может быть как положительным, так и отрицательным. Следует только следить, чтобы при положительным шаге конечное значение было большим, чем начальное. А при отрицательным шаге начальное значение должно быть большим, чем конечное. Иначе произойдёт зацикливание программы до переполнения разрядной сетки ЭВМ (32767).

Начиная с версии ФОРТРАН–77 в качестве переменной цикла можно использовать переменные вещественного типа. Например :

DO 7 X=XN , XK , DX Y=...

7 WRITE(*,*) X , Y

Примечание:

Оператор цикла DO не предусматривает корректировку шага DX.

24

Задача:

По введенному значению n вычислить n! (факториал от n) и вычислить сумму квадратов натуральных чисел, используя оператор цикла DO.

C

Программа №6. Вычисление суммы и факториала от N

5WRITE(6,*)’Введите N’ READ(5,*) N

CВычисление суммы N S=0.

При вычислении суммы необходимо обнулять ячейку памяти (в данном случае S), так как может оказаться, что эта переменная уже имеет

некоторое значение и в результате решение будет неправильным. DO 2 I=1,N Организуем цикл до метки 2, изменяя I от 1 до N с шагом

единица

S=S+I**2 В ячейке S будет накапливаться сумма I**2

2 CONTINUE

CВычисление факториала

P=1.

DO 3 I=1,N

3P=P*I

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

CВывод результата

WRITE(6,*)’Сумма S=’,S,’ факториал =’,P PAUSE

GO TO 5

4STOP END

Вычисление суммы работает следующим образом:

Переменной S присваивается значение ноль. Затем по циклу к переменной S прибавляется величина i2 за каждый проход по циклу.

Для вычисления произведения или факториала сначала переменной Р присваивается значение 1. Затем в цикле Р умножается на I и результат записывается в Р.

Примечание: Если величина шага в операторе цикла DO равна единице, то шаг можно не указывать.

Задача:

Найти все значения функции µ =

a b

*sin(3

x 1 +e2x ), если x изменяется в

 

c a

 

 

пределах: X=XH ÷XK c шагом dx. Определить максимальное и минимальное значения. Если значение µ <0, то результат вывести в левой части экрана, а если µ >0 – в правой

части.

25

C

Программа №7. Максимум и минимум функции

3

WRITE(6,*)’Введите переменные a,b,c’

 

READ(5,*) A,B,C Введем численные значения переменных, участвующих в

 

выражении

 

WRITE(6,*)’Введите значения Хнач, Хкон, шаг dx’

 

READ(5,*) XN,XK,XD

CБлок корректировки шага

N=(XK-XN)/XD+1. DX=(XK-XN)/(N-1)

Шаг dx мы сначала ввели как переменную XD, а затем после корректировки шага эта переменная будет именоваться как DX

P=(A-B)/(C-A) Вычисляем подкоренное выражение IF (P.LT.0.) GO TO 3 Проверка на минус под корнем

FMA=-1.E30 Начальному значению переменной, где будет запоминаться максимум, задаем малое число, расположенное слева на числовой оси.

FMI=1.E30 А для минимума задаем начальное большое число.

DO 4 X=XN, XK, DX

S = SIN(ABS(X-1.)**(1./3.)+EXP(2.*X)) F=SQRT(P)*S Вычислили значение функции А затем находим максимум и минимум

IF(F.GT.FMA) FMA=F или можно так: FMA=AMAX1(F,FMA)

FMI=AMIN1(FMI,F) или IF(F.LT.FMI) FMI=F

Выводим значения х и µ

 

IF(F.LT.0.) WRITE(6,*)’При x=’,X,’ MU=’,F

 

4

IF(F.GT.0.) WRITE(6,*)’

При x=’,X,’ MU=’,F

PAUSE

STOP

END

Вторая модификация цикла DO похожа на предыдущую. Только отсутствует метка и оператор окончания цикла CONTINUE заменяется на оператор END DO:

DO X=A,B,DX

область цикла

END DO

Принцип работы аналогичен предыдущей модификации: происходит выполнение операторов в области цикла с постепенным приращением Х от А до В с шагом DX. Циклический процесс осуществляется между DO и END DO. При достижении значения Х, большего, чем значение В, происходит передача управления первому оператору, следующему за END DO.

Третья модификация цикла DO использует совершенно иной способ организации цикла:

26

DO m, WHILE (логическое выражение)

область цикла

m CONTINUE

Здесь происходит выполнение цикла в области до метки m до тех пор, пока выполняется (.TRUE.) логическое выражение в скобках. Если логическое выражение стало ложным (.FALSE.), то управление передаётся оператору, следующему после области цикла.

Пример:

X=XN

DO 5, WHILE (X.LT.XK) Z=…

WRITE (… 5 X=X+DX

Четвертая модификация цикла DO:

DO WHILE (логическое выражение)

область цикла

END DO

Цикл выполняется, пока логическое выражение не примет значение FALSE.

Кроме того, внутри цикла DO WHILE или оператора DO (в котором цикл заканчивается оператором END DO) используются операторы CYCLE (цикл) и EXIT (выход). Оператор CYCLE передаёт управление на конец цикла, а оператор EXIT осуществляет выход из области цикла и передаёт управление оператору, следующему после END DO.

Пример:

X=XN

DO WHILE (X.LT.XK) Y=…

Z=…

IF (Y.LT.0.05) CYCLE

IF (Z.GT.10.5) EXIT WRITE (… X=X+DX

END DO

Строки IF(Y.LT.0.05) CYCLE и IF (Z.GT.10.5) EXIT соответствует следующим операциям с помощью IF и GOTO:

DO 8 I=1,10 X=…

IF(Y.LT.0.05) GO TO 8

IF (Z.GT.10.5) GO TO 10 WRITE …

27

8

CONTINUE

10

Y=…

Модификации оператора цикла DO удобно использовать в тех случаях, когда не заданы начальные и конечные значения цикла, а цикл должен выполняться только тогда когда выполняется какое либо условие.

14. Массивы

Под массивом понимают совокупность данных одного типа, объединённых одним именем.

Массивы должны быть описаны в программе одним из операторов описания. Существует специальный оператор для описания массивов:

DIMENSION

Пример:

DIMENSION A(10),B(8),C(3,4),K(15)

Описаны одномерные массивы вещественного типа А и В, содержащие 10 и 8 элементов соответственно, двухмерный массив С, состоящий из 12 элементов, расположенных по 3 строкам и 4 столбцам, а также массив целого типа К из 15 элементов.

Оператор не выполняет никаких действий в программе и служит лишь только для отведения места в оперативной памяти ЭВМ для размещения массивов.

Массивы также могут быть описаны в операторах описания типов данных REAL, INTEGER, COMPLEX, CHARACTER, LOGICAL.

Изначально всем элементам массива заданы значения, равные нулю, кроме ЭВМ образца до 1985 г., где массив изначально был заполнен машинным нулём (0.67*10-19).

Массивы бывают:

а). Одномерными (другое их название – вектор-столбец); б). Двухмерными (другое название – матрица)

в). Трех- и т.д. мерными. Максимальное количество измерений в массиве равно 7. Чтобы обратиться к определённому элементу массива, необходимо указать его имя и

индекс этого элемента.

Индекс в одномерном массиве – это порядковый номер элемента массива, для двухмерного – номер строки и номер столбца.

В качестве индекса может выступать константа целого типа, переменная целого типа или арифметическое выражение, желательно целого типа.

Пример:

DIMENSION A(10) K=4

M=3

A(1)=2.5 A(3)=1.7E-7 A(K+M)=D+A(1)

A(4)=A(M)+A(K+1) Эта строка аналогична выражению: А(4)=А(3)+А(4+1)

переменная

 

 

 

 

арифметическое

 

 

целого типа

выражение

28

Примечание:

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

Двухмерные массивы в памяти ЭВМ располагаются по столбцам:

1

2

3

4

1

 

1.8

 

 

2

 

 

 

 

3

 

 

 

 

Опишем двухмерный массив

DIMENSION C(3,4)

Пример заполнения ячейки двухмерного массива:

С(1,2)=1.8

При этом в строку номер 1 и столбец номер 2 массива С занесётся число 1.8.

При выполнении программы транслятор анализирует, не превышает ли значение вызываемого индекса массива его предельного значения, описанного в операторе DIMENSION (т.е. проверяется случай, когда вызываемый индекс массива не существует – массив имеет меньшие размеры).

Допустим К=4 и М=3. При записи С(К,М)=С(1,1)+С(1,2), которая соответствует записи: С(4,3)=С(1,1)+С(1,2) элемента массива С(4,3) не существует. Если в тексте программы будет запись С(4,3)=С(1,1)+С(1,2), то транслятор обнаружит такую ошибку. Если в тексте программы будет запись С(К,М)=С(1,1)+С(1,2), то такую ошибку транслятор не обнаружит. При выполнении программы число будет занесено в ячейку, определяемую значениями К и М. В данном частном случае скорее всего число будет занесено в 12-ю ячейку от начала размещения массива. В других случаях число может попасть в случайное место программы, что может привести к ее порче или неверному результату.

При работе с двухмерными массивами есть одна особенность, которую рассмотрим на примере:

READ(5,*)К С(К,3)=7

Пока переменную К будем задавать равную от 1 до 3, программа будет выполняться корректно. Но, если К присвоить значение 4 и больше, то ЭВМ будет не в состоянии отследить, что пределы размерности массива нарушены. Обращение будет идти к совершенно иному, и даже случайному элементу памяти ЭВМ. Поэтому нельзя задавать значение К больше, чем 3. Это программист должен отслеживать сам.

Массивы можно описать ещё и с помощью операторов описания REAL и INTEGER или других операторов описания:

REAL A(10) INTEGER K(15)

Повторное описание массивов не допускается.

Массивы могут быть: целого, вещественного, комплексного, строкового и логического

типа.

Для 8-разрядных ЭВМ максимальное значение индекса массива может быть равно 32767.

Например: DIMENSION A(32767), B(32767, 32767).

29

15. Вычисление определенного интеграла

Задача:

Вычислить значение определённого интеграла на отрезке от a до b по методу прямоугольников.

b

λ = (sin2 x +cos x2 )dx

a

Заменим вычисление интеграла вычислением суммы:

b

n1

f (x)dx = f (x)dx

a

i=1

СПрограмма №8.

СВычисление определённого интеграла по методу прямоугольников

1 WRITE(6,*)’Введите значения A,B,DX’

READ(5,*) A,B,DX

CВычисляем количество точек на кривой

N=(B-A)/DX+1. DX=(B-A)/(N-1) Уточняем шаг

CВычисление суммы

F=0.

Как всегда, перед вычислением суммы обнуляем ячейку памяти

DO 2 X=A,B–DX,DX

Конечное значение цикла берём равным B-DX для того, чтобы не вычислить большую площадь, т.к. после окончания цикла переменная цикла имеет

значение, которое больше конечного значения цикла на величину шага

DX.

FX=SIN(X)**2+COS(X**2)

2F=F+FX*DX

WRITE(6,*)’Значение интеграла равно ’,F

PAUSE

GO TO 1

6STOP END

Оператором цикла DO переменной цикла Организуются циклические вычисления в области

X присваивается начальное значение A. цикла, включая оператор с меткой 2. На

30