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

Рекурсивная функция. - C++

Восстановить пароль Регистрация
 
Гоблин
 Аватар для Гоблин
1 / 1 / 0
Регистрация: 17.10.2010
Сообщений: 29
12.12.2010, 12:07     Рекурсивная функция. #1
Доброго времени суток. Мне необходимо написать рекурсивную функцию для решения задачи:
проверить, соответствует ли введенная последовательность символов понятию список_списков:
<список_списков> :: = <список>[;<список>]
<список> :: = <элемент>[,<элемент>]
<элемент> : = a|b|c|d|e|...|x|y|z
Помогите пожалуйста придумать алгоритм, никак не могу понять как сделать такую проверку именно в рекурсии.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2010, 12:07     Рекурсивная функция.
Посмотрите здесь:

Рекурсивная функция C++
Рекурсивная функция C++
C++ Рекурсивная функция
C++ Рекурсивная функция[]
Рекурсивная функция C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,657
13.12.2010, 14:10     Рекурсивная функция. #2
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//////////////////////////////////////////////////////////////////////////////////////
//проверить, соответствует ли введенная последовательность символов понятию список_списков:
//<список_списков> :: = <список>[;<список>]
//<список> :: = <элемент>[,<элемент>]
//<элемент> : = a|b|c|d|e|...|x|y|z
//////////////////////////////////////////////////////////////////////////////////////
#include <cctype>
#include <iostream>
#include <string>
//////////////////////////////////////////////////////////////////////////////////////
typedef std::string  T_str;
//////////////////////////////////////////////////////////////////////////////////////
//Объявления функций:
bool  parse_list   (T_str&  s);
bool  parse_lists  (T_str&  s);
//////////////////////////////////////////////////////////////////////////////////////
bool  parse_symb(T_str&  s, const char  c)
{
    bool  res_bool =    !s.empty() 
                     && s[0] == c;
    if(res_bool)
    {
        s.erase(0, 1);        
    }
    return res_bool;
}
//////////////////////////////////////////////////////////////////////////////////////
bool  parse_comma(T_str&  s)
{
    return parse_symb(s, ',');
}
//////////////////////////////////////////////////////////////////////////////////////
bool  parse_semicolon(T_str&  s)
{
    return parse_symb(s, ';');
}
//////////////////////////////////////////////////////////////////////////////////////
bool  parse_elem(T_str&  s)
{
    return    !s.empty() 
           && isalpha(s[0])
           && islower(s[0])
           && parse_symb(s, s[0]);
}
//////////////////////////////////////////////////////////////////////////////////////
bool  parse_list_tail(T_str&  s)
{
    return  !parse_comma(s)
            || parse_list(s);
}
//////////////////////////////////////////////////////////////////////////////////////
bool  parse_lists_tail(T_str&  s)
{
    return  !parse_semicolon(s)
            || parse_lists(s);
}
//////////////////////////////////////////////////////////////////////////////////////
bool  parse_list(T_str&  s)
{
    return  parse_elem(s)
            && parse_list_tail(s);
}
//////////////////////////////////////////////////////////////////////////////////////
bool  parse_lists(T_str&  s)
{
    return  parse_list(s)
            && parse_lists_tail(s);
}
//////////////////////////////////////////////////////////////////////////////////////
bool  is_lists_list(T_str  s)
{
    return     parse_lists(s)
            && s.empty();           
}
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    std::cout << "Введите строку для проверки, не является ли она списком списков,"
              << std::endl
              << "где списки разделены точкой с запятой, а элементы списка "
              << std::endl
              << "(строчные латинские буквы) - запятой, например a,b,c;d,e"
              << std::endl;
 
    T_str s;
    for(;;)
    {
        std::cout << std::endl
                  << "-> ";
        getline(std::cin, s);        
        if(s.empty()) break;
        std::cout << "Строка "
                  << (is_lists_list(s) ? "" : "НЕ ")
                  << "является списком списков."
                  << std::endl;    
    }
}
Гоблин
 Аватар для Гоблин
1 / 1 / 0
Регистрация: 17.10.2010
Сообщений: 29
14.12.2010, 15:45  [ТС]     Рекурсивная функция. #3
Спасибо большое! Только на строке 91 должно быть std::getline(std::cin, s);
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,657
14.12.2010, 16:53     Рекурсивная функция. #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Гоблин Посмотреть сообщение
... на строке 91 должно быть std::getline(std::cin, s);
Это вы где такое вычитали? На самом деле не обязательно, так как здесь применяется ADL (argument-dependent lookup), называемый также поиском Кёнига, согласно которому функция ищется в том пространстве имен, к которому принадлежат ее аргументы.
Гоблин
 Аватар для Гоблин
1 / 1 / 0
Регистрация: 17.10.2010
Сообщений: 29
15.12.2010, 08:02  [ТС]     Рекурсивная функция. #5
В общем-то нигде не вычитал... Компилятор Embarcadero C++ 2010 подсказал) Точнее без пространства имен он просто не cмог найти функцию getline.
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,657
15.12.2010, 08:22     Рекурсивная функция. #6
Цитата Сообщение от Гоблин Посмотреть сообщение
В общем-то нигде не вычитал... Компилятор Embarcadero C++ 2010 подсказал) Точнее без пространства имен он просто не cмог найти функцию getline.
Значит косяк компилятора.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2010, 00:13     Рекурсивная функция.
Еще ссылки по теме:

Рекурсивная функция C++
C++ Рекурсивная функция
C++ Рекурсивная функция

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

Или воспользуйтесь поиском по форуму:
Гоблин
 Аватар для Гоблин
1 / 1 / 0
Регистрация: 17.10.2010
Сообщений: 29
16.12.2010, 00:13  [ТС]     Рекурсивная функция. #7
Цитата Сообщение от Mr.X Посмотреть сообщение
Значит косяк компилятора.
Действительно, Borland C Builder 6 спокойно компилирует без std. Спасибо еще раз!
Yandex
Объявления
16.12.2010, 00:13     Рекурсивная функция.
Ответ Создать тему
Опции темы

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