Показать сообщение отдельно
  #3  
Старый 18.12.2008, 17:31
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Во первых, тебе надо иметь константный массив соответсвия символов значениям. Во вторых, надо писать парсер, который разбирает выражение и с помощью соотв. массива возвращает тебе твои циферки.
Ты не написал что надо делать с этими цифрами (куда их "складывать").
Для твоего примера будет где-то так:
Код:
type
  TVal = record
    Letter : String;
    Value : Integer;
  end;

const
  Vals : Array [1..3] Of TVal =
    ((Letter:'H'; Value:3),(Letter:'S'; Value:7),(Letter:'O'; Value:1));

function GetValue(ALetter : String) : Integer;
var
  I : Integer;
begin
  Result := -1;
  For I := 1 To 3 Do
    If Vals[i].Letter = ALetter Then
      Begin
        Result := Vals[i].Value;
        Break;
      End;
end;

function Parse(AText : String) : String;
var
  I : Integer;
  Buf : String;
  V : Integer;
begin
  Result := '';
  I := 1;
  While I <= Length(AText) Do
    Begin
      // Получить хим элемент.
      If Not (AText[i] In ['A'..'Z']) Then Raise Exception.CreateFmt('Ошибка в формуле в позиции %d',[i]);
      Buf := AText[i];
      If AText[I+1] In ['a'..'z'] Then
        Begin
          Inc(I);
          Buf := Buf + AText[i];
        End;
      V := GetValue(Buf);
      If V = -1 Then Raise Exception.CreateFmt('Введенный хим элемент не найден (%s)',[Buf]);
      Result := Result + IntToStr(V);
      Inc(I);

      // Проверяем на цифру
      Buf := '';
      While AText[i] In ['0'..'9'] Do
        Begin
          Buf := Buf + AText[i];
          Inc(I);
        End;
      If Buf <> '' Then Result := Result + '*' + Buf;

      Result := Result + ' - ';
    End;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit2.Text := Parse(Edit1.Text);
end;

Код понимает "правильное" написание химэлементов (первая буква большая, вторая, если есть, маленькая) и цифры. Цифра не может идти первой. Результат выводит в виде строки. Для увеличения поддерживаемых элементов надо "добить" их в константный массив в соотв. виде и скорректировать цикл в функции GetValue.
Ответить с цитированием