Уважаемые коллеги, добрый день! Мне нужна ваша консультативная помощь с программированием в PascalABC.Net. Я пытался разобраться сам, но понял, что без помощи «профи» тут не обойтись. Я по образованию химик и в настоящее время занимаюсь анализом органических соединений. В химии есть такое понятие, как SMILES – это система машинного описания химических формул. Вот здесь можно подробнее почитать. У меня есть список таких SMILES – 1500 штук. Записаны они в текстовый файл. Столбиком. Точнее: первая строка – порядковый номер, вторая строка SMILES. И так далее. Мне надо провести расчёт и получить таблицу, где в первой колонке будет вписан порядковый номер, потом SMILES, а потом молекулярный вес вещества, который будет посчитан на основе SMILES. Расчёт молекулярной массы достаточно прост: из таблицы Менделева берём атомную массу элемента и суммируем согласно SMILES. Т.е. в данном случае все буквенные значения SMILES выступают как константы. Прошу вас помочь мне написать программу в PascalABC, так как сам я «чайник» в этом вопросе.
Ну как-нибудь так:
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)
Надо только данные считывать из текстового файла: в главной программе небольшие изменения будут.
Вадим, добрый день! Спасибо за ответ. Я хотел бы задать вам несколько вопросов “чайника”.
- Вы пишите:
var
MT := Dict(KV('C', 12), KV('O', 16));
Как я понимаю, здесь мы создаём переменную MT, которой присваиваем значение в кортеже. Значение состоит из двух значений: буквенного и численного. Кортеж является словарём. Вадим, а что такое KV?
Вставьте в IDE и понаводите мышку на непонятные имена.
ладно… задам шокирующий вопрос… Что такое IDE?
Добрый день! MT (Mendeleev’s Table) – это словарь (dictionary). В нём могут храниться пары вида (ключ, значение), по-английски (Key, Value), отсюда KV. Чтобы сформировать такую пару используется функция KV(ключ, значение). Кортежей тут нет, просто параметры функции. Ключом у нас является символ элемента, значением – атомная масса. Получается ассоциативный массив, в котором индексом является “ключ”, а не число, как в обычном массиве.
Если химический элемент обозначается двумя символами (Si, Ca) – такой метод не пройдёт, надо будет цикл переделывать. Я просто взял из вики первый пример, там углерод и кислород. Но Вашей таблички у меня нет.
IDE – Integrated Development Environment – это среда PascalABC.NET. Редактор, в общем Правда, со всем остальным невидимым вместе.
Теперь всё складывается. Программирование - это искусство, конечно. Просто читать справочники и учебники совершенно не достаточно…
Продолжая тему постижения “чайником” основ программирования, хотел бы заметить, что подача материала в учебниках заслуживает критики. Основная проблема в том, что учебники рассказывают о функциях языка, но я ещё не встречал учебника по логике построения программ. Я скачал себе несколько томов “Искусство программирования” Дональда Кнута и надеюсь, что найду это там. Например, возвращаясь к имеющейся у меня задачи, я предполагаю, что её надо разрезать на множество подзадач (пока только общие черты). Например:
- Надо открыть имеющийся файл с описанием SMILES (файл №1).
- Строчка за строчкой прочитать этот файл;
- Создать файл с таблицей (файл №2);
- Считывая файл №1 необходимо каким-то образом объяснить машине разницу между порядковым номером соединения (порядковый номер занимает отдельную строку) и описанием самого элемента, которые представлен как группа символов и цифр.
- Перенести информацию о порядковом номере элемента в первую колонку таблицы, которая будет представлять собой многомерный массив (правильно я понимаю? Или в массив можно вносить данные только одного типа и если там будут буквы, то цифры там располагать нельзя?);
- Перенести описание элемента SMILES во вторую колонку;
- На основе данных файла, содержащего константы из таблицы Менделеева, провести расчёт молекулярных весов соединений и вписать данные в третью колонку.
Сейчас попытаюсь написать код…
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.
Понятно, что этот код пока работать не будет, но я буду разбираться дальше и буду рад вашим комментариям.
Фрагмент файла с описанием молекул: 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 писали? )))
Вот так можно с файлами. На экран тоже дублируется.
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.
Что тут можно менять:
- Саму таблицу Менделеева, разумеется
- В строке
var s := $'{num,4}: {mol,60} ({Mass(mol):f7}) ';
числа 4 и 60 – для выравнивания. Их можно или вообще убрать (вместе с запятыми), или поменять под собственные нужды. Число7
в{Mass(mol):f7}
– количество знаков дробной части массы.
Как-то так. А заняться Вам лучше (как мне кажется) не Кнутом, а скачать бесплатные книжки с сайта PascalABC.NET, прямо с главной страницы внизу. В данном состоянии они Вам будут полезнее
Уважаемые коллеги, спасибо вам за ответы. Это действительно всё интересно. Книги я с сайта скачал и очень внимательно прочитал. Именно про них я и писал: они дают полную информацию о стркутуре языка, но не позволяют развить ту самую “извилину програмиста” которая позволяет во всем этом массиве ориентироваться. Большое спасибо за новый код. Я постараюсь его пошагово разобрать. Приведённый мной файл -это не код. Это описание молекул.
PascalABC.NET позиционируется не только как язык для обучения программированию, но и как язык для научных вычислений. Надо пользоваться!
А что, учитываем только буковки, цифры и прочие значки пропускаем? Количество буковок множим на их атомарные веса?
Вроде да. Я так понял, что это не школьная химическая формула, типа H2SO4. А цифры указывают номер атома. Если я неправ, то надо переделывать программу.
Я думаю, тут сложнее.
COC1=C2C3=C(C(=O)CC3)C(=O)OC2=C4C5C=COC5OC4=C1
Слишком много “атомов” без номера, а есть и повторяющиеся. Ну да не суть. Если просто сумма, то чего голову ломать?
Да, не совсем ясно. Если там какой подвох, топикстартер скажет
- В этой квартире раньше жил химик, - говорит хозяин молодому человеку,
который хочет снять у него квартиру.
- Он постоянно экспериментировал и как раз в этой комнате.
- А-а... Вероятно, пятно на потолке - это результат его экспериментов?
- Нет, это сам химик.
...Что смешно: те лекарства, что подробно делаем, точно выдерживая технологию,
сами и глотаем. А потом слышны медицинские крики — как же, точно по формуле
СН3СОС2Н5 плюс метилхлотилгидрат на пару — не помогает, а точно такая же
швейцарская сволочь эту бациллу берет. Опять проверяем СН3СОС2Н5 на пару — не берет,
и, что особенно противно, название у них одинаковые.
(М. Жванецкий)
Рад, что задача заинтересовала вас. Чтоб избежать повторений, я предлагаю ознакомиться с описанием принципа построения формулу по ссылке, которую я дал в самом начале. Особенно обратите внимание на раздел “Основные принципы построения SMILES”.
Это машинное описание структурной формулы молекулы. Химическая формула данного вещества значительно проще. Теоретически, имеет смысл попробовать машинно переводить СМАЙЛы в нормальные формулы и считать уже их…