Контест Middle Исключения обновлено

Журнал транзакций: ошибки через исключения

Условие

Обработайте журнал операций по счетам. Каждая строка должна содержать ровно два поля: имя счёта и целое число (знак + или - допустим, только цифры, без дробной части и пробелов внутри). Операция прибавляет число к балансу счёта (новые счета начинаются с 0). Для каждой строки выведите:

  • OK, если операция применена;
  • ERROR format, если полей не два;
  • ERROR number, если второе поле не целое число;
  • ERROR range, если число не помещается в long long;
  • ERROR funds, если баланс стал бы отрицательным (операция не применяется).

После журнала выведите все счета, с которыми прошла хотя бы одна успешная операция, по возрастанию имён: имя баланс. Гарантируется, что балансы остаются в пределах long long.

Сделайте разбор и проверки функциями, которые бросают исключения (std::stoll бросает std::invalid_argument и std::out_of_range, а нехватку средств опишите своим классом-наследником std::runtime_error), и обработайте их в одном месте.

Ввод: n (1 ≤ n ≤ 2000), затем n строк.

Вывод: n строк с результатами, затем балансы.

Пример 1

Ввод:

5
ann 100
ann -150
bob 12x
ann
ann -100

Вывод:

OK
ERROR funds
ERROR number
ERROR format
OK
ann 0

Пример 2

Ввод:

3
x 99999999999999999999
y +5
z -0

Вывод:

ERROR range
OK
OK
y 5
z 0

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.

Термины по теме