Переписать функцию без использования библиотеки - 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.