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

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

Войти
Регистрация
Восстановить пароль
 
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
#1

Поиск самой длинной строки в const char** - C++

18.03.2014, 16:17. Просмотров 349. Ответов 9
Метки нет (Все метки)

Здравствуйте.
Вот функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template <>
char* maxn<char*>(char** const ar, const int* limit) {
    int curmax = 0, absmax = 0, max_ind = 0, count = 0;
    for (int i = 0; (i < *limit), (count = 0); ++i) {
        while (ar[i][count])
            ++count;
        cout << count; //почему не выполняется ???____
        if (count > curmax && count > absmax) { // здесь проверка на текущее максимальное в паре и абсолютное
            absmax = curmax = count;
            max_ind = i;
        }
        else if (count > curmax) // здесь только на текущее
            curmax = count;
    }
    return ar[max_ind];     
}
Не ведется подсчет правильно, оператор, что выше обозначен комментарием, не выполняется, а функция возвращает просто последнюю строчку в массиве.
Что не так?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2014, 16:17     Поиск самой длинной строки в const char**
Посмотрите здесь:

Поиск самой длинной неубывающей подпоследовательности C++
C++ Вывести номер строки матрицы с самой длинной последовательностью одинаковых элементов
C++,шаблон,специализация,поиск самой большой строки в массиве указателей на char C++
C++ Нахождение номера самой длинной строки в матрице
Поиск самой длинной строки в файле C++
C++ Переделать функцию поиска самой длинной строки так, чтобы она правильно печатала размер произвольно длинной входной строки и воспроизводила ее
Двумерный массив. Определить номер строки с самой длинной серией одинаковых элементов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1780 / 1155 / 223
Регистрация: 16.05.2013
Сообщений: 3,042
Записей в блоге: 5
Завершенные тесты: 1
18.03.2014, 16:23     Поиск самой длинной строки в const char** #2
Либо я плохо разбираюсь в сях либо туточки:
C++
1
    for (int i = 0; (i < *limit), (count = 0); ++i) {
должно быть так:
C++
1
    for (int i = 0; i < *limit; ++i, count = 0) {
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
18.03.2014, 16:27  [ТС]     Поиск самой длинной строки в const char** #3
Ilot, насколько я понимаю - это идентично в данном случае. Будь count = 0 в проверке цикла, либо в выполнении, компилятор все равно это выполнит...

Исправил - все равно ничего не поменялось.
zss
Модератор
Эксперт С++
 Аватар для zss
6112 / 5715 / 1849
Регистрация: 18.12.2011
Сообщений: 14,600
Завершенные тесты: 1
18.03.2014, 16:36     Поиск самой длинной строки в const char** #4
Такой цикл выполняется ноль раз.
Вычисляется count=0, а т.к. 0 - это ложь, то цикл заканчивается.
Перенесите его в тело цикла.
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
18.03.2014, 16:39  [ТС]     Поиск самой длинной строки в const char** #5
Ааа...
Ну а как дальше то? Переставил в обновляемую часть - все равно так же само работает.
Цитата Сообщение от zss Посмотреть сообщение
Перенесите его в тело цикла.
Перенес:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <>
char* maxn<char*>(char** ar, const int* limit) {
    int curmax = 0, absmax = 0, max_ind = 0, count = 0;
    for (int i = 0; i < *limit; ++i) {
        count = 0;
        while (ar[i][count])
            ++count;
        cout << count;
        if (count > curmax && count > absmax) {
            absmax = curmax = count;
            max_ind = i;
        }
        else if (count > curmax)
            curmax = count;
    }
    return ar[max_ind];     
}
Все также.
Ilot
Модератор
Эксперт С++
1780 / 1155 / 223
Регистрация: 16.05.2013
Сообщений: 3,042
Записей в блоге: 5
Завершенные тесты: 1
18.03.2014, 16:42     Поиск самой длинной строки в const char** #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
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
char* maxn(char** const ar, const int limit) {
    int curmax = 0, absmax = 0, max_ind = 0, count = 0;
    for (int i = 0; i < limit; count = 0, ++i) {
        while (ar[i][count])
            ++count;
        cout << count; //почему не выполняется ???____
        if (count > curmax && count > absmax) { // здесь проверка на текущее максимальное в паре и абсолютное
            absmax = curmax = count;
            max_ind = i;
        }
        else if (count > curmax) // здесь только на текущее
            curmax = count;
    }
    return ar[max_ind];
}
int main() {
 
    char* arr[] = {"",
    "a",
    "asd",
    "b",
    "asdfg",
    "df"
    };
 
    cout <<  maxn(arr, 6) << endl;
 
    return 0;
}

Вот такой ерундой:
C++
1
int* limit
не знамайтесь. Нет смысла передавать в функции указатели на встроенные типы.
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
18.03.2014, 16:49  [ТС]     Поиск самой длинной строки в const char** #7
А вот мой код, может я чего еще не так делаю:
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
#include <iostream>
using namespace std;
 
template <typename T>
T maxn(T*, const int*);
 
template <>
char* maxn<char*>(char**, const int*);
 
int main(int argc, char **argv)
{
    //test arrays:
    const int ari_size = 6;
    int ari[ari_size] = {7, 11, 7, 9, 9, 21};
    const int ard_size = 4;
    double ard[ard_size] = {4.1, 0.01, 71.9, 43};
    const int ars_size = 6;
    const char* ars[ars_size] = {
        "Jammy house",
        "Extraterrestial intelligence",
        "Generally electrical",
        "Free Kenny",
        "Central substance",
        "Silent noise"
    };
    
    cout << maxn(ari, &ari_size);
    cout << endl;
    cout << maxn(ard, &ard_size);
    cout << endl;
    cout << maxn(ars, &ars_size);
    
    return 0;
}
 
template <typename T>
T maxn(T* ar, const int* limit) {
    T curmax = 0, absmax = 0;
    for (int i = 1; i < *limit; ++i)
        if (ar[i] > ar[i-1]) {
            curmax = ar[i];
            if (curmax > absmax)
                absmax = curmax;
        }
    return absmax;
}
 
template <>
char* maxn<char*>(char** ar, const int* limit) {
    int curmax = 0, absmax = 0, max_ind = 0, count = 0;
    for (int i = 0; i < *limit; ++i) {
        count = 0;
        while (ar[i][count])
            ++count;
        cout << count;
        if (count > curmax && count > absmax) {
            absmax = curmax = count;
            max_ind = i;
        }
        else if (count > curmax)
            curmax = count;
    }
    return ar[max_ind];     
}
Добавлено через 4 минуты
Цитата Сообщение от Ilot Посмотреть сообщение
Нет смысла передавать в функции указатели на встроенные типы.
Ок, сделал так:
C++
1
2
3
4
5
template <typename T>
T maxn(T*, const int&);
 
template <>
char* maxn<char*>(char**, const int&);
Все равно мне выдает последнюю строчку.
Ilot
Модератор
Эксперт С++
1780 / 1155 / 223
Регистрация: 16.05.2013
Сообщений: 3,042
Записей в блоге: 5
Завершенные тесты: 1
18.03.2014, 16:56     Поиск самой длинной строки в const char** #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ну так ежу понятно, что вы неправильно указали специализацию. Нужно вот так:
C++
1
2
template <>
const char* maxn<const char*>(const char**, const int);
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
18.03.2014, 17:00  [ТС]     Поиск самой длинной строки в const char** #9
Спасибо, Ilot!!!!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2014, 17:10     Поиск самой длинной строки в const char**
Еще ссылки по теме:

C++ Чем отличаются объявления const char* и const* char
C++ Нахождение самой длинной строки из массива
Как правильно написать счетчик для нахождения самой длинной строки? C++
C++ Вывести размер самой длинной строки
C++ Поиск самой длинной цепочки из подряд идущих одинаковых элементов в массиве

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4384 / 3227 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
18.03.2014, 17:10     Поиск самой длинной строки в const char** #10
Цитата Сообщение от Ilot Посмотреть сообщение
Нет смысла передавать в функции указатели на встроенные типы.
Это очень контекстно зависимая фраза всё таки. Если используется только чтение единственного значения по указателю, то да, смысла не много. Иначе как минимум может быть полезно для:
- передачи массива (адрес первого элемента);
- возврата значения через запись по переданному адресу.
Yandex
Объявления
18.03.2014, 17:10     Поиск самой длинной строки в const char**
Ответ Создать тему
Опции темы

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