Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
1 / 1 / 2
Регистрация: 24.09.2016
Сообщений: 144
1

Создать рекурсивную функцию подсчета длины строки

14.10.2016, 17:55. Показов 5158. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
есть ТЗ по нахождению длины строки при помощи рекурсивной функции. вот написал код. но у меня в любом случае выдает значение 1. что подскажете?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <cstring>
 
using namespace std;
 
int length(char* str){
    int dlina = 0, i;
    for (i = 0; str[i] == '/0'; i++)
    dlina++;
    return dlina;
}
 
int main () {
    char str[256];
    setlocale (0, "");
    cout << "введите строку: ";
    cin.getline(str, 256);
    cout << endl << "длина строки " << length <<" символов.";
    }
я думаю, что надо разбить строку на массив символов и сравнивать посимвольно
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2016, 17:55
Ответы с готовыми решениями:

Описать рекурсивную функцию для подсчёта количества запятых в данном тексте
Помогите, пожалуйста. Есть идеи, но до реализации не доходит. Нужно описать рекурсивную функцию...

Написать рекурсивную функцию для вычисления длины строки
Написать рекурсивную функцию для вычисления длины строки.

Создать рекурсивную функцию summ(s, i, j), проверяющую, является ли симметричной часть строки s
Помогите пожалуйста написать программку я рекурсией. Необходимо создать рекурсивную функцию...

Написать рекурсивную функцию для подсчёта суммы
Написать рекурсивную функцию для подсчёта суммы S=1+(3/(1+3))+(5/(1+3+5))+(7/(1+3+5+7))+....

19
59 / 59 / 53
Регистрация: 05.05.2013
Сообщений: 150
14.10.2016, 18:01 2
for (i = 0; str[i] != '\0'; i++)
0
1 / 1 / 2
Регистрация: 24.09.2016
Сообщений: 144
14.10.2016, 18:03  [ТС] 3
все равно выдает 1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <cstring>
 
using namespace std;
 
int length(char* str){
    int dlina = 0, i;
    for (i = 0; str[i] == '\0'; i++)
    dlina++;
    return dlina;
}
 
int main () {
    char str[256];
    setlocale (0, "");
    cout << "Ââåäèòå ïðåäëîæåíèå: ";
    cin.getline(str, 256);
    cout << endl << "Äëèíà âàøåé ñòðîêè " << length <<" ñèìâîëîâ.";
    }
0
59 / 59 / 53
Регистрация: 05.05.2013
Сообщений: 150
14.10.2016, 18:06 4
cout << endl << "длина строки " << length(str) <<" символов.";
1
1 / 1 / 2
Регистрация: 24.09.2016
Сообщений: 144
14.10.2016, 18:08  [ТС] 5
уже лучше. теперь выдает 0. и если оставить строку пустой, то выдает 4 символа.
0
59 / 59 / 53
Регистрация: 05.05.2013
Сообщений: 150
14.10.2016, 18:12 6
Лучший ответ Сообщение было отмечено pavlenko2k16 как решение

Решение

Цитата Сообщение от VAN0 Посмотреть сообщение
for (i = 0; str[i] != '\0'; i++)
Цитата Сообщение от VAN0 Посмотреть сообщение
cout << endl << "длина строки " << length(str) <<" символов.";
все поменял?
1
1 / 1 / 2
Регистрация: 24.09.2016
Сообщений: 144
14.10.2016, 18:14  [ТС] 7
не заметил знак "!". спасибо. работает
0
14 / 14 / 11
Регистрация: 12.10.2016
Сообщений: 52
14.10.2016, 18:20 8
Написал же сам : при помощи рекурсивной функции... В каком месте то она рекурсивная?
Лови подарок

https://ru.wikipedia.org/wiki/... 0%B8%D1%8F

Тебе может это нужно? //Pishi na angel'skom

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
int dlina = 0;
 
int length(char* str) {
    if (str[dlina] != '\0') {dlina++; length(str); }
        return dlina;
}
 
int main() {
    char str[256];
    cout << "Stroka : ";
    cin.getline(str, 256);
    cout << endl << "Dlina stroki " << length(str) << " simvolov." << endl;
    system("pause");
}
Если без глобальной переменной нужно (как четкому пацану), то
C++
1
2
3
4
5
int length(char* str) {
    static int dlina = 0;
    if (str[dlina] != '\0') {dlina++; length(str); }
        return dlina;
}
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
14.10.2016, 18:38 9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/////////////////////////////////////////////////////////////////////
// 
/////////////////////////////////////////////////////////////////////
#include <iostream>
/////////////////////////////////////////////////////////////////////
size_t length( const char* str, size_t idx = 0 )
{
    return str[idx] == '\0' ? idx : length( str, ++idx );
}
/////////////////////////////////////////////////////////////////////
int main()
{
    std::cout << length( "length" ) << std::endl;
}
Добавлено через 1 минуту
Цитата Сообщение от Badjuicy Посмотреть сообщение
Если без глобальной переменной нужно (как четкому пацану), то
А если вызову 2 раза, то что будет?
0
14 / 14 / 11
Регистрация: 12.10.2016
Сообщений: 52
14.10.2016, 19:11 10
Статическая переменная инициализируется один раз. Т.е. вызвав второй раз static int dlina = 0, мы инициалировать хотим вновь, но static не дает это сделать.

В итоге она просто продолжает расти ++. ^^
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
14.10.2016, 19:16 11
Badjuicy, Чет не работает, вот код:
http://rextester.com/KIP72239
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//g++  4.9.3
 
#include <iostream>
 
int length(char* str) {
    static int dlina = 0;
    if (str[dlina] != '\0') {dlina++; length(str); }
        return dlina;
}
 
int main()
{
    char* c1 = "length1";
    char* c2 = "asd";
    std::cout << length( c1 ) << std::endl;
    std::cout << length( c2 ) << std::endl;
}
0
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
14.10.2016, 19:20 12
Badjuicy, ваш код заработает правильно только 1 раз, потому что для первого запуска функции посчитатет правильно а при повторном просчете статическая переменная не обнулится, так что GbaLog-, прав
0
14 / 14 / 11
Регистрация: 12.10.2016
Сообщений: 52
14.10.2016, 19:23 13
Что там не пашет? Приведи пример, при котором не корректно работает

Добавлено через 2 минуты
Воо, такое и надо писать. Ну тогда при след вызове функции надо обнулить... Мой косяк парни, признаю. Спасиб
0
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
14.10.2016, 19:24 14
Badjuicy, и как обнулите ?
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
14.10.2016, 19:24 15
Цитата Сообщение от Badjuicy Посмотреть сообщение
Приведи пример, при котором не корректно работает
По ссылке лень перейти?
Ладно, в примере выше вывод вот такой:
Код
7
9
А должен быть, очевидно:
Код
7
3
0
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
14.10.2016, 19:25 16
Badjuicy, точнее сказать как вы распознаете рекурентный вызов(когда из функции сами себя) от того, что в мейне
0
14 / 14 / 11
Регистрация: 12.10.2016
Сообщений: 52
14.10.2016, 19:38 17
Лень ( Но уже посмотрел
Как исправлю? Перезагрузкой компьютера конечно же

Добавлено через 11 минут
А у вас есть предложения как эту переменную обнулить не меняя кода толком? А то не придумывается ничего, кроме как изменить код.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
14.10.2016, 19:40 18
Цитата Сообщение от Badjuicy Посмотреть сообщение
А у вас есть предложения как эту переменную обнулить не меняя кода толком?
Для Вас поменять код - проблема?
0
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
14.10.2016, 19:43 19
Цитата Сообщение от Badjuicy Посмотреть сообщение
как эту переменную обнулить не меняя кода толком
посмотрите как делал GbaLog-, в этом плане сам код у вас плохо продуман, у него нет, как обнулить ну если хотите велосипед, то что то типо такого
C++
1
2
3
4
5
6
int length(char* str, bool reset = false) {
    static int dlina = 0;
    if(reset) dlina = 0;
    if (str[dlina] != '\0') {dlina++; length(str); }
        return dlina;
}
при обнулении из мейна вызваем так
C++
1
length("Hello", true);
но так делать не надо, еще раз повторюсь в этом плане у GbaLog-, хорошее решение
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
14.10.2016, 20:07 20
Цитата Сообщение от obivan Посмотреть сообщение
велосипед
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//g++  4.9.3
 
#include <iostream>
 
int length(char* str) {
    static bool dl = false;
    static int dlina = 0;
    if( dl ) dlina = dl = 0;
    if (str[dlina] != '\0') {dlina++; length(str); }
    if( !dl ) dl = true;
    return dlina;
}
 
int main()
{
    std::cout << length( "length1" ) << std::endl;
    std::cout << length( "asd" ) << std::endl;
}
1
14.10.2016, 20:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.10.2016, 20:07
Помогаю со студенческими работами здесь

Описать рекурсивную функцию для подсчёта количества запятых
Описать рекурсивную функцию для подсчёта количества запятых в данном текстовом файле.

Как написать рекурсивную функцию подсчета вхождения любого элемента?
Здравствуйте. Читаю книгу - Грэм. Ansi Common lisp Задача - &quot;Предложите итеративное и...

Необходимо описать рекурсивную функцию для подсчёта количества запятых в текстовом файле
Необходимо описать рекурсивную функцию для подсчёта количества запятых в текстовом файле. Код...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru