На занятии будет рассмотрен двумерный массив в Pascal и примеры работы с ним. Кроме того, предстоит знакомство с понятиями побочная диагональ матрицы в Паскаль и главная диагональ
Содержание:
- Двумерный массив в Pascal
- Описание, ввод и вывод элементов двумерного массива
- Главная и побочная диагональ при работе с двумерными матрицами в Pascal
Матрица или двумерный массив – это прямоугольная таблица чисел (или других элементов одного типа). Каждый элемент матрицы имеет два индекса (номер строки и номер столбца).
Исходные данные для решения многих задач можно представить в табличной форме:
Таблица результатов производственной деятельности нескольких филиалов фирмы может быть представлена так:
zavod1: array [1..4] of integer; zavod2: array [1..4] of integer; zavod3: array [1..4] of integer;
Или в виде двумерного массива так:
Объявление двумерного массива:
var A: array[1..3,1..4] of integer; begin {...}
begin var a := new integer[3,4]; {...} end.
Описание, ввод и вывод элементов двумерного массива
Варианты описания двумерного массива (традиционный pascal)
- Описание массива в разделе переменных:
- Описание массива через раздел type:
const N = 3; M = 4; var A: array[1..N,1..M] of integer;
const M=10; N=5; type matrix=array [1..M, 1..N] of integer; var A: matrix;
Ввод двумерного массива m x n с клавиатуры:
for i:=1 to N do for j:=1 to M do begin write('A[',i,',',j,']='); read ( A[i,j] ); end;
for var i:=0 to a.RowCount-1 do for var j:=0 to a.ColCount-1 do a[i,j]:=readinteger;
Заполнение случайными числами:
var a := MatrRandomInteger(3,4,0,10); // целые числа в диапазоне от 0 до 10 var a1 := MatrRandomReal(3,4,1,9) // веществ. числа в диапазоне от 1 до 9
«Красивый» вывод элементов двумерного массива m x n:
Следующий фрагмент программы выводит на экран значения элементов массива по строкам:
1 2 3 4 5 |
for i:=1 to N do begin for j:=1 to M do write ( A[i,j]:5 ); writeln; end; |
1 2 3 4 5 6 |
begin var a := MatrRandomInteger(3,4,0,10); var a1 := MatrRandomReal(3,4,1,9); a.Println; a1.Println(6,1) // 6 позиций всего на вывод, 1 знак после десят. запятой end. |
Результат:
8 2 1 3 5 8 0 8 6 3 9 3 3.3 4.7 3.7 5.4 2.9 1.7 2.3 4.0 8.3 3.7 8.4 1.4
Рассмотрим следующую задачу: Получены значения температуры воздуха за 4 дня с трех метеостанций, расположенных в разных регионах страны:
Номер станции | 1-й день | 2-й день | 3-й день | 4-й день |
---|---|---|---|---|
1 | -8 | -14 | -19 | -18 |
2 | 25 | 28 | 26 | 20 |
3 | 11 | 18 | 20 | 25 |
Т.е. запись показаний в двумерном массиве выглядела бы так:
t[1,1]:=-8; | t[1,2]:=-14; | t[1,3]:=-19; | t[1,4]:=-18; |
t[2,1]:=25; | t[2,2]:=28; | t[2,3]:=26; | t[2,4]:=20; |
t[3,1]:=11; | t[3,2]:=18; | t[3,3]:=20; | t[3,4]:=25; |
Или в pascalabc.NET:
var t := Matr(3,4,-8,-14,-19,-18,25,28,26,20,11,18,20,25); t.Println;
Объявление двумерного массива:
var t: array [1..3, 1..4] of integer;
Задание array 1: Необходимо:
- Распечатать температуру на 2-й метеостанции за 4-й день и на 3-й метеостанции за 1-й день.
- Распечатать показания термометров всех метеостанций за 2-й день.
- Определить среднюю температуру на 3-й метеостанции.
- Распечатать, в какие дни и на каких метеостанциях температура была в диапазоне 24-26 градусов тепла.
Дополните код:
Показать решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
var t: array [1..3, 1..4] of integer; s,i,j:integer; begin t[1,1]:=-8; t[1,2]:=-14; t[1,3]:=-19; t[1,4]:=-18; t[2,1]:=25; t[2,2]:=28; t[2,3]:=26; t[2,4]:=20; t[3,1]:=11; t[3,2]:=18; t[3,3]:=20; t[3,4]:=25; {1. Распечатать показания термометров на 2-й метеостанции за 4-й день и на 3-й метеостанции за 1-й день} writeln('1-е задание: ',t[2,4] , ' и ',t[...,...]); {2. Показания термометров всех метеостанций за 2-й день} for i:=1 to ... do writeln ('2-е задание: ',t[...,...]); {3. Определим среднее значение температуры на 3-й метеостанции:} i:=3; s:=0; for j:=1 to 4 do s:=...; {сумматор} writeln('3-е задание: ', s/4); {распечатаем всю таблицу} for i:=1 to 3 do for j:=1 to 4 do writeln(t[i,j]); {4. Распечатаем станции и дни с температурой 24-26 гр} writeln('4-е задание: '); for i:=1 to 3 do for ... ... do if (...) and (...) then writeln('станция ', i, ' день ', j) end. |
Самостоятельно подумайте, как находится сумма элементов массива pascal.
Задание array 2. Найти сумму элементов массива (прямоугольной таблицы) размером [m x n]
Задание array 4.
Найти сумму всех элементов массива (переменная sum
) 5 x 4, а также сумму элементов, составляющих столбцы таблицы (двумерного массива). Для хранения сумм столбцов чисел использовать одномерный массив (s
). Дополните код.
Показать решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
const m = 5; n = 4; var a: array[1..m,1..n] of byte; s: array[1..n] of byte; i,j, sum: byte; begin randomize; for i := 1 to m do begin for j := 1 to n do begin ... {инициализация элементов массива случайными числами} ... {вывод элементов массива} end; writeln end; writeln ('------------'); {для оформления} {обнуление значений массива суммы s[]:} ... {поиск сумм элементов по столбцам:} for i := 1 to n do begin for j := 1 to m do begin s[i]:=...; end; write(...) ; end; {поиск общей суммы:} sum:=0; ... {вычисление суммы элементов массива значений сумм по столбцам:} for ... ... write (' | sum = ', sum); readln end. |
Задание array 4_1.
Найти сумму элементов двумерного массива [m x n] по строкам:
2 8 1 9 : sum = 20 3 1 7 2 : sum = 13 4 5 6 2 : sum = 17
Методы матриц для работы со строками и столбцами:
begin var a := MatrRandomInteger(3,4); a.Println; a.Row(0).Sum.Println(); a.Row(1).Average.Println; a.Row(2).Product.Println; a.Col(0).Min.Println; a.Col(1).Max.Println; end.
Результат:
86 62 80 33 51 4 36 65 78 30 5 16 261 39 187200 51 62
Главная и побочная диагональ при работе с двумерными матрицами в Pascal
Главная диагональ квадратной матрицы n x n (т.е. той, у которой количество строк равно количеству столбцов) проходит с верхнего левого угла матрицы (элемент 1,1) до правого нижнего угла матрицы (элемент n,n).
Побочная диагональ квадратной матрицы n x n проходит с нижнего левого угла матрицы (элемент n,1) до правого верхнего угла матрицы (элемент 1,n).
Формулу поиска элементов диагоналей проще всего искать, нарисовав элементы матрицы:
Если индексы начинаются с единицы (традиционный Паскаль):
1,1 | 1,2 | 1,3 | 1,4 |
2,1 | 2,2 | 2,3 | 2,4 |
3,1 | 3,2 | 3,3 | 3,4 |
4,1 | 4,2 | 4,3 | 4,4 |
Если индексы начинаются с нуля (pascalAbc.NET):
0,0 | 0,1 | 0,2 | 0,3 |
1,0 | 1,1 | 1,2 | 1,3 |
2,0 | 2,1 | 2,2 | 2,3 |
3,0 | 3,1 | 3,2 | 3,3 |
Учитывая, что первая цифра в программе будет соответствовать счетчику i
, а вторая — счетчику j
, то из таблицы можно вывести формулы:
Главная диагональ матрицы в Паскаль имеет формулу:
i=j
Побочная диагональ матрицы в Паскале традиционном имеет формулу:
n=i+j-1
(или j=n-i+1
)
где n
— размерность квадратной матрицы
Побочная диагональ матрицы в pascalAbc.Net имеет формулу:
n=i+j+1
где n
— размерность квадратной матрицы
Пример: Вывести на экран сначала главную диагональ квадратной матрицы из N строк и N столбцов, а затем ее побочную диагональ.
Решение:
Пример: Заменить элементы главной и побочной диагонали квадратной матрицы нулями
Показать решение:
Паскаль:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
var i,j,n:integer; a: array[1..100,1..100]of integer; begin randomize; writeln ('введите размерность матрицы:'); readln(n); for i:=1 to n do begin for j:=1 to n do begin a[i,j]:=random(10); write(a[i,j]:3); end; writeln; end; writeln; for i:=1 to n do begin for j:=1 to n do begin if (i=j) or (n=i+j-1) then a[i,j]:=0; write(a[i,j]:3) end; writeln; end; end. |
PascalAbc.Net
1 2 3 4 5 6 7 8 9 10 11 12 |
begin var n := readinteger('введите размерность матрицы:'); var a := matrRandomInteger(n, n, -10, 10); a.Println(6); for var i := 0 to n - 1 do begin a[i, i] := 0; a[i, n - i - 1] := 0; end; writeln(); a.Println(6); end. |
Задание array 5:
Найти отдельно сумму элементов главной и побочной диагонали квадратной матрицы
1 7 3 7 2 1 8 3 5 7 6 4 8 2 3 1 ------- sum1 = 9 sum2 = 30
Пример:
Дана матрица 5х5. Найти сумму элементов, стоящих на двух соседних диагоналях с главной и параллельных ей.
Для решения задачи воспользуйтесь таблицей
Показать решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
var A:array[1..5,1..5] of integer; i,j:integer; sum,sum1,sum2:integer; begin randomize; for i:=1 to 5 do for j:=1 to 5 do A[i,j]:=random(10); write ('Исходный массив A: '); for i:=1 to 5 do begin writeln; for j:=1 to 5 do write (A[i,j]:2,' '); end; sum1:=0; for i:=1 to 5 do for j:=1 to 5 do if (i-j=1) then sum1:=sum1+A[i,j]; sum2:=0; for i:=1 to 5 do for j:=1 to 5 do if (j-i=1) then sum2:=sum2+A[i,j]; sum:=sum1+sum2; writeln; writeln('Сумма = ',sum); end. |
Задание array 6: Сформировать матрицу размерностью n. Вывести ее на экран. Затем преобразовать ее, заменив необходимые элементы на 0:
Задание array 7: Сформировать матрицу размерностью n. Вывести ее на экран. Затем преобразовать ее, заменив необходимые элементы на 0:
Задание array 8: Сформировать матрицу размерностью n. Вывести ее на экран. Затем преобразовать ее, заменив необходимые элементы на 0:
Задание array 9: Составить программу, позволяющую с помощью датчика случайных чисел сформировать матрицу размерностью N. Определить:
Рассмотрим еще один пример работы с двумерным массивом.
Пример: В двумерном массиве размером N
х M
определить среднее значение элементов. Найти индекс элемента массива, наиболее близкого к среднему значению.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
var index1,index2,i,j,N,M:integer; s,min,f:real; a:array[1..300,1..300] of real; begin N:=10; M:=5; for i:=1 to N do begin for j:=1 to M do begin a[i,j]:=random(20); s:=s+a[i,j]; write(a[i,j]:3); end; writeln; end; f:=s/(N*M); writeln('srednee znachenie ',f); min:=abs(a[1,1]-f); for i:=1 to N do begin for j:=1 to M do begin if abs(a[i,j]-f)<min then begin min:=abs(a[i,j]-f); index1:=i; index2:=j; end; end; end; writeln('naibolee blizkiy ',index1,' ',index2); end. |
Потренируйтесь в решении задач по теме, щелкнув по пиктограмме:
4 / 4 / 0 Регистрация: 07.11.2012 Сообщений: 17 |
|
1 |
|
Найти сумму элементов побочной диагонали матрицы07.11.2012, 12:22. Показов 48378. Ответов 16
Дана квадратная целочисленная матрица 7х7. Найти сумму элементов ее побочной диагонали. Заранее спасибо
0 |
Kodzaev 3030 / 1916 / 1649 Регистрация: 30.04.2011 Сообщений: 3,060 |
||||
07.11.2012, 12:37 |
2 |
|||
1 |
4 / 4 / 0 Регистрация: 07.11.2012 Сообщений: 17 |
|
07.11.2012, 13:29 [ТС] |
3 |
Добавлено через 1 минуту
0 |
3030 / 1916 / 1649 Регистрация: 30.04.2011 Сообщений: 3,060 |
|
07.11.2012, 13:36 |
4 |
Программа выводит сумму элементов побочной диагонали. Что не так?
0 |
4 / 4 / 0 Регистрация: 07.11.2012 Сообщений: 17 |
|
07.11.2012, 13:40 [ТС] |
5 |
она вообще не то число выводит если например дана матрица
0 |
3030 / 1916 / 1649 Регистрация: 30.04.2011 Сообщений: 3,060 |
|
07.11.2012, 13:41 |
6 |
Побочная диагональ – это та, которая проходит от левого нижнего угла в правый верхний
0 |
3030 / 1916 / 1649 Регистрация: 30.04.2011 Сообщений: 3,060 |
|
07.11.2012, 13:46 |
7 |
Поменял в коде n на 3 и запустил Миниатюры
1 |
3030 / 1916 / 1649 Регистрация: 30.04.2011 Сообщений: 3,060 |
|
07.11.2012, 13:48 |
8 |
19-9+16=26 Добавлено через 1 минуту
0 |
0 / 0 / 0 Регистрация: 20.11.2012 Сообщений: 29 |
|
20.11.2012, 20:31 |
9 |
У меня точно такое же задание. Но почему-то тоже сумму побочной диагонали считает неправильно в паскале набрала абсолютно так же. может есть где ошибка? скриншоты прикрепила) Миниатюры
0 |
3030 / 1916 / 1649 Регистрация: 30.04.2011 Сообщений: 3,060 |
|
20.11.2012, 20:34 |
10 |
GabAlfiya, а вы не набирайте код вручную, а скопируйте его, сохраните в блокноте с расширением .pas и откройте через паскаль. Программа считает правильно
1 |
0 / 0 / 0 Регистрация: 20.11.2012 Сообщений: 29 |
|
20.11.2012, 21:29 |
11 |
Спасибо но только в итоге работает с матрицой 7х7, когда 3х3 все равно почему-то неправильно выдает ответ… И еще. Может конечно не в этой теме писать надо, но я просто новенькая тут, еще не освоилась можно ли блок-схему сделать к этому заданию?… буду очень признательна
0 |
Kodzaev 3030 / 1916 / 1649 Регистрация: 30.04.2011 Сообщений: 3,060 |
||||
20.11.2012, 22:00 |
12 |
|||
GabAlfiya, специально для Вас. Размер массива можно задавать в ходе выполнения программы
0 |
3030 / 1916 / 1649 Регистрация: 30.04.2011 Сообщений: 3,060 |
|
20.11.2012, 22:08 |
13 |
Блок-схема
1 |
0 / 0 / 0 Регистрация: 20.11.2012 Сообщений: 29 |
|
20.11.2012, 22:20 |
14 |
Спасибо но только в итоге работает с матрицой 7х7, когда 3х3 все равно почему-то неправильно выдает ответ… И еще. Может конечно не в этой теме писать надо, но я просто новенькая тут, еще не освоилась можно ли блок-схему сделать к этому заданию?… буду очень признательна
0 |
3030 / 1916 / 1649 Регистрация: 30.04.2011 Сообщений: 3,060 |
|
20.11.2012, 22:22 |
15 |
GabAlfiya, все сделал по вашей просьбе. Смотрите выше
0 |
0 / 0 / 0 Регистрация: 20.11.2012 Сообщений: 29 |
|
20.11.2012, 22:27 |
16 |
Спасибо огромное
0 |
0 / 0 / 0 Регистрация: 30.11.2014 Сообщений: 37 |
|
04.05.2015, 19:46 |
17 |
Найти сумму элементов побочной диагонали матрицы
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
04.05.2015, 19:46 |
Помогаю со студенческими работами здесь Найти сумму отрицательных элементов матрицы, стоящих на ее побочной диагонали Если сумма побочной диагонали матрицы имеет четное значение, найти сумму элементов в каждой строке матрицы Найти сумму всех элементов, расположенных на побочной диагонали матрицы и ниже ее Найти сумму всех элементов матрицы, расположенных на побочной диагонали и ниже ее Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 17 |
Тем, кто знакомым с математическими матрицами, будет не трудно освоить и двумерные массивы в Pascal. Матрица – это математический объект, представляющий собой прямоугольную таблицу. Таблица состоит из элементов, которые находятся на пересечении строк и столбцов, определяющих их, то есть i-ая строка и j-ый столбец задают адрес k-ому элементу матрицы (kij
). Двумерные массивы абсолютно аналогичны математическим матрицам.
В отличие от одномерных массивов, двумерные характеризуются в программе парой индексов, один из которых соответствует номеру строки, другой – столбца:
Mas[m, n], где Mas – имя массива, n – номер строки, а m – номер столбца.
Описать матрицу в программе можно несколькими способами:
1) В разделе описания переменных:
Var Mas: Array[1..n, 1..m] of <тип элементов>;
2) При помощи одномерного массива, элементами которого являются одномерные массивы.
Пример:
Const n = 5; m = 10; Type Arr1 = Array[1..m] of <тип элементов >; Arr2 = Array[1..n] of arr1; Var Mas: arr2;
Переменная Mas
– матрица, состоящая из пяти строк, в каждую из которых включено по десять элементов.
3) Предыдущий способ можно упростить так:
Const n = 5; m = 10; Турe arr=Array[1..n] Of Аrrау[1..m] of <тип элементов>; Var Mas: arr;
4) И снова сократив запись, получим:
Const n = 5; m = 10; Type arr = Array[1..n,1..m] of <тип элементов>; Var Mas: arr;
Для обработки содержимого матрицы, удобно пользоваться вложенными циклами:
For i:= 1 To n Do For j:= 1 To m Do
Например, для заполнения массива случайнми числами:
for i:=1 to n do for j:=1 to n do x[i,j]:=random(100);
Для вывода двумерного массива вещественных чисел размером n строк, m столбцов:
for i:=1 to n do begin for j:=1 to m do write(x[i,j]:5:2); writeln; end;
В следующей программе массив сначала заполняется числами с клавиатуры, а затем выводиться на экран.
program input_and_output_array; uses crt; const n=3; m=3; var i, j: integer; mas: array[1..n, 1..m] of integer; begin {ввод массива} for i:=1 to n do for j:=1 to m do begin write(' Элемент ', i,' строки, ',j,' столбца = '); readln(mas[i, j]); end; writeln(' Получившаяся матрица: '); {вывод массива} for i:=1 to n do begin for j:=1 to m do begin write(mas[i, j]:5); end; writeln end; end.
Количество элементов в массиве (его размерность) можно узнать, умножив количество строк на количество столбцов.
Сумма всех элементов квадратной матрицы:
sum:=0; for i:=1 to n do for j:=1 to n do sum:=sum+x[i,j]; writeln('Сумма=',sum);
Сумма элементов главной диагонали квадратной матрицы (элементы главной диагонали имеют одинаковые индексы -x[1,1], x[2,2] и т.д.):
sum:=0; for i:=1 to n do sum:=sum+x[i,i]; writeln('Сумма=',sum);
Сумма элементов побочной диагонали (диагонали противоположной главной). Индексы элементов побочной диагонали в сумме равны n+1, т.е. i+j=n+1
или j=n+1-i
:
sum:=0; for i:=1 to n do sum:=sum+x[i,n+1-i]; writeln('Сумма=',sum);
Сумма элементов ниже главной диагонали квадратной матрицы (строго ниже):
sum:=0; for i:=1 to n do for j:=1 to n do if i>j then sum:=sum+x[i,j]; writeln('Сумма=',sum);
Можно не просматривать весь массив, а брать только нужные элементы:
sum:=0; for i:=2 to n do for j:=1 to i-1 do sum:=sum+x[i,j]; writeln('Сумма=',sum);
Сумма элементов выше и на главной диагонали квадратной матрицы:
sum:=0; for i:=1 to n do for j:=1 to n do if i<=j then sum:=sum+x[i,j]; writeln('Сумма=',sum);
Здесь также можно не просматривать весь массив, а брать только нужные элементы:
sum:=0; for i:=1 to n do for j:=i to n do sum:=sum+x[i,j]; writeln('Сумма=',sum);
Сумма элементов ниже побочной диагонали квадратной матрицы (строго ниже) :
sum:=0; for i:=1 to n do for j:=1 to n do if i+j>n+1 then sum:=sum+x[i,j]; writeln('Сумма=',sum);
Можно не просматривать весь массив, а брать только нужные элементы:
sum:=0; for i:=2 to n do for j:=n+2-i to n do sum:=sum+x[i,j]; writeln('Сумма=',sum);
Если надо посчитать сумму элемсентов ниже побочной диагонали и на ней, то в предыдущем примере, при просмотре всего массива в предыдущем примере надо заменить знак отношения > на >=, а при просмотре толко нужных элементов применить такой код:
sum:=0; for i:=1 to n do for j:=n+1-i to n do sum:=sum+x[i,j]; writeln('Сумма=',sum);
При подсчете суммы элементов выше и на главной диагонали, выше и на побочной диагонали возможно применине такого кода:
sum:=0; for i:=1 to n do for j:=1 to n do if (i<=j) and (i+j<=n+1) then sum:=sum+x[i,j]; writeln('Сумма=',sum);
Подсчет сумм элементов по строкам:
for i:=1 to n do begin sum:=0; for j:=1 to n do sum:=sum+x[i,j]; writeln('Сумма ',i,'-й строки',sum); end;
Подсчет сумм элементов по столбцам:
for j:=1 to n do begin sum:=0; for i:=1 to n do sum:=sum+x[i,j]; writeln('Сумма ',j,'-го столбца ',sum); end;
Безусловно суммы по строкам и столбцам можно записывать в одномерный массив. Например, для сумм по столбцам:
for i:=1 to n do sum[j]:=0; for i:=1 to n do for j:=1 to n do zum[j]:=sum[j]+x[i,j]; {вывод сумм по столбцам} for i:=1 to n do write(sum[i]:4); writeln;
Суммы элементов по диагоналям, параллельным главной диагонали.
Очевидно, что таких сумм будет 2n-1. Кроме того, разности индексов эдементов, стоящих на одной диагонали будут равны друг другу. Имеется в виду разность «номер строки минус номер столбца». Эти разности будут меняться от -n+1 для самой верхней диагонали s1, содержащей всего лишь один элемент, до n-1 для диагонали s2N-1, расположенной в самом низу матрицы и содержащей также всего один элемент. Таким образом, для подсчета сумм мы должны объявить массив:
Var sum:array[-n+1..n-1] of integer;
Число элементов в этом массиве будет 2n-1. Код для подсчета этих сумм:
for i:=-n+1 to n-1 do sum[i]:=0; for i:=1 to n do for j:=1 to n do sum[i-j]:=sum[i-j]+x[i,j]; for i:=-n+1 to n-1 do write(sum[i]);
Суммы элементов по диагоналям, параллельным побочной диагонали.
for i:=2 to 2*n do sum[i]:=0; for i:=1 to n do for j:=1 to n do sum[i+j]:=sum[i+j]+x[i,j]; for i:=2 to 2*n do write(sum[i]);
Суммы элементов по периметрам двумерного массива.
Cледует различать четный или нечетный порядок матрицы n. Число сумм будет равно k=n div 2
при четном n и k=n div 2 +1
при нечетном значении n.
Счет суммы начинается по строке i от столбца j равного i и заканчивается столбцом n-i+1
, т.е. начинается с элемена находящегося на главной диагонали и заканчивается элементом на побочной диагонали.
Одновременно учитываются элементы из параллельной строки, индекс которой равен n-i+1
.
Затем считаем элементы по двум паралельным столбцам i и n-i+1
(не учитывая элементы, стоящие в строках). Если n -нечетное число, то выводим значение центрального элемента массива x[k+1,k+1]
.
k:=n div 2; for i:=1 to k do begin sum:=0; {строки} for j:=i to n-i+1 do sum:=sum+x[i,j]+x[n-i+1,j]; {столбцы} for j:=i+1 to n-i do sum:=sum+x[j,i]+x[j,n-i+1]; writeln(sum); {вывод суммы} end; if n mod 2=1 then writeln(x[k+1,k+1]);
Оглавление:
- 1 Задача — Вычислить сумму элементов главной или побочной диагонали матрицы
— программирование на Pascal, Си, Кумир, Basic-256, Python- 1.1 Pascal
- 1.2 Язык Си
- 1.3 Python
- 1.4 КуМир
Задача — Вычислить сумму элементов главной или побочной диагонали матрицы
— программирование на Pascal, Си, Кумир, Basic-256, Python
Дана квадратная матрица. Вычислить сумму элементов главной или побочной диагонали в зависимости от выбора пользователя. Сумма элементов любой диагонали должна вычисляться в одной и той же функции.
В функцию следует передавать не только массив, но и информацию о том, что требуется вычислить, выраженную через тот или иной символ или число.
Если была выбрана сумма главной диагонали, то при определении ее элементов второй индекс матрицы будет равен первому и начинаться с первого элемента. В случае побочной диагонали второй индекс будет начинаться с последнего элемента и заканчиваться первым. Поэтому в теле функции перед проходом по матрице второму индексу присваивается либо 1 (или 0), либо размерность квадратной матрицы (N или N-1). При проходе второй индекс либо увеличивается на каждой итерации, либо уменьшается.
Pascal
const N = 10;
type
type_arr = array[1..N, 1..N] of byte;
var
arr: type_arr;
i, j: byte;
sum: byte;
ch: char;
function diagonal (var arr1: type_arr; c: char): byte;
var
sum1: byte;
i, j: byte;
begin
sum1 := 0;
if c = ‘1’ then j := 1
else j:= N;
for i:=1 to N do begin
sum1 := sum1 + arr1[i][j];
if c = ‘1’ then j := j + 1
else j := j-1;
end;
diagonal := sum1;
end;
begin
randomize;
for i:=1 to N do begin
for j:=1 to N do begin
arr[i,j] := random(10);
write(arr[i,j]:4);
end;
writeln;
end;
write(‘Главная (1) или побочная (2): ‘);
readln(ch);
if (ch = ‘1’) or (ch = ‘2’) then begin
sum := diagonal(arr, ch);
writeln(sum);
end;
end.
Пример(ы) выполнения программы на языке Pascal:
0 2 0 4 8 0 4 1 5 1 1 7 7 0 1 7 8 4 7 7 1 0 7 4 6 5 0 6 4 7 1 5 3 3 0 4 6 7 8 0 1 7 3 8 1 6 9 4 4 7 8 5 7 7 1 7 8 8 8 4 2 0 1 3 1 5 2 0 0 8 4 8 3 7 5 6 5 1 3 9 9 0 9 2 1 0 3 6 1 3 8 3 7 5 8 8 9 5 1 1 Главная (1) или побочная (2): 2 41
Язык Си
#include <stdio.h>
#define N 10
int diagonal(char c);
int a[N][N];
main() {
int i, j, sum;
char ch;
srand(time(NULL));
for (i=0; i<N; i++) {
for (j=0; j<N; j++) {
a[i][j] = rand() % 10;
printf(«%3d», a[i][j]);
}
printf(«n»);
}
printf(«Главная (1) или побочная (2): «);
scanf(«%c», &ch);
sum = diagonal(ch);
printf(«%dn», sum);
}
int diagonal(char c) {
int s, i, j;
s = 0;
if (c == ‘1’)
for (i=0; i<N; i++)
s += a[i][i];
else
for (i=0, j=N-1; i<N; i++,j—)
s += a[i][j];
return s;
}
Python
def diagonal(l,c):
s = 0
i = 0
while i < N:
if c == ‘1’:
s += l[i][i]
else:
s += l[i][N-i-1]
i += 1
return s
from random import random
N = 10
a = []
for i in range(N):
b = []
for j in range(N):
n = int(random()*10)
b.append(n)
print(«%3d» % n, end=»)
a.append(b)
print()
ch = input(«Главная (1) или побочная (2): «)
if ch == ‘1’ or ch == ‘2’:
summa = diagonal(a,ch)
print(summa)
КуМир
цел N = 7
цел таб a[1:N,1:N]
алг
нач
цел i, j, sum
сим ch
нц для i от 1 до N
нц для j от 1 до N
a[i,j] := int(rand(0,10))
вывод a[i,j], » »
кц
вывод нс
кц
вывод «Главная (г) или побочная (п): »
ввод ch
если ch = «г» или ch = «п» то
sum := diag(ch)
вывод sum
все
кон
алг цел diag(сим c)
нач
цел s, i, j
s := 0
нц для i от 1 до N
если c = «г» то
s := s + a[i,i]
иначе
s := s + a[i,N-i+1]
все
кц
знач := s
кон
Did you find apk for android? You can find new Free Android Games and apps.
Содержание
- Двумерные массивы
- Главная и побочная диагонали матрицы
- Пример двумерного массива
- Заполнение и вывод на экран
- Сумма элементов двумерного массива
- Задачи с решением
Двумерные массивы
Двумерный массив является разновидностью многомерных. Визуально двумерный массив можно представить в виде таблицы. Положение элемента задается двумя индексами:
- i — порядковый номер строки
- j — порядковый номер столбца
В качестве примера на рисунке ниже приведен двумерный массив из целых чисел размером 5 на 5 элементов. Его называют квадратным или матрицей. В прямоугольном — количество строк и столбцов отличаются.
Описание двумерного массива на Паскале отличается от одномерного только добавлением второй размерности в квадратных скобках.
Главная и побочная диагонали матрицы
Большое количество задач на обработку связано с элементами главной и побочной диагонали. Они обладают особыми свойствами.
Посмотрите на рисунок ниже. Элементы главной диагонали располагаются в ячейках оранжевого цвета. Главный признак, по которому можно их идентифицировать — значения индексов одинаковы.
В побочной диагонали (ячейки зеленого цвета) расположены элементы, у которых сумма индексов равна количеству строк (столбцов) плюс один.
Пример двумерного массива
Заполнение и вывод на экран
Рассмотрим пример программы на паскале. Заполнение будем проводить случайными числами, так как ручной ввод для отладки программы на Паскале не удобен.
План действий:
- опишем массив, укажем все необходимые переменные;
- заполним случайными значениями;
- сделаем вывод на экран в виде таблицы.
Текст программы
var i,j:integer; a: array [1..5,1..5]of integer; begin {заполнение случайными числами} for i:=1 to 5 do for j:=1 to 5 do a[i,j]:=random(10); {вывод на экран} for i:=1 to 5 do begin for j:=1 to 5 do write(a[i,j]:3); writeln; end; end.
Второй вариант немного короче. Отличается от первого тем, что заполнение и вывод проходит в одном цикле. Можно использовать в качестве шаблона для решения однотипных задач на Паскаль.
const n=5; m=5; var i,j:integer; a: array [1..n,1..m] of integer; begin {заполнение случайными числами и вывод на экран} for i:=1 to n do begin for j:=1 to m do begin a[i,j]:=random(10); write(a[i,j]:3); end; writeln; end; {здесь будет код обработки по условию задачи} end.
При составлении программ, этот код будет присутствовать практически в каждой задаче. Здесь происходит подготовка исходного массива, заданного случайными числами.
Обработка элементов по условию задачи будет различаться и записываться в продолжении указанного выше текста программы на Паскаль. После обработки следует код вывода результата работы программы.
Сумма элементов двумерного массива
Запишем код обработки элементов, который вычислит их сумму.
Для правильной работы программы на Паскале, необходимо в раздел описания переменных добавить переменную для вычисления суммы S.
Код обработки и вывода результата. Его нужно добавить в текст программы на Паскаль, указанной выше.
s:=0; for i:=1 to 5 do for j:=1 to 5 do s:=s+a[i,j]; write('Сумма элементов = ',s);
Задачи с решением
Задача 1. Вычислить сумму и количество положительных элементов целочисленного массива A[1..n,1..n], находящихся над главной диагональю.
Посмотреть решение
Решение: В этом примере размер матрицы задается через константу, что удобно использовать при отладке программы. Постоянные величины в Паскаль записывают перед разделом Var.
const n=4; var i,j,s,k:integer; a: array [1..n,1..n]of integer; begin {заполнение случайными числами и вывод на экран} for i:=1 to n do begin for j:=1 to n do begin a[i,j]:=random(10); write(a[i,j]:3); end; writeln; end; {код обработки по условию задачи} s:=0;k:=0; for i:=1 to n do begin for j:=i+1 to n do begin s:=s+a[i,j]; k:=k+1; end; end; writeln('Сумма элементов = ',s); write('Количество элементов = ',k); end.
Задача 2. Задана квадратная матрица. Получить транспонированную матрицу (перевернутую относительно главной диагонали).
Посмотреть решение
Решение:
const n=5; var i,j:integer; a,b: array [1..n,1..n]of integer; begin {заполнение случайными числами и вывод на экран} writeln('Исходная матрица'); for i:=1 to n do begin for j:=1 to n do begin a[i,j]:=random(10); write(a[i,j]:3); end; writeln; end; {код обработки по условию задачи} for i:=1 to n do for j:=1 to n do b[i,j]:=a[j,i]; writeln('Транспонированная матрица'); for i:=1 to n do begin for j:=1 to n do begin write(b[i,j]:3); end; writeln; end; end.