Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 27.09.2015
Сообщений: 26

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

19.09.2016, 10:18. Показов 5237. Ответов 58
Метки нет (Все метки)

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

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

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
void Find_MinElement(int k, ...)
{
    
    int *p = &k;
    int min = 0;
    int temp = 0;
    for (; k != 0; k--)
    {
        if ((k % 2 == 0) && (*p < *(++p)))
        {
            cout << "yes";
            temp = *p;
            *p = *(++p);
            *(++p) = *p;
            p++;
        }
        cout << *p;
    }
 
}
 
int main()
{
 
setlocale(LC_ALL, "Russian");
cout << "Минимальный в элемент: ";  Find_MinElement(5, 4, 3, 2,4,6);
 
system("pause");
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.09.2016, 10:18
Ответы с готовыми решениями:

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

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

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

58
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
22.09.2016, 02:40
Студворк — интернет-сервис помощи студентам
notAll, на просторах инета было найдено это:
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
//General definition of the helper class
template <typename ...Args> struct FromVariadic;
 
//This specialization does the actual job: it splits the whole pack
//into 2 parts: one single type T and the rest of types Args...
//As soon as it is done T is added to an mpl::vector.
//"bottom--up" recursion is used to fetch all types
template <class T, typename ...Args>
struct FromVariadic<T, Args...>
{
    typedef typename boost::mpl::push_front<typename FromVariadic<Args...>::type, T>::type type;
};
 
//This is a specialization for the case when only one type is passed
//and also finishes recursive descent
template <class T>
struct FromVariadic<T>
{
    typedef boost::mpl::vector<T> type;
};
 
//This one handles the case when no types where passed at all
template <>
struct FromVariadic<>
{
    typedef boost::mpl::vector<> type;
};
используя это, можно сделать так:
C++
1
2
3
4
5
6
7
8
9
10
template<typename T, T...t>
constexpr T minEven() {
    typedef boost::mpl::vector_c<T, t...> vec;
        typedef typename boost::mpl::min_element<
              vec
            >::type iter;
    return boost::mpl::deref<iter>::type::value;
}
 
static_assert(std::is_same<boost::mpl::int_<minEven<int,1,7,0,-2,5,-1>()>,boost::mpl::int_<-2>>::value,"");
работает в компайл-тайме, но это не то, что нужно... если суметь намутить преобразование FromVariadic не в mpl::vector, а в mpl::vector_c, то можно будет сделать функцию minEven в компайл-тайме работающую уже так: minEven<int>(1,7,0,-2,5,-1)...

Добавлено через 1 час 25 минут
т.к. такое не сработает:
C++
1
2
3
4
5
6
7
8
template<typename T, typename...Args>
constexpr T minEven(Args&&...args) {
    typedef typename FromVariadic<Args...>::type vec;
        typedef typename boost::mpl::min_element<
              vec
            >::type iter;
    return boost::mpl::deref<iter>::value;
}
2
0 / 0 / 0
Регистрация: 27.09.2015
Сообщений: 26
22.09.2016, 08:29  [ТС]
Вижу новый стандарт С++) скорее бы тоже перейти к таким серьезным вещам, но пока что я новичок) Спасибо за помощь)
0
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
22.09.2016, 10:11
tapochka, мне было интересно увидеть решение на boost::hana. На boost::mpl все же как то громоздко и не естественно получается.

Добавлено через 1 минуту

Не по теме:

Да и название по прикольнее - хана :)

0
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
22.09.2016, 11:58
notAll, просто хана не чистый компайл-тайм, а так, конечно, интуитивно более-понятный имхо

Цитата Сообщение от slater Посмотреть сообщение
Вижу новый стандарт С++) скорее бы тоже перейти к таким серьезным вещам, но пока что я новичок) Спасибо за помощь)
да из-за этих самых "серьезных" вещей люди и уходят на другие языки, тут не переборщить бы
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
23.09.2016, 17:01
Цитата Сообщение от notAll Посмотреть сообщение
А как можно приспособить этот код что бы в компайл тайме работал?
хз, я не осилил

Добавлено через 4 часа 53 минуты
А, не, все так осилил:

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 <boost/hana.hpp>
#include <iostream>
 
using namespace boost::hana;
using namespace boost::hana::literals;
 
template <typename... Args>
constexpr auto minEven(Args...args) {
  auto values = make_tuple(args...);
  auto indexes = to_tuple(make_range(0_c, length(values)));
  auto indexedValues = zip(values, indexes);
 
  auto filteredIndexedValues = remove_if(indexedValues, [](const auto& v) {
      return int_c<v[1_c]> % 2_c == 0_c;
  });
 
  auto filteredValues = transform(filteredIndexedValues, front);
 
  return minimum(filteredValues);
}
 
int main() {
  constexpr auto x = minEven(5,4,3,2,4,6);
  std::cout << x << std::endl;
}
http://melpon.org/wandbox/perm... 3um2oeuKr9
3
 Аватар для zarko97
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
05.03.2017, 23:52
Voivoid, ОЧ КРУТО!
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.03.2017, 02:32
Цитата Сообщение от Voivoid Посмотреть сообщение
auto indexes = to_tuple(make_range(0_c, length(values)));
что такое 0_c ?


upd:
вопрос снимается
is a C++14 user-defined literal creating a compile-time number
0
 Аватар для zarko97
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
09.03.2017, 08:32
без шаблонов вариант:
C++
1
2
3
4
5
6
7
8
template<class T>
void min_elem(std::initializer_list<T>&& lst)
{
    std::vector<T> vec;
    std::copy(std::make_move_iterator(lst.begin()), std::make_move_iterator(lst.end()), std::back_inserter(vec));
    std::sort(vec.begin(), vec.end());
    std::cout << vec[1];
}
0
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
09.03.2017, 11:23
zarko97, ты не понял условия задачи - Найти минимальный из элементов в списке параметров, стоящих на четных местах
0
 Аватар для zarko97
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
09.03.2017, 16:03
notAll, в универ торополся...
если без лямд, то можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<class T>
void min_element(std::initializer_list<T>&& lst)
{
    std::vector<T> vec;
    std::copy(std::make_move_iterator(lst.begin()), std::make_move_iterator(lst.end()), std::back_inserter(vec));
    auto max = std::numeric_limits<T>::max();
    for (auto i{ 0u }; i != vec.size(); ++i)
    {
        if (!(i % 2) && vec[i] < max)
            max = vec[i];
    }
    std::cout << max;
}
Добавлено через 5 минут
notAll, с лямбдой как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<class T>
void min_element(std::initializer_list<T>&& lst)
{
    std::vector<T> vec;
    std::copy(std::make_move_iterator(lst.begin()), std::make_move_iterator(lst.end()), std::back_inserter(vec));
    auto cur{ 0u };
    auto max = std::numeric_limits<T>::max();
    std::for_each(vec.begin(), vec.end(), [&cur, &max](T value) 
    {
        if (!(cur++ % 2) && value < max)
            max = value;
    });
    std::cout << max;
}
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
09.03.2017, 16:04
Цитата Сообщение от zarko97 Посмотреть сообщение
for (auto i{ 0u }; i != vec.size(); ++i)
Мне кажется, что это будет выводиться как std::initializer_list<unsigned>, а не как unsigned.
Хотя, начиная с с++17 всё нормально.
0
 Аватар для zarko97
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
09.03.2017, 16:29
GbaLog-, ну эт если компилятор дурной на моей vs все OK

Добавлено через 1 минуту
хотя так короче:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<class T>
void min_element(std::initializer_list<T>&& lst)
{
    std::vector<T> vec;
    std::copy(std::make_move_iterator(lst.begin()), std::make_move_iterator(lst.end()), std::back_inserter(vec));
    static auto cur{ 0u };
    static auto max = std::numeric_limits<T>::max();
    std::for_each(vec.begin(), vec.end(), [](T value) 
    {
        if (!(cur++ % 2) && value < max)
            max = value;
    });
    std::cout << max;
}
Добавлено через 19 минут
Цитата Сообщение от hoggy Посмотреть сообщение
что такое 0_c ?
по-моему так только в хане можно работать с индексами кортежей...в стд:: пресловутый get<> юзается
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
09.03.2017, 17:31
Цитата Сообщение от zarko97 Посмотреть сообщение
ну эт если компилятор дурной
Не, это у студии компилятор дурной.
Цитата Сообщение от 7.1.6.4
6.
Once the type of a declarator-id has been determined according to 8.3, the type of the declared variable
using the declarator-id is determined from the type of its initializer using the rules for template argument
deduction. Let T be the type that has been determined for a variable identifier d. Obtain P from T by
replacing the occurrences of auto with either a new invented type template parameter U or, if the initializer
is a braced-init-list (8.5.4), with std::initializer_list<U>. The type deduced for the variable d is then
the deduced A determined using the rules of template argument deduction from a function call (14.8.2.1),
where P is a function template parameter type and the initializer for d is the corresponding argument. If
the deduction fails, the declaration is ill-formed. [ Example:
C++
1
2
auto x1 = { 1, 2 }; // decltype(x1) is std::initializer_list<int>
auto x2 = { 1, 2.0 }; // error: cannot deduce element type
— end example ]
0
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
09.03.2017, 17:39
Цитата Сообщение от zarko97 Посмотреть сообщение
std::initializer_list<T>&&
Нет смысла передавать его через ссылку, его всегда по значению передают.
0
 Аватар для zarko97
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
09.03.2017, 17:49
Цитата Сообщение от notAll Посмотреть сообщение
Нет смысла
не обращал внимания... а какой смысл его по значению передавать?
0
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
09.03.2017, 17:52
Initializer lists may be implemented as a pair of pointers or pointer and length. Copying a std::initializer_list does not copy the underlying objects.
Он инкапсулирует в себе простой указатель/и, их нету смысла передавать по ссылке.
why is `std::initializer_list` often passed by value?
1
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
09.03.2017, 17:55
slater, если вернуться к исходному коду:
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
#include <iostream>
using namespace std;
 
int Find_MinElement(int k, ...)
{
    
    int *p = &k;
    int min = -1;
 
    if (p[0] > 0)
    {
        min = p[1];
 
        for (int i=3; i<p[0]; i+=2)
        {
            if (p[i] < min)
                min = p[i];
        }
    }
    return min;
 }
 
int main()
{
 
    setlocale(LC_ALL, "Russian");
    cout << "Минимальный в элемент: " <<  Find_MinElement(5, 4, 3, 2,4,6) << endl;
 
    system("pause");
    return 0;
}
И зачем тут накручивать? C++ ради С++
0
09.03.2017, 17:55

Не по теме:

del

0
 Аватар для zarko97
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
09.03.2017, 17:59
_liv_, по количеству строк кода накрутили как раз вы
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
09.03.2017, 18:01
zarko97, ничуть По количеству их столько же. Но! У меня они короче. Плюс еще и main присутствует. Уже не говоря о создаваемом коде.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.03.2017, 18:01

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

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

Функции с переменным числом параметров
Написать функцию sum с переменным числом параметров, которая находит сумму чисел типа int по формуле: S=a1*a2+a3*a4+a5*a6+. . . . . ...

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru