Разбор задачи E
Условия задачи пятого тура
Идея решения. В глобальной переменной Roman записана строка – римское число, в переменной Arabic – ее числовое значение. Первоналально оно равно нулю, в ходе разбора это значение будет увеличиваться. Переменная Position хранит количество уже успешно считанных и разобранных символов из переменной Roman.
Основная функция – это функция Read. Она получает два параметра: строку, соответствующую одной группе символов, которые считываются из переменной Roman и их числовое значение. Например, вызов Read(«IX»,9) – это попытка считать из переменной Roman последовательность символов IX.
Считывание символов производится начиная с позиции Position. Считывание успешным, если строка Roman после пропуска первых Position символов совпадает с группой. Если считывание было успешным, то к значению Arabic прибавляется числовое значение группы (второй паараметр функции Read), а значение Position увеличивается на значение длины группы и функция Read возвращает true. Если считывание неуспешно, фунция Read возвращает false.
В функции main считывается значение Roman, далее осуществляется разбор строки. При этом используется особенность неполного вычисления логических выражений, например, при вызове Read(«MMM», 3000) || Read("MM", 2000) || Read(«M», 1000) сначала вызывается функция Read(«MMM», 3000). Если она вернула true, то две другие функции не вызываются, а если вернула false, то вызывается Read(«MM», 2000). В свою очередь, Read(«M», 1000) вызывается только если два предыдущих вызова вернули false.
В функции main осуществляются последовательные попытки считать количество тысяч, сотен, десятков и единиц. Если после этого были считаны все символы, значит, запись римского числа корректна и выводится значение Arabic, иначе (остались несчитанные символы) запись некорректна и выводится 0.