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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.12.2010, 10:38   #31
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

более менее можно так сделать ..
Код:
words: array[1..9] of string = (
    ' один ', ' два ', ' три ', ' четыре ', ' пять ', ' шесть ', ' семь ', ' восемь ', ' девять ');
Т.е. пробелы между словами.. Но при случае "один," тоже не прокатить...
goto ∞ вне форума Ответить с цитированием
Старый 24.12.2010, 10:58   #32
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

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

Тут простой разбор на слова (на форуме был десятки раз. Stilet даже патентовать свой способ хотел - настолько часто ему приходилось его цитировать... :D ) просто и эффективно решает данную проблему.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.12.2010, 14:03   #33
Лесная Эльфийка
Пользователь
 
Аватар для Лесная Эльфийка
 
Регистрация: 03.12.2010
Сообщений: 35
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение




ладно. вот примерно так:
Код:
program tt2;
const words: array[1..9] of string = (
    'один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять');
var s: string;
  i, j: integer;
  sOneDigit : string;
begin
  writeln('Введите строку: ');
  readln(s);
  for i := 1 to 9 do begin
    j := pos(words[i], s);
    while j > 0 do begin
      delete(s, j, length(words[i]));
      str(i,sOneDigit);
      insert(sOneDigit, s, j);
      j := pos(words[i], s);
    end;
  end;
  writeln('Результат: ', s);
  readln;
end.
кстати, будьте готовы ещё к таким мелким фичам/багам данного кода:
1) регистр слов проверяемых только маленький (Два Три ЧЕТЫРЕ - это, с точки зрения вышеприведённого кода - не цифры
Решение - надо перед проверкой переводить строку и проверяемое слово в один регистр.

2) если найденное словосочетание является частью слова - то оно всё равно заменяется
попробуйте: потри триод в подвале
поймёте, о чём я
решение-строку надо разбирать (программисты обычно употребяют термин - кальку с английсого - "парсить") на отдельные слова и их уже сравнивать со словами эталонами.

удачи на экзамене.
Благодарю ^_^""
Лесная Эльфийка вне форума Ответить с цитированием
Старый 24.12.2010, 14:13   #34
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Да тут можно даже не парсить. Если в I позиция очередного вхождения слова, достаточно проверить
если (((I=1) or (в позиции I-1 не буква)) and ((I+длина_слова-1=длине строки) or (в позиции I+длина_слова не буква))) то менять;
иначе искать очередное вхождение с позиции I+1

Последний раз редактировалось Son Of Pain; 24.12.2010 в 14:15.
Son Of Pain вне форума Ответить с цитированием
Старый 24.12.2010, 15:40   #35
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну раз уж тут меня упомнули, попробую влести свою непту:
На основании упоминавшегося Сержем кода, предлагаю финт ушами через правый рукав:
Код:
var
words: string = (
    'один  два   три   четырепять  шесть семь  восемьдевять');
 s:string; a:array[1..100] of string;
  i,k,count:integer;
begin   {$o-}
 s:=' hello один  my два friend';
 count:=1;
 i:=1; while (i<=length(s)) do begin
   if s[i]=' ' then begin
    k:=pos(s,words);
    if k<>0 then begin
     s:=copy(words,k mod 6,6);
    end;
    inc(count);inc(i);
   end;
   a[count]:=a[count]+s[i];
   inc(i);
 end;
 for k:=1 to i do write(trim(a[k])+' ');
 readln;
  { TODO -oUser -cConsole Main : Insert code here }
end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.12.2010, 16:13   #36
Лесная Эльфийка
Пользователь
 
Аватар для Лесная Эльфийка
 
Регистрация: 03.12.2010
Сообщений: 35
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну раз уж тут меня упомнули, попробую влести свою непту:
На основании упоминавшегося Сержем кода, предлагаю финт ушами через правый рукав:
Код:
var
words: string = (
    'один  два   три   четырепять  шесть семь  восемьдевять');
 s:string; a:array[1..100] of string;
  i,k,count:integer;
begin   {$o-}
 s:=' hello один  my два friend';
 count:=1;
 i:=1; while (i<=length(s)) do begin
   if s[i]=' ' then begin
    k:=pos(s,words);
    if k<>0 then begin
     s:=copy(words,k mod 6,6);
    end;
    inc(count);inc(i);
   end;
   a[count]:=a[count]+s[i];
   inc(i);
 end;
 for k:=1 to i do write(trim(a[k])+' ');
 readln;
  { TODO -oUser -cConsole Main : Insert code here }
end.
О__________О""
Лесная Эльфийка вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена слов на синонимы C++ LaDark Visual C++ 2 08.11.2010 19:01
замена слов в цыкле sergeiqwe PHP 3 08.06.2010 00:18
замена слов sergeiqwe PHP 2 05.05.2010 19:29
замена слов в MS Word polov Общие вопросы Delphi 4 09.10.2009 18:29
замена слов lekom Общие вопросы Delphi 7 27.09.2009 23:46