Solved

# counting substrings in a master-string

Posted on 1999-01-08
256 Views
Hi experts,

I need a routine that can search within a string.

This routine must count all occurrencies of a1,a2.....h7,h8 (=8x8=64 possibilities)
within a master-string.

For example: If the string to be examined is:

master:='Ka1, Lb4,Td4, Kf6, Bh7';

the routine I am searching for should return the value 5.

(a1,b4,d4,f6,h7 = 5 occurrencies within the masterstring)

Have you an idea how this could be done in Delphi 3.0 ?

With kind regards

Mathes

0
Question by:mathes
• 4
• 3
• 2
• +2

LVL 27

Expert Comment

hi mathes

try this

function CountContents(Source, Delimeter : String) : Integer;
var
s : String;
i : Integer;
begin
i := 0;
s := source;
while pos(Delimeter,s) > 0 do
begin
delete(s,pos(Delimeter,s),Length(delimeter));
inc(i);
end;
result := i + 1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
edit3.text := inttostr(Countcontents(edit1.text,edit2.text));
end;

meikl
0

LVL 8

Accepted Solution

ZifNab earned 30 total points
Hi mathes,

This is a solution :

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{\$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var i : char;
j : integer;
HandyStr : String;
Count : integer;
begin
Count := 0;
HandyStr := Edit1.Text;
for i := 'a' to 'h' do begin
for j := 1 to 8 do begin
while Pos(i+IntToStr(j), HandyStr) <> 0 do begin
Inc(Count);
Delete(HandyStr, Pos(i+IntToStr(j),HandyStr), Length(i+IntToStr(j)));
end;
end;
end;
showmessage('sum : '+InttoStr(Count));
end;

end.

Regards, Zif.
0

LVL 8

Expert Comment

This is probably even better, ... you can use several ways :

procedure TForm1.Button1Click(Sender: TObject);
var i : char;
j : integer;
HandyStr : String;
Count : integer;
begin
Count := 0;
HandyStr := Edit1.Text;
for i := 'a' to 'h' do begin
if Pos(i, HandyStr) <> 0 then begin
for j := 1 to 8 do begin
while Pos(i+IntToStr(j), HandyStr) <> 0 do begin
Inc(Count);
Delete(HandyStr, Pos(i+IntToStr(j),HandyStr), Length(i+IntToStr(j)));
end;
end;
end;
end;
showmessage('sum : '+InttoStr(Count));
end;
0

LVL 20

Expert Comment

Hi Mathes,

meikl's solution just count the strings that are splitted by a specific character. Perhaps this is good enough. I'm not sure, what you really need.
Is this string (it's for a chess program, right?) always in this format "Ka1, Lb2" or can there be more than one substring between two "," characters like this "Ka1 Lb2, Tc3"?

0

LVL 8

Expert Comment

oops, meikl, didn't saw your comment. Sorry. I didn't refreshed the thread before answering it... Terrible sorry.
0

LVL 5

Expert Comment

function FindAllOccurances(TheString: String): integer;
type
TAlphaSet = set of char;
TNumbSet = set of char;
var
I: integer;
TempString: String;
QueString: String[2];
TheAlphaSet: TAlphaSet;
TheNumbSet: TNumbSet;
begin
QueString := '';
Result := 0;
TheAlphaSet := ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
TheNumbSet := ['1', '2', '3', '4', '5', '6', '7', '8'];
TempString := LowerCase(TheString);
for I := length(TempString) downto 1 do
begin
QueString := TempString[I] + QueString;
if (QueString[1] in TheAlphaSet) and (QueString[2] in TheNumbSet) then
inc(Result);
end;
end;

Heath
0

LVL 5

Expert Comment

Oops, copied wrong version.  This was my final version

function FindAllOccurances(TheString: String): integer;
type
TAlphaSet = set of char;
TNumbSet = set of char;
var
I: integer;
QueString: String[2];
TheAlphaSet: TAlphaSet;
TheNumbSet: TNumbSet;
begin
QueString := '';
Result := 0;
TheAlphaSet := ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
TheNumbSet := ['1', '2', '3', '4', '5', '6', '7', '8'];
for I := length(TheString) downto 1 do
begin
QueString := TheString[I] + QueString;
if (QueString[1] in TheAlphaSet) and (QueString[2] in TheNumbSet) then
inc(Result);
end;
end;

Heath
0

LVL 5

Expert Comment

Mine is cuter.......... :) lol
0

LVL 5

Expert Comment

Trimmed some more - stupid error in logic

Oops, copied wrong version.  This was my final version

function FindAllOccurances(TheString: String): integer;
type
TCharSet = set of char;
var
I: integer;
QueString: String[2];
TheAlphaSet, TheNumbSet: TCharSet;
begin
QueString := '';
Result := 0;
TheAlphaSet := ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
TheNumbSet := ['1', '2', '3', '4', '5', '6', '7', '8'];
for I := length(TheString) downto 1 do
begin
QueString := TheString[I] + QueString;
if (QueString[1] in TheAlphaSet) and (QueString[2] in TheNumbSet) then
inc(Result);
end;
end;

Heath
0

Author Comment

Hi experts,

thank you all for your valuable ideas. Madshi is right to assume that my program has to do with chess.
I am currently writing a graphical user interface to a originally command line driven (arrrgghh, very
uncomfortable to handle...) chess program which can't play chess but solve chess problems. The normal
way to delimit the pieces are tabs or blanks: "Ka3 Qd4 Rb7". In some case sometimes the coordinates even
don't have a delimiter!!! The external chess program even understands an input like: Pa3d4f5, which is
identical with: Pa3 Pd4 Pf5. So in my case it is indeed the best solution to count the coordinates and
disregard the  characters preceeding the coordinates of the squares and identifying the concrete piece.
However I know that this method has a severe disadvantage: if there is a substring like "Xa1"
in the masterstring, the piececounter is incremented, too, although there is no piece which
has the specifier "X". But you can't have all in life. Unfortunately the chess program can
handle even very exotic pieces from Chinese chess and fairy chess, so it is not sufficient to
scan for (k,q,r,b,k,p) king,queen,rook,bishop,knight and pawn. But this is now a completely
different story...

With kind regards

Mathes
0

LVL 27

Expert Comment

no prob, zif

meikl

0

## Featured Post

Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
In this tutorial you'll learn about bandwidth monitoring with flows and packet sniffing with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're interested in additional methods for monitoring bandwidt…
This video demonstrates how to create an example email signature rule for a department in a company using CodeTwo Exchange Rules. The signature will be inserted beneath users' latest emails in conversations and will be displayed in users' Sent Items…