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

Шаблон, специализация: поиск самой большой строки в массиве указателей на char

19.06.2010, 01:49. Просмотров 1883. Ответов 8
Метки нет (Все метки)

Есть почти готовое решение,помогите пожалуйста доделать,немного не понимаю

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
#include <cstdlib>
#include <iostream>
template <typename T>//shablon
void maxn(T arr[],int cz);
template <> void maxn(char * cArr,int p);//spezializacia
using namespace std;
int main(int argc, char *argv[])
{
    int mass1[6] = {5,90,3,2,9,7};
    maxn(mass1,6);
    double mass2[4] = {4.8,8.0,5.3,3.14};
    maxn(mass2,4);
    cout<<"rabotaet cArr[5]!"<<endl;
    char * mchar[5] = {
                       "Dasha",
                       "Inokenty",
                       "Jora",
                       "Tanyasdw",
                       "Irina"
                      };
                             
    maxn(mchar,5);//ПРОБЛЕМА С ЭТОЙ ФУНКЦИЕЙ=)
    system("PAUSE");
    return EXIT_SUCCESS;
}
template <typename T>
void maxn(T arr[],int cz)
{ 
    double maxx = arr[0];
    for(int i = 1;i<cz;i++)
    {
        if(arr[i] > maxx)
         maxx = arr[i];
    }
    cout<<"bolshee chislo:"<<maxx<<endl;
}
template <> void maxn(char * cArr,int p)
{
   char(*db)[] = cArr[0][0];
  for(int i=0;i<p;i++)
   {
     if(cArr>db)
      db = cArr; 
    }     
    cout<<"adress stroki:"<<db<<endl;
    // for(int i = 0;i<p;++i)
    //cout<<maxx[i]<<"  adress:"<<&maxx[i]<<endl; 
}
По заданию сказано создать шаблон функции maxn() и специализацию,которая возвращает адрес самой длинной строки.Шаблон работает,а вот с нахождением строки возникает вопрос. Как найти самую длинную строку?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.06.2010, 01:49
Ответы с готовыми решениями:

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и...

Поиск самой длинной строки в const char**
Здравствуйте. Вот функция: template &lt;&gt; char* maxn&lt;char*&gt;(char** const ar, const int* limit) {...

Поиск самой длинной строки в массиве
Ввести массив строк и найти в нем максимальную по длине строку. 1) Не учитывать случай, когда...

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си)
Уважаемые программисты, возникло несколько вопросов касательно указателей. Почему при выводе...

8
Maniac
Эксперт С++
1450 / 951 / 159
Регистрация: 02.01.2009
Сообщений: 2,814
Записей в блоге: 1
19.06.2010, 04:03 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
#include <iostream>
//#include <list>
 
template<typename T>
T func(T arr[], int S){
    //....
    return arr[0];
}
 
template<>
const char *func(const char *arr[], int S){
    const char *buff = arr[0];
    for(int i = 1; i < S; ++i){
        if(strlen(buff) < strlen(arr[i]))
            buff = arr[i];
    }
 
    return buff;
}
int main(){
 
    int arr[3] = {1, 2, 3};
 
    const char *sarr[3] = {
        "asd",
        "asdf",
        "asd"
    };
 
    std::cout << func(sarr, 3) << std::endl; // asdf
 
    std::cout << func( arr, 3) << std::endl; // 1 
    return 0;
}
1
0 / 0 / 1
Регистрация: 15.11.2009
Сообщений: 93
19.06.2010, 12:16  [ТС] 3
Скажите пожалуйста,а почему нельзя использовать функция void не возвращающую указатель,а непосредственно выводящую результат внутри себя через cout?
0
Maniac
Эксперт С++
1450 / 951 / 159
Регистрация: 02.01.2009
Сообщений: 2,814
Записей в блоге: 1
19.06.2010, 12:21 4
Цитата Сообщение от USHЁL Посмотреть сообщение
Скажите пожалуйста,а почему нельзя использовать функция void не возвращающую указатель,а непосредственно выводящую результат внутри себя через cout?
Мне так больше нравится.. и вам это ни кто не мешает сделать.
1
0 / 0 / 1
Регистрация: 15.11.2009
Сообщений: 93
19.06.2010, 12:33  [ТС] 5
Я сделал,но комп-р ругается(на строчке прототипирования специализации и выдаёт сообщение типа:template-id`maxn<>'for`const char* maxn(const char**,int)'does not match any template declaration) =) Использую wxDev-C++
Или не нужно определение шаблона?Што то я немного не пойму?(Сама задача:Создайте шаблон функции maxn(),которая принимает в качестве аргумента массив элементов типа T и целое число,представляющее собой кол-во элементов в массиве,а возвращает элемент с наибольшим значением.Протестируйте её работу в программе,которая использует шаблон данной функции с массивом из 6 значений типа int и массивом из 4 значений типа double.Программа также должна включать специализацию,которая использует в качестве аргумента массив указателей на char и кол-во указателей в качестве второго аргумента,а затем возвращает адрес самой длинной строки.Если имеется более одной строки наибольшей длины,функция возвращает адрес первой из них.Выполнить проверку специализации на примере массива,состоящего из 5-и указателей на строки.)

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
#include <cstdlib>
#include <iostream>
template <typename T>//shablon
void maxn(T arr[],int cz);
template <>
const char * maxn(const char * cArr[],int p);//spezializacia
using namespace std;
int main(int argc, char *argv[])
{
    int mass1[6] = {5,90,3,2,9,7};
    maxn(mass1,6);
    double mass2[4] = {4.8,8.0,5.3,3.14};
    maxn(mass2,4);
    cout<<"rabotaet cArr[5]!"<<endl;
    const char * mchar[9] = {
                       "Dasha",
                       "InokentyW",
                       "Jora",
                       "Tanyasdw",
                       "IrinaW"
                      };
                             
    cout<<maxn(mchar,5);
    system("PAUSE");
    return EXIT_SUCCESS;
}
///
template <typename T>
void maxn(T arr[],int cz)
{ 
    double maxx = arr[0];
    for(int i = 1;i<cz;i++)
    {
        if(arr[i] > maxx)
         maxx = arr[i];
    }
    cout<<"bolshee chislo:"<<maxx<<endl;
}
///
template <> const char * maxn(const char * cArr,int p)
{  
     char *buff = cArr;
        for(int i = 1; i < p; ++i)
          {
            if(strlen(buff) < strlen(cArr[i]))
            buff = cArr[i];   
          }   
    return buff;
}
0
Maniac
Эксперт С++
1450 / 951 / 159
Регистрация: 02.01.2009
Сообщений: 2,814
Записей в блоге: 1
25.06.2010, 17:27 6
Вот поправил..
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
#include <cstdlib>
#include <iostream>
 
///
template <typename T>
T func_max(T arr[], int count)
{ 
    T Res = arr[0];
    for(int i = 0; i < count; ++i)
        if(arr[i] > Res)
            Res = arr[i];
    return Res;
}
 
template <> 
const char *func_max(const char *cArr[], int count)
{  
    const char *Res = cArr[0];
    for(int i = 0; i < count; ++i)
        if(strlen(Res) < strlen(cArr[i]))
            Res = cArr[i];    
    return Res;
}
 
int main(int argc, char *argv[])
{
    int     mass1[6] = { 5, 90, 3, 2, 9, 7  };
    double  mass2[4] = { 4.8, 8.0, 5.3, 3.14};
    const char *mchar[5] = 
    {
        "Dasha",
        "InokentyW",
        "Jora",
        "Tanyasdw",
        "IrinaW"
    };
 
    std::cout << func_max(mass1,6) << std::endl;
    std::cout << func_max(mass2,4) << std::endl;
    std::cout << func_max(mchar,5) << std::endl;
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
http://codepad.org/1iCA3pbb
0
0 / 0 / 1
Регистрация: 15.11.2009
Сообщений: 93
25.06.2010, 19:27  [ТС] 7
Благодарю! Я понял,что специализация основана на шаблоне.Т.е. когда создаётся специализация то она создаётся по подобию исходного шаблона. А в шаблоне
template <typename T>
T maxn(...), под именем T подразумевается как бы любой тип данных который нам будет нужен.
Если не так поправьте меня=)
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10897 / 6813 / 1623
Регистрация: 25.07.2009
Сообщений: 12,515
25.06.2010, 19:42 8
Цитата Сообщение от ISergey Посмотреть сообщение
template <>
ISergey, объясните, пожалуйста, смысл этой конструкции.
0
Maniac
Эксперт С++
1450 / 951 / 159
Регистрация: 02.01.2009
Сообщений: 2,814
Записей в блоге: 1
25.06.2010, 20:14 9
easybudda, Это специализация шаблона.. если стандартный шаблон не подходит под некоторую реализацию то можно сделать ее специализацию под конкретный тип данных..

По большей части применяется в мета-программировании...
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
#include <iostream>
using namespace std;
 
template<typename T> class IsFundamental{
public:
    enum { Yes = 0, No = 1 };
};
 
template<> class IsFundamental<int>{
public:
    enum { Yes = 1, No = 0 };
};
 
#define MK_FUND_TYPE(T)             \
template<> class IsFundamental<T>{  \
public:                             \
    enum { Yes = 1, No = 0 };       \
}
 
MK_FUND_TYPE(double);
MK_FUND_TYPE(float);
MK_FUND_TYPE(char);
MK_FUND_TYPE(void);
MK_FUND_TYPE(bool);
//MK_FUND_TYPE(int);
//...........
 
 
class MyType{};
 
int main()
{
 
    if(IsFundamental<int>::Yes)
        std::cout << "Ok..\n";
 
    if(IsFundamental<float>::Yes)
        std::cout << "Ok..\n";
 
    if(IsFundamental<int*>::Yes)
        std::cout << "((((..\n";
 
    if(IsFundamental<MyType>::Yes)
        std::cout << "((((..\n";
 
    return 0;
}
http://codepad.org/wqRrRhtB

Доволи не плохо все это описано в книге Шаблоны C++. Справочник разработчика
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2010, 20:14

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

В заданном массиве типа double найти число с самой большой дробной частью
Помогите пожалуйста решить задачку. Описать массив типа double с количеством элементов 13....

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

Нужно найти в файле размер самой большой строки
Есть некий текстовой файл с текстом.Нужно найти в нем размер самой большой строки.Решил я узнать...

Найти и вывести размер самой большой строки в текстовом файле
Задание такое: найти и вывести размер самой большой строки в текстовом файле. Вот что в есть в...


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

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

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