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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2009, 17:27   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Оптимизация кода.

Код писал ночью. Работает. Но может что-то можно сильно укоротить или убыстрить.
P.S. Можете кинуть в меня камень за то, что писал без комментариев.
Код:
Procedure Stage2(CDir:ShortString); StdCall;
 Var
  F:TextFile;
  S:String;
  K,J,I:Integer;
  C:Integer;
  A:Array of String;
  T:Array of Byte;
  DDir:String;
  TS:ShortString;
  H:Boolean;
  SL:TStringList;
  L:ShortString;
  M:Integer;
 Begin
  AssignFile(F,CDir+'S2.txt');
  Reset(F);
  ReadLn(F,S);
  CloseFile(F);
  DeleteFile(CDir+'S2.txt');
  For I:=0 to 31 do
   While Pos(Chr(I),S)<>0 do
    Delete(S,Pos(Chr(I),S),1);
  For I:=33 to 191 do
   While Pos(Chr(I),S)<>0 do
    Delete(S,Pos(Chr(I),S),1);
  For I:=224 to 255 do
   While Pos(Chr(I),S)<>0 do
    Delete(S,Pos(Chr(I),S),1);
  C:=0;
  For I:=1 to Length(S) do
   If S[I]=' ' Then Inc(C);
   SetLength(A,C+1);
   S:=S+' ';
   I:=0;
  While S<>'' do
   Begin
    A[I]:=Copy(S,1,Pos(' ',S)-1);
    Delete(S,1,Pos(' ',S));
    Inc(I);
   End;
  SetLength(T,C+1);
  DDir:=CDir;
  Delete(DDir,Length(DDir)-5,6);
  DDir:=DDir+'WordData\Ending\';
  H:=False;
  For I:=0 to C do
   Begin
    For J:=1 to 3 do
     Begin
      For K:=3 downto 1 do
       Begin
        Case J of
         1:TS:='VRB';
         2:TS:='AJT';
         3:TS:='SBS';
        End;
        SL:=TStringList.Create;
        SL.LoadFromFile(DDir+TS+IntToStr(K)+'.aef');
        L:=Copy(A[I],Length(A[I])-K+1,K);
        For M:=0 to SL.Count-1 do
         If (SL.Strings[M]=L) And (Not(H)) Then
          Begin
           T[I]:=J;
           H:=True;
          End;
        SL.Free;
       End;
     End;
    If Not(H) Then T[I]:=0;
    H:=False;
   End;
  AssignFile(F,CDir+'S3.txt');
  Rewrite(F);
  For I:=0 to C do
   Begin
    Writeln(F,IntToStr(T[I])+' '+A[I]);
   End;
  CloseFile(F);
 End;
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 12.10.2009, 17:29   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

первый вопрос, а что он должен делать?

Код:
  For I:=0 to 31 do
   While Pos(Chr(I),S)<>0 do
    Delete(S,Pos(Chr(I),S),1);
  For I:=33 to 191 do
   While Pos(Chr(I),S)<>0 do
    Delete(S,Pos(Chr(I),S),1);
  For I:=224 to 255 do
   While Pos(Chr(I),S)<>0 do
    Delete(S,Pos(Chr(I),S),1);
это все я бы заменил одним циклом.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 12.10.2009 в 17:32.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.10.2009, 17:32   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Знач так: из S2.txt берем строку следующего вида:
Цитата:
НЕБО ГОЛУБОГО ЦВЕТА.
В папке ending находятся окончания.
Задача процедуры - определить типы слов. (сущ/прил/глаг) по окончаниям.

Я особо из-за
Код:
  For I:=0 to 31 do
   While Pos(Chr(I),S)<>0 do
    Delete(S,Pos(Chr(I),S),1);
  For I:=33 to 191 do
   While Pos(Chr(I),S)<>0 do
    Delete(S,Pos(Chr(I),S),1);
  For I:=224 to 255 do
   While Pos(Chr(I),S)<>0 do
    Delete(S,Pos(Chr(I),S),1);
волнуюсь. Больно эти строки мне не нравятся.
Здесь я убираю все буквы, кроме пробела и заглавных букв русского алфавита.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 12.10.2009, 17:43   #4
Izhic
Форумчанин
 
Аватар для Izhic
 
Регистрация: 08.10.2008
Сообщений: 668
По умолчанию

Востановил:
Цитата:
Пепел Феникса
Цитата:
Я В подобных случаях надо dec(i) или downto, иначе будет перепрыгивать, и может вылет произойти из программы.
неа там не будет пропуска...
Теперь будет:


Код:
for i:=length(s) downto 1 do
 if s[i] in [0..31,33..91,224,255] then 
   Delete(S,i,1);
Don't worry be happy

Последний раз редактировалось Izhic; 12.10.2009 в 17:49.
Izhic вне форума Ответить с цитированием
Старый 12.10.2009, 17:45   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я бы заменил так:
Код:
I:=0;
while I<=Length(S) do if (((#0>=S[I])and(S[I]<=#31))or((#33>=S[I])and(S[I]<=#191))or((#224>=S[I])and(S[I]<=#255))) then Delete(S,i,1) else inc(i);
примерно так

Цитата:
В подобных случаях надо dec(i) или downto, иначе будет перепрыгивать, и может вылет произойти из программы.
неа там не будет пропуска...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.10.2009, 17:45   #6
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
одним циклом.
Одним??? Там же выколотые точки.

Все, вижу
Что-то еще?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 12.10.2009 в 17:47.
Alex Cones вне форума Ответить с цитированием
Старый 12.10.2009, 17:51   #7
Izhic
Форумчанин
 
Аватар для Izhic
 
Регистрация: 08.10.2008
Сообщений: 668
По умолчанию

Цитата:
неа там не будет пропуска...
Будет, делай через downto.

------ушел думать ещё.......
Ну да не будет
Схема немного эмм другая +1
----------------
А если:
0.i=length;
1.delete(s[i]);
2.проверка несуществующего элемента? Будет вылет, точно не помню, последнее время на PHP
Don't worry be happy

Последний раз редактировалось Izhic; 12.10.2009 в 17:56.
Izhic вне форума Ответить с цитированием
Старый 12.10.2009, 17:59   #8
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Код:
for i:=length(s) downto 1 do
 if s[i] in [0..31,33..91,224,255] then 
   Delete(S,i,1);
Ну уже что-то по галантней. Но все-равно не нравится, потому, что оперируем в цикле с константой, от которой цикл зависит.

Ща попробую как-нибудь забацать.
Код:
I:=1;
While I<>Length(S)+1 do
 Begin
  If S[I] in [0..31,33..91,224,255] Then
   Delete(S,I,1);
   Inc(I);
 End;
Как-то так, наверное.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 12.10.2009 в 18:01.
Alex Cones вне форума Ответить с цитированием
Старый 12.10.2009, 18:05   #9
Izhic
Форумчанин
 
Аватар для Izhic
 
Регистрация: 08.10.2008
Сообщений: 668
По умолчанию

Я на скорую руку , оставьте Пепел Феникса варант , если действительно важна скорость... Вроде Bоrland не рекомендовал, хотя я могу не правильно понимать )))

Вот интересно он поэлементно сравнивает или преобразует в if условия какие нибудь нормальные... Так что так.
-------------------------
про последний элемент Error посмотрели? ПРи реализации Пепел Феникса способом...
-------------------------

Помешательство. Взбадриваю мозг Дельфёй

sql.ru/Forum/actualthread.aspx?tid=687718
строку в массив преобразовать, путём копирования памяти.
//даже вроде copy работает с памятью, хотя на этот счет не уверен.
Don't worry be happy

Последний раз редактировалось Izhic; 12.10.2009 в 18:20.
Izhic вне форума Ответить с цитированием
Старый 12.10.2009, 18:07   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
I:=1;//тут я не то написал тогда
While I<=Length(S) do
  If S[i] in [0..31,33..91,224..255] Then
   Delete(S,I,1) else inc(I);
тогда уж так...тогда точно не будет пропуска.
(лучше без лишних плюсов...ибо в асме то отличия будут...)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 12.10.2009 в 18:17.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация кода в си dampirik Помощь студентам 4 07.07.2009 11:30
Оптимизация кода nusik Общие вопросы Delphi 2 21.05.2009 17:55
Оптимизация кода Terran Общие вопросы Delphi 6 01.11.2008 16:57
Оптимизация кода [Smarik] Gamedev - cоздание игр: Unity, OpenGL, DirectX 9 20.08.2008 15:00
Оптимизация кода. MAKTECYMA Общие вопросы C/C++ 2 05.06.2008 16:48