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

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

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

> Двумерные массивы
Bush
сообщение 21.11.2006 11:32
Сообщение #1





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

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


Задача на мой взгляд не простая поэтому и лбращаюсь за помощью.
Дана матрица,записанная в текстовый файл.Сдвинуть элементы заданной матрицы в пределах каждого слоя на одну позицию по часовой стрелке.Первый слой образуется из элементов находящихся по периметру матрицы,второй по периметру оставшейся подматрицы и т.д. до заполнения всей матрицы.Полученную матрицу дописать в файл.На экране расскрасить слои разными цветами.
Если есть возможность помогите пожалуйста.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 21.11.2006 19:25
Сообщение #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 - 18.04.2011 21:54
 К началу страницы 
+ Ответить 

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


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

 



- Текстовая версия 19.07.2025 4:10
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"