Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

копирование нестандартной длины строки [D6, Win95/98, WinXP]


Страницы:   1 2 3

Yurij-7 ©   (2005-02-23 16:44:00) 

Господа прошу помочь в следующей ситуации:
есть строка вида : "обороты 2180."
как из нее вытянуть только числовую векличину, в данном случае 2180, но может быть и 3 числа в конце строки.
Спасибо.


olookin   (2005-02-23 18:30:00) [1]

[50] Юрий Зотов ©   (23.02.05 18:28)

Да, это убедительно...


Юрий Зотов   (2005-02-23 18:28:00) [2]

> olookin ©   (23.02.05 18:19) [46]

Для простоты возьмем множество, состоящее не более, чем из 32 элементов. Поскольку элементы множества всегда упорядочены, то каждому из них можно сопоставить двоичный разряд 32-битного числа. Тогда вхождение элемента во множество можно отмечать единицей в соответствующем ему разряде, а отсутствие - нулем. И проверка вхождения элемента сведется к одноразому AND, без всяких циклов.

Почти то же самое происходит и в реальности. Никаких циклов.


Юрий Зотов   (2005-02-23 18:28:00) [3]

> olookin ©   (23.02.05 18:19) [46]

Для простоты возьмем множество, состоящее не более, чем из 32 элементов. Поскольку элементы множества всегда упорядочены, то каждому из них можно сопоставить двоичный разряд 32-битного числа. Тогда вхождение элемента во множество можно отмечать единицей в соответствующем ему разряде, а отсутствие - нулем. И проверка вхождения элемента сведется к одноразому AND, без всяких циклов.

Почти то же самое происходит и в реальности. Никаких циклов.


olookin   (2005-02-23 18:25:00) [4]

[47] begin...end ©   (23.02.05 18:24)

Внушительное различие. Складаю оружие и признаю Вашу правоту...


begin...end   (2005-02-23 18:24:00) [5]

> olookin ©   (23.02.05 18:18) [45]

Pentium 3, 533 МГц (только не смейтесь).

1. SymbolsCount = 100000: Count1 = 3953, Count2 = 3953, множество: 10 мс; Pos: 110 мс.

2. SymbolsCount = 1000000: Count1 = 39218, Count2 = 39218, множество: 10 мс; Pos: 1031 мс.


olookin   (2005-02-23 18:19:00) [6]

[44] Юрий Зотов ©   (23.02.05 18:18)

Good а как?


olookin   (2005-02-23 18:18:00) [7]

[43] begin...end ©   (23.02.05 18:13)

Да я не сомневаюсь. Насчет теста QueryPerformanceCounter - я тест этой функции делал с секундомером в руках. Что уж совсем по идиотски звучит...

А насколько различно по времени выполнение Ваших двух тестов (множество vs Pos)? Ну чтоб мне не пробовать....


Юрий Зотов   (2005-02-23 18:18:00) [8]

> olookin ©   (23.02.05 18:04) [39]

Все не так.


begin...end   (2005-02-23 18:13:00) [9]

> olookin ©   (23.02.05 18:11) [42]

Не думаю, что GetTickCount может в данном случае дать ошибку в 100 раз и более. Но если сомневаетесь - используйте QueryPerformanceCounter и сообщите, пожалуйста, о результатах.


olookin   (2005-02-23 18:11:00) [10]

[40] begin...end ©   (23.02.05 18:07)

Может я и ошибаюсь, но GetTickCount не является точным методом определения времени выполнения КОНКРЕТНОЙ задачи. Может, лучше использовать QueryPerformanceFrequency/QueryPerformanceCounter?


Palladin   (2005-02-23 18:07:00) [11]

обойдешься всего лишь одним оператором IN


begin...end   (2005-02-23 18:07:00) [12]

> olookin ©   (23.02.05 17:54) [32]

Убыстряет.

const
 SymbolsCount = 100000;
 DecimalSymbols = '0123456789';
var
 I: Integer;
 S: string;
 T1, T2, Count1, Count2: Cardinal;
begin
 // Заполнение строки
 SetLength(S, SymbolsCount);
 Randomize;
 for I := 1 to SymbolsCount do
   S[I] := Chr(Random(255));
 // Тест с множеством
 Count1 := 0;
 T1 := GetTickCount;
 for I := 1 to Length(S) do
   if S[I] in ['0'..'9'] then
     Inc(Count1);
 T1 := GetTickCount - T1;
 // Тест с Pos
 Count2 := 0;
 T2 := GetTickCount;
 for I := 1 to Length(S) do
   if Pos(S[I], DecimalSymbols) > 0 then
     Inc(Count2);
 T2 := GetTickCount - T2;
 ShowMessageFmt('Count1 = %d, Count2 = %d, множество: %d мс; Pos: %d мс', [Count1, Count2, T1, T2])
end.


olookin   (2005-02-23 18:04:00) [13]

[38] Юрий Зотов ©   (23.02.05 18:02)

А реально? Согласитесь, что простым AND я не обойдусь, пытаясь выяснить вхождение элемента в множество. Надо так или иначе перебирать все эелемнты этого множества и проверять их на соответствие элементу. Тот же цикл.


Юрий Зотов   (2005-02-23 18:02:00) [14]

> olookin ©   (23.02.05 17:57) [35]

Отличается принципиально.

Проверка вхождения символа в строку - это цикл.
Проверка вхождения элемента во множество - близко к обыкновенному AND.


olookin   (2005-02-23 18:01:00) [15]

[36] Antonn ©   (23.02.05 17:58)

Знаем. Инчае что мы вообще обрабатываем? Неизвестного формата данные?


Antonn   (2005-02-23 17:58:00) [16]

olookin ©   (23.02.05 17:56) [34]
но мы же не знаем какой сепаратор в тексте. Или знаем?


olookin   (2005-02-23 17:57:00) [17]

[33] Юрий Зотов ©   (23.02.05 17:56)

Вот как? Почему? Есть множество из 10 элементов и строка из 10 символов. Неужели механизм сравнения для них отличается?


Юрий Зотов   (2005-02-23 17:56:00) [18]

> olookin ©   (23.02.05 17:54) [32]

В сотни раз. Если не в сотни тысяч раз.


olookin   (2005-02-23 17:56:00) [19]

[31] Antonn ©   (23.02.05 17:54)

Нет, DecimalSeparator задается перед вызовом функции. Просто при конвертации строки будет считаться валидным сепаратором именно тот, что задан DecimalSeparator. Например, если есть строка "0,1235", а DecimalSeparator равен ".", то при вызове StrToFloat возникнет ошибка. А если перед этим установить DEcimalSeparator:=',', то ошибки не будет.


Antonn   (2005-02-23 17:54:00) [20]

olookin ©   (23.02.05 17:49) [27]
А при конвертации строки сепаратором является тот, которрый указан в DecimalSeparator. Так что разделителем может быть хоть символ "%"... Лишь бы это было учтено...

значит нужно еще прогнать строку и назначить сепаратор? А не накладно-ли?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо