uses crt; const nmax=20; var a,at:array[1..nmax,1..nmax] of integer; n,i,j,s,mn,mx:integer; begin clrscr; randomize; repeat write('Размер матрицы ',nmax,' n='); readln(n); until n in [1..nmax]; writeln('Матрица A:'); for i:=1 to n do begin for j:=1 to n do begin a[i,j]:=random(50); write(a[i,j]:4); end; writeln; end; writeln; mx:=a[1,1]; mn:=a[1,1]; s:=0; for i:=1 to n do begin s:=s+a[i,i]+a[i,n-i+1];{сумма на диагоналях} if a[i,i]>mx then mx:=a[i,i];{главная диагональ} if a[i,n-i+1]>mx then mx:=a[i,n-i+1];{побочная диагональ} if a[i,i]<mn then mn:=a[i,i]; if a[i,n-i+1]<mn then mn:=a[i,n-i+1]; end; if odd(n) then s:=s-a[n div 2+1,n div 2+1];{если матрица нечетная, центральный элемент посчитан 2 раза} writeln('Сумма диагональных элементов=',s); writeln('Минимальный из них=',mn); writeln('Максимальный из них=',mx); readln end.
На занятии будет рассмотрен двумерный массив в 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. |
Потренируйтесь в решении задач по теме, щелкнув по пиктограмме:
0 / 0 / 0 Регистрация: 16.01.2011 Сообщений: 7 |
|
1 |
|
Найти сумму элементов диагоналей массива.16.01.2011, 17:02. Показов 10721. Ответов 11
дан двухмерный массив.найти сумму элементов диагоналей массива.желательно блок схема,алгоритм и программу.(в басике и паскале)
0 |
MegaAce 332 / 306 / 155 Регистрация: 14.02.2010 Сообщений: 662 |
||||
16.01.2011, 17:10 |
2 |
|||
Как-то так
1 |
0 / 0 / 0 Регистрация: 16.01.2011 Сообщений: 7 |
|
16.01.2011, 17:14 [ТС] |
3 |
вся задача?
0 |
332 / 306 / 155 Регистрация: 14.02.2010 Сообщений: 662 |
|
16.01.2011, 17:21 |
4 |
Весь алгоритм, который вы спрашивали
0 |
0 / 0 / 0 Регистрация: 16.01.2011 Сообщений: 7 |
|
16.01.2011, 17:22 [ТС] |
5 |
а блок схему?
0 |
Mad_Dog Фрилансер 452 / 433 / 117 Регистрация: 01.06.2010 Сообщений: 1,314 |
||||
16.01.2011, 17:23 |
6 |
|||
вот так как-то лучше…
1 |
MegaAce 332 / 306 / 155 Регистрация: 14.02.2010 Сообщений: 662 |
||||
16.01.2011, 17:26 |
7 |
|||
for i:=1 to n do s:=s+a[i,i]+a[i,n-i+1] точно! Давно уже не делал операции с диагоналями))
1 |
0 / 0 / 0 Регистрация: 16.01.2011 Сообщений: 7 |
|
16.01.2011, 17:31 [ТС] |
8 |
блок схему можете сделать?
0 |
332 / 306 / 155 Регистрация: 14.02.2010 Сообщений: 662 |
|
16.01.2011, 17:51 |
9 |
Как-то так, хотя не уверен Миниатюры
1 |
332 / 306 / 155 Регистрация: 14.02.2010 Сообщений: 662 |
|
16.01.2011, 17:58 |
10 |
Извините, немного не так К нижней схеме: Замените в параллелограмме нижнем a[i,j] на s Миниатюры
2 |
Українець 424 / 318 / 16 Регистрация: 26.09.2009 Сообщений: 844 |
|
16.01.2011, 18:05 |
11 |
Артемка, ты — баран, научись просить, сдесь тебе никто ничего не должен
0 |
0 / 0 / 0 Регистрация: 16.01.2011 Сообщений: 7 |
|
16.01.2011, 18:11 [ТС] |
12 |
я ни кого не заставляю мне помогать.люди по собственному желанию помогают.и кстати на форумах все горлопанить могут.однажды нашли такого оратора и он был в шоке!так что аккуратнее с выражениями!
0 |
Перейти к содержанию
Вычислить сумму элементов главной или побочной диагонали матрицы
Просмотров 9.6к. Обновлено 15 октября 2021
Дана квадратная матрица. Вычислить сумму элементов главной или побочной диагонали в зависимости от выбора пользователя. Сумма элементов любой диагонали должна вычисляться в одной и той же функции.
В функцию следует передавать не только массив, но и информацию о том, что требуется вычислить, выраженную через тот или иной символ или число.
Если была выбрана сумма главной диагонали, то при определении ее элементов второй индекс матрицы будет равен первому и начинаться с первого элемента. В случае побочной диагонали второй индекс будет начинаться с последнего элемента и заканчиваться первым. Поэтому в теле функции перед проходом по матрице второму индексу присваивается либо 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
сумма элементов главной диагонали матрицы 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 sfrom 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
кон
Группа: Пользователи
Сообщений: 3
Пол: Женский
Репутация: 0
Даны 3 двумерных массива A, B, C неодинаковой размерности. Разработать 2 процедуры: 1) процедуру для ввода размеров и элементов массива. 2) процедуру вычисления суммы диагональных элементов в каждом массиве. 3) процедуру вычисления суммы 1-ой строки массива. 4) процедуру вывода на экран элементов массива. В программе вычислить общую сумму диагональных элементов трех массивов. Результаты выдать на экран в программе.
Дошла до общей суммы диагоналей и все ступор. Что делаю не так? подскажите и, по возможности, исправьте.
program z_3;type mas=array[1..100, 1..100] of integer;
Var
A,B,C : mas;
sa,sb,sc: integer;
sum:real;
procedure sm(VAR A:mas; Var s:integer);
Var
i,j,n,m,k: integer;Begin
writeln('Введем размеры двумерного массива:');
write(' Количество строк: '); readln(n);
write(' Количество столбцов: '); readln(m);writeln('Заполним массив:');
for i:=1 to n do
for j:=1 to m do
read(a[i,j]);writeln; sum:=0;
k:=1;
for j:=1 to m do sum:=sum+a[k,j];
writeln('Сумма 1-го столбца равна ', sum);writeln; sum:=0;
writeln('Сумму элементов какой диагонали необходимо найти:');
write('Диагональ слева-направо- 1, справа-налево - 2: '); readln(k);
if(k=1)then
begin
j:=1;
for i:=1 to n do
begin
sum:=sum+a[i,j];
j:=j+1;
end;
end;if(k=2)then
begin
j:=m;
for i:=n downto 1 do
begin
sum:=sum+a[i,j];
j:=j-1;
end;
end;
writeln('Сумма равна ',sum);end;
sum:=0;
Begin
sm(A, sa );
sm(B, sb);
sm(C, sc);
begin
sum:=sa+sb+sc;
writeln ( 'сумма диогоналей 3х массивов =' , sum:8:2);
end;
end.