Разработать функцию с переменным количеством параметров - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Разработать функцию с переменным количеством параметров. Для извлечения параметров из списка использовать технологию программирования областей памяти переменного формата. 10. Последовательность вещественных массивов. Сначала идет целый параметр - размерность массива (int), затем указатель на массив значений типа double (имя массива). Значение целого параметра - 0 обозначает конец последовательности. Функция возвращает сумму всех элементов.
#include <stdio.h>
#include <conio.h>
#define N 100
 
double *d;
int A[N];
 
double sum(double n, ...)
{
    int i;
    double s;
    double *p;
    p = &n;
    for (i = 0, d = (double*)A; i < N / sizeof(double); i++)
    {
        d[i] = (double)i;
    }
 
    for(s = 0; n > 0; n--)
    {
        s += *p++;
    }
    return s;
}
 
void main()
{
    printf("%f", sum(0.5, 2.3, 12.9, 15.35));
    _getch();
}
http://www.cyberforum.ru/attachment....1&d=1461389978 Где здесь ошибки? И как правильно? Помогите, пожалуйста!

Решение задачи: «Разработать функцию с переменным количеством параметров»

textual
Листинг программы
#include <stdio.h>
#include <stdarg.h>
 
double test(int len, ...)
{
  double sum = 0.0;
 
  int i = 0;
 
  double* ptr = NULL;
 
  va_list vl;
  va_start(vl, len);
 
  ptr = va_arg(vl, double*);
 
  while (ptr != NULL)
  {
    printf("Array @ 0x%p:\n", ptr);
 
    for (i = 0; i < len; i++)
    {
      printf("%0.3f ", ptr[i]);
 
      sum += ptr[i];
    }
    printf("\n\n");
 
    ptr = va_arg(vl, double*);
  }
 
  va_end(vl);
 
  return sum;
}
 
int main(void)
{
  double d[] = {1.45, 2.43, 0.0, 4.7, 5.6};
  double q[] = {1.0, 2.0, 3.0, 4.0, 5.0};
  double z[] = {0.45, 21.0, 37.0, 44.0, 56.999};
 
  printf("sum = %0.4f\n", test(sizeof(d) / sizeof(*d), d, q, z, NULL));
 
  return 0;
}

Объяснение кода листинга программы

  1. В функции test объявлен переменный список аргументов типа double*
  2. Инициализируется переменная sum со значением 0.0
  3. Инициализируется переменная i со значением 0
  4. Инициализируется переменная ptr со значением NULL
  5. Используется функция va_start для инициализации списка аргументов
  6. Переменная ptr получает первый аргумент из списка аргументов
  7. В цикле while происходит обработка каждого массива, полученного из списка аргументов
  8. Для каждого массива выводится его содержимое с помощью цикла for
  9. К каждой итерации цикла for прибавляется значение элемента массива к переменной sum
  10. После обработки всех массивов, функция va_end освобождает ресурсы, занятые функцией va_start
  11. Функция возвращает значение переменной sum
  12. В функции main объявлены три массива d, q и z типа double*
  13. Вызывается функция test с первым аргументом - размер массива d в байтах, и остальными аргументами - массивы d, q и z
  14. Результат работы функции test выводится на экран с помощью функции printf
  15. Возвращается 0, что означает успешный конец работы программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.643 из 5
Похожие ответы