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

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

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

выражений не оказалось истинным, то мы доходим до ELSE – блока и происходит выполнение всех операторов ELSE – блока.

Затем управление передается оператору, следующему после END IF.

Правила:

Войти в конструкцию IF THEN ELSE можно лишь только через оператор IF в самом начале конструкции, т.е. запрещена передача управления из внешней части программы внутрь конструкции IF THEN ELSE (например, через оператор GO TO).

Передача управления из одного блока конструкции в другой запрещена.

Выйти из конструкции можно в любое, не запрещённое место программы с помощью операторов IF или GO TO.

Первый оператор конструкции IF THEN ELSE не может быть последним оператором в цикле DO.

Примечания:

Внутри любого блока конструкции могут содержаться свои законченные конструкции типа IF THEN ELSE.

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

Задача:

В одномерном массиве из N элементов выделить и записать в отдельные массивы: 1). Элементы, значения которых меньше нуля.

2). Элементы, значения которых лежат в пределах от 0 до 100. 3). Все элементы, значения которых больше 100.

Вывести, сколько процентов от общего количества составляет количество первого, второго, третьего массивов. При составлении программы использовать структуру IF THEN ELSE.

С

Программа №15

 

DIMENSION A(1000),A1(1000),A2(1000),A3(1000)

 

15 J=1 Переменные J,K,L служат счетчиками для количества элементов

 

массива. Почему L=0 – разберитесь в программе ниже.

 

K=1

 

L=0

 

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

 

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

 

DO 10 I=1,N

CБлок записи в массив А1 отрицательных элементов массива А: IF(A(I).LT.0.) THEN

A1(J)=A(I) запоминается в массиве А1 отрицательное число J=J+1 счетчик первого массива увеличиваем на 1

СВ массив А2 записываем значения элементов массива А от 1 до 100 ELSE IF (A(I).GE.0..AND.A(I).LE.100.) THEN

A2(K)=A(I)

K=K+1 счетчик второго массива увеличиваем на 1

СБлок записи в массив А3 элементов массива А, больших 100

41

ELSE

L=L+1 поняли?

A3(L)=A(I) END IF

10 CONTINUE

CВычисление процентных соотношений

P1=(J-1.)/N*100.

Если в выражении (J-1.) не поставить точку после единицы, то после вычисления этого выражения получится целое число. После деления целого на целое число N результат также будет целого типа, т.е. ноль.

P2=(K-1.)/N*100.

Другой способ записи: P2=100.*(K-1)/N – здесь точка после единицы не обязательна, т.к. сначала вычислится целое К-1, а затем слева направо будут идти умножение вещественного 100 на целое К-1 и делиться на N. Но если у числа 100 не поставить точку, то результат будет искажен.

P3 = L * 100. / N Отметьте, что в этом выражении стоит просто L.

WRITE(6,*)’Количество отрицательных чисел, в %=’,P1 WRITE(6,*)’ Количество чисел в диапазоне от 0 до 100, в %=’,P2 WRITE(6,*)’ Количество чисел, значения которых больше 100’,P3 PAUSE

GO TO 15

11STOP END

Программа проанализирует каждый элемент массива А и, в зависимости от их величины, занесёт в разные массивы (в А1 – если число меньше нуля; в А2 – если число лежит в диапазоне от 0 до 100; в А3 – если число больше ста). Затем определит, какой процент от всех чисел массива А содержится в массивах А1, А2, А3 и выведет полученные значения на дисплей.

19. Оператор DATA

Оператор DATA служит для задания значений переменным или массивам на этапе трансляции программы. Записывается в виде:

DATA список имён/ список констант/

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

Всписке констант могут быть только константы.

Правило:

Список имён должен соответствовать списку констант:

1.по очерёдности следования

2.по типу данных.

Правило выполняется следующим образом:

42

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

2). Каждой переменной, каждому массиву и элементу массива в списке имён оператора DATA соответствует константа, которая должна быть такого же типа (целого, вещественного и др. типов).

Например:

DIMENSION C(10)

DATA A,B,K,N/3.5,-4.2E-3,17,6/ (K и N целого типа и им соответствуют 17 и 6)

DATA C/3.2,6.5,6*0.,-15.7,-18./

Заполнение массива С(10) происходит следующим образом: С(1)=3.2; С(2)=6.5; затем

следует групповой множитель 6*0., который означает – шесть раз повторить число 0.;

С(9)=

–15.7; С(10)= –18.

 

 

Пример:

 

 

DATA C(1),C(2),C(8)/3*6.2/

элементам массива С номер 1, 2, 8 присвоится значение

6.2

 

 

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

Пример:

COMPLEX D1,D2 CHARACTER*6 E1,E2,E3*12

DATA D1,E1/(-3.6,15.7E3),’ОСЕНЬ_’/

Правило:

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

Операторов DATA в программе может быть сколько угодно. Оператор DATA может располагаться в любом месте программы.

20. Модификации оператора GO TO

Как уже ранее рассматривалось, оператор GO TO является оператором перехода, с помощью которого можно передавать управления в любую часть программы. При этом мы рассматривали безусловную модификацию оператора GO TO, когда управление обязательно передавалось на метку, которая указывалась за оператором GO TO.

Например, GO TO 10

Обязательным условием применения этого оператора является то, что следующий за

ним оператор должен иметь метку.

Существует вторая модификация оператора –

GO TO: вычисляемый.

GO TO(m1, m2, m3, …, mn) арифметическое выражение

43

Пример: GO TO(5, 4, 1, 5) A*SIN(X)

Происходит вычисление арифметического выражения и полученный результат приводится к целому типу. Если полученный результат имеет значение 1, то оператор GO TO передаёт управление на первую метку, т.е. на метку 5, если равен 2, то на метку 4 и т.д. Если значение арифметического выражения меньше 1 либо больше n , то оператор GOTO не выполняется.

Оператор GOTO по предписанию

GOTO целая переменная (метки), где:

целая переменная определяется в специальном операторе ASSIGN. Оператор назначает номер метки переменной целого типа. А оператор GOTO по предписанию может осуществить переход на одну из перечисленных меток в зависимости от значения целой переменной.

IF (A .GT. B) THEN

ASSIGN 10 TO MET

ELSE IF (A .EQ. B) THEN

ASSIGN 20 TO MET

ELSE

ASSIGN 25 TO MET

END IF

Затем осуществим переход на одну из меток:

GOTO MET (10,20,25) ….

….

….

10 WRITE …

20 IF …

25 WRITE …

Если значение MET совпадает с любой из меток списка, то осуществляется переход на эту метку. Если MET не совпадает ни с одной из меток списка, то оператор GOTO не выполняется.

21. Работа с двухмерными массивами

Двухмерные массивы (матрицы) описываются в операторе

DIMENSION A(n1,n2)

где А – имя массива;

n1,n2 – количество строк и столбцов соответственно.

44

Пример:

DIMENSION A(4,5) – Массив состоит из 20 элементов, которые расположены в 4 строках и 5 столбцах.

Графический вид массива А:

 

 

а11

а12

а13

а14

а15

 

 

 

 

 

 

 

 

 

а21

а22

 

3.3

 

 

 

 

 

 

 

 

 

 

а31

а32

-1.2

 

 

 

 

 

 

 

 

 

 

 

а41

 

 

а44

 

 

 

 

 

 

 

 

 

 

 

 

 

главная

 

побочная диагональ

 

 

 

диагональ

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

А(2,4)=3.3

У двухмерного массива всегда два индекса.

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

I=3

J=4 A(I,J-1)= –1.2

Элементы, которые лежат на главной диагонали, имеют одинаковые номер строки и номер столбца.

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

Главная особенность работы с двухмерными массивами: следует учитывать, что в

памяти ЭВМ элементы двухмерного массива расположены по столбцам.

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

22. Ввод двухмерного массива

DIMENSION A(4,5)

Ввод двухмерного массива похож на ввод одномерного массива и также может осуществляться разными способами:

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

READ(5,*) A

Означает, что введённые числовые значения будут заполнять массив в той очерёдности, в какой этот массив располагается в памяти ЭВМ.

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

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

45

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

1000х1000 элементов);

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

программа не будет продолжать работу до тех пор, пока не будут введены все элементы

массивов.

Достоинство: Самый простой способ записи ввода массивов.

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

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

Здесь ввод массива осуществляется при помощи неявных вложенных циклов типа DO, где переменная внутреннего цикла I изменяется от 1 до 4 с шагом 1 и переменная внешнего цикла J также изменяется от 1 до 5 с шагом 1.

Данные неявные циклы DO в обычном (явном) виде можно записать:

DO 7 J=1,5

DO 7 I=1,4

7 READ(5,*) A(I,J)

Тогда необходимо будет вводить по одному числу в строке.

Достоинства: таким способом можно ввести весь массив целиком или часть этого массива.

Недостатки:

ввод элементов необходимо производить по столбцам;

нет возможности задавать количество вводимых элементов.

Третий способ ввода массивов:

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

READ(5,*) ((A(I,J),J=1,5),I=1,4)

При такой записи внутренним циклом является второй индекс, он быстрее изменяется и заполнение массива идёт по строкам.

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

нагляднее и привычнее.

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

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

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

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

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

Мини задачи с массивом А(4,5):

1). Найти сумму элементов двухмерного массива А(4,5)

46

 

DIMENSION A(4,5)

 

READ(5,*)A

 

S=0.

 

DO 18 J=1,5

 

DO 8 I=1,4

8

S=S+A(I,J)

18

CONTINUE

19

 

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

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

2). Найти сумму всех положительных элементов

DIMENSION A(4,5)

S=0.

DO 18 I=1,4

DO 8 J=1,5

8 IF(A(I,J).GT.0.) S=S+A(I,J)

18 CONTINUE

Программа по двум циклам (внешний – по I и внутренний – по J) перебирает все элементы массива и сравнивает их с нулём (IF(A(I,J).GT.0.)). Если анализируемый элемент массива больше нуля, то происходит суммирование положительных элементов массива путём прибавления их к переменной S. В отличие от предыдущего примера очередность обработки элементов массива идет по строкам.

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

 

 

 

 

AM=A(1,1)

 

 

DO 18 J=1,5

 

 

DO 8 I=1,4

 

8

AM=AMAX1(AM,A(I,J))

Или: IF(A(I,J).GT.AM) AM=A(I,J)

18

CONTINUE

 

Программа анализирует все элементы массива. Цель анализа – найти число, которое больше переменной AM и присвоить это число той же переменной АМ. Таким образом, переменная АМ постепенно меняет своё значение по возрастающей, пока не станет равна самому большому элементу анализируемого массива. Далее переменную AM можно вывести на дисплей или дальше использовать в программе, как самый большой элемент массива.

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

47

AMI=A(1,1)

DO 8 J=1,5

DO 8 I=1,4

IF (A(I,J).GT.AMI) GO TO 8

СИспользуется способ обратной логики.

 

AMI=A(I,J)

запоминаем минимум

 

NSTR=I

запоминаем номер строки

 

NSTB=J

запоминаем номер столбца

8

CONTINUE

 

Результатом работы программы будут три числа: AMI – минимальный элемент массива; NSTR – хранит номер строки минимального элемента; NSTB – хранит номер столбца минимального элемента.

Следует помнить, что после окончания циклов значения у переменных I и J будут больше, чем конечные значения в цикле DO. Они будут равны J=6, I=4.

5). Транспонировать матрицу (т.е. b11=a11, b12=a21).

DIMENSION A(4,5),B(5,4) DO 11 L=1,5

DO 11 K=1,4 11 B(L,K)=A(K,L)

6). Найти сумму элементов массива, находящихся под главной диагональю, включая элементы, лежащие на диагонали.

 

S=0.

 

 

 

 

 

 

DO 15 I=1,4

+

а21

а31

а41

а51

 

DO 15 J=1,IВнутренний цикл изменяется от 1 до I

 

 

 

 

 

 

 

+

+

 

 

 

15

S=S+A(I,J)

 

 

 

7). Найти сумму элементов, находящихся на главной

+

+

+

 

 

 

 

 

 

 

 

 

 

 

 

диагонали

S=0.

+

+

+

+

 

 

 

 

 

 

 

 

 

 

 

 

 

 

DO 16 I=1,4

 

 

 

 

 

16S=S+A(I,I) Следует обратить внимание что, первый и второй индексы могут быть одинаковыми и достаточно одного цикла для авчисления.

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

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

48

 

PR=1.

 

 

 

 

 

DO 12 I=1,4

 

 

 

 

 

Цикл, в котором изменяется номер строки

+

+

+

+

 

D0 12 J=1,5-I

 

 

 

 

 

 

+

+

+

 

 

Цикл, в котором изменяется номер столбца

 

12

PR=PR*A(I,J)

 

 

 

 

+

+

 

 

 

 

 

 

9). Найти количество положительных элементов каждого

 

 

 

 

+

 

 

 

столбца массива. Все эти значения записать в отдельный массив.

Решение: во внутреннем цикле, в котором будет осуществляться перебор номеров строк, будет подсчитываться количество положительных элементов. Количество этих циклов – 4. Внешний цикл будет повторяться 5 раз, а внутри этого цикла будут осуществляться операции по нахождению количества элементов в каждом столбце.

REAL A(4,5), B(5) READ(5,*) A

CВнешний цикл

DO 15 N=1,5

CВнутренний цикл

B(N)=0.

DO 16 M=1,4

15 IF(A(M,N).GT.0.) B(N)=B(N)+1

15CONTINUE

Вданном примере количество положительных элементов записано в массив с именем В. Это массив вещественного типа. Лучше, если количество (числа целые) будут записываться в массив целого типа. Например, К.

10). Поменять местами последний и первый столбцы массива.

REAL A(4,5)

READ(5,*) A

DO 17 J=1,4 C=A(J,1) A(J,1)=A(J,5)

17 A(J,5)=C

11). Найти сумму элементов каждой строки, и записать их в массив.

REAL A(4,5), C(4) READ (5,*)A

DO 10 I=1,4 Внешний цикл перебирает строки

C(I)=0.

DO 9 J=1,5 Внутренний цикл перебирает столбцы одной строки

9C(I)=C(I)+A(I,J) Суммирование элементов одной строки, перебирая номера столбцов

10CONTINUE

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

найти сумму элементов двухмерного маасива, расположенных в верхнем треугольнике, ограниченном главной и побочной диагональю;

- то же, но в нижнем труегольнике;

49

- то же, но в левом и правом треугольниках;

поменять местами элементы первого столбца и последней строки (за исключением общего элемента);

- то же, но первой строки и последнего столбца;

- то же, но последней строки и последнего столбца.

23. Вывод двухмерного массива

Предположим, мы имеем заполненный двухмерный массив А(3,4). Самым простым выводом массива является бесформатный.

WRITE(6,*)A

В списке вывода указано только имя двухмерного массива. Это обозначает, что необходимо вывести столько элементов, сколько их описано в операторе DIMENSION. На экран дисплея будут выведены элементы массива в той очередности, как они хранятся в памяти ЭВМ. Т.е. по столбцам. Поскольку вывод осуществляется бесформатно, то на экран будет автоматически выводиться по 5 чисел в одну строку с точностью 7 знаков после запятой. Выведенная таким образом информация очень неудобна для восприятия и такой вывод можно осуществлять только в крайних случаях.

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

WRITE(6,*)((A(I,J),I=1,3),J=1,4)

Количество выводимых строк I=1,3 или столбцов J=1,4 может изменяться. Но очередность вывода останется прежней, по столбцам. Поскольку цикл по I является внутренним по отношению к внешнему циклу по J.

Очередность вывода можно изменить и выводить массив по строкам. Это несколько удобнее для восприятия информации.

WRITE(6,*)((A(I,J),J=1,4),I=1,3)

Однако и в этом случае в одной строке будет напечатано по 5 чисел.

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

DO 1 I=1,3

1 WRITE(6,*)(A(I,J),J=1,4) выводится одна строка

Лучше, если при выводе числовой информации, будет выводиться и поясняющий текст в виде имени массива и номеров строки и столбца каждого элемента:

DO 1 I=1,3

1 WRITE(5,*)(’A(’,I,’,’,J,’)=’,A(I,J),J=1,4)

50