printРабочее место участника

printЗадачи

1848. WRITEF

Ограничения: время – 500ms/1000ms, память – 64MiB Ввод: input.txt или стандартный ввод Вывод: output.txt или стандартный вывод copy
Послать решение 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

Вывод для примера 2

OK
loading