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

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

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

каждом новом цикле значение X увеличивается на величину шага DX. В области цикла сначала вычисляется значение функции FX, а затем к переменной F, в которой накапливается сумма значений локальных интегралов, прибавляется значение функции, умноженное на DX. Вычисления будут проводиться до достижения переменной цикла X значения B-DX. В последний раз к F прибавится FX*DX (последняя площадка) и в области цикла вычисления завершатся.

Чем меньше величина шага DX, тем выше точность вычисления интеграла.

Задача 2:

Вычислить значение предыдущего интеграла, методом трапеций, который более точный.

Решение:

1.Вычислим все значения функции F(x) и запомним их в массиве.

2.Распечатаем все значения функции при соответствующем аргументе.

3.Вычислим значение суммы для получения значения интеграла по методу трапеций.

a

b

n1

f (i) + f (i +1)

 

f (x)dx =

dx

2

a

i=1

 

0 a dx dx

dx

b

СПрограмма №9

СВычисление определённого интеграла по методу трапеций

DIMENSION FX(1000)

Задаем размерность массива заведомо большую, чем возможное количество вычислений функции. Задавать неопределенное значение FX(N) нельзя!

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

N=(B-A)/DX+1. Количество вычислений на отрезке DX=(B-A)/(N-1) Уточненное значение шага

СВычисляем значения массива

X=A Задаем начальное значение аргументу Х DO 2 I=1,N Организуем цикл по кличеству точек

FX(I)=SIN(X)**2+COS(X**2) Формируем массив значений функции

WRITE(6,*)’При Х=’,X,’ значение функции равно ’,FX(I) 2 X=X+DX Задаем приращение аргумента

CВычисление интеграла по формуле трапеций

F=0. Обнуляем ячейку памяти для накопления суммы DO 1 K=1,N-1 Обратите внимание на количество циклов

31

F=F+(FX(K)+FX(K+1))/2.*DX

1CONTINUE

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

STOP END

16. Работа с одномерными массивами

Ввод массивов.

Предположим, что в программе описаны массивы:

DIMENSION A(10),B(10),C(20),D(4,3)

Существуют несколько способов ввода массивов:

Первый способ ввода массивов: READ(5,*) A

Означает: ввести все числовые значения массива А в том количестве, сколько их описано в операторе DIMENSION.

Недостатки такого ввода:

необходимо вводить числа до тех пор, пока массив не заполнится;

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

программа не начнёт выполняться, пока не будут введены все элементы массивов. Достоинство: Самый простой способ записи ввода массивов.

Числа с клавиатуры можно вводить:

в строчку – перечисляя вводимые данные через пробел или запятую;

нажимая «Enter» после каждого введённого числа.

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

Второй способ ввода массивов: READ(5,*) (A(I),I=1,10)

Здесь ввод массива осуществляется при помощи неявного цикла DO, где I изменяется от 1 до 10 с шагом 1

Достоинство: таким способом можно ввести весь массив целиком или часть этого массива. Это весьма удобно использовать в программе, когда необходимо массив заполнить не полностью, а частично.

Недостатки: нет возможности задавать количество вводимых элементов (т.к. это количество указывается в программе как постоянная величина) и для того, чтобы можно было ввести любое количество необходимо делать изменения в программе.

Третий способ ввода массивов: READ(5,*) N

READ(5,*) (A(I),I=1,N)

или аналогичное: READ(5,*) N,(A(I),I=1,N)

32

Сначала вводится число N, обозначающее количество вводимых элементов массива, а затем вводится N–ное количество элементов массива.

Достоинства:

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

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

Недостатки: значение N не должно превышать размерность массива.

17. Вывод массивов

Первый способ вывода массива

WRITE(6,*) A

При бесформатном упрощенном выводе массива А на экран дисплея выведутся значения всех элементов массива, количество которых было описано в операторе DIMENSION. В каждой строке печатается по 5 чисел в виде:

-0.1234567Е-01

т.е. с точностью до 7 знаков после запятой. Недостатки:

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

при выводе массива не выводятся никакие пояснения (ни имени массива, ни порядкового номера элемента массива);

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

Достоинство: Простота использования.

Второй способ вывода массива: WRITE(6,*) (A(I),I=1,N) , где N – задано ;

Достоинства:

позволяет вывести только часть массива;

количество выводимых элементов задаётся пользователем; Недостатки:

нет никаких пояснений к выводимым числам (имя массива и порядковый номер);

элементы выводятся на экран по 5 чисел в каждую строку.

Третий способ вывода массива: WRITE(6,*) (’A(’,I,’)=’,A(I),I=1,N)

Здесь используется неявный цикл типа DO, по которому происходит вывод имени массива с помощью текстовой константы, а за ним в скобках указывается номер выведенного элемента и через знак ’=’ само численное значение элемента массив:

А(…1)=число А(…2)=число и т.д.

Недостаток: весь массив будет разбросан по экрану дисплея. Достоинство: имеется возможность каких либо пояснений.

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

33

Четвёртый способ вывода массива:

В этом способе используется внешний цикл DO.

DO 18 I=1,N

18 WRITE(6,*) ’A(’,I,’)=’,A(I)

Этот способ отличается от предыдущих трёх способов тем, что вместо неявного используется внешний цикл DO. В этом цикле оператор WRITE срабатывает N-ное количество раз и соответственно печатает N-ное количество строк. В каждой строке печатается текстовая константа с именем массива и символом « ( », номер цикла, затем печатается текстовая константа « )= » и потом числовое значение элемента массива.

Способ вывода массива в два столбца: DO 28 I=1,N,2

28 WRITE(6,*) ’A(’,I,’)=’,A(I),’ A(’,I+1,’)=’,A(I+1)

Примечание: если N - нечетное количество элементов массива, то последнее выведенное число не будет относиться к массиву А и может оказаться совершенно случайным числом, извлеченным из памяти ЭВМ.

Фрагменты задач с одномерными массивами

Мини задача:

Найти сумму элементов одномерного массива.

S=0.

DO 30 I=1,N

30S=S+A(I)

Вначале обнуляется ячейка S памяти ЭВМ, в которой будет содержаться значение суммы. Затем по циклу суммируется первое значение S (это 0) с первым элементом массива А и записывается в ячейку S. На втором цикле к ячейке S, в которой содержится 0+А(1) добавляется А(2) и записывается в S, и так до N-ного элемента массива.

Задача:

Определить значения µ при α=tн÷tk с шагом dt.

µ = arctg 3 lnαα e2

СПрограмма №10 REAL MU(1000)

Т.к. массив называется MU (из-за буквы М ЭВМ воспримет его как целого типа), то необходимо описать его с помощью оператора REAL, при этом использовать DIMENSION не надо.

WRITE(6,*)’Введите значения TN,TK,DT’ READ(5,*) TN,TK,DT

N=(TK-TN)/DT+1.

34

DT=(TK-TN)/(N-1)

A=TN

DO 3 I=1,N

I MU(I)=ATAN(ABS(ALOG(A)/EXP(2.*A))**(1./3.))

WRITE(6,*)’При A=’,A,’ значение MU=’,MU(I)

3A=A+DT

Блок I можно заменить блоком II

I=1

DO 3 A=TN,TK,DT

IIMU(I)= ATAN(ABS(ALOG(A)/EXP(2.*A))**(1./3.))

WRITE(6,*)’При A=’,A,’ значение MU=’,MU(I)

3I=I+1

PAUSE STOP END

Нахождение чётного числа M:

B=M/2.

K=M/2.

IF(B.EQ.K) WRITE(6,*)’ Число M является чётным’

Вводятся две переменные разных типов: В – вещественного типа и К – целого типа. Затем число M дважды делится на вещественную двойку (2.). Переменная В получится целой только тогда, когда M – четное число, иначе В будет иметь дробное значение. Затем сравниваются переменные В и К. Если они равны, то это значит, что число M – чётное.

Нахождение четного числа W вещественного типа.

L=W

IF (L/2.EQ.W/2.) WRITE(6,*) ’Четное число’,W

Мини задача:

В массиве А(200) найти произведение элементов, стоящих на нечётных местах по номеру.

DIMENSION A(200) READ(5,*) A

P=1.

DO 2 I=1,200,2 2 P=P*A(I)

Программа будет по циклу брать только нечётные элементы (1,3,5…) и перемножать их друг с другом. Вычисление произведётся до 199 элемента и остановится, т.к. 199 – последний нечётный элемент этого массива. При I=199 завершится последний цикл. Но затем к переменной I будет добавлена величина шага, равная 2 и новое значение I=201 будет сравниваться с конечным значением 200. Поскольку I будет больше конечного значения, то осуществляется выход из цикла и управление будет передано оператору, следующему после

35

последнего в области цикла. Т.е. оператору, следующему после метки 2. Следует обратить внимание, что после окончания цикла переменная цикла имеет значение, большее, чем

конечное значение в операторе цикла DO.

Мини задача:

Найти максимальное значение элемента массива А.

DIMENSION A(200)

READ(5,*)A

B=A(1)

DO 3 I=2,200

IF(A(I).GT.B) B=A(I) или можно B=AMAX1(B,A(I))

3CONTINUE

WRITE(6,*)’Максимальное значение массива А=’,B

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

В конце выводится максимальное значение массива А – число В.

Мини задача:

Найти минимальное значение массива А и порядковый номер этого элемента.

СПрограмма №11 DIMENSION A(200) READ(5,*)A

NC=1 До начала цикла в переменную, которая будет запоминать номер цикла с минимальным значением, заносим единицу.

C=A(1)

DO 4 I=2,200

IF (A(I).GE.C) GO TO 4

Здесь применяется элемент обратной логики: в зону после оператора IF можно попасть только тогда, когда А(I)<C (что и нужно по заданию).

СЗапоминание минимального элемента

C=A(I)

СЗапоминание номера элемента массива, в ячейке которого находится

Сминимальное число

NC=I

4CONTINUE

WRITE(6,*)’ Минимальное значение имеет элемент под номером ',NC WRITE(6,*)’Это значение равно ’,C или WRITE(6,*)’Это значение

равно’,А(NC)

36

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

IF (A(I).GT.C) GO TO 4

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

Для того, чтобы напечатать номера всех элементов массива, равных минимальному, необходимо найти минимальное значение. Затем повторить цикл, в котором сравнивать это минимальное значение с каждым элементом массива. И если они равны, то напечатать номер цикла:

DO 5 I=1,200

5 IF(A(I).EQ.C) WRITE(6,*)’Номер минимального элемента =’,I

Ещё один пример нахождения номера минимального элемента массива:

L=1

DO 5 I=2,200

5IF(A(I).LT.A(L)) L=I

WRITE(*,*)'Минимальный элемент массива А=', A(L)

Задача:

В одномерном массиве А(200) поменять местами максимальное и минимальное значения. Решение:

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

СПрограмма №12 REAL A(200)

WRITE(6,*)’Введите количество элементов массива А и их значения’

READ(5,*) N,(A(I),I=1,N)

AMI=A(1) Задаем начальные значения для нахождения максимума и минимума

 

AMA=A(1)

 

NMI=1 Задаем начальные значения для определения номеров циклов, когда

 

находится максимум и минимум.

 

NMA=1

 

DO 8 I=2,N

C

Блок нахождения максимального элемента и его номера методом

Собратной логики

IF(A(I).LE.AMA) GO TO 3

В эту зону после оператора IF, где происходит запоминание величины и номера максимального элемента, можно попасть только тогда, когда текущий элемент массива больше предыдущего значения АМА. Иначе управление передаётся на метку 3.

 

AMA=A(I)

 

NMA=I

C

Блок нахождения минимального элемента и его номера методом

Спрямой логики

3 IF(A(I).LT.AMI) AMI=A(I)

37

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

IF(A(I).EQ.AMI) NMI=I

Здесь запоминается номер минимального элемента только тогда, когда А(I)=AMI

8CONTINUE

СНайдено:

WRITE(6,*)’Максимальный элемент: А(’,NMA,’) =’,AMA WRITE(6,*)’Минимальный элемент: А(’,NMI,’) =’,AMI

СМеняем местами: A(NMI)=AMA

Значение максимума АМА записываем в элемент массива с номером NMI, где до этого находился минимальный элемент.

A(NMA)=AMI

Аналогично значение минимума АМI записываем в элемент массива с номером NMA, где до этого находился максимальный элемент. Таким образом, максимальный и минимальный элементы поменяются местами.

PAUSE STOP END

Мини задача:

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

Используем дополнительно переменную С для временного хранения числа при перестановке значений.

. . . . . . . . . . . .

С=A(NMI) A(NMI)=A(NMA) A(NMA)=C

Сортировка массива.

Задача:

Одномерный массив А(200) отсортировать по убыванию.

Решение. В цикле сравниваем поочередно два рядом стоящих элемента массива. И, если последующий элемент больше предыдущего, то меняем их местами. За один цикл от 1 до N-1 поменяются местами все элементы, значения которых удовлетворяет условию Ai+1>Ai. Если же цикл поместить внутри такого же цикла, то за n-1 прогонов поменяются местами все элементы

имассив будет отсортирован.

СПрограмма №13

Спервый способ сортировки массива

REAL A(200)

WRITE(6,*)’Введите количество элементов массива А и их *значения’

READ(5,*) N,(A(I),I=1,N)

DO 8 J=1,N–1 внешний цикл задает количество прогонов

38

DO 7 I=1,N–1 во внутреннем цикле просматриваются все элементы массива

IF(.NOT.(A(I+1).GT.A(I))) GO TO 7 Если ложно условие, что A(I+1)

больше, чем A(I), то ничего не переставлять и идти на конец цикла Или можно записать проще: IF(A(I+1).LE.A(I)) GO TO 7

Или ещё можно записать: IF(A(I).GT.A(I+1)) GO TO 7

CБлок перестановки соседних чисел в массиве

B=A(I)

A(I)=A(I+1)

A(I+1)=B

7CONTINUE

8CONTINUE

WRITE(6,*)’Отсортированный массив:’

DO 28 I=1,N,2

Выводится в два столбца

28 WRITE(6,*) ’A(‘,I,’)=’,A(I),’

A(‘,I+1,’)=’,A(I+1)

PAUSE

 

STOP

 

END

 

Для того, чтобы этой программой можно было сделать сортировку по возрастанию необходимо убрать .NOT. (или .GT. заменить .LT.).

Недостаток способа: чтобы отсортировать массив, необходимо сделать очень большое количество циклов: ((N–1)2 циклов).

Лучше использовать второй способ сортировки массива, который лишён указанного недостатка.

Второй способ сортировки массива:

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

СПрограмма №14

СВторой способ сортировки массива

REAL A(200)

WRITE(6,*)’Введите количество элементов массива А и их

 

*значения’

 

READ(5,*) N,(A(I),I=1,N)

 

DO 8 J=1,N–1 Задаем внешний цикл

 

AMA=A(J) Делаем подготовку к нахождению максимума …

 

NMA=J и запоминанию номера этого максимума

 

DO 7 I=J+1,N Задаем внутренний цикл со следующего элемента

C

Внутренний цикл определения максимального элемента и его номера

СОн начинается с J+1-го элемента и продолжается до N

IF(A(I).GT.AMA) AMA=A(I) Запоминаем максимум … 7 IF(A(I).EQ.AMA) NMA=I и его номер

CБлок перестановки

B=A(J)

A(J)=AMA

A(NMA)=B

39

8CONTINUE WRITE(6,*)’Отсортированный массив:’ DO 28 I=1,N

28WRITE(6,*) ’A(’,I,’)=’,A(I) PAUSE

STOP END

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

18. Конструкция IF THEN–ELSE IF THEN–ELSE – END IF

Эта конструкция позволяет разветвлять программу в нескольких направлениях. Она имеет вид:

IF (логическое выражение 1) THEN

СIF – блок

A=…

IF …

DO 8 … выполняемые операторы IF - блока

WRITE

READ

CALL

ELSE IF (логическое выражение 2) THEN

СELSE IF – блок 1

…….Выполняемые операторы ELSE IF – блока 1

ELSE IF (логическое выражение N) THEN

СELSE IF – блок N-1

…….Выполняемые операторы ELSE IF – блока n

ELSE

СELSE – блок

…….Выполняемые операторы ELSE – блока

END IF

Конструкция обязательно начинается с IF THEN, а заканчивается END IF. Другие блоки могут отсутствовать. Конструкция IF THEN работает следующим образом:

Анализируется логическое выражение 1. Если оно истинно, то выполняются все операторы IF – блока, а затем выполнение передаётся оператору, следующему за END IF. Если логическое выражение 1 ложно, то анализируется логическое выражение 2 ELSE IF – блока. При истинном значении логического выражения 2 выполняются все операторы ELSE IF – блока 1, а затем выполнение передаётся оператору, следующему за END IF. Если логическое выражение 2 ложно, то анализируется следующее логическое выражение следующего ELSE IF

– блока. Таких выражений может быть бесконечное количество. Если ни одно из логических

40