Книга программиста/Обработка строк в 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.

IComparer<T> - что такое?

Замена слов на цифры[править]

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.