0 / 0 / 0
Регистрация: 19.10.2014
Сообщений: 153
1

Функции с переменным числом параметров

10.11.2015, 21:02. Показов 5617. Ответов 10
Метки нет (Все метки)

Написать функцию sum с переменным числом параметров, которая находит сумму чисел типа int по формуле:
S=a1*a2+a3*a4+a5*a6+. . . . .
Написать вызывающую функцию main, которая обращается к функции sum не менее трех раз с количеством параметров 8, 10, 12.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2015, 21:02
Ответы с готовыми решениями:

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

Функции с переменным числом параметров
функции с переменным числом параметров в качестве параметра форматная строка,как задать это дело в...

Функции с переменным числом параметров
Прошу помочь знатоков С++ в решении задачи, т.к. только начал изучать данный язык. Решить...

Функции с переменным числом параметров
#include <iostream.h> #include <conio.h> int max(int k,...) { int *p=&k; int maxi; ...

10
1456 / 793 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
10.11.2015, 22:52 2
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 <iostream>
#include <iterator>
#include <type_traits>
#include <algorithm>
#include <valarray>
 
template <typename ... Nums>
auto sum(Nums ... args) -> typename std::common_type<Nums...>::type
{
    static_assert(sizeof...(args) % 2 == 0, "number of arguments must be even");
 
    using comm_t = typename std::common_type<Nums...>::type;
    std::valarray<comm_t> num_sequence{static_cast<comm_t>(args) ...};
    std::valarray<comm_t> first_range =  num_sequence[std::slice(0, sizeof...(args)/2, 1)];
    std::valarray<comm_t> second_range = num_sequence[std::slice(1, sizeof...(args)/2, 1)];
 
    comm_t res = 0;
    return std::inner_product(std::begin(first_range), std::end(first_range),
                              std::begin(second_range), res);
}
 
int main()
{
    std::cout << sum(3,2, 3,2, 3,2, 5,2, 6.02,1);
}
Добавлено через 12 минут
Кликните здесь для просмотра всего текста
со слайсами напутал., должно быть так:
C++
1
2
std::valarray<comm_t> first_range =  num_sequence[std::slice(0, sizeof...(args)/2, 2)];
std::valarray<comm_t> second_range = num_sequence[std::slice(1, sizeof...(args)/2, 2)];
4
0 / 0 / 0
Регистрация: 19.10.2014
Сообщений: 153
11.11.2015, 12:04  [ТС] 3
DiffEreD, можете прокомментировать код,просто мне вообще не понятен код
0
1456 / 793 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
11.11.2015, 12:47 4
Ну, как то так:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template <typename ... Nums> //шаблон с переменным количеством параметров
auto sum(Nums ... args) -> 
typename std::common_type<Nums...>::type // вывод общего типа для пакета типов
{
    static_assert(sizeof...(args) % 2 == 0, "number of arguments must be even");  //провека количества аргументов
                                                                                  //переданных функции на четность
 
    using comm_t = typename std::common_type<Nums...>::type; //обявление псевдонима типа для общего типа пакета типов
    std::valarray<comm_t> num_sequence{static_cast<comm_t>(args) ...}; //контейнер со всеми аргументами, переданные ф-ции
    std::valarray<comm_t> first_range =  num_sequence[std::slice(0, sizeof...(args)/2, 2)]; //срезка элемментов начиная с позиции 0 и через каждые 2 эллемента 
    std::valarray<comm_t> second_range = num_sequence[std::slice(1, sizeof...(args)/2, 2)]; //срезка элемментов начиная с позиции 1 и через каждые 2 эллемента
 
    comm_t res = 0;
    return std::inner_product(std::begin(first_range), std::end(first_range), // inner_product - стандартный алгоритм, в пояснении не нуждаеться
                              std::begin(second_range), res);
}
std::common_type
std::slice
std::inner_product
По variadic templates можно почитать тут: Нововведения в шаблонах
1
3254 / 2056 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
11.11.2015, 13:17 5
DiffEreD, скорее всего, автор ожидал не variadic templates, а variadic functions.
0
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
11.11.2015, 13:52 6
Чет как-то все сложно, можно ж проще:

C++
1
2
3
4
5
6
7
8
9
10
int sum(int a, int b)
{
    return a * b;
}
 
template <typename... Nums>
int sum(int a, int b, Nums... nums)
{
    return sum( a, b ) + sum(nums...);
}
http://ideone.com/INoIqh
3
16 / 16 / 10
Регистрация: 19.10.2015
Сообщений: 34
11.11.2015, 14:52 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
33
34
#include <iostream>
#include <cstdarg>
using std::cout;
using std::endl;
 
int sum(int count, ...)
{
    if (count <= 0)
        return 0;
    int sum(0);
 
    va_list arg_ptr;                    
    va_start(arg_ptr, count);            
    
 
    count /= 2;
    for (int i = 0; i < count; i++)
    {
        int tmp = va_arg(arg_ptr, int);
        sum += tmp * va_arg(arg_ptr, int);
    }
    va_end(arg_ptr);                 
    return sum;
}
 
int main(int argc, char* argv[])
{
    cout << sum(8, 1, 2, 1, 2, 1, 2, 1, 2) << endl;
    cout << sum(10, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2) << endl;
    cout << sum(12, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2) << endl;
 
    getchar();
    return 0;
}
0
0 / 0 / 0
Регистрация: 19.10.2014
Сообщений: 153
11.11.2015, 15:46  [ТС] 8
kJIuk, можете прокомментировать cвой код,
0
16 / 16 / 10
Регистрация: 19.10.2015
Сообщений: 34
11.11.2015, 16:03 9
в переменном списке параметров нет информации о количестве и
типах аргументов, поэтому код должен каким-то образом определять, что ему передано
при вызове функции. Стандартная библиотека “родного” C++ определяет в файле за*
головка сstdarg.h макросы va_start, va_arg и va_end, которые могут в этом помочь.

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <cstdarg>
using std::cout;
using std::endl;
 
int summ(int, int);
template<typename...Name>
int summ(int, int, Name...);
int sum(int count, ...)
{
    if (count <= 0)
        return 0;
    int sum(0);
 
    va_list arg_ptr;                    // Объявление указателя на список аргументов
    va_start(arg_ptr, count);            // Установить arg_ptr на 1-й необязательный
                                        // аргумент
    
    /*Макрос  va_arg  возвращает  находящееся  по  адресу  arg_ptr  значение  аргумента  и
увеличивает  его  так,  чтобы  он  указывал  на  следующее  по  порядку  значение.  Второй  ар*
гумент  макроса  va_arg  —  это  тип  аргумента,  определяющий  интерпретацию  значения,
которое  вы  получаете,  а  также  размер  инкремента  arg_ptr*/
    count /= 2; //Количество сумм в 2 раза меньше количества аргументов
    for (int i = 0; i < count; i++)
    {
        int tmp = va_arg(arg_ptr, int);        // Прибавить значение int из arg_ptr и перейти к следующему
        sum += tmp * va_arg(arg_ptr, int);     // Умножаем предыдущее на текущее значение
    }
    va_end(arg_ptr);                 // Обнулить указатель
    return sum;
}
 
int main(int argc, char* argv[])
{
    cout << sum(8, 1, 2, 1, 2, 1, 2, 1, 2) << endl;
    cout << sum(10, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2) << endl;
    cout << sum(12, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2) << endl;
 
    cout << summ(1, 2, 1, 2, 1, 2, 1, 2) << endl;
    cout << summ(1, 2, 1, 2, 1, 2, 1, 2, 1, 2) << endl;
    cout << summ(1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,1) << endl;
    getchar();
    return 0;
}
 
 
int summ(int a, int b)
{
    return a * b;
}
 
template<typename...Name>
int summ(int a, int b, Name...names )
{
    return summ(a, b) + summ(names...);
}
Добавил вариант Voivoid, красава
1
0 / 0 / 0
Регистрация: 19.10.2014
Сообщений: 153
11.11.2015, 16:21  [ТС] 10
kJIuk, можете пояснить пожалуйста кусок кода?
C++
1
2
3
4
5
template<typename...Name>
int summ(int a, int b, Name...names )
{
    return summ(a, b) + summ(names...);
}
0
16 / 16 / 10
Регистрация: 19.10.2015
Сообщений: 34
11.11.2015, 16:27 11
шаблон функции, создающий в компиляторе функцию с необходимым количеством аргументов
она вызывает саму себя пока количество аргументов не окажется равным двум

рекурсия, и если количество аргументов нечетное, то компилироваться не будет
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.11.2015, 16:27
Помогаю со студенческими работами здесь

Функции с переменным числом параметров
Такая проблема есть код который должен выводить поочередно цифры, 1 2 3 4 5, я пытаюсь...

Функции с переменным числом параметров
Добрый день, уважаемые знатоки С++! Подскажите пожалуйста, что не правильно в моем коде? ...

Функции с переменным числом параметров
помогите доработать пожалуйсто Написать функцию kvadr с переменным числом параметров, ...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru