Название: Лабораторные работы по курсу “Информатика” ( Петров П.П.)

Жанр: Информатика

Просмотров: 1222


Использование массивов

Цель работы. Изучить особенности описания и использования массивов в программе.

Задание

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

Введение

Наряду с простыми переменными в алгоритмических языках используются переменные с индексами, называемые массивами. Массив – это упорядоченная последовательность величин, обозначаемая одним именем. Величины, из которых состоит массив, называются элементами массива. Элемент массива обозначается с помощью имени массива и индексов, следующих в круглых скобках за именем массива. Индексы отделяются друг от друга запятыми и указывают положение элемента в массиве. Индексов может быть 1, 2 и так далее вплоть до 7.  Соответственно массивы бывают одномерные, двумерные и т.д.

Все массивы, используемые в программе, должны быть описаны, так как для хранения элементов массива в определенной последовательности отводится необходимый объем памяти. При описании указываются имя массива и затем в круглых скобках через запятую граничные пары, т.е. разделенные двоеточием минимальные и максимальные значения соответствующего индекса. При отсутствии двоеточия минимальное значение соответствующего индекса в Фортране по умолчанию равно единице. Для описания массивов в Фортране используются операторы описания типа переменных (REAL, INTEGER, COMPLEX, LOGICAL, CHARACTER, DOUBLE PRECISION), а также атрибут и оператор DIMENSION.

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

INTEGER, PARAMETER :: N=4

REAL, DIMENSION :: A(N,N), B(N), K(N+1,N+1), C(0:N)

В этом примере оператор REAL c атрибутом DIMENSION описывает двумерный вещественный массив A, содержащий 16 элементов; одномерный вещественный массив B, содержащий 4 элемента; двумерный вещественный массив K, содержащий 25 элементов, и одномерный вещественный массив C, содержащий 5 элементов.

Объекты с общими атрибутами можно группировать в единый список, например, следующий оператор описывает два двумерных вещественных массива D и E, каждый из которых имеет 3 строки и 4 столбца.

REAL, DIMENSION (3,4) :: D, E

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

INTEGER MIN(2,2), MAX(10)

REAL Q(5), SUMMA(3,3)

Здесь MIN и MAX – целые массивы, содержащие 4 и 10 элементов соответственно;  Q  и  SUMMA – вещественные массивы, содержащие 5 и 9 элементов.

Оператор DIMENSION также может использоваться для описания массивов, например, для описания одномерного вещественного массива F из 10 элементов

REAL F

DIMENSION F(-2:7)

Использование оператора DIMENSION без операторов описания типа, когда тип массива определяется по умолчанию возможно, но нежелательно.

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

В Фортране список операторов ввода READ и вывода PRINT или WRITE может содержать как имена простых переменных и элементов массива, так и имена массивов. В последнем случае вводу-выводу подлежат все элементы массива в «естественной последовательности» (т.е. сначала растет первый индекс, затем второй и т.д.). Так, если в программе описан массив A(2,2) и имеется оператор ввода READ *, A, то численные значения необходимо задавать в такой последовательности: A(1,1), A(2,1), A(1,2), A(2,2), т.е. любая матрица вводится по столбцам. Для изменения порядка ввода-вывода или если требуется передать только часть элементов массива, можно использовать неявную форму оператора цикла. Например, ввод матрицы A(2,2) по строкам осуществляет оператор READ *, ((A(I,J), J=1,2), I=1,2).

Не следует забывать, что в Фортране функции «что вводить (выводить)» и «как вводить (выводить)» распределены между операторами ввода-вывода и оператором FORMAT.

Если в программе предусмотрен ввод исходных данных с клавиатуры, то в процессе отладки приходится задавать одни и те же численные значения много раз. Поэтому, когда исходных данных достаточно много, удобнее записать их перед счетом программы в файл данных, а в программе предусмотреть оператор, считывающий данные из файла данных. Кроме того, результаты также имеет смысл выводить в файл данных, чтобы иметь возможность получить распечатку результатов счета. Обращение к файлу данных производится по его логическому номеру N, указанному в операторах READ (N,…) или WRITE (N,…). С помощью оператора OPEN можно как назначать логические номера уже имеющимся файлам, так и создавать новые файлы с указанием соответствующего логического номера, например, OPEN  (1, FILE=’LAB4.TXT’). После выполнения этого оператора файлу LAB4.TXT будет соответствовать логический номер 1. Файл LAB4.TXT создается в папке проекта либо предварительно до запуска программы на счет, либо в процессе работы программы в момент выполнения оператора OPEN. Для завершения доступа к файлу используется оператор CLOSE.

 

Типовые примеры использования массивов

 в программах

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

В Фортран встроено большое число функций, позволяющих:

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

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

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

 

1. Ввод одномерного массива B(8) можно осуществить несколькими способами:

а)                         READ (1,*) B

Численные значения (8 значений) перед запуском программы на счет записываются через запятую или пробел в файл данных, соответствующий логическому номеру 1. Этот способ предпочтителен;

б)                         PRINT 1

                   1        FORMAT (‘ INPUT VECTOR B(8)’)

                            READ *, B

После появления на экране монитора текста INPUT VECTOR B(8) численные значения элементов массива вводятся с клавиатуры (8 значений через запятую или пробел);

в)                         PRINT 1

                   1        FORMAT (‘ INPUT VECTOR B’)

                                DO I=1,8

                                    PRINT 2, I

                                    READ *, B(I)

                                END DO

                   2        FORMAT (‘ B(‘,I2,’)=’)

Массив вводится с клавиатуры поэлементно по одному значению в строку после появления на экране соответствующей подсказки.

2. Ввод двумерного массива A(4,4):

а) из файла данных построчно с использованием неявной формы цикла

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

Перед выполнением программы численные значения записываются в файл данных, соответствующий логическому номеру 1, в четыре строки по четыре элемента в строку через запятую или пробел;

б) из файла данных построчно с использованием сечения массива (простейшей формы индексного триплета)

                            READ (1,*) (A(I,:),I=1,4)

Файл данных такой же, как и в случае а);

в) с клавиатуры построчно через запятую или пробел

                            READ *, (A(I,:),I=1,4)

г) с клавиатуры построчно (с подсказкой о номере строки)

                            DO I=1,4

                                PRINT 2, I

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

                            END DO

                   2        FORMAT (‘ INPUT‘,I2,' STROKI’)

3. Вывод одномерного массива B(4) на экран:

                            PRINT 5, B

                   5        FORMAT (‘ VECTOR B’/4F10.4)

При выводе в файл данных оператор PRINT заменяется на оператор WRITE, например, при выводе двумерного массива A(4,4)

                            WRITE (1,10) (A(I,:), I=1,4)

                   10      FORMAT (‘ MATRICA A’/4(4F10.4/))

4. Суммирование элементов одномерного массива B(10)    :

а) с использованием встроенной функции SUM

                            S=SUM(B)

б) по следующему алгоритму: начальное значение суммы принимается равным нулю , затем в цикле по  от 1 до 10 накапливается сумма  

                            S=0.

                                DO I=1,10

                                    S=S+B(I)

                                END DO

5. Произведение элементов одномерного массива B(10)  :

а) целесообразно использовать встроенную функцию PRODUCT

                            P=PRODUCT(B)

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

                            P=1.

                                DO I=1,10

                                    P=P*B(I)

                                END DO

6. Пусть требуется определить максимальный элемент массива B из N элементов и его номер K:

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

                            INTEGER, PARAMETER :: N=10

                            REAL B(N) /1.,2.,3.,4.,5.,6.,5.,4.,3.,2./

                            S=B(1);  K=1

                                DO  I=2,N

                                    IF (S<B(I)) THEN

                                        S=B(I);  K=I

                                    END IF

                                END DO

                            PRINT *, ’ S=’, S, ‘  K=’, K

                            END

б) Определение максимального (или минимального) элемента одномерного массива  и номера  этого элемента можно выполнить с использованием встроенных функций MAXVAL  и  MAXLOC.

                            INTEGER, PARAMETER :: N=10

                            REAL B(N) /1.,2.,3.,4.,5.,6.,5.,4.,3.,2./

                            S=MAXVAL(B);  K=MAXLOC(B)

                            PRINT *, ’ S=’, S, ‘  K=’, K

                            END

7. Пусть требуется расположить элементы одномерного массива B(10) в порядке невозрастания, т.е. так, чтобы для всех элементов массива выполнялось условие:  при . Рассмотрим один из способов решения этой задачи. Сначала из всех элементов  при  найти максимальный (его величину  и номер ), затем переставить первый и максимальный элементы. Из оставшихся девяти элементов  при  найти максимальный и поменять его местами со вторым и т.д. Перестановка двух элементов массива с номерами  и  выполняется следующим образом: элемент  равен , поэтому сначала следует заменить  на , а затем  присваивается значение . Программа упорядочения элементов массива будет иметь следующий вид:

                            DO J=1,9

                                S=B(J);  K=J

                                      DO I=J+1,10

                                          IF (S<B(I)) THEN

                                               S=B(I);  K=I

                                          END IF

                                      END DO

                                B(K)=B(J);  B(J)=S

                            END DO

Внешний цикл по  изменяет номер элемента, с которого начинается поиск.

 

8. Пусть требуется составить одномерный массив С(4) из максимальных элементов строк матрицы А(4,4). Программа строится по схеме двойного цикла. Параметром внешнего цикла является номер строки . Во внутреннем цикле по  определяется максимальный элемент строки:

                            DO I=1,4

                                C(I)=A(I,1)

                                      DO J=2,4

                                          IF (C(I)<A(I,J)) C(I)=A(I,J)

                                      END DO

                            END DO

 

9. Пусть требуется умножить матрицу А(4,4) на вектор В(4). Результатом умножения матрицы А(4,4) на вектор В(4) является вектор С(4), элементы которого определяются по формуле

.

 

а) используем встроенную функцию MATMUL, которая выполняет матричное умножение операндов

C=MATMUL(A,B)

 

б) алгоритм строится по схеме двойного цикла: внешний цикл по параметру , во внутреннем цикле по параметру  производится суммирование:

DO I=1,4

                                C(I)=0.

                                      DO J=1,4

                                          C(I)=C(I)+A(I,J)*B(J)

                                      END DO

                        END DO

10. Пусть требуется найти произведение D матрицы A на матрицу F, где A(4,4), F(4,4) и D(4,4). Умножение матрицы на матрицу осуществляется по схеме тройного цикла в соответствии с формулой ,  где  и .

а) используем схему тройного цикла с суммированием во внутреннем цикле

                            DO I=1,4

                                DO J=1,4

                                      D(I,J)=0.

                                          DO K=1,4

                                               D(I,J)=D(I,J)+A(I,K)*F(K,J)

                                          END DO

                                END DO

                            END DO

б) используем схему двойного цикла со встроенной функцией суммирования

                            DO I=1,4

                                DO J=1,4

                                      D(I,J)=SUM(A(I,:)*F(:,J))

                                END DO

                            END DO

11. Пусть требуется вычислить элементы матрицы D(4,4) по формулам:

                          .

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

                            DO I=1,4

                                DO J=1,4

                                      IF ((B(I)+B(J))<-1.) THEN

                                          D(I,J)=(B(I)+B(J))**2

                                      ELSE IF ((B(I)+B(J))>1.) THEN

                                          D(I,J)=SQRT(B(I)+B(J))

                                      ELSE

                                          D(I,J)=2.*(B(I)+B(J))

                                      END IF

                                END DO

                            END DO

 

Варианты заданий к лабораторной работе № 4

В вариантах заданий в качестве исходных данных используются следующие массивы:

1.  Заданы массивы А(4,4), В(4). Вычислить элементы массивов С(4), D(4,4), F(4,4) в соответствии с формулами:

               ,   .

Вывести на печать массивы C, D, F.

2.  Заданы массивы A(4,4), B(4). Вычислить элементы массива по формуле:

      .

Найти максимальный элемент массива P=C+B. Преобразовать матрицу A, разделив все ее элементы на найденный максимум. Печатать A, B, C, P.

3.  Заданы массивы A(4,4), B(4).  Из 1-й строки  А  вычесть  3-ю  и  в  полученной  матрице  найти  максимальный элемент. Из всех элементов массива  В  вычесть найденный максимум.  Печатать А, В.

4.  Задан массив В(4). Вычислить элементы массива С(4) по формулам

     .

Вычислить элементы матрицы D(4,4) по формуле . Найти , из всех элементов массива B вычесть S. Печатать B, C, D, S.

5.  Задан массив А(4,4). Составить вектор С(4) из минимальных элементов в столбцах А. Из каждой строки А вычесть С. Печатать А, С.

6.  Задан массив А(4,4). Составить вектор С(4) из максимальных модулей элементов в строках А. Элементы вектора С разделить на максимальный элемент С. Из диагональных элементов А вычесть С. Печатать A, C.

7.  Заданы массивы А(4,4), В(4). Найти С=АВ. Максимальный элемент С и его номер . Из k-й строки матрицы А вычесть С. Печатать A, B, C, .

8.  Заданы массивы А(4,4), В(4). Найти максимальные элементы массивов А и В и поменять их местами. Печатать А, В.

9.  Задан массив В(4). Вычислить элементы массива С(4) по формулам

   .

Вычислить элементы матриц D(4,4)  и F(4,4) . Найти Q=DF. Печатать С, D, F, Q.

10.  Заданы массивы А(4,4), В(4). Составить вектор С(4) из максимальных элементов в строках А. Вычислить P=BC. Из диагональных элементов А вычесть P. Печатать А, В, С, Р.

11.  Задан массив А(4,4). Вычислить элементы массива по формулам. Найти F=AD. Печатать A, D, F.

   .

12.  Заданы массивы А(4,4), В(4). Найти максимальный элемент В и его номер , минимальный элемент  В  и  его номер . В матрице А элемент  заменить на найденный максимум,  – на минимум. В векторе В поменять местами максимальный и минимальный элементы. Вычислить C=AB. Печатать А, В, С.

13.  Заданы массивы А(4,4), В(4). Упорядочить B в порядке неубывания. Из каждой строки А вычесть В. Печатать А, В.

14.  Заданы массивы А(4,4), В(4). Вычислить С=АВ. Упорядочить С в порядке невозрастания. Из столбцов А вычесть С. Печатать А, В, С.

15.  Задан массив В(4). Вычислить С(4) по формулам:

,    ,    ,    .

Вычислить элементы D(4,4) по формулам

  .

Печатать B, C, D.

16.  Заданы массивы А(4,4), В(4). Упорядочить строки А по неубыванию значений первых элементов строк. Вычислить элементы вектора С(4) по формуле . Печатать A, B, C.

17.  Задан массив В(4). Вычислить элементы матрицы D(4,4) по формулам

     

Найти максимальные элементы D и B, поменять их местами. Печатать B, D.

18. Задан массив В(4). Вычислить элементы матрицы D(4,4) по формулам. Из всех элементов D вычесть максимальный элемент В. Вычислить C=DB. Печатать B, C, D.

      .

19.  Задан массив А(4,4). Вычислить элементы вектора С(4) по формулам:

,    ,

,    .

Вычислить P=AC. Из диагональных элементов A вычесть вектор Р. Печатать А, С, Р.

20.  Заданы массивы A(4,4), В(4). В матрице A найти минимальный и максимальный элементы, поменять их местами. Вычислить C=АВ. Печатать A, В, С.

21.  Заданы массивы A(4,4), В(4). В массиве B найти максимальный и минимальный элементы, поменять их местами. Вычислить C=АВ. Из диагональных элементов A вычесть вектор С. Печатать А, В, С.

22.  Задан массив A(4,4). Из диагональных элементов A вычесть максимальный элемент А. Вычислить вектор С(4) как сумму 1-й и 3-й строк А. Вычислить P=АС. Печатать A, С, Р.

23.  Заданы массивы А(4,4), В(4). Вычислить C=АВ. Упорядочить C в порядке неубывания. Из диагональных элементов A вычесть вектор С. Печатать А, В, С.

24.  Заданы массивы A(4,4), В(4). Вычислить элементы массива С(4) как сумму элементов в соответствующих строках А. Из диагональных элементов А вычесть С. Вычислить P=АС. Печатать A, С, Р.

25.  Задан массив А(4,4). Вычислить элементы массива D(4,4) по формулам. Вычислить F=AD. Печатать A, D, F.

   .

26.  Задан массив B(4). Вычислить элементы массива C(4) по формуле . Вычислить элементы массива D(4,4) по формуле . Печатать B, C, D.

27.  Задан массив B(4). Вычислить элементы массива C(4) по формуле . Вычислить элементы массива D(4,4) по формуле . Печатать B, C, D.

28.  Заданы массивы A(4,4), В(4). Вычислить C=АВ. Из первой строки A вычесть B, из второй строки A вычесть вектор С. Печатать A, B, C.

29.  Заданы массивы A(4,4), В(4). Найти максимальный и минимальный элементы B и поменять их местами. Вычислить C=АВ. Печатать A, В, С.

30.  Задан массив B(4). Вычислить элементы массива C(4) по формуле: . Найти и поменять местами максимальные элементы B и С. Вычислить элементы массива D(4,4) по формуле . Печатать B, C, D.

 

Задачи к защите лабораторной работы № 4

1.  Даны A(n,n+1), B(n+1), C(n+1). Получить  D(n+1, n+2) вставкой в A после строки с номером  вектора B и последующей вставкой после столбца с номером  вектора C.

2.  Дана  A(n,m). Получить  D(n,m) перестановкой в  A столбцов – первого с последним, второго с предпоследним и т.д.

3.  Дана A(n,m). Получить D(n,m) перестановкой в A строк – первой с последней, второй с предпоследней и т.д.

Дана А(n,m). Получить  D(n,m). Каждый элемент  равен сумме элементов матрицы A в заштрихованной области:

 

         4              5             6              7              8             9

 

10.  Дана A(n,m). Получить D(n-1,m-1) путем выбрасывания из А строки и столбца, на пересечении которых расположен максимальный элемент А.

11.  Дана действительная матрица A(n,m). Найти сумму наибольших значений элементов ее строк.

12.  Дано действительное число x. Получить A(n,n):

.

13.  Дан вектор В(n). Получить А(n,n):

.

14.  Дан вектор В(n). Получить А(n,n):

.

15-16.  Получить матрицу А(7,7), элементами которой являются числа 1,2,3,4,....,49

                15                                                       16

17-25.  Дана матрица A(n,n). Найти наибольший ее элемент в заштрихованной области

 

   17         18         19        20         21        22         23         24        25

 

26-30.  Дана матрица A(2n,2n). Получить D(2n,2n), переставляя блоки n*n матрицы A:

 

26             27              28              29            30

 

Литература

Бартеньев О.В.  Современный FORTRAN. – М.: Диалог-МИФИ, 2000.– 447 с.

Бартеньев О.В.  FORTRAN для студентов. – М.: Диалог-МИФИ, 1999.– 400 с.

Рыжиков Ю.И.  Программирование на Фортране PowerStation   для   инженеров.   Практическое  руководство.      – С.-Петербург: Корона принт, 1999.– 159 с.

Бартеньев О.В.  Visual Fortran: новые возможности. – М.: Диалог-МИФИ, 1999.– 301 с.

Штыков В.В.  FORTRAN & WIN32 API. Создание программного интерфейса для Windows средствами современного Фортрана. – М.: Диалог-МИФИ, 2001.– 302 с.

Мудров А.Е. Численные методы для ПЭВМ на языках Бейсик, Фортран и Паскаль. – Томск: Раско, 1992.– 270 с.