Искусственный интеллект. Строки, контекст и волны на Паскале. Сергей Соболенко
Читать онлайн книгу.описали Year (год), Month (месяц), Day (день) и Day_of_week (день недели); а также их строковые версии: Years, Months, Days. (Поскольку день недели в данном случае нам не интересен, мы не будем заниматься его описанием и преобразованием).
Первоначально, получив из операционной системы информацию о дате в формате чисел «GetDate (year, month, day, day_of_week)», мы прибавляем к числовому значению дня единицу «Inc (day)», и смотрим, что из этого получится.
В операторе сравнения с перечислением «Case» мы выбираем варианты сценариев. В месяце однозначно не может быть 32 дня, поэтому сталкиваясь с этим числом, мы присваиваем переменной дня единицу и увеличиваем значение месяца на единицу. Но если на дворе был декабрь? Мы помним об этом, и если это так (числовое значение месяца «Month» превратилось в 13), то прибавляем к году единицу «Inc (year)», если сегодня 31 декабря.
Но как мы помним – 31-ый день бывает не в каждом месяце; поэтому мы включаем в исключения и 31-ые числа ноября, сентября, июня и апреля, – если таковые получились, то значение месяца «Month» так же увеличиваем на единицу, а значению дня «Day» присваиваем 1.
Число 30 невозможно даже после крайне редкого дня «29 февраля», поэтому мы предусматриваем и его в виде исключения.
И наконец, 29 февраля бывает не в каждом месяце. Поэтому если мы встречаем такой вариант, нам необходимо уточнить, является ли год високосным или нет.
Точное определение високосного года звучит так:
«Год високосный, если он делится на четыре без остатка, но если он делится на 100 без остатка, это не високосный год. Однако, если он делится без остатка на 400, это високосный год.»
То есть, в данном случае, если мы видим попадание в одно из условий, когда год не делится на 4 без остатка, либо когда делится на 100, но не делится на 400, то считаем этот год обычным и следующим днем считается 1 марта.
Затем мы присваиваем в очередном блоке сравнений case значение месяцев в нужном нам склонении: «января», «февраля» и так далее. И наконец, в результате преобразований числовых данных в строковые, получаем итоговый, нужный результат.
Теперь мы рассмотрим обратную процедуру Val (S, N, R), где происходит преобразование S – строки, в N – число, с сообщении об ошибке (или ее отсутствие) в R.
Ниже приведен фрагмент программы в которой число, записанное в строковой переменной S преобразуется в N. Результат операции R при этом сообщит нам, есть ли в преобразовании ошибка (код R <> 0) или ошибка отсутствует (R=0).
Илл. 28. Пример использования процедуры преобразования строки S в число N с результатом преобразования R, с помощью процедуры Val.
Теперь мы рассмотрим процедуру для преобразования фрагмента текста с использованием дополнительной информации. Предположим, мы имеем текст статьи, который необходимо дополнить некоторыми строковыми данными. В статье может встретиться употребление информации о процентах, которое мы должны расширить, например, «95%» заменить на фразу «почти все (95%)». Также при встрече дробного процентного показателя,