| Работа со строками | |
| Разбиение строки на слова | |
| Как ввести строку ограниченной длины | |
Type strResult = (strLess, strEqual, strMore);При сравнении строк s1 и s2 результат будет таким:
s1 = s2 : вернется strEqual s1 < s2 : вернется strLess s1 > s2 : вернется strMore
Function isPalindrom(Const s: String): Boolean;
Var i: Byte;
Begin
isPalindrom := False;
For i := 1 To Length(s) div 2 Do
If s[i] <> s[Length(s) - i + 1] Then Exit;
IsPalindrom := True
End;
Возможна также рекурсивная реализация функции isPalindrom:function isPalindrom(s: String): Boolean;
Begin
isPalindrom := True;
If Length(s) <= 1 Then Exit
Else Begin
If s[1] = s[Length(s)] Then
isPalindrom := isPalindrom(Copy(s, 2, Length(s) - 2))
Else isPalindrom := False;
End;
End;
Исходник: strings.pas
Различные возможные реализации функций разбиения строки на слова:
Type
TWords = Array[1 .. 100] Of String[100];
TDelimiter = Set Of Char;
Function GetWords(s: String; Var mas: TWords;
delimiters: TDelimiter): Byte;
Var i, p: Byte;
Begin
{ Заменяем все разделители пробелами }
For i := 1 to Length(s) Do
If s[i] In delimiters Then s[i] := #32;
{ удаляем лишние пробелы }
Repeat
p := Pos(' ', s);
If p > 0 Then Delete(s, p, 1)
Until p = 0;
If s[1] = ' ' Then Delete(s, 1, 1); { удаляем пробел в начале строки }
If s[Length(s)] = ' ' Then
Delete(s, Length(s), 1); { удаляем пробел в конце строки }
i := 0;
Repeat { заполняем массив словами из строки }
p := Pos(' ', s); Inc(i);
If p > 0 Then
Begin
mas[i] := Copy(s, 1, Pred(p)); Delete(s, 1, p)
End
Else mas[i] := s
Until p = 0;
GetWords := i
End;
Var
i, count: Word;
words: TWords;
{ пример использования функции }
Const
s: String = ' That is all folks ';
Begin
Count := GetWords(s, words, []);
For i := 1 To Count Do
WriteLn(words[i]);
End.
Type
TWordStr = String[100];
TDelimiter = Set Of Char;
PTItem = ^TItem;
TItem = Record
Data: TWordStr;
next: PTItem;
End;
TWordList = Record
first, last: PTItem;
End;
Procedure InsertWord(Var L: TWordList; s: String);
Var p: PTItem;
Begin
New(p);
p^.Data := s;
p^.next := nil;
If L.first = nil Then L.first := p
Else L.last^.next := p;
L.last := p
End;
Function GetWords(s: String;
Var L: TWordList; delimiters: TDelimiter): Byte;
Var i, p: Byte;
Begin
{ Заменяем все разделители пробелами }
For i := 1 to Length(s) Do
If s[i] In delimiters Then s[i] := #32;
{ удаляем лишние пробелы }
Repeat
p := Pos(' ', s);
If p > 0 Then Delete(s, p, 1)
Until p = 0;
If s[1] = ' ' Then Delete(s, 1, 1); { удаляем пробел в начале ... }
If s[Length(s)] = ' ' Then
Delete(s, Length(s), 1); { ... и в конце строки }
i := 0;
Repeat { заполняем список словами из строки }
p := Pos(' ', s); Inc(i);
If p > 0 Then Begin
InsertWord(L, Copy(s, 1, Pred(p)));
Delete(s, 1, p)
End
Else InsertWord(L, s)
Until p = 0;
GetWords := i
End;
Var
i, count: Word;
L: TWordList;
{ пример использования функции }
Const
s: String = ' That is - all folks;;. ';
var
p: ptitem;
Begin
Count := GetWords(s, L, ['-', ';', '.']);
WriteLn(Count, ' words found ...');
p := L.first;
While p <> nil Do Begin
WriteLn(p^.Data);
p := p^.next;
End;
End.const
delimiter = [#32, ',', '.', '!', ':'];
type
wrd_info = record
start, len: byte;
end;
function get_words(s: string;
var words: array of wrd_info): integer;
var
count: integer;
i, curr_len: byte;
begin
count := -1; i := 1;
while i <= length(s) do begin
while (s[i] in delimiter) and (i <= length(s)) do inc(i);
curr_len := 0;
while not (s[i] in delimiter) and (i <= length(s)) do begin
inc(i); inc(curr_len);
end;
if curr_len > 0 then begin
inc(count);
with words[count] do begin
start := i - curr_len;
len := curr_len
end;
end;
end;
get_words := count + 1;
end;
const
max_word = 255;
var
words: array[1 .. max_word] of wrd_info;
i, n: integer;
const
s: string = 'thats,,, all :: folks !!! bye...';
begin
n := get_words(s, words);
writeln('words:');
for i := 1 to n do
writeln(copy(s, words[i].start, words[i].len));
end.
Как написать функцию для ввода строки с ограниченной длиной ?
uses crt;
function get_str(max_len: byte): string;
var s: string; ch: char;
begin
s := '';
repeat
ch := readkey;
if length(s) <= max_len then
case ch of
#8: begin
if length(s) > 0 then begin
write(#8,#32,#8);
delete(s, length(s), 1)
end
end
else
if length(s) <> max_len then
begin s := s + ch; write(ch) end
end;
until ch = #13;
writeln;
get_str := s
end;
Пример использования функции:var
s: string;
begin
write('string = '); s := get_str(5);
writeln('res = ', s);
end.