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

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

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

День добрый! Задание: Целая переменная - счетчик, затем последовательность вещественных переменных. Функция возвращает сумму переменных Написал код для решения данной задачи, но где-то похоже ошибся. Не могу понять почему не правльно работает. Можете подсказать мою обшибку? Результат работы исходного кода приложил в виде принтскрина Просмотре похожие темы на форуме, не нашел похожей задачи, вот пришлось создавать новую тему.
#include <stdlib.h>
#include <stdio.h>
 
float sum(int n,...);// прототип функции
 
void main()
{
    printf("Float summa=%.3f\n", sum(3,5.5,2.5,1.5));
}
 
float sum(int n,...)
{
    int *p=&n+1;// определение и инициалазация указателя на счетчик
                          //  и берем адрес первой вещественной переменной
    float s;// сумма 
    float *f;// указателя для вещественных переменных
 
    f=(float*)p;// указываем, что дальше будем работать с переменным типа float
 
    printf("address n=%p\n",&n); // проверка адреса, просто чтобы посмотреть, что получаем адрес
    printf("address p=%p\n",p); // проверка адреса, просто чтобы посмотреть, что получаем адрес
    printf("address f=%p\n",f); // проверка адреса, просто чтобы посмотреть, что получаем адрес
 
    printf("number of first float paramenter: %d\n",*p); // значение первого парамета, проверка, что туда попали
 
    for(s=0;n>0;n--) // цикл суммирования вещественных чисел
    {
        s+=*f++;
        printf("%.3f\n",s); // мониторинг, что происходит сумма вещественных переменных
    }
    return s;
}

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

textual
Листинг программы
#include <stdlib.h>
#include <stdio.h>
 
float sum(int n,...);
 
void main()
{
    printf("Float summa=%.3lf\n", sum(4,5.5,2.5,1.5,2.5));
}
 
float sum(int n,...)
{
    int *p=&n+1;
    double s;
    double *f;
 
    f=(double*)p;
    
 
    for(s=0;n>0;n--)
    {
        s+=*f++;
    }
    return s;
}

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

  1. Включаем необходимые заголовочные файлы для работы с переменными и функциями.
  2. Объявляем функцию с переменным количеством параметров sum(int n,...).
  3. В функции main() выводим результат вычисления функции sum на экран.
  4. Внутри функции sum() перебираем все передаваемые параметры, начиная со второго (n=1, поскольку n не относится к числовым параметрам).
  5. Создаем указатель на первый нетипированный параметр и инициализируем его значением n+1.
  6. Инициализируем переменную s значением 0 и переменную f значением n.
  7. Перемещаем указатель f на следующий нетипированный параметр.
  8. В цикле прибавляем к переменной s значение каждого нетипированного параметра, начиная с первого и до последнего, с шагом -1, т.е. уменьшаем значение n на единицу при каждой итерации.
  9. Возвращаем переменную s из функции.

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


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

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

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