Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
#1

Вычисления максимального элемента массива с явной специализацией для строк - C++

18.11.2011, 19:18. Просмотров 716. Ответов 6
Метки нет (Все метки)

Здравствуйте! Всех студентов с праздником!

Возможно тема заезженная!


Возникла такая проблемка, нужно вычислить максимальный элемент одномерного массива с явной специализацией шаблонной функции для строк (тип 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
#include <iostream>
#include <cstring>
using namespace std;
 
template <typename T>
T maximum(T v1, T v2, T v3)
{
T max = v1;
 if (v2 > max)
 max = v2;
 if(v3 > max)
 max = v3;
 return max;
}
//эта функция замещает обобщенную версию
// функции maximum(),
//для нахождения максимума среди  строк
template<>
char* maximum<char*>(char *v1, char* v2, char* v3)
{//выполняем лексикографическое сравнение строк
       char * max = v1;
       if(strcmp(v2,max)> 0)
         max = v2;
       if(strcmp(v3,max)> 0)
          max = v3;
return max;
}
int main()
{ 
//версия char
char * s1="Victorov", *s2="Antonov", *s3="Victor";
cout<<"max="<<maximum(s1,s2,s3)<<"\n";        //версия char*
return 0;
}
Как найти этот максимум в символьном массиве с явной специализацией[/B]шаблонной функции, не получается передать размер массива в функцию!!


Спасибо!

Добавлено через 22 часа 1 минуту
Вот сделал шаблонную функцию для нахождения максимума в массиве!

Работает понятно дело с int, float, 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
#include "iostream"
#include "fstream"
 
 
using namespace std;
 
template<int n, typename T>
void InitMas(T *mas)      //передача массива
{  
    for(int i = 0; i < n; ++i)
    {
        cout << mas[i] << " "; 
    }
}
 
template <typename T>
T max(T *mas, int n )
{
  T max = mas[0];
  for ( int i = 1; i < n; ++i )
  {
    if ( mas[i] > max )
    {
      max = mas[i];
    }
  }
    return max;
}
 
int main()
{ 
    setlocale(LC_CTYPE,"Russian"); //русский шрифт в консоле
    int *a; //объявляем указатель на целочисленный массив 
    
    const int n = 50; //размер целочисленного массива
    
    
    a = new int [n]; //динамический масив из целых чисел 
    
    cout << "Одномерный массив целых чисел(заполненный случайными числами)" << endl << endl;
    for(int i = 0; i < n; ++i)
    {
        a[i] = rand()*50/ RAND_MAX; //заполняем массив случайным числами от 0 до 50
    }
    InitMas<n>(a); //выводим целочисленный массив на консоль с помощью шаблонной функции InitMas
    cout << "\n\nМаксимальный элемент целочисленного массива - "<< max(a, n); //ищем максимальный элемент массива
 
system("pause >> null");
return 0;
}
Работает без проблем!

Но все же остается проблема! не получается вычислить максимальный элемент одномерного массива с явной специализацией шаблонной функции для строк (тип char*). Хоть какие то наброски помогут!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2011, 19:18     Вычисления максимального элемента массива с явной специализацией для строк
Посмотрите здесь:

C++ Подпрограмма для нахождения максимального элемента массива
C++ программа для нахождения максимального элемента одномерного массива
Вычисления суммы элементов массива с явной специализацией (тип char*) C++
Шаблонная функция с явной специализацией не возвращает динамический массив C++
C++ Для одномерного массива, состоящих из n целых чисел: Найти номер максимального элемента;
Создание WinApi функции для нахождения максимального элемента массива в нескольких потоках C++
C++ В программе написать функции: вставки элемента, поиска максимального элемента, определения среднего арифметического элементов массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.11.2011, 19:41     Вычисления максимального элемента массива с явной специализацией для строк #2
Цитата Сообщение от Infinity3000 Посмотреть сообщение
Но все же остается проблема! не получается вычислить максимальный элемент одномерного массива с явной специализацией шаблонной функции для строк (тип char*). Хоть какие то наброски помогут!
показывай специализацию
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
18.11.2011, 20:08  [ТС]     Вычисления максимального элемента массива с явной специализацией для строк #3
Цитата Сообщение от Jupiter Посмотреть сообщение
показывай специализацию

Пытаюсь сделать как то так!
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
#include "iostream"
#include "fstream"
#include <cstring>
 
 
using namespace std;
 
template<int n, typename T>
void InitMas(T *mas)      //передача массива
{  
    for(int i = 0; i < n; ++i)
    {
        cout << mas[i] << " "; 
    }
}
 
 
template <typename T> 
T maximum(T mas, int n)
{
 T max = mas[0];
  for ( int i = 1; i < n; ++i )
  {
    if ( mas[i] > max )
    {
      max = mas[i];
    }
  }
    return max;
}
//эта функция замещает обобщенную версию
// функции maximum(),
//для нахождения максимума среди  строк
 
template<>
char* maximum<char*>(char *mas, int n)
{
   char max = mas[0];
  for ( int i = 1; i < n; ++i )
  {
    if ( strcmp(mas[i],max) > 0 )
    {
      max = mas[i];
    }
  }
return max;
}
 
 
 
 
int main()
{ 
    setlocale(LC_CTYPE,"Russian"); //русский шрифт в консоле
    char *a; 
    const int n = 15; 
    a = new char [n];
    
    ifstream inarray("CharMass.txt"); // открытие файла для ввода;
    if (!inarray) //если файла не существует
    {
        cout << "File can not be opened" << endl; //выводим сообщение
        return 0;   //выход из программы
    }
 
    for (int i = 0; i < n; ++i)
    {
        inarray >> a[i];
    }               
    InitMas<n>(a); //выводим массив на консоль с помощью шаблонной функции InitMas
    cout<<"max="<< maximum<char*>(a,n) <<"\n";
 
 
 
system("pause >> null");
return 0;
}
Но не работает! логически должно быть все правильно!
Jupiter
Каратель
Эксперт С++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.11.2011, 20:27     Вычисления максимального элемента массива с явной специализацией для строк #4
Infinity3000, что ты подразумеваешь под максимумом среди строк? В твоем коде как раз логическая ошибка. Насколько я понял с твоих слов ты хочешь найти строку максимальной длины? Тогда зачем
Цитата Сообщение от Infinity3000 Посмотреть сообщение
strcmp(mas[i],max) > 0
их сравнивать лексикографически?
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
18.11.2011, 20:35  [ТС]     Вычисления максимального элемента массива с явной специализацией для строк #5
Цитата Сообщение от Jupiter Посмотреть сообщение
Infinity3000, что ты подразумеваешь под максимумом среди строк?
Самое длинное, то есть содержащее максимально количество символов)

Например: Victorov, Antonov, Victor - максимальное тут Victorov (содержит 8 символов)!

Какая логическая ошибка?

если по поводу
C++
1
char max = mas[0];
то и
C++
1
char *max = mas[0];
то же не решает проблему!

Добавлено через 30 секунд
Цитата Сообщение от Jupiter Посмотреть сообщение
их сравнивать лексикографически?
Желательно!
Jupiter
Каратель
Эксперт С++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.11.2011, 20:46     Вычисления максимального элемента массива с явной специализацией для строк #6
Цитата Сообщение от Infinity3000 Посмотреть сообщение
Например: Victorov, Antonov, Victor - максимальное тут Victorov (содержит 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
#include <iostream>
#include <cstring>
#include <cstddef>
#include <cassert>
 
template <typename T> 
T maximum(T* mas, std::size_t n)
{
    assert(mas != NULL);
    T max = mas[0];
    for ( std::size_t i = 1; i < n; ++i )
    {
        if ( mas[i] > max )
            max = mas[i];
    }
    return max;
}
 
template<>
const char* maximum<const char*>(const char **mas, std::size_t n)
{
    assert(mas != NULL);
    const char* max = mas[0];
    std::size_t max_len = std::strlen(mas[0]);
    for ( std::size_t i = 1; i < n; ++i )
    {
        std::size_t len = std::strlen(mas[i]);
        if ( len > max_len )
        {
            max = mas[i];
            max_len = len;
        }
    }
    return max;
}
 
int main()
{
    const char* arr[] = { "hello", "world", "the", "is", "testolololo","piece", "of", "shit" };
    std::cout << maximum(arr, 8);
    std::cin.get();
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2011, 20:56     Вычисления максимального элемента массива с явной специализацией для строк
Еще ссылки по теме:

C++ Функция для нахождения индекса максимального элемента массива
C++ В чем разница между явной специализацией и инстанциацией?
C++ Рекурсивная функция для вычисления индекса максимального элемента массива
C++ Составить программу для нахождения номера максимального элемента массива
Написать рекурсивную функцию для вычисления максимального элемента массива из n элементов C++

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

Или воспользуйтесь поиском по форуму:
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
18.11.2011, 20:56  [ТС]     Вычисления максимального элемента массива с явной специализацией для строк #7
Огромное спасибо!! Все замечательно работает!

И к всему к этому, если не тяжело, помогите найти сумму элементов массива с явной специализацией для строк (тип char*)
Под суммой понимается соединение всех строк - элементов массива!

Делаю сугубо в целях лучшего изучения С++! Спасибо огромное и за нахождения максимума!
Yandex
Объявления
18.11.2011, 20:56     Вычисления максимального элемента массива с явной специализацией для строк
Ответ Создать тему
Опции темы

Текущее время: 00:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru