Консультация № 180421
23.10.2010, 08:01
0.00 руб.
0 12 2
Здравствуйте, уважаемые эксперты!
Помогите, пожалуйста, решить задачу:

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

(пользуюсь программой ABC)

Обсуждение

давно
Профессор
401888
1232
23.10.2010, 08:49
общий
это ответ
Здравствуйте, verona!
Код программы в приложении.
Выполнено в Паскаль АВС.

Приложение:
uses crt; //для открытия окна вывода
const nmax=20;//максимальный размер матрицы, больше и не нужно
var a:array[1..nmax,1..nmax]of integer;
n,i,j,c,k,l,p:byte;
sum,min:integer;
begin
randomize;
write('Введите размерность матрицы до ',nmax,' n= ');
readln(n);
writeln('Матрица:');
for i:=1 to n do
begin
for j:=1 to n do
begin
a[i,j]:=random(20)+1;
write(a[i,j]:4);
end;
writeln;
end;
min:=a[1,n]; //примем за минимум последний элемент первой строки
//это тоже единичная диагональ
for l:=1 to 2*n-1 do //по количеству диагоналей, включая главную
begin
sum:=0; //сумма на диагонали
if l<=n then // ниже диагонали, начиная с a[1,n], если нужны только параллельные
//без главной, то написать if l<n
begin
for i:=n-l+1 to n do //начало и конец диагонали
sum:=sum+a[i,i-n+l];
writeln('Сумма ',l:2,'=',sum:4);
if sum<min then min:=sum; //выбираем минимальную сумму
end
else if l>n then //то же самое выше дивгонали
begin
for i:=1 to 2*n-l do
sum:=sum+a[i,i-n+l]; //сама диагональ
writeln('Сумма ',l:2,'=',sum:4);
if sum<min then min:=sum;
end;
end;
writeln('Минимальная сумма=',min);
end.
давно
Модератор
156417
2175
23.10.2010, 14:21
общий
Пупорев Юрий Борисович:
Для чего нужна эта конструкция?
for j:=1 to l do
if j=i-n+l then sum:=sum+a[i,j]; //сама диагональ
не проще ли её сократить до
j=i-n+l; sum:=sum+a[i,j]; //сама диагональ
или даже до
sum:=sum+a[i,i-n+l]; //сама диагональ
Неизвестный
23.10.2010, 14:23
общий
23.10.2010, 15:42
это ответ
Здравствуйте, verona!
Последовательность действий:
Вычисляем суммы диагоналей выше главной и ниже главной диагонали (функции SummaAbove и SummaBelow).
Заносим их в одномерный массив.
Находим минимум (MinDiag).

Приложение:
program MinimumDiag;
const DimArray = 20;
{ DimDiags = 2*(DimArray-2);}
var A: array[1..DimArray, 1..DimArray] of Integer;
Diag: array[1..2*(Dimarray-1)] of Integer;
nA, nD: Integer;
i, j, d: Integer;
function SummaAbove(nCol: Integer): Integer;
var i, j, sum: Integer;
begin
sum := 0;
for i := 1 to nA-nCol+1 do
sum := sum + A[nCol+i-1,i];
SummaAbove := sum
end;
function SummaBelow(nRow: Integer): Integer;
var i,j, sum: Integer;
begin
sum := 0;
for i := 1 to nA-nRow+1 do
sum := sum + A[i,nRow+i-1];
SummaBelow := sum;
end;
function MinDiag: Integer;
var i, m: Integer;
begin
m := Diag[1];
for i := 2 to nD do
if m > Diag[i]
then m := Diag[i];
MinDiag := m;
end;
begin
write('Input max array (<=',DimArray,') ');
readln(nA);
if (nA <= 0) or (nA > DimArray) then nA := DimArray;
nD := 2*(nA-1);
writeln('Source array:');
randomize;
for i := 1 to nA do begin
for j := 1 to nA do begin
A[i,j]:=5+random(45);
write(a[i,j]:4);
end;
writeln;
end;
writeln;
d := 1;
if nA < 2 then
Diag[d] := A[1,1]
else
for i := 2 to nA do begin
Diag[d] := SummaAbove(i); inc(d);
Diag[d] := SummaBelow(i); inc(d);
end;
writeln('Min diags = ',MinDiag);
end.
5
давно
Академик
320937
2216
23.10.2010, 14:28
общий
tatyana:
Добрый день, tatyana!
Пример работы по Вашей программе.
Код:
Input max array (<=20) 1
Source array:
43

Min diags = 0

Должно быть 43.
давно
Профессор
401888
1232
23.10.2010, 14:33
общий
Ну вот так уж у меня мозг неповоротливо работает, все ему нужно по полочкам разложить...
Исправил код.
Неизвестный
23.10.2010, 14:36
общий
Исправила код, буду внимательней )))
Неизвестный
23.10.2010, 14:39
общий
Извините за серость: что нужно сделать, чтобы поправить код? В смысле, куда ткнуть?
давно
Профессор
401888
1232
23.10.2010, 14:47
общий
Справа внизу под Вашим ответом есть кнопка Редактировать.
Неизвестный
23.10.2010, 14:56
общий
[q=187336][/q]
Нет у меня такой кнопки, только "наверх"
давно
Профессор
401888
1232
23.10.2010, 15:14
общий
Значит не судьба, видимо статус не позволяет редактировать. Выложите код в сообщении с просьбой к модератору внести изменения.
давно
Мастер-Эксперт
425
4118
23.10.2010, 15:22
общий
tatyana:
Нужно в мини-форуме выложить исправленный код, а в поле "Выбрать адресата" выбрать пункт "Модераторы", тогда кто-нибудь из модераторов исправит Ваш ответ. У Вас самой пока нет возможности править ответ.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Академик
320937
2216
24.10.2010, 01:12
общий
Доброго времени суток, коллеги! Предлагаю свой вариант. Очевидно, можно еще ускорить вычисления, если приостанавливать суммирование, как только частичная сумма превзошла минимальную. Надо ли?
Код:
const
NMAX = 20;
type
TMatrix = array[1..NMAX, 1..NMAX] of integer;

function DiagSum(m: TMatrix; n: integer; diag: integer): integer;
// Вычисление суммы на главной или параллельной главной
// Пронумеруем диагонали слева-снизу вверх направо от 1 до 2*n-1
// Дальше все просто
var
s : integer;
row, col: integer;
i : integer;
begin
// по номеру диагонали выясним координаты ее левой ячейки
if diag<=n then
begin
col := 1;
row := n - diag +1;
end
else
begin
row := 1;
col := diag - n +1;
end;
// вычислим сумму по диагонали, начинающейся с ячейки [row, col]
s:= 0;
for i:= row+col-1 to n do
begin
s:= s + m[row,col];
inc(row); // вниз
inc(col); // и вправо
end;
DiagSum := s;
end;

var
i, j: integer; // просто счетчики
n : integer; // текущий размер матрицы
m : TMatrix; // наша матрица
min : integer; // минимальная сумма
d : integer; // временное хранилище суммы в цикле
begin
write('Размер матрицы от ',1, ' до ', nmax,' n=');
readln(n);
if not (n in [1..NMAX]) then
begin
writeln('Вы выбрали размер не в диапазоне, будет принят ', NMAX);
n:= NMAX;
end;

// формирование
randomize;
for i:=1 to n do
for j:=1 to n do
m[i,j]:=random(20)+1;

// эхо-печать
writeln('Введенная матрица');
for i:=1 to n do
begin
for j:=1 to n do
write(m[i,j]:3);
writeln;
end;

// вычисление минимальной суммы
min:= DiagSum(m,n,1);
for i:= 2 to 2*n-1 do
begin
d:= DiagSum(m,n,1);
if d<min then
min := d;
end;

writeln('Минимальная сумма ', min);
end.


Примеры работы
Код:
Размер матрицы от 1 до 20 n=5
Введенная матрица
13 10 15 10 19
8 11 18 5 19
6 14 9 7 10
20 10 13 1 18
7 16 4 7 7
Минимальная сумма 7
Размер матрицы от 1 до 20 n=1
Введенная матрица
2
Минимальная сумма 2
Размер матрицы от 1 до 20 n=2
Введенная матрица
5 14
5 18
Минимальная сумма 5

Форма ответа