ЛР3. Списки аргументов переменной длины.

Задания

  1. (25) Создать функцию printf_real - надстройку над штатными функциями вывода. Набор аргументов printf_real должен соответствовать набору аргументов функции printf. При вызове printf_real проверяет строку формата и если в ней используются спецификаторы, требующие невещественных аргументов, завершает свою работу без какого-либо вывода и возвращет 0. В противном случае, срабатывает как printf, вызывая одну из функций форматированного вывода и передавая ей свои аргументы, а результат вызова возвращает как свой результат. Например:
     ...
     if (!printf_real("%f\n%d",17.2,10)) printf("Присутствуют невещественные аргументы\n");
     if (!printf_real("%0.2f\n%0.2f",17.2,10.0)) printf("Присутствуют невещественные аргументы\n");
     ...
    
    Результат:
    Присутствуют невещественные аргументы
    17.20
    10.00
    
  2. (25) Создать функцию, первый аргумент которой - строка формата, описывающая количество и тип последующих аргументов, а также операции, которые должны быть осуществлены над переданными аргументами. Строка формата представляет собой указание на совершение арифметических операций сложения ("+") и вычитания над целочисленными ("%d") или вещественными ("%f") аргументами. Функция возвращает результат вычислений, либо выводит информацию об ошибке и аварийно останавливает программу. Например:
     ...
     float res;
     res=worker("01%d+%d-%f",7,12,-9.1);
     printf("%.2f\n",res);
     ...
    
    Результат:
    28.10
    
  3. (30+20) Создать функцию, первый аргумент которой - строка формата, описывающая количество и тип последующих аргументов, а также операции, которые должны быть осуществлены над переданными аргументами. Строка формата представляет собой указание на системы счисления, в которых должны быть выведены последующие целочисленные аргументы ("%XXd"). "XX" представляет собой основание системы счисления, от "02" до "16". Также возможно указание на аргумент, без перехода к следующему аргументу ("%XXD"). Любые другие символы формата запрещены. Для вывода одного знака "%" следует указать "%%". Функция поддерживает перевод строки ("\n"). Все остальные символы выводятся без изменений. Функция возвращает 1, если строка сформирована корректно и 0 в противном случае. Например:
     ...
     int res;
     res=worker("Число %10D равно %16d в шестнадцатиричной системе счисления\nЧисло %10D равно %02d в двоичной системе счисления ",17,10);
     printf("\n------\n%d\n",res);
     ...
    
    Результат:
    Число 17 равно 11 в шестнадцатиричной системе счисления
    Число 10 равно 1010 в двоичной системе счисления
    11
    1010
    ------
    1