Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 04.02.2018
Сообщений: 3
1

Шаблонная функция возвращающая элемент массива с наибольшим значением

21.09.2018, 12:03. Просмотров 1838. Ответов 3

Всем привет. На вашем форуме я новичок, впрочем, как и в C++. Я делаю упражнения по C++ по книге Стивена Прата. И вот на 6 упражнении 8 главы у меня появились трудности.
Вот само задание: "Напишите шаблонную функцию maxn (), которая принимает в качестве аргумента массив элементов типа Т и целое число, представляющее количество элементов в массиве, а возвращает элемент с наибольшим значением. Протестируйте ее работу в программе, которая использует этот шаблон с массивом из шести значений int и массивом из четырех значений double. Программа также должна включать специализацию, которая использует массив указателей на char в качестве первого аргумента и количество указателей — в качестве второго, а затем возвращает адрес самой длинной строки. Если имеется более одной строки наибольшей длины, функция должна вернуть адрес первой из них. Протестируйте специализацию на массиве из пяти указателей на строки."

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
#include <iostream>
using std::cout;
using std::endl;
 
template <typename T> 
T maxn(T a[], int n);
template <> 
char * maxn<char *>(const char * a[], int n); // если убрать const, то вызывает обычный шаблон
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int ar[6] = { -103, 12, 102, 4, 125, 37 };
    double arr[4] = { 52.03, 124.44, 12.32, -544.22 };
    cout << maxn(ar, 6) << endl;
    cout << maxn(arr, 4) << endl;
    const char * A_r[5] = { "Elon Musk", "Evgeny", "Abraka", "Reviews", "Sa" };
    cout << maxn(A_r, 5) << endl;
 
    system("pause");
    return 0;
}
template <typename T> 
T maxn(T a[], int n)
{
    T max = a[0];
    for (int i = 1; i < n; i++)
    {
        if (a[i] > max)
            max = a[i];
    }
    cout << "Вызов шаблонной фнукции\n";
    return max;
}
template <> 
char * maxn<char *>(const char * a[], int n)   // если убрать const, то вызывает обычный шаблон
{
    char * str = a[0];
    for (int i = 1; i < n; i++)
    {
        if (strlen(str) < strlen(a[i]))
            str = a[i];
    }
    cout << "Вызов специализированной шаблонной функции\n";
    return str;
}
(Среда - Microsoft Visual Studio 2017)

Если убрать из прототипа и определения функции квалификтор const, то во всех случаях будет вызываться обычная шаблонная функция, а не специализация. Если же const оставить, то компилятор будет выдавать: "Отсутствуют экземпляры шаблон функции "maxn", соответствующие заданному типу". Что делать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.09.2018, 12:03
Ответы с готовыми решениями:

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

Шаблонная функция возвращающая созданный динамический массив
Здравствуйте! Нужна Ваша помощь! Нужна шаблонная функция которая возвращает созданный...

Функция заменяющая члены массива с наибольшим значением на ноль
Даны действительные числа а1 ... аn, b1 ... bn.у массиве а1 ... аn, и в массивеb1 ... bn изменить...

В матрице поменять местами строку, содержащую элемент с наибольшим значением, со строкой, содержащей элемент с наименьшим значением
В данной действительной матрице размера 3*3 поменять местами строку, содержащую элемент с...

3
138 / 66 / 46
Регистрация: 15.10.2015
Сообщений: 300
21.09.2018, 12:19 2
UselessMouth, Давно решал эти задачки. У меня получилось вот так.

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
/*
Напишите шаблонную функцию maxn(), которая принимает в качестве
аргумента массив элементов типа т и целое число, представляющее количество
элементов в массиве, а возвращает элемент с наибольшим значением. Протестируйте
ее работу в программе, которая использует этот шаблон с массивом из шести
значений int и массивом из четырех значений double. 
Программа также должна включать специализацию, которая использует массив указателей на char в
качестве первого аргумента и количество указателей — в качестве второго, а затем
возвращает адрес самой длинной строки. Если имеется более одной строки
наибольшей длины, функция должна вернуть адрес первой из них. Протестируйте
специализацию на массиве из пяти указателей на строки.
*/
 
#include "stdafx.h"
#include <iostream>
#include <cstring>
 
using namespace std;
 
const int SIZE_INT = 6;
const int SIZE_DOUBLE = 4;
const int SIZE_CHAR = 5;
//-------------------------------------------------------------------------------------------------
template <typename T>
T maxn(T *massiv, int size);
const char *maxn(const char *massiv[], int size);
//-------------------------------------------------------------------------------------------------
int main()
{
    setlocale(LC_ALL, "Rus");
    int massiv_int[SIZE_INT] = { 1,2,2,4,52 };
    double massiv_double[SIZE_DOUBLE] = { 0.1,2.4,0.4,33.1 };
    const char *words[SIZE_CHAR] = { "Ham","Bread","Sandwich","Asparagus","Chocolate" };
 
    cout << "Максимально значение массива INT = ";
    cout << maxn(massiv_int, SIZE_INT) << endl;
    cout << "Максимально значение массива DOUBLE = ";
    cout << maxn(massiv_double, SIZE_DOUBLE) << endl;
    cout << "Максимально значение массива CHAR = ";
    cout << maxn(words, SIZE_CHAR) << endl;
 
    system("pause");
    return 0;
}
//-------------------------------------------------------------------------------------------------
template <typename T>
T maxn(T *massiv, int size) {
    T max = massiv[0];
 
    for (int i = 0; i < size; i++)
    {
        if (max < massiv[i])
        {
            max = massiv[i];
        }
    }
    return max;
}
//-------------------------------------------------------------------------------------------------
const char *maxn(const char *massiv[], int size) {
    const char *max_lenght_string = &massiv[0][0];
    int max_characters = strlen(massiv[0]);
    int next = 0;
 
    for (int i = 0; i < size; i++)
    {
        next = strlen(massiv[i]);
        if (next > max_characters)
        {
            max_characters = next;
            max_lenght_string = &massiv[i][0];
        }
    }
    return max_lenght_string;
}
//-------------------------------------------------------------------------------------------------
 
/*
Максимально значение массива INT = 52
Максимально значение массива DOUBLE = 33.1
Максимально значение массива CHAR = Asparagus
Для продолжения нажмите любую клавишу . . .
*/
0
0 / 0 / 0
Регистрация: 04.02.2018
Сообщений: 3
21.09.2018, 15:18  [ТС] 3
А в чём у меня ошибка? Я сейчас попробовал ещё и возвращаемый тип сделать const, не помогло. Сигнатура одинаковая.
0
491 / 205 / 69
Регистрация: 27.05.2016
Сообщений: 545
21.09.2018, 21:56 4
UselessMouth, для наглядности:
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
//#include <iostream>
#include <cstdio>
 
template <typename T>
T maxn(T *a, int)
{
    puts("T maxn(T *a, int)");
    return *a;
}
 
template <>
char* maxn<char *>(char **a, int)
{
    puts("char* maxn<char *>(char **a, int)");
    return *a;
}
 
template <>
const char* maxn<const char *>(const char **a, int)
{
    puts("const char* maxn<const char *>(const char **a, int n)");
    return *a;
}
 
int main()
{
    int n[] = {1, 2};
    maxn(n, 2); // T maxn(T *a, int)
 
    char *strs[] = {"Hello", "world"}; // warning: ISO C++11 does not allow conversion from string literal to 'char *'
    maxn(strs, 2); // char* maxn<char *>(char **a, int)
 
    const char *strs2[] = {"Hello", "world"};
    maxn(strs2, 2); // const char* maxn<const char *>(const char **a, int n)
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.09.2018, 21:56

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

В матрице поменять местами строку, содержащую элемент с наибольшим значением со строкой, содержащей элемент с наименьшим значением
Вот условие: В матрице размером NxM поменять местами строку, содержащую элемент с наибольшим...

Поменять местами строку, содержащую элемент с наибольшим значением со строкой содержащей элемент с наименьшим значением
Дан двумерный массив размерностью МхN . заполненный случайным образом . поменять местами строку...

Поменять местами строку, содержащую элемент с наибольшим значением, со строкой, содержащей элемент с наименьшим значением
В данной действительной матрице размера 6х9 поменять местами строку, содержащую элемент с...

Поменять местами строку, содержащую элемент с наибольшим значением, со строкой содержащей элемент с наименьшим значением
Доброго времени суток! Помогите решить задание на с# (тема двумерные массивы): В данной двумерной...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.