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
сообщение 18.04.2011 21:00
Сообщение #2


Гость






Добавил немного комментариев. Так понятнее?
 К началу страницы 
+ Ответить 
Merhaba
сообщение 18.04.2011 21:08
Сообщение #3


Пионер
**

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

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


Цитата(volvo @ 18.04.2011 22:00) *

Добавил немного комментариев. Так понятнее?

А как можно написать эту программу без использования буферного массива?
может быть, как-нить через новые переменные двигать элементы?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 19.04.2011 2:40
Сообщение #4


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(Merhaba @ 18.04.2011 22:08) *
А как можно написать эту программу без использования буферного массива?
может быть, как-нить через новые переменные двигать элементы?

Извиняюсь за вторжение..

Можно, конечно. Например, можно делать многократный сдвиг на одну позицию. Это, конечно, сильно увеличит время выполнения, но это общий закон: либо память - либо время.
У меня тоже есть заготовочка на эту тему (без буферного массива), вот тут: и опять матрицы
Если там сделать внешний цикл по значениям k, то получишь то, что надо. Плюс уйти от квадратности.

То есть как-то вот так:
  if n<m then k:= n else k:= m;
k:= k div 2; {это количество слоев}
while k>0 do begin {цикл с уменьшением числа слоев дает нужный сдвиг каждого слоя}
for i:=1 to k do begin {цикл по слоям, от внешнего к внутреннему}
b:= a[i,i]; {сохраняем левый верхний элемент}
for j:=i to n-i do a[j,i]:= a[j+1,i]; {поэлементно двигаем левую сторону слоя вверх на одну позицию}
for j:=i to m-i do a[n-i+1,j]:= a[n-i+1,j+1]; {двигаем нижнюю сторону влево}
for j:=n-i downto i do a[j+1,m-i+1]:= a[j,m-i+1]; {двигаем правую сторону вниз}
for j:=m-i downto i+1 do a[i,j+1]:= a[i,j]; {двигаем верхнюю сторону вправо кроме последнего элемента}
a[i,i+1]:= b {кладем сохраненный элемент во вторую позицию верхней стороны слоя}
end;
Dec(k) {уменьшаем количество сдвигаемых слоев}
end;


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Merhaba
сообщение 19.04.2011 5:47
Сообщение #5


Пионер
**

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

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


Цитата(Lapp @ 19.04.2011 3:40) *

Извиняюсь за вторжение..

Можно, конечно. Например, можно делать многократный сдвиг на одну позицию. Это, конечно, сильно увеличит время выполнения, но это общий закон: либо память - либо время.
У меня тоже есть заготовочка на эту тему (без буферного массива), вот тут: и опять матрицы
Если там сделать внешний цикл по значениям k, то получишь то, что надо. Плюс уйти от квадратности.

То есть как-то вот так:
  if n<m then k:= n else k:= m;
k:= k div 2; {это количество слоев}
while k>0 do begin {цикл с уменьшением числа слоев дает нужный сдвиг каждого слоя}
for i:=1 to k do begin {цикл по слоям, от внешнего к внутреннему}
b:= a[i,i]; {сохраняем левый верхний элемент}
for j:=i to n-i do a[j,i]:= a[j+1,i]; {поэлементно двигаем левую сторону слоя вверх на одну позицию}
for j:=i to m-i do a[n-i+1,j]:= a[n-i+1,j+1]; {двигаем нижнюю сторону влево}
for j:=n-i downto i do a[j+1,m-i+1]:= a[j,m-i+1]; {двигаем правую сторону вниз}
for j:=m-i downto i+1 do a[i,j+1]:= a[i,j]; {двигаем верхнюю сторону вправо кроме последнего элемента}
a[i,i+1]:= b {кладем сохраненный элемент во вторую позицию верхней стороны слоя}
end;
Dec(k) {уменьшаем количество сдвигаемых слоев}
end;



Спасибо Вам Большое за помощь!!!
а как можно переделать код, где 1-ый слой будет сдвигаться на к элементов, 2-ой на к-1 элементов, .... , где к - число слоев ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 19.04.2011 5:54
Сообщение #6


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(Merhaba @ 19.04.2011 6:47) *
а как можно переделать код, где 1-ый слой будет сдвигаться на к элементов, 2-ой на к-1 элементов, .... , где к - число слоев ?
Что переделать??
Ты читай ВНИМАТЕЛЬНО, что тебе пишут.
А заодно, запусти код и посмотри, что он делает.
И тогда, может, не будешь спрашивать, как сделать то, что уже сделано..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Merhaba
сообщение 20.04.2011 20:31
Сообщение #7


Пионер
**

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

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


Цитата(Lapp @ 19.04.2011 6:54) *

Что переделать??
Ты читай ВНИМАТЕЛЬНО, что тебе пишут.
А заодно, запусти код и посмотри, что он делает.
И тогда, может, не будешь спрашивать, как сделать то, что уже сделано..


Объясните Пожалуйста, что такое Dec(k) ?
Я просто больше пишу проги на Java, чем на Паскале... немного подзабыл

Сообщение отредактировано: Merhaba - 20.04.2011 20:31
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 21.04.2011 10:25
Сообщение #8


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Цитата(Merhaba @ 20.04.2011 21:31) *
Объясните Пожалуйста, что такое Dec(k) ?
Это эквивалентно выражению
k := k-1;

Или, если хочешь, то же самое, что
k-= 1;

на Си или Java.
Dec является сокращение слова decrease (уменьшать). Есть также еще процедура Inc (от increase) для увеличения на единицу.

Цитата
Я просто больше пишу проги на Java, чем на Паскале... немного подзабыл
Нет проблем )


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Merhaba
сообщение 22.04.2011 9:10
Сообщение #9


Пионер
**

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

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


Цитата(Lapp @ 21.04.2011 11:25) *

Это эквивалентно выражению
k := k-1;

Или, если хочешь, то же самое, что
k-= 1;

на Си или Java.
Dec является сокращение слова decrease (уменьшать). Есть также еще процедура Inc (от increase) для увеличения на единицу.

Нет проблем )


Объясните Пожалуйста, что такое
b:= a[i,i]; 
?
Если переменная, то какого она типа?
И зачем мы сохраняем левый верхний элемент?
Что мы будем выводить на дисплей?

Сообщение отредактировано: Merhaba - 22.04.2011 9:31
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
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 0:58
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"