Помощь - Поиск - Пользователи - Календарь
Полная версия: чередование слов в строке
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
18192123
Даны две строки, состоящие из слов. Получить строку, в которой чередуются слова первой и второй строки. Если в одной из строк слов больше, чем в другой, то оставшиеся слова этой строки дописать подряд в строку-результат.

помогите пожалуйста с алгоритмом чередования слов

????????? wacko.gif
мисс_граффити
разбиваешь на слова, получаешь 2 массива. потом из каждого берешь по одному слову-элементу и записываешь в результирующую строку, пока в одном не закончатся элементы.
klem4
Можно и без дополнительной строки rolleyes.gif
volvo
18192123, чем могут разделяться слова в строках?
мисс_граффити
Цитата(klem4 @ 20.12.2006 19:32) *

Можно и без дополнительной строки rolleyes.gif

то есть? я где-то сказала, что у нас будет три строки?
результирующей может выступать и одна из исходных...
просто воспользовалась терминологией задачи:
Цитата
Даны две строки, состоящие из слов. Получить строку, в которой чередуются слова первой и второй строки. Если в одной из строк слов больше, чем в другой, то оставшиеся слова этой строки дописать подряд в строку-результат.


или ты о каком-то принципиально ином способе решения?
volvo
Юля, я как раз о принципиально ином способе - без массивов... smile.gif Только мне для этого надо знать, могут ли слова разделяться чем-то кроме пробелов, или нет...
мисс_граффити
Цитата(volvo @ 20.12.2006 19:55) *

Юля, я как раз о принципиально ином способе - без массивов... smile.gif Только мне для этого надо знать, могут ли слова разделяться чем-то кроме пробелов, или нет...

Да я после таких вопросов ничего, кроме оригинально-интересного способа и не жду.
Кажется, даже есть подозрение: вырезать слова из одной строки (в смысле, копировать и удалять), и вставлять на место пробела (если только пробелы - разделители) во вторую?
klem4
Цитата
вырезать слова из одной строки (в смысле, копировать и удалять), и вставлять на место пробела (если только пробелы - разделители) во вторую?


Я вот это и имел в виду (только удалять правда не обязательно) под своим вариантом без третьей строки, а ты как хотела сдалать ?
18192123
слова могут разделяться только пробелом. А как решать мою задачу без массивов?
Кстати, нужно без copy, delete.
мисс_граффити
Цитата(klem4 @ 20.12.2006 20:12) *

Я вот это и имел в виду (только удалять правда не обязательно) под своим вариантом без третьей строки, а ты как хотела сдалать ?

просто после того, как мы раскидали слова по массивам, нам не нужны старые строки, поэтому можем записывать в одну из них.
klem4
Эм, ну массивы в принципе тоже не нужны smile.gif

Ладно ждем что скажет автор темы smile.gif

Упс автор уже сказал smile.gif
мисс_граффити
без copy и delete хуже sad.gif
insert можно?
18192123
Цитата(мисс_граффити @ 20.12.2006 20:34) *

без copy и delete хуже sad.gif
insert можно?

увы, нельзя...
мисс_граффити
можно еще так: заводим новую строку, посимвольно прибавляем к ней слово первой строки, пока не наткнемся на пробел (или не кончится строка). после этого посимвольно копируем кусочек второй... если первая не кончилась - возвращаемся к ней...
volvo
Цитата(18192123 @ 20.12.2006 19:18) *
Кстати, нужно без copy, delete.

В принципе, не очень-то и хотелось smile.gif

Вполне реально обойтись БЕЗ них...

var
  s, T, s1, s2: string;
  i, j: integer;
  res: string;

  did_it: boolean;
  b: boolean;

begin
  s1 := 'one two three four five';
  { s2 := 'raz dva tri chetire pyat shest sem'; }
  s2 := 'raz dva tri';
  res := '';

  s := s1;
  T := s2 + ' ';

  i := 1; j := 1;
  did_it := false;
  repeat

    for b := false to true do
      while (i <= length(s)) and ((s[i] = ' ') = b) do begin
        res := res + s[i]; inc(i);
      end;

    if (i > length(s)) then begin
      if not did_it then begin
        res := res + ' '; 
        did_it := true;
      end;
    end;

    for b := false to true do
      while (j <= length(T)) and ((T[j] = ' ') = b) do begin
        res := res + T[j]; inc(j);
      end;

  until (i > length(s)) and (j > length(T));
  writeln('result = ', res);

end.
(дополнительные строки - только для того, чтобы НЕ портить исходные... Так было бы достаточно трех строк)
18192123
Цитата(volvo @ 20.12.2006 20:59) *



var
  s, T, s1, s2: string;
  i, j: integer;
  res: string;

  did_it: boolean;
  b: boolean;

begin
  s1 := 'one two three four five';
  { s2 := 'raz dva tri chetire pyat shest sem'; }
  s2 := 'raz dva tri';
  res := '';

  s := s1;
  T := s2 + ' ';

  i := 1; j := 1;
  did_it := false;
  repeat

    for b := false to true do
      while (i <= length(s)) and ((s[i] = ' ') = b) do begin
        res := res + s[i]; inc(i);
      end;

    if (i > length(s)) then begin
      if not did_it then begin
        res := res + ' '; 
        did_it := true;
      end;
    end;

    for b := false to true do
      while (j <= length(T)) and ((T[j] = ' ') = b) do begin
        res := res + T[j]; inc(j);
      end;

  until (i > length(s)) and (j > length(T));
  writeln('result = ', res);

end.




Объясни пожалуйста некоторые моменты:

for b := false to true do


Для чего эта операция? И за что отвечают b и did_it ?
volvo
А тебе что, удобнее делать Copy+Paste? Сначала - обрабатывать НЕпробелы, а потом - пробелы между словами? Тогда делай Copy+Paste... Я предпочитаю сделать один доп. цикл: сначала переменная B равна False, благодаря чему (s[i] = ' ') = b выполняется для НЕпробелов, при втором проходе B становится равно True, и в ЭТОМ ЖЕ цикле обрабатываются только пробелы между словами...

А did_it - дополнительная переменная, чобы не потерять нужный пробел между словами, и в то же время не добавлять лишние пробелы... Попробуй, убери ее, увидишь, что будет...
18192123
Я не поняла, за счёт чего чередуются слова, ведь у нас в цикле repeat два цикла, отдельно по каждой строке

???
volvo
Цитата
за счёт чего чередуются слова, ведь у нас в цикле repeat два цикла, отдельно по каждой строке
Угу... Вот именно за счет этих двух циклов и чередуются... Ты не заметила, что циклы вызываются последовательно для двух строк (для первой - для второй, потом срабатывает Repeat/Until, опять, для первой - для второй)... Вот тебе и чередование.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.