Переписать функцию без использования библиотеки - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д