IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Двумерные массивы
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 6
Пол: Мужской

Репутация: -  0  +


Задача на мой взгляд не простая поэтому и лбращаюсь за помощью.
Дана матрица,записанная в текстовый файл.Сдвинуть элементы заданной матрицы в пределах каждого слоя на одну позицию по часовой стрелке.Первый слой образуется из элементов находящихся по периметру матрицы,второй по периметру оставшейся подматрицы и т.д. до заполнения всей матрицы.Полученную матрицу дописать в файл.На экране расскрасить слои разными цветами.
Если есть возможность помогите пожалуйста.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






const
num_row = 5;
num_col = num_row;

type
mx = array[1 .. num_row, 1 .. num_col] of integer;

procedure print(const arr: mx);
var i, j: integer;
begin
for i := 1 to num_row do begin

for j := 1 to num_col do
write(arr[i, j]:4);
writeln;

end;
writeln;

end;

procedure rotate_layer(var arr: mx; const n: integer);
var
buf: array[1 .. num_row * num_col] of integer;
count: integer;

function in_buffer(save: boolean; var X: integer): integer;
begin
inc(count);

if save then buf[count] := X
else X := buf[count];

in_buffer := 1;
end;

var
T, i, j: integer;
cycle: boolean;
begin
if n > (num_row div 2) then exit;

// Цикл будет выполнен 2 раза: сначала при cycle = true, потом при cycle = false
// Первый проход (при cycle = true) - это запись элементов, составляющих "слой"
// в буферный массив (in_buffer при первом параметре = true сохраняет значение).
// На втором проходе будет выполнена обратная процедура: на те же позиции
// в матрицу вернется содержимое буфера.

// А для того, чтобы не делать пустую работу (что сохранили, то и восстановить?
// Какой смысл в этом, "слой" же надо повернуть), сам буфер "прокручивается",
// см. комментарии ниже по тексту
for cycle := true downto false do begin
count := 0;
i := n; j := n;

while j <= num_col - n do inc(j, in_buffer(cycle, arr[i, j]));
while i <= num_row - n do inc(i, in_buffer(cycle, arr[i, j]));
while j >= n do dec(j, in_buffer(cycle, arr[i, j]));
inc(j); dec(i);

while i > n do dec(i, in_buffer(cycle, arr[i, j]));

// Вот, собственно. Пришли сюда на первой итерации. Значит, массив buf
// уже содержит все элементы, которые в матрице составляют "слой".
// Прокручиваем его, т.е., запоминаем последний, сдвигаем все остальные
// на одну позицию вправо, и возвращаем бывшие последним элемент в первую
// позицию. Если теперь вернуть элементы ТОЧНО В ТОМ ЖЕ ПОРЯДКЕ, как их
// записывали в buf, назад в матрицу, то "слой" окажется повернутым по часовой
// стрелке. Чтобы повернуть ПРОТИВ часовой - надо прокрутить buf в обратном
// направлении: сдвинуть все элементы на 1 левее, а первый перенести в конец.
T := buf[count];
move(buf[1], buf[2], (count - 1)*sizeof(integer));
buf[1] := T;
end;

end;

const
A: mx = (
(1, 2, 3, 4, 5),
(3, 4, 5, 6, 7),
(7, 8, 9, 0, 2),
(2, 7, 4, 9, 1),
(0, 3, 7, 7, 5)
);

begin
print(A);
rotate_layer(A, 2);
print(A);
end.
Идея понятна?

(моя программа работает только с квадратными матрицами, чтобы было проще отслеживать, есть ли слой с переданным номером в матрице, или его нет... Если нужно - сделай НЕквадратную, тогда надо будет поменять условие выхода)

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Bush   Двумерные массивы   21.11.2006 15:32
volvo   Что именно вызывает затруднения? Чтение матрицы из…   21.11.2006 16:45
Merhaba   Объясните Пожалуйста, если вам не трудно, принц…   19.04.2011 0:46
Bush   Поворот слоев.   21.11.2006 22:25
volvo   const num_row = 5; num_col = num_row; type …   21.11.2006 23:25
Bush   Вроде ясно.Спасибо.   22.11.2006 22:28
volvo   Добавил немного комментариев. Так понятнее?   19.04.2011 1:00
Merhaba   Добавил немного комментариев. Так понятнее? А ка…   19.04.2011 1:08
Lapp   А как можно написать эту программу без использован…   19.04.2011 6:40
Merhaba   Извиняюсь за вторжение.. Можно, конечно. Наприм…   19.04.2011 9:47
Lapp   а как можно переделать код, где 1-ый слой будет сд…   19.04.2011 9:54
Merhaba   Что переделать?? Ты читай ВНИМАТЕЛЬНО, что тебе п…   21.04.2011 0:31
Lapp   Объясните Пожалуйста, что такое Dec(k) ?Это эквив…   21.04.2011 14:25
Merhaba   Это эквивалентно выражению [code=pas]k := k-1; Ил…   22.04.2011 13:10
Lapp   Объясните Пожалуйста, что такое [code=pas]b:= a[i,…   22.04.2011 15:04
-TarasBer-   > Это, конечно, сильно увеличит время выполнени…   21.04.2011 17:42
Lapp   > Это, конечно, сильно увеличит время выполнени…   22.04.2011 3:27
TarasBer   Ну, в данном случае это извращение довольно просто…   22.04.2011 13:12


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 9.02.2023 17:33
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name