Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Перестановки в слове

Автор: setare 27.11.2006 21:40

Здравствуйте!!!!
Появилась маленькая проблема в решении задачи. Преподаватель мне задал такую задачу: вводится слово, нужно сделать в нем перестановки: первый символ остается первым, второй становится последним, третий символ становится вторым, четвертый символ становится предпоследним и тд. Например:
abcdef
Result: acefdb
abcde
acedb
Проблема в том, что не понятна зависимость. Плюс преподавателя не будет до конца недели, когда уже надо сдавать. И не очень понятно как писать программу с использованием именно перестановок.

Автор: volvo 27.11.2006 21:48

Ну, по условию получается, что если позиция символа (назовем ее P) НЕчетная, то нужно переставить символ в позицию: (P div 2 + 1), а если четная, то в позицию (length(s) - (P div 2)) + 1, так?

Автор: setare 27.11.2006 21:55

Цитата(volvo @ 27.11.2006 17:48) *

Ну, по условию получается, что если позиция символа (назовем ее P) НЕчетная, то нужно переставить символ в позицию: (P div 2 + 1), а если четная, то в позицию (length(s) - (P div 2)) + 1, так?

Честно говоря, я что-то не очень поняла, как это получится. А если работать через массив данных, а не через строчку? Просто нам сказали вводить эти симолы через массив.

Автор: мисс_граффити 27.11.2006 22:13

тогда вместо length(s) поставишь размерность массива

Автор: setare 27.11.2006 22:24

А вот, если делать это в цикле, как можно из одного массива (исходного) таким образом перезаписать в другой? Просто присваиванием : например p- размерность:
if (i mod 2=0)
ch[i+1]=ch2[i];
else
ch[(p-i)+1]=ch2[i];
Нужно работать с двумя максимум массивами!

Автор: volvo 27.11.2006 22:28

ch_1 - исходный массив, ch_2 - полученный ...

for i := 1 to P do
if i mod 2 <> 0 then ch_2[(i div 2) + 1] := ch_1[i]
else ch_2[(P - (i div 2)) + 1] := ch_1[i];
Больше двух массивов и не нужно smile.gif

Автор: setare 27.11.2006 22:32

Цитата(volvo @ 27.11.2006 18:28) *

ch_1 - исходный массив, ch_2 - полученный ...
for i := 1 to P do
if i mod 2 <> 0 then ch_2[(i div 2) + 1] := ch_1[i]
else ch_2[(P - (i div 2)) + 1] := ch_1[i];
Больше двух массивов и не нужно smile.gif

Огромное Вам спасибо! Сейчас попробую! smile.gif

Автор: setare 30.11.2006 22:13

Всем здравствуйте! Я вот через несколько дней после вашей подсказки подумала, и поняла, что это же все таки не перестановка. Может быть, я конечно ошибаюсь, но честно здесь можно использовать именно алгоритм перестановки или же здесь нет такой зависимости. Я имею ввиду получить этот же результат, но не смотреть на четные и нечетные позиции элементов и копирование их ы другой массив?

Автор: мисс_граффити 30.11.2006 22:20

blink.gif
а если смотреть на четность - это уже не перестановка?
обойтись одним массивом можно... но зачем?
определись, чего ты хочешь...

Автор: setare 30.11.2006 22:36

Вообще-то я говорила, что именно мне нужна перестановка. Потому что когда мы проверяем на четность+ копируем элементы в другой массив, это уже не считается перестановкой.

Автор: мисс_граффити 30.11.2006 22:38

а если проверяем, но не копируем, а работаем с этим же - перестановка?

Автор: setare 30.11.2006 22:45

Как я понимаю, да. smile.gif Если работать в одном массиве. Просто я лично старалась найти зависимость в этой перестановке, чтобы именно в одном массиве переставлять символы, например:
abcdef
1)afcdeb
2)afcedb
3)acfedb
4)acefdb
тут будет 4 перестановки. Но как-то повторяемости нет. Мне задалди задание именно написать перестановку, а я как бы просто пишу копирование. rolleyes.gif Поэтому спрашиваю, может быть, все таки кто-то увидит здесь повторяемость! smile.gif

Автор: Archon 1.12.2006 4:40

Просматриваем массив с конца. Если элементов нечётное число - начинаем с последнего элемента, если чётное - со второго. Алгоритм: символ пропускаешь, следующий переносишь в конец, следующий пропускаешь, следующий переносишь в конец... Это можно считать перестановками?

Автор: Archon 1.12.2006 5:06

Вот ещё один алгоритм: то, что подчёркнуто, надо перевернуть (записать наоборот).
abcdefgh
ahgfedcb
acdefghb
achgfedb
acefghdb
acehgfdb
Стоит попробовать упростить алгоритм. Буду думать.

Автор: Archon 1.12.2006 12:50

По утру ещё один свежий алгоритм в голову пришёл. Смысл такой: меняем местами соседние буквы в слове, начиная сперва со второй, потом с 3-ей, с 4-ой и тд. Вот так (дефис - меняем местами):
a b-c d-e f-g h
a c b-e d-g f-h
a c e b-g d-h f
a c e g b-h d-f
a c e g h b-f d
a c e g h f b-d
a c e g h f d b
Пожалуй лучший способ.

Автор: setare 1.12.2006 23:25

Цитата(Archon @ 1.12.2006 8:50) *

По утру ещё один свежий алгоритм в голову пришёл. Смысл такой: меняем местами соседние буквы в слове, начиная сперва со второй, потом с 3-ей, с 4-ой и тд. Вот так (дефис - меняем местами):
a b-c d-e f-g h
a c b-e d-g f-h
a c e b-g d-h f
a c e g b-h d-f
a c e g h b-f d
a c e g h f b-d
a c e g h f d b
Пожалуй лучший способ.

Здравствуйте! Большое спасибо за последний алгоритм. Это именно перестановка. smile.gif Буду пробовать это реализовать!