Ограничения: время – 500ms/1000ms, память – 64MiB Ввод: input.txt или стандартный ввод Вывод: output.txt или стандартный вывод
Послать решение Blockly Посылки Темы Где Обсудить (0)
Для управления своими машинами Трурль пишет программы на языке Пи, соединившем в себе все
достоинства и недостатки языков Си и Паскаль.
В языке Пи можно обрабатывать данные следующих типов: int (16-битовое знаковое целое),
longint (32-битовое знаковое целое), single (32-битовое вещественное число),
double (64-битовое вещественное число), extended (80-битовое вещественное число),
char (символ), string (строка произвольной длины, оканчивающая символом с кодом 0).
Для форматированного вывода результатов в языке Пи используется специальный оператор WRITEF. Оператор WRITEF
вызывается с одним и более аргументами. Первым аргументом является строка, содержащая
спецификации форматов, применяемые к остальным аргументам оператора. Кроме спецификаций формата строка
содержит символы, выводимые без изменений. Для некоторых символов существует специальное обозначение, начинающее
с символа '\' (обратная косая черта). Переход на новую строку обозначается \n,
табуляция – \t, кавычки – \".
Порядок спецификаций формата должен соответствовать порядку выводимых значений. Каждая спецификация формата
имеет следующую форму:
% [флаги] [ширина] [. точность] формат
флаги (опционально) | Флаг '-' указывает на выравнивание влево, а флаг '+' – на необходимость вывода знака результата (+ или –). |
ширина (опционально) | Указывает минимальный размер поля для вывода значения. Ширина может быть задана двумя способами: 1) явно, как последовательность десятичных цифр (если ширина начинается с символа 0, то выводимое значение дополняется слева нулями); 2) неявно с помощью символа '*' (звездочка), значение для ширины содержится в списке аргументов, этот аргумент должен иметь тип int и предшествовать выводимому значению. |
точность (опционально) | Указывает максимальное число знаков (или число десятичных знаков для вещественных чисел) для вывода значения. Точность может быть задана двумя способами: 1) явно, как последовательность десятичных цифр; 2) неявно с помощью символа '*' (звездочка), значение для точности содержится в списке аргументов, этот аргумент должен иметь тип int и предшествовать выводимому значению. |
формат | Указывает тип выводимого значения. Для вывода значения типа int используется формат 'd', для longint – 'ld', для single – 'f', 'e', 'g', 'E' и 'G', для double – 'lf', 'le', 'lg', 'lE' и 'lG', для extended – 'Lf', 'Le', 'Lg', 'LE' и 'LG', для char – 'c', для string – 's'. |
Так как символ '%' является признаком начала спецификации формата, то для вывода символа '%' в
строке указывают последовательность '%%'.
Одним из существенных недостатков WRITEF является отсутствие проверки соответствия числа и типа
аргументов спецификациям формата в строке. Напишите программу, которая позволит Трурлю проверить корректность
аргументов оператора WRITEF. Спецификации формата в строке и список аргументов оператора WRITEF обрабатываются
последовательно, слева направо. При обнаружении первой ошибки проверку нужно завершить
и выдать сообщение об ошибке. Программа должна обнаруживать три вида ошибок.
- Тип выводимого значения не соответствует спецификации формата.
- Спецификаций форматов больше, чем количество выводимых значений.
- Есть аргументы, для которых нет спецификаций формата.
Формат ввода
Во входном файле в первой строке содержится целое число `N` (`0\ <\ N\ ≤\ 50`) – количество аргументов у
оператора WRITEF. Во второй строке (длиной не более 200 символов) указывается первый аргумент – строка в кавычках,
содержащая корректные спецификации форматов. Далее следует `(N-1)` строка, содержащая имена типов
остальных аргументов. Количество и типы аргументов могут не соответствовать спецификациям форматов.
Формат вывода
В выходной файл вывести одну строку – сообщение "OK" или сообщение об ошибке в форме "ERROR #",
где # – номер ошибки от 1 до 3.
Пример ввода 1
3
"a[%d]=%*.2lf\n"
int
double
Вывод для примера 1
ERROR 1
Пример ввода 2
4
"a[%d]=%*.2lf\n"
int
int
double