Совместимость коротких и длинных строк с символьным типом

В Delphi короткие и длинные строки совместимы с символьным типом. Это выражается в том, что отдельные элементы строк являются символами и могут употребляться в тех конструкциях Delphi, где используются значения символьного типа (Char). И наоборот, отдельным элементам длинных и коротких строк можно присваивать значения символьного типа.

Как уже указывалось выше данные строкового типа можно рассматривать как одномерные массивы. Т.е., чтобы обратиться к отдельному элементу строки, необходимо после идентификатора (имени) строковой переменной в квадратных скобках указать выражение целого типа. Значение этого выражения определяет порядковый номер элемента (символа) строки.

Пример 7: var Buf: ShortString;

C: char;

procedureTForm1.Button1Click(Sender: TObject);

Begin

Buf:='D lphi' ;

C:='A';

Buf[2]:='e';

Edit1.Text:=Buf;

Edit2.Text:= IntToStr(Ord(Buf[0]));

Buf[7]:=C;

Edit3.Text:=Buf;

Edit4.Text:= IntToStr(Ord(Buf[0]));

end;

Присваивание отдельным элементам строки не влияет на её длину. Поэтому в примере 7 (см. рис. 1) в компонент Edit1 выводится строка Delphi, в компонент Edit2 - число 6, в компонент Edit3 - снова Delphi, в компонент Edit4 - снова число 6.

Операции над данными строкового типа

Данные строкового типа можно:

1. Сравнивать, используя операции отношений (>, >=, <, ,<=, =, <>);

2. Выполнять операцию сцепления (конкатенации), которая обозначается знаком «+».

 

Рис. 1. Результат выполнения примера 7.

Пример 8: var Line:string;

procedureTForm1.Button1Click(Sender: TObject);

Begin

Line:=¢1234¢;

Line:= Line + ¢abc¢

Edit1.Text:= Line;

end;

В примере 8 в компонент Edit1 будет выведена строка символов ¢1234abc¢.

Остальные операции над данными строкового типа выполняются с помощью встроенных процедур и функций, приведённых в приложении.

Пример программирования с использованием данных строкового типа

Задание: Дана строка символов, Состоящая из слов. Слова разделены одним или несколькими пробелами или запятой. Сформировать новую строку, состоящую из слов, отличных от первого и повторяющихся более двух раз.

Схема алгоритма

Исходные данные: входная строка s1;

Выходные данные: выходная строка s2.

Схема алгоритма формирования выходной строки в соответствии с заданием приведена на рис. 2.

Рис. 2. Схема алгоритма формирования выходной строки.

Дополнительные переменные:

l - длина входной строки;

dl - количество слов во входной строке;

a - двумерный массив, состоящий из dl строк и двух столбцов; первый столбец содержит номер символа во входной строке, с которого начинается очередное слово, второй столбец - длину слова;

i - номер слова во входной строке;

ss1 - первое слово входной строки ;

sst - очередное слово входной строки;

m - количество повторений очередного слова во входной строке;

l1 - длина выходной строки.

Схема алгоритма подпрограммы Struct, формирующей массив а, содержащий информацию о местоположении и длине очередного слова во входной строке приведена на рис. 3.

Рис. 3. Схема алгоритма подпрограммы Struct.

Входные параметры:

s - строка символов;

l - длина строки;

Выходные параметры:

a - двумерный массив, содержащий информацию о структуре строки;

k - количество сток в массиве а (количество слов в строке s)

Дополнительные переменные:

c - счётчик количества символов в слове;

i - индекс элемента массива s (номер очередного символа в строке).

Схема алгоритма подсчёта количества повторений очередного слова в строке символов (Schet )приведена на рис. 4.

Рис.4. Схема алгоритма Schet - подсчёта количества повторений

i-го слова в строке символов.

Входные параметры:

sst - очередное слово;

s1 - входная строка символов;

i - номер слова в строке;

dl - количество слов в строке;

a - двумерный массив, содержащий информацию о структуре строки;

Выходные параметры:

m - количество повторений очередного (i-го) слова в строке символов.

Схема алгоритма проверки повторения очередного слова строки среди слов, расположенных перед ним (Prov1) приведена на рис. 5.

 

Рис.5. Схема алгоритма Prov1 - проверки повторения очередного слова строки среди слов, расположенных перед ним.

Входные параметры:

sst - очередной слово;

s1 - входная строка символов;

n - количество слов в строке, расположенных перед проверяемым;

a - двумерный массив, содержащий информацию о структуре строки;

Выходные параметры:

f - логическая переменная - признак повторения очередного слова (при f = false).

Дополнительные переменные:

j - номер слова в строке при проверке;

ss - j-ое слово в сроке при проверке.

Схема алгоритма проверки повторения очередного слова строки среди слов, расположенных после него (Prov2) приведена на рис. 6.

Рис. 6. Схема алгоритма Prov2 - проверки повторения очередного слова строки среди слов, расположенных после него.

Входныепараметры:

sst - очередное проверяемое слово;

s1 - входная строка символов;

i1 - номер слова, расположенного после проверяемого;

i2 - количество слов в строке;

a - двумерный массив, содержащий информацию о структуре строки;

Выходные параметры:

m1 - количество повторений очередного слова в строке символов.

Дополнительные переменные:

j - номер слова в строке при проверке;

ss - j-тое слово в сроке при проверке.

Текст программы

program Project_str;

 

Uses

Forms,

Unit_str in 'Unit_str.pas' {Form1};

 

{$R *.res}

 

Begin

Application.Initialize;

Application.CreateForm(TForm1, Form1);

Application.Run;

end.

 

unitUnit_str;

Interface

Uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,

Forms, Dialogs, StdCtrls;

Type

TForm1 = class(TForm)

Label1: TLabel;

Edit1: TEdit; // поле для ввода исходной строки

Label2: TLabel;

Edit2: TEdit; // поле для ввода сформированной строки

Button1: TButton; // кнопка выполнения

Button2: TButton; // кнопка очистки

Memo1: TMemo;

Label3: TLabel;

procedureButton1Click(Sender: TObject);

procedureButton2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

End;

 

Var

Form1: TForm1;

Implementation

{$R *.dfm}

type Tst r =array[1..15,1..2] of integer;

var s1,s2:string;

 

procedure Strukt(s1:string;l:integer; var a:tstr; var k:integer);

var c,i:integer;

Begin

k:=0;

c:=0;

for i:=1 to l do

if (s1[i]=' ') or(s1[i]=',')

Then

Begin

if c>0 then

Begin

k:=k+1;

a[k,1]:=i-c;

a[k,2]:=c;

c:=0;

end;

End

else c:=c+1;

end;

 

function Prov1(sst,s1:string;n:integer;a:tstr):boolean;

var j:integer;

ss:string;

Begin

Result:= true;

for j:=1 to n do

Begin

ss:=copy(s1,a[j,1],a[j,2]);

if ss=sst then

result:=false;

end;

end;

function Prov2 (sst,s1:string;i1,i2:integer;a:tstr):integer;

var j,m1:integer;

ss:string;

Begin

m1:=1;

for j:=i1 to i2 do

Begin

ss:=copy(s1,a[j,1],a[j,2]);

if ss=sst then

m1:=m1+1;

end;

result:=m1;

end;

 

function Schet (sst,s1:string;i:integer;a:tstr;k:integer):integer;

var f1:boolean;

m:integer;

Begin

m:=1;

f1:=prov1(sst,s1,i-1,a);

if f1 then

m:=prov2(sst,s1,i+1,k,a);

Result:=m;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

var a:tstr;

ss1,sst:string;

m,i,l,dl:integer;

Begin

s1:=edit1.Text;

s1:=s1+' ';

l:=length(S1);

if l>1 then

Begin

struсt(s1,l,a,dl);

ifdl>1 then

Begin

ss1:=copy(s1,a[1,1],a[1,2]);

s2:='';

for i:=2 to dl do

Begin

sst:=copy(s1,a[i,1],a[i,2]);

if ss1<>sst then

Begin

m:=Schet(sst,s1,i,a,dl);

if m>2 then

s2:=s2+sst+' ';

end;

end;

if length(s2)>0 then

edit2.Text:=s2

else ShowMessage('Выходная строка пустая');

End

else ShowMessage('Слов нет');

End

else ShowMessage('Входная строка пустая');

end;

 

procedure TForm1.Button2Click(Sender: TObject);

Begin

edit1.Clear;

edit2.Clear;

edit1.SetFocus;

end;

end.