Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Удалить из слова вхождения первой буквы


Автор: Hardip 29.11.2010, 22:31
Прошу помощи в решении следующей задачи: В тексте, от 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.

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

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

Я прошу помощи, как это делается. Я же не прошу написать весь код. А пояснить и заменить нужное.

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

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

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

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

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

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

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

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

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

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

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

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

Автор: 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;


Автор: Hardip 30.11.2010, 12:14
Цитата(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 Ваш код проверяет результат - если [] встречается то делает, а если нет, то берёт свой символ по очереди и каждый раз проходит? В итоге я вывожу результат.

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

Код

  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);
....

(переписал так, чтобы под семеркой работало)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)