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

Шаблоны функции

11.11.2018, 18:06. Показов 1376. Ответов 4

Студворк — интернет-сервис помощи студентам
У меня есть код программы. Как переделать его в шаблонную функцию?
Исходный код
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
#include "stdafx.h"
#include<iostream>
using namespace std;
 
int multiply(int* arr, int n);
int summ(int* arr, int n, int f, int l, int sum);
int mysort(int *arr, int n, int j);
 
int main()
{
    int n;
    cin >> n;
    int i = 0, sum = 0, f = 0, l = 0, j = 1, k = 1;
    int* arr = new int[n];
    for (int i = 0; i < n; i++)
        cin >> arr[i];
 
 
    cout << multiply(arr, n) << " " << summ(arr, n, sum, f, l) << endl;
    mysort(arr, n, j);
    // сделать вывод правильно
 
    system("pause");
    return(0);
};
 
int multiply(int* arr, int n)
{
    int mp = 1;
    for (int i = 0; i < n; i++)
        if ((i + 1) % 2 == 0) mp *= arr[i];
    return(mp);
};
 
int summ(int* arr, int n, int fzero, int lzero, int sum = 0)
{
    for (int i = 0; i < n; i++)
        if (arr[i] == 0)
        {
            fzero = i;
            break;
        }
    for (int i = n - 1; i >= 0; i--)
        if (arr[i] == 0)
        {
            lzero = i;
            break;
        }
    for (int i = fzero; i < lzero; i++)
    {
        sum += arr[i];
    }
    return(sum);
};
int mysort(int *arr, int n, int j)
{
    int k = 0;
    for (int i = 0; i < n; i++)
        if (arr[i] >= 0) {
            cout << arr[i] << " ";
        }
    for (int i = 0; i < n; i++)
        if (arr[i] < 0) {
            cout << arr[i] << " ";
        }
    return(0);
};
Моя попытка
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
#include"pch.h"
#include<iostream>
using namespace std;
template <typename multiply>
 multiply(*arr, int n) 
{
    mp = 1;
    for (i = 0; i < n; i++)
        if ((i + 1) % 2 == 0) mp *= arr[i];
    return(mp);
};
 
template <typename summ>
summ(*arr, n, f, l, sum) 
{
        for (int i = 0; i < n; i++)
            if (arr[i] == 0)
            {
                fzero = i;
                break;
        }
    for (int i = n - 1; i >= 0; i--)
        if (arr[i] == 0)
        {
            lzero = i;
            break;
        }
    for (int i = fzero; i < lzero; i++)
    {
        sum += arr[i];
    }
        return(sum);
};
template <typename mysort>
mysort(*arr, n, j);
{
    int k = 0;
    for (int i = 0; i < n; i++)
        if (arr[i] >= 0) {
            cout << arr[i] << " ";
        }
    for (int i = 0; i < n; i++)
        if (arr[i] < 0) {
            cout << arr[i] << " ";
        }
    return(0);
};
int main()
{
    int n;
    cin >> n;
    int i = 0, int sum = 0, f = 0, l = 0, j = 1, k = 1;
    multiply * arr = new [n];
    for (int i = 0; i < n; i++)
        cin >> arr[i];
 
 
    cout << multiply(arr, n) << " " << summ(arr, n, sum, f, l) << endl;
    mysort(arr, n, j);
 
    system("pause");
    return(0);
};
Покажите пожалуйста на примере функции main и одной из пользовательских, как делать правильно
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.11.2018, 18:06
Ответы с готовыми решениями:

Перевести код из функции в шаблоны функции
Короче, у меня есть прога написанная с помощью функций, теперь мне нужно написать её с помощью шаблонов функции... #include...

Шаблоны функции
#include &lt;string.h&gt; #include &lt;stdio.h&gt; #include &lt;iostream.h&gt; #include &lt;stdlib.h&gt; #include &lt;conio.h&gt; struct note { char...

Функции-Шаблоны в С++
Как с помощью функций-шаблонов подсчитать сумму элементов, расположенных на побочной диагонали?

4
Модератор
Эксперт С++
 Аватар для zss
13772 / 10965 / 6491
Регистрация: 18.12.2011
Сообщений: 29,242
11.11.2018, 18:24
Лучший ответ Сообщение было отмечено Seeker96 как решение

Решение

Вы не поняли смысл шаблонной переменной:
Вместо какого-то конкретного типа мы используем шаблонную переменную (ее модно обзывать именем T).
При инстанцировании шаблона это имя заменяется на какой-то конкретный тип.
В данном примере, вначале мы его заменяем на int, а потом - на double:
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
//#include"pch.h"
#include<iostream>
using namespace std;
template <typename T>
T multiply(T *arr, int n)
{
    T mp = 1;
    for (int i = 0; i < n; i++)
        if ((i + 1) % 2 == 0) mp *= arr[i];
    return(mp);
}
 
template <typename T>
T summ(T *arr, int n)
{
    T sum=0;
    int fzero=0, lzero=n-1;
    for (int i = 0; i < n; i++)
        if (arr[i] == 0)
        {
            fzero = i;
            break;
        }
    for (int i = n - 1; i >= 0; i--)
        if (arr[i] == 0)
        {
            lzero = i;
            break;
        }
    for (int i = fzero+1; i < lzero; i++)
    {
        sum += arr[i];
    }
    return sum;
}
template <typename T>
void mysort(T *arr,int n)
{
    for (int i = 0; i < n; i++)
        if (arr[i] >= 0) {
            cout << arr[i] << " ";
        }
    cout << endl;
    for (int i = 0; i < n; i++)
        if (arr[i] < 0) {
            cout << arr[i] << " ";
        }
    cout << endl;
    return;
}
int main()
{
    int n;
    cout << "size:";
    cin >> n;
    int* arr = new int[n];
    for (int i = 0; i < n; i++)
    { 
        cout << ":";
        cin >> arr[i];
    }
        
    
    cout << multiply(arr, n) << " " << summ(arr, n) << endl;
    mysort(arr, n);
    delete[] arr;
 
    double* darr = new double[n];
    for (int i = 0; i < n; i++)
    {
        cout << ":";
        cin >> darr[i];
    }
 
    cout << multiply(darr, n) << " " << summ(darr, n) << endl;
    mysort(darr, n);
    delete[] darr;
 
 
    system("pause");
    return(0);
};
1
 Аватар для Seeker96
0 / 0 / 0
Регистрация: 17.09.2018
Сообщений: 36
11.11.2018, 22:00  [ТС]
zss, спасибо. Можно еще такой вопрос: мне нужно поработать с тремя типами данных по очереди. Я делал так
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
#include"pch.h"
#include<iostream>
 
using namespace std;
template < typename T >
T multiply(T* arr, T n)
{
    T mp = 1;
    for (T i = 0; i < n; i++)
        if ((i + 1) % 2 == 0) mp *= arr[i];
    return(mp);
};
 
template < typename T >
T summ(T* arr, T n)
{
    T fzero, lzero, sum = 0;
    for (T i = 0; i < n; i++)
        if (arr[i] == 0)
        {
            fzero = i;
            break;
        }
    for (T i = n - 1; i >= 0; i--)
        if (arr[i] == 0)
        {
            lzero = i;
            break;
        }
    for (T i = fzero; i < lzero; i++)
    {
        sum += arr[i];
    }
    return(sum);
};
 
template < typename T >
T mysort(T *arr, T n)
{
    T j;
    T k = 0;
    for (T i = 0; i < n; i++)
        if (arr[i] >= 0) {
            cout << arr[i] << " ";
        }
    for (int i = 0; i < n; i++)
        if (arr[i] < 0) {
            cout << arr[i] << " ";
        }
    return(0);
};
 
int main()
{
    int n;
    cin >> n;
    int i = 0;
    int* a = new int[n];
    for (int i = 0; i < n; i++)
        cin >> a[i];
 
 
    cout << multiply(a, n) << " " << summ(a, n) << endl;
    mysort(a, n);
 
    float z = 0;
    int* b = new int[n];
    for (int z = 0; z < n; i++)
        cin >> b[z];
 
    cout << multiply(b, n) << " " << summ(b, n) << endl;
    mysort(b, n);
 
    double y = 0;
    double* c = new double[n];
    for (int y = 0; y < n; i++)
        cin >> c[y];
 
    cout << multiply(c, n) << " " << summ(c, n) << endl;
    mysort(c, n);
 
    system("pause");
    return(0);
};
но как только я добавляю doube, программа перестает компилироваться
0
Модератор
Эксперт С++
 Аватар для zss
13772 / 10965 / 6491
Регистрация: 18.12.2011
Сообщений: 29,242
12.11.2018, 06:43
Не вижу того, что ВЫ поняли мой код,
В функциях у параметра n тип всегда int, а не T
И зачем Вы
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//#include"pch.h"
#include<iostream>
 
using namespace std;
template < typename T >
T multiply(T* arr, int n)
{
    T mp = 1;
    for (int i = 0; i < n; i++)
        if ((i + 1) % 2 == 0) mp *= arr[i];
    return(mp);
};
 
template < typename T >
T summ(T* arr, int n)
{
    int fzero=0, lzero=n-1;
    T sum = 0;
    for (int i = 0; i < n; i++)
        if (arr[i] == 0)
        {
            fzero = i;
            break;
        }
    for (int i = n - 1; i >= 0; i--)
        if (arr[i] == 0)
        {
            lzero = i;
            break;
        }
    for (int i = fzero; i < lzero; i++)
    {
        sum += arr[i];
    }
    return(sum);
};
 
template < typename T >
void mysort(T *arr, int n)
{
    int k = 0;
    for (int i = 0; i < n; i++)
        if (arr[i] >= 0) {
            cout << arr[i] << " ";
        }
    cout << endl;
    for (int i = 0; i < n; i++)
        if (arr[i] < 0) {
            cout << arr[i] << " ";
        }
    cout << endl;
};
template<class T>
void Input(T* a,int n)
{
    for (int i = 0; i < n; i++)
    {
        cout << ":";
        cin >> a[i];
    }
 
}
 
int main()
{
    int n;
    cout << "n=";
    cin >> n;
    int i = 0;
    int* a = new int[n];
    Input(a, n);
    cout << multiply(a, n) << " " << summ(a, n) << endl;
    mysort(a, n);
    delete[] a;
 
    float* b = new float[n];
    Input(b, n);
    cout << multiply(b, n) << " " << summ(b, n) << endl;
    mysort(b, n);
    delete[] b;
 
    double* c = new double[n];
    Input(c, n);
    cout << multiply(c, n) << " " << summ(c, n) << endl;
    mysort(c, n);
    delete[] c;
 
    system("pause");
    return(0);
};
1
 Аватар для Seeker96
0 / 0 / 0
Регистрация: 17.09.2018
Сообщений: 36
12.11.2018, 08:07  [ТС]
zss, не хотел вас обидеть. По поводу подсказок и удаления массива. Мы работаем в системе с автоматической проверкой кода. С подсказками она не примет код и удаление массива излишне для этой системы, хотя я знаю, что нужно очищать массив после работы с ним для экономии памяти. Я догадался, как работать с несколькими типами данных, хотя мой код работает несколько неправильно, я почти исправил его. Спасибо за помощь)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.11.2018, 08:07
Помогаю со студенческими работами здесь

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

Шаблоны функции
Делаю задание по программированию, нужна явная специализация шаблона. Пишет ошибку: obj\Debug\main.o||In function `main':| ...

Шаблоны, функции, etc
Софорумчане и просто зашедшие, прошу вашей помощи... Не могу разобраться как написать программу, в которой определяется шаблон для...

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

Шаблоны функции | C++
Помогите оформить каждый пункт задания в виде шаблона функции. Все необходимые данные для функции должны передаваться им в качестве...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
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