Книга программиста/Обработка строк в PascalABC.Net
К оглавлению | Назад | Вперёд
Все программы, код которых выложен здесь, являются работоспособными. На момент написания программ использовалась среда PascalABC.Net 3.0.
Установка длины строки
правитьfunction SetLength(s: string; count: integer): string;
begin
for var i := 1 to count do
Result += s.Chars[i];
end;
begin
SetLength('Agent -32457.', 5).Println();
end.
Изменение регистра букв на противоположный
правитьbegin
var A := ReadlnString();
var B := '';
for var i := 1 to A.Length do
if A.Chars[i].IsUpper() then B += char.ToLower(A.Chars[i]) else B += char.ToUpper(A.Chars[i]);
Writeln(B);
end.
//Аналог через готовые методы.
begin
ReadlnString().Select(x -> char.IsUpper(x) ? LowerCase(x) : UpperCase(x)).Println();
end.
Строки с максимальным количеством согласных
правитьconst
N = 10;
var
Words: array [0..N - 1] of string;
Count: array [0..N - 1] of integer;
Max: integer;
Consonants: set of char;
begin
var C := 'QWRTPSDFGHJKLZXCVBNM';
for var i := 1 to Length(C) do
Include(Consonants, C[i]);
for var i := 0 to N - 1 do
Readln(Words[i]);
for var i := 0 to N - 1 do
for var j := 1 to Words[i].Length do
if UpCase(Words[i].Chars[j]) in Consonants then
Inc(Count[i]);
var j := 0;
Max := Count[0];
for var i := 1 to N - 1 do
if Count[i] > Max then
begin
Max := Count[i];
j := i;
end;
WritelnFormat('Слово {0} содержит максимальное количество согласных: {1}.', Words[j], Count[j]);
end.
Смотрите также: реализация на Python.
Разделы справки, которые могут помочь: |
---|
Типы данных -> Множества. |
Написание своего компаратора для сравнения символов
правитьtype
TComparer = class(IComparer<char>)
public
function Compare(x, y: char): integer;
begin
if Ord(x) > Ord(y) then Result := 1
else if Ord(x) = Ord(y) then Result := 0
else Result := -1;
end;
end;
begin
var C := new TComparer();
Writeln(C.Compare('A', 'B'));
end.
Замена слов на цифры
правитьvar
S, S2: string;
i: integer := 1;
function GetWord(s: string; var from: integer): string;
begin
while (from <= Length(s)) and char.IsLetter(s.Chars[from]) do
begin
Result += s.Chars[from];
Inc(from);
end;
end;
begin
Readln(S);
var L := Length(S);
while i <= L do
begin
while (i <= L) and not char.IsLetter(S.Chars[i]) do
begin
S2 += S.Chars[i];
Inc(i);
end;
var w := GetWord(S, i);
case LowerCase(w) of
'ноль', 'нуль': S2 += '0';
'один': S2 += '1';
'два': S2 += '2';
'три': S2 += '3';
'четыре': S2 += '4';
'пять': S2 += '5';
'шесть': S2 += '6';
'семь': S2 += '7';
'восемь': S2 += '8';
'девять': S2 += '9';
else S2 += w
end;
end;
S := S2;
Writeln(S2);
end.
Сравнение строк
правитьconsiderMore - считать ли большей меньшую по длине строку, если первые n символов (n = длине меньшей строки) в строках s1 и s2 совпадают.
function Compare(s1, s2: string; considerMore: boolean := true; more: integer := 1; less: integer := -1): integer;
var
i: integer;
begin
if (Abs(more) <> 1) or (Abs(less) <> 1) then
raise new System.Exception('Значение less и (или) more не равно 1 или -1.');
if more = less then
raise new System.Exception('more и less не могут совпадать по значению.');
Result := 0;
i := 1;
while (i <= s1.Length) and (i <= s2.Length) and (Result = 0) do
begin
if s1.Chars[i] > s2.Chars[i] then
Result := more
else if s1.Chars[i] < s2.Chars[i] then
Result := less;
Inc(i);
end;
if (Result = 0) and (s1.Length <> s2.Length) then
if s1.Length < s2.Length then
if considerMore then Result := more else Result := less
else
if considerMore then Result := less else Result := more;
end;
begin
Writeln(Compare('a', 'aa'));
end.
Поиск подстроки в строке
правитьfunction StrPosition(str1, str2: string): integer;
begin
Result := -1;
var count := 0;
for var i := 1 to str1.Length - str2.Length + 1 do
begin
count := 0;
for var j := 1 to str2.Length do
if str2.Chars[j] = str1.Chars[j + i - 1] then
Inc(count);
if count = str2.Length then
begin
Result := i;
break;
end;
end;
end;
begin
Writeln(StringPosition('abcd', 'cd'));
end.
Чтение целого числа из StringBuilder
правитьfunction TryReadNumber(s: StringBuilder; var from: integer): integer;
begin
while (from <= s.Length) and char.IsWhiteSpace(s.Chars[from]) do
Inc(from);
if from > s.Length then
raise new System.FormatException('Конец строки.');
var sign := '-' * Ord(s.Chars[from] = '-');
Inc(from);
var outcome := '';
while (from <= s.Length) and char.IsDigit(s.Chars[from]) do
begin
outcome += s.Chars[from];
Inc(from);
end;
Result := StrToInt(sign + outcome);
end;
begin
var from := 6;
TryReadNumber('Agent -327.', from).Println();
end.