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

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

18.01.2015, 09:34. Просмотров 529. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Разработать функцию с переменным количеством параметров для подсчета вещественных чисел (C (СИ)):

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

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

Разработать функцию с переменным числом параметров для вычисления выражения
Помогите, пожалуйста, разработать функцию с переменным числом параметров (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
5647 / 1964 / 716
Регистрация: 10.12.2010
Сообщений: 5,691
Записей в блоге: 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
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,441
Записей в блоге: 30
21.01.2015, 23:05 #5
Чисто на всякий случай: в реальности все float'ы будут переданы как double'ы
http://www.cyberforum.ru/c-beginners/thread1267080.html#post6672582

Хотя правильно писать код нужно так, как показал коллега - через va_arg, а не через самодеятельность с ковырянием в стеке. По этому поводу можно почитать "неправильную" статью http://www.cyberforum.ru/cpp-beginne...ml#post1725684, далее почему это неправильно - посты 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
5647 / 1964 / 716
Регистрация: 10.12.2010
Сообщений: 5,691
Записей в блоге: 3
22.01.2015, 17:22 #7
Цитата Сообщение от 518jc Посмотреть сообщение
до конца пока не могу понять, почему не работает с float
Потому что перед передачей в функцию с переменным числом аргументов float параметры расширяются до типа double. То же самое происходит с целыми меньше int.
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,441
Записей в блоге: 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я...

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

Составить функцию подсчета всех возможных сумм чисел в строке
Составить функцию подсчета всех возможных сумм чисел в строке. Пример: 3...

Функция с переменным количеством аргументов
Написал вот такой хелловорлд, использующий функцию с переменным количеством...


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

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

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