Школа179: /Информатика//Информатика / Олимпиады/2008//Информатика / Олимпиады / 2008 / Школьная//Информатика / Олимпиады / 2008 / Школьная / Разбор/E
 

Разбор задачи 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.