Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];

Вниз

И таки опять поиск необходимых слов в строке.   Найти похожие ветки 

 
Sholah_Weras ©   (2007-01-06 19:52) [0]

Здравствуйте!
Собственно вопрос задан еще в теме сообщения.
Заранее благодарен.


 
Джо ©   (2007-01-06 19:54) [1]

Pos, PosEx.


 
kaZaNoVa ©   (2007-01-06 20:17) [2]

program Project1; //Прога поиска подстроки в строках и с исключениями.
uses SysUtils, windows;
const
 fVvod = "log.txt";
 fSearch = "Search.txt";
 fResult_y = "Result_yes.txt";
 fResult_n = "Result_not.txt";
var
 f_inData, f_Search, f_Result_y, f_Result_n: textfile;
 a: array[1..70000] of string;
 info: string; l, k, n, h, p: int64;
{$R *.res}

function CompareSearch: Boolean;
var f: integer;
begin
 Result := True;

 for f := 1 to l do if pos(ansilowercase(a[f]), ansilowercase(info)) > 0 then exit;

 Result := False;
end;

begin
 if not (FileExists(fVvod) and FileExists(fSearch)) then
 begin
   MessageBox(0, "Нет файлов ввода данных"#13#10#13#10 + fVvod + #13#10 + fSearch, "Ошибка работа программы невозможна", 0);
   Halt(1);
 end;

 p := gettickcount;
 QueryPerformanceFrequency(h); // HiTicks / second
 QueryPerformanceCounter(k);

 AssignFile(f_inData, fVvod);
 AssignFile(f_Search, fSearch);
 AssignFile(f_Result_y, fResult_y);
 AssignFile(f_Result_n, fResult_n);

 Reset(f_Search);

 l := 0;
 while (not eof(f_Search)) do begin
   inc(l);
   Readln(f_Search, a[l]);
 end;
 CloseFile(f_Search);

 Reset(f_inData);
 ReWrite(f_Result_y);
 ReWrite(f_Result_n);

 while (not eof(f_inData)) do begin
   Readln(f_inData, info);
   if CompareSearch then Writeln(f_Result_y, info) else Writeln(f_Result_n, info);
 end; //info

 CloseFile(f_inData);

 CloseFile(f_Result_y);
 CloseFile(f_Result_n);

 QueryPerformanceCounter(n);
 MessageBox(0, "Готово", Pchar(Inttostr(gettickcount - p) + " ms    (" + (Inttostr(round(1000000 * (n - k) / h))) + ") microsec"), 0);
end.



 
Sholah_Weras ©   (2007-01-06 20:22) [3]

Спасибо


 
MsGuns ©   (2007-01-06 20:26) [4]

>kaZaNoVa ©   (06.01.07 20:17) [2]

Сколько можно публиковать это страховище ?


 
kaZaNoVa ©   (2007-01-06 20:37) [5]

MsGuns ©   (06.01.07 20:26) [4]
покажите хоть одну ошибку в примере:)
либодайте Свой вариант!


 
MsGuns ©   (2007-01-06 20:55) [6]

Начиная с первых же строк

const
fVvod = "log.txt";
fSearch = "Search.txt";
fResult_y = "Result_yes.txt";
fResult_n = "Result_not.txt";


и далее..

Теперь объясните практическую ценность этого кода


 
kaZaNoVa ©   (2007-01-06 21:23) [7]

MsGuns ©   (06.01.07 20:55) [6]
Теперь объясните практическую ценность этого кода

очень удобная прога, если не нравится, напишите аналог)
все, игнор)


 
MsGuns ©   (2007-01-06 21:28) [8]

Очень поучительно.
Образчик "капустной" обертки пуговицы до размеров пальта ;))

Куча кода, суть всех действий которого - одна разъединственная Pos ;))

 Прям код Да Винчи ;)

ЗЫ. Я бы вообще не влазил, если бы не Ваше стремление к публикации собственных "изобретений". Решение Ваше коряво, узкоспециально и неинформативно для другого программиста.  

ЗАЧЕМ БЫЛО ЕГО ПУБЛИКОВАТЬ ?

Да еще и не единожды


 
palva ©   (2007-01-06 23:02) [9]

> Сколько можно публиковать это страховище ?

Могу предложить своё страховище. Моя задача была дать программистам, привыкшим к бейсиковским функциям InStr и InStrRev, использовать их на делфи. Если выкинуть пространные коментарии, а также не делать проверку параметров, то получится очень небольшой код, который сводится к использованию стандартной функции SearchBuf.
Но я привожу полный текст юнита, из которого я выкинул реализацию кучи других вещей, не онтносящихся к сабжу.

unit Unit1;

interface

const
 vbBinaryCompare = 0;
 vbTextCompare = 1;

{
The InStr function returns the position of the first occurrence
of one string within another string.
}
function InStr(const Str, Pat: String;
              Scmp: Integer = vbBinaryCompare): Integer; overload;
function InStr(Strt: Integer; const Str, Pat: String;
              Scmp: Integer = vbBinaryCompare): Integer; overload;
{
Parameter Description:
Strt - Optional. Specifies the starting position for each search.
The search begins at the first character position by default.
Str - The string to be searched
Pat - The string expression to search for
Scmp Optional. - Specifies the string comparison to use. Default is 0
Can have one of the following values:
0 = vbBinaryCompare - Perform a binary comparison
1 = vbTextCompare - Perform a textual comparison

The InStr function can return the following values:

If Str is "" - InStr returns 0
If Pat is "" - InStr returns start
If Pat is not found - InStr returns 0
If Pat is found within Str - InStr returns the position at
which match is found.
If start > Length(Str) - InStr returns 0

The InStrRev function returns the position of the first occurrence
of one string within another string. The search begins from the end of string,
but the position returned counts from the beginning of the string.

The InStrRev function can return the following values:
}

function InStrRev(const Str, Pat: String; Strt: Integer = -1;
          Scmp: Integer = vbBinaryCompare): Integer;

{
Parameter Description
Str - The string to be searched
Pat - The string expression to search for
Strt Optional. - Specifies the starting position for each search.
The search begins at the last character position by default (-1)
Scmp Optional. - Specifies the string comparison to use. Default is 0
Can have one of the following values:
0 = vbBinaryCompare - Perform a binary comparison
1 = vbTextCompare - Perform a textual comparison

If Str is "" - InStrRev returns 0
If Pat is "" - InStrRev returns start
If Pat is not found - InStrRev returns 0
If Pat is found within Str - InStrRev returns the position at which match
is found
If Strt > Length(Str) - InStrRev returns 0
}

implementation

uses SysUtils, StrUtils;

function InStr(const Str, Pat: String;
              Scmp: Integer = 0): Integer; overload;
begin
 Result := InStr(1, Str, Pat, Scmp);
end;

function InStr(Strt: Integer; const Str, Pat: String;
              Scmp: Integer = vbBinaryCompare): Integer; overload;
var
 Len, LenP: Integer;
 P: PChar;
 so: TStringSearchOptions;
begin
 if Strt <= 0 then raise Exception.Create("Wrong InStr parameter");
 Len := Length(Str);
 LenP := Length(Pat);
 if (Strt > Len) or (Len = 0) or (LenP > Len) then
   Result := 0
 else if LenP = 0 then
   Result := Strt
 else begin
   so := [soDown];
   if Scmp = vbBinaryCompare then
     so := [soDown, soMatchCase];
   P := SearchBuf(PChar(Str), Len, Strt - 1, 0, Pat, so);
   if P = Nil then
     Result := 0
   else
     Result := P - @Str[1] + 1;
 end;
end;

function InStrRev(const Str, Pat: String; Strt: Integer = -1;
          Scmp: Integer = vbBinaryCompare): Integer;
var
 Len, LenP: Integer;
 P: PChar;
 so: TStringSearchOptions;
begin
 Len := Length(Str);
 LenP := Length(Pat);
 if Strt = -1 then Strt := Len;
 if (Len = 0) Or (Strt > Len) Or (LenP > Len) then
   Result := 0
 else if LenP = 0 then
   Result := Strt
 else begin
   if Strt <=0 then raise Exception.Create("Wrong InStrRev parameter");
   so := [];
   if Scmp = vbBinaryCompare then
     so := [soMatchCase];
   P := SearchBuf(PChar(Str), Len, Strt, 0, Pat, so);
   if P = Nil then
     Result := 0
   else
     Result := P - @Str[1] + 1;
 end;
end;

end.

Пример использования:

{$APPTYPE CONSOLE}
uses Unit1;
var
 s: String;
 i1, i2: Integer;
begin
 s := "--- <* === -123- === *> ---";
 i1 := InStr(s, "<*");
 i1 := InStr(i1, s, "-");
 i2 := InStrRev(s, "*>");
 i2 := InStrRev(s, "-", i2);
 WriteLn(Copy(s, i1 + 1, i2 - i1 - 1)); // 123
 ReadLn
end.


 
MsGuns ©   (2007-01-06 23:44) [10]

>palva ©   (06.01.07 23:02) [9]

И к чему это ?
У тебя, по крайней мере, универсально сделано. Хотя, если честно, я так и не понял, нафиг нужны эти функции, но тебе из погреба виднее ;)))


 
Sha ©   (2007-01-07 01:48) [11]

> И таки опять поиск необходимых слов в строке.
> Sholah_Weras ©   (06.01.07 19:52)  

Что в строке искать надо: слова или слово?
Это разные задачи.


 
palva ©   (2007-01-07 11:27) [12]

> Хотя, если честно, я так и не понял, нафиг нужны эти функции
А я разве не написал, зачем они были нужны?
Кроме того в делфи нет функций, которые ищут в строке подстроку в обратном направлении, да еще без учета регистра. Или, возможно, я не нашел таких функций.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.046 c
4-1158393826
KilkennyCat
2006-09-16 12:03
2007.01.28
Признак сетевого или локального файла


15-1168429117
Post_
2007-01-10 14:38
2007.01.28
Шфрование...


2-1168433997
NovaC
2007-01-10 15:59
2007.01.28
WinToDos &amp; CopyFile


1-1165419214
MJShvedov
2006-12-06 18:33
2007.01.28
Как можно определить параметр ячейки DrawGrid?


1-1164973182
LexusU
2006-12-01 14:39
2007.01.28
Подключение DLL написаной на VC++ в проекте Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский