Здравствуйте,
подскажите, пожалуйста, решение или укажите нужное направление
Var A: array [1..n, 1..n] of real; (n-нечетно).
Найти сумму элементов из области матрицы A, отмеченной символом ‘*’:
0 0 0 * 0 0 0
0 0 * * * 0 0
0 * * * * * 0
* * * * * * *
0 * * * * * 0
0 0 * * * 0 0
0 0 0 * 0 0 0
s:=0;
for i:=1 to (n div 2)+1 do
for j:=(n div 2)+1+1-i to (n div 2)+1-1+i do s:=s+a[i,j];
for i:=(n div 2)+2 to n do
for j:=(n div 2)+1-(n-i) to (n div 2)+1+(n-i) do s:=s+a[i,j];
Можно сделать ровно в 2 раза меньше циклов:
s := 0;
for i := -(n div 2) to (n div 2) do
for j := abs(i) + 1 to n - abs(i) do s := s + arr[i + (n div 2) + 1, j];
const
n= 7;
m= n div 2 + 1;
var
a: array[1..n,1..n]of integer;
function Rhomb(i,j: integer): integer;
begin
if Abs(i-m)<m-Abs(j-m) then
if i=m then
Rhomb:= a[i,j]+Rhomb(i-1,j)+Rhomb(i+1,j)+Rhomb(i,j+1)
else
Rhomb:= a[i,j]+Rhomb(i+(i-m) div Abs(i-m),j)
else Rhomb:=0
end;
begin
{input a}
WriteLn('Rhomb Summ is: ',Rhomb(m,1));
ReadLn
end.
Вот ведь интересно: читаем одно и то же, а прочитываем разное.
В условии написано "Найти сумму элементов из области матрицы A, отмеченной символом ‘*’" а не "Найти сумму элементов из области матрицы A, имеющей форму ромба". Т.е. как бы не располагались звездочки, хоть в шахматном порядке, решение надо искать по звездочкам, а не предполагая заранее, что звездочки расположены в виде ромба.
Т.е. у нас должно быть две матрицы: одна с числами, а вторая - со звездочками.
Решение:
1. Перебираем все элементы матриц, если во второй "*", добавляем к сумме число из первой, если нет - нет.
2. Можно оптимизировать: вместо условного перехода подбираем формулу, которая преобразует "*" в 1, а "0" в 0, и складываем все произведения чисел из первой матрицы и результатов формцлы из второй. Теоретически можем получить выигрыш в скорости в несколько (до 10) раз. Хотя, думаю, автору темы это неинтересно.
Для первого варианта:
constДа, посмотрел по условию - массив чисел вещественный. Поправил.
n= 7;
var
a: array[1..n,1..n]of real;
b: array[1..n,1..n]of char;
var
i,j : integer;
summ : real;
begin
{input a,b}
summ := 0.0;
for i := 1 to n do
for j := 1 to n do
if b[i,j] = '*' then
summ := summ + a[i,j]);
WriteLn('Rhomb Summ is: ',summ);
ReadLn
end.
for i := 1 to n do
for j := 1 to n do
summ := summ + a[i,j]*byte(b[i,j]='*');
andriano, как всегда, верен себе))
В условии ничего не сказано про вторую матрицу, так что речь скорее всего про ромб.
Всем спасибо за ответы! Просто супер!
А как на счет такой матрицы (условия задачи: Найти сумму элементов из области матрицы, отмеченной символом * (диагонали входят в выделенную область)
* * * * * * *
0 * * * * * 0
0 0 * * * 0 0
0 0 0 * 0 0 0
0 0 * * * 0 0
0 * * * * * 0
* * * * * * *
тут походу точно должно быть две матрицы, или я ошибаюсь?
Помогите мне разобраться с такой задачкой.
for i := 1 to n div 2 + n mod 2 do
for j := i to n - i + 1 do
begin
s := s + a[i, j];
if i <> n div 2 + n mod 2 then { Чтобы центральный элемент не посчитать дважды }
s := s + a[n - i + 1, j];
end;
Почему то не получается, не могу разобраться, помогите. И в массив забивать можно любые числа или нет? К примеру:
1 2 3 4 5 6 7
2 3 4 5 6 7 8
3 4 5 6 7 8 9
4 5 6 7 8 9 0
5 6 7 8 9 0 1
6 7 8 9 0 1 2
7 8 9 0 1 2 3
или же как по условию, с нулями где и должны стоять.
Program Massivzv;
const
n=7;
var
a:array[1..n, 1..n] of real;
i, j, s: integer;
begin
assign(input, 'massivzv.in'); reset(input);
assign(output, 'massivzv.out'); rewrite(output)
for i := 1 to n div 2 + n mod 2 do
for j := i to n - i + 1 do
begin
s := s + a[i, j];
if i <> n div 2 + n mod 2 then { Чтобы центральный элемент не посчитать дважды }
s := s + a[n - i + 1, j];
end;
Читать матрицу из файла не пробовал?
На данный момент все, что ты пытаешься сделать - это складывать нули, которыми матрица инициализируется при старте программы по умолчанию. Этого можешь не делать, я тебе и так скажу, ответ будет "0". Удивительно, правда?
К тому же ты еще и не выводишь ничего никуда, так что откуда ты вообще знаешь, получается у тебя что-то или нет? Телепатия?
Но самое главное - это сделать так, чтоб программа хотя бы откомпилировалась. Ошибки-то исправь, синтаксические. Где-то точку с запятой забыл, где-то еще что-то...
Помогите мне добить этот пример, не могу сооброзить, что куда. Я ведь только учусь... буду очень благодарен.