Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 212
#1

Шаблонные функции и динамические массивы строк - C++

02.10.2013, 11:04. Просмотров 483. Ответов 5
Метки нет (Все метки)

Всем доброго времени суток. Я уже наверное всех достал вопросами, но опять не могу отловить ошибку сам...

Задача:
написать шаблонную функцию, которая принимает в качестве аргумента массив элементов Т и целое число, представляющее количество элементов в массиве, а возвращает элемент с наибольшим значением. Программа так же должна содержать специализацию, которая использует массив указателей на 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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <cstring>
 
template <typename T>
T maxn(T* arr, int n);
 
template <> char* maxn<char*>(char** arr, int n);
 
using namespace std;
 
int main()
{
    int amount=0;
 
    cout<<"Input amount int val: ";
    cin>>amount;
    int* arr_int=new int[amount];
    cout<<"Input int val: ";
    for(int i=0; i<amount; i++)
        cin>>arr_int[i];
    cout<<"Max elemet of int arr is "<<maxn(arr_int, amount)<<endl;
    delete [] arr_int;
 
    cout<<"Input amount double val: ";
    cin>>amount;
    double* arr_double=new double[amount];
    cout<<"Input double val: ";
    for(int i=0; i<amount; i++)
        cin>>arr_double[i];
    cout<<"Max elemet of double arr is "<<maxn(arr_double, amount)<<endl;
    delete [] arr_double;
 
    cout<<"Input amount char strin val: ";
    cin>>amount;
    cin.get();
    char** str=new char*[amount]; //количество строк
    for(int i=0; i<amount; i++)
        str[i]=new char[256];
    cout<<"Input the strings: ";
    for(int i=0; i<amount; i++)
        cin.getline(str[i], 256);
    cout<<"Biggest string is: "<<maxn(*str, amount);
 
    for(int i=0; i<amount; i++)
        delete [] str[i];
    delete [] str;
 
    return 0;
}
 
template <typename T>
T maxn(T* arr, int n)
{
    T tmp=0;
    for(int i=0; i<n; i++)
        if(arr[i]>tmp)
            tmp=arr[i];
    return tmp;
}
template <> char* maxn<char*>(char** arr, int n)
{
    int Len_Str=0;
    int Indx=0;
    for(int i=0; i<n; i++)
        if(strlen(arr[i])>Len_Str){
            Len_Str=strlen(arr[i]);
            Indx=i;
        }
        return arr[Indx];
}


Проблема: дебагер в code::blocks как-то неясно для меня работает.. В общем когда я построчно выполняю программу доходя до строки 42 (вывод наиболее длинной строки посредство вызова шаблонной функции) сама функция как бы не вызывается, курсор перепрыгивает сразу на delete и выводит первую введенную строку (которая заведомо короче). Сравнивал с ответом из найденного решебника (там алгоритм немного другой, код не использует динамические массивы, а строки и их количество жестко прописано в коде, что мне не интересно ) все вроде как правильно.

На всякий случай вот код из решебника:

Кликните здесь для просмотра всего текста
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
#include <iostream>
 
template <typename T>
T maxn (T arr[], int n);
 
template <> char * maxn <char *>(char * pt[], int n);
 
int main()
{
using namespace std;
 
char * pt [5] = {"Arnold Schwarznegger",
                "Joe Pesci",
                "Silvester Stallone",
                "Robert DeNiro",
                "Charlie Chaplin"};
 
char * pt2 = maxn(pt,5);
int arr[6] = {11,2,33,24,85,6};
double arr2[4] = {22.5,5.7,11.5,17.0};
 
 
cout << "The max of INTs is " << maxn(arr,6) << endl;
cout << "The max of DOUBLEs is " << maxn(arr2,4) << endl;
cout << "The longest length string - " << pt2;
 
cin.get();
cin.get();
return 0;
}
 
template <typename T>
T maxn (T arr[], int n)
{
    T max = arr[0];
 
    for (int i=1; i<n; i++)
        if (max < arr[i])
            max = arr[i];
             
    return max;
}
 
template <> char * maxn <char *>(char * pt[], int n)
{
    int max;
    int maxindex;
 
    max = strlen(pt[0]);
    maxindex = 0;
 
 
    for (int i=0; i < n; i++)
    {
        if (max < strlen(pt[i]))
        {
            max = strlen(pt[i]);
            maxindex = i;
        }
    }
    return pt[maxindex];
}
Источник и авторство
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2013, 11:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблонные функции и динамические массивы строк (C++):

Указатели и массивы. Индексация с помощью указателей. Передача массивов в функции. Динамические массивы (обработка матриц) - C++
Для каждого элемента , bij, i= 1,...,n , j=1,...,n определяется свой многоугольник местонахождением соответствующего элемента aij (см....

Динамические массивы и функции. Динамические массивы. - C++
Дана матрица 6х8 целого типа. Создать одномерный массив, содержащий элементы матрицы, кратные числу, введенному с клавиатуры.

Динамические строки и массивы строк - C++
Всем привет, помогите мне решить вот такие задачи: 1). Вводится массив строк символов. Необходимо найти самую длинную строку и увеличить...

Динамические массивы, удаление строк/столбцов - C++
Программка делает следующее: удаляет строки/столбцы, состоящие только из 0, помогите переделать под динамический массив (с учетом того, что...

Динамические массивы и функции - C++
Помогите решить, пожалуйста))) На динамические массивы: 1.1 Выделить память для трехмерного массива а. Изменить индексы...

Функции и динамические массивы. - C++
Вечер добрый. Помогите пожалуйста написать 2 программы. плз ( N1 Дан одномерный массив, состоящий из 20 целых чисел. Создать другой...

5
HedgehogLu
147 / 68 / 1
Регистрация: 04.09.2013
Сообщений: 260
02.10.2013, 11:33 #2
так у вас в 42 строке и проблемка
Цитата Сообщение от h_wolf Посмотреть сообщение
cout<<"Biggest string is: "<<maxn(*str, amount);
Функция мак ожидает первым параметром массив строк, а вы передаете первую строку.
Если не ошибаюсь надобно так
C++
1
cout<<"Biggest string is: "<<maxn(str, amount);
1
h_wolf
02.10.2013, 11:36  [ТС]
  #3

Не по теме:

HedgehogLu, как перестать путаться в типах данных?

0
HedgehogLu
02.10.2013, 11:42
  #4

Не по теме:

ну просто не спешить
и не забывать что при объявлении типа * означает, что будет использоваться указатель. А вот при использовании самой переменной * т.с. разыменовывает указатель и достает из него значение на которое он указывает.

а вообще с опытом придет само.

0
h_wolf
02.10.2013, 11:43  [ТС]
  #5

Не по теме:

HedgehogLu, стыдно за такие глупые ошибки....еще раз спасибо за помощь.

0
HedgehogLu
02.10.2013, 11:52     Шаблонные функции и динамические массивы строк
  #6

Не по теме:

не ошибается только тот, кто ничего не делает всем мы учимся на ошибках. кто на своих... кто на чужих.. Но именно на ошибках.
Дерзайте!

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.10.2013, 11:52
Привет! Вот еще темы с ответами:

Снова динамические массивы и функции - C++
int ** A=new int*; for (int i=0;i&lt;(NN+1);i++) A=new int; void ZZ (char *E, int **A, int *N) // преобразует строку...

Динамические массивы с передачей в функции - C++
Здравствуйте, завтра у меня обязательная контрольная работа, без права пересдачи, я переболел ветрянкой и не смог разобраться, времени не...

Можно передавать и вызывать из функции в DLL динамические массивы? - C++
Мне нужно создать перегруженные функции удаления элемента из динамического массива с заданным ключом!Можно передавать в функцию и вызывать...

Как сделать динамические массивы вместо обычных? Используя функции - C++
Как сделать динамические массивы вместо обычных? Используя функции. Для введения одной матрицы нужна одна функция? т.е. чтобы ввести 2...


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

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

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