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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.12.2011, 11:09   #1
skrino
Новичок
Джуниор
 
Регистрация: 24.12.2011
Сообщений: 1
По умолчанию с клавитуры водится срока,удалить из нее все звездочки.

с клавитуры водится срока,удалить из нее все звездочки.
помогите срочно!!!!
skrino вне форума Ответить с цитированием
Старый 24.12.2011, 11:53   #2
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Код:
while pos('*',s)<>0 do delete(s,pos('*',s),1);
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 24.12.2011, 12:00   #3
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Не рациональное решение, рациональнее так:
Код:
res := '';
for i := 1 to Length (s) do
  if s[i] <> '*' then res := res + s[i];
Arigato вне форума Ответить с цитированием
Старый 24.12.2011, 12:02   #4
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Цитата:
Не рациональное решение
зато у меня именно "удаление" а не
"получение новой строки без '*' " ) хотя черт его знает чего там у процедуры в "кишках")
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"

Последний раз редактировалось Mad_Cat; 24.12.2011 в 12:04.
Mad_Cat вне форума Ответить с цитированием
Старый 25.12.2011, 12:38   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Не рациональное решение
зато более эффективное! ваша программа будет проверять каждый символ.

А
Цитата:
Не рациональное решение
просто найдет *
З.Ы только единственное может на самом деле лучше в строку загонять. т.к. нужно будет удалить, потом сдвинуть массив, так что наверно лучше в строку
Poma][a вне форума Ответить с цитированием
Старый 25.12.2011, 14:42   #6
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Poma][a, а функция Pos, по вашему, каждый символ не проверяет.
Я поясню нерациональность:
1. Для каждого Pos циклом проходим от 1-го символа до искомого.
2. В коде 2 раза вызывается одна и та же Pos, т.е. число шагов умножаем на 2.
3. Delete для удаления символа производит посимвольный сдвиг строки влево.
Arigato вне форума Ответить с цитированием
Старый 25.12.2011, 16:00   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Poma][a, а функция Pos, по вашему, каждый символ не проверяет.
нет не проверяет! почти ВСЕ стандартные процедуры паскаль эффективнее решения в лоб (которое было представлено Вами).

Цитата:
В коде 2 раза вызывается одна и та же Pos, т.е. число шагов умножаем на 2.
Заметим это не мой код

Цитата:
Delete для удаления символа производит посимвольный сдвиг строки влево.
эта проблема тоже была рассмотрена в МОЕМ посте
Poma][a вне форума Ответить с цитированием
Старый 25.12.2011, 16:05   #8
Silverstone
Пользователь
 
Регистрация: 13.12.2011
Сообщений: 75
По умолчанию

Код:
for k:=1 to length(x)+1 do
   begin
      while x[1]='*' do
        delete(x,1,1);
   end;
Silverstone вне форума Ответить с цитированием
Старый 25.12.2011, 22:11   #9
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
нет не проверяет! почти ВСЕ стандартные процедуры паскаль эффективнее решения в лоб (которое было представлено Вами).
Давайте замерим:
Код:
const N = 10000;

var
  Str, s, res: string;
  T: Cardinal;
  I, j, p: Integer;

begin
  Str := '';
  for I := 1 to 2048 do
    if Random (5) = 0
      then Str := Str + '*'
      else Str := Str + Chr (32 + Random (95));
  WriteLn (Str);
  T := GetTickCount;
  for I := 1 to N do
  begin
    s := Str;

    {while pos('*',s)<>0 do delete(s,pos('*',s),1);{}

    {res := '';
      for j := 1 to Length (s) do
        if s[j] <> '*' then res := res + s[j];
    s := res;{}

    {repeat
      p := pos ('*', s);
      if p > 0 then delete (s, p, 1);
    until p = 0;{}

  end; {for}
  WriteLn;
  WriteLn (s);
  WriteLn;
  WriteLn ('Time: ', GetTickCount - T);
  ReadLn;
end.
Генерируется строка длинной в 2048 символов, проводится 10000 испытаний. Разкомментируем нужный блок и получим:
1. Решение Mad_Cat у меня отработало за 12484 миллисекунд.
2. Мое решение за 4579 миллисекунды.
3. Еще один вариант с одним вызовом pos (для чистоты эксперимента) за 7578 миллисекунд.

Делайте выводы о решении "в лоб"
Arigato вне форума Ответить с цитированием
Старый 26.12.2011, 16:32   #10
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

а если Randomize поставить?
Poma][a вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удалить все тэги serres PHP 4 29.03.2011 22:33
Удалить все данные из StringGrid-a postaveche Компоненты Delphi 7 14.01.2011 13:20
Удалить все гиперссылки из документа VistaSV30 Microsoft Office Word 2 01.04.2010 19:16
Как удалить все картинки bskjohn Microsoft Office Excel 3 19.02.2009 10:13