Переписать функцию без использования библиотеки - 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; }
Объяснение кода листинга программы
- Переписывается функция
func3
, которая принимает форматную строку и переменное количество аргументов. - В функции используется указатель
pnt
, который указывает на текущий символ в форматной строке. - Указатель
p
указывает на форматную строку и используется для доступа к аргументам, передаваемым в функцию. - Переменная
value
инициализируется значением 0 и используется для хранения результата вычислений. - Переменная
c
используется для хранения значения текущего аргумента типаdouble
. - Переменная
chys
инициализируется значением 1 и используется для вычисления итогового значения. - Переменная
a
используется для хранения значения текущего аргумента типаint
. - Переменная
b
используется для хранения значения текущего аргумента типаlong
. - В функции используется оператор
switch
, который позволяет обрабатывать различные типы аргументов. - В случае
'i'
происходит получение значения аргумента типаint
и его вывод на экран. - В случае
'l'
происходит получение значения аргумента типаlong
и его вывод на экран. - В случае
'd'
происходит получение значения аргумента типаdouble
и его вывод на экран. - После обработки каждого аргумента значение переменной
chys
умножается на -2. - После обработки каждого аргумента указатель
pnt
увеличивается на 1. - Функция возвращает значение переменной
value
. - Значение переменной
value
вычисляется путем деленияchys
на аргумент соответствующего типа. - Значение переменной
value
увеличивается на результат вычисленияchys / a
. - Значение переменной
value
увеличивается на результат вычисленияchys / b
. - Значение переменной
value
увеличивается на результат вычисленияchys / c
. - Значение переменной
value
увеличивается на результат вычисленияchys / d
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д