Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
518jc
0 / 0 / 0
Регистрация: 17.06.2014
Сообщений: 9
1

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

18.01.2015, 09:34. Просмотров 566. Ответов 7
Метки нет (Все метки)

День добрый!

Задание: Целая переменная - счетчик, затем последовательность вещественных переменных. Функция возвращает сумму переменных

Написал код для решения данной задачи, но где-то похоже ошибся. Не могу понять почему не правльно работает. Можете подсказать мою обшибку? Результат работы исходного кода приложил в виде принтскрина

Просмотре похожие темы на форуме, не нашел похожей задачи, вот пришлось создавать новую тему.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#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;
}
0
Миниатюры
Разработать функцию с переменным количеством параметров для подсчета вещественных чисел  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.01.2015, 09:34
Ответы с готовыми решениями:

Разработать функцию с переменным количеством параметров
Разработать функцию с переменным количеством параметров. Для извлечения...

Разработать функцию с переменным количеством параметров
Добрый день, уважаемые программисты! Прошу помочь в поиске ошибки задание:...

Разработать функцию с переменным числом параметров для вычисления выражения
Помогите, пожалуйста, разработать функцию с переменным числом параметров (x1,...

Написать функцию с переменным количеством параметров
Написать функцию NOK с переменным количеством параметров которая находит...

Функция с переменным количеством параметров
Почему выводит всякую ерунду #include &lt;stdio.h&gt; #include &quot;stdio.h&quot; #include...

7
518jc
0 / 0 / 0
Регистрация: 17.06.2014
Сообщений: 9
18.01.2015, 09:42  [ТС] 2
в данной строчки подправил код:
C
1
 printf("number of first float paramenter: %f\n",*f); // значение первого парамета, проверка, что туда попали
0
HighPredator
5686 / 2006 / 722
Регистрация: 10.12.2010
Сообщений: 5,768
Записей в блоге: 3
19.01.2015, 11:09 3
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
float sum(const int argc, ...)
{
  int i = 0;
  float s = 0.0f;
  va_list ap;
 
  va_start(ap, argc);
  
  for(i = 0; i < argc; i++)
  {
    s = s + va_arg(ap, double);
  }
  va_end(ap);
  return s;
}
 
int main(void)
{
  printf("Float summa=%.3f\n", sum(4, 3.0f, 5.5f, 2.5f, 1.5f));
 
  return 0;
}
1
518jc
0 / 0 / 0
Регистрация: 17.06.2014
Сообщений: 9
21.01.2015, 17:45  [ТС] 4
Спасибо за ответ. Поразбираюсь в коде.
0
Evg
Эксперт CАвтор FAQ
19305 / 7160 / 533
Регистрация: 30.03.2009
Сообщений: 20,041
Записей в блоге: 30
21.01.2015, 23:05 5
Чисто на всякий случай: в реальности все float'ы будут переданы как double'ы
Распространенные ошибки

Хотя правильно писать код нужно так, как показал коллега - через va_arg, а не через самодеятельность с ковырянием в стеке. По этому поводу можно почитать "неправильную" статью Как перенести параметры из ф-ции printf() в самодельную, далее почему это неправильно - посты 27, 28, 70, 73, 76 и конкретные примеры, демонстрирующие неправильность подобного написания кода - посты 92 и 98

И научиться пользоваться литературой, потому что даже в самой зачуханной книге по Си написано, как нужно работать с функциями, с переменным числом аргументов
1
518jc
0 / 0 / 0
Регистрация: 17.06.2014
Сообщений: 9
22.01.2015, 17:11  [ТС] 6
Evg, спасибо за совет и за статью. Почитаю. Про va_arg узнал недавно. Так как на курсах про них не давали

На счет задания - лабораторная работа и неободимо было её выполнить через адресную арифметику. Приношу извинения, что возможно не уточнил это при создание темы. Но все равно, ваши ответы дали мне направления для изучения данный темы.

Про float и double, я тоже выяснил уже после создания темы. Когда заменил float на double все заработало. Хотя, до конца пока не могу понять, почему не работает с float. Ниже приведу мой рабочий код. Всем спасибо.)


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#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;
}
0
HighPredator
5686 / 2006 / 722
Регистрация: 10.12.2010
Сообщений: 5,768
Записей в блоге: 3
22.01.2015, 17:22 7
Цитата Сообщение от 518jc Посмотреть сообщение
до конца пока не могу понять, почему не работает с float
Потому что перед передачей в функцию с переменным числом аргументов float параметры расширяются до типа double. То же самое происходит с целыми меньше int.
0
Evg
Эксперт CАвтор FAQ
19305 / 7160 / 533
Регистрация: 30.03.2009
Сообщений: 20,041
Записей в блоге: 30
22.01.2015, 19:29 8
Цитата Сообщение от 518jc Посмотреть сообщение
Хотя, до конца пока не могу понять, почему не работает с float
Я же тебе ссылку дал, там всё написано
0
22.01.2015, 19:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2015, 19:29

Функция с переменным количеством параметров
Привет всем. Возникла проблема с указателем в функции. Стоит задача: создать...

Возвращение массива в функции с переменным количеством параметров
задание Пoследoвaтeльнocть вещeствeнныx пoлoжитeльныx пеpeмeнных, ограничeннaя...

Функция со сменным количеством параметров для структуры
Здравствуйте! Есть задание написать функцию со сменным количеством...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru