Химия и PascalABC.Net

Уважаемые коллеги, добрый день! Мне нужна ваша консультативная помощь с программированием в PascalABC.Net. Я пытался разобраться сам, но понял, что без помощи «профи» тут не обойтись. Я по образованию химик и в настоящее время занимаюсь анализом органических соединений. В химии есть такое понятие, как SMILES – это система машинного описания химических формул. Вот здесь можно подробнее почитать. У меня есть список таких SMILES – 1500 штук. Записаны они в текстовый файл. Столбиком. Точнее: первая строка – порядковый номер, вторая строка SMILES. И так далее. Мне надо провести расчёт и получить таблицу, где в первой колонке будет вписан порядковый номер, потом SMILES, а потом молекулярный вес вещества, который будет посчитан на основе SMILES. Расчёт молекулярной массы достаточно прост: из таблицы Менделева берём атомную массу элемента и суммируем согласно SMILES. Т.е. в данном случае все буквенные значения SMILES выступают как константы. Прошу вас помочь мне написать программу в PascalABC, так как сам я «чайник» в этом вопросе.

1 лайк

Ну как-нибудь так:

var
  MT := Dict(KV('C', 12), KV('O', 16));// Таблица Менделеева (сокращённая версия)

function Mass(mol: string): integer;
begin
  result := 0;
  foreach var atom: char in mol do
  begin
    var a := atom.ToUpper;
    if a in MT then
      result += MT[a];  
  end; 
end;

begin
  var num := 1500;
  var mol := 'CcC(=O)O';
  $'{num}: {mol} ({Mass(mol)}) '.Println;
end.

Вывод:

1500: CcC(=O)O (68)

Надо только данные считывать из текстового файла: в главной программе небольшие изменения будут.

2 лайка

Вадим, добрый день! Спасибо за ответ. Я хотел бы задать вам несколько вопросов “чайника”.

  1. Вы пишите: varMT := Dict(KV('C', 12), KV('O', 16));

Как я понимаю, здесь мы создаём переменную MT, которой присваиваем значение в кортеже. Значение состоит из двух значений: буквенного и численного. Кортеж является словарём. Вадим, а что такое KV?

Вставьте в IDE и понаводите мышку на непонятные имена.

2 лайка

ладно… задам шокирующий вопрос… Что такое IDE?

1 лайк

Добрый день! MT (Mendeleev’s Table) – это словарь (dictionary). В нём могут храниться пары вида (ключ, значение), по-английски (Key, Value), отсюда KV. Чтобы сформировать такую пару используется функция KV(ключ, значение). Кортежей тут нет, просто параметры функции. Ключом у нас является символ элемента, значением – атомная масса. Получается ассоциативный массив, в котором индексом является “ключ”, а не число, как в обычном массиве.

Если химический элемент обозначается двумя символами (Si, Ca) – такой метод не пройдёт, надо будет цикл переделывать. Я просто взял из вики первый пример, там углерод и кислород. Но Вашей таблички у меня нет.

IDE – Integrated Development Environment – это среда PascalABC.NET. Редактор, в общем :slight_smile: Правда, со всем остальным невидимым вместе.

2 лайка

Теперь всё складывается. Программирование - это искусство, конечно. Просто читать справочники и учебники совершенно не достаточно…

2 лайка

Продолжая тему постижения “чайником” основ программирования, хотел бы заметить, что подача материала в учебниках заслуживает критики. Основная проблема в том, что учебники рассказывают о функциях языка, но я ещё не встречал учебника по логике построения программ. Я скачал себе несколько томов “Искусство программирования” Дональда Кнута и надеюсь, что найду это там. Например, возвращаясь к имеющейся у меня задачи, я предполагаю, что её надо разрезать на множество подзадач (пока только общие черты). Например:

  1. Надо открыть имеющийся файл с описанием SMILES (файл №1).
  2. Строчка за строчкой прочитать этот файл;
  3. Создать файл с таблицей (файл №2);
  4. Считывая файл №1 необходимо каким-то образом объяснить машине разницу между порядковым номером соединения (порядковый номер занимает отдельную строку) и описанием самого элемента, которые представлен как группа символов и цифр.
  5. Перенести информацию о порядковом номере элемента в первую колонку таблицы, которая будет представлять собой многомерный массив (правильно я понимаю? Или в массив можно вносить данные только одного типа и если там будут буквы, то цифры там располагать нельзя?);
  6. Перенести описание элемента SMILES во вторую колонку;
  7. На основе данных файла, содержащего константы из таблицы Менделеева, провести расчёт молекулярных весов соединений и вписать данные в третью колонку.

Сейчас попытаюсь написать код…:confused:

 Program SMILES calculator;
   Const
        С = 12,0096;
        O = 15,99903;
        H = 1,00811;
   var
     molecule: integer; { Это нам будет нужно для расчёта массы молекул }
     file_SMILES: text; {Создаём переменную, которая будет текстовым файлом. Используем text, так как он позволяет работать со строками неопределённой длины}
     file_SMILES_results: text; {создаём переменную таблицей результатов. Используем text, так как он позволяет работать со строками неопределённой длины} 
     {Переменные Х - не понимаю, как их можно задать. Это должны быть переменные , отображающие содержимое каждой строки. Одни из них будут цифры, другие - знаки, Но среди знаков могут быть и цифры. Предположим, что вторые переменные будут в виде строк.}
BEGIN
  assign(file_SMILES,'c:\file_SMILES.txt'); {Обращаемся к файлу с нумерованным перечнем молекул}
  Reset (file_SMILES); {устанавливаем курсор в начало файла}
  ReadLn (file_SMILES, Переменные Х);
  close(file_SMILES);{Закрываем файл}
END.

Понятно, что этот код пока работать не будет, но я буду разбираться дальше и буду рад вашим комментариям. :neutral_face:

Фрагмент файла с описанием молекул: file_SMILES.txt (210 Байты)

Да, если Вы выбрали учебник (пособие) по тому или иному языку, либо по программированию на базе того или иного языка. Я напомню, что в основе программы лежит алгоритм (чаще - набор алгоритмов). Умение программировать включает в себя умение строить алгоритмы. Но алгоритм не зависит от языка программирования, поскольку любая программа - всего лишь запись алгоритма по правилам той или иной системы программирования. С Д.Кнутом, боюсь, Вы если и справитесь, то уже не в этой жизни - слишком академичен этот труд для решения повседневных задачек.

Ищите книги, где говорится о методах и методиках создания алгоритмов. Познакомьтесь с информационными структурами, чтобы знать, какие из стандартных структур могут быть применены в Вашей практике.

И еще, если Вы выбрали синтаксис языка Турбо Паскаль, вряд ли наш форум будет Вам полезен. Здесь PascalАВС.NЕТ: мы не хотим мириться с технологиями программирования полувековой давности.

1
COC1=C2C3=C(C(=O)CC3)C(=O)OC2=C4C5C=COC5OC4=C1
2
COC1=C2C3=C(C(=O)OCC3)C(=O)OC2=C4C5C=COC5OC4=C1
3
COC1=C2C3=C(C(=O)CC3)C(=O)OC2=C4C5CC(OC5OC4=C1)O
4
COC1=C2C3=C(C(=O)CC3)C(=O)OC2=C4C(=C1)OC5C4(C=CO5)O

Это что, под LISP писали? )))

1 лайк

Вот так можно с файлами. На экран тоже дублируется.

var
  MT := Dict(KV('C', 12.0096), 
             KV('O', 15.99903),
             KV('H', 1.00811));// Таблица Менделеева (сокращённая версия)

function Mass(mol: string): real;
begin
  result := 0;
  foreach var atom: char in mol do
  begin
    var a := atom.ToUpper;
    if a in MT then
      result += MT[a];  
  end; 
end;

begin
  var smiles := ReadAllLines('file_SMILES.txt');
  var res := OpenWrite('file_SMILES_results.txt');
  var i := 0;
  while i < smiles.Length do
  begin
    var num := smiles[i];
    var mol := smiles[i + 1];
    var s := $'{num,4}: {mol,60}   ({Mass(mol):f7}) ';
    s.Println;
    res.Writeln(s);
    i += 2;
  end;  
  res.Close();
end.

Что тут можно менять:

  1. Саму таблицу Менделеева, разумеется
  2. В строке var s := $'{num,4}: {mol,60} ({Mass(mol):f7}) '; числа 4 и 60 – для выравнивания. Их можно или вообще убрать (вместе с запятыми), или поменять под собственные нужды. Число 7 в {Mass(mol):f7} – количество знаков дробной части массы.

Как-то так. А заняться Вам лучше (как мне кажется) не Кнутом, а скачать бесплатные книжки с сайта PascalABC.NET, прямо с главной страницы внизу. В данном состоянии они Вам будут полезнее :slight_smile:

2 лайка

Уважаемые коллеги, спасибо вам за ответы. Это действительно всё интересно. Книги я с сайта скачал и очень внимательно прочитал. Именно про них я и писал: они дают полную информацию о стркутуре языка, но не позволяют развить ту самую “извилину програмиста” которая позволяет во всем этом массиве ориентироваться. Большое спасибо за новый код. Я постараюсь его пошагово разобрать. Приведённый мной файл -это не код. Это описание молекул.

PascalABC.NET позиционируется не только как язык для обучения программированию, но и как язык для научных вычислений. Надо пользоваться! :slight_smile:

1 лайк

А что, учитываем только буковки, цифры и прочие значки пропускаем? Количество буковок множим на их атомарные веса?

Вроде да. Я так понял, что это не школьная химическая формула, типа H2SO4. А цифры указывают номер атома. Если я неправ, то надо переделывать программу.

Я думаю, тут сложнее. COC1=C2C3=C(C(=O)CC3)C(=O)OC2=C4C5C=COC5OC4=C1

Слишком много “атомов” без номера, а есть и повторяющиеся. Ну да не суть. Если просто сумма, то чего голову ломать?

Да, не совсем ясно. Если там какой подвох, топикстартер скажет :slight_smile:

Химия - это наука!

2 лайка
 - В этой квартире раньше жил химик, - говорит хозяин молодому человеку,
   который хочет снять у него квартиру.
 - Он постоянно экспериментировал и как раз в этой комнате.
 - А-а... Вероятно, пятно на потолке - это результат его экспериментов?
 - Нет, это сам химик.
...Что смешно: те лекарства, что подробно делаем, точно выдерживая технологию,
сами и глотаем. А потом слышны медицинские крики — как же, точно по формуле
СН3СОС2Н5 плюс метилхлотилгидрат на пару — не помогает, а точно такая же
швейцарская сволочь эту бациллу берет. Опять проверяем СН3СОС2Н5 на пару — не берет,
и, что особенно противно, название у них одинаковые.
     (М. Жванецкий)
1 лайк

Рад, что задача заинтересовала вас. Чтоб избежать повторений, я предлагаю ознакомиться с описанием принципа построения формулу по ссылке, которую я дал в самом начале. Особенно обратите внимание на раздел “Основные принципы построения SMILES”.

Это машинное описание структурной формулы молекулы. Химическая формула данного вещества значительно проще. Теоретически, имеет смысл попробовать машинно переводить СМАЙЛы в нормальные формулы и считать уже их…