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

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

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

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

18.03.2014, 16:17. Просмотров 395. Ответов 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];     
}
Не ведется подсчет правильно, оператор, что выше обозначен комментарием, не выполняется, а функция возвращает просто последнюю строчку в массиве.
Что не так?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2014, 16:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поиск самой длинной строки в const char** (C++):

Поиск самой длинной строки в файле - C++
дана такая задача: Дан текстовый файл f. Вывести самую длинную строку файла. Если в файле имеется несколько строк с наибольшей длиной, то...

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

C++,шаблон,специализация,поиск самой большой строки в массиве указателей на char - C++
Есть почти готовое решение,помогите пожалуйста доделать,немного не понимаю #include &lt;cstdlib&gt; #include &lt;iostream&gt; template...

Поиск самой длинной неубывающей подпоследовательности - C++
Формулировка задачи: Реализовать на языке C или C++ алгоритм поиска для заданной числовой последовательности самой длинной неубывающей...

Нахождение самой длинной строки из массива - C++
Ввести массив строк и найти в нем максимальную по длине строку. Не учитывать случай, когда таких строк несколько. Можно самую простую...

Вывести размер самой длинной строки - C++
как вывести наибольшее кол-во символов через max не получается, и есть ли вообще такая функция &quot;max&quot; ? string a,b,c,f; cout...

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

Исправил - все равно ничего не поменялось.
0
zss
Модератор
Эксперт С++
6516 / 6078 / 2001
Регистрация: 18.12.2011
Сообщений: 15,808
Завершенные тесты: 1
18.03.2014, 16:36 #4
Такой цикл выполняется ноль раз.
Вычисляется count=0, а т.к. 0 - это ложь, то цикл заканчивается.
Перенесите его в тело цикла.
1
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
18.03.2014, 16:39  [ТС] #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];     
}
Все также.
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
18.03.2014, 16:42 #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
не знамайтесь. Нет смысла передавать в функции указатели на встроенные типы.
1
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
18.03.2014, 16:49  [ТС] #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&);
Все равно мне выдает последнюю строчку.
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
18.03.2014, 16:56 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ну так ежу понятно, что вы неправильно указали специализацию. Нужно вот так:
C++
1
2
template <>
const char* maxn<const char*>(const char**, const int);
0
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
18.03.2014, 17:00  [ТС] #9
Спасибо, Ilot!!!!
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
18.03.2014, 17:10 #10
Цитата Сообщение от Ilot Посмотреть сообщение
Нет смысла передавать в функции указатели на встроенные типы.
Это очень контекстно зависимая фраза всё таки. Если используется только чтение единственного значения по указателю, то да, смысла не много. Иначе как минимум может быть полезно для:
- передачи массива (адрес первого элемента);
- возврата значения через запись по переданному адресу.
1
18.03.2014, 17:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2014, 17:10
Привет! Вот еще темы с ответами:

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

Нахождение номера самой длинной строки в матрице - C++
люди кто может помогите вроде бы элементарная задача а доконца разобраться не могу.... Дана целочисленная квадратная матрица найти №...

Чем отличаются объявления const char* и const* char - C++
Прошу объяснить мне, чем отличаются объявления const char* и const* char и как объявить: указатель на константный массив символов, ...

Файловые потоки: узнать номер самой длинной строки и её размер - C++
Я с файла считываю информацию, а мне нужно узнать номер самой длинной строки и её размер


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

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

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