Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/29: Рейтинг темы: голосов - 29, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 19.10.2014
Сообщений: 153

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

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

Студворк — интернет-сервис помощи студентам
Написать функцию sum с переменным числом параметров, которая находит сумму чисел типа int по формуле:
S=a1*a2+a3*a4+a5*a6+. . . . .
Написать вызывающую функцию main, которая обращается к функции sum не менее трех раз с количеством параметров 8, 10, 12.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.11.2015, 21:02
Ответы с готовыми решениями:

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

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

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

10
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
10.11.2015, 22:52
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  [ТС]
DiffEreD, можете прокомментировать код,просто мне вообще не понятен код
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
11.11.2015, 12:47
Ну, как то так:
Кликните здесь для просмотра всего текста
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
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
11.11.2015, 13:17
DiffEreD, скорее всего, автор ожидал не variadic templates, а variadic functions.
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
11.11.2015, 13:52
Чет как-то все сложно, можно ж проще:

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
Еще такой вариант
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  [ТС]
kJIuk, можете прокомментировать cвой код,
0
16 / 16 / 10
Регистрация: 19.10.2015
Сообщений: 34
11.11.2015, 16:03
в переменном списке параметров нет информации о количестве и
типах аргументов, поэтому код должен каким-то образом определять, что ему передано
при вызове функции. Стандартная библиотека “родного” 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  [ТС]
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
шаблон функции, создающий в компиляторе функцию с необходимым количеством аргументов
она вызывает саму себя пока количество аргументов не окажется равным двум

рекурсия, и если количество аргументов нечетное, то компилироваться не будет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.11.2015, 16:27
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru