Разработать функцию с переменным числом параметров для вычисления выражения - C (СИ)
Формулировка задачи:
Помогите, пожалуйста, разработать функцию с переменным числом параметров (x1, x2, x3, x4, ...), которая вычисляет значение выражения:
- известно, что количество параметров функции парная.
Решение задачи: «Разработать функцию с переменным числом параметров для вычисления выражения»
textual
Листинг программы
double Chartoint(char* ); double func2(char *type, ...) { char *t = type, key = 1; void *i = &type + 1; int counter = 0; int sum1 = 0, sum2 = 0; for (; *(t) != '\0'; t++) { if (key == 1) { if (*(t) == '0'){ sum1 = sum1 * Chartoint(*(char**)i); i = (char**)i + 1; } else{ sum1 = sum1 * *((int*)i); i = (int*)i + 1; } } else { if (*(t) == '0') { sum2 *= Chartoint(*(char**)i); i = (char**)i + 1; } else { sum2 *= *((int*)i); i = (int*)i + 1; } } key = -key; counter++; } if (counter % 2 == 0) { double rez = (double)sum1 - sum2; printf("\nСума для другого варіанту рівна %.2lf", rez); return (sum1-sum2); } puts("Error"); } double Chartoint(char *ch) { double sum = 0.0; char*p = ch; for (; *(p) != '\0'; p++) { sum = sum * 10 + (*(p)-48); } return sum; }
Объяснение кода листинга программы
Список элементов кода:
- *double Chartoint(char );** - объявление функции
Chartoint
для преобразования строки в целое число. - *double func2(char type, ...)** - объявление функции
func2
с переменным числом аргументов. - *char t = type;** - инициализация переменной
t
для хранения символов строкиtype
. - *void i = &type + 1;** - инициализация указателя
i
для работы с аргументами функцииfunc2
. - int counter = 0; - инициализация переменной
counter
для подсчета количества пар чисел. - int sum1 = 0, sum2 = 0; - инициализация переменных
sum1
иsum2
для хранения сумм чисел. - *for (; (t) != '\0'; t++)** - цикл по всем символам строки
type
. - if (key == 1) - проверка, является ли текущий символ '0'.
- *if ((t) == '0')** - проверка, является ли текущий символ '0'.
- sum1 = sum1 Chartoint((char)i);** - умножение
sum1
на результат функцииChartoint
для текущего аргумента. - i = (char)i + 1;** - увеличение указателя
i
для перехода к следующему аргументу. - else - если текущий символ не '0'.
- *sum1 = sum1 ((int)i);** - умножение
sum1
на текущее целое число. - *i = (int)i + 1;** - увеличение указателя
i
для перехода к следующему аргументу. - else - если текущий символ не '0'.
- sum2 = Chartoint((char)i);** - умножение
sum2
на результат функцииChartoint
для текущего аргумента. - i = (char)i + 1;** - увеличение указателя
i
для перехода к следующему аргументу. - key = -key; - смена значения переменной
key
на противоположное. - counter++; - увеличение переменной
counter
на единицу. - if (counter % 2 == 0) - проверка, является ли
counter
четным числом. - double rez = (double)sum1 - sum2; - вычисление разности
sum1
иsum2
и сохранение результата в переменнойrez
. - printf(
\nСума для другого варіанту рівна %.2lf
, rez); - вывод значения переменнойrez
на экран. - return (sum1-sum2); - возврат разности
sum1
иsum2
из функции. - *charp = ch;** - инициализация указателя
p
для работы со строкойch
. - *for (; (p) != '\0'; p++)** - цикл по всем символам строки
ch
. - sum = sum 10 + ((p)-48); - вычисление значения числа, представляющего текущий символ.
- return sum; - возврат значения переменной
sum
из функции.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д