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

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

19.09.2016, 10:18. Показов 4982. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru