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