1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Задача с двумерным массивом, Элементы равный сумме по...
Дан массив A размерности n*m . Получить одномерный массив B, элементы которого получены путем суммирования элементов исходного массива , находящихся по периметрам.
В качестве примера, вот набросал, изображение такого рода:
Прогресс не очень далеко, а может и нет. Работает правда этот кусочек кода для массива n*n, а вот для n*m ломаю голову... Пока дошел вот до этого:
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]);
Но если ты все же хочешь выяснить, как решить эту задачу обходом по отдельным периметрам (контурам), то вот тебе другое решение. Рекомендую тебе с ним тоже разобраться, поскольку лучше свои ошибки понимать до конца.
if m<n then d:=(m-1)div 2+1 else d:=(n-1)div 2+1; // calculate contours amount (size of b) for i:=1 to d do begin // cycle through contours for j:=i to m-i+1 do begin // rows (with edges) Inc(b[i],a[j,i]); if i<n-i+1 then Inc(b[i],a[j,n-i+1]); // do not count a central row twice end; for j:=i+1 to n-i do begin // columns (edges excluded) Inc(b[i],a[i,j]); if i<m-i+1 then Inc(b[i],a[m-i+1,j]); // do not count a central column twice end end;
Спасибо! Немного уже раскрутил задачу с твоей помощью. Только проблема с подсчетом неквадратной матрицы осталась, т.к. подсчеты неправильные идут уже с первого элемента
Спасибо! Немного уже раскрутил задачу с твоей помощью. Только проблема с подсчетом неквадратной матрицы осталась, т.к. подсчеты неправильные идут уже с первого элемента
ЧТООО???... Эй, приятель.. Ты даешь себе отчет в том, что делаешь и пишешь?.. Я тебе дал ДВА ВЕРНЫХ РЕШЕНИЯ С ПОДРОБНЫМИ КОММЕНТАРИЯМИ. Они БЕЗУСЛОВНО работают со всеми матрицами любых соотношений длины и ширины. От тебя требовалось только переменные описать и ввести/вывести результат. Ты даже этого, не смог сделать, up'ник..
Хорошо, дополняю эти решения до целых программ.
Решение с обходом по контурам.
const m=3; n=4; l=(m+n-1) div 4 +1;
var a: array [1..m,1..n] of integer; i,j,d: integer; b: array [1..l] of integer;
begin for i:=1 to m do begin for j:=1 to n do begin a[i,j]:=Random(10); Write(a[i,j]:4) end; WriteLn end; WriteLn; if m<n then d:=(m-1)div 2+1 else d:=(n-1)div 2+1; // calculate contours amount (size of b) for i:=1 to d do begin // cycle through contours for j:=i to m-i+1 do begin // rows Inc(b[i],a[j,i]); if i<n-i+1 then Inc(b[i],a[j,n-i+1]); // do not count last line twice end; for j:=i+1 to n-i do begin // columns Inc(b[i],a[i,j]); if i<m-i+1 then Inc(b[i],a[m-i+1,j]); // do not count last column twice end end; for i:=1 to d do Write(b[i]:4); ReadLn end.
Решение со сквозным подсчетом (лучше).
const m=4; n=4; l=(m+n-1)div 4+1;
var a: array [1..m,1..n] of integer; i,j,k,d: integer; b: array [1..l] of integer;
begin for i:=1 to m do begin for j:=1 to n do begin a[i,j]:=Random(10); Write(a[i,j]:4) end; WriteLn end; WriteLn; if m<n then d:=(m-1)div 2+1 else d:=(n-1)div 2+1; // calculating the b size for i:=1 to m do for j:=1 to n do begin k:=d; // set to max possible if i<k then k:=i; // top distance if j<k then k:=j; // left distance if m-i+1<k then k:=m-i+1; // bottom distance if n-j+1<k then k:=n-j+1; // right distance Inc(b[k],a[i,j]); // adding to summ array end; for i:=1 to d do Write(b[i]:4); ReadLn end.
И кончай тут Up'ать каждый час. Тут не слепые собрались. Есть, что сказать - говори. А понукать будешь лошадей, когда сапоги выдадут..
-1 за нежелание вникать в ответы..
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой