Двумерные массивы |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Двумерные массивы |
Bush |
21.11.2006 11:32
Сообщение
#1
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Репутация: 0 |
Задача на мой взгляд не простая поэтому и лбращаюсь за помощью.
Дана матрица,записанная в текстовый файл.Сдвинуть элементы заданной матрицы в пределах каждого слоя на одну позицию по часовой стрелке.Первый слой образуется из элементов находящихся по периметру матрицы,второй по периметру оставшейся подматрицы и т.д. до заполнения всей матрицы.Полученную матрицу дописать в файл.На экране расскрасить слои разными цветами. Если есть возможность помогите пожалуйста. |
volvo |
21.11.2006 12:45
Сообщение
#2
|
Гость |
Что именно вызывает затруднения? Чтение матрицы из файла? Поворот по часовой стрелке? ДОзапись в файл? раскрашивание разными цветами разных "слоев"?
Не может же быть, чтобы НИЧЕГО вообще не получалось? |
Bush |
21.11.2006 18:25
Сообщение
#3
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Репутация: 0 |
Поворот слоев.
|
volvo |
21.11.2006 19:25
Сообщение
#4
|
Гость |
constИдея понятна? (моя программа работает только с квадратными матрицами, чтобы было проще отслеживать, есть ли слой с переданным номером в матрице, или его нет... Если нужно - сделай НЕквадратную, тогда надо будет поменять условие выхода) Сообщение отредактировано: volvo - 18.04.2011 21:54 |
Bush |
22.11.2006 18:28
Сообщение
#5
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Репутация: 0 |
Вроде ясно.Спасибо.
|
Merhaba |
18.04.2011 20:46
Сообщение
#6
|
Пионер Группа: Пользователи Сообщений: 57 Пол: Мужской Репутация: 0 |
|
volvo |
18.04.2011 21:00
Сообщение
#7
|
Гость |
Добавил немного комментариев. Так понятнее?
|
Merhaba |
18.04.2011 21:08
Сообщение
#8
|
Пионер Группа: Пользователи Сообщений: 57 Пол: Мужской Репутация: 0 |
|
Lapp |
19.04.2011 2:40
Сообщение
#9
|
Уникум Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
А как можно написать эту программу без использования буферного массива? может быть, как-нить через новые переменные двигать элементы? Извиняюсь за вторжение.. Можно, конечно. Например, можно делать многократный сдвиг на одну позицию. Это, конечно, сильно увеличит время выполнения, но это общий закон: либо память - либо время. У меня тоже есть заготовочка на эту тему (без буферного массива), вот тут: и опять матрицы Если там сделать внешний цикл по значениям k, то получишь то, что надо. Плюс уйти от квадратности. То есть как-то вот так: if n<m then k:= n else k:= m; -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Merhaba |
19.04.2011 5:47
Сообщение
#10
|
Пионер Группа: Пользователи Сообщений: 57 Пол: Мужской Репутация: 0 |
Извиняюсь за вторжение.. Можно, конечно. Например, можно делать многократный сдвиг на одну позицию. Это, конечно, сильно увеличит время выполнения, но это общий закон: либо память - либо время. У меня тоже есть заготовочка на эту тему (без буферного массива), вот тут: и опять матрицы Если там сделать внешний цикл по значениям k, то получишь то, что надо. Плюс уйти от квадратности. То есть как-то вот так: if n<m then k:= n else k:= m; Спасибо Вам Большое за помощь!!! а как можно переделать код, где 1-ый слой будет сдвигаться на к элементов, 2-ой на к-1 элементов, .... , где к - число слоев ? |
Lapp |
19.04.2011 5:54
Сообщение
#11
|
Уникум Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
а как можно переделать код, где 1-ый слой будет сдвигаться на к элементов, 2-ой на к-1 элементов, .... , где к - число слоев ? Что переделать??Ты читай ВНИМАТЕЛЬНО, что тебе пишут. А заодно, запусти код и посмотри, что он делает. И тогда, может, не будешь спрашивать, как сделать то, что уже сделано.. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Merhaba |
20.04.2011 20:31
Сообщение
#12
|
Пионер Группа: Пользователи Сообщений: 57 Пол: Мужской Репутация: 0 |
Что переделать?? Ты читай ВНИМАТЕЛЬНО, что тебе пишут. А заодно, запусти код и посмотри, что он делает. И тогда, может, не будешь спрашивать, как сделать то, что уже сделано.. Объясните Пожалуйста, что такое Dec(k) ? Я просто больше пишу проги на Java, чем на Паскале... немного подзабыл Сообщение отредактировано: Merhaba - 20.04.2011 20:31 |
Lapp |
21.04.2011 10:25
Сообщение
#13
|
Уникум Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Объясните Пожалуйста, что такое Dec(k) ? Это эквивалентно выражениюk := k-1; Или, если хочешь, то же самое, что k-= 1; на Си или Java. Dec является сокращение слова decrease (уменьшать). Есть также еще процедура Inc (от increase) для увеличения на единицу. Цитата Я просто больше пишу проги на Java, чем на Паскале... немного подзабыл Нет проблем )-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
-TarasBer- |
21.04.2011 13:42
Сообщение
#14
|
Гость |
> Это, конечно, сильно увеличит время выполнения, но это общий закон: либо память - либо время.
В данном случае это не так. Для того, чтобы сделать циклический сдвиг массива из m элементов на n, надо НОД(m,n) раз сделать такую операцию: взять k-ый элемент (k - это номер операции, то есть мы делаем это сначала для k=0, потом для k=1, и так далее до k=НОД(m,n)-1) и поменять его местами с k+n-ым. Потом k+n-ый поменять с k+n+n b так далее, пока не окажется, что новый элемент, с которым надо менять, имеет индекс k. Вообще в цепочке длины L надо выполнить L-1 обмен. Кстати, L = m / НОД(m,n) Короче, если грузануть хитрую алгебру, то можно без затрат обойтись без доп.массива. |
Lapp |
21.04.2011 23:27
Сообщение
#15
|
Уникум Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
> Это, конечно, сильно увеличит время выполнения, но это общий закон: либо память - либо время. В данном случае это не так. Для того, чтобы сделать циклический сдвиг массива из m элементов на n, надо НОД(m,n) раз сделать такую операцию: взять k-ый элемент (k - это номер операции, то есть мы делаем это сначала для k=0, потом для k=1, и так далее до k=НОД(m,n)-1) и поменять его местами с k+n-ым. Потом k+n-ый поменять с k+n+n b так далее, пока не окажется, что новый элемент, с которым надо менять, имеет индекс k. Вообще в цепочке длины L надо выполнить L-1 обмен. Кстати, L = m / НОД(m,n) Короче, если грузануть хитрую алгебру, то можно без затрат обойтись без доп.массива. Я в трансе Как будет время, попробую реализовать. Тарас, мож тиснешь для FAQ? И, пожалуйста, кинь тут свой пост (а не гостя). Я понимаю, что ты не "кармадрочер" (модное словцо с твоей же легкой руки, подхваченное volvo, но я не могу писать его иначе как в кавычках)), но ставить +1 из другой темы - неправильно.. )) -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Merhaba |
22.04.2011 9:10
Сообщение
#16
|
Пионер Группа: Пользователи Сообщений: 57 Пол: Мужской Репутация: 0 |
Это эквивалентно выражению k := k-1; Или, если хочешь, то же самое, что k-= 1; на Си или Java. Dec является сокращение слова decrease (уменьшать). Есть также еще процедура Inc (от increase) для увеличения на единицу. Нет проблем ) Объясните Пожалуйста, что такое b:= a[i,i];? Если переменная, то какого она типа? И зачем мы сохраняем левый верхний элемент? Что мы будем выводить на дисплей? Сообщение отредактировано: Merhaba - 22.04.2011 9:31 |
TarasBer |
22.04.2011 9:12
Сообщение
#17
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Ну, в данном случае это извращение довольно просто реализуется.
А вот для случая обмена a и 2*a подобное провернуть не удастся (если помнишь ту старую тему), так как задача сводится к задаче дискретного логарифмирования, а она за время разумного порядка не решается. (Это используется в криптографии, кстати). А слово это не я придумал. Это вроде с какого-то сайтика с развитой системой рейтинга (и вытекающими из неё последствиями) пошло. -------------------- |
Lapp |
22.04.2011 11:04
Сообщение
#18
|
Уникум Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Объясните Пожалуйста, что такое
Естественно, b - переменная. Того же типа, что и элементы массива.b:= a[i,i];? Если переменная, то какого она типа? Цитата И зачем мы сохраняем левый верхний элемент? Ты играл в игру "15" когда нибудь? Ее еще стали называть "пятнашки", хотя это неправильно. Знаешь? такая коробочка, а в ней квадратики с чиселками. Эти квадратики надо перемещать. Там цель - выстроить по порядку, но ты на это забей. Твой случай - это двигать слои. Верно?Так вот, чтобы двигать, в этой игре есть ПУСТАЯ клетка. На ее место можно передвинуть соседнюю - и тогда освободится соседняя.. И так далее. А если бы не было пустой клетки - как тогда двигать? Никак! Вот поэтому я вынимаю один элемент сначала (кладу в буферную переменную b). А потом, когда процесс сдвига слоя закончен - я кладу ее обратно на нужное место. Так понятнее? Цитата Что мы будем выводить на дисплей? Сначала - исходный массив. Потом - что получилось..Ладно, вот тебе, только разберись, пожалуйста. const -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Текстовая версия | 23.09.2024 8:04 |