Решение задач с двумерными массивами Задание
1. Написать программу, которая:
a) вводит из файла In.txt на диске количество строк и столбцов, динамически размещает матрицу; вводит её;
b) выводит по формату матрицу A с заголовком в файл Out.txt;
c) вводит с клавиатуры дополнительные параметры, если они есть в варианте индивидуального задания;
d) выводит по формату результаты работы программы, поясняя смысл каждого значения формулировками из индивидуального задания.
2. Дополнить программу внешним циклом, в котором последовательно ввести матрицы разных размеров и выполнить для каждой из них индивидуальное задание.
Содержание отчета
1. Название работы и номер варианта индивидуального задания.
2. Фамилия, имя, отчество и номер группы студента.
3. Текст варианта индивидуального задания.
4. Блок-схема программы.
5. Распечатка текста программы.
6. Распечатка файла результатов Out.txt.
Комментарии к заданию
1. Каждую матрицу готовить в файле In.txt следующим образом:
a) M, N (M и N – количество строк и столбцов матрицы )
b) Матрица, содержащая M строк и N столбцов.
Далее пункты a) и b) повторяются для каждой следующей матрицы.
2. Рекомендуется выбрать M £ 10 и N £ 10 и для контроля вывести М и N в файл результатов Out.txt.
Справочная информация
Размещение двумерного массива в памяти компьютера
В Фортране принято, что элементы двумерного массива размещаются в линейной памяти компьютера по столбцам, то есть первый индекс массива изменяется быстрее второго. Например, матрица размещается в массиве A(1:2, 1:3) в следующем порядке: {a11a21 a12a22 a13a23}.
Для матрицы, подготовленной в текстовом файле, как в математике – по строкам {a11a12a13 a21a22a23}, чтение Read(1,*) A приведет к ошибочному размещению {a11a12 a13a21 a22a23}. Оператор Write(2,*) A выводит массив в порядке размещения его в памяти, т.е. по столбцам {a11a21a12 a22a13a23}.
Внимание! Последовательность операторов
Read(1,*) A; Write(2,*) A
приведет к получению при выводе как будто правильной матрицы, хотя из-за неправильного размещения массива в памяти результаты работы программы будут неожиданными.
Ввод и вывод двумерного массива
Ввод матрицы делают построчным и бесформатным:
Integer,parameter::kolStr=2, kolStlb=3
! количество строк и столбцов
Integer::str,stlb ! номера строки и столбца
Real,dimension(1:kolStr,1:kolStlb):: A! массив
! либо диапазон индекса столбца = «:» – по умолчанию [1:kolStlb]
Read(1,*)(A(str,:),str=1,kolStr)
! либо циклы по секциям-строкам:
Read(1,*)(A(str,1:kolStlb), str=1,kolStr)
! либо вложенные неявные циклы – по столбцам внутри строк
Read(1,*)((A(str,stlb),stlb=1,:),str=1,kolStr)
Вывод массива по строкам аналогичен, но обязательно по формату.
Write(2,1)(A(str,:),str=1,kolStr)
1 format(‘Матрица’/3(f5.1))
В операторе Format целый повторитель kolStlb – длина строки матрицы:
1 format(‘Матрица’/<kolStlb>(f5.1))
Динамические массивы.
Размер статического массива не может быть изменен в процессе вычислений, что не всегда удобно при решении задач. Этого неудобства можно избежать, применяя динамические массивы. Работа с динамическим массивом требует (смотри пример программы):
a) описать динамический массив с атрибутом Allocatable, указывая количество измерений и не указывая размеров;
b) определить размер массива оператором ввода (для двумерного массива – количество строк и столбцов, для одномерного – количество элементов);
c) разместить массив в памяти оператором Allocate;
d) выполнить действия с массивом;
e) освободить память оператором Deallocate.
Пример
В каждой строке целочисленной матрицы найти первый элемент, не равный нулю, и сменить его знак. Вывести исходную матрицу, координаты найденных в каждой строке элементов и результирующую матрицу. О строках со всеми нулями вывести сообщение с номером строки.
Рис.7. Блок-схема алгоритма для матрицы
* — «В строке i все элементы равны 0»
** — «Координаты первого ненулевого элемента строки = [i, Num]»
|
| Программа
Program Matrix; Implicit None
! студент (фамилия, имя) группа № работа № вариант №
Integer,Allocatable,dimension(:,:)::A ! динамическая матрица
Integer,Allocatable,dimension(:):: B ! динамический массив
Integer varStr,varStlb ! переменные размеры матрицы по измерениям
Integeri, j ! индексы строк и столбцов
Open(1,file=’in.txt’) ! файл с исходной матрицей
Open(2,file=’out.txt’) ! результирующий файл
Do! цикл по нескольким матрицам разной формы
Read(1,*,end=10)varStr,varStlb ! ввод размеров (строк, столбцов)
!размещение динамических массивов varStr строк, varStlb столбцов
Allocate(A(1:varStr,1:varStlb),B(1:varStlb))
! ввод массива - неявный цикл по секциям-строкам
Read(1,*) ( A(i,:), i = 1,varStr )
! По блок-схеме, составленной по заданию, написать программу
! Не забудьте добавить необходимые описания переменных и массивов
Deallocate(A) ! освобождение динамической памяти
Enddo
End Program Matrix
Результаты работы программы
Содержимое файла Out.txt c одной матрицей:
В исходной матрице 3 строки и 5 столбцов
Исходная матрица
0 -123 -33 12 -5
0 0 0 0 0
0 0 12 0 1
Координаты первого ненулевого элемента строки = [ 1, 2]
В строке 2 все элементы равны 0
Координаты первого ненулевого элемента строки = [ 3, 3]
Преобразованная матрица
0 123 -33 12 -5
0 0 0 0 0
0 0 -12 0 1
Контрольные вопросы
1. Что такое двумерный массив? Его аналоги в математике на примере двух массивов. Описание двумерных массивов в Fortran90, диапазоны индексов.
2. Форма – основная характеристика массива, напишите примеры конформных (одинаковых по форме) массивов.
3. Назовите атрибуты массива, определяющие характеристики, не связанные с его размерностью.
4. Укажите порядок размещения элементов двумерных массивов в памяти компьютера. Приведите пример.
5. В программе объявлен двумерный массив A(12,12). Как его описать в Fortran90? Как записать в программе ссылку: а) на полный массив, б) на секцию массива, в) на элемент массива?
6. Допустим ли оператор присваивания к массивам, объявленным ниже? Почему?
RealA(2, -3:3), B(0:1, 0:6), C(-2:-1, 1:7)
A = cos(B**2)- 3*C
7. Поясните правила записи выражений в операторах присваивания с массивами на примерах.
8. Как работает оператор where? Приведитепримеры оператора where а) без блока; в) с одним блоком; с) с двумяблоками.
9. Что произойдет при выполнении оператора Read?
Real,dimension(1:12,1:12) A
Read (1,*) A(1, 12)
10. Как ввести первую строку массива, объявленного оператором
Real, dimension(1:20,1:12):: A?
11. Как вывести вторую строку массива, объявленного оператором
Real, dimension(1:20,1:12):: A?
12. Форматный вывод двумерного массива на примерах.
13. Что будет выведено при выполнении оператора Write?
Real, dimension(1:12, 1:12):: A
Write(*,*) A(12,12)
14. Что и как будет выведено при выполнении оператора Write?
Real, dimension(1:12, 1:12):: A
Write (*,11) A(10:12, 10:12)
11 Format(F10.2)
15. Объявите вещественный массив из 100 строк и 5 столбцов и напишите оператор Format и оператор вывода элементов массива:
a) заголовок «Результаты работы»;
b) далее элементы массива в виде матрицы.
Пример контрольного задания
1. Составить и вывести одномерный массив из сумм положительных элементов с четными номерами строк в каждом столбце матрицы A. Составить блок-схему и написать программу. Вывести по формату исходную матрицу и полученный массив.
2. Записать операторы для вывода элементов правой нижней четверти матрицы. Массив объявлен оператором:
Real,dimension(1:8, 1:10):: A
3. В файле data.txt подготовлены данные в виде целочисленной матрицы 11 12 13 14 15
21 22 23 24 25
31 32 33 34 35
Что будет выведено на экран монитора (с пробелами) в результате работы программы, если добавить вывод массива?
Integer, dimension(3,5):: Mas = 0
Open(1,file = ’data.txt’)
Read(1,*) Mas(2, 1:5:2)
! добавьте вывод всего массива по формату
End
Таблица 11.
Варианты индивидуальных заданий «Двумерные массивы»
Вариант 1
Сформировать одномерный массив из элементов, расположенных по «периметру» матрицы (элементы первой и последней строк и первого и последнего столбца). Элементы «периметра» выбирать по часовой стрелке, начиная с верхнего левого элемента (элемента a11). Вывести сформированный одномерный массив.
| Вариант 2
Сформировать матрицу B из элементов матрицы А. Каждый элемент bik должен быть равен сумме элементов матрицы А из области, определяемой индексами i,k в соответствии с рисунком. Вывести результирующую матрицу.
|
| Вариант 3
Отобрать в матрицуBтолько строки матрицы A, элементы которых расположены в порядке возрастания. Если в матрице A таких строк нет, вывести сообщение, иначе вывести:
- номера строк матрицы A, помещенных в матрицу B;
- полученную матрицу B.
| Вариант 4
В каждой строке матрицы каждый отрицательный элемент, стоящий между двумя положительными, заменить их полусуммой. Вывести преобразованную матрицу.
| Вариант 5
Записать в одномерный массив максимальные отрицательные элементы каждой строки матрицы. Для строк матрицы, не содержащих отрицательных элементов, в результирующий массив записать 0. Вывести полученный одномерный массив.
| Вариант 6
Найти среднее арифметическое значение максимальных по модулю элементов строк матрицы. Вывести:
- значения максимальных по модулю элементов строк (со знаком);
- полученное значение.
| Вариант 7
В каждом столбце целочисленной матрицы подсчитать сумму положительных элементов с четными значениями и записать ее в одномерный массив. Вывести полученный массив.
| Вариант 8
Вычислить среднее арифметическое значение элементов каждого столбца матрицы без учета минимального и максимального элементов этого столбца; записать это значение в одномерный массив. Вывести:
- значения минимума и максимума столбцов;
- полученный одномерный массив.
| Вариант 9
Сформировать матрицу B из элементов матрицы А. Каждый элемент bik должен быть равен сумме элементов матрицы А из области, определяемой индексами i,k в соответствии с рисунком.
Вывести результирующую матрицу.
|
| Вариант 10
Найти максимальный и минимальный по модулю ненулевые элементы матрицы и поменять их местами. Вывести:
- координаты найденных элементов;
- преобразованную матрицу.
| Вариант 11
Если сумма положительных элементов матрицы больше произведения модулей ее отрицательных элементов, сформировать одномерный массив из положительных элементов матрицы, иначе массив формировать из ее отрицательных элементов. При формировании одномерного массива матрицу просматривать построчно. Вывести:
- вычисленные значения суммы и произведения;
- полученный одномерный массив.
| Вариант 12
В каждом столбце целочисленной матрицы найти количество пар рядом стоящих одинаковых элементов. Результаты записать в одномерный массив. Вывести полученный массив.
| Вариант 13
Преобразовать целочисленную матрицу, удалив из нее строки, содержащие нулевые элементы, и сдвинув оставшиеся строки. Если нулевых элементов в матрице нет, вывести сообщение. Вывести:
- номера удаленных строк или сообщение;
- преобразованную матрицу.
| Вариант 14
Сформировать квадратную матрицу B из элементов квадратной матрицы А. Каждый элемент bik должен быть равен сумме элементов матрицы А из области, определяемой индексами i,k в соответствии с рисунком.
Вывести результирующую матрицу.
|
| Вариант 15
Преобразовать целочисленную матрицу, переставив на первое место столбец с наибольшим количеством нулей (сдвинуть остальные столбцы). При отсутствии в матрице нулевых элементов вывести сообщение, иначе вывести преобразованную матрицу.
| Вариант 16
Если в каждой строке целочисленной матрицы А есть равный нулю элемент, то сформировать матрицу B из строк матрицы А с четными номерами, иначе - из ее строк с нечетными номерами. Вывести:
- номера строк, в которых нет нулей;
- полученную матрицу.
| Вариант 17
Записать в одномерный массив столбец матрицы с максимальным количеством отрицательных элементов. При отсутствии отрицательных элементов в матрице вывести сообщение. Вывести:
- количество отрицательных элементов в столбцах или сообщение;
- результирующий одномерный массив.
| Вариант 18
Назовем допустимым преобразованием матрицы перестановку двух строк или двух столбцов. С помощью допустимых преобразований добиться того, чтобы наибольший по модулю элемент матрицы располагался в ее левом верхнем углу. Вывести преобразованную матрицу после каждого перемещения строки или столбца.
| Вариант 19
Сформировать матрицу B из элементов матрицы А. Каждый элемент bik должен быть равен максимальному элементу матрицы А из области, определяемой индексами i,k в соответствии с рисунком.
Вывести результирующую матрицу.
|
| Вариант 20
Найти координаты и значение максимума из минимальных элементов каждого столбца матрицы. Вывести:
- координаты минимальных элементов столбцов;
- координаты и значение максимума.
| Вариант 21
Найти минимальный по модулю ненулевой элемент в каждой строке квадратной матрицы и поменять его местами с элементом этой же строки, находящимся на побочной диагонали матрицы. Вывести
- координаты найденных в строках элементов;
- преобразованную матрицу.
| Вариант 22
Рассматривая построчно целочисленную матрицуА, сформировать три одномерных массива, поместив в массив В - четные элементы, в массив С - элементы, кратные 3, в массив D - элементы, кратные 5. Возможна запись элемента в два или три массива. Вывести полученные одномерные массивы.
| Вариант 23
Если модуль суммы отрицательных элементов целочисленной матрицы больше суммы ее положительных элементов, сформировать одномерный массив из первых элементов строк матрицы, иначе массив формируется из последних элементов строк матрицы. Если в матрице нет положительных или отрицательных элементов, вывести сообщение, иначе вывести:
- суммы отрицательных и положительных элементов матрицы;
- результирующий массив.
| Вариант 24
Сформировать матрицу B из элементов матрицы А. Каждый элемент bik должен быть равен максимальному элементу матрицы А из области, определяемой индексами i,k в соответствии с рисунком.
Вывести результирующую матрицу.
|
| Вариант 25
Поменять местами первый и второй положительные элементы в каждом столбце матрицы. Для столбцов матрицы, содержащих менее двух положительных элементов, вывести сообщение. Вывести:
- координаты элементов, найденных в каждом столбце;
- преобразованную матрицу.
| Вариант 26
Сформировать квадратную матрицу B из элементов квадратной матрицы А. Каждый элемент bik должен быть равен максимальному элементу матрицы А из области, определяемой индексами i,k в соответствии с рисунком. Вывести результирующую матрицу.
|
| Вариант 27
Заменить максимальный элемент матрицы A средним арифметическим его соседей. Соседями элемента aij в матрице считать элементы ai-1,j , ai+1,j , ai,j-1 , ai,j+1 .Следует учесть, что в зависимости от положения элемента aij в матрице у него может быть 2, 3 или 4 соседа. Вывести
- координаты и значение максимального элемента матрицы;
- преобразованную матрицу.
| Вариант 28
Умножить матрицу A на вектор B. Произведением матрицы A(M, N) и вектора B(N) является вектор C(M), каждый элемент которого вычисляется по формуле . Вывести полученный массив.
| Вариант 29
Удалить из целочисленной матрицы строки и столбцы, заполненные нулями (оставшиеся строки и столбцы сдвинуть). Вывести результирующую матрицу после каждого удаления (строк или столбцов).
| Вариант 30
Записать в одномерный массив модули разности первого и последнего отрицательных элементов каждого столбца матрицы. Для столбцов, содержащих менее двух отрицательных элементов, в результирующий массив записать (-1) и вывести сообщение. Вывести:
- для каждого столбца – значения первого и последнего отрицательных элементов или сообщение;
- полученный одномерный массив.
| | | |
|