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

Перегрузка и шаблоны функций

13.11.2016, 10:58. Показов 1722. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Приведенную нижу задачу нужно оформить в виде шаблонов функций.
В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1) произведение отрицательных элементов массива
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
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <iomanip>
using namespace std;
 
float proizv(float *arr, int n);
float summa(float *arr, int n);
void sort(float *arr, int n);
 
 
int main()
{
    setlocale(LC_ALL, "rus");
    int n;
    cin >> n;
    float *arr = new float[n];
 
    unsigned int i;
    for (i = 0; i < n; i++) {
        cin >> arr[i];
    }
 
    cout << fixed << setprecision(6) << proizv(arr, n) << " ";
    cout << fixed << setprecision(6) << summa(arr, n) << " ";
    cout << endl;
    sort(arr, n);
    for (int i = 0; i < n; i++)
        cout << fixed << setprecision(2) << arr[i] << " ";
    cout << endl;
    return 0;
}
 
float proizv(float* arr, int n)
{
    int i;
    float p = 1;
    for (i = 0; i < n; i++)
        if (arr[i] < 0)
            p = p*arr[i];
    return p;
}
 
float summa(float *arr, int n)
{
    int max_index = 0;
    int q = 0;
    float sum = 0;
    for (int i = 0; i < n; i++)
    {
        if (max_index < arr[i]) {
            q = i;
            max_index = arr[i];
        }
    }
 
    for (int i = 0; i < q; i++)
    {
        if (arr[i] > 0)
            sum += arr[i];
    }
    return sum;
}
 
void sort(float *arr, int n)
{
    for (int i = 0; i < n / 2; i++)
    {
        float a = arr[i];
        arr[i] = arr[n - i - 1];
        arr[n - i - 1] = a;
    }
}
Пример входных данных:
10
8 -4 3 0 -7 4 2 5 0 1
-0.25 4 10.5 2.11 3 -3.33 0 0.855 4.01 1
1.0101 0.55555 -6.123 0.56789 1.23 2.021 -10.0110 -5.8 0 9.58
Пример выходных данных:
28 0
1 0 5 2 4 -7 0 3 -4 8
0.83 4.00
1.00 4.01 0.86 0.00 -3.33 3.00 2.11 10.50 4.00 -0.25
-355.5246 5.3845
9.5800 0.0000 -5.8000 -10.0110 2.0210 1.2300 0.5679 -6.1230 0.5555 1.0101

Помогите пожалуйста!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.11.2016, 10:58
Ответы с готовыми решениями:

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов
Здравствуйте!!! Я бы хотел попросить помоч решить...ну или скинуть примеры таких задач, если вдруг у вас они завалялись на компе или...

Перегрузка и шаблоны
Для каждого пункта задания создать: 1. Перегружаемые функции для типов int и double 2. Шаблоны функций Все необходимые данные для...

Перегрузка операторов и шаблоны
#include &lt;iostream&gt; using namespace std; template &lt;class X, int size&gt; class type { X mas; public: type() { for(int i =...

9
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.11.2016, 11:09
А для чего нужен шаблон? Где в задании об этом?
0
0 / 0 / 0
Регистрация: 13.11.2016
Сообщений: 33
13.11.2016, 11:25  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
А для чего нужен шаблон? Где в задании об этом?
Привести примеры программ, использующих эти шаблоны для типов int, double, float.

Добавлено через 2 минуты
Пример входных данных:
10 - количество элементов
8 -4 3 0 -7 4 2 5 0 1 - элементы типа int
-0.25 4 10.5 2.11 3 -3.33 0 0.855 4.01 1 - элементы типа double
1.0101 0.55555 -6.123 0.56789 1.23 2.021 -10.0110 -5.8 0 9.58 - элементы типа float
Пример выходных данных:
28 0 - результат первых двух пунктов для элементов int
1 0 5 2 4 -7 0 3 -4 8 - сортировка для элементов int
0.83 4.00 - результат первых двух пунктов для элементов double
1.00 4.01 0.86 0.00 -3.33 3.00 2.11 10.50 4.00 -0.25 - сортировка для элементов double
-355.5246 5.3845 - результат первых двух пунктов для элементов float
9.5800 0.0000 -5.8000 -10.0110 2.0210 1.2300 0.5679 -6.1230 0.5555 1.0101 - сортировка для элементов float
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.11.2016, 12:28
Лучший ответ Сообщение было отмечено bekkonrofl как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
template <typename T>
T proizv(T* arr, int n)
{
    int i;
    T p = 1;
    for (i = 0; i < n; i++)
        if (arr[i] < 0)
            p = p*arr[i];
    return p;
}
1
0 / 0 / 0
Регистрация: 13.11.2016
Сообщений: 33
13.11.2016, 13:36  [ТС]
Спасибо.
Но как реализовать ввод и вывод данных по образцу? Нужно именно в таком формате.

Добавлено через 9 минут
Возможно стоит еще добавить какую-то функцию для этого?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.11.2016, 14:15
Три разных массива и три ввода данных делай, а после применишь к ним шаблонные функции.
0
0 / 0 / 0
Регистрация: 13.11.2016
Сообщений: 33
13.11.2016, 16:13  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Три разных массива и три ввода данных делай, а после применишь к ним шаблонные функции.
Большое спасибо! Все заработало.
Если у кого-то подобная задача, вот окончательный код:
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <iostream>
#include <iomanip>
using namespace std;
 
template <typename T> T proizv(T* arr1, int n);
template <typename S> S summa(S *arr1, int n);
template <typename SO> void sort(SO *arr1, int n);
 
 
int main()
{
    setlocale(LC_ALL, "rus");
    int n;
    cin >> n;
    float *arr1 = new float[n];
    float *arr2 = new float[n];
    float *arr3 = new float[n];
 
    unsigned int i;
    for (i = 0; i < n; i++) {
        cin >> arr1[i];
    }
 
    for (i = 0; i < n; i++) {
        cin >> arr2[i];
    }
 
    for (i = 0; i < n; i++) {
        cin >> arr3[i];
    }
 
    cout << proizv(arr1, n) << " ";
    cout << summa(arr1, n) << " ";
    cout << endl;
    sort(arr1, n);
    for (int i = 0; i < n; i++)
        cout << arr1[i] << " ";
    cout << endl;
 
    cout << fixed << setprecision(2) << proizv(arr2, n) << " ";
    cout << fixed << setprecision(2) << summa(arr2, n) << " ";
    cout << endl;
    sort(arr2, n);
    for (int i = 0; i < n; i++)
        cout << fixed << setprecision(2) << arr2[i] << " ";
    cout << endl;
 
    cout << fixed << setprecision(4) << proizv(arr3, n) << " ";
    cout << fixed << setprecision(4) << summa(arr3, n) << " ";
    cout << endl;
    sort(arr3, n);
    for (int i = 0; i < n; i++)
        cout << fixed << setprecision(4) << arr3[i] << " ";
    cout << endl;
 
    return 0;
}
 
template <typename T> T proizv(T* arr1, int n)
{
    int i;
    T p = 1;
    for (i = 0; i < n; i++)
        if (arr1[i] < 0)
            p = p*arr1[i];
    return p;
}
 
template <typename S> S summa(S *arr1, int n)
{
    int max_index = 0;
    int q = 0;
    S sum = 0;
    for (int i = 0; i < n; i++)
    {
        if (max_index < arr1[i]) {
            q = i;
            max_index = arr1[i];
        }
    }
 
    for (int i = 0; i < q; i++)
    {
        if (arr1[i] > 0)
            sum += arr1[i];
    }
    return sum;
}
 
template <typename SO> void sort(SO *arr1, int n)
{
    for (int i = 0; i < n / 2; i++)
    {
        SO a = arr1[i];
        arr1[i] = arr1[n - i - 1];
        arr1[n - i - 1] = a;
    }
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.11.2016, 17:22
Только тип элементов разный должен быть.
1
0 / 0 / 0
Регистрация: 13.11.2016
Сообщений: 33
13.11.2016, 17:25  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Только тип элементов разный должен быть.
Точно!
Можете еще помочь с Опеделить сумму элементов в тех строках матрицы, которые не содержат отрицательных элементов
0
11 / 11 / 6
Регистрация: 13.11.2016
Сообщений: 57
13.11.2016, 19:16
Можно еще сделать проверку с помощью enable_if, является ли первый шаблонный параметр вещественным типом, а второй — целочисленным. Тогда Ваш код превращается вот в это:

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
#include <iomanip>
#include <type_traits>
using namespace std;
 
template <typename FloatingPointType, typename IntegralType = int>
enable_if_t<is_floating_point<FloatingPointType>::value &&
            is_integral<IntegralType>::value,              FloatingPointType>
proizv(FloatingPointType *arr, IntegralType n) {
    IntegralType i;
    FloatingPointType p = 1;
    for (i = 0; i < n; i++)
        if (arr[i] < 0)
            p = p*arr[i];
    return p;
}
 
template <typename FloatingPointType, typename IntegralType = int>
enable_if_t<is_floating_point<FloatingPointType>::value &&
            is_integral<IntegralType>::value,              FloatingPointType>
summa(FloatingPointType *arr, IntegralType n) {
    IntegralType max_index = 0;
    IntegralType q = 0;
    FloatingPointType sum = 0;
    for (IntegralType i = 0; i < n; i++)
    {
        if (max_index < arr[i]) {
            q = i;
            max_index = arr[i];
        }
    }
 
    for (IntegralType i = 0; i < q; i++)
    {
        if (arr[i] > 0)
            sum += arr[i];
    }
    return sum;
}
 
template <typename FloatingPointType, typename IntegralType = int>
enable_if_t<is_floating_point<FloatingPointType>::value &&
            is_integral<IntegralType>::value,              void>
sort(FloatingPointType *arr, IntegralType n) {
    for (IntegralType i = 0; i < n / 2; i++)
    {
        FloatingPointType a = arr[i];
        arr[i] = arr[n - i - 1];
        arr[n - i - 1] = a;
    }
}
 
using MyFloatingPointType = float;
using MyIntegralType = int;
 
int main()
{
    setlocale(LC_ALL, "rus");
    MyIntegralType n;
    cin >> n;
    MyFloatingPointType *arr1 = new MyFloatingPointType[n];
    MyFloatingPointType *arr2 = new MyFloatingPointType[n];
    MyFloatingPointType *arr3 = new MyFloatingPointType[n];
 
    MyIntegralType i;
    for (i = 0; i < n; i++) {
        cin >> arr1[i];
    }
 
    for (i = 0; i < n; i++) {
        cin >> arr2[i];
    }
 
    for (i = 0; i < n; i++) {
        cin >> arr3[i];
    }
 
    cout << proizv(arr1, n) << " ";
    cout << summa(arr1, n) << " ";
    cout << endl;
    sort(arr1, n);
    for (MyIntegralType i = 0; i < n; i++)
        cout << arr1[i] << " ";
    cout << endl;
 
    cout << fixed << setprecision(2) << proizv(arr2, n) << " ";
    cout << fixed << setprecision(2) << summa(arr2, n) << " ";
    cout << endl;
    sort(arr2, n);
    for (MyIntegralType i = 0; i < n; i++)
        cout << fixed << setprecision(2) << arr2[i] << " ";
    cout << endl;
 
    cout << fixed << setprecision(4) << proizv(arr3, n) << " ";
    cout << fixed << setprecision(4) << summa(arr3, n) << " ";
    cout << endl;
    sort(arr3, n);
    for (MyIntegralType i = 0; i < n; i++)
        cout << fixed << setprecision(4) << arr3[i] << " ";
    cout << endl;
 
    return 0;
}
Теперь, если в 53 и 54 строчках сменить int на float или float на int, программа не скомпилируется. Но можно менять, например, float на double и int на unsigned, и все будет в порядке.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.11.2016, 19:16
Помогаю со студенческими работами здесь

Перегрузка оператора [] и шаблоны.
Всем доброго времени суток! Проблема такая: есть класс сVector template &lt;class T, int Size&gt; class cVector { T *m_data; ...

Шаблоны перегрузка ввода/вывода
#include &lt;iostream&gt; #include &lt;assert.h&gt; #include &lt;stdlib.h&gt; using namespace std; template &lt;class T&gt; class Array { ...

Шаблоны и перегрузка различных операторов
Не могу правильно описать шаблон при перегрузке операторов. Добился того,что не видит ошибок..но при компиляции ругается и выдаёт...

Шаблоны классов, перегрузка операторов
Задание:Реализовать шаблон классов Array. Перегрузить операторы присваивания =, ввода &gt;&gt; и вывода &lt;&lt; (предусмотреть обработку...

Шаблоны классов, перегрузка operator<< класса ostream
Не компилируется программа. fatal error: 1 unresolved externals Как правильно определить operator&lt;&lt; ??? #include...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru