Совместимость коротких и длинных строк с символьным типом
В 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.