1 / 1 / 1
Регистрация: 17.10.2010
Сообщений: 29
1

Рекурсия: проверить, соответствует ли введенная последовательность символов понятию список_списков

12.12.2010, 12:07. Показов 1595. Ответов 6
Метки нет (Все метки)

Доброго времени суток. Мне необходимо написать рекурсивную функцию для решения задачи:
проверить, соответствует ли введенная последовательность символов понятию список_списков:
<список_списков> :: = <список>[;<список>]
<список> :: = <элемент>[,<элемент>]
<элемент> : = a|b|c|d|e|...|x|y|z
Помогите пожалуйста придумать алгоритм, никак не могу понять как сделать такую проверку именно в рекурсии.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.12.2010, 12:07
Ответы с готовыми решениями:

Рекурсия: проверить, соответствует ли введенная последовательность символов понятию скобки
Доброго времени суток. Мне необходимо написать рекурсивную функцию для решения задачи: ...

Проверить, является ли введенная скобочная последовательность правильной (рекурсия)
Дано слово из круглых и фигурных скобок. Требуется определить является ли введенное выражение...

Строки. Проверить, является ли введенная с клавиатуры последовательность символов целым числом, записанным в десятичной системе счисления
Составить программу, которая проверяет, является ли введенная с клавиатуры последовательность...

Проверить, соответствует ли введенная строка строке ="689ваыргшм09-"
Помогите, а то не понимаю. Пожалуйста.

6
Эксперт С++
3219 / 1746 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
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 / 1 / 1
Регистрация: 17.10.2010
Сообщений: 29
14.12.2010, 15:45  [ТС] 3
Спасибо большое! Только на строке 91 должно быть std::getline(std::cin, s);
0
Эксперт С++
3219 / 1746 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
14.12.2010, 16:53 4
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Гоблин Посмотреть сообщение
... на строке 91 должно быть std::getline(std::cin, s);
Это вы где такое вычитали? На самом деле не обязательно, так как здесь применяется ADL (argument-dependent lookup), называемый также поиском Кёнига, согласно которому функция ищется в том пространстве имен, к которому принадлежат ее аргументы.
3
1 / 1 / 1
Регистрация: 17.10.2010
Сообщений: 29
15.12.2010, 08:02  [ТС] 5
В общем-то нигде не вычитал... Компилятор Embarcadero C++ 2010 подсказал) Точнее без пространства имен он просто не cмог найти функцию getline.
0
Эксперт С++
3219 / 1746 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
15.12.2010, 08:22 6
Цитата Сообщение от Гоблин Посмотреть сообщение
В общем-то нигде не вычитал... Компилятор Embarcadero C++ 2010 подсказал) Точнее без пространства имен он просто не cмог найти функцию getline.
Значит косяк компилятора.
0
1 / 1 / 1
Регистрация: 17.10.2010
Сообщений: 29
16.12.2010, 00:13  [ТС] 7
Цитата Сообщение от Mr.X Посмотреть сообщение
Значит косяк компилятора.
Действительно, Borland C Builder 6 спокойно компилирует без std. Спасибо еще раз!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.12.2010, 00:13
Помогаю со студенческими работами здесь

Регулярные выражения. Проверить, соответствует ли введённая строка строке "689орпап09"
Помогите решить задачку плиз) Проверить, соответствует ли введённая строка строке = &quot;689орпап09-&quot;

Проверить является ли введенная последовательность возрастающей
/* является ли введенная последовательность возрастающей(не считая 0) */ bool...

Проверить, является ли введенная последовательность чисел рядом Фибоначчи
Здравствуйте! Закопался тут с одной задачей - требуется написать программу проверяющую является ли...

Определить, является ли введенная последовательность символов цифрами
.model small .stack 100h .data Len equ 6 mas db 6 dup(?),...

Проверить, является ли введенная строка символов названием месяца
проверить является ли,введеная строка символов названием месяца. Я написал прогу,но она вылетает,...

Последовательность из 3 символов(рекурсия) - переполнение стека
Здравствуйте, пишу первый раз на форум, не судите строго, хотя нет судите) Дана задача:...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru