Переписать функцию без использования библиотеки - C (СИ)

Узнай цену своей работы

Формулировка задачи:

нужно сделать функцию похожую на 3, но без использования библиотеки <stdarg.h>
#include <stdio.h>
#include <stdarg.h>
 
double func1(int k, double x, ...);
double func2(double x, ...);
double func3(char *format, ...);
 
int main(void)
{
    double value;
    value = func1(4, 12.0, 7.0, 3.5, 19.0);
    printf("Result 1: %.4lf\n", value);
    value = func2(12.0, 7.0, 3.5, 19.0, 0.0);
    printf("Result 2: %.4lf\n", value);
    value = func3("iddl", 12, 7.0, 3.5, 19);
    printf("Result 4: %.4lf\n", value);
    return 0;
}
 
double func1(int k, double x, ...)
{
    double *pnt, value = 0, chys = 1;
 
    for (pnt = &x; k > 0; pnt++, k--)
    {
        value += chys / (*pnt);
        chys *= -2;
    }
    return value;
}
 
double func2(double x, ...)
{
    double *pnt, value = 0, chys = 1;
    for (pnt = &x; *pnt != 0; pnt++)
    {
        value += chys / (*pnt);
        chys *= -2;
    }
    return value;
}
 
double func3(char *format, ...)
{
    char *pnt = format;
    double value = 0, c, chys = 1;
    int a;
    long b;
    va_list p;
    va_start(p, format);
    while (*pnt != '\0')
    {
        switch (*pnt){
        case 'i': a = va_arg(p, int);
            value += chys / a;
            break;
        case 'l': b = va_arg(p, long);
            value += chys / b;
            break;
        case 'd': c = va_arg(p, double);
            value += chys / c;
        }
        chys *= -2;
        pnt++;
    }
    va_end(p);
    return value;
}

Решение задачи: «Переписать функцию без использования библиотеки »

textual
Листинг программы
double func3(char *format, ...)
{
 
    char *pnt = format;
    char **p = &format;
    double value = 0, c, chys = 1;
    int a;
    long b;
 
    p++;
 
    while (*pnt != '\0')
    {
        switch (*pnt) {
        case 'i': a = *((int *)p);
            printf("&a=%p  a=%d\n", p, a);
            p++;
            value += chys / a;
            break;
        case 'l': b = *((long *)p);
            printf("&b=%p  b=%ld\n", p, b);
            p++;
            value += chys / b;
            break;
        case 'd': c = *((double *)p);
            printf("&c=%p  c=%lf\n", p, c);
            p++;
            p++;
            value += chys / c;
            break;
        }
        chys *= -2;
        pnt++;
    }
 
    return value;
}

Объяснение кода листинга программы

  1. Переписывается функция func3, которая принимает форматную строку и переменное количество аргументов.
  2. В функции используется указатель pnt, который указывает на текущий символ в форматной строке.
  3. Указатель p указывает на форматную строку и используется для доступа к аргументам, передаваемым в функцию.
  4. Переменная value инициализируется значением 0 и используется для хранения результата вычислений.
  5. Переменная c используется для хранения значения текущего аргумента типа double.
  6. Переменная chys инициализируется значением 1 и используется для вычисления итогового значения.
  7. Переменная a используется для хранения значения текущего аргумента типа int.
  8. Переменная b используется для хранения значения текущего аргумента типа long.
  9. В функции используется оператор switch, который позволяет обрабатывать различные типы аргументов.
  10. В случае 'i' происходит получение значения аргумента типа int и его вывод на экран.
  11. В случае 'l' происходит получение значения аргумента типа long и его вывод на экран.
  12. В случае 'd' происходит получение значения аргумента типа double и его вывод на экран.
  13. После обработки каждого аргумента значение переменной chys умножается на -2.
  14. После обработки каждого аргумента указатель pnt увеличивается на 1.
  15. Функция возвращает значение переменной value.
  16. Значение переменной value вычисляется путем деления chys на аргумент соответствующего типа.
  17. Значение переменной value увеличивается на результат вычисления chys / a.
  18. Значение переменной value увеличивается на результат вычисления chys / b.
  19. Значение переменной value увеличивается на результат вычисления chys / c.
  20. Значение переменной value увеличивается на результат вычисления chys / d.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5
Похожие ответы