Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2014, 01:04   #1
Neostat
Пользователь
 
Регистрация: 19.10.2014
Сообщений: 49
По умолчанию Delphi,как поменять слова в array of char местами

Уважаемые форумчане,мне очень нужна ваша помощь.Буду честен, завтра у меня кр по программированию,где будут две задачи,одна на матрицу(знаю как решать) , другая на "array of char".

И в процессе подготовки к данной контрольной,я пробую решить задачу:
Текст состоит из слов,разделенных одним или несколькими пробелами.Поменять местами слова в тексте по следующему принцепу: первое- на последнее, второе - на предпоследнее и т.д.

Честное слово,никак не могу понять,как произвести обмен. Пытался производить обмен переменных,пока i-тый элемент массива равен нулю,а в случае если равен,то увеличивать i.
Пытался определять границы слова ,которое стоит в начале и слова которое стоит в конце,а потом менять их местами, но тоже ничего не вышло.

Возможно идеи ,приведенный выше -сущий бред.Но мне правда очен важно понять,как произвести обмен.Хотя бы словами алгоритм напишите пожалуйста,но конечно лучше процедурой или функцией.

Заранее огромнейшее спасибо.
Neostat вне форума Ответить с цитированием
Старый 25.12.2014, 01:19   #2
WinCoder
Заблокирован
 
Регистрация: 24.11.2014
Сообщений: 721
По умолчанию

Цитата:
Пытался определять границы слова ,которое стоит в начале и слова которое стоит в конце,а потом менять их местами, но тоже ничего не вышло.
Если разрешается использовать класс TStringList, то задача значительно упростится. Класс сам разобьёт строку на слова, и можно будет обращаться к каждому слову по его индексу.
WinCoder вне форума Ответить с цитированием
Старый 25.12.2014, 08:52   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Если разрешается использовать класс TStringList, то задача значительно упростится.
полностью согласен!

если же нет, тогда задача перестаёт быть тривиальной.
По сути, поменять два "слова" в массиве - это поменять местами две ГРУППЫ (последовательности) элементов массива, в общем случае РАЗЛИЧНОЙ длины.
для этого нужно найти индексы начала первой группы для переноса и индекс конца группы, потом нужно найти индексы начала и окончания второй группы и потом выполнить СЛОЖНУЮ процедуру по сдвигу остальных элементов массива в зависиомсти от разныцы размеров двух этих групп.

Если допустимо использовать обычную String, тогда можно решить задачу с использованием строковых функций (array of char элементарно скопировать в строку и строку -> array of char)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.12.2014, 08:55   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Непосредственно в исходном массиве менять крайне неудобно. Можно выгрузить из него все слова в стринговый массив слов, потасовать его как нужно и обратно в новом порядке слова выгрузить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.12.2014, 09:15   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Непосредственно в исходном массиве менять крайне неудобно.
Но если очень надо то можно за два прохода.
1. Переворачиваем весь массив без оглядки на слова.
теперь "слова" в нужном порядке, но вот ведь незадача они совершенно не те, а наоборотные(задом наперед).
2. выделяем "слова" и переворачиваем каждое "слово" в отдельности.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 25.12.2014, 09:47   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Но если очень надо то можно за два прохода.
1. Переворачиваем весь массив без оглядки на слова.
теперь "слова" в нужном порядке, но вот ведь незадача они совершенно не те, а наоборотные(задом наперед).
2. выделяем "слова" и переворачиваем каждое "слово" в отдельности.
Супер!!! просто, быстро и эффективно!
Мне такая идея даже в голову не пришла!
Респект!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.12.2014, 07:45   #7
Neostat
Пользователь
 
Регистрация: 19.10.2014
Сообщений: 49
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Но если очень надо то можно за два прохода.
1. Переворачиваем весь массив без оглядки на слова.
теперь "слова" в нужном порядке, но вот ведь незадача они совершенно не те, а наоборотные(задом наперед).
2. выделяем "слова" и переворачиваем каждое "слово" в отдельности.
Спасибо огромное)
Neostat вне форума Ответить с цитированием
Старый 29.12.2014, 11:50   #8
WinCoder
Заблокирован
 
Регистрация: 24.11.2014
Сообщений: 721
По умолчанию

Честно говоря такой метод ужасен. Переворачивать побуквенно один раз, потом второй... И в обоих разах нужен буферный char, чтоб заменяемый символ не затереть... Проще уж найти все разделители, и скопировать пословно весь текст в нужном порядке в новый массив. Это в том случае, если TStringList нельзя использовать (работа чисто с символами).
WinCoder вне форума Ответить с цитированием
Старый 29.12.2014, 12:10   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Честно говоря такой метод ужасен
Да что ты?
Код:
program Project1;
var s,s2:string;     i:integer;
begin
  s:='helo my world';
  for i:=Length(s) downto 1 do begin
    if s[i]<>' ' then s2:=s[i]+s2
    else begin write(s2,' '); s2:='';end;
  end;  write(s2,' ');
  readln;
end.
Действительно ужасен?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.12.2014, 12:21   #10
WinCoder
Заблокирован
 
Регистрация: 24.11.2014
Сообщений: 721
По умолчанию

Stilet А ни чего, что твой метод не соответствует описанному, и ты в итоге не переворачиваешь буквы в слове?
Цитата:
но вот ведь незадача они совершенно не те, а наоборотные(задом наперед).
Ты переверни слово
Цитата:
s2:=s2+s[i]
а потом допиши код, и спроси меня ещё раз. А то получается, что ты подставил под мои слова ДРУГОЕ решение.

Последний раз редактировалось WinCoder; 29.12.2014 в 12:23.
WinCoder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поменять местами слова в предложении (C++) Slicker Общие вопросы C/C++ 15 10.03.2011 10:17
поменять соседние слова местами alex(21) Общие вопросы C/C++ 3 20.02.2011 16:28
Поменять слова в строке местами fen1ksss Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 28.11.2010 22:25
поменять местами слова в предложении (C++) Slicker Помощь студентам 3 30.05.2009 17:57
как поменять местами слова в файле? r-tem Общие вопросы C/C++ 6 01.12.2008 22:17