Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удалить из слова вхождения первой буквы 
:(
    Опции темы
Hardip
Дата 29.11.2010, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 24.8.2010

Репутация: нет
Всего: нет



Прошу помощи в решении следующей задачи: В тексте, от 2х до 30 слов (в них от 2х до 10 букв), после последнего слова точка. Нужно напечатать все слова отличные от последнего, предварительно преобразовав их, удаляя  из  слова  все  последующие вхождения первой буквы. Прошу помощи на pascal-e. Я вот нашёл, когда первая буква текста становится последней, а вот как проверить что эта буква уже была и удалить последующие?
Код

uses
  SysUtils;

var s,s1,s2:string;
i,k:integer;
function ResBuk(a:string):string;{функция перестановки букв}
begin
insert(a[1],a,length(a)+1);{вставляем первую букву в конец}
delete(a,1,1); {удаляем первую букву}
ResBuk:=a;
end;
begin
write('s: ');readln(s);
insert(' ',s,pos('.',s)); {вставляем пробел перед точкой для удобства}
while pos('  ',s)>0 do delete(s,pos('  ',s),1);{удаляем лишние пробелы}
for i:=pos('.',s)-2 downto 1 do {ищем предпоследний перед точкой пробел}
if s[i]=' ' then
    begin
      k:=i; {запоминаем его позицию}
      break;
    end;
s1:=copy(s,k+1,pos('.',s)-k-2); {запоминаем последнее слово}
while (pos(' ',s)>0)and(s[i]<>'.') do {пока есть пробелы и не точка}
      begin
         s2:=copy(s,1,pos(' ',s)-1); {читаем очередное слово}
         if s2<>s1 then writeln(ResBuk(s2)); {если не равно последнаму, выводим в измененном виде}
         delete(s,1,pos(' ',s)); {удаляем прочитанное слово с пробелом}
     end;
readln
end.


Это сообщение отредактировал(а) Hardip - 29.11.2010, 23:10
PM MAIL   Вверх
kami
Дата 29.11.2010, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Лучше бы пример написал, что-то вроде:
Исходный текст: "сорок тысяч обезьян <censored>"
На выходе должно быть: "....."
PM MAIL WWW   Вверх
Hardip
Дата 29.11.2010, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 24.8.2010

Репутация: нет
Всего: нет



Цитата(kami @ 29.11.2010,  22:43)
Лучше бы пример написал, что-то вроде:
Исходный текст: "сорок тысяч обезьян <censored>"
На выходе должно быть: "....."

Я прошу помощи, как это делается. Я же не прошу написать весь код. А пояснить и заменить нужное.
PM MAIL   Вверх
Keeper89
Дата 29.11.2010, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Hardip, 
kami, говорит, что для понимания и, соответственно, помощи лучше было бы привести пример - что на входе, что на выходе.

Добавлено через 1 минуту и 22 секунды
Я присоединяюсь =)


--------------------
PM MAIL WWW   Вверх
kami
Дата 30.11.2010, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Цитата(Hardip @  29.11.2010,  23:13 Найти цитируемый пост)
Я прошу помощи, как это делается.

Да в том то и дело, что описание задачи несколько туманно.
Согласен, что я задал входной текст ...ээ... некрасивый, просто из всех текстов в голову пришло это слегка некультурное двустишие.
А вот что на выходе должно получиться - я, если честно, не понял.

Цитата(Hardip @  29.11.2010,  22:31 Найти цитируемый пост)
напечатать все слова отличные от последнего

Это понятно, но относительно. Как сравниваем? С учетом регистра (заглавные/строчные) или без него?

Цитата(Hardip @  29.11.2010,  22:31 Найти цитируемый пост)
предварительно преобразовав их, удаляя  из  слова(1) все последующие вхождения первой буквы(2).

А вот это - непонятно. 
(1) Из какого слова? Текущего или последнего? 
(2) Первой буквы чего - текущего слова, или последнего? Сравнивать с "последним словом" до удаления букв или после?

Посему - лучше примером smile

Это сообщение отредактировал(а) kami - 30.11.2010, 00:16
PM MAIL WWW   Вверх
Hardip
Дата 30.11.2010, 06:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 24.8.2010

Репутация: нет
Всего: нет



Цитата(kami @  30.11.2010,  00:15 Найти цитируемый пост)
Это понятно, но относительно. Как сравниваем? С учетом регистра (заглавные/строчные) или без него?

Сравнивать нужно без учёта регистра. 
Цитата(kami @  30.11.2010,  00:15 Найти цитируемый пост)
А вот это - непонятно. (1) Из какого слова? Текущего или последнего? (2) Первой буквы чего - текущего слова, или последнего? Сравнивать с "последним словом" до удаления букв или после?

Даю пример - была строка без кавычек "привет меня зовут меняеее зовутоо привет кааша приветпп привет." - должно получиться - "меня зовут меняе зовут каш привет "

PM MAIL   Вверх
CROTishka
Дата 30.11.2010, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 30.7.2009

Репутация: нет
Всего: 2



Код

var
  str: string;
  AlreadyMeeted: set of char;
  tmpChr: char;
begin
  Result := '';
  AlreadyMeeted := [];
  for tmpChr in str do
    if tmpChr = ' ' then
      begin
        Result := Result + tmpChr;
        AlreadyMeeted := [];
      end
    else
      if not (tmpChr in AlreadyMeeted) then
        begin
          Result := Result + tmpChr;
          AlreadyMeeted := AlreadyMeeted + [tmpChr];
        end;
end;



Это сообщение отредактировал(а) CROTishka - 1.12.2010, 16:15
PM MAIL   Вверх
Hardip
Дата 30.11.2010, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 24.8.2010

Репутация: нет
Всего: нет



Цитата(CROTishka @ 30.11.2010,  11:30)
Код

var
  str: string;
  AlreadyMeeted: set of char;
  tmpChr: char;
begin
  Result := '';
  AlreadyMeeted := [];
  for tmpChr in str do
    if tmpChr = '' then
      begin
        Result := Result + tmpChr;
        AlreadyMeeted := [];
      end
    else
      if not (tmpChr in AlreadyMeeted) then
        begin
          Result := Result + tmpChr;
          AlreadyMeeted := AlreadyMeeted + [tmpChr];
        end;
end;


Спасибо! Вот делаю так
Код

var s,s1,s2:string;
i,k:integer;
str: string;
Result: string;
AlreadyMeeted: set of char;
tmpChr: char;

begin
write('s: ');readln(s);
insert(' ',s,pos('.',s)); {вставляем пробел перед точкой для удобства}
while pos('  ',s)>0 do delete(s,pos('  ',s),1);{удаляем лишние пробелы}
for i:=pos('.',s)-2 downto 1 do {ищем предпоследний перед точкой пробел}
if s[i]=' ' then
    begin
      k:=i; {запоминаем его позицию}
      break;
    end;
s1:=copy(s,k+1,pos('.',s)-k-2); {запоминаем последнее слово}
while (pos(' ',s)>0)and(s[i]<>'.') do {пока есть пробелы и не точка}
      begin
         s2:=copy(s,1,pos(' ',s)-1); {читаем очередное слово}

         Result := ' ';
      AlreadyMeeted := [];
     for tmpChr in s2 do
    if tmpChr = '' then
       begin
        Result := Result + tmpChr;
        AlreadyMeeted := [];
      end
    else
      if not (tmpChr in AlreadyMeeted) then
        begin
          Result := Result + tmpChr;
          AlreadyMeeted := AlreadyMeeted + [tmpChr];
         if s2<>s1 then writeln(Result); {если не равно последнаму, выводим в измененном виде}
         delete(s,1,pos(' ',s)); {удаляем прочитанное слово с пробелом}
     end;
      end;
readln
end.

Что же тут не так? smile Ваш код проверяет результат - если [] встречается то делает, а если нет, то берёт свой символ по очереди и каждый раз проходит? В итоге я вывожу результат.
PM MAIL   Вверх
CROTishka
Дата 1.12.2010, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 30.7.2009

Репутация: нет
Всего: 2



вырвете мне глаз, что вы творите, а?
я вам привел полный код того, что вы просите.
может так понятнее будет?:

Код

  function DeleteSecondChars(var AStr: string): string;
  var
    AlreadyMeeted: set of char;
    i: integer;
  begin
    Result := '';
    AlreadyMeeted := [];
    for i := 1 to Length(AStr) do
      if AStr[i] = ' ' then
        begin
          Result := Result + AStr[i];
          AlreadyMeeted := [];
        end
      else
        if not (AStr[i] in AlreadyMeeted) then
          begin
            Result := Result + AStr[i];
            AlreadyMeeted := AlreadyMeeted + [AStr[i]];
          end;
  end;
....
x := DeleteSecondChars(y);
....

(переписал так, чтобы под семеркой работало)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0523 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.