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

printЗадачи

1848. WRITEF

Ограничения: время – 500ms/1000ms, память – 64MiB Ввод: input.txt или стандартный ввод Вывод: output.txt или стандартный вывод copy
Послать решение Blockly Посылки Темы Где Обсудить (1)

Для управления своими машинами Трурль пишет программы на языке Пи, соединившем в себе все достоинства и недостатки языков Си и Паскаль.
В языке Пи можно обрабатывать данные следующих типов: 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 обрабатываются последовательно, слева направо. При обнаружении первой ошибки проверку нужно завершить и выдать сообщение об ошибке. Программа должна обнаруживать три вида ошибок.
  1. Тип выводимого значения не соответствует спецификации формата.
  2. Спецификаций форматов больше, чем количество выводимых значений.
  3. Есть аргументы, для которых нет спецификаций формата.
Формат ввода
Во входном файле в первой строке содержится целое число `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