Как разбить строку из десяти символов, например "12345 * 45688", в массив - PullRequest
5 голосов
/ 08 мая 2011

Я делаю простой калькулятор, в котором вы вводите значения в поле ввода.Мне нужно разбить строку на несколько массивов в зависимости от того, сколько * + - / есть в сумме, например:

У меня есть 22 + 22 * ​​22-22 / 22. Я хочу разбить это на пятьразные массивы, потому что есть пять разных групп чисел.Затем позже я собираюсь добавить массив1 к массиву два, умножить его на массив3, вычесть это на массив4 и разделить на массив 5.

Ответы [ 4 ]

4 голосов
/ 08 мая 2011

Если вы хотите прочитать что-то подобное, особенно если вы хотите оценить математические выражения, вам нужно больше, чем просто разделитель массива;тебе нужен настоящий парсер.Чтобы сделать это правильно, требуется немного теории компилятора.Я бы посоветовал вам взглянуть на Let's Build A Compiler , учебное пособие, которое охватывает все, что вам нужно знать о разборе выражений (и немного больше, поскольку он на самом деле строит простой компилятор) иэто легко понять.Все примеры приведены в Turbo Pascal, поэтому кодировщик Delphi должен легко читать.

2 голосов
/ 09 мая 2011

Delphi XE имеет функцию SplitString , которая делает именно то, что вам нужно.

0 голосов
/ 09 мая 2011

Вот функция, которая может помочь вам в пути.

Она разбивает входную строку на массив подстрок, основываясь на предоставленном наборе предопределенных наборов символов.1004 * Это даст вам массив строк, которые будут ["22", "+", "22", "*", "22", "-", "22", "/", "22"].

С этого момента вам нужно будет идентифицировать числа и операторов, а также сгруппировать и выполнить вычисления в соответствии с правилами приоритета операторов.

TCharSet = Set of Char;
TStringArray = Array of String;

function GetSubStrings(InputString: String; CharacterSets: Array of TCharSet): TStringArray;
// Get Sub-strings
var
  Index: Integer;
  Character: Char;
  SubString: String;
  SubStringArray: TStringArray;
  CharacterSetIndex: Integer;
  PreviousCharacterSetIndex: Integer;
begin
  // Get
  SubString := '';
  SetLength(SubStringArray, 0);
  PreviousCharacterSetIndex := -1;
  for Index := 1 to Length(InputString) do
  begin
    // Character
    Character := InputString[Index];

    // Character Set Index
    CharacterSetIndex := GetCharacterSet(Character, CharacterSets);

    // Add
    if (CharacterSetIndex = PreviousCharacterSetIndex) or (Index = 1) then
      // Add Character to SubString
      SubString := SubString + Character
    else
    begin
      // Add SubString To SubString Array
      SetLength(SubStringArray, Length(SubStringArray) + 1);
      SubStringArray[Length(SubStringArray) - 1] := SubString;

      // New SubString
      SubString := Character;
    end;

    // Previous Character Set Index
    PreviousCharacterSetIndex := CharacterSetIndex;

    // Add last SubString
    if Index = Length(InputString)  then
    begin
      // Add SubString To SubString Array
      SetLength(SubStringArray, Length(SubStringArray) + 1);
      SubStringArray[Length(SubStringArray) - 1] := SubString;
    end;
  end;

  // Result
  Result := SubStringArray;
end; 

function GetCharacterSet(Character: Char; CharacterSets: Array of TCharSet): Integer;
// Get Character Set
var
  Index: Integer;
  CharacterSet: TCharSet;
begin
  // Get
  Result := -1;
  for Index := 0 to Length(CharacterSets) - 1 do
  begin
    // Character Set
    CharacterSet := CharacterSets[Index];

    // Check
    if Character in CharacterSet then
    begin
      // Result
      Result := Index;

      // Break
      Break;
    end;
  end;
end;
0 голосов
/ 09 мая 2011

Если вы хотите получить результат этого уравнения, вы должны попробовать невизуальный компонент, называемый CalcExpress. Это бесплатно, и вы можете получить его здесь: CalcExpress

Ссылка для скачивания находится в конце текста страницы

...